diff options
Diffstat (limited to 'src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java')
-rw-r--r-- | src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java | 159 |
1 files changed, 78 insertions, 81 deletions
diff --git a/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java b/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java index ee1dae4ca..ffaaca91c 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java +++ b/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java @@ -156,29 +156,32 @@ public class OutlineShape implements Comparable<OutlineShape> { dirtyBits = 0; } - /** Returns the associated vertex factory of this outline shape + /** + * Returns the associated vertex factory of this outline shape * @return Vertex.Factory object */ public final Vertex.Factory<? extends Vertex> vertexFactory() { return vertexFactory; } - public int getOutlineNumber() { + public final int getOutlineNumber() { return outlines.size(); } - /** Add a new empty {@link Outline} + /** + * Add a new empty {@link Outline} * to the end of this shape's outline list. * <p>If the {@link #getLastOutline()} is empty already, no new one will be added.</p> * * After a call to this function all new vertices added * will belong to the new outline */ - public void addEmptyOutline() { + public final void addEmptyOutline() { if( !getLastOutline().isEmpty() ) { outlines.add(new Outline()); } } - /** Appends the {@link Outline} element to the end, + /** + * Appends the {@link Outline} element to the end, * ensuring a clean tail. * * <p>A clean tail is ensured, no double empty Outlines are produced @@ -187,11 +190,12 @@ public class OutlineShape implements Comparable<OutlineShape> { * @param outline Outline object to be added * @throws NullPointerException if the {@link Outline} element is null */ - public void addOutline(Outline outline) throws NullPointerException { + public final void addOutline(Outline outline) throws NullPointerException { addOutline(outlines.size(), outline); } - /** Insert the {@link Outline} element at the given {@code position}. + /** + * Insert the {@link Outline} element at the given {@code position}. * * <p>If the {@code position} indicates the end of this list, * a clean tail is ensured, no double empty Outlines are produced @@ -202,7 +206,7 @@ public class OutlineShape implements Comparable<OutlineShape> { * @throws NullPointerException if the {@link Outline} element is null * @throws IndexOutOfBoundsException if position is out of range (position < 0 || position > getOutlineNumber()) */ - public void addOutline(int position, Outline outline) throws NullPointerException, IndexOutOfBoundsException { + public final void addOutline(int position, Outline outline) throws NullPointerException, IndexOutOfBoundsException { if (null == outline) { throw new NullPointerException("outline is null"); } @@ -228,14 +232,15 @@ public class OutlineShape implements Comparable<OutlineShape> { dirtyBits |= DIRTY_TRIANGLES | DIRTY_VERTICES; } - /** Insert the {@link OutlineShape} elements of type {@link Outline}, .. at the end of this shape, + /** + * Insert the {@link OutlineShape} elements of type {@link Outline}, .. at the end of this shape, * using {@link #addOutline(Outline)} for each element. * <p>Closes the current last outline via {@link #closeLastOutline()} before adding the new ones.</p> * @param outlineShape OutlineShape elements to be added. * @throws NullPointerException if the {@link OutlineShape} is null * @throws IndexOutOfBoundsException if position is out of range (position < 0 || position > getOutlineNumber()) */ - public void addOutlineShape(OutlineShape outlineShape) throws NullPointerException { + public final void addOutlineShape(OutlineShape outlineShape) throws NullPointerException { if (null == outlineShape) { throw new NullPointerException("OutlineShape is null"); } @@ -245,7 +250,8 @@ public class OutlineShape implements Comparable<OutlineShape> { } } - /** Replaces the {@link Outline} element at the given {@code position}. + /** + * Replaces the {@link Outline} element at the given {@code position}. * <p>Sets the bounding box dirty, hence a next call to {@link #getBounds()} will validate it.</p> * * @param position of the replaced Outline @@ -253,7 +259,7 @@ public class OutlineShape implements Comparable<OutlineShape> { * @throws NullPointerException if the {@link Outline} element is null * @throws IndexOutOfBoundsException if position is out of range (position < 0 || position >= getOutlineNumber()) */ - public void setOutline(int position, Outline outline) throws NullPointerException, IndexOutOfBoundsException { + public final void setOutline(int position, Outline outline) throws NullPointerException, IndexOutOfBoundsException { if (null == outline) { throw new NullPointerException("outline is null"); } @@ -261,7 +267,8 @@ public class OutlineShape implements Comparable<OutlineShape> { dirtyBits |= DIRTY_BOUNDS | DIRTY_TRIANGLES | DIRTY_VERTICES; } - /** Removes the {@link Outline} element at the given {@code position}. + /** + * Removes the {@link Outline} element at the given {@code position}. * <p>Sets the bounding box dirty, hence a next call to {@link #getBounds()} will validate it.</p> * * @param position of the to be removed Outline @@ -272,7 +279,8 @@ public class OutlineShape implements Comparable<OutlineShape> { return outlines.remove(position); } - /** Get the last added outline to the list + /** + * Get the last added outline to the list * of outlines that define the shape * @return the last outline */ @@ -280,15 +288,16 @@ public class OutlineShape implements Comparable<OutlineShape> { return outlines.get(outlines.size()-1); } - /** @return the {@code Outline} at {@code position} + /** + * Returns the {@code Outline} at {@code position} * @throws IndexOutOfBoundsException if position is out of range (position < 0 || position >= getOutlineNumber()) */ - public Outline getOutline(int position) throws IndexOutOfBoundsException { + public final Outline getOutline(int position) throws IndexOutOfBoundsException { return outlines.get(position); } - /** Adds a vertex to the last open outline in the - * shape. + /** + * Adds a vertex to the last open outline to the shape's tail. * @param v the vertex to be added to the OutlineShape */ public final void addVertex(Vertex v) { @@ -301,8 +310,8 @@ public class OutlineShape implements Comparable<OutlineShape> { dirtyBits |= DIRTY_TRIANGLES | DIRTY_VERTICES; } - /** Adds a vertex to the last open outline in the shape. - * at {@code position} + /** + * Adds a vertex to the last open outline to the shape at {@code position} * @param position indx at which the vertex will be added * @param v the vertex to be added to the OutlineShape */ @@ -315,7 +324,8 @@ public class OutlineShape implements Comparable<OutlineShape> { dirtyBits |= DIRTY_TRIANGLES | DIRTY_VERTICES; } - /** Add a 2D {@link Vertex} to the last outline by defining the coordniate attribute + /** + * Add a 2D {@link Vertex} to the last outline by defining the coordinate attribute * of the vertex. The 2D vertex will be represented as Z=0. * * @param x the x coordinate @@ -327,7 +337,8 @@ public class OutlineShape implements Comparable<OutlineShape> { addVertex(vertexFactory.create(x, y, 0f, onCurve)); } - /** Add a 3D {@link Vertex} to the last outline by defining the coordniate attribute + /** + * Add a 3D {@link Vertex} to the last outline by defining the coordniate attribute * of the vertex. * @param x the x coordinate * @param y the y coordinate @@ -339,7 +350,8 @@ public class OutlineShape implements Comparable<OutlineShape> { addVertex(vertexFactory.create(x, y, z, onCurve)); } - /** Add a vertex to the last outline by passing a float array and specifying the + /** + * Add a vertex to the last outline by passing a float array and specifying the * offset and length in which. The attributes of the vertex are located. * The attributes should be continuous (stride = 0). * Attributes which value are not set (when length less than 3) @@ -354,19 +366,20 @@ public class OutlineShape implements Comparable<OutlineShape> { addVertex(vertexFactory.create(coordsBuffer, offset, length, onCurve)); } - /** Closes the last outline in the shape. + /** + * Closes the last outline in the shape. * <p>If last vertex is not equal to first vertex. * A new temp vertex is added at the end which * is equal to the first.</p> */ - public void closeLastOutline() { + public final void closeLastOutline() { if( getLastOutline().setClosed(true) ) { dirtyBits |= DIRTY_TRIANGLES | DIRTY_VERTICES; } } /** - * @return the outline's vertices state, {@link OutlineShape.VerticesState} + * Return the outline's vertices state, {@link OutlineShape.VerticesState} */ public final VerticesState getOutlineState() { return outlineState; @@ -379,7 +392,7 @@ public class OutlineShape implements Comparable<OutlineShape> { * @param destinationType the target outline's vertices state. Currently only * {@link OutlineShape.VerticesState#QUADRATIC_NURBS} are supported. */ - public void transformOutlines(VerticesState destinationType) { + protected final void transformOutlines(VerticesState destinationType) { if(outlineState != destinationType){ if(destinationType == VerticesState.QUADRATIC_NURBS){ transformOutlines2Quadratic(); @@ -401,20 +414,20 @@ public class OutlineShape implements Comparable<OutlineShape> { outline.addVertex(index, vertexFactory.create(v1, 0, 3, false)); outline.addVertex(index+2, vertexFactory.create(v3, 0, 3, false)); - dirtyBits |= DIRTY_VERTICES; } - /** Check overlaps between curved triangles - * first check if any vertex in triangle a is in triangle b - * second check if edges of triangle a intersect segments of triangle b - * if any of the two tests is true we divide current triangle - * and add the other to the list of overlaps + /** + * Check overlaps between curved triangles + * first check if any vertex in triangle a is in triangle b + * second check if edges of triangle a intersect segments of triangle b + * if any of the two tests is true we divide current triangle + * and add the other to the list of overlaps * - * Loop until overlap array is empty. (check only in first pass) + * Loop until overlap array is empty. (check only in first pass) */ private void checkOverlaps() { - ArrayList<Vertex> overlaps = new ArrayList<Vertex>(3); - int count = getOutlineNumber(); + final ArrayList<Vertex> overlaps = new ArrayList<Vertex>(3); + final int count = getOutlineNumber(); boolean firstpass = true; do { for (int cc = 0; cc < count; cc++) { @@ -442,8 +455,9 @@ public class OutlineShape implements Comparable<OutlineShape> { vertexCount+=2; if(overlap != null && !overlap.isOnCurve()) { - if(!overlaps.contains(overlap)) + if(!overlaps.contains(overlap)) { overlaps.add(overlap); + } } } } @@ -506,12 +520,10 @@ public class OutlineShape implements Comparable<OutlineShape> { i++; vertexCount++; outline.addVertex(i, v); - dirtyBits |= DIRTY_VERTICES; } } if(vertexCount <= 0) { outlines.remove(outline); - dirtyBits |= DIRTY_VERTICES; cc--; count--; continue; @@ -527,16 +539,15 @@ public class OutlineShape implements Comparable<OutlineShape> { outlineState = VerticesState.QUADRATIC_NURBS; } - private void generateVertexIds() { + private int generateVertexIds() { int maxVertexId = 0; for(int i=0; i<outlines.size(); i++) { final ArrayList<Vertex> vertices = outlines.get(i).getVertices(); for(int pos=0; pos<vertices.size(); pos++) { - Vertex vert = vertices.get(pos); - vert.setId(maxVertexId); - maxVertexId++; + vertices.get(pos).setId(maxVertexId++); } } + return maxVertexId; } /** @@ -545,15 +556,27 @@ public class OutlineShape implements Comparable<OutlineShape> { * <p> * Vertices are cached until marked dirty. * </p> + * <p> + * Should always be called <i>after</i> {@link #getTriangles(VerticesState)}, + * since the latter will mark all cached vertices dirty! + * </p> * FIXME: Add memory optimization, i.e. VBO layout + * FIXME: Add Runnable task-per-vertices ! */ - public ArrayList<Vertex> getVertices() { + public final ArrayList<Vertex> getVertices() { + final boolean updated; if( 0 != ( DIRTY_VERTICES & dirtyBits ) ) { vertices.clear(); for(int i=0; i<outlines.size(); i++) { vertices.addAll(outlines.get(i).getVertices()); } dirtyBits &= ~DIRTY_VERTICES; + updated = true; + } else { + updated = false; + } + if(Region.DEBUG_INSTANCE) { + System.err.println("OutlineShape.getVertices(): o "+outlines.size()+", v "+vertices.size()+", updated "+updated); } return vertices; } @@ -571,34 +594,6 @@ public class OutlineShape implements Comparable<OutlineShape> { triangulator2d.generate(triangles); triangulator2d.reset(); } - dirtyBits &= ~DIRTY_TRIANGLES; - } - - /** - * Triangulate the {@link OutlineShape} generating a list of triangles - * while {@link #transformOutlines(VerticesState)} beforehand w/ - * {@link OutlineShape.VerticesState#QUADRATIC_NURBS}. - * <p> - * Triangles are cached until marked dirty. - * </p> - * @return an arraylist of triangles representing the filled region - * which is produced by the combination of the outlines - * FIXME: Add memory optimization, i.e. VBO layout - */ - public ArrayList<Triangle> getTriangles() { - final boolean updated; - if( 0 != ( DIRTY_TRIANGLES & dirtyBits ) ) { - transformOutlines(OutlineShape.VerticesState.QUADRATIC_NURBS); - triangulateImpl(); - updated = true; - } else { - updated = false; - } - if(Region.DEBUG_INSTANCE) { - System.err.println("OutlineShape.getTriangles().1: "+triangles.size()+", updated "+updated); - } - - return triangles; } /** @@ -617,6 +612,8 @@ public class OutlineShape implements Comparable<OutlineShape> { transformOutlines(destinationType); triangulateImpl(); updated = true; + dirtyBits |= DIRTY_VERTICES; + dirtyBits &= ~DIRTY_TRIANGLES; } else { updated = false; } @@ -634,24 +631,24 @@ public class OutlineShape implements Comparable<OutlineShape> { Collections.reverse(outlines); } - /** Compare two outline shapes with Bounding Box area + /** + * Compare two outline shapes with Bounding Box area * as criteria. * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override - public final int compareTo(OutlineShape outline) { - float size = getBounds().getSize(); - float newSize = outline.getBounds().getSize(); - if(size < newSize){ + public final int compareTo(final OutlineShape other) { + final float thisSize = getBounds().getSize(); + final float otherSize = other.getBounds().getSize(); + if( thisSize < otherSize ){ return -1; - } - else if(size > newSize){ + } else if( thisSize > otherSize ) { return 1; } - return 0; + return 0; // FIXME: No epsilon, i.e. smallest accurate float value ? } - private final void validateBoundingBox() { + private void validateBoundingBox() { dirtyBits &= ~DIRTY_BOUNDS; bbox.reset(); for (int i=0; i<outlines.size(); i++) { |