diff options
author | Sven Gothel <[email protected]> | 2023-09-30 01:42:23 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-09-30 01:42:23 +0200 |
commit | 4b8574c63e100f0ef8bb2ad292d71f612e6cfceb (patch) | |
tree | 7e430c2d39b0d8e2d7b6df1b846e622a1369ab9f /src/graphui/classes/com | |
parent | 972682a9247d3b4e8deb07b4ac1867d090f5ffff (diff) |
Bug 1454 + Bug 1464: Maintain a Shape local 'zOffset' and only consider it for sorting w/o actually modifying the position (enogh to be painted on top and for selection)
Also use a simplified comparison using only float relational operations w/o NaN/Inf bit-stuff or epsilon,
as it should be accurate enough for this cause.
This shall also resolve Bug 1454, as we no more modify the position directly
but the local zOffset field .. but this has to be seen (data race).
Diffstat (limited to 'src/graphui/classes/com')
-rw-r--r-- | src/graphui/classes/com/jogamp/graph/ui/Scene.java | 26 | ||||
-rw-r--r-- | src/graphui/classes/com/jogamp/graph/ui/Shape.java | 52 |
2 files changed, 43 insertions, 35 deletions
diff --git a/src/graphui/classes/com/jogamp/graph/ui/Scene.java b/src/graphui/classes/com/jogamp/graph/ui/Scene.java index 305b9babc..22eb653de 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/Scene.java +++ b/src/graphui/classes/com/jogamp/graph/ui/Scene.java @@ -917,28 +917,19 @@ public final class Scene implements Container, GLEventListener { public void releaseActiveShape() { if( null != activeShape ) { - if( !FloatUtil.isZero(lastActiveZOffset) ) { - activeShape.move(0, 0, -lastActiveZOffset); - lastActiveZOffset = 0f; - } - activeShape.setActive(false); + activeShape.setActive(false, 0); activeShape = null; } } private void setActiveShape(final Shape shape) { if( activeShape != shape ) { releaseActiveShape(); - lastActiveZOffset = activeZOffsetScale * getZEpsilon(16); - if( null != shape && !FloatUtil.isZero(lastActiveZOffset) ) { - shape.move(0, 0, +lastActiveZOffset); + if( null != shape ) { + shape.setActive(true, activeZOffsetScale * getZEpsilon(16)); } + activeShape = shape; } - if( null != shape ) { - shape.setActive(true); - } - activeShape = shape; } - private float lastActiveZOffset = 0f; private float activeZOffsetScale = 10f; /** Returns the active {@link Shape} Z-Offset scale, defaults to {@code 10.0}. */ @@ -989,16 +980,19 @@ public final class Scene implements Container, GLEventListener { * @param glWinX in GL window coordinates, origin bottom-left * @param glWinY in GL window coordinates, origin bottom-left */ - final void dispatchMouseEventPickShape(final MouseEvent e, final int glWinX, final int glWinY) { + final boolean dispatchMouseEventPickShape(final MouseEvent e, final int glWinX, final int glWinY) { final PMVMatrix4f pmv = new PMVMatrix4f(); final Vec3f objPos = new Vec3f(); final Shape[] shape = { null }; - if( null == pickShape(pmv, glWinX, glWinY, objPos, shape, () -> { - setActiveShape(shape[0]); + if( null != pickShape(pmv, glWinX, glWinY, objPos, shape, () -> { shape[0].dispatchMouseEvent(e, glWinX, glWinY, objPos); } ) ) { + setActiveShape(shape[0]); + return true; + } else { releaseActiveShape(); + return false; } } /** diff --git a/src/graphui/classes/com/jogamp/graph/ui/Shape.java b/src/graphui/classes/com/jogamp/graph/ui/Shape.java index 0244b2876..001f4295f 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/Shape.java +++ b/src/graphui/classes/com/jogamp/graph/ui/Shape.java @@ -129,6 +129,7 @@ public abstract class Shape { protected final AABBox box; private final Vec3f position = new Vec3f(); + private float zOffset = 0; private final Quaternion rotation = new Quaternion(); private Vec3f rotPivot = null; private final Vec3f scale = new Vec3f(1f, 1f, 1f); @@ -1202,7 +1203,8 @@ public abstract class Shape { /** Returns true this shape's toggle state. */ public final boolean isToggleOn() { return isIO(IO_TOGGLE); } - protected final void setActive(final boolean v) { + protected final void setActive(final boolean v, final float zOffset) { + this.zOffset = zOffset; setIO(IO_ACTIVE, v); if( null != onActivationListener ) { onActivationListener.run(this); @@ -1614,32 +1616,44 @@ public abstract class Shape { */ public abstract boolean hasColorChannel(); + public final float getAscendingZ() { + return getScaledMinZ() + position.z() + zOffset; + } + public final float getDescendingZ() { + return getScaledMinZ() + position.z() + zOffset; + } + + private static int compare0(final float a, final float b) { + if( FloatUtil.isEqual2(a, b) ) { + return 0; + } else if( a < b ){ + return -1; + } else { + return 1; + } + } + private static int compare1(final float a, final float b) { + if (a < b) { + return -1; // Neither is NaN, a is smaller + } + if (a > b) { + return 1; // Neither is NaN, a is larger + } + return 0; + } + public static Comparator<Shape> ZAscendingComparator = new Comparator<Shape>() { @Override public int compare(final Shape s1, final Shape s2) { - final float s1Z = s1.getScaledMinZ()+s1.getPosition().z(); - final float s2Z = s2.getScaledMinZ()+s2.getPosition().z(); - if( FloatUtil.isEqual2(s1Z, s2Z) ) { - return 0; - } else if( s1Z < s2Z ){ - return -1; - } else { - return 1; - } + return compare1( s1.getAscendingZ(), s2.getAscendingZ() ); + // return Float.compare( s1.getAscendingZ(), s2.getAscendingZ() ); } }; public static Comparator<Shape> ZDescendingComparator = new Comparator<Shape>() { @Override public int compare(final Shape s1, final Shape s2) { - final float s1Z = s1.getScaledMinZ()+s1.getPosition().z(); - final float s2Z = s2.getScaledMinZ()+s2.getPosition().z(); - if( FloatUtil.isEqual2(s1Z, s2Z) ) { - return 0; - } else if( s1Z < s2Z ){ - return 1; - } else { - return -1; - } + return compare1( s2.getDescendingZ(), s1.getDescendingZ() ); + // return Float.compare( s2.getDescendingZ(), s1.getDescendingZ() ); } }; // |