diff options
author | Sven Gothel <[email protected]> | 2014-02-24 13:32:34 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2014-02-24 13:32:34 +0100 |
commit | c3621221b9a563495b4f54fe60e18e8db8cc57fb (patch) | |
tree | 00aded20f3582e517372c12f58e19d3524582099 /src/test/com | |
parent | f69df875d0b9f969a816d143ed589b25e50cd9e7 (diff) |
Bug 802: Graph TextRenderer Performance Part-1 (incomplete, rendering artifacts)
Strategy Change:
- Font.Glyph itself holds it's OutlineShape
with it's default scaling.
Triangulation is done only once per glyph!
- A CharSequence produces a Region
by translating and scaling each Glyphs's OutlineShape.
This removes the need for re-triangulate - see above.
See: TextRendererUtil
- The indices of re-added Triangles are
offset to the new vertices (FIXME, seems not be be accurate yet).
- OutlineShape's vertices and triangles are reused if 'clean'.
- Simplified code
- Reduced copies
API Changes:
- OutlineShape, Region, ...: See above
- Removed TextRenderer, GlyphShape and GlyphString: Redundant
- Added TextRendererUtil to produce the Region from CharSequence
Result:
- Over 600 fps while changing text for each frame.
Previously only ~60fps max.
TODO:
- Region shall not hold the triangles itself,
but the indices instead.
This will remove the need to swizzle w/ vertices in the Region Renderer impl
and easies reusage of OutlineShapes.
Diffstat (limited to 'src/test/com')
23 files changed, 576 insertions, 535 deletions
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/TestRegionRendererNEWT01.java b/src/test/com/jogamp/opengl/test/junit/graph/TestRegionRendererNEWT01.java index 9942f3f1d..a1cd54de2 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TestRegionRendererNEWT01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TestRegionRendererNEWT01.java @@ -44,7 +44,7 @@ import org.junit.runners.MethodSorters; import com.jogamp.common.os.Platform; import com.jogamp.graph.curve.Region; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.opengl.GLWindow; import com.jogamp.opengl.test.junit.graph.demos.GPURegionGLListener01; import com.jogamp.opengl.test.junit.graph.demos.GPURegionGLListener02; @@ -80,7 +80,7 @@ public class TestRegionRendererNEWT01 extends UITestCase { return window; } - @Test + // @Test public void test00RegionRendererNONE01() throws InterruptedException { GLProfile glp = GLProfile.get(GLProfile.GL2ES2); GLCapabilities caps = new GLCapabilities(glp); @@ -109,7 +109,7 @@ public class TestRegionRendererNEWT01 extends UITestCase { destroyWindow(window); } - @Test + // @Test public void test01RegionRendererNONE02() throws InterruptedException { if(Platform.CPUFamily.X86 != Platform.CPU_ARCH.family) { // FIXME // FIXME: Disabled for now - since it doesn't seem fit for mobile (performance wise). @@ -174,7 +174,7 @@ public class TestRegionRendererNEWT01 extends UITestCase { destroyWindow(window); } - @Test + // @Test public void test11RegionRendererMSAA02() throws InterruptedException { if(Platform.CPUFamily.X86 != Platform.CPU_ARCH.family) { // FIXME // FIXME: Disabled for now - since it doesn't seem fit for mobile (performance wise). diff --git a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java index 826c08ed4..7e151945c 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java @@ -34,10 +34,10 @@ import java.io.StringWriter; import javax.media.opengl.GL; import javax.media.opengl.GL2ES2; +import javax.media.opengl.GLAnimatorControl; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLCapabilitiesImmutable; -import javax.media.opengl.GLEventListener; import javax.media.opengl.GLException; import javax.media.opengl.GLProfile; import javax.media.opengl.GLRunnable; @@ -48,14 +48,15 @@ import org.junit.Test; import org.junit.FixMethodOrder; import org.junit.runners.MethodSorters; +import com.jogamp.common.os.Platform; +import com.jogamp.graph.curve.Region; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.curve.opengl.TextRenderer; import com.jogamp.graph.font.Font; import com.jogamp.graph.font.FontFactory; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.opengl.GLWindow; -import com.jogamp.opengl.math.geom.AABBox; import com.jogamp.opengl.test.junit.util.UITestCase; +import com.jogamp.opengl.util.Animator; import com.jogamp.opengl.util.GLReadBufferUtil; import com.jogamp.opengl.util.glsl.ShaderState; @@ -65,8 +66,8 @@ public class TestTextRendererNEWT00 extends UITestCase { static final boolean DEBUG = false; static final boolean TRACE = false; static long duration = 100; // ms - - static final int[] texSize = new int[] { 0 }; + + static final int[] texSize = new int[] { 0 }; static final int fontSize = 24; static Font font; @@ -74,13 +75,13 @@ public class TestTextRendererNEWT00 extends UITestCase { public static void setup() throws IOException { font = FontFactory.get(FontFactory.UBUNTU).getDefault(); } - + static int atoi(String a) { try { return Integer.parseInt(a); } catch (Exception ex) { throw new RuntimeException(ex); } } - + public static void main(String args[]) throws IOException { for(int i=0; i<args.length; i++) { if(args[i].equals("-time")) { @@ -90,15 +91,15 @@ public class TestTextRendererNEWT00 extends UITestCase { } String tstname = TestTextRendererNEWT00.class.getName(); org.junit.runner.JUnitCore.main(tstname); - } - + } + static void sleep() { try { System.err.println("** new frame ** (sleep: "+duration+"ms)"); Thread.sleep(duration); } catch (InterruptedException ie) {} } - + static void destroyWindow(GLWindow window) { if(null!=window) { window.destroy(); @@ -117,12 +118,12 @@ public class TestTextRendererNEWT00 extends UITestCase { return window; } - + @Test public void testTextRendererMSAA01() throws InterruptedException { GLProfile glp = GLProfile.get(GLProfile.GL2ES2); GLCapabilities caps = new GLCapabilities(glp); - caps.setAlphaBits(4); + caps.setAlphaBits(4); caps.setSampleBuffers(true); caps.setNumSamples(4); System.err.println("Requested: "+caps); @@ -130,109 +131,114 @@ public class TestTextRendererNEWT00 extends UITestCase { GLWindow window = createWindow("text-vbaa0-msaa1", caps, 800, 400); window.display(); System.err.println("Chosen: "+window.getChosenGLCapabilities()); - + final RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); - final TextRendererListener textGLListener = new TextRendererListener(rs); - final TextRenderer renderer = textGLListener.getRenderer(); + final TextRendererGLEL textGLListener = new TextRendererGLEL(rs); + System.err.println(textGLListener.getFontInfo()); + window.addGLEventListener(textGLListener); window.invoke(true, new GLRunnable() { @Override public boolean run(GLAutoDrawable drawable) { - int c=0; - renderString(drawable, renderer, "GlueGen", c++, -1, -1000); - renderString(drawable, renderer, "JOAL", c++, -1, -1000); - renderString(drawable, renderer, "JOGL", c++, -1, -1000); - renderString(drawable, renderer, "JOCL", c++, -1, -1000); try { textGLListener.printScreen(drawable, "./", "TestTextRendererNEWT00-snap"+screenshot_num, false); + screenshot_num++; } catch (Exception e) { e.printStackTrace(); } return true; - } + } }); - sleep(); - - destroyWindow(window); - } - int screenshot_num = 0; - - int lastRow = -1; - - void renderString(GLAutoDrawable drawable, TextRenderer renderer, String text, int column, int row, int z0) { - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - final int height = drawable.getHeight(); - - int dx = 0; - int dy = height; - if(0>row) { - row = lastRow + 1; - } - AABBox textBox = font.getStringBounds(text, fontSize); - dx += font.getAdvanceWidth('X', fontSize) * column; - dy -= (int)textBox.getHeight() * ( row + 1 ); - renderer.resetModelview(null); - renderer.translate(gl, dx, dy, z0); - renderer.drawString3D(gl, font, text, fontSize, texSize); - - lastRow = row; + Animator anim = new Animator(); + anim.add(window); + anim.start(); + anim.setUpdateFPSFrames(60, null); + sleep(); + anim.stop(); + destroyWindow(window); } - - public class TextRendererListener implements GLEventListener { - private GLReadBufferUtil screenshot; - private TextRenderer renderer; - - public TextRendererListener(RenderState rs) { + int screenshot_num = 0; + + private final class TextRendererGLEL extends TextRendererGLELBase { + private final GLReadBufferUtil screenshot; + private long t0; + + TextRendererGLEL(final RenderState rs) { + super(rs, true /* exclusivePMV */, 0); // Region.VBAA_RENDERING_BIT); + texSizeScale = 2; + + fontSize = 24; + + staticRGBAColor[0] = 0.0f; + staticRGBAColor[1] = 0.0f; + staticRGBAColor[2] = 0.0f; + staticRGBAColor[3] = 1.0f; + this.screenshot = new GLReadBufferUtil(false, false); - this.renderer = TextRenderer.create(rs, 0); } - - public final TextRenderer getRenderer() { return renderer; } - + + @Override + public void init(GLAutoDrawable drawable) { + super.init(drawable); + drawable.getGL().setSwapInterval(0); + t0 = Platform.currentTimeMillis(); + } + public void dispose(GLAutoDrawable drawable) { + final GL2ES2 gl = drawable.getGL().getGL2ES2(); + screenshot.dispose(gl); + super.dispose(drawable); + } + public void printScreen(GLAutoDrawable drawable, String dir, String objName, boolean exportAlpha) throws GLException, IOException { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); pw.printf("%s-%03dx%03d-T%04d", objName, drawable.getWidth(), drawable.getHeight(), texSize[0]); - + final String filename = dir + sw +".png"; if(screenshot.readPixels(drawable.getGL(), false)) { screenshot.write(new File(filename)); } } - - public void init(GLAutoDrawable drawable) { - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); - renderer.init(gl); - renderer.setAlpha(gl, 1.0f); - renderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); - } - - public void reshape(GLAutoDrawable drawable, int xstart, int ystart, int width, int height) { - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - - gl.glViewport(xstart, ystart, width, height); - // renderer.reshapePerspective(gl, 45.0f, width, height, 0.1f, 1000.0f); - renderer.reshapeOrtho(gl, width, height, 0.1f, 1000.0f); + + String getFontInfo() { + final float unitsPerEM_Inv = font.getMetrics().getScale(1f); + final float unitsPerEM = 1f / unitsPerEM_Inv; + return String.format("Font %s, unitsPerEM %f", font.getName(Font.NAME_UNIQUNAME), unitsPerEM); } - + + @Override public void display(GLAutoDrawable drawable) { - final GL2ES2 gl = drawable.getGL().getGL2ES2(); + final GL2ES2 gl = drawable.getGL().getGL2ES2(); + + gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); - - renderString(drawable, renderer, "012345678901234567890123456789", 0, 0, -1000); - renderString(drawable, renderer, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 0, -1, -1000); - renderString(drawable, renderer, "Hello World", 0, -1, -1000); - renderString(drawable, renderer, "4567890123456", 4, -1, -1000); - renderString(drawable, renderer, "I like JogAmp", 4, -1, -1000); - } - - public void dispose(GLAutoDrawable drawable) { - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - screenshot.dispose(gl); - renderer.destroy(gl); - } - } + + final GLAnimatorControl anim = drawable.getAnimator(); + final float lfps = null != anim ? anim.getLastFPS() : 0f; + final float tfps = null != anim ? anim.getTotalFPS() : 0f; + + // Note: MODELVIEW is from [ 0 .. height ] + + final long t1 = Platform.currentTimeMillis(); + + final String text1 = String.format("%03.3f/%03.3f s, vsync %d, elapsed %4.4f s", + lfps, tfps, gl.getSwapInterval(), (t1-t0)/1000.0); + + int row = 0; + if( false ) { + renderString(drawable, "112", 0, row++, 0, 0, -1000); + // renderString(drawable, getFontInfo(), 0, row++, 0, 0, -1000); + } else { + renderString(drawable, getFontInfo(), 0, row++, 0, 0, -1000); + renderString(drawable, "012345678901234567890123456789", 0, row++, 0, 0, -1000); + renderString(drawable, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 0, row++, 0, 0, -1000); + renderString(drawable, "Hello World", 0, row++, 0, 0, -1000); + renderString(drawable, "4567890123456", 4, row++, 0, 0, -1000); + renderString(drawable, "I like JogAmp", 4, row++, 0, 0, -1000); + renderString(drawable, "Hello World", 0, row++, 0, 0, -1000); + renderString(drawable, text1, 0, row++, 0, 0, -1000); + } + } }; } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT01.java b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT01.java index 75a672a5b..9e15746a6 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT01.java @@ -45,9 +45,10 @@ import org.junit.runners.MethodSorters; import com.jogamp.common.os.Platform; import com.jogamp.graph.curve.Region; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.curve.opengl.TextRenderer; +import com.jogamp.graph.curve.opengl.Renderer; +import com.jogamp.graph.curve.opengl.TextRenderUtil; import com.jogamp.graph.font.FontFactory; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.opengl.GLWindow; import com.jogamp.opengl.test.junit.graph.demos.GPUTextRendererListenerBase01; import com.jogamp.opengl.test.junit.util.UITestCase; @@ -65,7 +66,7 @@ public class TestTextRendererNEWT01 extends UITestCase { return Integer.parseInt(a); } catch (Exception ex) { throw new RuntimeException(ex); } } - + public static void main(String args[]) throws IOException { for(int i=0; i<args.length; i++) { if(args[i].equals("-time")) { @@ -75,15 +76,15 @@ public class TestTextRendererNEWT01 extends UITestCase { } String tstname = TestTextRendererNEWT01.class.getName(); org.junit.runner.JUnitCore.main(tstname); - } - + } + static void sleep() { try { System.err.println("** new frame ** (sleep: "+duration+"ms)"); Thread.sleep(duration); } catch (InterruptedException ie) {} } - + static void destroyWindow(GLWindow window) { if(null!=window) { window.destroy(); @@ -111,29 +112,29 @@ public class TestTextRendererNEWT01 extends UITestCase { return; } GLProfile glp = GLProfile.getGL2ES2(); - + GLCapabilities caps = new GLCapabilities(glp); - caps.setAlphaBits(4); + caps.setAlphaBits(4); System.err.println("Requested: "+caps); GLWindow window = createWindow("text-vbaa1-msaa0", caps, 800,400); window.display(); System.err.println("Chosen: "+window.getChosenGLCapabilities()); - + RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); TextGLListener textGLListener = new TextGLListener(rs, Region.VBAA_RENDERING_BIT, DEBUG, TRACE); textGLListener.attachInputListenerTo(window); window.addGLEventListener(textGLListener); - + if(textGLListener.setFontSet(FontFactory.UBUNTU, 0, 0)) { textGLListener.setTech(-400, -30, 0f, -1000, window.getWidth()*2); window.display(); sleep(); - + textGLListener.setTech(-400, -30, 0, -380, window.getWidth()*3); window.display(); sleep(); - + textGLListener.setTech(-400, -20, 0, -80, window.getWidth()*4); window.display(); sleep(); @@ -143,24 +144,24 @@ public class TestTextRendererNEWT01 extends UITestCase { textGLListener.setTech(-400, -30, 0f, -1000, window.getWidth()*2); window.display(); sleep(); - + textGLListener.setTech(-400, -30, 0, -380, window.getWidth()*3); window.display(); sleep(); - + textGLListener.setTech(-400, -20, 0, -80, window.getWidth()*4); window.display(); sleep(); } - - destroyWindow(window); + + destroyWindow(window); } - + @Test public void testTextRendererMSAA01() throws InterruptedException { GLProfile glp = GLProfile.get(GLProfile.GL2ES2); GLCapabilities caps = new GLCapabilities(glp); - caps.setAlphaBits(4); + caps.setAlphaBits(4); caps.setSampleBuffers(true); caps.setNumSamples(4); System.err.println("Requested: "+caps); @@ -168,21 +169,21 @@ public class TestTextRendererNEWT01 extends UITestCase { GLWindow window = createWindow("text-vbaa0-msaa1", caps, 800, 400); window.display(); System.err.println("Chosen: "+window.getChosenGLCapabilities()); - + RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); TextGLListener textGLListener = new TextGLListener(rs, 0, DEBUG, TRACE); textGLListener.attachInputListenerTo(window); window.addGLEventListener(textGLListener); - + if(textGLListener.setFontSet(FontFactory.UBUNTU, 0, 0)) { textGLListener.setTech(-400, -30, 0f, -1000, 0); window.display(); sleep(); - + textGLListener.setTech(-400, -30, 0, -380, 0); window.display(); sleep(); - + textGLListener.setTech(-400, -20, 0, -80, 0); window.display(); sleep(); @@ -192,47 +193,47 @@ public class TestTextRendererNEWT01 extends UITestCase { textGLListener.setTech(-400, -30, 0f, -1000, 0); window.display(); sleep(); - + textGLListener.setTech(-400, -30, 0, -380, 0); window.display(); sleep(); - + textGLListener.setTech(-400, -20, 0, -80, 0); window.display(); sleep(); } - - destroyWindow(window); + + destroyWindow(window); } - + private class TextGLListener extends GPUTextRendererListenerBase01 { String winTitle; - + public TextGLListener(RenderState rs, int type, boolean debug, boolean trace) { super(rs, type, debug, trace); } - + public void attachInputListenerTo(GLWindow window) { super.attachInputListenerTo(window); winTitle = window.getTitle(); } public void setTech(float xt, float yt, float angle, int zoom, int fboSize){ - setMatrix(xt, yt, angle, zoom, fboSize); + setMatrix(xt, yt, angle, zoom, fboSize); } public void init(GLAutoDrawable drawable) { super.init(drawable); - + GL2ES2 gl = drawable.getGL().getGL2ES2(); gl.setSwapInterval(1); gl.glEnable(GL.GL_DEPTH_TEST); - - final TextRenderer textRenderer = (TextRenderer) getRenderer(); - - textRenderer.setAlpha(gl, 1.0f); - textRenderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); + + final Renderer renderer = getRenderer(); + + renderer.setAlpha(gl, 1.0f); + renderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); } - + public void display(GLAutoDrawable drawable) { super.display(drawable); diff --git a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java index 77f562dda..1f4a95511 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java @@ -41,11 +41,12 @@ import org.junit.Test; import org.junit.FixMethodOrder; import org.junit.runners.MethodSorters; +import com.jogamp.graph.curve.opengl.RegionRenderer; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.curve.opengl.TextRenderer; +import com.jogamp.graph.curve.opengl.TextRenderUtil; import com.jogamp.graph.font.Font; import com.jogamp.graph.font.FontFactory; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.opengl.math.geom.AABBox; import com.jogamp.opengl.test.junit.util.NEWTGLContext; import com.jogamp.opengl.test.junit.util.UITestCase; @@ -60,8 +61,9 @@ public class TestTextRendererNEWT10 extends UITestCase { static boolean forceES2 = false; static boolean forceGL3 = false; static boolean mainRun = false; - - static final int[] texSize = new int[] { 0 }; + static boolean useMSAA = true; + + static final int[] texSize = new int[] { 0 }; static final int fontSize = 24; static Font font; @@ -69,19 +71,21 @@ public class TestTextRendererNEWT10 extends UITestCase { public static void setup() throws IOException { font = FontFactory.get(FontFactory.UBUNTU).getDefault(); } - + static int atoi(String a) { try { return Integer.parseInt(a); } catch (Exception ex) { throw new RuntimeException(ex); } } - + public static void main(String args[]) throws IOException { mainRun = true; for(int i=0; i<args.length; i++) { if(args[i].equals("-time")) { i++; duration = atoi(args[i]); + } else if(args[i].equals("-noMSAA")) { + useMSAA = false; } else if(args[i].equals("-es2")) { forceES2 = true; } else if(args[i].equals("-gl3")) { @@ -90,17 +94,26 @@ public class TestTextRendererNEWT10 extends UITestCase { } String tstname = TestTextRendererNEWT10.class.getName(); org.junit.runner.JUnitCore.main(tstname); - } - + } + static void sleep() { try { System.err.println("** new frame ** (sleep: "+duration+"ms)"); Thread.sleep(duration); } catch (InterruptedException ie) {} } - + + // @Test + public void test00TextRendererNONE01() throws InterruptedException { + testTextRendererImpl(0); + } + @Test public void testTextRendererMSAA01() throws InterruptedException { + testTextRendererImpl(4); + } + + void testTextRendererImpl(int sampleCount) throws InterruptedException { final GLProfile glp; if(forceGL3) { glp = GLProfile.get(GLProfile.GL3); @@ -110,75 +123,77 @@ public class TestTextRendererNEWT10 extends UITestCase { glp = GLProfile.getGL2ES2(); } final GLCapabilities caps = new GLCapabilities( glp ); - caps.setAlphaBits(4); - caps.setSampleBuffers(true); - caps.setNumSamples(4); + caps.setAlphaBits(4); + if( 0 < sampleCount ) { + caps.setSampleBuffers(true); + caps.setNumSamples(sampleCount); + } System.err.println("Requested: "+caps); final NEWTGLContext.WindowContext winctx = NEWTGLContext.createOnscreenWindow(caps, 800, 400, true); final GLDrawable drawable = winctx.context.getGLDrawable(); final GL2ES2 gl = winctx.context.getGL().getGL2ES2(); - System.err.println(winctx.context); Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError()); System.err.println("Chosen: "+winctx.window.getChosenCapabilities()); - + final RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); - final TextRenderer renderer = TextRenderer.create(rs, 0); + final RegionRenderer renderer = RegionRenderer.create(rs, 0); + final TextRenderUtil textRenderUtil = new TextRenderUtil(renderer); // init gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); renderer.init(gl); renderer.setAlpha(gl, 1.0f); - renderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); + renderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); // reshape - gl.glViewport(0, 0, drawable.getWidth(), drawable.getHeight()); + gl.glViewport(0, 0, drawable.getWidth(), drawable.getHeight()); // renderer.reshapePerspective(gl, 45.0f, drawable.getWidth(), drawable.getHeight(), 0.1f, 1000.0f); renderer.reshapeOrtho(gl, drawable.getWidth(), drawable.getHeight(), 0.1f, 1000.0f); // display - gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); - renderString(drawable, gl, renderer, "012345678901234567890123456789", 0, 0, -1000); - renderString(drawable, gl, renderer, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 0, -1, -1000); - renderString(drawable, gl, renderer, "Hello World", 0, -1, -1000); - renderString(drawable, gl, renderer, "4567890123456", 4, -1, -1000); - renderString(drawable, gl, renderer, "I like JogAmp", 4, -1, -1000); - + gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); + renderString(drawable, gl, textRenderUtil, "012345678901234567890123456789", 0, 0, -1000); + renderString(drawable, gl, textRenderUtil, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 0, -1, -1000); + renderString(drawable, gl, textRenderUtil, "Hello World", 0, -1, -1000); + renderString(drawable, gl, textRenderUtil, "4567890123456", 4, -1, -1000); + renderString(drawable, gl, textRenderUtil, "I like JogAmp", 4, -1, -1000); + int c = 0; - renderString(drawable, gl, renderer, "GlueGen", c++, -1, -1000); - renderString(drawable, gl, renderer, "JOAL", c++, -1, -1000); - renderString(drawable, gl, renderer, "JOGL", c++, -1, -1000); - renderString(drawable, gl, renderer, "JOCL", c++, -1, -1000); - + renderString(drawable, gl, textRenderUtil, "GlueGen", c++, -1, -1000); + renderString(drawable, gl, textRenderUtil, "JOAL", c++, -1, -1000); + renderString(drawable, gl, textRenderUtil, "JOGL", c++, -1, -1000); + renderString(drawable, gl, textRenderUtil, "JOCL", c++, -1, -1000); + drawable.swapBuffers(); - sleep(); + sleep(); // dispose renderer.destroy(gl); - + NEWTGLContext.destroyWindow(winctx); - } - + } + int lastRow = -1; - - void renderString(GLDrawable drawable, GL2ES2 gl, TextRenderer renderer, String text, int column, int row, int z0) { + + void renderString(GLDrawable drawable, GL2ES2 gl, TextRenderUtil textRenderUtil, String text, int column, int row, int z0) { final int height = drawable.getHeight(); - + int dx = 0; - int dy = height; + int dy = height; if(0>row) { row = lastRow + 1; } AABBox textBox = font.getStringBounds(text, fontSize); dx += font.getAdvanceWidth('X', fontSize) * column; dy -= (int)textBox.getHeight() * ( row + 1 ); - renderer.resetModelview(null); - renderer.translate(gl, dx, dy, z0); - renderer.drawString3D(gl, font, text, fontSize, texSize); - + textRenderUtil.renderer.resetModelview(null); + textRenderUtil.renderer.translate(gl, dx, dy, z0); + textRenderUtil.drawString3D(gl, font, text, fontSize, texSize); + lastRow = row; - } + } } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/TextRendererGLELBase.java b/src/test/com/jogamp/opengl/test/junit/graph/TextRendererGLELBase.java index 38afed7fe..704e98999 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TextRendererGLELBase.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TextRendererGLELBase.java @@ -34,22 +34,23 @@ import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLEventListener; import javax.media.opengl.fixedfunc.GLMatrixFunc; +import com.jogamp.graph.curve.opengl.RegionRenderer; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.curve.opengl.TextRenderer; +import com.jogamp.graph.curve.opengl.TextRenderUtil; import com.jogamp.graph.font.Font; import com.jogamp.graph.font.FontFactory; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.opengl.math.geom.AABBox; import com.jogamp.opengl.util.PMVMatrix; import com.jogamp.opengl.util.glsl.ShaderState; public abstract class TextRendererGLELBase implements GLEventListener { + public final Font font; + public final int usrRenderModes; + protected final int[] texSize = new int[] { 0 }; protected final float[] staticRGBAColor = new float[] { 1f, 1f, 1f, 1f }; - protected final Font font; - protected final int usrRenderModes; - /** * In exclusive mode, impl. uses a pixelScale of 1f and orthogonal PMV on window dimensions * and renderString uses 'height' for '1'. @@ -61,7 +62,8 @@ public abstract class TextRendererGLELBase implements GLEventListener { protected boolean exclusivePMVMatrix = true; protected PMVMatrix usrPMVMatrix = null; protected RenderState rs = null; - protected TextRenderer renderer = null; + protected RegionRenderer renderer = null; + protected TextRenderUtil textRenderUtil = null; /** font size in pixels, default is 24 */ protected int fontSize = 24; @@ -83,16 +85,25 @@ public abstract class TextRendererGLELBase implements GLEventListener { this.font = _font; } } + public TextRendererGLELBase(final RenderState rs, final boolean exclusivePMVMatrix, final int renderModes) { + this(renderModes); + this.rs = rs; + this.exclusivePMVMatrix = exclusivePMVMatrix; + } public void setFlipVerticalInGLOrientation(boolean v) { flipVerticalInGLOrientation=v; } - public final TextRenderer getRenderer() { return renderer; } + public final RegionRenderer getRenderer() { return renderer; } + public final TextRenderUtil getTextRenderUtil() { return textRenderUtil; } @Override public void init(GLAutoDrawable drawable) { if( null != font ) { - exclusivePMVMatrix = null == usrPMVMatrix; - this.rs = RenderState.createRenderState(new ShaderState(), SVertex.factory(), usrPMVMatrix); - this.renderer = TextRenderer.create(rs, usrRenderModes); + if( null == this.rs ) { + exclusivePMVMatrix = null == usrPMVMatrix; + this.rs = RenderState.createRenderState(new ShaderState(), SVertex.factory(), usrPMVMatrix); + } + this.renderer = RegionRenderer.create(rs, usrRenderModes); + this.textRenderUtil = new TextRenderUtil(renderer); if( 0 == usrRenderModes ) { texSizeScale = 0; } @@ -103,7 +114,6 @@ public abstract class TextRendererGLELBase implements GLEventListener { final ShaderState st = rs.getShaderState(); st.useProgram(gl, false); } else { - this.rs = null; this.renderer = null; } } @@ -181,7 +191,7 @@ public abstract class TextRendererGLELBase implements GLEventListener { pmvMatrix.glScalef(pixelScale, pixelScale, 1f); } renderer.updateMatrix(gl); - renderer.drawString3D(gl, font, text, fontSize, texSize); + textRenderUtil.drawString3D(gl, font, text, fontSize, texSize); st.useProgram(gl, false); gl.glDisable(GL2ES2.GL_BLEND); diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo01.java index 160dc0ffe..d4f07a163 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo01.java @@ -34,7 +34,7 @@ import javax.media.opengl.GLProfile; import com.jogamp.graph.curve.Region; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.event.KeyAdapter; import com.jogamp.newt.event.KeyEvent; import com.jogamp.newt.event.WindowAdapter; diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo02.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo02.java index e7b5c73c5..068498980 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo02.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo02.java @@ -34,7 +34,7 @@ import javax.media.opengl.GLProfile; import com.jogamp.graph.curve.Region; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.event.KeyAdapter; import com.jogamp.newt.event.KeyEvent; import com.jogamp.newt.event.WindowAdapter; diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java index 4ebb937a0..4e3d271e1 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java @@ -56,31 +56,32 @@ import com.jogamp.opengl.util.GLReadBufferUtil; * Action Keys: * - 1/2: zoom in/out * - 6/7: 2nd pass texture size - * - 0/9: rotate + * - 0/9: rotate * - Q/W: change weight * - v: toggle v-sync * - s: screenshot */ public abstract class GPURendererListenerBase01 implements GLEventListener { - private GLReadBufferUtil screenshot; - private Renderer renderer; - private int renderModes; - private boolean debug; - private boolean trace; - + private final Renderer renderer; + private final int renderModes; + private final boolean debug; + private final boolean trace; + protected GLRegion region; + private final GLReadBufferUtil screenshot; + private KeyAction keyAction; - + private volatile GLAutoDrawable autoDrawable = null; - + private final float[] position = new float[] {0,0,0}; - + private float xTran = -10; - private float yTran = 10; + private float yTran = 10; private float ang = 0f; private float zoom = -70f; - private int[] texSize = new int[] { 400 }; + private final int[] texSize = new int[] { 400 }; protected volatile float weight = 1.0f; boolean ignoreInput = false; @@ -92,7 +93,7 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { this.trace = trace; this.screenshot = new GLReadBufferUtil(false, false); } - + public final Renderer getRenderer() { return renderer; } public final int getRenderModes() { return renderModes; } public final float getZoom() { return zoom; } @@ -104,12 +105,12 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { public void setMatrix(float xtrans, float ytrans, float angle, int zoom, int fbosize) { this.xTran = xtrans; - this.yTran = ytrans; - this.ang = angle; + this.yTran = ytrans; + this.ang = angle; this.zoom = zoom; - this.texSize[0] = fbosize; + this.texSize[0] = fbosize; } - + public void init(GLAutoDrawable drawable) { autoDrawable = drawable; GL2ES2 gl = drawable.getGL().getGL2ES2(); @@ -125,17 +126,17 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); getRenderer().init(gl); } - + public void reshape(GLAutoDrawable drawable, int xstart, int ystart, int width, int height) { GL2ES2 gl = drawable.getGL().getGL2ES2(); - - gl.glViewport(xstart, ystart, width, height); + + gl.glViewport(xstart, ystart, width, height); renderer.reshapePerspective(gl, 45.0f, width, height, 0.1f, 7000.0f); - + dumpMatrix(); - System.err.println("Reshape: "+renderer.getRenderState()); + System.err.println("Reshape: "+renderer.getRenderState()); } - + public void dispose(GLAutoDrawable drawable) { autoDrawable = null; GL2ES2 gl = drawable.getGL().getGL2ES2(); @@ -144,13 +145,13 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { } screenshot.dispose(gl); renderer.destroy(gl); - } - + } + public void zoom(int v){ zoom += v; dumpMatrix(); } - + public void move(float x, float y){ xTran += x; yTran += y; @@ -168,37 +169,37 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { weight += delta; System.err.println("Global Weight: "+ weight); } - + void dumpMatrix() { System.err.println("Matrix: " + xTran + "/" + yTran + " x"+zoom + " @"+ang); } - - /** Attach the input listener to the window */ + + /** Attach the input listener to the window */ public void attachInputListenerTo(GLWindow window) { if ( null == keyAction ) { keyAction = new KeyAction(); - window.addKeyListener(keyAction); + window.addKeyListener(keyAction); } } - + public void detachInputListenerFrom(GLWindow window) { if ( null == keyAction ) { return; } window.removeKeyListener(keyAction); } - + public void printScreen(GLAutoDrawable drawable, String dir, String tech, String objName, boolean exportAlpha) throws GLException, IOException { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); pw.printf("-%03dx%03d-Z%04d-T%04d-%s", drawable.getWidth(), drawable.getHeight(), (int)Math.abs(zoom), texSize[0], objName); - + final String filename = dir + tech + sw +".png"; if(screenshot.readPixels(drawable.getGL(), false)) { screenshot.write(new File(filename)); } } - + int screenshot_num = 0; public void setIgnoreInput(boolean v) { @@ -207,13 +208,13 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { public boolean getIgnoreInput() { return ignoreInput; } - + public class KeyAction implements KeyListener { public void keyPressed(KeyEvent arg0) { if(ignoreInput) { return; } - + if(arg0.getKeyCode() == KeyEvent.VK_1){ zoom(10); } @@ -239,13 +240,13 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { else if(arg0.getKeyCode() == KeyEvent.VK_7){ texSize[0] += 10; System.err.println("Tex Size: " + texSize[0]); - } + } else if(arg0.getKeyCode() == KeyEvent.VK_0){ rotate(1); } else if(arg0.getKeyCode() == KeyEvent.VK_9){ rotate(-1); - } + } else if(arg0.getKeyCode() == KeyEvent.VK_Q){ editGlobalWeight(-0.1f); } @@ -257,7 +258,7 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { autoDrawable.invoke(false, new GLRunnable() { public boolean run(GLAutoDrawable drawable) { GL gl = drawable.getGL(); - int i = gl.getSwapInterval(); + int i = gl.getSwapInterval(); i = i==0 ? 1 : 0; gl.setSwapInterval(i); final GLAnimatorControl a = drawable.getAnimator(); @@ -271,7 +272,7 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { return true; } }); - } + } } else if(arg0.getKeyCode() == KeyEvent.VK_S){ rotate(-1); @@ -279,19 +280,19 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { autoDrawable.invoke(false, new GLRunnable() { public boolean run(GLAutoDrawable drawable) { try { - final String type = Region.isVBAA(renderModes) ? "vbaa0-msaa1" : "vbaa1-msaa0" + ( Region.isNonUniformWeight(renderModes) ? "-vc" : "-uc" ) ; + final String type = Region.isVBAA(renderModes) ? "vbaa0-msaa1" : "vbaa1-msaa0" + ( Region.isNonUniformWeight(renderModes) ? "-vc" : "-uc" ) ; printScreen(drawable, "./", "demo-"+type, "snap"+screenshot_num, false); screenshot_num++; } catch (GLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); - } + } return true; } }); - } - } + } + } } public void keyReleased(KeyEvent arg0) {} } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextGLListener0A.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextGLListener0A.java index 5c7d15ad1..4d544019c 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextGLListener0A.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextGLListener0A.java @@ -32,40 +32,40 @@ import javax.media.opengl.GL2ES2; import javax.media.opengl.GLAutoDrawable; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.curve.opengl.TextRenderer; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.curve.opengl.Renderer; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.opengl.GLWindow; import com.jogamp.opengl.util.glsl.ShaderState; public class GPUTextGLListener0A extends GPUTextRendererListenerBase01 { - + public GPUTextGLListener0A() { this( RenderState.createRenderState(new ShaderState(), SVertex.factory()), 0, 0, false, false ) ; } - + public GPUTextGLListener0A(RenderState rs, int numpass, int fbosize, boolean debug, boolean trace) { super(rs, numpass, debug, trace); - setMatrix(-400, -30, 0f, -500, fbosize); + setMatrix(-400, -30, 0f, -500, fbosize); } - + public void init(GLAutoDrawable drawable) { if(drawable instanceof GLWindow) { final GLWindow glw = (GLWindow) drawable; attachInputListenerTo(glw); - } + } super.init(drawable); - + GL2ES2 gl = drawable.getGL().getGL2ES2(); - - final TextRenderer textRenderer = (TextRenderer) getRenderer(); - + + final Renderer renderer = getRenderer(); + gl.setSwapInterval(1); gl.glEnable(GL2ES2.GL_DEPTH_TEST); gl.glEnable(GL2ES2.GL_BLEND); - textRenderer.setAlpha(gl, 1.0f); - textRenderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); + renderer.setAlpha(gl, 1.0f); + renderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); } - + public void dispose(GLAutoDrawable drawable) { if(drawable instanceof GLWindow) { final GLWindow glw = (GLWindow) drawable; diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo01.java index d257f78fc..c58d10254 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo01.java @@ -32,10 +32,9 @@ import javax.media.opengl.FPSCounter; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLProfile; - import com.jogamp.graph.curve.opengl.GLRegion; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.event.KeyAdapter; import com.jogamp.newt.event.KeyEvent; import com.jogamp.newt.event.WindowAdapter; diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo02.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo02.java index 1b71cd781..59d235537 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo02.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo02.java @@ -33,7 +33,7 @@ import javax.media.opengl.GLProfile; import com.jogamp.graph.curve.Region; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.event.KeyAdapter; import com.jogamp.newt.event.KeyEvent; import com.jogamp.newt.event.WindowAdapter; diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextRendererListenerBase01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextRendererListenerBase01.java index 2ab0632d3..d90b4f849 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextRendererListenerBase01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextRendererListenerBase01.java @@ -35,8 +35,10 @@ import javax.media.opengl.GLAnimatorControl; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLException; +import com.jogamp.graph.curve.opengl.RegionRenderer; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.curve.opengl.TextRenderer; +import com.jogamp.graph.curve.opengl.Renderer; +import com.jogamp.graph.curve.opengl.TextRenderUtil; import com.jogamp.graph.font.Font; import com.jogamp.graph.font.FontFactory; import com.jogamp.newt.event.KeyEvent; @@ -52,7 +54,7 @@ import com.jogamp.opengl.math.geom.AABBox; * - 0/9: rotate * - v: toggle v-sync * - s: screenshot - * + * * Additional Keys: * - 3/4: font +/- * - h: toogle draw 'font set' @@ -61,9 +63,10 @@ import com.jogamp.opengl.math.geom.AABBox; * - i: live input text input (CR ends it, backspace supported) */ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerBase01 { + public final TextRenderUtil textRenderUtil; int fontSet = FontFactory.UBUNTU; Font font; - + int headType = 0; boolean drawFPS = false; final int fontSizeFixed = 6; @@ -73,10 +76,10 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB AABBox fontNameBox; String headtext; AABBox headbox; - + static final String text1 = "abcdefghijklmnopqrstuvwxyz\nABCDEFGHIJKLMNOPQRSTUVWXYZ\n0123456789.:,;(*!?/\\\")$%^&-+@~#<>{}[]"; static final String text2 = "The quick brown fox jumps over the lazy dog"; - static final String textX = + static final String textX = "JOGAMP graph demo using Resolution Independent NURBS\n"+ "JOGAMP JOGL - OpenGL ES2 profile\n"+ "Press 1/2 to zoom in/out the below text\n"+ @@ -84,30 +87,31 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB "Press 0/9 to rotate the below string\n"+ "Press v to toggle vsync\n"+ "Press i for live input text input (CR ends it, backspace supported)\n"+ - "Press f to toggle fps. H for different text, space for font type\n"; - - static final String textX2 = + "Press f to toggle fps. H for different text, space for font type\n"; + + static final String textX2 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec nec sapien tellus. \n"+ "Ut purus odio, rhoncus sit amet commodo eget, ullamcorper vel urna. Mauris ultricies \n"+ "quam iaculis urna cursus ornare. Nullam ut felis a ante ultrices ultricies nec a elit. \n"+ - "In hac habitasse platea dictumst. Vivamus et mi a quam lacinia pharetra at venenatis est.\n"+ + "In hac habitasse platea dictumst. Vivamus et mi a quam lacinia pharetra at venenatis est.\n"+ "Morbi quis bibendum nibh. Donec lectus orci, sagittis in consequat nec, volutpat nec nisi.\n"+ "Donec ut dolor et nulla tristique varius. In nulla magna, fermentum id tempus quis, semper \n"+ "in lorem. Maecenas in ipsum ac justo scelerisque sollicitudin. Quisque sit amet neque lorem,\n" + - "-------Press H to change text---------\n"; - + "-------Press H to change text---------\n"; + StringBuilder userString = new StringBuilder(); boolean userInput = false; - - public GPUTextRendererListenerBase01(RenderState rs, int modes, boolean debug, boolean trace) { - super(TextRenderer.create(rs, modes), modes, debug, trace); + + public GPUTextRendererListenerBase01(RenderState rs, int renderModes, boolean debug, boolean trace) { + super(RegionRenderer.create(rs, renderModes), renderModes, debug, trace); + this.textRenderUtil = new TextRenderUtil(this.getRenderer()); try { this.font = FontFactory.get(fontSet).getDefault(); dumpFontNames(); - + this.fontName = font.toString(); this.fontNameBox = font.getStringBounds(fontName, fontSizeFixed*2); - switchHeadBox(); + switchHeadBox(); } catch (IOException ioe) { System.err.println("Catched: "+ioe.getMessage()); ioe.printStackTrace(); @@ -117,25 +121,25 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB void dumpFontNames() { System.err.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); System.err.println(font.getAllNames(null, "\n")); - System.err.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + System.err.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); } - + void switchHeadBox() { - headType = ( headType + 1 ) % 4 ; + headType = ( headType + 1 ) % 4 ; switch(headType) { case 0: headtext = null; break; - + case 1: headtext= textX2; break; case 2: headtext= textX; break; - + default: - headtext = text1; + headtext = text1; } if(null != headtext) { headbox = font.getStringBounds(headtext, fontSizeFixed*3); @@ -146,60 +150,60 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB final int width = drawable.getWidth(); final int height = drawable.getHeight(); GL2ES2 gl = drawable.getGL().getGL2ES2(); - + gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // Demo02 needs to have this set here as well .. hmm ? gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); - final TextRenderer textRenderer = (TextRenderer) getRenderer(); - textRenderer.reshapeOrtho(null, width, height, 0.1f, 7000.0f); - textRenderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); + final Renderer renderer = getRenderer(); + renderer.reshapeOrtho(null, width, height, 0.1f, 7000.0f); + renderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); final GLAnimatorControl animator = drawable.getAnimator(); final boolean _drawFPS = drawFPS && null != animator && animator.getTotalFPSFrames()>10; - + if(_drawFPS) { final float fps = animator.getTotalFPS(); final String fpsS = String.valueOf(fps); final int fpsSp = fpsS.indexOf('.'); - textRenderer.resetModelview(null); - textRenderer.translate(gl, fontSizeFixed, fontSizeFixed, -6000); - textRenderer.drawString3D(gl, font, fpsS.substring(0, fpsSp+2)+" fps", fontSizeFixed*3, getTexSize()); + renderer.resetModelview(null); + renderer.translate(gl, fontSizeFixed, fontSizeFixed, -6000); + textRenderUtil.drawString3D(gl, font, fpsS.substring(0, fpsSp+2)+" fps", fontSizeFixed*3, getTexSize()); } - + int dx = width-(int)fontNameBox.getWidth()-2 ; - int dy = height - 10; - - textRenderer.resetModelview(null); - textRenderer.translate(gl, dx, dy, -6000); - textRenderer.drawString3D(gl, font, fontName, fontSizeFixed*2, getTexSize()); - + int dy = height - 10; + + renderer.resetModelview(null); + renderer.translate(gl, dx, dy, -6000); + textRenderUtil.drawString3D(gl, font, fontName, fontSizeFixed*2, getTexSize()); + dx = 10; dy += -(int)fontNameBox.getHeight() - 10; - - if(null != headtext) { - textRenderer.resetModelview(null); - textRenderer.translate(gl, dx, dy, -6000); - textRenderer.drawString3D(gl, font, headtext, fontSizeFixed*3, getTexSize()); + + if(null != headtext) { + renderer.resetModelview(null); + renderer.translate(gl, dx, dy, -6000); + textRenderUtil.drawString3D(gl, font, headtext, fontSizeFixed*3, getTexSize()); } - - textRenderer.reshapePerspective(null, 45.0f, width, height, 0.1f, 7000.0f); - textRenderer.resetModelview(null); - textRenderer.translate(null, getXTran(), getYTran(), getZoom()); - textRenderer.rotate(gl, getAngle(), 0, 1, 0); - textRenderer.setColorStatic(gl, 1.0f, 0.0f, 0.0f); + renderer.reshapePerspective(null, 45.0f, width, height, 0.1f, 7000.0f); + + renderer.resetModelview(null); + renderer.translate(null, getXTran(), getYTran(), getZoom()); + renderer.rotate(gl, getAngle(), 0, 1, 0); + renderer.setColorStatic(gl, 1.0f, 0.0f, 0.0f); if(!userInput) { - textRenderer.drawString3D(gl, font, text2, fontSize, getTexSize()); + textRenderUtil.drawString3D(gl, font, text2, fontSize, getTexSize()); } else { - textRenderer.drawString3D(gl, font, userString.toString(), fontSize, getTexSize()); + textRenderUtil.drawString3D(gl, font, userString.toString(), fontSize, getTexSize()); } - } - + } + public void fontIncr(int v) { fontSize = Math.abs((fontSize + v) % fontSizeModulo) ; dumpMatrix(true); } - public boolean nextFontSet() { + public boolean nextFontSet() { try { int set = ( fontSet == FontFactory.UBUNTU ) ? FontFactory.JAVA : FontFactory.UBUNTU ; Font _font = FontFactory.get(set).getDefault(); @@ -207,7 +211,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB fontSet = set; font = _font; fontName = font.getFullFamilyName(null).toString(); - fontNameBox = font.getStringBounds(fontName, fontSizeFixed*3); + fontNameBox = font.getStringBounds(fontName, fontSizeFixed*3); dumpFontNames(); return true; } @@ -216,7 +220,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB } return false; } - + public boolean setFontSet(int set, int family, int stylebits) { try { Font _font = FontFactory.get(set).get(family, stylebits); @@ -224,7 +228,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB fontSet = set; font = _font; fontName = font.getFullFamilyName(null).toString(); - fontNameBox = font.getStringBounds(fontName, fontSizeFixed*3); + fontNameBox = font.getStringBounds(fontName, fontSizeFixed*3); dumpFontNames(); return true; } @@ -233,25 +237,25 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB } return false; } - + public boolean isUserInputMode() { return userInput; } - + void dumpMatrix(boolean bbox) { System.err.println("Matrix: " + getXTran() + "/" + getYTran() + " x"+getZoom() + " @"+getAngle() +" fontSize "+fontSize); if(bbox) { System.err.println("bbox: "+font.getStringBounds(text2, fontSize)); } } - + KeyAction keyAction = null; - + @Override public void attachInputListenerTo(GLWindow window) { if ( null == keyAction ) { keyAction = new KeyAction(); window.addKeyListener(keyAction); - super.attachInputListenerTo(window); - } + super.attachInputListenerTo(window); + } } @Override @@ -262,18 +266,18 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB } window.removeKeyListener(keyAction); } - + public void printScreen(GLAutoDrawable drawable, String dir, String tech, boolean exportAlpha) throws GLException, IOException { - final String fn = font.getFullFamilyName(null).toString(); + final String fn = font.getFullFamilyName(null).toString(); printScreen(drawable, dir, tech, fn.replace(' ', '_'), exportAlpha); } - + public class KeyAction implements KeyListener { public void keyPressed(KeyEvent e) { if(userInput) { return; } - final short s = e.getKeySymbol(); + final short s = e.getKeySymbol(); if(s == KeyEvent.VK_3) { fontIncr(10); } @@ -282,11 +286,11 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB } else if(s == KeyEvent.VK_H) { switchHeadBox(); - } + } else if(s == KeyEvent.VK_F) { - drawFPS = !drawFPS; - } - else if(s == KeyEvent.VK_SPACE) { + drawFPS = !drawFPS; + } + else if(s == KeyEvent.VK_SPACE) { nextFontSet(); } else if(s == KeyEvent.VK_I) { @@ -294,12 +298,12 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB setIgnoreInput(true); } } - + public void keyReleased(KeyEvent e) { if( !e.isPrintableKey() || e.isAutoRepeat() ) { return; - } - if(userInput) { + } + if(userInput) { final short k = e.getKeySymbol(); if( KeyEvent.VK_ENTER == k ) { userInput = false; @@ -308,7 +312,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB userString.deleteCharAt(userString.length()-1); } else { final char c = e.getKeyChar(); - if( font.isPrintableChar( c ) ) { + if( font.isPrintableChar( c ) ) { userString.append(c); } } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneGLListener0A.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneGLListener0A.java index c9a3f5542..c9f27df80 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneGLListener0A.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneGLListener0A.java @@ -15,7 +15,7 @@ import com.jogamp.graph.curve.opengl.RegionRenderer; import com.jogamp.graph.curve.opengl.RenderState; import com.jogamp.graph.font.Font; import com.jogamp.graph.font.FontFactory; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.event.MouseAdapter; import com.jogamp.newt.event.MouseEvent; import com.jogamp.newt.opengl.GLWindow; @@ -28,59 +28,59 @@ import com.jogamp.opengl.util.glsl.ShaderState; public class GPUUISceneGLListener0A implements GLEventListener { private boolean debug = false; - private boolean trace = false; - + private boolean trace = false; + private final int renderModes; - private final int[] texSize = new int[1]; + private final int[] texSize = new int[1]; private final int renderModes2; - private final int[] texSize2 = new int[1]; + private final int[] texSize2 = new int[1]; private RegionRenderer regionRenderer; - private RenderState rs; - + private final RenderState rs; + int fontSet = FontFactory.UBUNTU; Font font; final int fontSizeFixed = 6; - + private float xTran = 0; - private float yTran = 0; + private float yTran = 0; private float ang = 0f; private float zoom = -200f; - private float zoomText = 1f; + private final float zoomText = 1f; private int currentText = 0; - + private Label[] labels = null; private String[] strings = null; - private UIRegion[] labelRegions; + private final UIRegion[] labelRegions; private UIRegion fpsRegion = null; private UIRegion jogampRegion = null; private RIButton[] buttons = null; - - private int numSelectable = 6; - + + private final int numSelectable = 6; + private SceneUIController sceneUIController = null; private MultiTouchListener multiTouchListener = null; private boolean showFPS = false; private GLAutoDrawable cDrawable; - private float fps = 0; - - private String jogamp = "JogAmp - Jogl Graph Module Demo"; - private float angText = 0; - + private float fps = 0; + + private final String jogamp = "JogAmp - Jogl Graph Module Demo"; + private final float angText = 0; + public GPUUISceneGLListener0A() { this(0); } - + public GPUUISceneGLListener0A(int renderModes) { this(RenderState.createRenderState(new ShaderState(), SVertex.factory()), renderModes, false, false); } - + public GPUUISceneGLListener0A(RenderState rs, int renderModes, boolean debug, boolean trace) { this.rs = rs; this.renderModes = renderModes; this.texSize[0] = Region.isVBAA(renderModes) ? 400 : 0; this.renderModes2 = 0; this.texSize2[0] = 0; - + this.debug = debug; this.trace = trace; try { @@ -92,16 +92,16 @@ public class GPUUISceneGLListener0A implements GLEventListener { labelRegions = new UIRegion[3]; sceneUIController = new SceneUIController(); } - + private void initButtons(int width, int height) { buttons = new RIButton[numSelectable]; int xaxis = -110; float xSize = 40f; float ySize = 16f; - + int start = 50; int diff = (int)ySize + 5; - + buttons[0] = new RIButton(SVertex.factory(), font, "Next Text", xSize, ySize){ public void onClick() { currentText = (currentText+1)%3; @@ -109,9 +109,9 @@ public class GPUUISceneGLListener0A implements GLEventListener { public void onPressed() { } public void onRelease() { } }; - + buttons[0].setPosition(xaxis,start,0); - + buttons[1] = new RIButton(SVertex.factory(), font, "Show FPS", xSize, ySize){ public void onClick() { final GLAnimatorControl a = cDrawable.getAnimator(); @@ -125,7 +125,7 @@ public class GPUUISceneGLListener0A implements GLEventListener { }; buttons[1].setPosition(xaxis,start - diff,0); buttons[1].setToggleable(true); - + buttons[2] = new RIButton(SVertex.factory(), font, "v-sync", xSize, ySize){ public void onClick() { cDrawable.invoke(false, new GLRunnable() { @@ -145,18 +145,18 @@ public class GPUUISceneGLListener0A implements GLEventListener { }; buttons[2].setPosition(xaxis,start-diff*2,0); buttons[2].setToggleable(true); - + buttons[3] = new RIButton(SVertex.factory(), font, "Tilt +Y", xSize, ySize) { - public void onClick() { + public void onClick() { ang+=10; } - public void onPressed() { + public void onPressed() { } public void onRelease() { } }; buttons[3].setPosition(xaxis,start-diff*3,0); - + buttons[4] = new RIButton(SVertex.factory(), font, "Tilt -Y", xSize, ySize){ public void onClick() { ang-=10; @@ -165,7 +165,7 @@ public class GPUUISceneGLListener0A implements GLEventListener { public void onRelease() { } }; buttons[4].setPosition(xaxis,start-diff*4,0); - + buttons[5] = new RIButton(SVertex.factory(), font, "Quit", xSize, ySize){ public void onClick() { cDrawable.destroy(); @@ -176,26 +176,26 @@ public class GPUUISceneGLListener0A implements GLEventListener { buttons[5].setPosition(xaxis,start-diff*5,0); buttons[5].setButtonColor(0.8f, 0.0f, 0.0f); buttons[5].setLabelColor(1.0f, 1.0f, 1.0f); - + buttons[5].setButtonSelectedColor(0.8f, 0.8f, 0.8f); buttons[5].setLabelSelectedColor(0.8f, 0.0f, 0.0f); } - + private void initTexts() { strings = new String[3]; - + strings[0] = "abcdefghijklmn\nopqrstuvwxyz\nABCDEFGHIJKL\nMNOPQRSTUVWXYZ\n0123456789.:,;(*!?/\\\")$%^&-+@~#<>{}[]"; strings[1] = "The quick brown fox\njumps over the lazy\ndog"; - - strings[2] = + + strings[2] = "Lorem ipsum dolor sit amet, consectetur\n"+ "Ut purus odio, rhoncus sit amet com\n"+ "quam iaculis urna cursus ornare. Nullam\n"+ - "In hac habitasse platea dictumst. Vivam\n"+ + "In hac habitasse platea dictumst. Vivam\n"+ "Morbi quis bibendum nibh. Donec lectus\n"+ "Donec ut dolor et nulla tristique variu\n"+ "in lorem. Maecenas in ipsum ac justo sc\n"; - + labels = new Label[3]; } @@ -205,7 +205,7 @@ public class GPUUISceneGLListener0A implements GLEventListener { final GLWindow glw = (GLWindow) drawable; attachInputListenerTo(glw); } else { - System.err.println("GPUUISceneGLListener0A: init (0)"); + System.err.println("GPUUISceneGLListener0A: init (0)"); } final int width = drawable.getWidth(); final int height = drawable.getHeight(); @@ -217,26 +217,26 @@ public class GPUUISceneGLListener0A implements GLEventListener { if(trace) { gl = gl.getContext().setGL( GLPipelineFactory.create("javax.media.opengl.Trace", null, gl, new Object[] { System.err } ) ).getGL2ES2(); } - + try { font = FontFactory.get(fontSet).getDefault(); } catch (IOException ioe) { System.err.println("Catched: "+ioe.getMessage()); ioe.printStackTrace(); } - - regionRenderer = RegionRenderer.create(rs, renderModes); - + + regionRenderer = RegionRenderer.create(rs, renderModes); + gl.glEnable(GL2ES2.GL_DEPTH_TEST); gl.glEnable(GL2ES2.GL_BLEND); - + regionRenderer.init(gl); regionRenderer.setAlpha(gl, 1.0f); regionRenderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); - + initTexts(); initButtons(width, height); - + sceneUIController.setRenderer(regionRenderer, rs, renderModes, texSize); sceneUIController.addShape(buttons[0]); sceneUIController.addShape(buttons[1]); @@ -245,18 +245,18 @@ public class GPUUISceneGLListener0A implements GLEventListener { sceneUIController.addShape(buttons[4]); sceneUIController.addShape(buttons[5]); drawable.addGLEventListener(sceneUIController); - + Label jlabel = new Label(SVertex.factory(), font, fontSizeFixed, jogamp){ public void onClick() { } public void onPressed() { } public void onRelease() { } }; - + jogampRegion = new UIRegion(jlabel); final GLAnimatorControl a = drawable.getAnimator(); if( null != a ) { a.resetFPSCounter(); - } + } } public void dispose(GLAutoDrawable drawable) { @@ -265,11 +265,11 @@ public class GPUUISceneGLListener0A implements GLEventListener { final GLWindow glw = (GLWindow) drawable; detachInputListenerFrom(glw); } else { - System.err.println("GPUUISceneGLListener0A: dispose (0)"); + System.err.println("GPUUISceneGLListener0A: dispose (0)"); } // sceneUIController will remove itself from the drawable! - + GL2ES2 gl = drawable.getGL().getGL2ES2(); regionRenderer.destroy(gl); } @@ -279,20 +279,20 @@ public class GPUUISceneGLListener0A implements GLEventListener { final int width = drawable.getWidth(); final int height = drawable.getHeight(); GL2ES2 gl = drawable.getGL().getGL2ES2(); - + gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); - + regionRenderer.reshapePerspective(null, 45.0f, width, height, 0.1f, 7000.0f); sceneUIController.setTranslate(xTran, yTran, zoom); sceneUIController.setRotation(0, ang, 0); - + renderScene(drawable); } - + private void renderScene(GLAutoDrawable drawable) { GL2ES2 gl = drawable.getGL().getGL2ES2(); - + regionRenderer.resetModelview(null); regionRenderer.translate(null, xTran-50, yTran+43, zoom); regionRenderer.translate(gl, 0, 30, 0); @@ -300,8 +300,8 @@ public class GPUUISceneGLListener0A implements GLEventListener { regionRenderer.scale(gl, 1.5f, 1.5f, 1.0f); regionRenderer.rotate(gl, angText , 0, 1, 0); regionRenderer.setColorStatic(gl, 0.0f, 1.0f, 0.0f); - regionRenderer.draw(gl, jogampRegion.getRegion(gl, rs, 0), null); - + regionRenderer.draw(gl, jogampRegion.getRegion(gl, regionRenderer, 0), null); + if(null == labelRegions[currentText]) { if( null == labels[currentText]) { labels[currentText] = new Label(SVertex.factory(), font, fontSizeFixed, strings[currentText]){ @@ -312,20 +312,20 @@ public class GPUUISceneGLListener0A implements GLEventListener { } labelRegions[currentText] = new UIRegion(labels[currentText]); } - + regionRenderer.resetModelview(null); regionRenderer.translate(null, xTran-50, yTran, zoom); regionRenderer.translate(gl, 0, 30, 0); regionRenderer.scale(null, zoomText, zoomText, 1); regionRenderer.scale(gl, 1.5f, 1.5f, 1.0f); regionRenderer.rotate(gl, zoomText, 0, 1, 0); - + regionRenderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); - regionRenderer.draw(gl, labelRegions[currentText].getRegion(gl, rs, renderModes2), texSize2); - + regionRenderer.draw(gl, labelRegions[currentText].getRegion(gl, regionRenderer, renderModes2), texSize2); + final GLAnimatorControl animator = drawable.getAnimator(); final boolean _drawFPS = showFPS && null != animator; - + if(_drawFPS && fps != animator.getTotalFPS()) { if(null != fpsRegion) { fpsRegion.destroy(gl, rs); @@ -333,26 +333,26 @@ public class GPUUISceneGLListener0A implements GLEventListener { fps = animator.getTotalFPS(); final String fpsS = String.valueOf(fps); final int fpsSp = fpsS.indexOf('.'); - + Label fpsLabel = new Label(SVertex.factory(), font, fontSizeFixed, fpsS.substring(0, fpsSp+2)+" fps"){ public void onClick() { } public void onPressed() { } public void onRelease() { } }; fpsRegion = new UIRegion(fpsLabel); - } + } if(showFPS && null != fpsRegion) { regionRenderer.translate(gl, 0, -60, 0); regionRenderer.scale(null, zoomText, zoomText, 1); - regionRenderer.draw(gl, fpsRegion.getRegion(gl, rs, 0), null); + regionRenderer.draw(gl, fpsRegion.getRegion(gl, regionRenderer, 0), null); } } - + public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { System.err.println("GPUUISceneGLListener0A: reshape"); GL2ES2 gl = drawable.getGL().getGL2ES2(); - - gl.glViewport(x, y, width, height); + + gl.glViewport(x, y, width, height); regionRenderer.reshapePerspective(gl, 45.0f, width, height, 5f, 70.0f); } @@ -363,23 +363,23 @@ public class GPUUISceneGLListener0A implements GLEventListener { sceneUIController.attachInputListenerTo(window); } } - + public void detachInputListenerFrom(GLWindow window) { if ( null != multiTouchListener ) { window.removeMouseListener(multiTouchListener); sceneUIController.detachInputListenerFrom(window); } } - + private class MultiTouchListener extends MouseAdapter { int lx = 0; int ly = 0; - + boolean first = false; - + @Override public void mousePressed(MouseEvent e) { - first = true; + first = true; } @Override @@ -399,9 +399,9 @@ public class GPUUISceneGLListener0A implements GLEventListener { } int nv = Math.abs(e.getY(0)-e.getY(1)); int dy = nv - lx; - + zoom += 2 * Math.signum(dy); - + lx = nv; } else { // 1 pointer drag @@ -413,7 +413,7 @@ public class GPUUISceneGLListener0A implements GLEventListener { } int nx = e.getX(); int ny = e.getY(); - int dx = nx - lx; + int dx = nx - lx; int dy = ny - ly; if(Math.abs(dx) > Math.abs(dy)){ xTran += Math.signum(dx); @@ -425,7 +425,7 @@ public class GPUUISceneGLListener0A implements GLEventListener { ly = ny; } } - + @Override public void mouseWheelMoved(MouseEvent e) { if( !e.isShiftDown() ) { @@ -433,4 +433,4 @@ public class GPUUISceneGLListener0A implements GLEventListener { } } } -}
\ No newline at end of file +}
\ No newline at end of file diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo01.java index 0563ab2cf..17b9642d9 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo01.java @@ -4,7 +4,7 @@ import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLProfile; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.event.WindowAdapter; import com.jogamp.newt.event.WindowEvent; import com.jogamp.newt.opengl.GLWindow; diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo02.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo02.java index 4c8da139e..a4673f0c5 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo02.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo02.java @@ -5,7 +5,7 @@ import javax.media.opengl.GLProfile; import com.jogamp.graph.curve.Region; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.event.WindowAdapter; import com.jogamp.newt.event.WindowEvent; import com.jogamp.newt.opengl.GLWindow; diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label.java index 4fef2d8c2..baaae3521 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label.java @@ -27,12 +27,15 @@ */ package com.jogamp.opengl.test.junit.graph.demos.ui; -import javax.media.opengl.GL2ES2; +import java.util.HashMap; -import jogamp.graph.curve.text.GlyphString; +import javax.media.opengl.GL2ES2; +import com.jogamp.graph.curve.OutlineShape; +import com.jogamp.graph.curve.opengl.GLRegion; import com.jogamp.graph.curve.opengl.RegionRenderer; -import com.jogamp.graph.curve.opengl.RenderState; +import com.jogamp.graph.curve.opengl.Renderer; +import com.jogamp.graph.curve.opengl.TextRenderUtil; import com.jogamp.graph.font.Font; import com.jogamp.graph.geom.Vertex; import com.jogamp.graph.geom.Vertex.Factory; @@ -41,35 +44,36 @@ public abstract class Label extends UIShape implements UITextShape { protected Font font; protected int size; protected String text; - protected GlyphString glyphString; - + protected GLRegion glyphRegion; + public Label(Factory<? extends Vertex> factory, Font font, int size, String text) { super(factory); this.font = font; this.size = size; this.text = text; } - - public GlyphString getGlyphString() { - return glyphString; + + @Override + public GLRegion getRegion() { + return glyphRegion; } - + public String getText() { return text; } - + public void setText(String text) { this.text = text; dirty |= DIRTY_SHAPE; } - + public Font getFont() { return font; } public void setFont(Font font) { this.font = font; - dirty |= DIRTY_SHAPE; + dirty |= DIRTY_SHAPE; } public int getSize() { @@ -78,28 +82,29 @@ public abstract class Label extends UIShape implements UITextShape { public void setSize(int size) { this.size = size; - dirty |= DIRTY_SHAPE; + dirty |= DIRTY_SHAPE; } + @Override public String toString(){ return "Label [" + font.toString() + ", size " + size + ", " + getText() + "]"; } @Override - protected void clearImpl() { - if(null != glyphString) { - glyphString.destroy(null, null); - } + protected void clearImpl(GL2ES2 gl, Renderer renderer) { + if(null != glyphRegion) { + glyphRegion.destroy(gl, renderer.getRenderState()); + } } - + @Override - protected void createShape() { - clearImpl(); - glyphString = GlyphString.createString(shape, getVertexFactory(), font, size, text); + protected void createShape(Renderer renderer) { + clearImpl(null, null); + glyphRegion = TextRenderUtil.createRegion(renderer.getRenderModes(), renderer.getRenderState().getVertexFactory(), + font, text, size); } @Override - public void render(GL2ES2 gl, RenderState rs, RegionRenderer renderer, - int renderModes, int[/*1*/] texSize, boolean selection) { + public void render(GL2ES2 gl, RegionRenderer renderer, int renderModes, int[/*1*/] texSize, boolean selection) { } } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/RIButton.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/RIButton.java index 3060c5657..d291c903a 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/RIButton.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/RIButton.java @@ -30,7 +30,7 @@ package com.jogamp.opengl.test.junit.graph.demos.ui; import javax.media.opengl.GL2ES2; import com.jogamp.graph.curve.opengl.RegionRenderer; -import com.jogamp.graph.curve.opengl.RenderState; +import com.jogamp.graph.curve.opengl.Renderer; import com.jogamp.graph.font.Font; import com.jogamp.graph.geom.Vertex; import com.jogamp.graph.geom.Vertex.Factory; @@ -41,20 +41,20 @@ import com.jogamp.opengl.test.junit.graph.demos.ui.opengl.UIRegion; */ public abstract class RIButton extends UIShape { private float width, height; - private Label label; + private final Label label; private float spacing = 4.0f; private float corner = 1.0f; private float labelZOffset = -0.05f; - + private float[] buttonColor = {0.6f, 0.6f, 0.6f}; private float[] buttonSelectedColor = {0.8f,0.8f,0.8f}; private float[] labelColor = {1.0f, 1.0f, 1.0f}; private float[] labelSelectedColor = {0.1f, 0.1f, 0.1f}; - - + + public RIButton(Factory<? extends Vertex> factory, Font labelFont, String labelText, float width, float height) { super(factory); - + // FIXME: Determine font size - PMV Matrix relation ? // this.label = new Label(factory, labelFont, (int)(height - 2f * spacing), labelText); this.label = new Label(factory, labelFont, 10, labelText){ @@ -62,7 +62,7 @@ public abstract class RIButton extends UIShape { public void onPressed() { } public void onRelease() { } }; - + this.width = width; this.height = height; } @@ -77,20 +77,20 @@ public abstract class RIButton extends UIShape { this.height = height; dirty |= DIRTY_SHAPE; } - + @Override - protected void clearImpl() { + protected void clearImpl(GL2ES2 gl, Renderer renderer) { label.clear(); } - + @Override - protected void createShape() { - // FIXME: Only possible if all data (color) is + protected void createShape(Renderer renderer) { + // FIXME: Only possible if all data (color) is // is incl. in Outline Shape. // Until then - draw each separately! //shape.addOutlinShape( label.getShape() ); label.updateShape(); - + final AABBox lbox = label.getBounds(); if(corner == 0.0f) { createSharpOutline(lbox); @@ -99,33 +99,33 @@ public abstract class RIButton extends UIShape { } float sx = getWidth() / ( 2f*spacing + lbox.getWidth() ); float sy = getHeight() / ( 2f*spacing + lbox.getHeight() ); - + setScale(sx, sy, 1); } - - + + private void createSharpOutline(AABBox lbox) { float th = (2f*spacing) + lbox.getHeight(); float tw = (2f*spacing) + lbox.getWidth(); - + float minX = lbox.getMinX()-spacing; float minY = lbox.getMinY()-spacing; float minZ = labelZOffset; - + shape.addVertex(minX, minY, minZ, true); shape.addVertex(minX+tw, minY, minZ, true); shape.addVertex(minX+tw, minY + th, minZ, true); shape.addVertex(minX, minY + th, minZ, true); shape.closeLastOutline(); } - + private void createCurvedOutline(AABBox lbox){ float th = 2.0f*spacing + lbox.getHeight(); float tw = 2.0f*spacing + lbox.getWidth(); - + float cw = 0.5f*corner*Math.min(tw, th); float ch = 0.5f*corner*Math.min(tw, th); - + float minX = lbox.getMinX()-spacing; float minY = lbox.getMinY()-spacing; float minZ = labelZOffset; @@ -143,7 +143,7 @@ public abstract class RIButton extends UIShape { shape.addVertex(minX, minY + th - ch, minZ, true); shape.closeLastOutline(); } - + public void setCorner(float corner) { if(corner > 1.0f){ this.corner = 1.0f; @@ -156,7 +156,7 @@ public abstract class RIButton extends UIShape { } dirty |= DIRTY_SHAPE; } - + public float getLabelZOffset() { return labelZOffset; } @@ -178,7 +178,7 @@ public abstract class RIButton extends UIShape { } dirty |= DIRTY_SHAPE; } - + public float[] getButtonColor() { return buttonColor; } @@ -193,21 +193,21 @@ public abstract class RIButton extends UIShape { public float[] getLabelColor() { return labelColor; } - + private UIRegion buttonRegion = null; private UIRegion labelRegion = null; private boolean toggle =false; private boolean toggleable = false; - public void render(GL2ES2 gl, RenderState rs, RegionRenderer renderer, int renderModes, int[/*1*/] texSize, boolean selection) { + public void render(GL2ES2 gl, RegionRenderer renderer, int renderModes, int[/*1*/] texSize, boolean selection) { if(null == buttonRegion) { buttonRegion = new UIRegion(this); labelRegion = new UIRegion(getLabel()); - } - + } + gl.glEnable(GL2ES2.GL_POLYGON_OFFSET_FILL); gl.glPolygonOffset(0.0f, 1f); - + float[] bColor = buttonColor; if(isPressed() || toggle){ bColor = buttonSelectedColor; @@ -215,9 +215,9 @@ public abstract class RIButton extends UIShape { if(!selection){ renderer.setColorStatic(gl, bColor[0], bColor[1], bColor[2]); } - renderer.draw(gl, buttonRegion.getRegion(gl, rs, renderModes), texSize); + renderer.draw(gl, buttonRegion.getRegion(gl, renderer, renderModes), texSize); gl.glDisable(GL2ES2.GL_POLYGON_OFFSET_FILL); - + float[] lColor = labelColor; if(isPressed() || toggle ){ lColor = labelSelectedColor; @@ -225,7 +225,7 @@ public abstract class RIButton extends UIShape { if(!selection){ renderer.setColorStatic(gl, lColor[0], lColor[1], lColor[2]); } - renderer.draw(gl, labelRegion.getRegion(gl, rs, renderModes), texSize); + renderer.draw(gl, labelRegion.getRegion(gl, renderer, renderModes), texSize); } public void setPressed(boolean b) { super.setPressed(b); @@ -233,21 +233,21 @@ public abstract class RIButton extends UIShape { toggle = !toggle; } } - + public void setLabelColor(float r, float g, float b) { this.labelColor = new float[3]; this.labelColor[0] = r; this.labelColor[1] = g; this.labelColor[2] = b; } - + public void setButtonSelectedColor(float r, float g, float b){ this.buttonSelectedColor = new float[3]; this.buttonSelectedColor[0] = r; this.buttonSelectedColor[1] = g; this.buttonSelectedColor[2] = b; } - + public void setLabelSelectedColor(float r, float g, float b){ this.labelSelectedColor = new float[3]; this.labelSelectedColor[0] = r; @@ -258,7 +258,7 @@ public abstract class RIButton extends UIShape { public boolean isToggleable() { return toggleable; } - + public void setToggleable(boolean toggleable) { this.toggleable = toggleable; } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/SceneUIController.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/SceneUIController.java index 616dd9b98..7f0254ce6 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/SceneUIController.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/SceneUIController.java @@ -169,7 +169,7 @@ public class SceneUIController implements GLEventListener{ renderer.rotate(gl, rotation[1], 0, 1, 0); renderer.rotate(gl, rotation[2], 0, 0, 1); - shapes.get(index).render(gl, rs, renderer, renderModes, texSize, select); + shapes.get(index).render(gl, renderer, renderModes, texSize, select); renderer.rotate(gl, -rotation[0], 1, 0, 0); renderer.rotate(gl, -rotation[1], 0, 1, 0); renderer.rotate(gl, -rotation[2], 0, 0, 1); diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java index 0915ea523..bfb7d8487 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java @@ -38,12 +38,12 @@ import com.jogamp.graph.curve.opengl.RegionRenderer; import com.jogamp.graph.curve.opengl.RenderState; import com.jogamp.graph.font.Font; import com.jogamp.graph.font.FontFactory; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.opengl.test.junit.graph.demos.MSAATool; import com.jogamp.opengl.test.junit.graph.demos.ui.opengl.UIRegion; public class UIGLListener01 extends UIListenerBase01 { - + public UIGLListener01 (RenderState rs, boolean debug, boolean trace) { super(RegionRenderer.create(rs, 0), debug, trace); setMatrix(-20, 00, 0f, -50); @@ -56,7 +56,7 @@ public class UIGLListener01 extends UIListenerBase01 { } public void onRelease() { } - + }; button.setPosition(2,1,0); /** Button defaults ! @@ -69,24 +69,24 @@ public class UIGLListener01 extends UIListenerBase01 { } catch (IOException ex) { System.err.println("Catched: "+ex.getMessage()); ex.printStackTrace(); - } + } } - + public void init(GLAutoDrawable drawable) { super.init(drawable); - + GL2ES2 gl = drawable.getGL().getGL2ES2(); gl.setSwapInterval(1); gl.glEnable(GL2ES2.GL_DEPTH_TEST); gl.glEnable(GL2ES2.GL_POLYGON_OFFSET_FILL); - + MSAATool.dump(drawable); } UIRegion regionButton; UIRegion regionLabel; - + public void display(GLAutoDrawable drawable) { GL2ES2 gl = drawable.getGL().getGL2ES2(); @@ -94,27 +94,26 @@ public class UIGLListener01 extends UIListenerBase01 { gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); final RegionRenderer regionRenderer = getRegionRenderer(); - final RenderState rs = regionRenderer.getRenderState(); - + regionRenderer.resetModelview(null); - + regionRenderer.translate(null, getXTran(), getYTran(), getZoom()); regionRenderer.rotate(gl, getAngle(), 0, 1, 0); - + final float[] bColor = button.getButtonColor(); - final float[] lColor = button.getLabelColor(); + final float[] lColor = button.getLabelColor(); if(null == regionButton) { regionButton = new UIRegion(button); regionLabel = new UIRegion(button.getLabel()); - } - + } + regionRenderer.setColorStatic(gl, bColor[0], bColor[1], bColor[2]); regionRenderer.translate(gl, button.getPosition()[0], button.getPosition()[1], button.getPosition()[2]); - regionRenderer.draw(gl, regionButton.getRegion(gl, rs, 0), null); + regionRenderer.draw(gl, regionButton.getRegion(gl, regionRenderer, 0), null); regionRenderer.setColorStatic(gl, lColor[0], lColor[1], lColor[2]); - regionRenderer.draw(gl, regionLabel.getRegion(gl, rs, 0), null); - } - + regionRenderer.draw(gl, regionLabel.getRegion(gl, regionRenderer, 0), null); + } + public void dispose(GLAutoDrawable drawable) { GL2ES2 gl = drawable.getGL().getGL2ES2(); if(null != regionButton) { diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UINewtDemo01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UINewtDemo01.java index 0577c5ff0..06a6f1e20 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UINewtDemo01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UINewtDemo01.java @@ -33,7 +33,7 @@ import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLProfile; import com.jogamp.graph.curve.opengl.RenderState; -import com.jogamp.graph.geom.opengl.SVertex; +import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.event.KeyAdapter; import com.jogamp.newt.event.KeyEvent; import com.jogamp.newt.event.WindowAdapter; diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIShape.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIShape.java index c38f8f75c..ff494a5ea 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIShape.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIShape.java @@ -31,7 +31,7 @@ import javax.media.opengl.GL2ES2; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.curve.opengl.RegionRenderer; -import com.jogamp.graph.curve.opengl.RenderState; +import com.jogamp.graph.curve.opengl.Renderer; import com.jogamp.graph.geom.Vertex; import com.jogamp.graph.geom.Vertex.Factory; import com.jogamp.opengl.math.geom.AABBox; @@ -39,41 +39,41 @@ import com.jogamp.opengl.math.geom.AABBox; public abstract class UIShape { private final Factory<? extends Vertex> vertexFactory; protected OutlineShape shape; - - protected static final int DIRTY_SHAPE = 1 << 0 ; + + protected static final int DIRTY_SHAPE = 1 << 0 ; protected int dirty = DIRTY_SHAPE; - + private boolean down = false; public UIShape(Factory<? extends Vertex> factory) { this.vertexFactory = factory; this.shape = new OutlineShape(factory); } - + public void clear() { - clearImpl(); + clearImpl(null, null); shape.clear(); } - - public abstract void render(GL2ES2 gl, RenderState rs, RegionRenderer renderer, int renderModes, int[/*1*/] texSize, boolean selection); - + + public abstract void render(GL2ES2 gl, RegionRenderer renderer, int renderModes, int[/*1*/] texSize, boolean selection); + protected boolean positionDirty = false; - - private float[] position = new float[]{0,0,0}; - private float[] scale = new float[]{1.0f,1.0f,1.0f}; + + private final float[] position = new float[]{0,0,0}; + private final float[] scale = new float[]{1.0f,1.0f,1.0f}; public void setScale(float x, float y, float z){ scale[0] = x; scale[1] = y; scale[2] = z; } - + public void setPosition(float x, float y, float z) { this.position[0] = x; this.position[1] = y; this.position[2] = z; positionDirty = true; } - + private void updatePosition () { float minX = shape.getBounds().getLow()[0]; float minY = shape.getBounds().getLow()[1]; @@ -83,18 +83,18 @@ public abstract class UIShape { setPosition(position[0] - minX, position[1] - minY, position[2] - minZ); positionDirty = false; } - - public float[] getScale() { return scale; } + + public float[] getScale() { return scale; } public float[] getPosition() { return position; } - - protected abstract void clearImpl(); - - protected abstract void createShape(); - + + protected abstract void clearImpl(GL2ES2 gl, Renderer renderer); + + protected abstract void createShape(Renderer renderer); + public boolean updateShape() { if( isShapeDirty() ) { shape.clear(); - createShape(); + createShape(null); if(positionDirty){ updatePosition(); } @@ -103,27 +103,27 @@ public abstract class UIShape { } return false; } - - public final Vertex.Factory<? extends Vertex> getVertexFactory() { return vertexFactory; } + + public final Vertex.Factory<? extends Vertex> getVertexFactory() { return vertexFactory; } public AABBox getBounds() { return shape.getBounds(); } - - public OutlineShape getShape() { - updateShape(); - return shape; + + public OutlineShape getShape() { + updateShape(); + return shape; } - + public boolean isShapeDirty() { return 0 != ( dirty & DIRTY_SHAPE ) ; - } - + } + public void setPressed(boolean b) { this.down = b; } - + public boolean isPressed() { return this.down; } - + public abstract void onClick(); public abstract void onPressed(); public abstract void onRelease(); diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UITextShape.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UITextShape.java index ee79d9a0b..ce9073a30 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UITextShape.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UITextShape.java @@ -27,11 +27,11 @@ */ package com.jogamp.opengl.test.junit.graph.demos.ui; -import jogamp.graph.curve.text.GlyphString; +import com.jogamp.graph.curve.opengl.GLRegion; /** * Marker interface to mark a UIShape implementation for text usage */ public interface UITextShape { - GlyphString getGlyphString(); + GLRegion getRegion(); } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/opengl/UIRegion.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/opengl/UIRegion.java index 88271095c..01e1827ab 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/opengl/UIRegion.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/opengl/UIRegion.java @@ -31,25 +31,26 @@ import javax.media.opengl.GL2ES2; import com.jogamp.graph.curve.opengl.GLRegion; import com.jogamp.graph.curve.opengl.RenderState; +import com.jogamp.graph.curve.opengl.Renderer; import com.jogamp.opengl.test.junit.graph.demos.ui.UIShape; import com.jogamp.opengl.test.junit.graph.demos.ui.UITextShape; public class UIRegion { - protected static final int DIRTY_REGION = 1 << 0 ; + protected static final int DIRTY_REGION = 1 << 0 ; protected int dirty = DIRTY_REGION; - - private UIShape uiShape; + + private final UIShape uiShape; private GLRegion region; - + public UIRegion(UIShape uis) { this.uiShape = uis; } - - public boolean updateRegion(GL2ES2 gl, RenderState rs, int renderModes) { + + public boolean updateRegion(GL2ES2 gl, Renderer renderer, int renderModes) { if( uiShape.updateShape() || isRegionDirty() ) { - destroy(gl, rs); + destroy(gl, renderer.getRenderState()); if(uiShape instanceof UITextShape) { - region = ((UITextShape)uiShape).getGlyphString().createRegion(gl, renderModes); + region = ((UITextShape)uiShape).getRegion(); } else { region = GLRegion.create(uiShape.getShape(), renderModes); } @@ -58,20 +59,20 @@ public class UIRegion { } return false; } - - public GLRegion getRegion(GL2ES2 gl, RenderState rs, int renderModes) { - updateRegion(gl, rs, renderModes); - return region; + + public GLRegion getRegion(GL2ES2 gl, Renderer renderer, int renderModes) { + updateRegion(gl, renderer, renderModes); + return region; } - + public boolean isRegionDirty() { return 0 != ( dirty & DIRTY_REGION ) ; } - + public void destroy(GL2ES2 gl, RenderState rs) { if(null != region) { region.destroy(gl, rs); region = null; - } + } } } |