diff options
Diffstat (limited to 'src')
26 files changed, 468 insertions, 254 deletions
diff --git a/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java b/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java index 226e57f07..c8d5a9db6 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java +++ b/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java @@ -114,8 +114,8 @@ public class OutlineShape implements Comparable<OutlineShape> { /** The list of {@link Outline}s that are part of this * outline shape. */ - private ArrayList<Outline> outlines; - private AABBox bbox; + /* pp */ ArrayList<Outline> outlines; + private final AABBox bbox; /** dirty bits DIRTY_BOUNDS */ private int dirtyBits; @@ -427,6 +427,10 @@ public class OutlineShape implements Comparable<OutlineShape> { }while(!overlaps.isEmpty()); } + private final float[] tempVecAC = new float[3]; + private final float[] tempVecAB = new float[3]; + private final float[] tempVecAP = new float[3]; + private Vertex checkTriOverlaps(Vertex a, Vertex b, Vertex c) { int count = getOutlineNumber(); for (int cc = 0; cc < count; cc++) { @@ -445,15 +449,14 @@ public class OutlineShape implements Comparable<OutlineShape> { continue; } - if(VectorUtil.vertexInTriangle(a.getCoord(), b.getCoord(), c.getCoord(), current.getCoord()) - || VectorUtil.vertexInTriangle(a.getCoord(), b.getCoord(), c.getCoord(), nextV.getCoord()) - || VectorUtil.vertexInTriangle(a.getCoord(), b.getCoord(), c.getCoord(), prevV.getCoord())) { - + if( VectorUtil.vertexInTriangle3(a.getCoord(), b.getCoord(), c.getCoord(), + current.getCoord(), nextV.getCoord(), prevV.getCoord(), + tempVecAC, tempVecAB, tempVecAP) ) { return current; } - if(VectorUtil.tri2SegIntersection(a, b, c, prevV, current) - || VectorUtil.tri2SegIntersection(a, b, c, current, nextV) - || VectorUtil.tri2SegIntersection(a, b, c, prevV, nextV)) { + if(VectorUtil.testTri2SegIntersection(a, b, c, prevV, current) || + VectorUtil.testTri2SegIntersection(a, b, c, current, nextV) || + VectorUtil.testTri2SegIntersection(a, b, c, prevV, nextV)) { return current; } } diff --git a/src/jogl/classes/com/jogamp/graph/curve/Region.java b/src/jogl/classes/com/jogamp/graph/curve/Region.java index a9779523a..e36e37c26 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/Region.java +++ b/src/jogl/classes/com/jogamp/graph/curve/Region.java @@ -28,36 +28,35 @@ package com.jogamp.graph.curve; import java.util.ArrayList; +import java.util.List; +import jogamp.graph.curve.opengl.RegionFactory; import jogamp.opengl.Debug; +import com.jogamp.graph.curve.opengl.GLRegion; import com.jogamp.graph.geom.Triangle; import com.jogamp.graph.geom.Vertex; import com.jogamp.opengl.math.geom.AABBox; -/** Abstract Outline shape GL representation - * define the method an OutlineShape(s) is - * binded rendered. +/** Abstract Outline shape GL representation define the method an OutlineShape(s) + * is bound and rendered. * - * @see GLRegion - */ + * @see GLRegion */ public abstract class Region { - /** Debug flag for region impl (graph.curve) - */ + /** Debug flag for region impl (graph.curve) */ public static final boolean DEBUG = Debug.debug("graph.curve"); public static final boolean DEBUG_INSTANCE = false; - /** 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. - */ + /** 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. */ public static final int VBAA_RENDERING_BIT = 1 << 0; /** 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. - */ + * Otherwise the default weight 1.0 for uniform curve region rendering is + * being applied. */ public static final int VARIABLE_CURVE_WEIGHT_BIT = 1 << 1; public static final int TWO_PASS_DEFAULT_TEXTURE_UNIT = 0; @@ -70,16 +69,38 @@ public abstract class Region { protected ArrayList<Vertex> vertices = new ArrayList<Vertex>(); public static boolean isVBAA(int renderModes) { - return 0 != ( renderModes & Region.VBAA_RENDERING_BIT ); + return 0 != (renderModes & Region.VBAA_RENDERING_BIT); } /** Check if render mode capable of non uniform weights - * @param renderModes bit-field of modes, e.g. {@link Region#VARIABLE_CURVE_WEIGHT_BIT}, - * {@link Region#VBAA_RENDERING_BIT} - * @return true of capable of non uniform weights - */ + * + * @param renderModes + * bit-field of modes, e.g. + * {@link Region#VARIABLE_CURVE_WEIGHT_BIT}, + * {@link Region#VBAA_RENDERING_BIT} + * @return true of capable of non uniform weights */ public static boolean isNonUniformWeight(int renderModes) { - return 0 != ( renderModes & Region.VARIABLE_CURVE_WEIGHT_BIT ); + return 0 != (renderModes & Region.VARIABLE_CURVE_WEIGHT_BIT); + } + + /** Create a {@link Region} defining the list of {@link OutlineShape}. + * Combining the Shapes into single buffers. + * @return the resulting Region inclusive the generated region + */ + public static Region create(List<OutlineShape> outlineShapes, int renderModes) { + final Region region = RegionFactory.create(renderModes); + region.addOutlineShapes(outlineShapes); + return region; + } + + /** + * Create a {@link Region} defining this {@link OutlineShape} + * @return the resulting Region. + */ + public static Region create(OutlineShape outlineShape, int renderModes) { + final Region region = RegionFactory.create(renderModes); + region.addOutlineShape(outlineShape); + return region; } protected Region(int regionRenderModes) { @@ -87,100 +108,119 @@ public abstract class Region { } /** Get current Models - * @return bit-field of render modes - */ + * + * @return bit-field of render modes */ public final int getRenderModes() { return renderModes; } /** Check if current Region is using VBAA - * @return true if capable of two pass rendering - VBAA - */ + * + * @return true if capable of two pass rendering - VBAA */ public boolean isVBAA() { return Region.isVBAA(renderModes); } /** Check if current instance uses non uniform weights - * @return true if capable of nonuniform weights - */ + * + * @return true if capable of nonuniform weights */ public boolean isNonUniformWeight() { return Region.isNonUniformWeight(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(){ + /** 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; } - /** Adds a {@link Triangle} object to the Region - * This triangle will be bound to OGL objects - * on the next call to {@code update} - * @param tri a triangle object + /** Adds a {@link Triangle} object to the Region This triangle will be bound + * to OGL objects on the next call to {@code update} * - * @see update(GL2ES2) - */ + * @param tri + * a triangle object + * + * @see update(GL2ES2) */ public void addTriangle(Triangle tri) { triangles.add(tri); setDirty(true); } - /** 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 an arraylist of triangle objects + /** 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} * - * @see update(GL2ES2) - */ - public void addTriangles(ArrayList<Triangle> tris) { + * @param tris + * a list of triangle objects + * + * @see update(GL2ES2) */ + public void addTriangles(List<Triangle> tris) { triangles.addAll(tris); setDirty(true); } - /** Adds a {@link Vertex} object to the Region - * This vertex will be bound to OGL objects - * on the next call to {@code update} - * @param vert a vertex objects + /** Adds a {@link Vertex} object to the Region This vertex will be bound to + * OGL objects on the next call to {@code update} * - * @see update(GL2ES2) - */ + * @param vert + * a vertex objects + * + * @see update(GL2ES2) */ public void addVertex(Vertex vert) { vertices.add(vert); numVertices++; setDirty(true); } - /** Adds a list of {@link Vertex} objects to the Region - * These vertices are to be binded to OGL objects - * on the next call to {@code update} - * @param verts an arraylist of vertex objects + /** Adds a list of {@link Vertex} objects to the Region These vertices are to + * be binded to OGL objects on the next call to {@code update} * - * @see update(GL2ES2) - */ - public void addVertices(ArrayList<Vertex> verts) { + * @param verts + * a list of vertex objects + * + * @see update(GL2ES2) */ + public void addVertices(List<Vertex> verts) { vertices.addAll(verts); numVertices = vertices.size(); setDirty(true); } - /** - * @return the AxisAligned bounding box of - * current region - */ - public final AABBox getBounds(){ + public void addOutlineShape(OutlineShape shape) { + shape.transformOutlines(OutlineShape.VerticesState.QUADRATIC_NURBS); + List<Triangle> tris = shape.triangulate(); + if(null != tris) { + triangles.addAll(tris); + for (int j = 0; j < shape.outlines.size(); j++) { + final ArrayList<Vertex> sovs = shape.outlines.get(j).getVertices(); + for (int k = 0; k < sovs.size(); k++) { + final Vertex v = sovs.get(k); + v.setId(numVertices++); + vertices.add(v); + } + } + } + setDirty(true); + } + + public void addOutlineShapes(List<OutlineShape> shapes) { + for (int i = 0; i < shapes.size(); i++) { + addOutlineShape(shapes.get(i)); + } + setDirty(true); + } + + /** @return the AxisAligned bounding box of current region */ + public final AABBox getBounds() { return box; } - /** Check if this region is dirty. A region is marked dirty - * when new Vertices, Triangles, and or Lines are added after a - * call to update() + /** Check if this region is dirty. A region is marked dirty when new + * Vertices, Triangles, and or Lines are added after a call to update() + * * @return true if region is Dirty, false otherwise * - * @see update(GL2ES2) - */ + * @see update(GL2ES2) */ public final boolean isDirty() { return dirty; } 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 dfb7a95b3..d63e02a9c 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/opengl/GLRegion.java +++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/GLRegion.java @@ -27,17 +27,13 @@ */
package com.jogamp.graph.curve.opengl;
-
-import java.util.ArrayList;
+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;
-import com.jogamp.graph.geom.Triangle;
-import com.jogamp.graph.geom.Vertex;
-import jogamp.graph.curve.opengl.RegionFactory;
/** A GLRegion is the OGL binding of one or more OutlineShapes
* Defined by its vertices and generated triangles. The Region
@@ -55,42 +51,16 @@ public abstract class GLRegion extends Region { * Combining the Shapes into single buffers.
* @return the resulting Region inclusive the generated region
*/
- public static GLRegion create(OutlineShape[] outlineShapes, int renderModes) {
- final GLRegion region = RegionFactory.create(renderModes);
-
- int numVertices = region.getNumVertices();
-
- for(int index=0; index<outlineShapes.length; index++) {
- OutlineShape outlineShape = outlineShapes[index];
- outlineShape.transformOutlines(OutlineShape.VerticesState.QUADRATIC_NURBS);
-
- ArrayList<Triangle> triangles = outlineShape.triangulate();
- region.addTriangles(triangles);
-
- ArrayList<Vertex> vertices = outlineShape.getVertices();
- for(int pos=0; pos < vertices.size(); pos++){
- Vertex vert = vertices.get(pos);
- vert.setId(numVertices++);
- }
- region.addVertices(vertices);
- }
-
- return region;
+ public static GLRegion create(List<OutlineShape> outlineShapes, int renderModes) {
+ return (GLRegion) Region.create(outlineShapes, renderModes);
}
/**
- * Create an ogl {@link GLRegion} defining this {@link OutlineShape}
+ * Create an ogl {@link Region} defining this {@link OutlineShape}
* @return the resulting Region.
*/
public static GLRegion create(OutlineShape outlineShape, int renderModes) {
- final GLRegion region = RegionFactory.create(renderModes);
-
- outlineShape.transformOutlines(OutlineShape.VerticesState.QUADRATIC_NURBS);
- ArrayList<Triangle> triangles = (ArrayList<Triangle>) outlineShape.triangulate();
- ArrayList<Vertex> vertices = (ArrayList<Vertex>) outlineShape.getVertices();
- region.addVertices(vertices);
- region.addTriangles(triangles);
- return region;
+ return (GLRegion) Region.create(outlineShape, renderModes);
}
protected GLRegion(int renderModes) {
diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java index f7d4bfd2f..faaf72a99 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java +++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java @@ -53,12 +53,11 @@ public abstract class RegionRenderer extends Renderer { /** Render an {@link OutlineShape} in 3D space at the position provided * the triangles of the shapes will be generated, if not yet generated * @param region the OutlineShape to Render. - * @param position the initial translation of the outlineShape. * @param texWidth desired texture width for multipass-rendering. * The actual used texture-width is written back when mp rendering is enabled, otherwise the store is untouched. * @throws Exception if HwRegionRenderer not initialized */ - public final void draw(GL2ES2 gl, Region region, float[] position, int[/*1*/] texWidth) { + public final void draw(GL2ES2 gl, Region region, int[/*1*/] texWidth) { if(!isInitialized()) { throw new GLException("RegionRenderer: not initialized!"); } @@ -66,14 +65,14 @@ public abstract class RegionRenderer extends Renderer { throw new GLException("Incompatible render modes, : region modes "+region.getRenderModes()+ " doesn't contain renderer modes "+this.getRenderModes()); } - drawImpl(gl, region, position, texWidth); + drawImpl(gl, region, texWidth); } /** * Usually just dispatched the draw call to the Region's draw implementation, * e.g. {@link com.jogamp.graph.curve.opengl.GLRegion#draw(GL2ES2, RenderState, int, int, int[]) GLRegion#draw(GL2ES2, RenderState, int, int, int[])}. */ - protected abstract void drawImpl(GL2ES2 gl, Region region, float[] position, int[] texWidth); + protected abstract void drawImpl(GL2ES2 gl, Region region, int[] texWidth); @Override protected void destroyImpl(GL2ES2 gl) { diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/Renderer.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/Renderer.java index 029286601..31e4f0b8f 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/opengl/Renderer.java +++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/Renderer.java @@ -102,7 +102,7 @@ public abstract class Renderer { * Initialize shader and bindings for GPU based rendering bound to the given GL object's GLContext * if not initialized yet. * <p>Leaves the renderer enabled, ie ShaderState.</p> - * <p>Shall be called by a {@code draw()} method, e.g. {@link RegionRenderer#draw(GL2ES2, Region, float[], int)}</p> + * <p>Shall be called by a {@code draw()} method, e.g. {@link RegionRenderer#draw(GL2ES2, Region, int)}</p> * * @param gl referencing the current GLContext to which the ShaderState is bound to * @throws GLException if initialization failed diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderer.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderer.java index f6ce852d8..44007ca79 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderer.java +++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRenderer.java @@ -35,8 +35,15 @@ import javax.media.opengl.GL2ES2; import jogamp.graph.curve.text.GlyphString; +import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.font.Font; +import com.jogamp.graph.geom.Vertex.Factory; +/** + * @deprecated use {@link com.jogamp.graph.font.Font#getOutlineShapes(java.util.List, CharSequence, float, Factory)}, + * {@link com.jogamp.graph.curve.Region#create(OutlineShape, int)} + * and a {@link com.jogamp.graph.curve.opengl.RegionRenderer}. + */ public abstract class TextRenderer extends Renderer { /** * Create a Hardware accelerated Text Renderer. @@ -57,14 +64,13 @@ public abstract class TextRenderer extends Renderer { * @param gl the current GL state * @param font {@link Font} to be used * @param str text to be rendered - * @param position the lower left corner of the string * @param fontSize font size * @param texWidth desired texture width for multipass-rendering. * The actual used texture-width is written back when mp rendering is enabled, otherwise the store is untouched. * @throws Exception if TextRenderer not initialized */ public abstract void drawString3D(GL2ES2 gl, Font font, - String str, float[] position, int fontSize, int[/*1*/] texSize); + String str, int fontSize, int[/*1*/] texSize); /**Create the resulting {@link GlyphString} that represents * the String wrt to the font. @@ -187,7 +193,7 @@ public abstract class TextRenderer extends Renderer { /** Default cache limit, see {@link #setCacheLimit(int)} */ public static final int DEFAULT_CACHE_LIMIT = 256; - private HashMap<String, GlyphString> stringCacheMap = new HashMap<String, GlyphString>(DEFAULT_CACHE_LIMIT); - private ArrayList<String> stringCacheArray = new ArrayList<String>(DEFAULT_CACHE_LIMIT); + private final HashMap<String, GlyphString> stringCacheMap = new HashMap<String, GlyphString>(DEFAULT_CACHE_LIMIT); + private final ArrayList<String> stringCacheArray = new ArrayList<String>(DEFAULT_CACHE_LIMIT); private int stringCacheLimit = DEFAULT_CACHE_LIMIT; }
\ No newline at end of file diff --git a/src/jogl/classes/com/jogamp/graph/font/Font.java b/src/jogl/classes/com/jogamp/graph/font/Font.java index a4a8fd53d..6c0041de9 100644 --- a/src/jogl/classes/com/jogamp/graph/font/Font.java +++ b/src/jogl/classes/com/jogamp/graph/font/Font.java @@ -27,6 +27,11 @@ */ package com.jogamp.graph.font; +import java.util.List; + +import com.jogamp.graph.curve.OutlineShape; +import com.jogamp.graph.geom.Vertex; +import com.jogamp.graph.geom.Vertex.Factory; import com.jogamp.opengl.math.geom.AABBox; /** @@ -82,8 +87,11 @@ public interface Font { public Font getFont(); public char getSymbol(); + public short getID(); + public float getScale(float pixelSize); public AABBox getBBox(float pixelSize); public float getAdvance(float pixelSize, boolean useFrationalMetrics); + public int hashCode(); } @@ -108,6 +116,22 @@ public interface Font { public boolean isPrintableChar( char c ); + /** + * @param glyph source of the created OutlineShape + * @param vertexFactory factory for vertices + * @return OutlineShape of the glyph + */ + public OutlineShape getOutlineShape(Glyph glyph, Factory<? extends Vertex> vertexFactory); + + /** + * @param shapes optional storage of OutlineShapes passed by user, new shapes are appended + * @param string source of the created OutlineShapes + * @param pixelSize + * @param vertexFactory factory for vertices + * @return List of OutlineShapes, one OutlineShape per character + */ + public List<OutlineShape> getOutlineShapes(List<OutlineShape> shapes, CharSequence string, float pixelSize, Factory<? extends Vertex> vertexFactory); + /** Shall return {@link #getFullFamilyName()} */ @Override public String toString(); diff --git a/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java b/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java index e1e797088..053876b56 100644 --- a/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java +++ b/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java @@ -271,17 +271,14 @@ public class VectorUtil { } /** Compute Vector + * @param vector storage for resulting Vector V1V2 * @param v1 vertex 1 * @param v2 vertex2 2 - * @return Vector V1V2 */ - public static float[] computeVector(float[] v1, float[] v2) - { - final float[] vector = new float[3]; + public static void computeVector(float[] vector, float[] v1, float[] v2) { vector[0] = v2[0] - v1[0]; vector[1] = v2[1] - v1[1]; vector[2] = v2[2] - v1[2]; - return vector; } /** Check if vertices in triangle circumcircle @@ -292,11 +289,15 @@ public class VectorUtil { * @return true if the vertex d is inside the circle defined by the * vertices a, b, c. from paper by Guibas and Stolfi (1985). */ - public static boolean inCircle(Vert2fImmutable a, Vert2fImmutable b, Vert2fImmutable c, Vert2fImmutable d){ - return (a.getX() * a.getX() + a.getY() * a.getY()) * triArea(b, c, d) - - (b.getX() * b.getX() + b.getY() * b.getY()) * triArea(a, c, d) + - (c.getX() * c.getX() + c.getY() * c.getY()) * triArea(a, b, d) - - (d.getX() * d.getX() + d.getY() * d.getY()) * triArea(a, b, c) > 0; + public static boolean inCircle(Vert2fImmutable a, Vert2fImmutable b, Vert2fImmutable c, Vert2fImmutable d) { + final float[] A = a.getCoord(); + final float[] B = b.getCoord(); + final float[] C = c.getCoord(); + final float[] D = d.getCoord(); + return (A[0] * A[0] + A[1] * A[1]) * triArea(B, C, D) - + (B[0] * B[0] + B[1] * B[1]) * triArea(A, C, D) + + (C[0] * C[0] + C[1] * C[1]) * triArea(A, B, D) - + (D[0] * D[0] + D[1] * D[1]) * triArea(A, B, C) > 0; } /** Computes oriented area of a triangle @@ -306,8 +307,22 @@ public class VectorUtil { * @return compute twice the area of the oriented triangle (a,b,c), the area * is positive if the triangle is oriented counterclockwise. */ - public static float triArea(Vert2fImmutable a, Vert2fImmutable b, Vert2fImmutable c) { - return (b.getX() - a.getX()) * (c.getY() - a.getY()) - (b.getY() - a.getY())*(c.getX() - a.getX()); + public static float triArea(Vert2fImmutable a, Vert2fImmutable b, Vert2fImmutable c){ + final float[] A = a.getCoord(); + final float[] B = b.getCoord(); + final float[] C = c.getCoord(); + return (B[0] - A[0]) * (C[1] - A[1]) - (B[1] - A[1]) * (C[0] - A[0]); + } + + /** Computes oriented area of a triangle + * @param A first vertex + * @param B second vertex + * @param C third vertex + * @return compute twice the area of the oriented triangle (a,b,c), the area + * is positive if the triangle is oriented counterclockwise. + */ + public static float triArea(float[] A, float[] B, float[] C){ + return (B[0] - A[0]) * (C[1] - A[1]) - (B[1] - A[1])*(C[0] - A[0]); } /** Check if a vertex is in triangle using @@ -318,11 +333,13 @@ public class VectorUtil { * @param p the vertex in question * @return true if p is in triangle (a, b, c), false otherwise. */ - public static boolean vertexInTriangle(float[] a, float[] b, float[] c, float[] p){ + public static boolean vertexInTriangle(float[] a, float[] b, float[] c, + float[] p, + float[] ac, float[] ab, float[] ap){ // Compute vectors - final float[] ac = computeVector(a, c); //v0 - final float[] ab = computeVector(a, b); //v1 - final float[] ap = computeVector(a, p); //v2 + computeVector(ac, a, c); //v0 + computeVector(ab, a, b); //v1 + computeVector(ap, a, p); //v2 // Compute dot products final float dot00 = dot(ac, ac); @@ -340,6 +357,72 @@ public class VectorUtil { return (u >= 0) && (v >= 0) && (u + v < 1); } + /** Check if one of three vertices are in triangle using + * barycentric coordinates computation. + * @param a first triangle vertex + * @param b second triangle vertex + * @param c third triangle vertex + * @param p1 the vertex in question + * @param p2 the vertex in question + * @param p3 the vertex in question + * @return true if p1 or p2 or p3 is in triangle (a, b, c), false otherwise. + */ + public static boolean vertexInTriangle3(float[] a, float[] b, float[] c, + float[] p1, float[] p2, float[] p3, + float[] ac, float[] ab, float[] ap){ + // Compute vectors + computeVector(ac, a, c); //v0 + computeVector(ab, a, b); //v1 + + // Compute dot products + final float dotAC_AC = dot(ac, ac); + final float dotAC_AB = dot(ac, ab); + final float dotAB_AB = dot(ab, ab); + + // Compute barycentric coordinates + final float invDenom = 1 / (dotAC_AC * dotAB_AB - dotAC_AB * dotAC_AB); + { + computeVector(ap, a, p1); //v2 + final float dotAC_AP1 = dot(ac, ap); + final float dotAB_AP1 = dot(ab, ap); + final float u1 = (dotAB_AB * dotAC_AP1 - dotAC_AB * dotAB_AP1) * invDenom; + final float v1 = (dotAC_AC * dotAB_AP1 - dotAC_AB * dotAC_AP1) * invDenom; + + // Check if point is in triangle + if ( (u1 >= 0) && (v1 >= 0) && (u1 + v1 < 1) ) { + return true; + } + } + + { + computeVector(ap, a, p2); //v2 + final float dotAC_AP2 = dot(ac, ap); + final float dotAB_AP2 = dot(ab, ap); + final float u = (dotAB_AB * dotAC_AP2 - dotAC_AB * dotAB_AP2) * invDenom; + final float v = (dotAC_AC * dotAB_AP2 - dotAC_AB * dotAC_AP2) * invDenom; + + // Check if point is in triangle + if ( (u >= 0) && (v >= 0) && (u + v < 1) ) { + return true; + } + } + + { + computeVector(ap, a, p3); //v2 + final float dotAC_AP3 = dot(ac, ap); + final float dotAB_AP3 = dot(ab, ap); + final float u = (dotAB_AB * dotAC_AP3 - dotAC_AB * dotAB_AP3) * invDenom; + final float v = (dotAC_AC * dotAB_AP3 - dotAC_AB * dotAC_AP3) * invDenom; + + // Check if point is in triangle + if ( (u >= 0) && (v >= 0) && (u + v < 1) ) { + return true; + } + } + + return false; + } + /** Check if points are in ccw order * @param a first vertex * @param b second vertex @@ -412,6 +495,38 @@ public class VectorUtil { return new float[]{xi,yi,0}; } + /** Compute intersection between two segments + * @param a vertex 1 of first segment + * @param b vertex 2 of first segment + * @param c vertex 1 of second segment + * @param d vertex 2 of second segment + * @return true if the segments intersect, otherwise returns false + */ + public static boolean testSeg2SegIntersection(Vert2fImmutable a, Vert2fImmutable b, Vert2fImmutable c, Vert2fImmutable d) { + final float[] A = a.getCoord(); + final float[] B = b.getCoord(); + final float[] C = c.getCoord(); + final float[] D = d.getCoord(); + + final float determinant = (A[0]-B[0])*(C[1]-D[1]) - (A[1]-B[1])*(C[0]-D[0]); + + if (determinant == 0) { + return false; + } + + final float alpha = (A[0]*B[1]-A[1]*B[0]); + final float beta = (C[0]*D[1]-C[1]*D[1]); + final float xi = ((C[0]-D[0])*alpha-(A[0]-B[0])*beta)/determinant; + + final float gamma = (xi - A[0])/(B[0] - A[0]); + final float gamma1 = (xi - C[0])/(D[0] - C[0]); + if(gamma <= 0 || gamma >= 1 || gamma1 <= 0 || gamma1 >= 1) { + return false; + } + + return true; + } + /** Compute intersection between two lines * @param a vertex 1 of first line * @param b vertex 2 of first line @@ -442,14 +557,9 @@ public class VectorUtil { * @param e vertex 2 of first segment * @return true if the segment intersects at least one segment of the triangle, false otherwise */ - public static boolean tri2SegIntersection(Vert2fImmutable a, Vert2fImmutable b, Vert2fImmutable c, Vert2fImmutable d, Vert2fImmutable e){ - if(seg2SegIntersection(a, b, d, e) != null) - return true; - if(seg2SegIntersection(b, c, d, e) != null) - return true; - if(seg2SegIntersection(a, c, d, e) != null) - return true; - - return false; + public static boolean testTri2SegIntersection(Vert2fImmutable a, Vert2fImmutable b, Vert2fImmutable c, Vert2fImmutable d, Vert2fImmutable e){ + return testSeg2SegIntersection(a, b, d, e) || + testSeg2SegIntersection(b, c, d, e) || + testSeg2SegIntersection(a, c, d, e) ; } } diff --git a/src/jogl/classes/com/jogamp/opengl/math/geom/AABBox.java b/src/jogl/classes/com/jogamp/opengl/math/geom/AABBox.java index d48677da5..5fbc28c60 100644 --- a/src/jogl/classes/com/jogamp/opengl/math/geom/AABBox.java +++ b/src/jogl/classes/com/jogamp/opengl/math/geom/AABBox.java @@ -353,7 +353,8 @@ public class AABBox implements Cloneable { @Override public final String toString() { - return "[ "+low[0]+"/"+low[1]+"/"+low[1]+" .. "+high[0]+"/"+high[0]+"/"+high[0]+", ctr "+ - center[0]+"/"+center[1]+"/"+center[1]+" ]"; + return "[ dim "+getWidth()+" x "+getHeight()+" x "+getDepth()+ + ", box "+low[0]+" / "+low[1]+" / "+low[2]+" .. "+high[0]+" / "+high[1]+" / "+high[2]+ + ", ctr "+center[0]+" / "+center[1]+" / "+center[2]+" ]"; } } diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java b/src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java index 31ad974d0..51198fd75 100644 --- a/src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java +++ b/src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java @@ -94,7 +94,7 @@ public class RegionRendererImpl01 extends RegionRenderer { } @Override - protected void drawImpl(GL2ES2 gl, Region region, float[] position, int[] texSize) { + protected void drawImpl(GL2ES2 gl, Region region, int[] texSize) { ((GLRegion)region).draw(gl, rs, vp_width, vp_height, texSize); } } diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/TextRendererImpl01.java b/src/jogl/classes/jogamp/graph/curve/opengl/TextRendererImpl01.java index 4ec4d1d98..c3c7e0cac 100644 --- a/src/jogl/classes/jogamp/graph/curve/opengl/TextRendererImpl01.java +++ b/src/jogl/classes/jogamp/graph/curve/opengl/TextRendererImpl01.java @@ -93,7 +93,7 @@ public class TextRendererImpl01 extends TextRenderer { } @Override - public void drawString3D(GL2ES2 gl, Font font, String str, float[] position, int fontSize, int[/*1*/] texSize) { + public void drawString3D(GL2ES2 gl, Font font, String str, int fontSize, int[/*1*/] texSize) { if(!isInitialized()){ throw new GLException("TextRendererImpl01: not initialized!"); } diff --git a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java index a60f91b87..f0910c465 100644 --- a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java +++ b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java @@ -128,8 +128,9 @@ public class CDTriangulator2D implements Triangulator{ } } Triangle tri = loop.cut(true); - if(tri != null) + if(tri != null) { triangles.add(tri); + } } return triangles; } diff --git a/src/jogl/classes/jogamp/graph/curve/text/GlyphShape.java b/src/jogl/classes/jogamp/graph/curve/text/GlyphShape.java index ff46c3338..8c214dd0b 100644 --- a/src/jogl/classes/jogamp/graph/curve/text/GlyphShape.java +++ b/src/jogl/classes/jogamp/graph/curve/text/GlyphShape.java @@ -29,71 +29,84 @@ package jogamp.graph.curve.text; import java.util.ArrayList; +import com.jogamp.graph.font.Font.Glyph; import com.jogamp.graph.geom.Vertex; import com.jogamp.graph.geom.Triangle; import com.jogamp.graph.geom.Vertex.Factory; - import com.jogamp.graph.curve.OutlineShape; -import com.jogamp.opengl.math.Quaternion; +// import com.jogamp.opengl.math.Quaternion; public class GlyphShape { - private Quaternion quat= null; - private OutlineShape shape = null; + // private Quaternion quat= null; + private Glyph glyph; + private OutlineShape shape; /** Create a new Glyph shape * based on Parametric curve control polyline */ public GlyphShape(Vertex.Factory<? extends Vertex> factory){ - shape = new OutlineShape(factory); + this.shape = new OutlineShape(factory); + this.glyph = null; } /** Create a new GlyphShape from a {@link OutlineShape} * @param factory vertex impl factory {@link Factory} * @param shape {@link OutlineShape} representation of the Glyph */ - public GlyphShape(Vertex.Factory<? extends Vertex> factory, OutlineShape shape){ + public GlyphShape(Vertex.Factory<? extends Vertex> factory, Glyph glyph, OutlineShape shape){ this(factory); this.shape = shape; this.shape.transformOutlines(OutlineShape.VerticesState.QUADRATIC_NURBS); + this.glyph = glyph; + } + + public final void destroy() { + shape.clear(); + shape = null; + glyph = null; } public final Vertex.Factory<? extends Vertex> vertexFactory() { return shape.vertexFactory(); } - public OutlineShape getShape() { + public final Glyph getGlyph() { + return glyph; + } + + public final OutlineShape getShape() { return shape; } - public int getNumVertices() { + public final int getNumVertices() { return shape.getVertices().size(); } - /** Get the rotational Quaternion attached to this Shape + /** Get the rotational quaternion attached to this Shape. * @return the Quaternion Object - */ - public Quaternion getQuat() { + public final Quaternion getQuat() { return quat; } - /** Set the Quaternion that shall defien the rotation + /** + * Set the Quaternion that shall define the rotation * of this shape. * @param quat - */ - public void setQuat(Quaternion quat) { + public final void setQuat(Quaternion quat) { this.quat = quat; } + */ /** Triangluate the glyph shape * @return ArrayList of triangles which define this shape */ - public ArrayList<Triangle> triangulate(){ + public final ArrayList<Triangle> triangulate(){ return shape.triangulate(); } /** Get the list of Vertices of this Object * @return arrayList of Vertices */ - public ArrayList<Vertex> getVertices(){ + public final ArrayList<Vertex> getVertices(){ return shape.getVertices(); } } diff --git a/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java b/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java index 2284ab669..5fb547e69 100644 --- a/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java +++ b/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java @@ -28,6 +28,7 @@ package jogamp.graph.curve.text; import java.util.ArrayList; +import java.util.List; import com.jogamp.graph.font.Font; import com.jogamp.graph.geom.Vertex; @@ -38,7 +39,7 @@ import com.jogamp.graph.geom.opengl.SVertex; import javax.media.opengl.GL2ES2; import jogamp.graph.curve.opengl.RegionFactory; -import jogamp.graph.font.FontInt; +import jogamp.graph.geom.plane.AffineTransform; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.curve.Region; @@ -47,18 +48,23 @@ import com.jogamp.graph.curve.opengl.RenderState; import com.jogamp.opengl.math.geom.AABBox; import com.jogamp.opengl.util.PMVMatrix; +/** + * @deprecated use {@link com.jogamp.graph.font.Font#getOutlineShapes(java.util.List, CharSequence, float, Factory)}, + * {@link com.jogamp.graph.curve.Region#create(OutlineShape, int)} + * and a {@link com.jogamp.graph.curve.opengl.RegionRenderer}. + */ public class GlyphString { /** Static font size for all default font OutlineShape generations via {@link #createString(OutlineShape, Factory, Font, String)}. * <p>The actual font size shall be accomplished by the GL PMV matrix.</p> */ public static final int STATIC_FONT_SIZE = 10; - private ArrayList<GlyphShape> glyphs = new ArrayList<GlyphShape>(); - private CharSequence str; - private String fontname; + private final ArrayList<GlyphShape> glyphs = new ArrayList<GlyphShape>(); + private final CharSequence str; + private final String fontname; private GLRegion region; - private SVertex origin = new SVertex(); + private final SVertex origin = new SVertex(); /** * <p>Uses {@link #STATIC_FONT_SIZE}.</p> @@ -84,11 +90,11 @@ public class GlyphString { * @param str string text * @return the created {@link GlyphString} instance */ - public static GlyphString createString(OutlineShape shape, Factory<? extends Vertex> vertexFactory, Font font, int fontSize, String str) { - ArrayList<OutlineShape> shapes = ((FontInt)font).getOutlineShapes(str, fontSize, vertexFactory); + public static GlyphString createString(OutlineShape shape, Factory<? extends Vertex> vertexFactory, Font font, int fontSize, CharSequence str) { + List<OutlineShape> shapes = font.getOutlineShapes(null, str, fontSize, vertexFactory); GlyphString glyphString = new GlyphString(font.getName(Font.NAME_UNIQUNAME), str); - glyphString.createfromOutlineShapes(vertexFactory, shapes); + glyphString.createfromOutlineShapes(vertexFactory, font, str, shapes); if(null != shape) { for(int i=0; i<glyphString.glyphs.size(); i++) { shape.addOutlineShape(glyphString.glyphs.get(i).getShape()); @@ -119,13 +125,18 @@ public class GlyphString { * @param vertexFactory vertex impl factory {@link Factory} * @param shapes list of {@link OutlineShape} */ - public void createfromOutlineShapes(Factory<? extends Vertex> vertexFactory, ArrayList<OutlineShape> shapes) { + public void createfromOutlineShapes(Factory<? extends Vertex> vertexFactory, Font font, CharSequence str, List<OutlineShape> shapes) { + if(shapes.size() != str.length()) { + throw new InternalError("XXX"); + } final int numGlyps = shapes.size(); for (int index=0;index<numGlyps;index++){ if(shapes.get(index) == null){ continue; } - GlyphShape glyphShape = new GlyphShape(vertexFactory, shapes.get(index)); + GlyphShape glyphShape = new GlyphShape(vertexFactory, + font.getGlyph(str.charAt(index)), + shapes.get(index)); if(glyphShape.getNumVertices() < 3) { continue; @@ -143,20 +154,30 @@ public class GlyphString { public GLRegion createRegion(GL2ES2 gl, int renderModes){ region = RegionFactory.create(renderModes); // region.setFlipped(true); + float y = 0; + float advanceTotal = 0; + AffineTransform t = new AffineTransform(); int numVertices = region.getNumVertices(); for(int i=0; i< glyphs.size(); i++) { - final GlyphShape glyph = glyphs.get(i); - ArrayList<Triangle> gtris = glyph.triangulate(); + final GlyphShape glyphShape = glyphs.get(i); + Font.Metrics metrics = glyphShape.getGlyph().getFont().getMetrics(); + final float scale = metrics.getScale(STATIC_FONT_SIZE); + t.translate(advanceTotal, y); + t.scale(scale, scale); + + ArrayList<Triangle> gtris = glyphShape.triangulate(); region.addTriangles(gtris); - final ArrayList<Vertex> gVertices = glyph.getVertices(); + final ArrayList<Vertex> gVertices = glyphShape.getVertices(); for(int j=0; j<gVertices.size(); j++) { final Vertex gVert = gVertices.get(j); gVert.setId(numVertices++); region.addVertex(gVert); } + + advanceTotal += glyphShape.getGlyph().getAdvance(STATIC_FONT_SIZE, true); } return region; } diff --git a/src/jogl/classes/jogamp/graph/font/FontInt.java b/src/jogl/classes/jogamp/graph/font/FontInt.java index 4366724ad..1f4eaf20d 100644 --- a/src/jogl/classes/jogamp/graph/font/FontInt.java +++ b/src/jogl/classes/jogamp/graph/font/FontInt.java @@ -27,14 +27,9 @@ */ package jogamp.graph.font; -import java.util.ArrayList; - import jogamp.graph.geom.plane.Path2D; -import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.font.Font; -import com.jogamp.graph.geom.Vertex; -import com.jogamp.graph.geom.Vertex.Factory; public interface FontInt extends Font { @@ -43,5 +38,4 @@ public interface FontInt extends Font { public Path2D getPath(float pixelSize); } - public ArrayList<OutlineShape> getOutlineShapes(CharSequence string, float pixelSize, Factory<? extends Vertex> vertexFactory); } diff --git a/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java b/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java index 67ae6c387..250778f06 100644 --- a/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java +++ b/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java @@ -27,7 +27,7 @@ */ package jogamp.graph.font.typecast; -import java.util.ArrayList; +import java.util.List; import jogamp.graph.font.FontInt; import jogamp.graph.font.typecast.ot.OTFont; @@ -44,7 +44,6 @@ import com.jogamp.common.util.IntObjectHashMap; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.font.Font; import com.jogamp.graph.font.FontFactory; -import com.jogamp.graph.font.Font.Glyph; import com.jogamp.graph.geom.Vertex; import com.jogamp.graph.geom.Vertex.Factory; import com.jogamp.opengl.math.geom.AABBox; @@ -140,7 +139,7 @@ class TypecastFont implements FontInt { for (int j = range.getStartCode(); j <= range.getEndCode(); ++j) { final int code = cmapFormat.mapCharCode(j); if(code < 15) { - System.err.println(" char: " + (int)j + " ( " + (char)j +" ) -> " + code); + System.err.println(" char: " + j + " ( " + (char)j +" ) -> " + code); } } } @@ -205,7 +204,7 @@ class TypecastFont implements FontInt { Path2D path = TypecastRenderer.buildPath(glyph); result = new TypecastGlyph(this, symbol, code, glyph.getBBox(), glyph.getAdvanceWidth(), path); if(DEBUG) { - System.err.println("New glyph: " + (int)symbol + " ( " + (char)symbol +" ) -> " + code + ", contours " + glyph.getPointCount() + ": " + path); + System.err.println("New glyph: " + (int)symbol + " ( " + symbol +" ) -> " + code + ", contours " + glyph.getPointCount() + ": " + path); } final HdmxTable hdmx = font.getHdmxTable(); if (null!= result && null != hdmx) { @@ -227,9 +226,14 @@ class TypecastFont implements FontInt { } @Override - public ArrayList<OutlineShape> getOutlineShapes(CharSequence string, float pixelSize, Factory<? extends Vertex> vertexFactory) { + public OutlineShape getOutlineShape(Glyph glyph, Factory<? extends Vertex> vertexFactory) { + return TypecastRenderer.getOutlineShape(this, glyph, vertexFactory); + } + + @Override + public List<OutlineShape> getOutlineShapes(List<OutlineShape> shapes, CharSequence string, float pixelSize, Factory<? extends Vertex> vertexFactory) { AffineTransform transform = new AffineTransform(vertexFactory); - return TypecastRenderer.getOutlineShapes(this, string, pixelSize, transform, vertexFactory); + return TypecastRenderer.getOutlineShapes(shapes, this, string, pixelSize, transform, vertexFactory); } @Override diff --git a/src/jogl/classes/jogamp/graph/font/typecast/TypecastGlyph.java b/src/jogl/classes/jogamp/graph/font/typecast/TypecastGlyph.java index 574aeb86d..302366647 100644 --- a/src/jogl/classes/jogamp/graph/font/typecast/TypecastGlyph.java +++ b/src/jogl/classes/jogamp/graph/font/typecast/TypecastGlyph.java @@ -237,4 +237,10 @@ public class TypecastGlyph implements FontInt.GlyphInt { } return this.pathSized; } + + public int hashCode() { + // 31 * x == (x << 5) - x + int hash = 31 + font.getName(Font.NAME_UNIQUNAME).hashCode(); + return ((hash << 5) - hash) + id; + } } diff --git a/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java b/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java index 127e260ca..d7f8497b3 100644 --- a/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java +++ b/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java @@ -28,6 +28,7 @@ package jogamp.graph.font.typecast; import java.util.ArrayList; +import java.util.List; import jogamp.graph.font.FontInt.GlyphInt; import jogamp.graph.font.typecast.ot.OTGlyph; @@ -64,9 +65,10 @@ public class TypecastRenderer { } AffineTransform t = new AffineTransform(); + final int len = string.length(); float advanceY = lineGap - descent + ascent; float y = 0; - for (int i=0; i<string.length(); i++) + for (int i=0; i<len; i++) { p[i] = new Path2D(); p[i].reset(); @@ -75,26 +77,44 @@ public class TypecastRenderer { if (character == '\n') { y += advanceY; advanceTotal = 0; - continue; } else if (character == ' ') { advanceTotal += font.getAdvanceWidth(Glyph.ID_SPACE, pixelSize); - continue; + } else { + final Glyph glyph = font.getGlyph(character); + final Path2D gp = ((GlyphInt)glyph).getPath(); + final float scale = metrics.getScale(pixelSize); + t.translate(advanceTotal, y); + t.scale(scale, scale); + p[i].append(gp.iterator(t), false); + advanceTotal += glyph.getAdvance(pixelSize, true); + } + } + } + + public static OutlineShape getOutlineShape(TypecastFont font, Glyph glyph, Factory<? extends Vertex> vertexFactory) { + Path2D path = ((GlyphInt)glyph).getPath(); + AffineTransform transform = new AffineTransform(vertexFactory); + OutlineShape shape = new OutlineShape(vertexFactory); + + PathIterator iterator = path.iterator(transform); + if(null != iterator){ + while(!iterator.isDone()){ + float[] coords = new float[6]; + int segmentType = iterator.currentSegment(coords); + addPathVertexToOutline(shape, vertexFactory, coords, segmentType); + iterator.next(); } - Glyph glyph = font.getGlyph(character); - Path2D gp = ((GlyphInt)glyph).getPath(); - float scale = metrics.getScale(pixelSize); - t.translate(advanceTotal, y); - t.scale(scale, scale); - p[i].append(gp.iterator(t), false); - advanceTotal += glyph.getAdvance(pixelSize, true); } + return shape; } - public static ArrayList<OutlineShape> getOutlineShapes(TypecastFont font, CharSequence string, float pixelSize, AffineTransform transform, Factory<? extends Vertex> vertexFactory) { + public static List<OutlineShape> getOutlineShapes(List<OutlineShape> shapes, TypecastFont font, CharSequence string, float pixelSize, AffineTransform transform, Factory<? extends Vertex> vertexFactory) { Path2D[] paths = new Path2D[string.length()]; getPaths(font, string, pixelSize, transform, paths); - ArrayList<OutlineShape> shapes = new ArrayList<OutlineShape>(); + if(null == shapes) { + shapes = new ArrayList<OutlineShape>(); + } final int numGlyps = paths.length; for (int index=0;index<numGlyps;index++) { if(paths[index] == null){ diff --git a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java index f675e42cd..826c08ed4 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java @@ -66,7 +66,6 @@ public class TestTextRendererNEWT00 extends UITestCase { static final boolean TRACE = false; static long duration = 100; // ms - static final float[] textPosition = new float[] {0,0,0}; static final int[] texSize = new int[] { 0 }; static final int fontSize = 24; static Font font; @@ -175,7 +174,7 @@ public class TestTextRendererNEWT00 extends UITestCase { dy -= (int)textBox.getHeight() * ( row + 1 ); renderer.resetModelview(null); renderer.translate(gl, dx, dy, z0); - renderer.drawString3D(gl, font, text, textPosition, fontSize, texSize); + renderer.drawString3D(gl, font, text, fontSize, texSize); lastRow = row; } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java index bfa942cc1..77f562dda 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java @@ -61,7 +61,6 @@ public class TestTextRendererNEWT10 extends UITestCase { static boolean forceGL3 = false; static boolean mainRun = false; - static final float[] textPosition = new float[] {0,0,0}; static final int[] texSize = new int[] { 0 }; static final int fontSize = 24; static Font font; @@ -162,7 +161,6 @@ public class TestTextRendererNEWT10 extends UITestCase { NEWTGLContext.destroyWindow(winctx); } - int screenshot_num = 0; int lastRow = -1; @@ -179,7 +177,7 @@ public class TestTextRendererNEWT10 extends UITestCase { dy -= (int)textBox.getHeight() * ( row + 1 ); renderer.resetModelview(null); renderer.translate(gl, dx, dy, z0); - renderer.drawString3D(gl, font, text, textPosition, fontSize, texSize); + renderer.drawString3D(gl, font, text, fontSize, texSize); lastRow = row; } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener01.java index 46557e8c8..43e5537e9 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener01.java @@ -120,6 +120,6 @@ public class GPURegionGLListener01 extends GPURegionRendererListenerBase01 { if( weight != regionRenderer.getWeight()) { regionRenderer.setWeight(gl, weight); } - regionRenderer.draw(gl, region, getPosition(), getTexSize()); + regionRenderer.draw(gl, region, getTexSize()); } } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener02.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener02.java index 525c5e648..3565dbc48 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener02.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener02.java @@ -28,6 +28,9 @@ package com.jogamp.opengl.test.junit.graph.demos; +import java.util.ArrayList; +import java.util.List; + import javax.media.opengl.GL; import javax.media.opengl.GL2ES2; import javax.media.opengl.GLAutoDrawable; @@ -42,7 +45,7 @@ import com.jogamp.graph.curve.opengl.RenderState; * */ public class GPURegionGLListener02 extends GPURegionRendererListenerBase01 { - OutlineShape[] outlineShapes = new OutlineShape[2]; + List<OutlineShape> outlineShapes = new ArrayList<OutlineShape>(); public GPURegionGLListener02 (RenderState rs, int renderModes, int fbosize, boolean debug, boolean trace) { super(rs, renderModes, debug, trace); @@ -51,39 +54,41 @@ public class GPURegionGLListener02 extends GPURegionRendererListenerBase01 { private void createTestOutline(){ float offset = 0; - outlineShapes[0] = new OutlineShape(getRenderer().getRenderState().getVertexFactory()); - outlineShapes[0].addVertex(0.0f,-10.0f,true); - outlineShapes[0].addVertex(15.0f,-10.0f, true); - outlineShapes[0].addVertex(10.0f,5.0f, false); - outlineShapes[0].addVertex(15.0f,10.0f, true); - outlineShapes[0].addVertex(6.0f,15.0f, false); - outlineShapes[0].addVertex(5.0f,8.0f, false); - outlineShapes[0].addVertex(0.0f,10.0f,true); - outlineShapes[0].closeLastOutline(); - outlineShapes[0].addEmptyOutline(); - outlineShapes[0].addVertex(5.0f,-5.0f,true); - outlineShapes[0].addVertex(10.0f,-5.0f, false); - outlineShapes[0].addVertex(10.0f,0.0f, true); - outlineShapes[0].addVertex(5.0f,0.0f, false); - outlineShapes[0].closeLastOutline(); + OutlineShape shape = new OutlineShape(getRenderer().getRenderState().getVertexFactory()); + outlineShapes.add(shape); + shape.addVertex(0.0f,-10.0f,true); + shape.addVertex(15.0f,-10.0f, true); + shape.addVertex(10.0f,5.0f, false); + shape.addVertex(15.0f,10.0f, true); + shape.addVertex(6.0f,15.0f, false); + shape.addVertex(5.0f,8.0f, false); + shape.addVertex(0.0f,10.0f,true); + shape.closeLastOutline(); + shape.addEmptyOutline(); + shape.addVertex(5.0f,-5.0f,true); + shape.addVertex(10.0f,-5.0f, false); + shape.addVertex(10.0f,0.0f, true); + shape.addVertex(5.0f,0.0f, false); + shape.closeLastOutline(); /** Same shape as above but without any off-curve vertices */ - outlineShapes[1] = new OutlineShape(getRenderer().getRenderState().getVertexFactory()); + shape = new OutlineShape(getRenderer().getRenderState().getVertexFactory()); + outlineShapes.add(shape); offset = 30; - outlineShapes[1].addVertex(offset+0.0f,-10.0f, true); - outlineShapes[1].addVertex(offset+17.0f,-10.0f, true); - outlineShapes[1].addVertex(offset+11.0f,5.0f, true); - outlineShapes[1].addVertex(offset+16.0f,10.0f, true); - outlineShapes[1].addVertex(offset+7.0f,15.0f, true); - outlineShapes[1].addVertex(offset+6.0f,8.0f, true); - outlineShapes[1].addVertex(offset+0.0f,10.0f, true); - outlineShapes[1].closeLastOutline(); - outlineShapes[1].addEmptyOutline(); - outlineShapes[1].addVertex(offset+5.0f,0.0f, true); - outlineShapes[1].addVertex(offset+5.0f,-5.0f, true); - outlineShapes[1].addVertex(offset+10.0f,-5.0f, true); - outlineShapes[1].addVertex(offset+10.0f,0.0f, true); - outlineShapes[1].closeLastOutline(); + shape.addVertex(offset+0.0f,-10.0f, true); + shape.addVertex(offset+17.0f,-10.0f, true); + shape.addVertex(offset+11.0f,5.0f, true); + shape.addVertex(offset+16.0f,10.0f, true); + shape.addVertex(offset+7.0f,15.0f, true); + shape.addVertex(offset+6.0f,8.0f, true); + shape.addVertex(offset+0.0f,10.0f, true); + shape.closeLastOutline(); + shape.addEmptyOutline(); + shape.addVertex(offset+5.0f,0.0f, true); + shape.addVertex(offset+5.0f,-5.0f, true); + shape.addVertex(offset+10.0f,-5.0f, true); + shape.addVertex(offset+10.0f,0.0f, true); + shape.closeLastOutline(); region = GLRegion.create(outlineShapes, getRenderModes()); } @@ -118,7 +123,7 @@ public class GPURegionGLListener02 extends GPURegionRendererListenerBase01 { if( weight != regionRenderer.getWeight()) { regionRenderer.setWeight(gl, weight); } - regionRenderer.draw(gl, region, getPosition(), getTexSize()); + regionRenderer.draw(gl, region, getTexSize()); } } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextRendererListenerBase01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextRendererListenerBase01.java index 1dc104cbb..2ab0632d3 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextRendererListenerBase01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextRendererListenerBase01.java @@ -162,7 +162,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB final int fpsSp = fpsS.indexOf('.'); textRenderer.resetModelview(null); textRenderer.translate(gl, fontSizeFixed, fontSizeFixed, -6000); - textRenderer.drawString3D(gl, font, fpsS.substring(0, fpsSp+2)+" fps", getPosition(), fontSizeFixed*3, getTexSize()); + textRenderer.drawString3D(gl, font, fpsS.substring(0, fpsSp+2)+" fps", fontSizeFixed*3, getTexSize()); } int dx = width-(int)fontNameBox.getWidth()-2 ; @@ -170,7 +170,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB textRenderer.resetModelview(null); textRenderer.translate(gl, dx, dy, -6000); - textRenderer.drawString3D(gl, font, fontName, getPosition(), fontSizeFixed*2, getTexSize()); + textRenderer.drawString3D(gl, font, fontName, fontSizeFixed*2, getTexSize()); dx = 10; dy += -(int)fontNameBox.getHeight() - 10; @@ -178,7 +178,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB if(null != headtext) { textRenderer.resetModelview(null); textRenderer.translate(gl, dx, dy, -6000); - textRenderer.drawString3D(gl, font, headtext, getPosition(), fontSizeFixed*3, getTexSize()); + textRenderer.drawString3D(gl, font, headtext, fontSizeFixed*3, getTexSize()); } textRenderer.reshapePerspective(null, 45.0f, width, height, 0.1f, 7000.0f); @@ -188,9 +188,9 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB textRenderer.rotate(gl, getAngle(), 0, 1, 0); textRenderer.setColorStatic(gl, 1.0f, 0.0f, 0.0f); if(!userInput) { - textRenderer.drawString3D(gl, font, text2, getPosition(), fontSize, getTexSize()); + textRenderer.drawString3D(gl, font, text2, fontSize, getTexSize()); } else { - textRenderer.drawString3D(gl, font, userString.toString(), getPosition(), fontSize, getTexSize()); + textRenderer.drawString3D(gl, font, userString.toString(), fontSize, getTexSize()); } } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneGLListener0A.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneGLListener0A.java index 59ce28408..c9a3f5542 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneGLListener0A.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneGLListener0A.java @@ -300,7 +300,7 @@ public class GPUUISceneGLListener0A implements GLEventListener { regionRenderer.scale(gl, 1.5f, 1.5f, 1.0f); regionRenderer.rotate(gl, angText , 0, 1, 0); regionRenderer.setColorStatic(gl, 0.0f, 1.0f, 0.0f); - regionRenderer.draw(gl, jogampRegion.getRegion(gl, rs, 0), new float[]{0,0,0}, null); + regionRenderer.draw(gl, jogampRegion.getRegion(gl, rs, 0), null); if(null == labelRegions[currentText]) { if( null == labels[currentText]) { @@ -321,7 +321,7 @@ public class GPUUISceneGLListener0A implements GLEventListener { regionRenderer.rotate(gl, zoomText, 0, 1, 0); regionRenderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f); - regionRenderer.draw(gl, labelRegions[currentText].getRegion(gl, rs, renderModes2), new float[]{0,0,0}, texSize2); + regionRenderer.draw(gl, labelRegions[currentText].getRegion(gl, rs, renderModes2), texSize2); final GLAnimatorControl animator = drawable.getAnimator(); final boolean _drawFPS = showFPS && null != animator; @@ -344,7 +344,7 @@ public class GPUUISceneGLListener0A implements GLEventListener { if(showFPS && null != fpsRegion) { regionRenderer.translate(gl, 0, -60, 0); regionRenderer.scale(null, zoomText, zoomText, 1); - regionRenderer.draw(gl, fpsRegion.getRegion(gl, rs, 0), new float[]{0,0,0}, null); + regionRenderer.draw(gl, fpsRegion.getRegion(gl, rs, 0), null); } } diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/RIButton.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/RIButton.java index 12c90f87d..3060c5657 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/RIButton.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/RIButton.java @@ -215,7 +215,7 @@ public abstract class RIButton extends UIShape { if(!selection){ renderer.setColorStatic(gl, bColor[0], bColor[1], bColor[2]); } - renderer.draw(gl, buttonRegion.getRegion(gl, rs, renderModes), getPosition(), texSize); + renderer.draw(gl, buttonRegion.getRegion(gl, rs, renderModes), texSize); gl.glDisable(GL2ES2.GL_POLYGON_OFFSET_FILL); float[] lColor = labelColor; @@ -225,7 +225,7 @@ public abstract class RIButton extends UIShape { if(!selection){ renderer.setColorStatic(gl, lColor[0], lColor[1], lColor[2]); } - renderer.draw(gl, labelRegion.getRegion(gl, rs, renderModes), getPosition(), texSize); + renderer.draw(gl, labelRegion.getRegion(gl, rs, renderModes), texSize); } public void setPressed(boolean b) { super.setPressed(b); diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java index da94f6a7c..0915ea523 100644 --- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java +++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java @@ -109,10 +109,10 @@ public class UIGLListener01 extends UIListenerBase01 { } regionRenderer.setColorStatic(gl, bColor[0], bColor[1], bColor[2]); - regionRenderer.draw(gl, regionButton.getRegion(gl, rs, 0), getPosition(), null); -// regionRenderer.translate(gl, button.getPosition()[0], button.getPosition()[1], button.getPosition()[2]); + regionRenderer.translate(gl, button.getPosition()[0], button.getPosition()[1], button.getPosition()[2]); + regionRenderer.draw(gl, regionButton.getRegion(gl, rs, 0), null); regionRenderer.setColorStatic(gl, lColor[0], lColor[1], lColor[2]); - regionRenderer.draw(gl, regionLabel.getRegion(gl, rs, 0), getPosition(), null); + regionRenderer.draw(gl, regionLabel.getRegion(gl, rs, 0), null); } public void dispose(GLAutoDrawable drawable) { |