diff options
author | Sven Gothel <[email protected]> | 2012-07-04 18:02:11 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2012-07-04 18:02:11 +0200 |
commit | 9b35c57425b0a5f6b789b9b43a62a8b64be51d86 (patch) | |
tree | 04a4e082e00fd4d313346aa8dfc2ce4e5d3ab145 /src/test | |
parent | eed8508ae1132e5f45f788e9cb3f3d5a1050ac70 (diff) |
GLAutoDrawable* refinement of abstraction / generalization - API Change!
- GLAutoDrawable (compat change - recompile):
- 'void invoke(boolean wait, GLRunnable glRunnable)' -> 'boolean invoke(boolean wait, GLRunnable glRunnable)'
Allows notifying caller whether the task has been executed or at least enqueued.
- GLAutoDrawable add 'GLEventListener removeGLEventListener(int index)'
- This allow one to remove a specific GLEventListener and reusing it (return value).
- GLDrawableImpl remove 'destroy()' to favor 'setRealized(false)'
- Using more common code of GLAutoDrawableBase, i.e. GLPbufferImpl can use defaultDestroyOp().
- Removes redundancy of methods
- GLAutoDrawableBase/Delegate
- better 'default' names to emphasize it's purpose, adding API doc
- includes more generic functionality
- defaultWindowDestroyNotify()
- defaultDestroyOp()
- TestGLAutoDrawableDelegateNEWT demonstrates a simple example w/ all window events handled.
- Fix TestParenting01cSwingAWT's threading use (gl disturbance thread)
Diffstat (limited to 'src/test')
3 files changed, 144 insertions, 60 deletions
diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLAutoDrawableDelegateNEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLAutoDrawableDelegateNEWT.java index be9ae223b..a2d060a8c 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLAutoDrawableDelegateNEWT.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLAutoDrawableDelegateNEWT.java @@ -1,5 +1,5 @@ /** - * Copyright 2010 JogAmp Community. All rights reserved. + * Copyright 2012 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: @@ -30,60 +30,95 @@ package com.jogamp.opengl.test.junit.jogl.acore; import java.io.IOException; -import javax.media.opengl.GLAnimatorControl; +import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLAutoDrawableDelegate; import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLContext; +import javax.media.opengl.GLDrawable; +import javax.media.opengl.GLDrawableFactory; import javax.media.opengl.GLException; import javax.media.opengl.GLProfile; +import org.junit.Assert; import org.junit.Test; +import com.jogamp.newt.NewtFactory; +import com.jogamp.newt.Window; import com.jogamp.newt.event.WindowAdapter; import com.jogamp.newt.event.WindowEvent; +import com.jogamp.newt.event.WindowListener; import com.jogamp.newt.event.WindowUpdateEvent; import com.jogamp.opengl.util.Animator; import com.jogamp.opengl.test.junit.jogl.demos.es2.GearsES2; -import com.jogamp.opengl.test.junit.util.NEWTGLContext; +import com.jogamp.opengl.test.junit.util.AWTRobotUtil; import com.jogamp.opengl.test.junit.util.QuitAdapter; import com.jogamp.opengl.test.junit.util.UITestCase; +/** + * Demonstrates a full featured custom GLAutoDrawable implementation + * utilizing {@link GLAutoDrawableDelegate}. + */ public class TestGLAutoDrawableDelegateNEWT extends UITestCase { - @Test - public void test01() throws GLException, InterruptedException { - final NEWTGLContext.WindowContext winctx = NEWTGLContext.createOnscreenWindow( - new GLCapabilities(GLProfile.getGL2ES2()), 640, 480, false); - winctx.context.release(); + /** Note: Creates a full featured GLAutoDrawable w/ all window events connected. */ + private GLAutoDrawable createGLAutoDrawable(GLCapabilities caps, int x, int y, int width, int height, WindowListener wl) throws InterruptedException { + final Window window = NewtFactory.createWindow(caps); + Assert.assertNotNull(window); + window.setPosition(x, y); + window.setSize(width, height); + window.setVisible(true); + Assert.assertTrue(AWTRobotUtil.waitForVisible(window, true)); + Assert.assertTrue(AWTRobotUtil.waitForRealized(window, true)); + + GLDrawableFactory factory = GLDrawableFactory.getFactory(caps.getGLProfile()); + GLDrawable drawable = factory.createGLDrawable(window); + Assert.assertNotNull(drawable); + + drawable.setRealized(true); + Assert.assertTrue(drawable.isRealized()); + + GLContext context = drawable.createContext(null); + Assert.assertNotNull(context); + + int res = context.makeCurrent(); + Assert.assertTrue(GLContext.CONTEXT_CURRENT_NEW==res || GLContext.CONTEXT_CURRENT==res); + context.release(); + + final GLAutoDrawableDelegate glad = new GLAutoDrawableDelegate(drawable, context) { + @Override + public void destroy() { + super.destroy(); // destroys drawable/context + window.destroy(); // destroys the actual window + } + }; - final GLAutoDrawableDelegate glad = new GLAutoDrawableDelegate(winctx.drawable, winctx.context); - glad.addGLEventListener(new GearsES2(1)); - // add basic window interaction - winctx.window.addWindowListener(new WindowAdapter() { + window.addWindowListener(new WindowAdapter() { @Override public void windowRepaint(WindowUpdateEvent e) { - glad.defaultRepaintOp(); + glad.defaultWindowRepaintOp(); } @Override public void windowResized(WindowEvent e) { - glad.defaultReshapeOp(); + glad.defaultWindowResizedOp(); } @Override public void windowDestroyNotify(WindowEvent e) { - final GLAnimatorControl ctrl = glad.getAnimator(); - boolean isPaused = ctrl.pause(); - glad.destroy(); - NEWTGLContext.destroyWindow(winctx); - if(isPaused) { - ctrl.resume(); - } + glad.defaultWindowDestroyNotifyOp(); } }); + window.addWindowListener(wl); + return glad; + } + + @Test + public void test01() throws GLException, InterruptedException { final QuitAdapter quitAdapter = new QuitAdapter(); - winctx.window.addWindowListener(quitAdapter); - + GLAutoDrawable glad = createGLAutoDrawable(new GLCapabilities(GLProfile.getGL2ES2()), 0, 0, 640, 480, quitAdapter); + glad.addGLEventListener(new GearsES2(1)); + final Animator animator = new Animator(glad); animator.setUpdateFPSFrames(60, null); animator.start(); @@ -93,7 +128,8 @@ public class TestGLAutoDrawableDelegateNEWT extends UITestCase { } animator.stop(); - NEWTGLContext.destroyWindow(winctx); + + glad.destroy(); } static long duration = 2000; // ms diff --git a/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParenting01cSwingAWT.java b/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParenting01cSwingAWT.java index 22ed7c6fd..41c69336c 100644 --- a/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParenting01cSwingAWT.java +++ b/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParenting01cSwingAWT.java @@ -66,6 +66,57 @@ public class TestParenting01cSwingAWT extends UITestCase { glCaps = new GLCapabilities(null); } + static class GLDisturbanceAction implements Runnable { + public boolean isRunning = false; + private volatile boolean shallStop = false; + private final GLAutoDrawable glad; + private final GLRunnable glRunnable; + + public GLDisturbanceAction(GLAutoDrawable glad) { + this.glad = glad; + this.glRunnable = new GLRunnableDummy(); + } + + public void waitUntilRunning() { + synchronized(this) { + while(!isRunning) { + try { + this.wait(); + } catch (InterruptedException e) { e.printStackTrace(); } + } + } + } + + public void stopAndWaitUntilDone() { + shallStop = true; + synchronized(this) { + while(isRunning) { + try { + this.wait(); + } catch (InterruptedException e) { e.printStackTrace(); } + } + } + } + + public void run() { + synchronized(this) { + isRunning = true; + this.notifyAll(); + System.out.println("$"); + } + while(!shallStop) { + try { + glad.invoke(true, glRunnable); + Thread.sleep(100); + } catch (Throwable t) {} + } + synchronized(this) { + isRunning = false; + this.notifyAll(); + } + } + } + @Test public void testWindowParenting01CreateVisibleDestroy1() throws InterruptedException, InvocationTargetException { /** @@ -84,22 +135,9 @@ public class TestParenting01cSwingAWT extends UITestCase { animator1.setUpdateFPSFrames(1, null); animator1.start(); - final GLWindow _glWindow1 = glWindow1; - final GLRunnable _glRunnable = new GLRunnableDummy(); - Thread disturbanceThread = new Thread(new Runnable() { - public void run() { - System.out.println("$"); - while(true) - { - try { - _glWindow1.invoke(true, _glRunnable); - Thread.sleep(100); - } catch (Throwable t) {} - } - } - }); - disturbanceThread.start(); - + final GLDisturbanceAction disturbanceAction = new GLDisturbanceAction(glWindow1); + new Thread(disturbanceAction).start(); + disturbanceAction.waitUntilRunning(); final NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow1); Assert.assertNotNull(newtCanvasAWT); @@ -175,6 +213,7 @@ public class TestParenting01cSwingAWT extends UITestCase { } }); Assert.assertEquals(true, glWindow1.isNativeValid()); + disturbanceAction.stopAndWaitUntilDone(); glWindow1.destroy(); Assert.assertEquals(false, glWindow1.isNativeValid()); } @@ -192,26 +231,33 @@ public class TestParenting01cSwingAWT extends UITestCase { glWindow1.setTitle("testWindowParenting01CreateVisibleDestroy"); GLEventListener demo1 = new RedSquareES2(); setDemoFields(demo1, glWindow1, false); + /* + glWindow1.addGLEventListener(new GLEventListener() { + @Override + public void init(GLAutoDrawable drawable) { + System.err.println("XXX init"); + } + @Override + public void dispose(GLAutoDrawable drawable) { + System.err.println("XXX dispose"); + // Thread.dumpStack(); + } + @Override + public void display(GLAutoDrawable drawable) {} + @Override + public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { + System.err.println("XXX reshape"); + // Thread.dumpStack(); + } + }); */ glWindow1.addGLEventListener(demo1); Animator animator1 = new Animator(glWindow1); animator1.setUpdateFPSFrames(1, null); animator1.start(); - - final GLWindow _glWindow1 = glWindow1; - final GLRunnable _glRunnable = new GLRunnableDummy(); - Thread disturbanceThread = new Thread(new Runnable() { - public void run() { - System.out.println("$"); - while(true) - { - try { - _glWindow1.invoke(true, _glRunnable); - Thread.sleep(100); - } catch (Throwable t) {} - } - } - }); - disturbanceThread.start(); + + final GLDisturbanceAction disturbanceAction = new GLDisturbanceAction(glWindow1); + new Thread(disturbanceAction).start(); + disturbanceAction.waitUntilRunning(); final NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow1); Assert.assertNotNull(newtCanvasAWT); @@ -298,6 +344,8 @@ public class TestParenting01cSwingAWT extends UITestCase { animator1.stop(); Assert.assertEquals(false, animator1.isAnimating()); + disturbanceAction.stopAndWaitUntilDone(); + SwingUtilities.invokeAndWait(new Runnable() { public void run() { jFrame1.setVisible(false); diff --git a/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParenting02NEWT.java b/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParenting02NEWT.java index bc3988338..8e2c73e9d 100644 --- a/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParenting02NEWT.java +++ b/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParenting02NEWT.java @@ -111,8 +111,8 @@ public class TestParenting02NEWT extends UITestCase { Assert.assertEquals(height,glWindow1.getHeight()); glWindow1.setTitle("testWindowParenting01NewtOnNewtParentChildDraw - PARENT"); glWindow1.setPosition(x,y); - glWindow1.addKeyListener(new TraceKeyAdapter(new KeyAction(eventFifo))); - glWindow1.addWindowListener(new TraceWindowAdapter()); + //glWindow1.addKeyListener(new TraceKeyAdapter(new KeyAction(eventFifo))); + //glWindow1.addWindowListener(new TraceWindowAdapter()); GLEventListener demo1 = new RedSquareES2(); setDemoFields(demo1, window1, glWindow1, false); @@ -132,8 +132,8 @@ public class TestParenting02NEWT extends UITestCase { //Assert.assertEquals(height/2,glWindow2.getHeight()); glWindow2.setTitle("testWindowParenting01NewtOnNewtParentChildDraw - CHILD"); glWindow2.setPosition(glWindow1.getWidth()/2, glWindow1.getHeight()/2); - glWindow2.addKeyListener(new TraceKeyAdapter(new KeyAction(eventFifo))); - glWindow2.addWindowListener(new TraceWindowAdapter(new WindowAction(eventFifo))); + //glWindow2.addKeyListener(new TraceKeyAdapter(new KeyAction(eventFifo))); + //glWindow2.addWindowListener(new TraceWindowAdapter(new WindowAction(eventFifo))); // glWindow2.addMouseListener(new TraceMouseAdapter()); GLEventListener demo2 = new GearsES2(); |