aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2023-04-20 22:00:11 +0200
committerSven Gothel <[email protected]>2023-04-20 22:00:11 +0200
commit2aae33b94cea15b2fc0c54479277611c67cdaf13 (patch)
treee1956d8361fd1ef6860c50f0a0aa8aab6b5ce612 /src
parentc21082a5d7caf0ae6e29144358b4b4a1eafec019 (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')
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/UISceneDemo12.java9
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/UITypeDemo01.java2
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph01UbuntuLight_o.java8
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph02UbuntuLight_ae.java8
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph03FreeMonoRegular_M.java8
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph04FreeSans_0.java8
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph05FreeSerifBoldItalic_ae.java8
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/GraphShape.java75
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/Group.java4
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/Scene.java8
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/Shape.java51
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/BaseButton.java18
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java25
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/CrossHair.java8
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/GlyphShape.java20
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/Label.java12
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/Rectangle.java7
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java15
-rw-r--r--src/graphui/classes/jogamp/graph/ui/shapes/Label0.java2
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