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