1package com.jme3.app.state;
2
3import com.jme3.app.Application;
4import com.jme3.input.InputManager;
5import com.jme3.input.KeyInput;
6import com.jme3.input.controls.ActionListener;
7import com.jme3.input.controls.KeyTrigger;
8import com.jme3.post.SceneProcessor;
9import com.jme3.renderer.RenderManager;
10import com.jme3.renderer.Renderer;
11import com.jme3.renderer.ViewPort;
12import com.jme3.renderer.queue.RenderQueue;
13import com.jme3.texture.FrameBuffer;
14import com.jme3.util.BufferUtils;
15import com.jme3.util.Screenshots;
16import java.awt.image.BufferedImage;
17import java.io.File;
18import java.io.IOException;
19import java.nio.ByteBuffer;
20import java.util.List;
21import java.util.logging.Level;
22import java.util.logging.Logger;
23import javax.imageio.ImageIO;
24
25public class ScreenshotAppState extends AbstractAppState implements ActionListener, SceneProcessor {
26
27    private static final Logger logger = Logger.getLogger(ScreenshotAppState.class.getName());
28    private boolean capture = false;
29    private Renderer renderer;
30    private ByteBuffer outBuf;
31    private String appName;
32    private int shotIndex = 0;
33    private BufferedImage awtImage;
34
35    @Override
36    public void initialize(AppStateManager stateManager, Application app) {
37        if (!super.isInitialized()){
38            InputManager inputManager = app.getInputManager();
39            inputManager.addMapping("ScreenShot", new KeyTrigger(KeyInput.KEY_SYSRQ));
40            inputManager.addListener(this, "ScreenShot");
41
42            List<ViewPort> vps = app.getRenderManager().getPostViews();
43            ViewPort last = vps.get(vps.size()-1);
44            last.addProcessor(this);
45
46            appName = app.getClass().getSimpleName();
47        }
48
49        super.initialize(stateManager, app);
50    }
51
52    public void onAction(String name, boolean value, float tpf) {
53        if (value){
54            capture = true;
55        }
56    }
57
58    public void initialize(RenderManager rm, ViewPort vp) {
59        renderer = rm.getRenderer();
60        reshape(vp, vp.getCamera().getWidth(), vp.getCamera().getHeight());
61    }
62
63    @Override
64    public boolean isInitialized() {
65        return super.isInitialized() && renderer != null;
66    }
67
68    public void reshape(ViewPort vp, int w, int h) {
69        outBuf = BufferUtils.createByteBuffer(w*h*4);
70        awtImage = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
71    }
72
73    public void preFrame(float tpf) {
74    }
75
76    public void postQueue(RenderQueue rq) {
77    }
78
79    public void postFrame(FrameBuffer out) {
80        if (capture){
81            capture = false;
82            shotIndex++;
83
84            renderer.readFrameBuffer(out, outBuf);
85            Screenshots.convertScreenShot(outBuf, awtImage);
86
87            try {
88                ImageIO.write(awtImage, "png", new File(appName + shotIndex + ".png"));
89            } catch (IOException ex){
90                logger.log(Level.SEVERE, "Error while saving screenshot", ex);
91            }
92        }
93    }
94}
95