159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.app.state;
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.app.Application;
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.InputManager;
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.KeyInput;
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.controls.ActionListener;
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.controls.KeyTrigger;
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.post.SceneProcessor;
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.RenderManager;
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.Renderer;
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.ViewPort;
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.queue.RenderQueue;
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.FrameBuffer;
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.BufferUtils;
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.Screenshots;
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.awt.image.BufferedImage;
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.File;
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException;
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ByteBuffer;
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.List;
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level;
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger;
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport javax.imageio.ImageIO;
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class ScreenshotAppState extends AbstractAppState implements ActionListener, SceneProcessor {
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private static final Logger logger = Logger.getLogger(ScreenshotAppState.class.getName());
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private boolean capture = false;
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private Renderer renderer;
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private ByteBuffer outBuf;
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private String appName;
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private int shotIndex = 0;
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private BufferedImage awtImage;
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void initialize(AppStateManager stateManager, Application app) {
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (!super.isInitialized()){
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            InputManager inputManager = app.getInputManager();
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            inputManager.addMapping("ScreenShot", new KeyTrigger(KeyInput.KEY_SYSRQ));
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            inputManager.addListener(this, "ScreenShot");
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            List<ViewPort> vps = app.getRenderManager().getPostViews();
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            ViewPort last = vps.get(vps.size()-1);
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            last.addProcessor(this);
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            appName = app.getClass().getSimpleName();
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super.initialize(stateManager, app);
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void onAction(String name, boolean value, float tpf) {
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value){
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            capture = true;
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void initialize(RenderManager rm, ViewPort vp) {
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        renderer = rm.getRenderer();
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        reshape(vp, vp.getCamera().getWidth(), vp.getCamera().getHeight());
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public boolean isInitialized() {
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return super.isInitialized() && renderer != null;
6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void reshape(ViewPort vp, int w, int h) {
6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        outBuf = BufferUtils.createByteBuffer(w*h*4);
7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        awtImage = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void preFrame(float tpf) {
7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void postQueue(RenderQueue rq) {
7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void postFrame(FrameBuffer out) {
8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (capture){
8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            capture = false;
8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            shotIndex++;
8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            renderer.readFrameBuffer(out, outBuf);
8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Screenshots.convertScreenShot(outBuf, awtImage);
8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            try {
8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                ImageIO.write(awtImage, "png", new File(appName + shotIndex + ".png"));
8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            } catch (IOException ex){
9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                logger.log(Level.SEVERE, "Error while saving screenshot", ex);
9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}
95