diff options
Diffstat (limited to 'gl4java/awt/GLCanvas.java')
-rw-r--r-- | gl4java/awt/GLCanvas.java | 105 |
1 files changed, 63 insertions, 42 deletions
diff --git a/gl4java/awt/GLCanvas.java b/gl4java/awt/GLCanvas.java index 2ca77e7..aea730d 100644 --- a/gl4java/awt/GLCanvas.java +++ b/gl4java/awt/GLCanvas.java @@ -90,7 +90,6 @@ public class GLCanvas extends Canvas protected Dimension size = null; protected boolean mustResize = false; - protected boolean isInit = false; protected boolean needCvsDispose = false; @@ -174,6 +173,9 @@ public class GLCanvas extends Canvas // The list of GLEventListeners private GLEventListenerList listeners = new GLEventListenerList(); + // Indicates whether init() is _almost_ called ... + private volatile boolean initCalledAlmost = false; + // Indicates whether init() has been called yet. private volatile boolean initCalled = false; @@ -467,10 +469,17 @@ public class GLCanvas extends Canvas (float)col.getBlue()/255.0f, 0.0f); if (enableAWTThreadRendering) { + if(GLContext.gljClassDebug) + System.out.println("GLCanvas init() will be called now (by AWTThreadRendering) !"); init(); - initCalled = true; + initCalled = true; + + /* force a reshape, to be sure .. */ + mustResize = true; } + initCalledAlmost = true; + // fetch the top-level window , // to add us as the windowListener // @@ -503,10 +512,6 @@ public class GLCanvas extends Canvas addComponentListener(this); addMouseListener(this); - /* force a reshape, to be sure .. */ - mustResize = true; - isInit = true; - /* if we are not allowed to render from the AWT thread, release the OpenGL context for the animation thread to use */ @@ -599,7 +604,7 @@ public class GLCanvas extends Canvas */ public boolean cvsIsInit() { - return isInit && glj!=null && glj.gljIsInit(); + return initCalledAlmost && glj!=null && glj.gljIsInit(); } /** @@ -690,32 +695,49 @@ public class GLCanvas extends Canvas { boolean ok = true; - if(!cvsIsInit()) return; - - if( mustResize && initCalled ) + if ( cvsIsInit() ) { - if( glj.gljMakeCurrent() == true ) + + if ( !initCalled && !enableAWTThreadRendering && + glj.gljMakeCurrent() ) { - size = getSize(); - glj.gljResize( size.width, size.height ) ; - reshape(size.width, size.height); - mustResize = false; - if (enableAWTThreadRendering) { - invalidate(); - repaint(100); - } - glj.gljFree(true); /* force freeing the context here .. */ + if(GLContext.gljClassDebug) + System.out.println("GLCanvas init() will be called now (by rendering thread) !"); + init(); + initCalled = true; + + /* force a reshape, to be sure .. */ + mustResize = true; + + /* force freeing the context here .. */ + glj.gljFree(true); + } + + if( mustResize ) + { + if( glj.gljMakeCurrent() == true ) + { + size = super.getSize(); + glj.gljResize( size.width, size.height ) ; + reshape(size.width, size.height); + mustResize = false; + + if (enableAWTThreadRendering) { + invalidate(); + repaint(100); + } + + /* force freeing the context here .. */ + glj.gljFree(true); + } } - } - long _s = System.currentTimeMillis(); + long _s = System.currentTimeMillis(); - if(ok) - { - display(); - } + if(ok) display(); - _f_dur = System.currentTimeMillis()-_s; + _f_dur = System.currentTimeMillis()-_s; + } } /** @@ -740,6 +762,7 @@ public class GLCanvas extends Canvas { for_all(gl4java.GLEventListener) SEND display + gljSwap() gljFree() @@ -780,23 +803,20 @@ public class GLCanvas extends Canvas */ public void display() { - listeners.sendPreDisplayEvent(this); - - if (glj.gljMakeCurrent()) { - if (!enableAWTThreadRendering) { - if (!initCalled) { - init(); - initCalled = true; - } - } + if( cvsIsInit() ) + { + listeners.sendPreDisplayEvent(this); - listeners.sendDisplayEvent(this); + if ( glj.gljMakeCurrent() ) + { + listeners.sendDisplayEvent(this); - glj.gljSwap(); - glj.gljCheckGL(); - glj.gljFree(); + glj.gljSwap(); + glj.gljCheckGL(); + glj.gljFree(); - listeners.sendPostDisplayEvent(this); + listeners.sendPostDisplayEvent(this); + } } } @@ -974,7 +994,8 @@ public class GLCanvas extends Canvas System.out.println("GLCanvas cvsDispose (doit="+ ( (glj != null) && glj.gljIsInit() ) +")"); - isInit = false; + initCalled = false; + initCalledAlmost = false; removeComponentListener(this); removeMouseListener(this); |