From 7a2f6bfdfadcaba1d6fecc2389ba7b91e927104a Mon Sep 17 00:00:00 2001
From: Sven Gothel
Date: Wed, 19 Apr 2023 20:39:10 +0200
Subject: GraphUI {Round->Base}Button, denoting perpendicular or round corners
(aka rectangle or oval shape)
- Button + BaseButton setter also pass this for chaining
- Button {twoPassLabel->label}ZOffset, investigate whether z-offset still required (not if blending is enabled!)
-
---
.../com/jogamp/graph/ui/shapes/BaseButton.java | 167 +++++++++++++++++++++
.../classes/com/jogamp/graph/ui/shapes/Button.java | 36 +++--
.../com/jogamp/graph/ui/shapes/RoundButton.java | 153 -------------------
.../com/jogamp/graph/ui/shapes/TexSeqButton.java | 6 +-
4 files changed, 193 insertions(+), 169 deletions(-)
create mode 100644 src/graphui/classes/com/jogamp/graph/ui/shapes/BaseButton.java
delete mode 100644 src/graphui/classes/com/jogamp/graph/ui/shapes/RoundButton.java
(limited to 'src/graphui/classes/com')
diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/BaseButton.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/BaseButton.java
new file mode 100644
index 000000000..7c1997d2d
--- /dev/null
+++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/BaseButton.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright 2010-2023 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.graph.ui.shapes;
+
+import com.jogamp.graph.curve.OutlineShape;
+import com.jogamp.graph.ui.GraphShape;
+
+/**
+ * An abstract GraphUI base filled button {@link GraphShape},
+ * usually used as a backdrop or base shape for more informative button types.
+ *
+ * GraphUI is GPU based and resolution independent.
+ *
+ *
+ * This button is rendered with a round oval shape {@link #ROUND_CORNER by default},
+ * but can be set to {@link #PERP_CORNER rectangular shape}.
+ *
+ */
+public class BaseButton extends GraphShape {
+
+ /** {@link #setCorner(float) Round corner}, value {@value}. This is the default value. */
+ public static final float ROUND_CORNER = 1f;
+ /** {@link #setCorner(float) Perpendicular corner} for a rectangular shape, value {@value}. */
+ public static final float PERP_CORNER = 0f;
+
+ protected float width;
+ protected float height;
+ protected float corner = ROUND_CORNER;
+
+ public BaseButton(final int renderModes, final float width, final float height) {
+ super(renderModes);
+ this.width = width;
+ this.height = height;
+ }
+
+ public final float getWidth() { return width; }
+
+ public final float getHeight() { return height; }
+
+ public final float getCorner() { return corner; }
+
+ /**
+ * Set corner size with range [0.01 .. 1.00] for round corners
+ * or `zero` for perpendicular corners.
+ *
+ * , default is {@link #ROUND_CORNER round corner},
+ * alternative a {@link #PERP_CORNER perpendicular corner} for a rectangular shape is available.
+ *
+ * @see #ROUND_CORNER
+ * @see #PERP_CORNER
+ */
+ public BaseButton setCorner(final float corner) {
+ if( 0.01f <= corner && corner <= 1.0f ) {
+ this.corner = corner;
+ }
+ if( corner > 1.0f ){
+ this.corner = 1.0f;
+ } else if( corner < 0.01f ){
+ this.corner = 0.0f;
+ } else {
+ this.corner = corner;
+ }
+ markShapeDirty();
+ return this;
+ }
+
+ public BaseButton setSize(final float width, final float height) {
+ this.width = width;
+ this.height = height;
+ markShapeDirty();
+ return this;
+ }
+
+ @Override
+ protected void addShapeToRegion() {
+ addBaseShapeToRegion(0f);
+ }
+ protected OutlineShape addBaseShapeToRegion(final float zOffset) {
+ final OutlineShape shape = new OutlineShape();
+ if(corner == 0.0f) {
+ createSharpOutline(shape, zOffset);
+ } else {
+ createCurvedOutline(shape, zOffset);
+ }
+ 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);
+ }
+ return shape;
+ }
+
+ protected void createSharpOutline(final OutlineShape shape, final float zOffset) {
+ final float tw = getWidth();
+ final float th = getHeight();
+
+ final float minX = 0;
+ final float minY = 0;
+ final float minZ = zOffset;
+
+ shape.addVertex(minX, minY, minZ, true);
+ shape.addVertex(minX+tw, minY, minZ, true);
+ shape.addVertex(minX+tw, minY + th, minZ, true);
+ shape.addVertex(minX, minY + th, minZ, true);
+ shape.closeLastOutline(true);
+ }
+
+ protected void createCurvedOutline(final OutlineShape shape, final float zOffset) {
+ final float tw = getWidth();
+ final float th = getHeight();
+ final float dC = 0.5f*corner*Math.min(tw, th);
+
+ final float minX = 0;
+ final float minY = 0;
+ final float minZ = zOffset;
+
+ shape.addVertex(minX, minY + dC, minZ, true);
+ shape.addVertex(minX, minY, minZ, false);
+
+ shape.addVertex(minX + dC, minY, minZ, true);
+
+ shape.addVertex(minX + tw - dC, minY, minZ, true);
+ shape.addVertex(minX + tw, minY, minZ, false);
+ shape.addVertex(minX + tw, minY + dC, minZ, true);
+ shape.addVertex(minX + tw, minY + th- dC, minZ, true);
+ shape.addVertex(minX + tw, minY + th, minZ, false);
+ shape.addVertex(minX + tw - dC, minY + th, minZ, true);
+ shape.addVertex(minX + dC, minY + th, minZ, true);
+ shape.addVertex(minX, minY + th, minZ, false);
+ shape.addVertex(minX, minY + th - dC, minZ, true);
+
+ shape.closeLastOutline(true);
+ }
+
+ @Override
+ public String getSubString() {
+ return super.getSubString()+", dim "+getWidth() + " x " + getHeight() + ", corner " + corner;
+ }
+}
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 0f754d32a..c1be8064d 100644
--- a/src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java
+++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java
@@ -35,6 +35,7 @@ import com.jogamp.graph.curve.opengl.RegionRenderer;
import com.jogamp.graph.font.Font;
import com.jogamp.graph.geom.plane.AffineTransform;
import com.jogamp.graph.ui.GraphShape;
+import com.jogamp.opengl.math.FloatUtil;
import com.jogamp.opengl.math.Vec2f;
import com.jogamp.opengl.math.Vec3f;
import com.jogamp.opengl.math.Vec4f;
@@ -43,7 +44,7 @@ import com.jogamp.opengl.math.geom.AABBox;
import jogamp.graph.ui.shapes.Label0;
/**
- * A GraphUI text labeled {@link RoundButton} {@link GraphShape}
+ * A GraphUI text labeled {@link BaseButton} {@link GraphShape}
*
* GraphUI is GPU based and resolution independent.
*
@@ -52,14 +53,14 @@ import jogamp.graph.ui.shapes.Label0;
* To render it rectangular, {@link #setCorner(float)} to zero.
*
*/
-public class Button extends RoundButton {
+public class Button extends BaseButton {
/** {@value} */
public static final float DEFAULT_SPACING_X = 0.12f;
/** {@value} */
public static final float DEFAULT_SPACING_Y = 0.42f;
- private static final float DEFAULT_2PASS_LABEL_ZOFFSET = -0.005f; // -0.05f;
- private float twoPassLabelZOffset = DEFAULT_2PASS_LABEL_ZOFFSET;
+ private static final float DEFAULT_LABEL_ZOFFSET = 0.005f; // 0.05f;
+ private float labelZOffset;
private final Label0 label;
private float spacingX = DEFAULT_SPACING_X;
@@ -73,6 +74,7 @@ public class Button extends RoundButton {
final String labelText, final float width,
final float height) {
super(renderModes | Region.COLORCHANNEL_RENDERING_BIT, width, height);
+ this.labelZOffset = DEFAULT_LABEL_ZOFFSET;
this.label = new Label0(labelFont, labelText, new Vec4f( 1.33f, 1.33f, 1.33f, 1.0f )); // 0.75 * 1.33 = 1.0
setColor(0.75f, 0.75f, 0.75f, 1.0f);
setPressedColorMod(0.9f, 0.9f, 0.9f, 0.7f);
@@ -85,6 +87,7 @@ public class Button extends RoundButton {
@Override
public void draw(final GL2ES2 gl, final RegionRenderer renderer, final int[] sampleCount) {
+ // No need to setup an poly offset for z-fighting, using one region now
// Setup poly offset for z-fighting
// gl.glEnable(GL.GL_POLYGON_OFFSET_FILL);
// gl.glPolygonOffset(0f, 1f);
@@ -94,12 +97,13 @@ public class Button extends RoundButton {
@Override
protected void addShapeToRegion() {
- addRoundShapeToRegion( twoPassLabelZOffset );
+ addBaseShapeToRegion( FloatUtil.isZero(labelZOffset) ? 0f : -labelZOffset );
// Precompute text-box size .. guessing pixelSize
final float lw = box.getWidth() * ( 1f - spacingX ) ;
final float lh = box.getHeight() * ( 1f - spacingY ) ;
final AABBox lbox0_em = label.getFont().getGlyphBounds(label.getText(), tempT1, tempT2);
+ // final AABBox lbox0_em = label.getFont().getGlyphShapeBounds(null, label.getText(), tempT1, tempT2);
final float lsx = lw / lbox0_em.getWidth();
final float lsy = lh / lbox0_em.getHeight();
final float lScale = lsx < lsy ? lsx : lsy;
@@ -127,11 +131,12 @@ public class Button extends RoundButton {
}
}
- public float get2PassLabelZOffset() { return twoPassLabelZOffset; }
+ public float getLabelZOffset() { return labelZOffset; }
- public void set2PassLabelZOffset(final float v) {
- twoPassLabelZOffset = v;
+ public Button setLabelZOffset(final float v) {
+ labelZOffset = v;
markShapeDirty();
+ return this;
}
public final float getSpacingX() { return spacingX; }
@@ -142,7 +147,7 @@ public class Button extends RoundButton {
* @param spacingX spacing in percent on X, default is {@link #DEFAULT_SPACING_X}
* @param spacingY spacing in percent on Y, default is {@link #DEFAULT_SPACING_Y}
*/
- public final void setSpacing(final float spacingX, final float spacingY) {
+ public final Button setSpacing(final float spacingX, final float spacingY) {
if ( spacingX < 0.0f ) {
this.spacingX = 0.0f;
} else if ( spacingX > 1.0f ) {
@@ -158,35 +163,40 @@ public class Button extends RoundButton {
this.spacingY = spacingY;
}
markShapeDirty();
+ return this;
}
public final Vec4f getLabelColor() {
return label.getColor();
}
- public final void setLabelColor(final float r, final float g, final float b) {
+ public final Button setLabelColor(final float r, final float g, final float b) {
label.setColor(r, g, b, 1.0f);
markShapeDirty();
+ return this;
}
- public final void setFont(final Font labelFont) {
+ public final Button setFont(final Font labelFont) {
if( !label.getFont().equals(labelFont) ) {
label.setFont(labelFont);
markShapeDirty();
}
+ return this;
}
- public final void setLabel(final String labelText) {
+ public final Button setLabel(final String labelText) {
if( !label.getText().equals(labelText) ) {
label.setText(labelText);
markShapeDirty();
}
+ return this;
}
- public final void setLabel(final Font labelFont, final String labelText) {
+ public final Button setLabel(final Font labelFont, final String labelText) {
if( !label.getText().equals(labelText) || !label.getFont().equals(labelFont) ) {
label.setFont(labelFont);
label.setText(labelText);
markShapeDirty();
}
+ return this;
}
@Override
diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/RoundButton.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/RoundButton.java
deleted file mode 100644
index 672d99c3e..000000000
--- a/src/graphui/classes/com/jogamp/graph/ui/shapes/RoundButton.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * Copyright 2010-2023 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.graph.ui.shapes;
-
-import com.jogamp.graph.curve.OutlineShape;
-import com.jogamp.graph.ui.GraphShape;
-
-/**
- * An abstract GraphUI round Button {@link GraphShape}
- *
- * GraphUI is GPU based and resolution independent.
- *
- *
- * This button is rendered with a round oval shape.
- * To render it rectangular, {@link #setCorner(float)} to zero.
- *
- */
-public class RoundButton extends GraphShape {
-
- /** {@value} */
- public static final float DEFAULT_CORNER = 1f;
- protected float width;
- protected float height;
- protected float corner = DEFAULT_CORNER;
-
- public RoundButton(final int renderModes, final float width, final float height) {
- super(renderModes);
- this.width = width;
- this.height = height;
- }
-
- public final float getWidth() { return width; }
-
- public final float getHeight() { return height; }
-
- public final float getCorner() { return corner; }
-
- public RoundButton setSize(final float width, final float height) {
- this.width = width;
- this.height = height;
- markShapeDirty();
- return this;
- }
-
- @Override
- protected void addShapeToRegion() {
- addRoundShapeToRegion(0f);
- }
- protected OutlineShape addRoundShapeToRegion(final float zOffset) {
- final OutlineShape shape = new OutlineShape();
- if(corner == 0.0f) {
- createSharpOutline(shape, zOffset);
- } else {
- createCurvedOutline(shape, zOffset);
- }
- 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);
- }
- return shape;
- }
-
- protected void createSharpOutline(final OutlineShape shape, final float zOffset) {
- final float tw = getWidth();
- final float th = getHeight();
-
- final float minX = 0;
- final float minY = 0;
- final float minZ = zOffset;
-
- shape.addVertex(minX, minY, minZ, true);
- shape.addVertex(minX+tw, minY, minZ, true);
- shape.addVertex(minX+tw, minY + th, minZ, true);
- shape.addVertex(minX, minY + th, minZ, true);
- shape.closeLastOutline(true);
- }
-
- protected void createCurvedOutline(final OutlineShape shape, final float zOffset) {
- final float tw = getWidth();
- final float th = getHeight();
- final float dC = 0.5f*corner*Math.min(tw, th);
-
- final float minX = 0;
- final float minY = 0;
- final float minZ = zOffset;
-
- shape.addVertex(minX, minY + dC, minZ, true);
- shape.addVertex(minX, minY, minZ, false);
-
- shape.addVertex(minX + dC, minY, minZ, true);
-
- shape.addVertex(minX + tw - dC, minY, minZ, true);
- shape.addVertex(minX + tw, minY, minZ, false);
- shape.addVertex(minX + tw, minY + dC, minZ, true);
- shape.addVertex(minX + tw, minY + th- dC, minZ, true);
- shape.addVertex(minX + tw, minY + th, minZ, false);
- shape.addVertex(minX + tw - dC, minY + th, minZ, true);
- shape.addVertex(minX + dC, minY + th, minZ, true);
- shape.addVertex(minX, minY + th, minZ, false);
- shape.addVertex(minX, minY + th - dC, minZ, true);
-
- shape.closeLastOutline(true);
- }
-
- /** Set corner size, default is {@link #DEFAULT_CORNER} */
- public RoundButton setCorner(final float corner) {
- if(corner > 1.0f){
- this.corner = 1.0f;
- }
- else if(corner < 0.01f){
- this.corner = 0.0f;
- }
- else{
- this.corner = corner;
- }
- markShapeDirty();
- return this;
- }
-
- @Override
- public String getSubString() {
- return super.getSubString()+", dim "+getWidth() + " x " + getHeight() + ", corner " + corner;
- }
-}
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 87a86e706..4768b4974 100644
--- a/src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java
+++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java
@@ -35,7 +35,7 @@ import com.jogamp.graph.ui.GraphShape;
import com.jogamp.opengl.util.texture.TextureSequence;
/**
- * An abstract GraphUI {@link TextureSequence} {@link RoundButton} {@link GraphShape}.
+ * An abstract GraphUI {@link TextureSequence} {@link BaseButton} {@link GraphShape}.
*
* GraphUI is GPU based and resolution independent.
*
@@ -44,7 +44,7 @@ import com.jogamp.opengl.util.texture.TextureSequence;
* To render it rectangular, {@link #setCorner(float)} to zero.
*
*/
-public abstract class TexSeqButton extends RoundButton {
+public abstract class TexSeqButton extends BaseButton {
protected final TextureSequence texSeq;
public TexSeqButton(final int renderModes, final float width,
@@ -62,6 +62,6 @@ public abstract class TexSeqButton extends RoundButton {
@Override
protected void addShapeToRegion() {
- addRoundShapeToRegion( 0f );
+ addBaseShapeToRegion( 0f );
}
}
--
cgit v1.2.3