From 2634ce35031be322cb355e4d6055aace6a2c0619 Mon Sep 17 00:00:00 2001
From: Sven Gothel
+ * end of tiling is never reached w/ {@link RandomRileRenderer},
+ * i.e. method always returns false.
+ *
+ * Implementation {@link #reset()} internal states.
+ *
- * Method resets internal state and {@link #TR_ROWS} {@link #TR_COLUMNS} count. + * Implementation {@link #reset()} internal states. *
* * @param width The image-clipping.width @@ -178,7 +191,7 @@ public class TileRenderer extends TileRendererBase { imageClippingDim.setWidth(width); imageClippingDim.setHeight(height); } - setup(); + reset(); } /** @@ -210,7 +223,7 @@ public class TileRenderer extends TileRendererBase { * effective size of the tile depends on the border size, ie ( * width - 2*border ) * ( height - 2 * border ) *- * Method resets internal state and {@link #TR_ROWS} {@link #TR_COLUMNS} count. + * Implementation {@link #reset()} internal states. *
* * @param width @@ -236,7 +249,7 @@ public class TileRenderer extends TileRendererBase { tileSize.setHeight( height ); tileSizeNB.setWidth( width - 2 * border ); tileSizeNB.setHeight( height - 2 * border ); - setup(); + reset(); } /** @@ -251,32 +264,43 @@ public class TileRenderer extends TileRendererBase { } /** - * Sets up the number of rows and columns needed + * {@inheritDoc} + * + * Reset internal states of {@link TileRenderer} are: + *true
if all tiles have been rendered or {@link #setup()}
- * has not been called, otherwise false
.
- */
- public final boolean eot() { return 0 > currentTile; }
-
@Override
public final int getParam(int pname) {
switch (pname) {
@@ -341,16 +365,41 @@ public class TileRenderer extends TileRendererBase {
return 0 < imageSize.getWidth() && 0 < imageSize.getHeight();
}
+ /**
+ * {@inheritDoc}
+ *
+ * + * end of tiling is reached w/ {@link TileRenderer}, if at least one of the following is true: + *
+ * end of tiling criteria is implementation specific and may never be reached. + *
+ *+ * User needs to {@link #reset()} tiling after reaching end of tiling + * before calling {@link #beginTile(GL)} again. + *
+ */ + public abstract boolean eot(); + + /** + * Method resets implementation's internal state to start of tiling + * as required for {@link #beginTile(GL)} if {@link #eot() end of tiling} has been reached. + *+ * Implementation is a nop where {@link #eot() end of tiling} is never reached. + *
+ */ + public abstract void reset(); + /** * Begins rendering a tile. *@@ -351,10 +373,19 @@ public abstract class TileRendererBase { *
* User has to comply with the GL profile requirement. *
+ *+ * If {@link #eot() end of tiling} has been reached, + * user needs to {@link #reset()} tiling before calling this method. + *
* * @param gl The gl context - * @throws IllegalStateException if image-size has not been set + * @throws IllegalStateException if {@link #setImageSize(int, int) image-size} is undefined, + * an {@link #isSetup() implementation related setup} has not be performed + * or {@ link #eot()} has been reached. See implementing classes. * @throws GLException if {@link #setImageBuffer(GLPixelBuffer) image buffer} is used butgl
instance is < {@link GL2ES3}
+ * @see #isSetup()
+ * @see #eot()
+ * @see #reset()
*/
public abstract void beginTile(GL gl) throws IllegalStateException, GLException;
@@ -594,6 +625,12 @@ public abstract class TileRendererBase {
}
return;
}
+ if( eot() ) {
+ if( DEBUG ) {
+ System.err.println("TileRenderer.glel.display: EOT: "+TileRendererBase.this);
+ }
+ return;
+ }
final GL gl = drawable.getGL();
beginTile(gl);
diff --git a/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java b/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java
index f86a6a347..20dd802fb 100644
--- a/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java
+++ b/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java
@@ -837,20 +837,26 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
final Graphics2D g2d = (Graphics2D)graphics;
try {
printAWTTiles.setupGraphics2DAndClipBounds(g2d, getWidth(), getHeight());
- try {
- final TileRenderer tileRenderer = printAWTTiles.renderer;
- if( DEBUG ) {
- System.err.println("AWT print.0: "+tileRenderer);
- }
- do {
- if( printGLAD != GLCanvas.this ) {
- tileRenderer.display();
- } else {
- Threading.invoke(true, displayOnEDTAction, getTreeLock());
+ final TileRenderer tileRenderer = printAWTTiles.renderer;
+ if( DEBUG ) {
+ System.err.println("AWT print.0: "+tileRenderer);
+ }
+ if( !tileRenderer.eot() ) {
+ try {
+ do {
+ if( printGLAD != GLCanvas.this ) {
+ tileRenderer.display();
+ } else {
+ Threading.invoke(true, displayOnEDTAction, getTreeLock());
+ }
+ } while ( !tileRenderer.eot() );
+ if( DEBUG ) {
+ System.err.println("AWT print.1: "+printAWTTiles);
}
- } while ( !tileRenderer.eot() );
- } finally {
- printAWTTiles.resetGraphics2D();
+ } finally {
+ tileRenderer.reset();
+ printAWTTiles.resetGraphics2D();
+ }
}
} catch (NoninvertibleTransformException nte) {
System.err.println("Catched: Inversion failed of: "+g2d.getTransform());
diff --git a/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java b/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java
index fb39143b4..673f22aff 100644
--- a/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java
+++ b/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java
@@ -646,17 +646,26 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
final Graphics2D g2d = (Graphics2D)graphics;
try {
printAWTTiles.setupGraphics2DAndClipBounds(g2d, getWidth(), getHeight());
- try {
- final TileRenderer tileRenderer = printAWTTiles.renderer;
- do {
- if( printGLAD != GLJPanel.this ) {
- tileRenderer.display();
- } else {
- backend.doPlainPaint();
+ final TileRenderer tileRenderer = printAWTTiles.renderer;
+ if( DEBUG ) {
+ System.err.println("AWT print.0: "+tileRenderer);
+ }
+ if( !tileRenderer.eot() ) {
+ try {
+ do {
+ if( printGLAD != GLJPanel.this ) {
+ tileRenderer.display();
+ } else {
+ backend.doPlainPaint();
+ }
+ } while ( !tileRenderer.eot() );
+ if( DEBUG ) {
+ System.err.println("AWT print.1: "+printAWTTiles);
}
- } while ( !tileRenderer.eot() );
- } finally {
- printAWTTiles.resetGraphics2D();
+ } finally {
+ tileRenderer.reset();
+ printAWTTiles.resetGraphics2D();
+ }
}
} catch (NoninvertibleTransformException nte) {
System.err.println("Catched: Inversion failed of: "+g2d.getTransform());
diff --git a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
index 86faea35f..73b3bc368 100644
--- a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
+++ b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
@@ -598,16 +598,22 @@ public class NewtCanvasAWT extends java.awt.Canvas implements WindowClosingProto
final Graphics2D g2d = (Graphics2D)graphics;
try {
printAWTTiles.setupGraphics2DAndClipBounds(g2d, getWidth(), getHeight());
- try {
- final TileRenderer tileRenderer = printAWTTiles.renderer;
- if( DEBUG ) {
- System.err.println("AWT print.0: "+tileRenderer);
+ final TileRenderer tileRenderer = printAWTTiles.renderer;
+ if( DEBUG ) {
+ System.err.println("AWT print.0: "+tileRenderer);
+ }
+ if( !tileRenderer.eot() ) {
+ try {
+ do {
+ tileRenderer.display();
+ } while ( !tileRenderer.eot() );
+ if( DEBUG ) {
+ System.err.println("AWT print.1: "+printAWTTiles);
+ }
+ tileRenderer.reset();
+ } finally {
+ printAWTTiles.resetGraphics2D();
}
- do {
- tileRenderer.display();
- } while ( !tileRenderer.eot() );
- } finally {
- printAWTTiles.resetGraphics2D();
}
} catch (NoninvertibleTransformException nte) {
System.err.println("Catched: Inversion failed of: "+g2d.getTransform());
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 74089c2fd..031d6a1c1 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
@@ -97,11 +97,6 @@ public class Gears implements GLEventListener, TileRendererBase.TileRendererList
public void init(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
- System.err.println(Thread.currentThread()+" Gears.init: tileRendererInUse "+tileRendererInUse);
- System.err.println("Chosen GLCapabilities: " + drawable.getChosenGLCapabilities());
- System.err.println("INIT GL IS: " + gl.getClass().getName());
- System.err.println(JoglVersion.getGLStrings(gl, null, false).toString());
-
init(gl);
final Object upstreamWidget = drawable.getUpstreamWidget();
@@ -122,6 +117,14 @@ public class Gears implements GLEventListener, TileRendererBase.TileRendererList
float green[] = { 0.0f, 0.8f, 0.2f, 0.7f };
float blue[] = { 0.2f, 0.2f, 1.0f, 0.7f };
+ System.err.println(Thread.currentThread()+" Gears.init: tileRendererInUse "+tileRendererInUse);
+ if(verbose) {
+ System.err.println("GearsES2 init on "+Thread.currentThread());
+ System.err.println("Chosen GLCapabilities: " + gl.getContext().getGLDrawable().getChosenGLCapabilities());
+ System.err.println("INIT GL IS: " + gl.getClass().getName());
+ System.err.println(JoglVersion.getGLStrings(gl, null, false).toString());
+ }
+
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, pos, 0);
gl.glEnable(GL2.GL_CULL_FACE);
gl.glEnable(GL2.GL_LIGHTING);
@@ -171,11 +174,7 @@ public class Gears implements GLEventListener, TileRendererBase.TileRendererList
if(-1 != swapInterval) {
gl.setSwapInterval(swapInterval);
}
- reshapeImpl(gl, x, y, width, height, width, height);
- }
-
- public void reshape(GL2 gl, int x, int y, int width, int height) {
- reshapeImpl(gl, x, y, width, height, width, height);
+ reshape(gl, x, y, width, height, width, height);
}
@Override
@@ -184,10 +183,10 @@ public class Gears implements GLEventListener, TileRendererBase.TileRendererList
int imageWidth, int imageHeight) {
final GL2 gl = tr.getAttachedDrawable().getGL().getGL2();
gl.setSwapInterval(0);
- reshapeImpl(gl, tileX, tileY, tileWidth, tileHeight, imageWidth, imageHeight);
+ reshape(gl, tileX, tileY, tileWidth, tileHeight, imageWidth, imageHeight);
}
- void reshapeImpl(GL2 gl, int tileX, int tileY, int tileWidth, int tileHeight, int imageWidth, int imageHeight) {
+ public void reshape(GL2 gl, int tileX, int tileY, int tileWidth, int tileHeight, int imageWidth, int imageHeight) {
final boolean msaa = gl.getContext().getGLDrawable().getChosenGLCapabilities().getSampleBuffers();
System.err.println(Thread.currentThread()+" Gears.reshape "+tileX+"/"+tileY+" "+tileWidth+"x"+tileHeight+" of "+imageWidth+"x"+imageHeight+", swapInterval "+swapInterval+", drawable 0x"+Long.toHexString(gl.getContext().getGLDrawable().getHandle())+", msaa "+msaa+", tileRendererInUse "+tileRendererInUse);
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 c38140ce0..e0fabc3cc 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
@@ -46,7 +46,6 @@ import javax.media.opengl.GLContext;
import javax.media.opengl.GLDrawable;
import javax.media.opengl.GLDrawableFactory;
import javax.media.opengl.GLEventListener;
-import javax.media.opengl.GLException;
import javax.media.opengl.GLProfile;
import org.junit.Assert;
@@ -67,11 +66,6 @@ import org.junit.runners.MethodSorters;
public class TestTiledRendering1GL2NEWT extends UITestCase {
static long duration = 500; // ms
- @Test
- public void test01() throws IOException {
- doTest();
- }
-
static class DrawableContext {
DrawableContext(GLDrawable d, GLContext glc) {
this.d = d;
@@ -102,7 +96,8 @@ public class TestTiledRendering1GL2NEWT extends UITestCase {
}
}
- void doTest() throws GLException, IOException {
+ @Test
+ public void test01() throws IOException {
GLProfile glp = GLProfile.getMaxFixedFunc(true);
GLCapabilities caps = new GLCapabilities(glp);
caps.setOnscreen(false);
@@ -132,15 +127,19 @@ public class TestTiledRendering1GL2NEWT extends UITestCase {
flipVertically[0] = false;
final Gears gears = new Gears();
+ gears.setVerbose(false);
gears.init(gl);
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));
+ while( !renderer.eot() ) {
+ renderer.beginTile(gl);
+ gears.reshape(gl,
+ renderer.getParam(TileRendererBase.TR_CURRENT_TILE_X_POS), renderer.getParam(TileRendererBase.TR_CURRENT_TILE_Y_POS),
+ renderer.getParam(TileRendererBase.TR_CURRENT_TILE_WIDTH), renderer.getParam(TileRendererBase.TR_CURRENT_TILE_HEIGHT),
+ renderer.getParam(TileRendererBase.TR_IMAGE_WIDTH), renderer.getParam(TileRendererBase.TR_IMAGE_HEIGHT));
gears.display(gl);
- renderer.endTile(dc.glc.getGL().getGL2ES3());
- } while ( !renderer.eot() );
+ renderer.endTile(gl);
+ }
gears.removeTileRendererNotify(renderer);
destroyDrawableContext(dc);
@@ -160,6 +159,76 @@ public class TestTiledRendering1GL2NEWT extends UITestCase {
TextureIO.write(textureData, file);
}
+ @Test
+ public void test02_EOT_01() throws IOException {
+ GLProfile glp = GLProfile.getMaxFixedFunc(true);
+ GLCapabilities caps = new GLCapabilities(glp);
+ caps.setOnscreen(false);
+
+ final int maxTileSize = 256;
+ DrawableContext dc = createDrawableAndCurrentCtx(caps, maxTileSize, maxTileSize);
+ final GL2 gl = dc.glc.getGL().getGL2();
+
+ // Fix the image size for now
+ final int imageWidth = dc.d.getWidth() * 6;
+ final int imageHeight = dc.d.getHeight() * 4;
+
+ // Initialize the tile rendering library
+ final TileRenderer renderer = new com.jogamp.opengl.util.TileRenderer();
+ renderer.setTileSize(dc.d.getWidth(), dc.d.getHeight(), 0);
+
+ IllegalStateException ise = null;
+ try {
+ renderer.beginTile(gl); // Image size has not been set
+ } catch (IllegalStateException _ise) {
+ ise = _ise;
+ System.err.println("Expected "+ise.getClass().getSimpleName()+": "+ise.getMessage());
+ }
+ Assert.assertNotNull("TileRenderer.beginTile: Image-size exception missing", ise);
+
+ renderer.setImageSize(imageWidth, imageHeight);
+
+ renderer.clipImageSize(0, 0);
+ try {
+ renderer.beginTile(gl); // EOT reached (1)
+ } catch (IllegalStateException _ise) {
+ ise = _ise;
+ System.err.println("Expected "+ise.getClass().getSimpleName()+": "+ise.getMessage());
+ }
+ Assert.assertNotNull("TileRenderer.beginTile: EOT (1) exception missing", ise);
+
+ renderer.clipImageSize(imageWidth, imageHeight); // back to full size
+
+ final Gears gears = new Gears();
+ gears.setVerbose(false);
+ gears.init(gl);
+
+ gears.addTileRendererNotify(renderer);
+ int numTiles = 0;
+ while( !renderer.eot() ) {
+ renderer.beginTile(gl);
+ gears.reshape(gl,
+ renderer.getParam(TileRendererBase.TR_CURRENT_TILE_X_POS), renderer.getParam(TileRendererBase.TR_CURRENT_TILE_Y_POS),
+ renderer.getParam(TileRendererBase.TR_CURRENT_TILE_WIDTH), renderer.getParam(TileRendererBase.TR_CURRENT_TILE_HEIGHT),
+ renderer.getParam(TileRendererBase.TR_IMAGE_WIDTH), renderer.getParam(TileRendererBase.TR_IMAGE_HEIGHT));
+ gears.display(gl);
+ renderer.endTile(gl);
+ numTiles++;
+ }
+ try {
+ renderer.beginTile(gl); // EOT reached (2)
+ } catch (IllegalStateException _ise) {
+ ise = _ise;
+ System.err.println("Expected "+ise.getClass().getSimpleName()+": "+ise.getMessage());
+ }
+ Assert.assertNotNull("TileRenderer.beginTile: EOT (2) exception missing", ise);
+ gears.removeTileRendererNotify(renderer);
+
+ Assert.assertTrue("TileRenderer not rendered more than one tile but "+numTiles, numTiles > 1);
+
+ destroyDrawableContext(dc);
+ }
+
public static void main(String args[]) {
for(int i=0; i