aboutsummaryrefslogtreecommitdiff
path: root/engine/src/desktop/com/jme3/app/state/ScreenshotAppState.java
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/desktop/com/jme3/app/state/ScreenshotAppState.java')
-rw-r--r--engine/src/desktop/com/jme3/app/state/ScreenshotAppState.java94
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);
+ }
+ }
+ }
+}