diff options
Diffstat (limited to 'engine/src/desktop/com/jme3/app/state/ScreenshotAppState.java')
-rw-r--r-- | engine/src/desktop/com/jme3/app/state/ScreenshotAppState.java | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/engine/src/desktop/com/jme3/app/state/ScreenshotAppState.java b/engine/src/desktop/com/jme3/app/state/ScreenshotAppState.java new file mode 100644 index 0000000..ba2556d --- /dev/null +++ b/engine/src/desktop/com/jme3/app/state/ScreenshotAppState.java @@ -0,0 +1,94 @@ +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); + } + } + } +} |