package com.jme3.app.state; import com.jme3.app.Application; import com.jme3.input.InputManager; import com.jme3.input.KeyInput; import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.post.SceneProcessor; import com.jme3.renderer.RenderManager; import com.jme3.renderer.Renderer; import com.jme3.renderer.ViewPort; import com.jme3.renderer.queue.RenderQueue; import com.jme3.texture.FrameBuffer; import com.jme3.util.BufferUtils; import com.jme3.util.Screenshots; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; public class ScreenshotAppState extends AbstractAppState implements ActionListener, SceneProcessor { private static final Logger logger = Logger.getLogger(ScreenshotAppState.class.getName()); private boolean capture = false; private Renderer renderer; private ByteBuffer outBuf; private String appName; private int shotIndex = 0; private BufferedImage awtImage; @Override public void initialize(AppStateManager stateManager, Application app) { if (!super.isInitialized()){ InputManager inputManager = app.getInputManager(); inputManager.addMapping("ScreenShot", new KeyTrigger(KeyInput.KEY_SYSRQ)); inputManager.addListener(this, "ScreenShot"); List<ViewPort> vps = app.getRenderManager().getPostViews(); ViewPort last = vps.get(vps.size()-1); last.addProcessor(this); appName = app.getClass().getSimpleName(); } super.initialize(stateManager, app); } public void onAction(String name, boolean value, float tpf) { if (value){ capture = true; } } public void initialize(RenderManager rm, ViewPort vp) { renderer = rm.getRenderer(); reshape(vp, vp.getCamera().getWidth(), vp.getCamera().getHeight()); } @Override public boolean isInitialized() { return super.isInitialized() && renderer != null; } public void reshape(ViewPort vp, int w, int h) { outBuf = BufferUtils.createByteBuffer(w*h*4); awtImage = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR); } public void preFrame(float tpf) { } public void postQueue(RenderQueue rq) { } public void postFrame(FrameBuffer out) { if (capture){ capture = false; shotIndex++; renderer.readFrameBuffer(out, outBuf); Screenshots.convertScreenShot(outBuf, awtImage); try { ImageIO.write(awtImage, "png", new File(appName + shotIndex + ".png")); } catch (IOException ex){ logger.log(Level.SEVERE, "Error while saving screenshot", ex); } } } }