From b935d5248aef79e2386a284b32f5888348a382d6 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Tue, 1 Apr 2014 16:31:05 +0200 Subject: Bug 801: WIP 1/2 - Add color attribute; Switch Shader instead of branching in shader; Update attributes and uniforms manually, drop ShaderState; - ShaderCode - add int insertShaderSource(int shaderIdx, int position, Class context, String path) - insertShaderSource(..): pos==-1 -> append code - VectorUtil - add isVec3InTriangle3(..., float epsilon) - add testSeg2SegIntersection(..., float epsilon) - add testTri2SegIntersection(..., float epsilon) - AffineTransform: Return result for chaining - Font - Add pixel precise 'getPointsBounds(final AffineTransform transform, CharSequence string, float pixelSize)' - Rename getString*() -> getMetric*() - OTGlyph: Release _points field, no more used - - Graph Triangulation - Count additional vertices in: Triangulator, CDTriangulator2D - OutlineShape: - Allow skipping of 'transformOutlines2Quadratic', i.e. allow tagging OutlineShape to be quadratic_nurbs via 'setIsQuadraticNurbs()' - Clarify cleanup ot outlines in same method 'cleanupOutlines()' - Count additional vertices .. - Graph Shader: - Start splitting and segmenting shader code for: - pass1 / pass2 - features, i.e. sampleCont, color-channel, .. --- .../test/junit/graph/TestRegionRendererNEWT01.java | 15 +- .../test/junit/graph/TestTextRendererNEWT00.java | 9 +- .../test/junit/graph/TestTextRendererNEWT01.java | 11 +- .../test/junit/graph/TestTextRendererNEWT10.java | 15 +- .../test/junit/graph/TextRendererGLELBase.java | 28 ++-- .../junit/graph/demos/GPURegionGLListener01.java | 14 +- .../junit/graph/demos/GPURegionGLListener02.java | 14 +- .../test/junit/graph/demos/GPURegionNewtDemo.java | 5 +- .../graph/demos/GPURendererListenerBase01.java | 12 +- .../junit/graph/demos/GPUTextGLListener0A.java | 8 +- .../test/junit/graph/demos/GPUTextNewtDemo.java | 3 +- .../graph/demos/GPUTextRendererListenerBase01.java | 40 ++--- .../junit/graph/demos/GPUUISceneGLListener0A.java | 49 ++++-- .../test/junit/graph/demos/GPUUISceneNewtDemo.java | 5 +- .../test/junit/graph/demos/ui/CrossHair.java | 9 +- .../opengl/test/junit/graph/demos/ui/Label.java | 14 +- .../opengl/test/junit/graph/demos/ui/Label0.java | 102 ++++++++++++ .../opengl/test/junit/graph/demos/ui/RIButton.java | 72 ++++----- .../junit/graph/demos/ui/SceneUIController.java | 20 ++- .../test/junit/graph/demos/ui/UIGLListener01.java | 3 +- .../junit/graph/demos/ui/UIListenerBase01.java | 6 +- .../test/junit/graph/demos/ui/UINewtDemo01.java | 3 +- .../opengl/test/junit/graph/demos/ui/UIShape.java | 178 +++++++++------------ 23 files changed, 348 insertions(+), 287 deletions(-) create mode 100644 src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label0.java (limited to 'src/test/com/jogamp') 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 55a043a14..fd1486995 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TestRegionRendererNEWT01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TestRegionRendererNEWT01.java @@ -50,7 +50,6 @@ import com.jogamp.opengl.test.junit.graph.demos.GPURegionGLListener01; import com.jogamp.opengl.test.junit.graph.demos.GPURegionGLListener02; import com.jogamp.opengl.test.junit.graph.demos.GPURendererListenerBase01; import com.jogamp.opengl.test.junit.util.UITestCase; -import com.jogamp.opengl.util.glsl.ShaderState; @FixMethodOrder(MethodSorters.NAME_ASCENDING) @@ -88,7 +87,7 @@ public class TestRegionRendererNEWT01 extends UITestCase { caps.setAlphaBits(4); GLWindow window = createWindow("shape-vbaa0-msaa0", caps, 800, 400); - RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + RenderState rs = RenderState.createRenderState(SVertex.factory()); GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, 0, 0, false, false); demo01Listener.attachInputListenerTo(window); @@ -122,9 +121,9 @@ public class TestRegionRendererNEWT01 extends UITestCase { caps.setAlphaBits(4); GLWindow window = createWindow("shape-vbaa0-msaa0", caps, 800, 400); - RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + RenderState rs = RenderState.createRenderState(SVertex.factory()); - GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, Region.VARIABLE_CURVE_WEIGHT_BIT, 0, false, false); + GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, Region.VARWEIGHT_RENDERING_BIT, 0, false, false); demo01Listener.attachInputListenerTo(window); window.addGLEventListener(demo01Listener); @@ -153,7 +152,7 @@ public class TestRegionRendererNEWT01 extends UITestCase { caps.setNumSamples(4); GLWindow window = createWindow("shape-vbaa0-msaa1", caps, 800, 400); - RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + RenderState rs = RenderState.createRenderState(SVertex.factory()); GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, 0, 0, false, false); demo01Listener.attachInputListenerTo(window); @@ -189,9 +188,9 @@ public class TestRegionRendererNEWT01 extends UITestCase { caps.setNumSamples(4); GLWindow window = createWindow("shape-vbaa0-msaa1", caps, 800, 400); - RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + RenderState rs = RenderState.createRenderState(SVertex.factory()); - GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, Region.VARIABLE_CURVE_WEIGHT_BIT, 0, false, false); + GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, Region.VARWEIGHT_RENDERING_BIT, 0, false, false); demo01Listener.attachInputListenerTo(window); window.addGLEventListener(demo01Listener); @@ -224,7 +223,7 @@ public class TestRegionRendererNEWT01 extends UITestCase { caps.setAlphaBits(4); GLWindow window = createWindow("shape-vbaa1-msaa0", caps, 800,400); - RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + RenderState rs = RenderState.createRenderState(SVertex.factory()); GPURegionGLListener02 demo02Listener = new GPURegionGLListener02 (rs, Region.VBAA_RENDERING_BIT, 4, false, false); demo02Listener.attachInputListenerTo(window); window.addGLEventListener(demo02Listener); 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 d00e1c5ee..b5d52739e 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java @@ -60,7 +60,6 @@ import com.jogamp.opengl.test.junit.util.MiscUtils; 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; @FixMethodOrder(MethodSorters.NAME_ASCENDING) @@ -210,7 +209,7 @@ public class TestTextRendererNEWT00 extends UITestCase { UITestCase.waitForKey("Start"); } - final RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + final RenderState rs = RenderState.createRenderState(SVertex.factory()); final int rendererMode, sampleCount; if( graphVBAASamples > 0 ) { rendererMode = Region.VBAA_RENDERING_BIT; @@ -381,9 +380,11 @@ public class TestTextRendererNEWT00 extends UITestCase { lfps, tfps, gl.getSwapInterval(), (t1-t0)/1000.0, fontSizeAnim, drawable.getChosenGLCapabilities().getNumSamples(), modeS, vbaaSampleCount[0]); - if( false ) { + if( true ) { // renderString(drawable, font, pixelSize, "I - / H P 7 0", 0, 0, 0, 0, -1000f, true); - renderString(drawable, font, pixelSize, "A M > } ] ", 0, 0, 0, 0, -1000f, true); + // renderString(drawable, font, pixelSize, "A M > } ] ", 0, 0, 0, 0, -1000f, true); + renderString(drawable, font, pixelSize, "M", 0, 0, 0, 0, -1000f, true); + // renderString(drawable, font, pixelSize, "0 6 9 a b O Q A M > } ] ", 0, 0, 0, 0, -1000f, true); // renderString(drawable, font, pixelSize, "012345678901234567890123456789", 0, 0, 0, -1000, true); // renderString(drawable, font, pixelSize, textX2, 0, 0, 0, 0, -1000f, true); // renderString(drawable, font, pixelSize, text1, 0, 0, 0, -1000f, regionFPS); // no-cache 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 8121fc03f..c1c1dc18e 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT01.java @@ -51,7 +51,6 @@ 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; -import com.jogamp.opengl.util.glsl.ShaderState; @FixMethodOrder(MethodSorters.NAME_ASCENDING) @@ -120,7 +119,7 @@ public class TestTextRendererNEWT01 extends UITestCase { window.display(); System.err.println("Chosen: "+window.getChosenGLCapabilities()); - RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + RenderState rs = RenderState.createRenderState(SVertex.factory()); TextGLListener textGLListener = new TextGLListener(rs, Region.VBAA_RENDERING_BIT, DEBUG, TRACE); textGLListener.attachInputListenerTo(window); window.addGLEventListener(textGLListener); @@ -169,7 +168,7 @@ public class TestTextRendererNEWT01 extends UITestCase { window.display(); System.err.println("Chosen: "+window.getChosenGLCapabilities()); - RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + RenderState rs = RenderState.createRenderState(SVertex.factory()); TextGLListener textGLListener = new TextGLListener(rs, 0, DEBUG, TRACE); textGLListener.attachInputListenerTo(window); window.addGLEventListener(textGLListener); @@ -227,10 +226,8 @@ public class TestTextRendererNEWT01 extends UITestCase { gl.setSwapInterval(1); gl.glEnable(GL.GL_DEPTH_TEST); - final RegionRenderer renderer = getRenderer(); - - renderer.setAlpha(gl, 1.0f); - renderer.setColorStatic(gl, 0.1f, 0.1f, 0.1f); + final RenderState rs = getRenderer().getRenderState(); + rs.setColorStatic(0.1f, 0.1f, 0.1f, 1.0f); } public void display(GLAutoDrawable 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 a23a50db7..ebb897484 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java @@ -52,7 +52,6 @@ import com.jogamp.opengl.math.geom.AABBox; import com.jogamp.opengl.test.junit.util.NEWTGLContext; import com.jogamp.opengl.test.junit.util.UITestCase; import com.jogamp.opengl.util.PMVMatrix; -import com.jogamp.opengl.util.glsl.ShaderState; @FixMethodOrder(MethodSorters.NAME_ASCENDING) @@ -140,21 +139,20 @@ public class TestTextRendererNEWT10 extends UITestCase { System.err.println("Chosen: "+winctx.window.getChosenCapabilities()); - final RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + final RenderState rs = RenderState.createRenderState(SVertex.factory()); final RegionRenderer renderer = RegionRenderer.create(rs, 0, RegionRenderer.defaultBlendEnable, RegionRenderer.defaultBlendDisable); final TextRegionUtil textRenderUtil = new TextRegionUtil(renderer); // init gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); renderer.init(gl); - renderer.setAlpha(gl, 1.0f); - renderer.setColorStatic(gl, 0.1f, 0.1f, 0.1f); + rs.setColorStatic(0.1f, 0.1f, 0.1f, 1.0f); // reshape 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); + renderer.reshapeOrtho(drawable.getWidth(), drawable.getHeight(), 0.1f, 1000.0f); // display gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); @@ -189,16 +187,15 @@ public class TestTextRendererNEWT10 extends UITestCase { if(0>row) { row = lastRow + 1; } - AABBox textBox = font.getStringBounds(text, fontSize); + AABBox textBox = font.getMetricBounds(text, fontSize); dx += font.getAdvanceWidth('X', fontSize) * column; dy -= (int)textBox.getHeight() * ( row + 1 ); - final PMVMatrix pmv = textRenderUtil.renderer.getMatrix(); + final PMVMatrix pmv = textRenderUtil.renderer.getMatrixMutable(); pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); pmv.glLoadIdentity(); pmv.glTranslatef(dx, dy, z0); - textRenderUtil.renderer.updateMatrix(gl); - textRenderUtil.drawString3D(gl, font, fontSize, text, texSize); + textRenderUtil.drawString3D(gl, font, fontSize, text, null, 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 4b89a85fb..fb4d0baf4 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TextRendererGLELBase.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TextRendererGLELBase.java @@ -44,7 +44,6 @@ import com.jogamp.graph.font.FontSet; import com.jogamp.graph.geom.SVertex; import com.jogamp.newt.Window; import com.jogamp.opengl.util.PMVMatrix; -import com.jogamp.opengl.util.glsl.ShaderState; public abstract class TextRendererGLELBase implements GLEventListener { public final int usrRenderModes; @@ -134,16 +133,14 @@ public abstract class TextRendererGLELBase implements GLEventListener { public void init(GLAutoDrawable drawable) { if( null == this.rs ) { exclusivePMVMatrix = null == sharedPMVMatrix; - this.rs = RenderState.createRenderState(new ShaderState(), SVertex.factory(), sharedPMVMatrix); + this.rs = RenderState.createRenderState(SVertex.factory(), sharedPMVMatrix); } this.renderer = RegionRenderer.create(rs, usrRenderModes, enableCallback, disableCallback); this.textRenderUtil = new TextRegionUtil(renderer); final GL2ES2 gl = drawable.getGL().getGL2ES2(); renderer.init(gl); - renderer.setAlpha(gl, staticRGBAColor[3]); - renderer.setColorStatic(gl, staticRGBAColor[0], staticRGBAColor[1], staticRGBAColor[2]); - final ShaderState st = rs.getShaderState(); - st.useProgram(gl, false); + rs.setColorStatic(staticRGBAColor[0], staticRGBAColor[1], staticRGBAColor[2], staticRGBAColor[3]); + renderer.enable(gl, false); final Object upObj = drawable.getUpstreamWidget(); if( upObj instanceof Window ) { @@ -157,16 +154,15 @@ public abstract class TextRendererGLELBase implements GLEventListener { public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { if( null != renderer ) { final GL2ES2 gl = drawable.getGL().getGL2ES2(); - final ShaderState st = rs.getShaderState(); - st.useProgram(gl, true); + renderer.enable(gl, true); if( exclusivePMVMatrix ) { // renderer.reshapePerspective(gl, 45.0f, width, height, 0.1f, 1000.0f); - renderer.reshapeOrtho(gl, width, height, 0.1f, 1000.0f); + renderer.reshapeOrtho(width, height, 0.1f, 1000.0f); pixelScale = 1.0f; } else { - renderer.reshapeNotify(gl, width, height); + renderer.reshapeNotify(width, height); } - st.useProgram(gl, false); + renderer.enable(gl, false); } } @@ -257,7 +253,7 @@ public abstract class TextRendererGLELBase implements GLEventListener { dx += pixelScale * font.getAdvanceWidth('X', pixelSize) * column; dy -= pixelScale * lineHeight * ( row + 1 ); - final PMVMatrix pmvMatrix = rs.pmvMatrix(); + final PMVMatrix pmvMatrix = rs.getMatrixMutable(); pmvMatrix.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); if( !exclusivePMVMatrix ) { pmvMatrix.glPushMatrix(); @@ -271,17 +267,17 @@ public abstract class TextRendererGLELBase implements GLEventListener { pmvMatrix.glScalef(pixelScale, pixelScale, 1f); } renderer.enable(gl, true); - renderer.updateMatrix(gl); if( cacheRegion ) { - textRenderUtil.drawString3D(gl, font, pixelSize, text, vbaaSampleCount); + textRenderUtil.drawString3D(gl, font, pixelSize, text, null, vbaaSampleCount); } else if( null != region ) { - TextRegionUtil.drawString3D(region, renderer, gl, font, pixelSize, text, vbaaSampleCount); + TextRegionUtil.drawString3D(region, renderer, gl, font, pixelSize, text, null, vbaaSampleCount); } else { - TextRegionUtil.drawString3D(renderer, gl, font, pixelSize, text, vbaaSampleCount); + TextRegionUtil.drawString3D(renderer, gl, font, pixelSize, text, null, vbaaSampleCount); } renderer.enable(gl, false); if( !exclusivePMVMatrix ) { + rs.setMatrixDirty(); pmvMatrix.glPopMatrix(); } lastRow = row + newLineCount; diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener01.java index f14da399e..b5ac6cdaa 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener01.java @@ -91,7 +91,7 @@ public class GPURegionGLListener01 extends GPURendererListenerBase01 { outlineShape.closeLastOutline(true); region = GLRegion.create(getRenderModes()); - region.addOutlineShape(outlineShape, null); + region.addOutlineShape(outlineShape, null, region.hasColorChannel() ? getRenderer().getRenderState().getColorStatic(new float[4]) : null); } public void init(GLAutoDrawable drawable) { @@ -99,13 +99,12 @@ public class GPURegionGLListener01 extends GPURendererListenerBase01 { GL2ES2 gl = drawable.getGL().getGL2ES2(); - final RegionRenderer regionRenderer = getRenderer(); + final RenderState rs = getRenderer().getRenderState(); gl.setSwapInterval(1); gl.glEnable(GL2ES2.GL_DEPTH_TEST); gl.glEnable(GL2ES2.GL_BLEND); - regionRenderer.setAlpha(gl, 1.0f); - regionRenderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); + rs.setColorStatic(0.0f, 0.0f, 0.0f, 1.0f); createTestOutline(); } @@ -117,14 +116,13 @@ public class GPURegionGLListener01 extends GPURendererListenerBase01 { gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); final RegionRenderer regionRenderer = getRenderer(); - final PMVMatrix pmv = regionRenderer.getMatrix(); + final PMVMatrix pmv = regionRenderer.getMatrixMutable(); pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); pmv.glLoadIdentity(); pmv.glTranslatef(getXTran(), getYTran(), getZTran()); pmv.glRotatef(getAngle(), 0, 1, 0); - regionRenderer.updateMatrix(gl); - if( weight != regionRenderer.getWeight()) { - regionRenderer.setWeight(gl, weight); + if( weight != regionRenderer.getRenderState().getWeight() ) { + regionRenderer.getRenderState().setWeight(weight); } region.draw(gl, regionRenderer, getSampleCount()); } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener02.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener02.java index 23ccef640..d9e962ea6 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener02.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener02.java @@ -93,7 +93,7 @@ public class GPURegionGLListener02 extends GPURendererListenerBase01 { shape.closeLastOutline(true); region = GLRegion.create(getRenderModes()); - region.addOutlineShapes(outlineShapes, null); + region.addOutlineShapes(outlineShapes, null, null); } public void init(GLAutoDrawable drawable) { @@ -101,13 +101,12 @@ public class GPURegionGLListener02 extends GPURendererListenerBase01 { GL2ES2 gl = drawable.getGL().getGL2ES2(); - final RegionRenderer regionRenderer = getRenderer(); + final RenderState rs = getRenderer().getRenderState(); gl.setSwapInterval(1); gl.glEnable(GL2ES2.GL_DEPTH_TEST); gl.glEnable(GL2ES2.GL_BLEND); - regionRenderer.setAlpha(gl, 1.0f); - regionRenderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); + rs.setColorStatic(0.0f, 0.0f, 0.0f, 1.0f); createTestOutline(); } @@ -120,14 +119,13 @@ public class GPURegionGLListener02 extends GPURendererListenerBase01 { final RegionRenderer regionRenderer = getRenderer(); - final PMVMatrix pmv = regionRenderer.getMatrix(); + final PMVMatrix pmv = regionRenderer.getMatrixMutable(); pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); pmv.glLoadIdentity(); pmv.glTranslatef(getXTran(), getYTran(), getZTran()); pmv.glRotatef(getAngle(), 0, 1, 0); - regionRenderer.updateMatrix(gl); - if( weight != regionRenderer.getWeight()) { - regionRenderer.setWeight(gl, weight); + if( weight != regionRenderer.getRenderState().getWeight() ) { + regionRenderer.getRenderState().setWeight(weight); } region.draw(gl, regionRenderer, getSampleCount()); diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo.java index 7bcbe0484..7897d0a00 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo.java @@ -41,7 +41,6 @@ import com.jogamp.newt.event.WindowEvent; import com.jogamp.newt.opengl.GLWindow; import com.jogamp.opengl.test.junit.util.MiscUtils; import com.jogamp.opengl.util.Animator; -import com.jogamp.opengl.util.glsl.ShaderState; /** Demonstrate the rendering of multiple outlines into one region/OutlineShape * These Outlines are not necessary connected or contained. @@ -97,7 +96,7 @@ public class GPURegionNewtDemo { } System.out.println("Requested: " + caps); - int rmode = GraphUseWeight ? Region.VARIABLE_CURVE_WEIGHT_BIT : 0; + int rmode = GraphUseWeight ? Region.VARWEIGHT_RENDERING_BIT : 0; int sampleCount = 0; if( GraphVBAASamples > 0 ) { rmode |= Region.VBAA_RENDERING_BIT; @@ -112,7 +111,7 @@ public class GPURegionNewtDemo { window.setSize(800, 400); window.setTitle("GPU Curve Region Newt Demo - graph[vbaa"+GraphVBAASamples+" msaa"+GraphMSAASamples+"], msaa "+SceneMSAASamples); - RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + RenderState rs = RenderState.createRenderState(SVertex.factory()); GPURegionGLListener01 regionGLListener = new GPURegionGLListener01 (rs, rmode, sampleCount, DEBUG, TRACE); regionGLListener.attachInputListenerTo(window); window.addGLEventListener(regionGLListener); 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 30c6bdea5..65ed86947 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 @@ -46,6 +46,7 @@ import javax.media.opengl.fixedfunc.GLMatrixFunc; import com.jogamp.graph.curve.Region; import com.jogamp.graph.curve.opengl.GLRegion; import com.jogamp.graph.curve.opengl.RegionRenderer; +import com.jogamp.graph.curve.opengl.RenderState; import com.jogamp.newt.event.KeyEvent; import com.jogamp.newt.event.KeyListener; import com.jogamp.newt.opengl.GLWindow; @@ -145,13 +146,10 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { @Override public void reshape(GLAutoDrawable drawable, int xstart, int ystart, int width, int height) { - GL2ES2 gl = drawable.getGL().getGL2ES2(); - - final PMVMatrix pmv = renderer.getMatrix(); - renderer.reshapePerspective(null, 45.0f, width, height, zNear, zFar); + final PMVMatrix pmv = renderer.getMatrixMutable(); + renderer.reshapePerspective(45.0f, width, height, zNear, zFar); pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); pmv.glLoadIdentity(); - renderer.updateMatrix(gl); System.err.printf("Reshape: zNear %f, zFar %f%n", zNear, zFar); System.err.printf("Reshape: Frustum: %s%n", pmv.glGetFrustum()); { @@ -207,7 +205,7 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { dumpMatrix(); } public void editGlobalWeight(float delta) { - if( !RegionRenderer.isWeightValid(weight+delta) ) { + if( !RenderState.isWeightValid(weight+delta) ) { return; } weight += delta; @@ -328,7 +326,7 @@ public abstract class GPURendererListenerBase01 implements GLEventListener { public boolean run(GLAutoDrawable drawable) { try { final String modeS = Region.getRenderModeString(renderer.getRenderModes()); - final String type = modeS + ( Region.isNonUniformWeight(renderModes) ? "-vc" : "-uc" ) ; + final String type = modeS + ( Region.hasVariableWeight(renderModes) ? "-vc" : "-uc" ) ; printScreen(drawable, "./", "demo-"+type, "snap"+screenshot_num, false); screenshot_num++; } catch (GLException e) { 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 a484c08ef..08d2f0d70 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 @@ -36,12 +36,11 @@ import com.jogamp.graph.curve.opengl.RenderState; import com.jogamp.graph.curve.opengl.RegionRenderer; 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() { - super(RenderState.createRenderState(new ShaderState(), SVertex.factory()), Region.VBAA_RENDERING_BIT, 4, true, false, false); + super(RenderState.createRenderState(SVertex.factory()), Region.VBAA_RENDERING_BIT, 4, true, false, false); } public GPUTextGLListener0A(RenderState rs, int renderModes, int sampleCount, boolean blending, boolean debug, boolean trace) { @@ -57,13 +56,12 @@ public class GPUTextGLListener0A extends GPUTextRendererListenerBase01 { GL2ES2 gl = drawable.getGL().getGL2ES2(); - final RegionRenderer renderer = getRenderer(); + final RenderState rs = getRenderer().getRenderState(); gl.setSwapInterval(1); gl.glEnable(GL2ES2.GL_DEPTH_TEST); gl.glEnable(GL2ES2.GL_BLEND); - renderer.setAlpha(gl, 1.0f); - renderer.setColorStatic(gl, 0.1f, 0.1f, 0.1f); + rs.setColorStatic(0.1f, 0.1f, 0.1f, 1.0f); } public void dispose(GLAutoDrawable drawable) { diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo.java index f63b9b70a..e6b1f9c9c 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo.java @@ -40,7 +40,6 @@ import com.jogamp.newt.event.WindowEvent; import com.jogamp.newt.opengl.GLWindow; import com.jogamp.opengl.test.junit.util.MiscUtils; import com.jogamp.opengl.util.Animator; -import com.jogamp.opengl.util.glsl.ShaderState; public class GPUTextNewtDemo { /** @@ -110,7 +109,7 @@ public class GPUTextNewtDemo { window.setSize(800, 400); window.setTitle("GPU Text Newt Demo - graph[vbaa"+GraphVBAASamples+" msaa"+GraphMSAASamples+"], msaa "+SceneMSAASamples); - RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + RenderState rs = RenderState.createRenderState(SVertex.factory()); GPUTextGLListener0A textGLListener = new GPUTextGLListener0A(rs, rmode, sampleCount, true, DEBUG, TRACE); // ((TextRenderer)textGLListener.getRenderer()).setCacheLimit(32); window.addGLEventListener(textGLListener); 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 f187dcc6b..7372eb8f6 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 @@ -156,7 +156,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB headtext = text1; } if(null != headtext) { - headbox = font.getStringBounds(headtext, font.getPixelSize(fontSizeHead, dpiH)); + headbox = font.getMetricBounds(headtext, font.getPixelSize(fontSizeHead, dpiH)); } } @@ -169,7 +169,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB ((Window)upObj).getMainMonitor().getPixelsPerMM(pixelsPerMM); dpiH = pixelsPerMM[1]*25.4f; } - fontNameBox = font.getStringBounds(fontName, font.getPixelSize(fontSizeFName, dpiH)); + fontNameBox = font.getMetricBounds(fontName, font.getPixelSize(fontSizeFName, dpiH)); switchHeadBox(); } @@ -213,10 +213,11 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB // final int[] view = new int[] { 0, 0, drawable.getWidth(), drawable.getHeight() }; final RegionRenderer renderer = getRenderer(); - final PMVMatrix pmv = renderer.getMatrix(); + final RenderState rs = renderer.getRenderState(); + final PMVMatrix pmv = renderer.getMatrixMutable(); pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); pmv.glLoadIdentity(); - renderer.setColorStatic(gl, 0.1f, 0.1f, 0.1f); + rs.setColorStatic(0.1f, 0.1f, 0.1f, 1.0f); if( renderer.getRenderState().isHintMaskSet(RenderState.BITHINT_BLENDING_ENABLED) ) { gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); } @@ -245,45 +246,44 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB // bottom, half line up pmv.glTranslatef(nearPlaneX0, nearPlaneY0+(nearPlaneS * pixelSizeFPS / 2f), nearPlaneZ0); - renderer.updateMatrix(gl); // No cache, keep region alive! - TextRegionUtil.drawString3D(regionFPS, renderer, gl, font, nearPlaneS * pixelSizeFPS, text, sampleCountFPS); + TextRegionUtil.drawString3D(regionFPS, renderer, gl, font, nearPlaneS * pixelSizeFPS, text, null, sampleCountFPS); } float dx = width-fontNameBox.getWidth()-2f; float dy = height - 10f; + renderer.setMatrixDirty(); pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); pmv.glLoadIdentity(); pmv.glTranslatef(nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy), nearPlaneZ0); - renderer.updateMatrix(gl); // System.err.printf("FontN: [%f %f] -> [%f %f]%n", dx, dy, nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy)); - textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeFName, fontName, getSampleCount()); + textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeFName, fontName, null, getSampleCount()); dx = 10f; dy += -fontNameBox.getHeight() - 10f; if(null != headtext) { + renderer.setMatrixDirty(); pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); pmv.glLoadIdentity(); // System.err.printf("Head: [%f %f] -> [%f %f]%n", dx, dy, nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy)); pmv.glTranslatef(nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy), nearPlaneZ0); // pmv.glTranslatef(x0, y1, z0); - renderer.updateMatrix(gl); - textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeHead, headtext, getSampleCount()); + textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeHead, headtext, null, getSampleCount()); } dy += -headbox.getHeight() - font.getLineHeight(pixelSizeBottom); + renderer.setMatrixDirty(); pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); pmv.glLoadIdentity(); pmv.glTranslatef(nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy), nearPlaneZ0); // System.err.printf("Bottom: [%f %f] -> [%f %f]%n", dx, dy, nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy)); pmv.glTranslatef(getXTran(), getYTran(), getZTran()); pmv.glRotatef(getAngle(), 0, 1, 0); - renderer.updateMatrix(gl); - renderer.setColorStatic(gl, 0.9f, 0.0f, 0.0f); + rs.setColorStatic(0.9f, 0.0f, 0.0f, 1.0f); if( renderer.getRenderState().isHintMaskSet(RenderState.BITHINT_BLENDING_ENABLED) ) { gl.glClearColor(1.0f, 0.0f, 0.0f, 0.0f); } @@ -293,15 +293,15 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB } if(!userInput) { if( bottomTextUseFrustum ) { - TextRegionUtil.drawString3D(regionBottom, renderer, gl, font, nearPlaneS * pixelSizeBottom, text2, getSampleCount()); + TextRegionUtil.drawString3D(regionBottom, renderer, gl, font, nearPlaneS * pixelSizeBottom, text2, null, getSampleCount()); } else { - textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeBottom, text2, getSampleCount()); + textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeBottom, text2, null, getSampleCount()); } } else { if( bottomTextUseFrustum ) { - TextRegionUtil.drawString3D(regionBottom, renderer, gl, font, nearPlaneS * pixelSizeBottom, userString.toString(), getSampleCount()); + TextRegionUtil.drawString3D(regionBottom, renderer, gl, font, nearPlaneS * pixelSizeBottom, userString.toString(), null, getSampleCount()); } else { - textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeBottom, userString.toString(), getSampleCount()); + textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeBottom, userString.toString(), null, getSampleCount()); } } } @@ -315,7 +315,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB public void fontHeadIncr(int v) { fontSizeHead = Math.abs((fontSizeHead + v) % fontSizeModulo) ; if(null != headtext) { - headbox = font.getStringBounds(headtext, font.getPixelSize(fontSizeHead, dpiH)); + headbox = font.getMetricBounds(headtext, font.getPixelSize(fontSizeHead, dpiH)); } } @@ -327,7 +327,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB fontSet = set; font = _font; fontName = font.getFullFamilyName(null).toString(); - fontNameBox = font.getStringBounds(fontName, font.getPixelSize(fontSizeFName, dpiH)); + fontNameBox = font.getMetricBounds(fontName, font.getPixelSize(fontSizeFName, dpiH)); dumpFontNames(); return true; } @@ -344,7 +344,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB fontSet = set; font = _font; fontName = font.getFullFamilyName(null).toString(); - fontNameBox = font.getStringBounds(fontName, font.getPixelSize(fontSizeFName, dpiH)); + fontNameBox = font.getMetricBounds(fontName, font.getPixelSize(fontSizeFName, dpiH)); dumpFontNames(); return true; } @@ -359,7 +359,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB void dumpMatrix(boolean bbox) { System.err.println("Matrix: " + getXTran() + "/" + getYTran() + " x"+getZTran() + " @"+getAngle() +" fontSize "+fontSizeBottom); if(bbox) { - System.err.println("bbox: "+font.getStringBounds(text2, nearPlaneS * font.getPixelSize(fontSizeBottom, dpiH))); + System.err.println("bbox: "+font.getMetricBounds(text2, nearPlaneS * font.getPixelSize(fontSizeBottom, dpiH))); } } 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 f9becfaed..b3b17375d 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 @@ -33,7 +33,6 @@ import com.jogamp.opengl.test.junit.graph.demos.ui.RIButton; import com.jogamp.opengl.test.junit.graph.demos.ui.SceneUIController; import com.jogamp.opengl.test.junit.graph.demos.ui.UIShape; import com.jogamp.opengl.util.GLReadBufferUtil; -import com.jogamp.opengl.util.glsl.ShaderState; public class GPUUISceneGLListener0A implements GLEventListener { @@ -87,12 +86,12 @@ public class GPUUISceneGLListener0A implements GLEventListener { } public GPUUISceneGLListener0A(int renderModes) { - this(RenderState.createRenderState(new ShaderState(), SVertex.factory()), renderModes, false, false); + this(RenderState.createRenderState(SVertex.factory()), renderModes, false, false); } public GPUUISceneGLListener0A(RenderState rs, int renderModes, boolean debug, boolean trace) { this.rs = rs; - this.renderModes = renderModes; + this.renderModes = renderModes | Region.COLORCHANNEL_RENDERING_BIT; this.debug = debug; this.trace = trace; @@ -261,14 +260,41 @@ public class GPUUISceneGLListener0A implements GLEventListener { } } ); button.addMouseListener(dragZoomRotateListener); buttons.add(button); + + button = new RIButton(SVertex.factory(), font, "< quality >", buttonXSize, buttonYSize); + button.translate(xstart,ystart - diffY*buttons.size(), 0f); + button.setLabelColor(1.0f, 1.0f, 1.0f); + button.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + final Object attachment = e.getAttachment(); + if( attachment instanceof UIShape.EventDetails ) { + final UIShape.EventDetails shapeEvent = (UIShape.EventDetails)attachment; + int quality = shapeEvent.shape.getQuality(); + + if( shapeEvent.rotPosition[0] < shapeEvent.rotBounds.getCenter()[0] ) { + // left-half pressed + if( quality > 0 ) { + quality=0; + } + } else { + // right-half pressed + if( quality < 1 ) { + quality=1; + } + } + sceneUIController.setAllShapesQuality(quality); + } + } } ); + button.addMouseListener(dragZoomRotateListener); + buttons.add(button); } button = new RIButton(SVertex.factory(), font, "Quit", buttonXSize, buttonYSize); button.translate(xstart,ystart - diffY*buttons.size(), 0f); - button.setColor(0.8f, 0.0f, 0.0f); + button.setColor(0.8f, 0.0f, 0.0f, 1.0f); button.setLabelColor(1.0f, 1.0f, 1.0f); - button.setSelectedColor(0.8f, 0.8f, 0.8f); - button.setLabelSelectedColor(0.8f, 0.0f, 0.0f); + button.setSelectedColorMod(0.8f, 0.8f, 0.8f, 1.0f); button.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -511,7 +537,6 @@ public class GPUUISceneGLListener0A implements GLEventListener { gl.glEnable(GL2ES2.GL_BLEND); renderer.init(gl); - renderer.setAlpha(gl, 1.0f); initTexts(); @@ -529,7 +554,7 @@ public class GPUUISceneGLListener0A implements GLEventListener { sceneUIController.addShape(truePtSizeLabel); truePtSizeLabel.setEnabled(enableOthers); truePtSizeLabel.translate(0, - 1.5f * jogampLabel.getLineHeight(), 0f); - truePtSizeLabel.setColor(0.1f, 0.1f, 0.1f); + truePtSizeLabel.setColor(0.1f, 0.1f, 0.1f, 1.0f); /** * @@ -541,7 +566,7 @@ public class GPUUISceneGLListener0A implements GLEventListener { fpsLabel.addMouseListener(dragZoomRotateListener); sceneUIController.addShape(fpsLabel); fpsLabel.setEnabled(enableOthers); - fpsLabel.setColor(0.3f, 0.3f, 0.3f); + fpsLabel.setColor(0.3f, 0.3f, 0.3f, 1.0f); crossHairCtr = new CrossHair(renderer.getRenderState().getVertexFactory(), 100f, 100f, 2f); crossHairCtr.addMouseListener(dragZoomRotateListener); @@ -603,7 +628,7 @@ public class GPUUISceneGLListener0A implements GLEventListener { final float dyTop = drawable.getHeight() * relTop; final float dxRight = drawable.getWidth() * relRight; labels[currentText] = new Label(SVertex.factory(), font, pixelSizeFixed, strings[currentText]); - labels[currentText].setColor(0.1f, 0.1f, 0.1f); + labels[currentText].setColor(0.1f, 0.1f, 0.1f, 1.0f); labels[currentText].setEnabled(enableOthers); labels[currentText].translate(dxRight, dyTop - 1.5f * jogampLabel.getLineHeight() @@ -627,8 +652,8 @@ public class GPUUISceneGLListener0A implements GLEventListener { final String text; if( null == actionText ) { final String timePrec = gl.isGLES() ? "4.0" : "4.1"; - text = String.format("%03.1f/%03.1f fps, v-sync %d, fontSize %.1f, %s-samples %d, td %"+timePrec+"f, blend %b, alpha-bits %d, msaa-bits %d", - lfps, tfps, gl.getSwapInterval(), fontSizeFixedPVP, modeS, sceneUIController.getSampleCount(), td, + text = String.format("%03.1f/%03.1f fps, v-sync %d, fontSize %.1f, %s-samples %d, q %d, td %"+timePrec+"f, blend %b, alpha-bits %d, msaa-bits %d", + lfps, tfps, gl.getSwapInterval(), fontSizeFixedPVP, modeS, sceneUIController.getSampleCount(), fpsLabel.getQuality(), td, renderer.getRenderState().isHintMaskSet(RenderState.BITHINT_BLENDING_ENABLED), drawable.getChosenGLCapabilities().getAlphaBits(), drawable.getChosenGLCapabilities().getNumSamples()); diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo.java index c59d85824..a4da58eac 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo.java @@ -11,7 +11,6 @@ import com.jogamp.newt.event.WindowEvent; import com.jogamp.newt.opengl.GLWindow; import com.jogamp.opengl.test.junit.util.MiscUtils; import com.jogamp.opengl.util.Animator; -import com.jogamp.opengl.util.glsl.ShaderState; public class GPUUISceneNewtDemo { static final boolean DEBUG = false; @@ -68,14 +67,14 @@ public class GPUUISceneNewtDemo { window.setSize(800, 400); window.setTitle("GraphUI Newt Demo: graph["+Region.getRenderModeString(rmode)+"], msaa "+SceneMSAASamples); - final RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory()); + final RenderState rs = RenderState.createRenderState(SVertex.factory()); GPUUISceneGLListener0A sceneGLListener = new GPUUISceneGLListener0A(rs, rmode, DEBUG, TRACE); window.addGLEventListener(sceneGLListener); sceneGLListener.attachInputListenerTo(window); final Animator animator = new Animator(); - animator.setUpdateFPSFrames(60, null); // System.err); + animator.setUpdateFPSFrames(60, System.err); animator.add(window); window.addWindowListener(new WindowAdapter() { diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/CrossHair.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/CrossHair.java index 75fc0eb8f..450d5743a 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/CrossHair.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/CrossHair.java @@ -30,7 +30,6 @@ package com.jogamp.opengl.test.junit.graph.demos.ui; import javax.media.opengl.GL2ES2; import com.jogamp.graph.curve.OutlineShape; -import com.jogamp.graph.curve.OutlineShapeXForm; import com.jogamp.graph.curve.opengl.RegionRenderer; import com.jogamp.graph.geom.Vertex; import com.jogamp.graph.geom.Vertex.Factory; @@ -56,7 +55,7 @@ public class CrossHair extends UIShape { this.width = width; this.height = height; this.lineWidth = lineWidth; - dirty |= DIRTY_SHAPE | DIRTY_REGION; + dirty |= DIRTY_SHAPE; } @Override @@ -68,7 +67,7 @@ public class CrossHair extends UIShape { } @Override - protected void createShape(GL2ES2 gl, RegionRenderer renderer) { + protected void addShapeToRegion(GL2ES2 gl, RegionRenderer renderer) { final OutlineShape shape = new OutlineShape(renderer.getRenderState().getVertexFactory()); final float tw = getWidth(); @@ -97,7 +96,9 @@ public class CrossHair extends UIShape { shape.addVertex(ctrX-twh, ctrY+lwh, ctrZ, true); shape.closeLastOutline(true); - shapes.add(new OutlineShapeXForm(shape, null)); + shape.setIsQuadraticNurbs(); + shape.setSharpness(shapesSharpness); + region.addOutlineShape(shape, null, rgbaColor); box.resize(shape.getBounds()); } 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 78c42b2d0..2f942fd13 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 @@ -32,7 +32,6 @@ import javax.media.opengl.GL2ES2; import jogamp.graph.geom.plane.AffineTransform; import com.jogamp.graph.curve.OutlineShape; -import com.jogamp.graph.curve.OutlineShapeXForm; import com.jogamp.graph.curve.opengl.RegionRenderer; import com.jogamp.graph.curve.opengl.TextRegionUtil; import com.jogamp.graph.font.Font; @@ -57,7 +56,7 @@ public class Label extends UIShape { public void setText(String text) { this.text = text; - dirty |= DIRTY_SHAPE | DIRTY_REGION; + dirty |= DIRTY_SHAPE; } public Font getFont() { @@ -66,7 +65,7 @@ public class Label extends UIShape { public void setFont(Font font) { this.font = font; - dirty |= DIRTY_SHAPE | DIRTY_REGION; + dirty |= DIRTY_SHAPE; } public float getPixelSize() { @@ -79,7 +78,7 @@ public class Label extends UIShape { public void setPixelSize(float pixelSize) { this.pixelSize = pixelSize; - dirty |= DIRTY_SHAPE | DIRTY_REGION; + dirty |= DIRTY_SHAPE; } @Override @@ -95,14 +94,15 @@ public class Label extends UIShape { private final TextRegionUtil.ShapeVisitor shapeVisitor = new TextRegionUtil.ShapeVisitor() { @Override public void visit(OutlineShape shape, AffineTransform t) { - shapes.add(new OutlineShapeXForm(shape, new AffineTransform(t))); + shape.setSharpness(shapesSharpness); + region.addOutlineShape(shape, t, rgbaColor); box.resize(shape.getBounds(), t, tmpV3); } }; @Override - protected void createShape(GL2ES2 gl, RegionRenderer renderer) { - TextRegionUtil.processString(shapeVisitor, new AffineTransform(), font, pixelSize, text); + protected void addShapeToRegion(GL2ES2 gl, RegionRenderer renderer) { + TextRegionUtil.processString(shapeVisitor, null, font, pixelSize, text); final float[] ctr = box.getCenter(); setRotationOrigin( ctr[0], ctr[1], ctr[2]); } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label0.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label0.java new file mode 100644 index 000000000..dff9cd1c7 --- /dev/null +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label0.java @@ -0,0 +1,102 @@ +/** + * Copyright 2010 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ +package com.jogamp.opengl.test.junit.graph.demos.ui; + +import jogamp.graph.geom.plane.AffineTransform; + +import com.jogamp.graph.curve.OutlineShape; +import com.jogamp.graph.curve.Region; +import com.jogamp.graph.curve.opengl.TextRegionUtil; +import com.jogamp.graph.font.Font; +import com.jogamp.opengl.math.geom.AABBox; + +public class Label0 { + protected Font font; + protected String text; + protected final float[] rgbaColor; + protected final AABBox box; + + public Label0(Font font, String text, float[] rgbaColor) { + this.font = font; + this.text = text; + this.rgbaColor = rgbaColor; + this.box = new AABBox(); + } + + public final String getText() { return text; } + + public final float[] getColor() { return rgbaColor; } + + public final void setColor(float r, float g, float b, float a) { + this.rgbaColor[0] = r; + this.rgbaColor[1] = g; + this.rgbaColor[2] = b; + this.rgbaColor[3] = a; + } + + public final void setText(String text) { + this.text = text; + } + + public final Font getFont() { return font; } + + public final void setFont(Font font) { + this.font = font; + } + + public final AABBox getBounds() { return box; } + + private final float[] tmpV3 = new float[3]; + + private final TextRegionUtil.ShapeVisitor shapeVisitor = new TextRegionUtil.ShapeVisitor() { + @Override + public void visit(OutlineShape shape, AffineTransform t) { + final AffineTransform t1 = new AffineTransform(tLeft).concatenate( t ); + region.addOutlineShape(shape, t1, rgbaColor); + box.resize(shape.getBounds(), t1, tmpV3); + } + }; + + private Region region; + private AffineTransform tLeft; + + public final AABBox addShapeToRegion(final float pixelSize, final Region region, final AffineTransform tLeft) { + box.reset(); + this.region = region; + this.tLeft = tLeft; + TextRegionUtil.processString(shapeVisitor, null, font, pixelSize, text); + this.region = null; + this.tLeft = null; + return box; + } + + @Override + public final String toString(){ + return "Label0 [" + font.toString() + ", " + getText() + "]"; + } +} 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 cfce04dd0..d46343f9d 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 @@ -29,8 +29,9 @@ package com.jogamp.opengl.test.junit.graph.demos.ui; import javax.media.opengl.GL2ES2; +import jogamp.graph.geom.plane.AffineTransform; + import com.jogamp.graph.curve.OutlineShape; -import com.jogamp.graph.curve.OutlineShapeXForm; import com.jogamp.graph.curve.opengl.RegionRenderer; import com.jogamp.graph.font.Font; import com.jogamp.graph.geom.Vertex; @@ -49,7 +50,7 @@ public class RIButton extends UIShape { public static final float DEFAULT_CORNER = 1f; private float width, height; - private final Label label; + private final Label0 label; private float spacingX = DEFAULT_SPACING_X; private float spacingY = DEFAULT_SPACING_Y; private float corner = DEFAULT_CORNER; @@ -58,13 +59,7 @@ public class RIButton extends UIShape { public RIButton(Factory factory, Font labelFont, String labelText, float width, float height) { super(factory); - final float pixelSize = height * ( 1f - spacingY ) ; - System.err.printf("RIButton: height %f -> pixelSize %f%n", height, pixelSize); - this.label = new Label(factory, labelFont, pixelSize, labelText); - this.label.setSelectedColor(this.color[0], this.color[1], this.color[2]); - this.label.setColor(0.9f, 0.9f, 0.9f); - this.label.setSelectedColor(1f, 1f, 1f); - + this.label = new Label0(labelFont, labelText, new float[] { 0.9f, 0.9f, 0.9f, 1.0f }); this.width = width; this.height = height; } @@ -72,82 +67,73 @@ public class RIButton extends UIShape { public final float getWidth() { return width; } public final float getHeight() { return height; } public final float getCorner() { return corner; } - public final Label getLabel() { return label; } public void setDimension(float width, float height) { this.width = width; this.height = height; - dirty |= DIRTY_SHAPE | DIRTY_REGION; + dirty |= DIRTY_SHAPE; } @Override protected void clearImpl(GL2ES2 gl, RegionRenderer renderer) { - label.clear(gl, renderer); } @Override protected void destroyImpl(GL2ES2 gl, RegionRenderer renderer) { - label.destroy(gl, renderer); } @Override public void drawShape(GL2ES2 gl, RegionRenderer renderer, int[] sampleCount) { - gl.glEnable(GL2ES2.GL_POLYGON_OFFSET_FILL); - gl.glPolygonOffset(0.0f, 1f); + // No need to setup an poly offset for z-fighting, using one region now + // gl.glEnable(GL2ES2.GL_POLYGON_OFFSET_FILL); + // gl.glPolygonOffset(0.0f, 1f); super.drawShape(gl, renderer, sampleCount); - gl.glDisable(GL2ES2.GL_POLYGON_OFFSET_FILL); - - label.drawShape(gl, renderer, sampleCount); + // gl.glDisable(GL2ES2.GL_POLYGON_OFFSET_FILL); } @Override - protected void createShape(GL2ES2 gl, RegionRenderer renderer) { - label.clear(gl, renderer); - + protected void addShapeToRegion(GL2ES2 gl, RegionRenderer renderer) { final OutlineShape shape = new OutlineShape(renderer.getRenderState().getVertexFactory()); if(corner == 0.0f) { createSharpOutline(shape); } else { createCurvedOutline(shape); } + shape.setIsQuadraticNurbs(); + shape.setSharpness(shapesSharpness); + region.addOutlineShape(shape, null, rgbaColor); box.resize(shape.getBounds()); // Precompute text-box size .. guessing pixelSize final float lPixelSize0 = 10f; final float lw = width * ( 1f - spacingX ) ; final float lh = height * ( 1f - spacingY ) ; - final AABBox lbox0 = label.font.getStringBounds(label.text, lPixelSize0); + final AABBox lbox0 = label.font.getMetricBounds(label.text, lPixelSize0); final float lsx = lw / lbox0.getWidth(); final float lsy = lh / lbox0.getHeight(); final float lPixelSize1 = lsx < lsy ? lPixelSize0 * lsx : lPixelSize0 * lsy; if( DRAW_DEBUG_BOX ) { System.err.println("RIButton: spacing "+spacingX+", "+spacingY); System.err.println("RIButton: bbox "+box); - System.err.println("RIButton: lbox "+lbox0); + System.err.println("RIButton: lbox "+lbox0+", "+label.text); System.err.println("RIButton: net-text "+lw+" x "+lh); System.err.println("RIButton: lsx "+lsx+", lsy "+lsy+": pixelSize "+lPixelSize0+" -> "+lPixelSize1); } // Setting pixelSize based on actual text-box size - label.setPixelSize(lPixelSize1); - label.createShape(gl, renderer); - final AABBox lbox1 = label.getBounds(); - if( DRAW_DEBUG_BOX ) { - System.err.printf("RIButton: lbox1 %s .... %s%n", lbox1, this.label.text); - } - + final AABBox lbox1 = label.font.getPointsBounds(null, label.text, lPixelSize1); // Center text .. (share same center w/ button) final float[] lctr = lbox1.getCenter(); final float[] ctr = box.getCenter(); final float[] ltx = new float[] { ctr[0] - lctr[0], ctr[1] - lctr[1], 0f }; - label.translateShape( ltx[0], ltx[1] ); - lbox1.translate( ltx ); - // rotate center of button/label .. - label.setRotationOrigin( ctr[0], ctr[1], ctr[2]); - setRotationOrigin( ctr[0], ctr[1], ctr[2]); + final AABBox lbox2 = label.addShapeToRegion(lPixelSize1, region, AffineTransform.getTranslateInstance(ltx[0], ltx[1])); + if( DRAW_DEBUG_BOX ) { + System.err.printf("RIButton.0: lbox1 %s%n", lbox1); + System.err.printf("RIButton.0: lbox2 %s%n", lbox2); + } - shapes.add(new OutlineShapeXForm(shape, null)); + setRotationOrigin( ctr[0], ctr[1], ctr[2]); if( DRAW_DEBUG_BOX ) { System.err.println("XXX.UIShape.RIButton: Added Shape: "+shape+", "+box); @@ -205,7 +191,7 @@ public class RIButton extends UIShape { else{ this.corner = corner; } - dirty |= DIRTY_SHAPE | DIRTY_REGION; + dirty |= DIRTY_SHAPE; } public float getLabelZOffset() { @@ -214,7 +200,7 @@ public class RIButton extends UIShape { public void setLabelZOffset(float labelZOffset) { this.labelZOffset = -labelZOffset; - dirty |= DIRTY_SHAPE | DIRTY_REGION; + dirty |= DIRTY_SHAPE; } public final float getSpacingX() { return spacingX; } public final float getSpacingY() { return spacingY; } @@ -239,7 +225,7 @@ public class RIButton extends UIShape { } else { this.spacingY = spacingY; } - dirty |= DIRTY_SHAPE | DIRTY_REGION; + dirty |= DIRTY_SHAPE; } public float[] getLabelColor() { @@ -247,17 +233,13 @@ public class RIButton extends UIShape { } public void setLabelColor(float r, float g, float b) { - label.setColor(r, g, b); - } - - public void setLabelSelectedColor(float r, float g, float b){ - label.setSelectedColor(r, g, b); + label.setColor(r, g, b, 1.0f); } @Override public String toString() { return "RIButton [" + translate[0]+getWidth()/2f+" / "+translate[1]+getHeight()/2f+" "+getWidth() + "x" + getHeight() + ", " - + getLabel() + ", " + "spacing: " + spacingX+"/"+spacingY + + label + ", " + "spacing: " + spacingX+"/"+spacingY + ", " + "corner: " + corner + ", " + "shapeOffset: " + labelZOffset + ", "+box+" ]"; } } 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 124729563..4f77ad3ad 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 @@ -82,6 +82,16 @@ public class SceneUIController implements GLEventListener{ public int getSampleCount() { return sampleCount[0]; } public void setSampleCount(int v) { sampleCount[0]=v; markAllShapesDirty(); } + public void setAllShapesQuality(final int q) { + for(int i=0; i vertexFactory; - protected final ArrayList shapes; - protected static final int DIRTY_SHAPE = 1 << 0 ; - protected static final int DIRTY_REGION = 1 << 2 ; - protected int dirty = DIRTY_SHAPE | DIRTY_REGION; + protected int dirty = DIRTY_SHAPE; + protected float shapesSharpness = OutlineShape.DEFAULT_SHARPNESS; protected final AABBox box; protected final float[] translate = new float[] { 0f, 0f, 0f }; @@ -66,12 +61,11 @@ public abstract class UIShape { protected final float[] rotOrigin = new float[] { 0f, 0f, 0f }; protected final float[] scale = new float[] { 1f, 1f, 1f }; - protected final float[] shapeTranslate2D = new float[] { 0f, 0f }; - protected final float[] shapeScale2D = new float[] { 1f, 1f }; - private GLRegion region = null; + protected GLRegion region = null; + protected int regionQuality = 99; - protected final float[] color = {0.6f, 0.6f, 0.6f}; - protected final float[] selectedColor = {0.8f, 0.8f, 0.8f}; + protected final float[] rgbaColor = {0.6f, 0.6f, 0.6f, 1.0f}; + protected final float[] selectedRGBAModulate = {1.4f, 1.4f, 1.4f, 1.0f}; private boolean down = false; private boolean toggle =false; @@ -81,7 +75,6 @@ public abstract class UIShape { public UIShape(Factory factory) { this.vertexFactory = factory; - this.shapes = new ArrayList(); this.box = new AABBox(); } @@ -97,7 +90,6 @@ public abstract class UIShape { */ public void clear(GL2ES2 gl, RegionRenderer renderer) { clearImpl(gl, renderer); - shapes.clear(); translate[0] = 0f; translate[1] = 0f; translate[2] = 0f; @@ -108,12 +100,8 @@ public abstract class UIShape { scale[0] = 1f; scale[1] = 1f; scale[2] = 1f; - shapeTranslate2D[0] = 0f; - shapeTranslate2D[1] = 0f; - shapeScale2D[0] = 1f; - shapeScale2D[1] = 1f; box.reset(); - dirty = DIRTY_SHAPE | DIRTY_REGION; + dirty = DIRTY_SHAPE; } /** @@ -123,7 +111,6 @@ public abstract class UIShape { */ public void destroy(GL2ES2 gl, RegionRenderer renderer) { destroyImpl(gl, renderer); - shapes.clear(); translate[0] = 0f; translate[1] = 0f; translate[2] = 0f; @@ -134,12 +121,8 @@ public abstract class UIShape { scale[0] = 1f; scale[1] = 1f; scale[2] = 1f; - shapeTranslate2D[0] = 0f; - shapeTranslate2D[1] = 0f; - shapeScale2D[0] = 1f; - shapeScale2D[1] = 1f; box.reset(); - dirty = DIRTY_SHAPE | DIRTY_REGION; + dirty = DIRTY_SHAPE; } public void setTranslate(float tx, float ty, float tz) { @@ -174,42 +157,17 @@ public abstract class UIShape { } public final float[] getScale() { return scale; } - public final void translateShape(float tx, float ty) { - shapeTranslate2D[0] += tx; - shapeTranslate2D[1] += ty; - } - public final void scaleShape(float sx, float sy) { - shapeScale2D[0] *= sx; - shapeScale2D[1] *= sy; - } - public final void markDirty() { - dirty = DIRTY_SHAPE | DIRTY_REGION; + dirty = DIRTY_SHAPE; } public final boolean isShapeDirty() { return 0 != ( dirty & DIRTY_SHAPE ) ; } - public final boolean isRegionDirty() { - return 0 != ( dirty & DIRTY_REGION ) ; - } - - public ArrayList getShapes() { return shapes; } - public final AABBox getBounds() { return box; } public GLRegion getRegion(GL2ES2 gl, RegionRenderer renderer) { validate(gl, renderer); - if( isRegionDirty() ) { - if( null == region ) { - region = GLRegion.create(renderer.getRenderModes()); - } else { - region.clear(gl, renderer); - } - addToRegion(region); - dirty &= ~DIRTY_REGION; - // System.err.println("XXX.UIShape: updated: "+region); - } return region; } @@ -223,85 +181,93 @@ public abstract class UIShape { * @param sampleCount */ public void drawShape(GL2ES2 gl, RegionRenderer renderer, int[] sampleCount) { - final float[] _color; + final float r, g, b, a; + final boolean isSelect; if( isPressed() || toggle ) { - _color = selectedColor; + isSelect = true; + r = rgbaColor[0]*selectedRGBAModulate[0]; + g = rgbaColor[1]*selectedRGBAModulate[1]; + b = rgbaColor[2]*selectedRGBAModulate[2]; + a = rgbaColor[3]*selectedRGBAModulate[3]; } else { - _color = color; - + isSelect = false; + r = rgbaColor[0]; + g = rgbaColor[1]; + b = rgbaColor[2]; + a = rgbaColor[3]; } + if( renderer.getRenderState().isHintMaskSet(RenderState.BITHINT_BLENDING_ENABLED) ) { - gl.glClearColor(_color[0], _color[1], _color[2], 0.0f); + gl.glClearColor(r, g, b, 0.0f); } - renderer.setColorStatic(gl, _color[0], _color[1], _color[2]); + final RenderState rs = renderer.getRenderState(); + if( Region.hasColorChannel( renderer.getRenderModes() ) ) { + if( isSelect ) { + rs.setColorStatic(selectedRGBAModulate[0], selectedRGBAModulate[1], selectedRGBAModulate[2], selectedRGBAModulate[3]); + } else { + rs.setColorStatic(1.0f, 1.0f, 1.0f, 1.0f); + } + } else { + rs.setColorStatic(r, g, b, a); + } getRegion(gl, renderer).draw(gl, renderer, sampleCount); } public final boolean validate(GL2ES2 gl, RegionRenderer renderer) { if( isShapeDirty() ) { - shapes.clear(); box.reset(); - createShape(gl, renderer); + if( null == region ) { + region = GLRegion.create(renderer.getRenderModes()); + } else { + region.clear(gl, renderer); + } + addShapeToRegion(gl, renderer); if( DRAW_DEBUG_BOX ) { - shapes.clear(); + region.clear(gl, renderer); final OutlineShape shape = new OutlineShape(renderer.getRenderState().getVertexFactory()); - shapes.add(new OutlineShapeXForm(createDebugOutline(shape, box), null)); + shape.setSharpness(shapesSharpness); + shape.setIsQuadraticNurbs(); + region.addOutlineShape(shape, null, rgbaColor); } + region.setQuality(regionQuality); dirty &= ~DIRTY_SHAPE; - dirty |= DIRTY_REGION; + return true; + } else { return false; } - return true; } - private final void addToRegion(Region region) { - final boolean hasLocTrans = 0f != shapeTranslate2D[0] || 0f != shapeTranslate2D[1]; - final boolean hasLocScale = 1f != shapeScale2D[0] || 1f != shapeScale2D[1]; - final AffineTransform t; - if( hasLocScale || hasLocTrans ) { - // System.err.printf("UIShape.addToRegion: locTranslate %f x %f, locScale %f x %f%n", - // shapeTranslate[0], shapeTranslate[1], shapeScale[0], shapeScale[1]); - t = new AffineTransform(); - if( hasLocTrans ) { - t.translate(shapeTranslate2D[0], shapeTranslate2D[1]); - } - if( hasLocScale ) { - t.scale(shapeScale2D[0], shapeScale2D[1]); - } - } else { - t = null; - } - final int shapeCount = shapes.size(); - for(int i=0; i