1 package com.jme3.app.state; 2 3 import com.jme3.app.Application; 4 import com.jme3.input.InputManager; 5 import com.jme3.input.KeyInput; 6 import com.jme3.input.controls.ActionListener; 7 import com.jme3.input.controls.KeyTrigger; 8 import com.jme3.post.SceneProcessor; 9 import com.jme3.renderer.RenderManager; 10 import com.jme3.renderer.Renderer; 11 import com.jme3.renderer.ViewPort; 12 import com.jme3.renderer.queue.RenderQueue; 13 import com.jme3.texture.FrameBuffer; 14 import com.jme3.util.BufferUtils; 15 import com.jme3.util.Screenshots; 16 import java.awt.image.BufferedImage; 17 import java.io.File; 18 import java.io.IOException; 19 import java.nio.ByteBuffer; 20 import java.util.List; 21 import java.util.logging.Level; 22 import java.util.logging.Logger; 23 import javax.imageio.ImageIO; 24 25 public 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