diff options
author | Sven Gothel <[email protected]> | 2023-04-20 22:00:11 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-04-20 22:00:11 +0200 |
commit | 2aae33b94cea15b2fc0c54479277611c67cdaf13 (patch) | |
tree | e1956d8361fd1ef6860c50f0a0aa8aab6b5ce612 /src | |
parent | c21082a5d7caf0ae6e29144358b4b4a1eafec019 (diff) |
GraphUI GraphShape: createGLRegion() -> updateGLRegion(), called by addShapeToRegion() impl to utilize OutlineShape -> GLRegion ctor w/ proper buffer-size
This way we avoid unnecessary buffer growth and allow creation of 'always' fitting buffer sizes.
+++
Update or freshly create the GLRegion, while allocating its buffers with given initial `vertexCount` and `indexCount`.
Method shall be invoked by the addShapeToRegion(GLProfile, GL2ES2) implementation before actually adding the OutlineShape to the GLRegion.
addShapeToRegion(GLProfile, GL2ES2) is capable to determine initial `vertexCount` and `indexCount` buffer sizes,
as it composes the OutlineShapes to be added.
updateGLRegion(GLProfile, GL2ES2, TextureSequence, OutlineShape) maybe used for convenience.
In case GLRegion is `null`, a new instance is being created.
In case the GLRegion already exists, it will be either cleared if the GL2ES2 `gl` instance is not `null`
or earmarked for deletion at a later time and a new instance is being created.
Diffstat (limited to 'src')
19 files changed, 192 insertions, 104 deletions
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/UISceneDemo12.java b/src/demos/com/jogamp/opengl/demos/graph/ui/UISceneDemo12.java index 846f03184..4a0fa9a90 100644 --- a/src/demos/com/jogamp/opengl/demos/graph/ui/UISceneDemo12.java +++ b/src/demos/com/jogamp/opengl/demos/graph/ui/UISceneDemo12.java @@ -91,7 +91,6 @@ public class UISceneDemo12 { final GLWindow window = GLWindow.create(caps); window.setSize(options.surface_width, options.surface_height); window.setTitle(UISceneDemo12.class.getSimpleName()+": "+window.getSurfaceWidth()+" x "+window.getSurfaceHeight()); - window.setVisible(true); window.addWindowListener(new WindowAdapter() { @Override public void windowResized(final WindowEvent e) { @@ -104,17 +103,17 @@ public class UISceneDemo12 { }); - animator.setUpdateFPSFrames(1*60, null); // System.err); - animator.add(window); - animator.start(); - final Scene scene = new Scene(); scene.setClearParams(new float[] { 1f, 1f, 1f, 1f}, GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); scene.setFrustumCullingEnabled(true); scene.attachInputListenerTo(window); window.addGLEventListener(scene); + window.setVisible(true); scene.waitUntilDisplayed(); + animator.setUpdateFPSFrames(1*60, null); // System.err); + animator.add(window); + animator.start(); // // Resolution independent, no screen size // diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/UITypeDemo01.java b/src/demos/com/jogamp/opengl/demos/graph/ui/UITypeDemo01.java index 6fe7e1791..1640f1426 100644 --- a/src/demos/com/jogamp/opengl/demos/graph/ui/UITypeDemo01.java +++ b/src/demos/com/jogamp/opengl/demos/graph/ui/UITypeDemo01.java @@ -332,7 +332,7 @@ public class UITypeDemo01 implements GLEventListener { pmv.glScalef(txt_scale, txt_scale, 1f); pmv.glTranslatef(-txt_box_em.getWidth(), 0f, 0f); if( null != glyph.getShape() ) { - final GLRegion region = GLRegion.create(gl.getGLProfile(), renderModes, null); + final GLRegion region = GLRegion.create(gl.getGLProfile(), renderModes, null, glyph.getShape()); region.addOutlineShape(glyph.getShape(), null, fg_color); region.draw(gl, renderer, sampleCount); region.destroy(gl); diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph01UbuntuLight_o.java b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph01UbuntuLight_o.java index 1272a3a94..313b23e45 100644 --- a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph01UbuntuLight_o.java +++ b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph01UbuntuLight_o.java @@ -30,6 +30,8 @@ package com.jogamp.opengl.demos.graph.ui.testshapes; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.geom.plane.Winding; import com.jogamp.graph.ui.GraphShape; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GLProfile; /** * GPU based resolution independent test object @@ -44,7 +46,7 @@ public class Glyph01UbuntuLight_o extends GraphShape { @SuppressWarnings("unused") @Override - protected void addShapeToRegion() { + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { final OutlineShape shape = new OutlineShape(); // Ubuntu-Light, lower case 'o' @@ -292,9 +294,11 @@ public class Glyph01UbuntuLight_o extends GraphShape { shape.setIsQuadraticNurbs(); shape.setSharpness(oshapeSharpness); - region.addOutlineShape(shape, null, rgbaColor); + updateGLRegion(glp, gl, null, shape); + region.addOutlineShape(shape, null, rgbaColor); box.resize(shape.getBounds()); + setRotationPivot( box.getCenter() ); } @Override diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph02UbuntuLight_ae.java b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph02UbuntuLight_ae.java index e4604bf45..5e9cb910f 100644 --- a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph02UbuntuLight_ae.java +++ b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph02UbuntuLight_ae.java @@ -29,6 +29,8 @@ package com.jogamp.opengl.demos.graph.ui.testshapes; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.ui.GraphShape; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GLProfile; /** * GPU based resolution independent test object @@ -43,7 +45,7 @@ public class Glyph02UbuntuLight_ae extends GraphShape { @SuppressWarnings("unused") @Override - protected void addShapeToRegion() { + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { final OutlineShape shape = new OutlineShape(); // Ubuntu-Light, lower case 'æ' @@ -628,9 +630,11 @@ public class Glyph02UbuntuLight_ae extends GraphShape { shape.setIsQuadraticNurbs(); shape.setSharpness(oshapeSharpness); - region.addOutlineShape(shape, null, rgbaColor); + updateGLRegion(glp, gl, null, shape); + region.addOutlineShape(shape, null, rgbaColor); box.resize(shape.getBounds()); + setRotationPivot( box.getCenter() ); } @Override diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph03FreeMonoRegular_M.java b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph03FreeMonoRegular_M.java index 877a72648..a4bc79720 100644 --- a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph03FreeMonoRegular_M.java +++ b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph03FreeMonoRegular_M.java @@ -29,6 +29,8 @@ package com.jogamp.opengl.demos.graph.ui.testshapes; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.ui.GraphShape; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GLProfile; /** * GPU based resolution independent test object @@ -43,7 +45,7 @@ public class Glyph03FreeMonoRegular_M extends GraphShape { @SuppressWarnings("unused") @Override - protected void addShapeToRegion() { + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { final OutlineShape shape = new OutlineShape(); if( false ) { @@ -780,9 +782,11 @@ public class Glyph03FreeMonoRegular_M extends GraphShape { shape.setIsQuadraticNurbs(); shape.setSharpness(oshapeSharpness); - region.addOutlineShape(shape, null, rgbaColor); + updateGLRegion(glp, gl, null, shape); + region.addOutlineShape(shape, null, rgbaColor); box.resize(shape.getBounds()); + setRotationPivot( box.getCenter() ); } @Override diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph04FreeSans_0.java b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph04FreeSans_0.java index 13273488e..1880e42c7 100644 --- a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph04FreeSans_0.java +++ b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph04FreeSans_0.java @@ -29,6 +29,8 @@ package com.jogamp.opengl.demos.graph.ui.testshapes; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.ui.GraphShape; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GLProfile; /** * GPU based resolution independent test object @@ -42,7 +44,7 @@ public class Glyph04FreeSans_0 extends GraphShape { } @Override - protected void addShapeToRegion() { + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { final OutlineShape shape = new OutlineShape(); // Start TTF Shape for Glyph 19 @@ -126,9 +128,11 @@ public class Glyph04FreeSans_0 extends GraphShape { shape.setIsQuadraticNurbs(); shape.setSharpness(oshapeSharpness); - region.addOutlineShape(shape, null, rgbaColor); + updateGLRegion(glp, gl, null, shape); + region.addOutlineShape(shape, null, rgbaColor); box.resize(shape.getBounds()); + setRotationPivot( box.getCenter() ); } @Override diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph05FreeSerifBoldItalic_ae.java b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph05FreeSerifBoldItalic_ae.java index 8e858be16..fe8d1440b 100644 --- a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph05FreeSerifBoldItalic_ae.java +++ b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph05FreeSerifBoldItalic_ae.java @@ -29,6 +29,8 @@ package com.jogamp.opengl.demos.graph.ui.testshapes; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.ui.GraphShape; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GLProfile; /** * GPU based resolution independent test object @@ -42,7 +44,7 @@ public class Glyph05FreeSerifBoldItalic_ae extends GraphShape { } @Override - protected void addShapeToRegion() { + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { final OutlineShape shape = new OutlineShape(); // Start TTF Shape for Glyph 168 @@ -263,9 +265,11 @@ public class Glyph05FreeSerifBoldItalic_ae extends GraphShape { shape.setIsQuadraticNurbs(); shape.setSharpness(oshapeSharpness); - region.addOutlineShape(shape, null, rgbaColor); + updateGLRegion(glp, gl, null, shape); + region.addOutlineShape(shape, null, rgbaColor); box.resize(shape.getBounds()); + setRotationPivot( box.getCenter() ); } @Override diff --git a/src/graphui/classes/com/jogamp/graph/ui/GraphShape.java b/src/graphui/classes/com/jogamp/graph/ui/GraphShape.java index 89e77d2fe..abe56eca3 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/GraphShape.java +++ b/src/graphui/classes/com/jogamp/graph/ui/GraphShape.java @@ -40,7 +40,7 @@ import com.jogamp.opengl.math.Vec4f; import com.jogamp.opengl.util.texture.TextureSequence; /** - * Graph based {@link GLRegion} UI {@link Shape} + * Graph based {@link GLRegion} {@link Shape} * <p> * GraphUI is GPU based and resolution independent. * </p> @@ -125,8 +125,53 @@ public abstract class GraphShape extends Shape { region.draw(gl, renderer, sampleCount); } - protected GLRegion createGLRegion(final GLProfile glp) { - return GLRegion.create(glp, renderModes, null); + /** + * Update or freshly create the {@link GLRegion}, while allocating its buffers with given initial `vertexCount` and `indexCount`. + * + * Method shall be invoked by the {@link #addShapeToRegion(GLProfile, GL2ES2)} implementation + * before actually adding the {@link OutlineShape} to the {@link GLRegion}. + * + * {@link #addShapeToRegion(GLProfile, GL2ES2)} is capable to determine initial `vertexCount` and `indexCount` buffer sizes, + * as it composes the {@link OutlineShape}s to be added. + * + * {@link #updateGLRegion(GLProfile, GL2ES2, TextureSequence, OutlineShape)} maybe used for convenience. + * + * In case {@link GLRegion} is `null`, a new instance is being created. + * + * In case the {@link GLRegion} already exists, it will be either {@link GLRegion#clear(GL2ES2) cleared} if the {@link GL2ES2} `gl` + * instance is not `null` or earmarked for deletion at a later time and a new instance is being created. + * + * @param glp the used GLProfile, never `null` + * @param gl the optional current {@link GL2ES2} instance, maybe `null`. + * @param colorTexSeq optional {@link TextureSequence} for {@link Region#COLORTEXTURE_RENDERING_BIT} rendering mode. + * @param vertexCount the initial {@link GLRegion} vertex buffer size + * @param indexCount the initial {@link GLRegion} index buffer size + * @see #updateGLRegion(GLProfile, GL2ES2, TextureSequence, OutlineShape) + */ + protected void updateGLRegion(final GLProfile glp, final GL2ES2 gl, final TextureSequence colorTexSeq, final int vertexCount, final int indexCount) { + if( null == region ) { + region = GLRegion.create(glp, renderModes, colorTexSeq, vertexCount, indexCount); + } else if( null == gl ) { + dirtyRegions.add(region); + region = GLRegion.create(glp, renderModes, colorTexSeq, vertexCount, indexCount); + } else { + region.clear(gl); + region.setBufferCapacity(vertexCount, indexCount); + } + } + /** + * Convenient {@link #updateGLRegion(GLProfile, GL2ES2, TextureSequence, int, int)} variant determining initial + * {@link GLRegion} buffer sizes via {@link Region#countOutlineShape(OutlineShape, int[])}. + * + * @param glp the used GLProfile, never `null` + * @param gl the optional current {@link GL2ES2} instance, maybe `null`. + * @param colorTexSeq optional {@link TextureSequence} for {@link Region#COLORTEXTURE_RENDERING_BIT} rendering mode. + * @param shape the {@link OutlineShape} used to determine {@link GLRegion}'s buffer sizes via {@link Region#countOutlineShape(OutlineShape, int[])} + * @see #updateGLRegion(GLProfile, GL2ES2, TextureSequence, int, int) + */ + protected void updateGLRegion(final GLProfile glp, final GL2ES2 gl, final TextureSequence colorTexSeq, final OutlineShape shape) { + final int[/*2*/] vertIndexCount = Region.countOutlineShape(shape, new int[2]); + updateGLRegion(glp, gl, colorTexSeq, vertIndexCount[0], vertIndexCount[1]); } @Override @@ -135,17 +180,9 @@ public abstract class GraphShape extends Shape { clearDirtyRegions(gl); } if( isShapeDirty() ) { - if( null == region ) { - region = createGLRegion(glp); - } else if( null == gl ) { - dirtyRegions.add(region); - region = createGLRegion(glp); - } else { - region.clear(gl); - } - addShapeToRegion(); - if( hasDebugBox() ) { - addDebugOutline(); + addShapeToRegion(glp, gl); // calls updateGLRegion(..) + if( hasBorder() ) { + addBorderOutline(); } region.setQuality(regionQuality); } else if( isStateDirty() ) { @@ -153,9 +190,7 @@ public abstract class GraphShape extends Shape { } } - private final Vec4f dbgColor = new Vec4f(0.3f, 0.3f, 0.3f, 0.5f); - - protected void addDebugOutline() { + protected void addBorderOutline() { final OutlineShape shape = new OutlineShape(); final float x1 = box.getMinX(); final float x2 = box.getMaxX(); @@ -175,7 +210,7 @@ public abstract class GraphShape extends Shape { { // Inner OutlineShape as Winding.CW. final float dxy0 = box.getWidth() < box.getHeight() ? box.getWidth() : box.getHeight(); - final float dxy = dxy0 * getDebugBox(); + final float dxy = dxy0 * getBorderThickness(); shape.moveTo(x1+dxy, y1+dxy, z); shape.lineTo(x1+dxy, y2-dxy, z); shape.lineTo(x2-dxy, y2-dxy, z); @@ -185,13 +220,13 @@ public abstract class GraphShape extends Shape { } shape.setIsQuadraticNurbs(); shape.setSharpness(oshapeSharpness); - region.addOutlineShape(shape, null, dbgColor); + region.addOutlineShape(shape, null, borderColor); } protected void clearImpl(final GL2ES2 gl, final RegionRenderer renderer) { } protected void destroyImpl(final GL2ES2 gl, final RegionRenderer renderer) { } - protected abstract void addShapeToRegion(); + protected abstract void addShapeToRegion(GLProfile glp, GL2ES2 gl); } diff --git a/src/graphui/classes/com/jogamp/graph/ui/Group.java b/src/graphui/classes/com/jogamp/graph/ui/Group.java index c45292f1b..1de20240d 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/Group.java +++ b/src/graphui/classes/com/jogamp/graph/ui/Group.java @@ -44,7 +44,7 @@ import com.jogamp.opengl.util.PMVMatrix; import jogamp.graph.ui.TreeTool; /** - * Group of UI {@link Shape}s, optionally utilizing a {@link Group.Layout}. + * Group of {@link Shape}s, optionally utilizing a {@link Group.Layout}. * @see Scene * @see Shape * @see Group.Layout @@ -126,7 +126,7 @@ public class Group extends Shape implements Container { /** Removes given shape and destroy it. */ public void removeShape(final GL2ES2 gl, final RegionRenderer renderer, final Shape s) { - s.setDebugBox(0f); + s.setBorder(0f); shapes.remove(s); s.destroy(gl, renderer); } diff --git a/src/graphui/classes/com/jogamp/graph/ui/Scene.java b/src/graphui/classes/com/jogamp/graph/ui/Scene.java index c5fb5cd01..4955e683a 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/Scene.java +++ b/src/graphui/classes/com/jogamp/graph/ui/Scene.java @@ -217,12 +217,12 @@ public final class Scene implements Container, GLEventListener { } @Override public void addShape(final Shape s) { - s.setDebugBox(dbgbox_thickness); + s.setBorder(dbgbox_thickness); shapes.add(s); } @Override public Shape removeShape(final Shape s) { - s.setDebugBox(0f); + s.setBorder(0f); return shapes.remove(s) ? s : null; } @Override @@ -232,7 +232,7 @@ public final class Scene implements Container, GLEventListener { /** Removes given shape and destroy it. */ public void removeShape(final GL2ES2 gl, final Shape s) { - s.setDebugBox(0f); + s.setBorder(0f); shapes.remove(s); s.destroy(gl, renderer); } @@ -321,7 +321,7 @@ public final class Scene implements Container, GLEventListener { public final void setDebugBox(final float v) { dbgbox_thickness = v; for(int i=0; i<shapes.size(); i++) { - shapes.get(i).setDebugBox(v); + shapes.get(i).setBorder(v); } } diff --git a/src/graphui/classes/com/jogamp/graph/ui/Shape.java b/src/graphui/classes/com/jogamp/graph/ui/Shape.java index a8e3196c9..5ef40a57f 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/Shape.java +++ b/src/graphui/classes/com/jogamp/graph/ui/Shape.java @@ -53,7 +53,7 @@ import com.jogamp.opengl.math.geom.AABBox; import com.jogamp.opengl.util.PMVMatrix; /** - * Generic UI Shape, potentially using a Graph via {@link GraphShape} or other means of representing content. + * Generic Shape, potentially using a Graph via {@link GraphShape} or other means of representing content. * <p> * A shape includes the following build-in user-interactions * - drag shape w/ 1-pointer click, see {@link #setDraggable(boolean)} @@ -136,7 +136,8 @@ public abstract class Shape { private boolean resizable = true; private boolean interactive = true; private boolean enabled = true; - private float dbgbox_thickness = 0f; // fractional thickness of bounds, 0f for no debug box + private float border_thickness = 0f; + protected final Vec4f borderColor = new Vec4f(0.75f, 0.75f, 0.75f, 1.0f); private ArrayList<MouseGestureListener> mouseListeners = new ArrayList<MouseGestureListener>(); private Listener onMoveListener = null; @@ -158,17 +159,18 @@ public abstract class Shape { public final Shape setEnabled(final boolean v) { enabled = v; return this; } /** - * Sets the {@link #getBounds()} fractional thickness of the debug box ranging [0..1], zero for no debug box (default). - * @param v fractional thickness of {@link #getBounds()} ranging [0..1], zero for no debug box + * Sets the thickness of the debug box, zero for no border (default). + * @param v border thickness, zero for no debug box */ - public final Shape setDebugBox(final float v) { - dbgbox_thickness = Math.min(1f, Math.max(0f, v)); + public final Shape setBorder(final float v) { + border_thickness = Math.max(0f, v); return this; } - /** Returns true if a debug box has been enabled via {@link #setDebugBox(float)}. */ - public final boolean hasDebugBox() { return !FloatUtil.isZero(dbgbox_thickness); } - /** Returns the fractional thickness of the debug box ranging [0..1], see {@link #setDebugBox(float)}. */ - public final float getDebugBox() { return dbgbox_thickness; } + /** Returns true if a border has been enabled via {@link #setBorder(float)}. */ + public final boolean hasBorder() { return !FloatUtil.isZero(border_thickness); } + + /** Returns the border thickness, see {@link #setBorder(float)}. */ + public final float getBorderThickness() { return border_thickness; } /** * Clears all data and reset all states as if this instance was newly created @@ -760,9 +762,7 @@ public abstract class Shape { return this.winToShapeCoord(scene.getPMVMatrixSetup(), scene.getViewport(), glWinX, glWinY, pmv, objPos); } - public Vec4f getColor() { - return rgbaColor; - } + public Vec4f getColor() { return rgbaColor; } /** * Set base color. @@ -776,6 +776,17 @@ public abstract class Shape { } /** + * Set base color. + * <p> + * Default base-color w/o color channel, will be modulated w/ pressed- and toggle color + * </p> + */ + public final Shape setColor(final Vec4f c) { + this.rgbaColor.set(c); + return this; + } + + /** * Set pressed color. * <p> * Default pressed color-factor w/o color channel, modulated base-color. 0.75 * 1.2 = 0.9 @@ -808,6 +819,20 @@ public abstract class Shape { return this; } + public Vec4f getBorderColor() { return borderColor; } + + /** Set border color. */ + public final Shape setBorderColor(final float r, final float g, final float b, final float a) { + this.borderColor.set(r, g, b, a); + return this; + } + + /** Set border color. */ + public final Shape setBorderColor(final Vec4f c) { + this.borderColor.set(c); + return this; + } + @Override public final String toString() { return getClass().getSimpleName()+"["+getSubString()+"]"; diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/BaseButton.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/BaseButton.java index 7c1997d2d..a4d0ee67a 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/shapes/BaseButton.java +++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/BaseButton.java @@ -29,6 +29,8 @@ package com.jogamp.graph.ui.shapes; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.ui.GraphShape; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GLProfile; /** * An abstract GraphUI base filled button {@link GraphShape}, @@ -97,10 +99,15 @@ public class BaseButton extends GraphShape { } @Override - protected void addShapeToRegion() { - addBaseShapeToRegion(0f); + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { + final OutlineShape shape = createBaseShape(0f); + updateGLRegion(glp, gl, null, shape); + region.addOutlineShape(shape, null, rgbaColor); + box.resize(shape.getBounds()); + setRotationPivot( box.getCenter() ); } - protected OutlineShape addBaseShapeToRegion(final float zOffset) { + + protected OutlineShape createBaseShape(final float zOffset) { final OutlineShape shape = new OutlineShape(); if(corner == 0.0f) { createSharpOutline(shape, zOffset); @@ -109,11 +116,8 @@ public class BaseButton extends GraphShape { } shape.setIsQuadraticNurbs(); shape.setSharpness(oshapeSharpness); - region.addOutlineShape(shape, null, rgbaColor); - box.resize(shape.getBounds()); - setRotationPivot( box.getCenter() ); if( DEBUG_DRAW ) { - System.err.println("GraphShape.RoundButton: Added Shape: "+shape+", "+box); + System.err.println("GraphShape.RoundButton: Shape: "+shape+", "+box); } return shape; } diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java index a19a58003..3473c2c68 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java +++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java @@ -31,8 +31,8 @@ import com.jogamp.opengl.GL2ES2; import com.jogamp.opengl.GLProfile; import com.jogamp.graph.curve.OutlineShape; 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.TextRegionUtil; import com.jogamp.graph.font.Font; import com.jogamp.graph.geom.plane.AffineTransform; import com.jogamp.graph.ui.GraphShape; @@ -97,20 +97,17 @@ public class Button extends BaseButton { } @Override - protected GLRegion createGLRegion(final GLProfile glp) { - final int[] vertIndexCount = { 0, 0 }; - final Font.GlyphVisitor2 visitor = new Font.GlyphVisitor2() { - @Override - public final void visit(final char symbol, final Font.Glyph glyph) { - Region.countOutlineShape(glyph.getShape(), vertIndexCount); - } }; - this.label.getFont().processString(visitor, this.label.getText()); - return GLRegion.create(glp, renderModes, null, 16+vertIndexCount[0], 16+vertIndexCount[1]); - } + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { + final OutlineShape shape = createBaseShape( FloatUtil.isZero(labelZOffset) ? 0f : -labelZOffset ); + box.resize(shape.getBounds()); + setRotationPivot( box.getCenter() ); - @Override - protected void addShapeToRegion() { - addBaseShapeToRegion( FloatUtil.isZero(labelZOffset) ? 0f : -labelZOffset ); + // Sum Region buffer size of base-shape + text + final int[/*2*/] vertIndexCount = Region.countOutlineShape(shape, new int[2]); + TextRegionUtil.countStringRegion(label.getFont(), label.getText(), vertIndexCount); + updateGLRegion(glp, gl, null, vertIndexCount[0], vertIndexCount[1]); + + region.addOutlineShape(shape, null, rgbaColor); // Precompute text-box size .. guessing pixelSize final float lw = box.getWidth() * ( 1f - spacingX ) ; diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/CrossHair.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/CrossHair.java index f0c6b1369..bd088c90e 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/shapes/CrossHair.java +++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/CrossHair.java @@ -29,6 +29,8 @@ package com.jogamp.graph.ui.shapes; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.ui.GraphShape; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GLProfile; /** * A GraphUI Crosshair {@link GraphShape} @@ -58,7 +60,7 @@ public class CrossHair extends GraphShape { } @Override - protected void addShapeToRegion() { + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { final OutlineShape shape = new OutlineShape(); final float lwh = lineWidth/2f; @@ -87,9 +89,11 @@ public class CrossHair extends GraphShape { shape.setIsQuadraticNurbs(); shape.setSharpness(oshapeSharpness); - region.addOutlineShape(shape, null, rgbaColor); + updateGLRegion(glp, gl, null, shape); + region.addOutlineShape(shape, null, rgbaColor); box.resize(shape.getBounds()); + setRotationPivot( box.getCenter() ); } @Override diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/GlyphShape.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/GlyphShape.java index 568270073..dd4398c63 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/shapes/GlyphShape.java +++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/GlyphShape.java @@ -36,6 +36,7 @@ import com.jogamp.graph.font.Font; import com.jogamp.graph.font.Font.Glyph; import com.jogamp.graph.geom.plane.AffineTransform; import com.jogamp.graph.ui.GraphShape; +import com.jogamp.opengl.GL2ES2; import com.jogamp.opengl.GLProfile; import com.jogamp.opengl.math.Vec3f; import com.jogamp.opengl.math.geom.AABBox; @@ -52,6 +53,8 @@ import com.jogamp.opengl.util.texture.TextureSequence; public class GlyphShape extends GraphShape { private final char symbol; private final Glyph glyph; + private final int regionVertCount; + private final int regionIdxCount; private final Vec3f origPos; /** @@ -71,6 +74,9 @@ public class GlyphShape extends GraphShape { if( glyph.isWhiteSpace() || null == glyph.getShape() ) { setEnabled(false); } + final int[/*2*/] vertIndexCount = Region.countOutlineShape(glyph.getShape(), new int[2]); + regionVertCount = vertIndexCount[0]; + regionIdxCount = vertIndexCount[1]; } /** @@ -82,13 +88,7 @@ public class GlyphShape extends GraphShape { * @param y the intended unscaled Y position of this Glyph, e.g. if part of a string - otherwise use zero. */ public GlyphShape(final int renderModes, final Font font, final char symbol, final float x, final float y) { - super(renderModes); - this.symbol = symbol; - this.glyph = font.getGlyph( font.getGlyphID(symbol) ); - this.origPos = new Vec3f(x, y, 0f); - if( glyph.isWhiteSpace() || null == glyph.getShape() ) { - setEnabled(false); - } + this(renderModes, symbol, font.getGlyph( font.getGlyphID(symbol) ), x, y); } /** Returns the char symbol to be rendered. */ @@ -181,7 +181,7 @@ public class GlyphShape extends GraphShape { } @Override - protected void addShapeToRegion() { + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { final OutlineShape shape = glyph.getShape(); box.reset(); if( null != shape ) { @@ -191,9 +191,11 @@ public class GlyphShape extends GraphShape { // but keep the underline (decline) intact! tmp.setToTranslation(-sbox.getMinX(), -sbox.getMinY() + glyph.getBounds().getMinY()); shape.setSharpness(oshapeSharpness); + + updateGLRegion(glp, gl, null, regionVertCount, regionIdxCount); region.addOutlineShape(shape, tmp, rgbaColor); - setRotationPivot( sbox.getCenter() ); box.resize(tmp.transform(sbox, new AABBox())); + setRotationPivot( box.getCenter() ); } } diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/Label.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/Label.java index 50b53e6f5..c270903d9 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/shapes/Label.java +++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/Label.java @@ -31,8 +31,8 @@ import com.jogamp.opengl.GL2ES2; import com.jogamp.opengl.GLProfile; import com.jogamp.opengl.math.geom.AABBox; 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.TextRegionUtil; import com.jogamp.graph.font.Font; import com.jogamp.graph.font.Font.Glyph; import com.jogamp.graph.geom.plane.AffineTransform; @@ -190,11 +190,6 @@ public class Label extends GraphShape { } } - @Override - protected GLRegion createGLRegion(final GLProfile glp) { - return GLRegion.create(glp, getRenderModes(), null, font, text); - } - private final Font.GlyphVisitor glyphVisitor = new Font.GlyphVisitor() { @Override public void visit(final char symbol, final Glyph glyph, final AffineTransform t) { @@ -208,7 +203,10 @@ public class Label extends GraphShape { }; @Override - protected void addShapeToRegion() { + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { + final int[] vertIndCount = TextRegionUtil.countStringRegion(font, text, new int[2]); + updateGLRegion(glp, gl, null, vertIndCount[0], vertIndCount[1]); + AABBox fbox = font.getGlyphBounds(text, tempT2, tempT3); tempT1.setToScale(fontScale, fontScale); tempT1.translate(-fbox.getMinX(), -fbox.getMinY(), tempT2); // enforce bottom-left origin @ 0/0 for good drag-zoom experience diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/Rectangle.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/Rectangle.java index dd6a272cb..d11e3bdb1 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/shapes/Rectangle.java +++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/Rectangle.java @@ -29,6 +29,8 @@ package com.jogamp.graph.ui.shapes; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.ui.GraphShape; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GLProfile; /** * A GraphUI Rectangle {@link GraphShape} @@ -58,7 +60,7 @@ public class Rectangle extends GraphShape { } @Override - protected void addShapeToRegion() { + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { final OutlineShape shape = new OutlineShape(); final float x1 = 0f; final float y1 = 0f; @@ -88,8 +90,11 @@ public class Rectangle extends GraphShape { } shape.setIsQuadraticNurbs(); shape.setSharpness(oshapeSharpness); + + updateGLRegion(glp, gl, null, shape); region.addOutlineShape(shape, null, rgbaColor); box.resize(shape.getBounds()); + setRotationPivot( box.getCenter() ); } @Override diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java index 4768b4974..86cff4dae 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java +++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java @@ -27,10 +27,10 @@ */ package com.jogamp.graph.ui.shapes; +import com.jogamp.opengl.GL2ES2; import com.jogamp.opengl.GLProfile; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.curve.Region; -import com.jogamp.graph.curve.opengl.GLRegion; import com.jogamp.graph.ui.GraphShape; import com.jogamp.opengl.util.texture.TextureSequence; @@ -53,15 +53,14 @@ public abstract class TexSeqButton extends BaseButton { this.texSeq = texSeq; } - @Override - protected GLRegion createGLRegion(final GLProfile glp) { - return GLRegion.create(glp, getRenderModes(), texSeq); - } - public final TextureSequence getTextureSequence() { return this.texSeq; } @Override - protected void addShapeToRegion() { - addBaseShapeToRegion( 0f ); + protected void addShapeToRegion(final GLProfile glp, final GL2ES2 gl) { + final OutlineShape shape = createBaseShape(0f); + updateGLRegion(glp, gl, texSeq, shape); + region.addOutlineShape(shape, null, rgbaColor); + box.resize(shape.getBounds()); + setRotationPivot( box.getCenter() ); } } diff --git a/src/graphui/classes/jogamp/graph/ui/shapes/Label0.java b/src/graphui/classes/jogamp/graph/ui/shapes/Label0.java index 1eafcd58c..e5f7dd26c 100644 --- a/src/graphui/classes/jogamp/graph/ui/shapes/Label0.java +++ b/src/graphui/classes/jogamp/graph/ui/shapes/Label0.java @@ -73,7 +73,7 @@ public class Label0 { { tmp1.setToTranslation(txy.x(), txy.y()); tmp1.scale(scale, scale, tmp2); - return TextRegionUtil.addStringToRegion(region, font, tmp1, text, rgbaColor, tmp2, tmp3); + return TextRegionUtil.addStringToRegion(false, region, font, tmp1, text, rgbaColor, tmp2, tmp3); } @Override |