| 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); |
| } |
| } |
| } |
| } |