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