diff options
author | Sven Gothel <[email protected]> | 2023-03-20 21:32:54 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-03-20 21:32:54 +0100 |
commit | 8abe939c5132e4a58c4b9a6b31f0b1fd10734516 (patch) | |
tree | 5db344e61d8c5c39ed322bb519847f22a70bee5a /src | |
parent | 118d754af34d6d475600e6747e01e950a6cf77cf (diff) |
GraphUI Shape/Label: Allow validate(..) w/o current GL context, used by e.g. Label.setText(..) and getBounds(), preparations for more animation.
Hence Shape.validate(..) is now synchronized, avoiding parallel resource modding from render- and other animating thread.
Diffstat (limited to 'src')
-rw-r--r-- | src/graphui/classes/com/jogamp/graph/ui/gl/Shape.java | 53 | ||||
-rw-r--r-- | src/graphui/classes/com/jogamp/graph/ui/gl/shapes/Label.java | 36 |
2 files changed, 76 insertions, 13 deletions
diff --git a/src/graphui/classes/com/jogamp/graph/ui/gl/Shape.java b/src/graphui/classes/com/jogamp/graph/ui/gl/Shape.java index 7928d09f4..1876b8057 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/gl/Shape.java +++ b/src/graphui/classes/com/jogamp/graph/ui/gl/Shape.java @@ -28,6 +28,7 @@ package com.jogamp.graph.ui.gl; import java.util.ArrayList; +import java.util.List; import com.jogamp.nativewindow.NativeWindowException; import com.jogamp.opengl.GL2ES2; @@ -94,6 +95,7 @@ public abstract class Shape { protected GLRegion region = null; protected int regionQuality = Region.MAX_QUALITY; + protected List<GLRegion> dirtyRegions = new ArrayList<GLRegion>(); protected int dirty = DIRTY_SHAPE | DIRTY_STATE; protected float shapesSharpness = OutlineShape.DEFAULT_SHARPNESS; @@ -137,6 +139,13 @@ public abstract class Shape { /** Enable or disable this shape, i.e. its visibility. */ public final void setEnabled(final boolean v) { enabled = v; } + private final void clearDirtyRegions(final GL2ES2 gl) { + for(final GLRegion r : dirtyRegions) { + r.destroy(gl); + } + dirtyRegions.clear(); + } + /** * Clears all data and reset all states as if this instance was newly created * @param gl TODO @@ -144,6 +153,10 @@ public abstract class Shape { */ public final void clear(final GL2ES2 gl, final RegionRenderer renderer) { clearImpl(gl, renderer); + clearDirtyRegions(gl); + if( null != region ) { + region.clear(gl); + } position[0] = 0f; position[1] = 0f; position[2] = 0f; @@ -165,6 +178,11 @@ public abstract class Shape { */ public final void destroy(final GL2ES2 gl, final RegionRenderer renderer) { destroyImpl(gl, renderer); + clearDirtyRegions(gl); + if( null != region ) { + region.destroy(gl); + region = null; + } position[0] = 0f; position[1] = 0f; position[2] = 0f; @@ -296,10 +314,7 @@ public abstract class Shape { * @see #getBounds() */ public final AABBox getBounds(final GLProfile glp) { - if( null == region ) { - // initial creation of region, producing a valid box - validateImpl(glp, null); - } + validate(glp); return box; } @@ -387,21 +402,39 @@ public abstract class Shape { /** * Validates the shape's underlying {@link GLRegion}. - * - * @param gl + * <p> + * If the region is dirty, it gets {@link GLRegion#clear(GL2ES2) cleared} and is reused. + * </p> + * @param gl current {@link GL2ES2} object + * @see #validate(GLProfile) */ public final void validate(final GL2ES2 gl) { validateImpl(gl.getGLProfile(), gl); } - private final void validateImpl(final GLProfile glp, final GL2ES2 gl) { + /** + * Validates the shape's underlying {@link GLRegion} w/o a current {@link GL2ES2} object + * <p> + * If the region is dirty a new region is created + * and the old one gets pushed to a dirty-list to get disposed when a GL context is available. + * </p> + * @see #validate(GL2ES2) + */ + public final void validate(final GLProfile glp) { + validateImpl(glp, null); + } + private final synchronized void validateImpl(final GLProfile glp, final GL2ES2 gl) { + if( null != gl ) { + clearDirtyRegions(gl); + } if( isShapeDirty() || null == region ) { box.reset(); if( null == region ) { region = createGLRegion(glp); - } else if( null != gl ) { - region.clear(gl); + } else if( null == gl ) { + dirtyRegions.add(region); + region = createGLRegion(glp); } else { - throw new IllegalArgumentException("GL is null on non-initial validation"); + region.clear(gl); } addShapeToRegion(); region.setQuality(regionQuality); diff --git a/src/graphui/classes/com/jogamp/graph/ui/gl/shapes/Label.java b/src/graphui/classes/com/jogamp/graph/ui/gl/shapes/Label.java index 5e1f88df9..ac337924a 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/gl/shapes/Label.java +++ b/src/graphui/classes/com/jogamp/graph/ui/gl/shapes/Label.java @@ -71,7 +71,7 @@ public class Label extends Shape { } /** - * Set the text to be rendered + * Set the text to be rendered. Shape update is pending until next {@link #draw(GL2ES2, RegionRenderer, int[])} or {@link #validate(GL2ES2)}. * @param text the text to be set. * @return true if text has been updated, false if unchanged. */ @@ -86,6 +86,36 @@ public class Label extends Shape { } /** + * Set the text to be rendered and immediately updates the shape if necessary. + * @param gl {@link GL2ES2} to issue {@link #validate(GL2ES2)} in case text changed to immediately update shape and {@link #getBounds()} + * @param text the text to be set. + * @return true if text has been updated, false if unchanged. + */ + public boolean setText(final GL2ES2 gl, final String text) { + if( setText(text) ) { + validate(gl); + return true; + } else { + return false; + } + } + + /** + * Set the text to be rendered and immediately updates the shape if necessary. + * @param glp {@link GLProfile} to issue {@link #validate(GLProfile)} in case text changed to immediately update shape and {@link #getBounds()} + * @param text the text to be set. + * @return true if text has been updated, false if unchanged. + */ + public boolean setText(final GLProfile glp, final String text) { + if( setText(text) ) { + validate(glp); + return true; + } else { + return false; + } + } + + /** * Return the {@link Font} used to render the text */ public Font getFont() { @@ -144,9 +174,9 @@ public class Label extends Shape { protected void addShapeToRegion() { tempT1.setToScale(fontScale, fontScale); final AABBox fbox = font.processString(shapeVisitor, tempT1, text, tempT2, tempT3); - final float[] ctr = box.getCenter(); + final float[] ctr = fbox.getCenter(); setRotationOrigin( ctr[0], ctr[1], ctr[2]); - box.resize(fbox); + box.copy(fbox); } @Override |