diff options
7 files changed, 57 insertions, 29 deletions
diff --git a/make/scripts/tests.sh b/make/scripts/tests.sh index 5e4506d36..8f3f923d7 100644 --- a/make/scripts/tests.sh +++ b/make/scripts/tests.sh @@ -325,10 +325,11 @@ function testawtswt() { # # tile rendring / printing w/ & w/o AWT # -#testnoawt com.jogamp.opengl.test.junit.jogl.tile.TestTiledRendering1GL2NEWT $* -#testnoawt com.jogamp.opengl.test.junit.jogl.tile.TestTiledRendering2GL2NEWT $* -#testnoawt com.jogamp.opengl.test.junit.jogl.tile.TestRandomTiledRendering2GL2NEWT $* +testnoawt com.jogamp.opengl.test.junit.jogl.tile.TestTiledRendering1GL2NEWT $* +testnoawt com.jogamp.opengl.test.junit.jogl.tile.TestTiledRendering2GL2NEWT $* +testnoawt com.jogamp.opengl.test.junit.jogl.tile.TestRandomTiledRendering2GL2NEWT $* testawt com.jogamp.opengl.test.junit.jogl.tile.TestRandomTiledRendering3GL2AWT $* +#testawt com.jogamp.opengl.test.junit.jogl.tile.TestTiledPrintingGearsAWT $* # # core/newt (testnoawt and testawt) diff --git a/src/jogl/classes/com/jogamp/opengl/util/TileRendererBase.java b/src/jogl/classes/com/jogamp/opengl/util/TileRendererBase.java index b6774b6b7..8a339456a 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/TileRendererBase.java +++ b/src/jogl/classes/com/jogamp/opengl/util/TileRendererBase.java @@ -95,6 +95,18 @@ public abstract class TileRendererBase { */ public static final int TR_CURRENT_TILE_HEIGHT = 6; + /** + * Notifies {@link GLEventListener} implementing this interface + * that the owning {@link GLAutoDrawable} is {@link TileRendererBase#attachToAutoDrawable(GLAutoDrawable) attached} + * to a tile renderer or {@link TileRendererBase#detachFromAutoDrawable() detached} from it. + */ + public static interface TileRendererNotify { + /** The owning {@link GLAutoDrawable} is {@link TileRendererBase#attachToAutoDrawable(GLAutoDrawable) attached} to a {@link TileRendererBase}. */ + public void addTileRendererNotify(TileRendererBase tr); + /** The owning {@link GLAutoDrawable} is {@link TileRendererBase#detachFromAutoDrawable() detached} from a {@link TileRendererBase}. */ + public void removeTileRendererNotify(TileRendererBase tr); + } + protected final Dimension imageSize = new Dimension(0, 0); protected final GLPixelStorageModes psm = new GLPixelStorageModes(); protected GLPixelBuffer imageBuffer; @@ -216,8 +228,13 @@ public abstract class TileRendererBase { /** * Attaches this renderer to the {@link GLAutoDrawable}. * <p> - * The {@link GLAutoDrawable}'s original {@link GLEventListener} are moved to local storage. - * This renderer {@link GLEventListener} is then added to handle the tile rendering + * The {@link GLAutoDrawable}'s original {@link GLEventListener} are moved to this tile renderer.<br> + * It is <i>highly recommended</i> that the original {@link GLEventListener} implement + * {@link TileRendererNotify}, so they get {@link TileRendererNotify#addTileRendererNotify(TileRendererBase) notified} + * about this event. + * </p> + * <p> + * This tile renderer's {@link GLEventListener} is then added to handle the tile rendering * for the original {@link GLEventListener}, i.e. it's {@link GLEventListener#display(GLAutoDrawable) display} issues: * <ul> * <li>Optional {@link #setGLEventListener(GLEventListener, GLEventListener) pre-glel}.{@link GLEventListener#display(GLAutoDrawable) display(..)}</li> @@ -232,6 +249,16 @@ public abstract class TileRendererBase { * </ul> * </p> * <p> + * The <a href="#pmvmatrix">PMV Matrix</a> shall be reshaped in the + * original {@link GLEventListener}'s {@link GLEventListener#reshape(GLAutoDrawable, int, int, int, int) reshape} method + * according to the tile-position, -size and image-size<br> + * The {@link GLEventListener#reshape(GLAutoDrawable, int, int, int, int) reshape} method is called for each tile + * w/ the current viewport of tile-size, where the tile-position and image-size can be retrieved by this tile renderer, + * see details in {@link #beginTile(GL2ES3)}.<br> + * The original {@link GLEventListener} implementing {@link TileRendererNotify} is aware of this + * tile renderer instance. + * </p> + * <p> * Consider using {@link #setGLEventListener(GLEventListener, GLEventListener)} to add pre- and post * hooks to be performed on this renderer {@link GLEventListener}.<br> * The pre-hook is able to allocate memory and setup parameters, since it's called before {@link #beginTile(GL2ES3)}.<br> @@ -242,12 +269,6 @@ public abstract class TileRendererBase { * Call {@link #detachFromAutoDrawable()} to remove this renderer from the {@link GLAutoDrawable} * and to restore it's original {@link GLEventListener}. * </p> - * <p> - * The <a href="#pmvmatrix">PMV Matrix</a> shall be reshaped in the - * original {@link GLEventListener}'s {@link GLEventListener#reshape(GLAutoDrawable, int, int, int, int) reshape} - * method. The latter is called for each tile w/ the current viewport. - * The tile's position and image size can be utilized. See details in {@link #beginTile(GL2ES3)}. - * </p> * @param glad * @throws IllegalStateException if an {@link GLAutoDrawable} is already attached */ @@ -264,6 +285,9 @@ public abstract class TileRendererBase { final GLEventListener l = glad.getGLEventListener(0); listenersInit[i] = glad.getGLEventListenerInitState(l); listeners[i] = glad.removeGLEventListener( l ); + if( listeners[i] instanceof TileRendererNotify ) { + ((TileRendererNotify)listeners[i]).addTileRendererNotify(this); + } } glad.addGLEventListener(tiledGLEL); } @@ -271,6 +295,11 @@ public abstract class TileRendererBase { /** * Detaches this renderer from the {@link GLAutoDrawable}. * <p> + * It is <i>highly recommended</i> that the original {@link GLEventListener} implement + * {@link TileRendererNotify}, so they get {@link TileRendererNotify#removeTileRendererNotify(TileRendererBase) notified} + * about this event. + * </p> + * <p> * See {@link #attachToAutoDrawable(GLAutoDrawable)}. * </p> */ @@ -280,6 +309,9 @@ public abstract class TileRendererBase { final int aSz = listenersInit.length; for(int i=0; i<aSz; i++) { final GLEventListener l = listeners[i]; + if( l instanceof TileRendererNotify ) { + ((TileRendererNotify)l).removeTileRendererNotify(this); + } glad.addGLEventListener(l); glad.setGLEventListenerInitState(l, listenersInit[i]); } diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/demos/gl2/Gears.java b/src/test/com/jogamp/opengl/test/junit/jogl/demos/gl2/Gears.java index 0c84fac39..22fb72aec 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/demos/gl2/Gears.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/demos/gl2/Gears.java @@ -25,8 +25,7 @@ import com.jogamp.opengl.util.TileRendererBase; * * This version is equal to Brian Paul's version 1.2 1999/10/21 */ - -public class Gears implements GLEventListener { +public class Gears implements GLEventListener, TileRendererBase.TileRendererNotify { private float view_rotx = 20.0f, view_roty = 30.0f, view_rotz = 0.0f; private int gear1=0, gear2=0, gear3=0; private float angle = 0.0f; @@ -47,11 +46,18 @@ public class Gears implements GLEventListener { this.swapInterval = 1; } - public void setTileRenderer(TileRendererBase tileRenderer) { - tileRendererInUse = tileRenderer; + private boolean doRotateBeforePrinting; + public void addTileRendererNotify(TileRendererBase tr) { + tileRendererInUse = tr; + doRotateBeforePrinting = doRotate; + setDoRotation(false); + } + public void removeTileRendererNotify(TileRendererBase tr) { + tileRendererInUse = null; + setDoRotation(doRotateBeforePrinting); } - public void setDoRotation(boolean rotate) { this.doRotate = rotate; } + public void setDoRotation(boolean rotate) { doRotate = rotate; } public void setGears(int g1, int g2, int g3) { gear1 = g1; diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestRandomTiledRendering2GL2NEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestRandomTiledRendering2GL2NEWT.java index 866a8a753..ca9bf9a9c 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestRandomTiledRendering2GL2NEWT.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestRandomTiledRendering2GL2NEWT.java @@ -85,7 +85,6 @@ public class TestRandomTiledRendering2GL2NEWT extends UITestCase { final GLOffscreenAutoDrawable glad = factory.createOffscreenAutoDrawable(null, caps, null, 256, 256, null); final Gears gears = new Gears(); - gears.setDoRotation(false); glad.addGLEventListener( gears ); // Fix the image size for now @@ -97,7 +96,6 @@ public class TestRandomTiledRendering2GL2NEWT extends UITestCase { // Initialize the tile rendering library final RandomTileRenderer renderer = new RandomTileRenderer(); - gears.setTileRenderer(renderer); renderer.attachToAutoDrawable(glad); renderer.setImageSize(imageWidth, imageHeight); @@ -138,7 +136,6 @@ public class TestRandomTiledRendering2GL2NEWT extends UITestCase { } renderer.detachFromAutoDrawable(); - gears.setTileRenderer(null); // Restore viewport and Gear's PMV matrix // .. even though we close the demo, this is for documentation! diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestRandomTiledRendering3GL2AWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestRandomTiledRendering3GL2AWT.java index 28ff19bad..2b7e727b8 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestRandomTiledRendering3GL2AWT.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestRandomTiledRendering3GL2AWT.java @@ -129,7 +129,6 @@ public class TestRandomTiledRendering3GL2AWT extends UITestCase { @Override public void init(GLAutoDrawable drawable) { - gears.setDoRotation(false); final GL gl = drawable.getGL(); GLPixelAttributes pixelAttribs = pixelBufferProvider.getAttributes(gl, 3); GLPixelBuffer pixelBuffer = pixelBufferProvider.allocate(gl, pixelAttribs, imageWidth, imageHeight, 1, true, 0); @@ -189,12 +188,10 @@ public class TestRandomTiledRendering3GL2AWT extends UITestCase { } catch (IOException e) { e.printStackTrace(); } - gears.setTileRenderer(null); renderer.detachFromAutoDrawable(); System.err.println("XXX post-display detached: "+renderer); drawable.getGL().glViewport(0, 0, drawable.getWidth(), drawable.getHeight()); glad.getGLEventListener(0).reshape(drawable, 0, 0, drawable.getWidth(), drawable.getHeight()); - gears.setDoRotation(true); } } @Override @@ -219,7 +216,6 @@ public class TestRandomTiledRendering3GL2AWT extends UITestCase { signalTileRenderer = false; // tile rendering ! System.err.println("XXX START TILE RENDERING"); - gears.setTileRenderer(renderer); renderer.attachToAutoDrawable(glad); } Thread.sleep(100); diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestTiledRendering1GL2NEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestTiledRendering1GL2NEWT.java index c80a0cadd..62bdf6d64 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestTiledRendering1GL2NEWT.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestTiledRendering1GL2NEWT.java @@ -131,17 +131,16 @@ public class TestTiledRendering1GL2NEWT extends UITestCase { flipVertically[0] = false; final Gears gears = new Gears(); - gears.setDoRotation(false); gears.init(gl); - gears.setTileRenderer(renderer); + gears.addTileRendererNotify(renderer); do { renderer.beginTile(dc.glc.getGL().getGL2ES3()); gears.reshape(gl, 0, 0, renderer.getParam(TileRendererBase.TR_CURRENT_TILE_WIDTH), renderer.getParam(TileRendererBase.TR_CURRENT_TILE_HEIGHT)); gears.display(gl); renderer.endTile(dc.glc.getGL().getGL2ES3()); } while ( !renderer.eot() ); - gears.setTileRenderer(null); + gears.removeTileRendererNotify(renderer); destroyDrawableContext(dc); diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestTiledRendering2GL2NEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestTiledRendering2GL2NEWT.java index 72917bc7f..fb26eeb24 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestTiledRendering2GL2NEWT.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/tile/TestTiledRendering2GL2NEWT.java @@ -85,7 +85,6 @@ public class TestTiledRendering2GL2NEWT extends UITestCase { final GLOffscreenAutoDrawable glad = factory.createOffscreenAutoDrawable(null, caps, null, 256, 256, null); final Gears gears = new Gears(); - gears.setDoRotation(false); glad.addGLEventListener( gears ); // Fix the image size for now @@ -97,7 +96,6 @@ public class TestTiledRendering2GL2NEWT extends UITestCase { // Initialize the tile rendering library final TileRenderer renderer = new TileRenderer(); - gears.setTileRenderer(renderer); renderer.attachToAutoDrawable(glad); renderer.setImageSize(imageWidth, imageHeight); @@ -131,7 +129,6 @@ public class TestTiledRendering2GL2NEWT extends UITestCase { } while ( !renderer.eot() ); renderer.detachFromAutoDrawable(); - gears.setTileRenderer(null); // Restore viewport and Gear's PMV matrix // .. even though we close the demo, this is for documentation! |