159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.system.awt; 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.JoyInput; 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.KeyInput; 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.MouseInput; 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.TouchInput; 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.awt.AwtKeyInput; 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.awt.AwtMouseInput; 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.Renderer; 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.system.*; 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.ArrayList; 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class AwtPanelsContext implements JmeContext { 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected JmeContext actualContext; 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected AppSettings settings = new AppSettings(true); 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected SystemListener listener; 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected ArrayList<AwtPanel> panels = new ArrayList<AwtPanel>(); 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected AwtPanel inputSource; 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected AwtMouseInput mouseInput = new AwtMouseInput(); 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected AwtKeyInput keyInput = new AwtKeyInput(); 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected boolean lastThrottleState = false; 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private class AwtPanelsListener implements SystemListener { 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void initialize() { 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta initInThread(); 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void reshape(int width, int height) { 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new IllegalStateException(); 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void update() { 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta updateInThread(); 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void requestClose(boolean esc) { 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // shouldn't happen 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new IllegalStateException(); 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void gainFocus() { 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // shouldn't happen 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new IllegalStateException(); 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void loseFocus() { 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // shouldn't happen 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new IllegalStateException(); 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void handleError(String errorMsg, Throwable t) { 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta listener.handleError(errorMsg, t); 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void destroy() { 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta destroyInThread(); 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setInputSource(AwtPanel panel){ 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!panels.contains(panel)) 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new IllegalArgumentException(); 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputSource = panel; 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mouseInput.setInputSource(panel); 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta keyInput.setInputSource(panel); 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Type getType() { 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return Type.OffscreenSurface; 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setSystemListener(SystemListener listener) { 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.listener = listener; 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public AppSettings getSettings() { 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return settings; 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Renderer getRenderer() { 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return actualContext.getRenderer(); 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public MouseInput getMouseInput() { 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return mouseInput; 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public KeyInput getKeyInput() { 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return keyInput; 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public JoyInput getJoyInput() { 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public TouchInput getTouchInput() { 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Timer getTimer() { 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return actualContext.getTimer(); 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public boolean isCreated() { 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return actualContext != null && actualContext.isCreated(); 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public boolean isRenderable() { 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return actualContext != null && actualContext.isRenderable(); 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public AwtPanelsContext(){ 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public AwtPanel createPanel(PaintMode paintMode){ 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta AwtPanel panel = new AwtPanel(paintMode); 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta panels.add(panel); 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return panel; 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void initInThread(){ 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta listener.initialize(); 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void updateInThread(){ 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Check if throttle required 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean needThrottle = true; 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (AwtPanel panel : panels){ 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (panel.isActiveDrawing()){ 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta needThrottle = false; 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (lastThrottleState != needThrottle){ 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta lastThrottleState = needThrottle; 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (lastThrottleState){ 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta System.out.println("OGL: Throttling update loop."); 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta System.out.println("OGL: Ceased throttling update loop."); 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (needThrottle){ 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Thread.sleep(100); 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (InterruptedException ex) { 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta listener.update(); 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void destroyInThread(){ 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta listener.destroy(); 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setSettings(AppSettings settings) { 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.settings.copyFrom(settings); 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.settings.setRenderer(AppSettings.LWJGL_OPENGL2); 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (actualContext != null){ 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta actualContext.setSettings(settings); 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void create(boolean waitFor) { 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (actualContext != null){ 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new IllegalStateException("Already created"); 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta actualContext = JmeSystem.newContext(settings, Type.OffscreenSurface); 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta actualContext.setSystemListener(new AwtPanelsListener()); 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta actualContext.create(waitFor); 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void destroy(boolean waitFor) { 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (actualContext == null) 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new IllegalStateException("Not created"); 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // destroy parent context 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta actualContext.destroy(waitFor); 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setTitle(String title) { 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // not relevant, ignore 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setAutoFlushFrames(boolean enabled) { 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // not relevant, ignore 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void restart() { 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // only relevant if changing pixel format. 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 203