From 2cafc01f08f9ab05748be6eeb82c417de38b31f7 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Thu, 27 Feb 2014 10:53:06 +0100 Subject: Bug 801: Graph TextRenderer Cleanup Part-3: Region.addOutlineShape(..) Push GL data directly incl. all index validations Region: - Remove redundant methods to make OutlineShape the unique source. - addVertex(..) - addTriangles(..) - Perform all index validations in addOutlineShape(..) - Push OutlineShape's vertex data and it's triangle indices directly to VBO. GLRegion: Add clear(..) method, allowing to clear the region for new data, i.e. OutlineShapes --- .../com/jogamp/graph/curve/OutlineShape.java | 3 - .../classes/com/jogamp/graph/curve/Region.java | 246 +++++++++------------ .../com/jogamp/graph/curve/opengl/GLRegion.java | 13 +- .../jogamp/graph/curve/opengl/TextRenderUtil.java | 31 +-- .../classes/com/jogamp/graph/geom/Triangle.java | 16 +- 5 files changed, 120 insertions(+), 189 deletions(-) (limited to 'src/jogl/classes/com') diff --git a/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java b/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java index ffaaca91c..50bd79e1c 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java +++ b/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java @@ -560,8 +560,6 @@ public class OutlineShape implements Comparable { * Should always be called after {@link #getTriangles(VerticesState)}, * since the latter will mark all cached vertices dirty! *

- * FIXME: Add memory optimization, i.e. VBO layout - * FIXME: Add Runnable task-per-vertices ! */ public final ArrayList getVertices() { final boolean updated; @@ -604,7 +602,6 @@ public class OutlineShape implements Comparable { *

* @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 getTriangles(VerticesState destinationType) { final boolean updated; diff --git a/src/jogl/classes/com/jogamp/graph/curve/Region.java b/src/jogl/classes/com/jogamp/graph/curve/Region.java index 79ec305d1..359c63c80 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/Region.java +++ b/src/jogl/classes/com/jogamp/graph/curve/Region.java @@ -51,32 +51,33 @@ public abstract class Region { public static final boolean DEBUG = Debug.debug("graph.curve"); public static final boolean DEBUG_INSTANCE = Debug.debug("graph.curve.instance"); - /** View based Anti-Aliasing, A Two pass region rendering, slower and more + /** + * View based Anti-Aliasing, A Two pass region rendering, slower and more * resource hungry (FBO), but AA is perfect. Otherwise the default fast one - * pass MSAA region rendering is being used. */ + * pass MSAA region rendering is being used. + */ public static final int VBAA_RENDERING_BIT = 1 << 0; - /** Use non uniform weights [0.0 .. 1.9] for curve region rendering. + /** + * Use non uniform weights [0.0 .. 1.9] for curve region rendering. * Otherwise the default weight 1.0 for uniform curve region rendering is - * being applied. */ + * being applied. + */ public static final int VARIABLE_CURVE_WEIGHT_BIT = 1 << 1; public static final int TWO_PASS_DEFAULT_TEXTURE_UNIT = 0; private final int renderModes; private boolean dirty = true; - protected int numVertices = 0; + private int numVertices = 0; protected final AABBox box = new AABBox(); - /** FIXME: Think about a rendering storage optimization (VBO ... )! */ - protected ArrayList triangles = new ArrayList(); - /** FIXME: Think about a rendering storage optimization (VBO ... )! */ - protected ArrayList vertices = new ArrayList(); public static boolean isVBAA(int renderModes) { return 0 != (renderModes & Region.VBAA_RENDERING_BIT); } - /** Check if render mode capable of non uniform weights + /** + * Check if render mode capable of non uniform weights * * @param renderModes * bit-field of modes, e.g. @@ -109,165 +110,132 @@ public abstract class Region { this.renderModes = regionRenderModes; } - /** Get current Models - * - * @return bit-field of render modes */ + /** + * Returns true, if the implementation uses indices to render the vertices, + * otherwise false. + *

+ * Impacts {@link #validateIndices()} and {@link #addOutlineShape(OutlineShape, AffineTransform)} .., + * i.e. defines unique indices if this method returns true. + *

+ */ + public abstract boolean usesIndices(); + + public abstract void pushVertex(float[] coords, float[] texParams); + public abstract void pushIndex(int idx); + + /** + * Return bit-field of render modes, see {@link #create(int)}. + */ public final int getRenderModes() { return renderModes; } - - public final ArrayList getTriangles() { return triangles; } - - public final ArrayList getVertices() { return vertices; } - - /** Check if current Region is using VBAA - * - * @return true if capable of two pass rendering - VBAA */ - public boolean isVBAA() { - return Region.isVBAA(renderModes); + protected void clearImpl() { + dirty = true; + numVertices = 0; + box.reset(); } - /** Check if current instance uses non uniform weights - * - * @return true if capable of nonuniform weights */ - public boolean isNonUniformWeight() { - return Region.isNonUniformWeight(renderModes); + /** + * Return true if capable of two pass rendering - VBAA, otherwise false. + */ + public final boolean isVBAA() { + return isVBAA(renderModes); } - /** Get the current number of vertices associated with this region. This - * number is not necessary equal to the OGL bound number of vertices. - * - * @return vertices count */ - public final int getNumVertices() { - return numVertices; + /** + * Return true if capable of nonuniform weights, otherwise false. + */ + public final boolean isNonUniformWeight() { + return Region.isNonUniformWeight(renderModes); } - /** Adds a list of {@link Triangle} objects to the Region These triangles are - * to be binded to OGL objects on the next call to {@code update} - * - * @param tris - * a list of triangle objects - * @param idxOffset TODO - * - * @see update(GL2ES2) */ - public void addTriangles(List tris, AffineTransform t, int idxOffset) { - if( true && null != t ) { - for(int i=0; i verts) { - vertices.addAll(verts); - numVertices = vertices.size(); + public final void addOutlineShape(final OutlineShape shape, final AffineTransform transform) { + final List trisIn = shape.getTriangles(OutlineShape.VerticesState.QUADRATIC_NURBS); + final ArrayList vertsIn = shape.getVertices(); if(DEBUG_INSTANCE) { - System.err.println("Region.addVertices(): tris: "+triangles.size()+", verts "+vertices.size()); + System.err.println("Region.addOutlineShape().0: tris: "+trisIn.size()+", verts "+vertsIn.size()+", transform "+transform); } - setDirty(true); - } - - public void addOutlineShape(OutlineShape shape, AffineTransform t) { - final List tris = shape.getTriangles(OutlineShape.VerticesState.QUADRATIC_NURBS); - if(null != tris) { - if( false && null != t ) { - for(int i=0; i= 3 ) { + if(DEBUG_INSTANCE) { + System.err.println("Region.addOutlineShape(): Processing Vertices"); + } + for(int i=0; i verts = shape.getVertices(); - // vertices.addAll(verts); - // FIXME: use OutlineShape.getVertices(Runnable task-per-vertex) !! - for (int j = 0; j < shape.outlines.size(); j++) { - final ArrayList sovs = shape.outlines.get(j).getVertices(); - for (int k = 0; k < sovs.size(); k++) { - final Vertex v; - if( null != t ) { - v = t.transform(sovs.get(k), null); - } else { - v = sovs.get(k); + for(int i=0; i tv0Idx ) { // Integer.MAX_VALUE != i0 // FIXME: renderer uses SHORT! + // valid 'known' idx - move by offset + if(Region.DEBUG_INSTANCE) { + System.err.println("T["+i+"]: Moved "+tv0Idx+" + "+idxOffset+" -> "+(tv0Idx+idxOffset)); + } + pushIndex(tv0Idx+idxOffset); + pushIndex(triInVertices[1].getId()+idxOffset); + pushIndex(triInVertices[2].getId()+idxOffset); + vertsTMovIdxCount+=3; + } else { + // invalid idx - generate new one + if(Region.DEBUG_INSTANCE) { + System.err.println("T["+i+"]: New Idx "+numVertices); } - v.setId(numVertices++); - vertices.add(v); + pushNewVertexIdxImpl(triInVertices[0], transform); + pushNewVertexIdxImpl(triInVertices[1], transform); + pushNewVertexIdxImpl(triInVertices[2], transform); + vertsTNewIdxCount+=3; } + tris++; } - // numVertices = vertices.size(); } if(DEBUG_INSTANCE) { - System.err.println("Region.addOutlineShape(): tris: "+triangles.size()+", verts "+vertices.size()); + System.err.println("Region.addOutlineShape().X: idxOffset "+idxOffset+", tris: "+tris+", verts [idx "+vertsTNewIdxCount+", add "+vertsTNewIdxCount+" = "+(vertsVNewIdxCount+vertsTNewIdxCount)+"]"); + System.err.println("Region.addOutlineShape().X: verts: idx[v-new "+vertsVNewIdxCount+", t-new "+vertsTNewIdxCount+" = "+(vertsVNewIdxCount+vertsTNewIdxCount)+"]"); + System.err.println("Region.addOutlineShape().X: verts: idx t-moved "+vertsTMovIdxCount+", numVertices "+numVertices); + System.err.println("Region.addOutlineShape().X: verts: v-dups "+vertsDupCountV+", t-dups "+vertsDupCountT+", t-known "+vertsKnownMovedT); + // int vertsDupCountV = 0, vertsDupCountT = 0; + System.err.println("Region.addOutlineShape().X: box "+box); } setDirty(true); } - public void validateIndices() { - final int verticeCountPre = vertices.size(); - for(int i=0; i shapes) { + public final void addOutlineShapes(final List shapes, final AffineTransform transform) { for (int i = 0; i < shapes.size(); i++) { - addOutlineShape(shapes.get(i), null); + addOutlineShape(shapes.get(i), transform); } - if(DEBUG_INSTANCE) { - System.err.println("Region.addOutlineShapes(): tris: "+triangles.size()+", verts "+vertices.size()); - } - setDirty(true); } /** @return the AxisAligned bounding box of current region */ diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/GLRegion.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/GLRegion.java index 78c8660fa..7bf2ee6e1 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/opengl/GLRegion.java +++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/GLRegion.java @@ -27,12 +27,9 @@ */ package com.jogamp.graph.curve.opengl; -import java.util.List; - import javax.media.opengl.GL2ES2; import com.jogamp.opengl.util.PMVMatrix; -import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.curve.Region; /** A GLRegion is the OGL binding of one or more OutlineShapes @@ -77,6 +74,16 @@ public abstract class GLRegion extends Region { */ public abstract void destroy(GL2ES2 gl, RegionRenderer renderer); + protected abstract void clearImpl(final GL2ES2 gl, final RegionRenderer renderer); + + /** + * Clears all data, i.e. triangles, vertices etc. + */ + public void clear(final GL2ES2 gl, final RegionRenderer renderer) { + clearImpl(gl, renderer); + clearImpl(); + } + /** * Renders the associated OGL objects specifying * current width/hight of window for multi pass rendering diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderUtil.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderUtil.java index b54fcd6a6..944050a14 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderUtil.java +++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderUtil.java @@ -74,7 +74,7 @@ public class TextRenderUtil { final Font font, final CharSequence str, final int pixelSize) { final int charCount = str.length(); - final GLRegion region = Region.create(renderModes); + final GLRegion region = GLRegion.create(renderModes); // region.setFlipped(true); final Font.Metrics metrics = font.getMetrics(); @@ -88,7 +88,6 @@ public class TextRenderUtil { float y = 0; float advanceTotal = 0; - int numVertices = region.getNumVertices(); for(int i=0; i< charCount; i++) { final char character = str.charAt(i); @@ -110,33 +109,7 @@ public class TextRenderUtil { if( null == glyphShape ) { continue; } - // glyphShape.closeLastOutline(); - - if( false ) { - region.addOutlineShape(glyphShape, t); - } else { - // System.err.println("XXXXX Pre TRI"); - // glyphShape.getVertices(); - final ArrayList trisIn = glyphShape.getTriangles(OutlineShape.VerticesState.QUADRATIC_NURBS); - final ArrayList gVertices = glyphShape.getVertices(); - - if( gVertices.size() < 3 ) { - continue; - } - region.addTriangles(trisIn, t, numVertices); - - for(int j=0; j i0 ) { // Integer.MAX_VALUE != i0 // FIXME: renderer uses SHORT! - if(Region.DEBUG_INSTANCE) { - System.err.println("Triangle.addVertexIndicesOffset: "+i0+" + "+offset+" -> "+(i0+offset)); - } - vertices[0].setId(i0+offset); - vertices[1].setId(vertices[1].getId()+offset); - vertices[2].setId(vertices[2].getId()+offset); - } - } - } - /** Returns array of 3 vertices, denominating the triangle. */ public Vertex[] getVertices() { return vertices; @@ -124,6 +110,6 @@ public class Triangle { @Override public String toString() { - return "Tri ID: " + id + "\n" + vertices[0] + "\n" + vertices[1] + "\n" + vertices[2]; + return "Tri ID: " + id + "\n\t" + vertices[0] + "\n\t" + vertices[1] + "\n\t" + vertices[2]; } } -- cgit v1.2.3