package com.jme3.system.awt; import com.jme3.input.JoyInput; import com.jme3.input.KeyInput; import com.jme3.input.MouseInput; import com.jme3.input.TouchInput; import com.jme3.input.awt.AwtKeyInput; import com.jme3.input.awt.AwtMouseInput; import com.jme3.renderer.Renderer; import com.jme3.system.*; import java.util.ArrayList; public class AwtPanelsContext implements JmeContext { protected JmeContext actualContext; protected AppSettings settings = new AppSettings(true); protected SystemListener listener; protected ArrayList panels = new ArrayList(); protected AwtPanel inputSource; protected AwtMouseInput mouseInput = new AwtMouseInput(); protected AwtKeyInput keyInput = new AwtKeyInput(); protected boolean lastThrottleState = false; private class AwtPanelsListener implements SystemListener { public void initialize() { initInThread(); } public void reshape(int width, int height) { throw new IllegalStateException(); } public void update() { updateInThread(); } public void requestClose(boolean esc) { // shouldn't happen throw new IllegalStateException(); } public void gainFocus() { // shouldn't happen throw new IllegalStateException(); } public void loseFocus() { // shouldn't happen throw new IllegalStateException(); } public void handleError(String errorMsg, Throwable t) { listener.handleError(errorMsg, t); } public void destroy() { destroyInThread(); } } public void setInputSource(AwtPanel panel){ if (!panels.contains(panel)) throw new IllegalArgumentException(); inputSource = panel; mouseInput.setInputSource(panel); keyInput.setInputSource(panel); } public Type getType() { return Type.OffscreenSurface; } public void setSystemListener(SystemListener listener) { this.listener = listener; } public AppSettings getSettings() { return settings; } public Renderer getRenderer() { return actualContext.getRenderer(); } public MouseInput getMouseInput() { return mouseInput; } public KeyInput getKeyInput() { return keyInput; } public JoyInput getJoyInput() { return null; } public TouchInput getTouchInput() { return null; } public Timer getTimer() { return actualContext.getTimer(); } public boolean isCreated() { return actualContext != null && actualContext.isCreated(); } public boolean isRenderable() { return actualContext != null && actualContext.isRenderable(); } public AwtPanelsContext(){ } public AwtPanel createPanel(PaintMode paintMode){ AwtPanel panel = new AwtPanel(paintMode); panels.add(panel); return panel; } private void initInThread(){ listener.initialize(); } private void updateInThread(){ // Check if throttle required boolean needThrottle = true; for (AwtPanel panel : panels){ if (panel.isActiveDrawing()){ needThrottle = false; break; } } if (lastThrottleState != needThrottle){ lastThrottleState = needThrottle; if (lastThrottleState){ System.out.println("OGL: Throttling update loop."); }else{ System.out.println("OGL: Ceased throttling update loop."); } } if (needThrottle){ try { Thread.sleep(100); } catch (InterruptedException ex) { } } listener.update(); } private void destroyInThread(){ listener.destroy(); } public void setSettings(AppSettings settings) { this.settings.copyFrom(settings); this.settings.setRenderer(AppSettings.LWJGL_OPENGL2); if (actualContext != null){ actualContext.setSettings(settings); } } public void create(boolean waitFor) { if (actualContext != null){ throw new IllegalStateException("Already created"); } actualContext = JmeSystem.newContext(settings, Type.OffscreenSurface); actualContext.setSystemListener(new AwtPanelsListener()); actualContext.create(waitFor); } public void destroy(boolean waitFor) { if (actualContext == null) throw new IllegalStateException("Not created"); // destroy parent context actualContext.destroy(waitFor); } public void setTitle(String title) { // not relevant, ignore } public void setAutoFlushFrames(boolean enabled) { // not relevant, ignore } public void restart() { // only relevant if changing pixel format. } }