aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2014-04-01 16:31:05 +0200
committerSven Gothel <[email protected]>2014-04-01 16:31:05 +0200
commitb935d5248aef79e2386a284b32f5888348a382d6 (patch)
tree6b661210ee531968fcf7d5c75ded4ed58bd3b0fc
parent07d1c5a272e528d130daf37b9aa7077aac8d748e (diff)
Bug 801: WIP 1/2 - Add color attribute; Switch Shader instead of branching in shader; Update attributes and uniforms manually, drop ShaderState;
- ShaderCode - add int insertShaderSource(int shaderIdx, int position, Class<?> context, String path) - insertShaderSource(..): pos==-1 -> append code - VectorUtil - add isVec3InTriangle3(..., float epsilon) - add testSeg2SegIntersection(..., float epsilon) - add testTri2SegIntersection(..., float epsilon) - AffineTransform: Return result for chaining - Font - Add pixel precise 'getPointsBounds(final AffineTransform transform, CharSequence string, float pixelSize)' - Rename getString*() -> getMetric*() - OTGlyph: Release _points field, no more used - - Graph Triangulation - Count additional vertices in: Triangulator, CDTriangulator2D - OutlineShape: - Allow skipping of 'transformOutlines2Quadratic', i.e. allow tagging OutlineShape to be quadratic_nurbs via 'setIsQuadraticNurbs()' - Clarify cleanup ot outlines in same method 'cleanupOutlines()' - Count additional vertices .. - Graph Shader: - Start splitting and segmenting shader code for: - pass1 / pass2 - features, i.e. sampleCont, color-channel, ..
-rw-r--r--make/scripts/tests.sh6
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java147
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/OutlineShapeXForm.java5
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/Region.java150
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/opengl/GLRegion.java2
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java340
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java218
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java35
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/tess/Triangulator.java10
-rw-r--r--src/jogl/classes/com/jogamp/graph/font/Font.java26
-rw-r--r--src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java164
-rw-r--r--src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderCode.java41
-rw-r--r--src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java20
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java106
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java73
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java311
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java341
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java142
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/AttributeNames.java18
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/UniformNames.java9
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/attributes.glsl16
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-1pass_norm-weight.fp5
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-1pass_norm.fp5
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_msaa-weight.fp13
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_msaa.fp20
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_vbaa-weight.fp10
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_vbaa.fp17
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-lineAA.glsl20
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-simple.glsl21
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-simple.orig.glsl32
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-weight.glsl25
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_lineAA.glsl19
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_simple.glsl26
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_simple.orig.glsl37
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_weight.glsl32
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1.vp30
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allequal.glsl96
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allprop01.glsl113
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allsamples_equal.glsl97
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allsamples_prop01.glsl114
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad.glsl27
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad2.glsl27
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad3.glsl129
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_fxaa3.glsl32
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_bilin1.glsl45
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_equalweight.glsl50
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_propweight1.glsl66
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_polesequal.glsl49
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_polesprop01.glsl65
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_quincunx.glsl21
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_rgss.glsl19
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2.vp17
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-segment-head.fp22
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-single.vp30
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01.vp23
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/uniforms.glsl15
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/varyings.glsl9
-rw-r--r--src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java11
-rw-r--r--src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java60
-rw-r--r--src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java2
-rw-r--r--src/jogl/classes/jogamp/graph/font/typecast/ot/OTGlyph.java12
-rw-r--r--src/jogl/classes/jogamp/graph/geom/plane/AffineTransform.java20
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/TestRegionRendererNEWT01.java15
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java9
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT01.java11
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java15
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/TextRendererGLELBase.java28
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener01.java14
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionGLListener02.java14
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo.java5
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java12
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextGLListener0A.java8
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo.java3
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextRendererListenerBase01.java40
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneGLListener0A.java49
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo.java5
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/ui/CrossHair.java9
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label.java14
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label0.java102
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/ui/RIButton.java72
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/ui/SceneUIController.java20
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIGLListener01.java3
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIListenerBase01.java6
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UINewtDemo01.java3
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIShape.java178
85 files changed, 2513 insertions, 1785 deletions
diff --git a/make/scripts/tests.sh b/make/scripts/tests.sh
index 1ab15bc54..228be78c9 100644
--- a/make/scripts/tests.sh
+++ b/make/scripts/tests.sh
@@ -118,7 +118,7 @@ function jrun() {
#D_ARGS="-Djogl.debug.GLBufferStateTracker -Djogl.debug.GLBufferObjectTracker"
#D_ARGS="-Djogl.debug.GLBufferObjectTracker"
#D_ARGS="-Djogl.debug.GLBufferObjectTracker -Djogl.debug.GLArrayData -Djogl.debug.TraceGL -Djogl.debug.DebugGL"
- D_ARGS="-Djogl.debug.GLSLCode"
+ #D_ARGS="-Djogl.debug.GLSLCode"
#D_ARGS="-Djogl.debug.GLSLCode -Djogl.debug.DebugGL"
#D_ARGS="-Djogl.debug.GLContext -Dnativewindow.debug.JAWT -Dnewt.debug.Window"
#D_ARGS="-Dnativewindow.debug.JAWT -Djogl.debug.GLCanvas"
@@ -229,7 +229,9 @@ function jrun() {
#D_ARGS="-Dnativewindow.osx.calayer.bugfree"
#D_ARGS="-Dnativewindow.debug.ToolkitLock"
#D_ARGS="-Djogl.debug.graph.curve"
- #D_ARGS="-Djogl.debug.graph.curve -Djogl.debug.graph.curve.Instance -Djogl.debug.graph.font.Renderer -Djogl.debug.GLSLCode"
+ #D_ARGS="-Djogl.debug.graph.curve -Djogl.debug.GLSLCode -Djogl.debug.GLSLState"
+ D_ARGS="-Djogl.debug.GLContext"
+ #D_ARGS="-Djogl.debug.graph.curve -Djogl.debug.graph.curve.Instance -Djogl.debug.GLSLCode"
#D_ARGS="-Djogl.debug.GLSLCode -Djogl.debug.graph.curve.triangulation.LINE_AA -Djogl.debug.graph.curve.Triangulation -Djogl.debug.graph.font.Renderer"
#D_ARGS="-Djogl.debug.graph.font.Renderer"
#D_ARGS="-Djogl.debug.GLSLCode -Djogl.debug.graph.curve.vbaa.resizeLowerBoundary=100"
diff --git a/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java b/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java
index 44744584d..d4977669e 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java
@@ -111,6 +111,9 @@ public class OutlineShape implements Comparable<OutlineShape> {
}
}
+ /** Initial {@link #getSharpness()} value, which can be modified via {@link #setSharpness(float)}. */
+ public static final float DEFAULT_SHARPNESS = 0.5f;
+
public static final int DIRTY_BOUNDS = 1 << 0;
/**
* Modified shape, requires to update the vertices and triangles, here: vertices.
@@ -131,6 +134,7 @@ public class OutlineShape implements Comparable<OutlineShape> {
private final AABBox bbox;
private final ArrayList<Triangle> triangles;
private final ArrayList<Vertex> vertices;
+ private int addedVerticeCount;
private VerticesState outlineState;
@@ -153,12 +157,24 @@ public class OutlineShape implements Comparable<OutlineShape> {
this.bbox = new AABBox();
this.triangles = new ArrayList<Triangle>();
this.vertices = new ArrayList<Vertex>();
+ this.addedVerticeCount = 0;
this.dirtyBits = 0;
- this.sharpness = 0.5f;
+ this.sharpness = DEFAULT_SHARPNESS;
+ }
+
+ /**
+ * Return the number of newly added vertices during {@link #getTriangles(VerticesState)}
+ * while transforming the outlines to {@link VerticesState#QUADRATIC_NURBS} and triangulation.
+ * @see #setIsQuadraticNurbs()
+ */
+ public int getAddedVerticeCount() {
+ return addedVerticeCount;
}
+ /** Sharpness value, defaults to {@link #DEFAULT_SHARPNESS}. */
public float getSharpness() { return sharpness; }
+ /** Sets sharpness, defaults to {@link #DEFAULT_SHARPNESS}. */
public void setSharpness(final float s) {
if( this.sharpness != s ) {
clearCache();
@@ -174,6 +190,7 @@ public class OutlineShape implements Comparable<OutlineShape> {
bbox.reset();
vertices.clear();
triangles.clear();
+ addedVerticeCount = 0;
dirtyBits = 0;
}
@@ -418,21 +435,12 @@ public class OutlineShape implements Comparable<OutlineShape> {
}
/**
- * Ensure the outlines represent
- * the specified destinationType.
- * and removes all overlaps in boundary triangles
- * @param destinationType the target outline's vertices state. Currently only
- * {@link OutlineShape.VerticesState#QUADRATIC_NURBS} are supported.
+ * Claim this outline's vertices are all {@link OutlineShape.VerticesState#QUADRATIC_NURBS},
+ * hence no cubic transformations will be performed.
*/
- protected final void transformOutlines(VerticesState destinationType) {
- if(outlineState != destinationType){
- if(destinationType == VerticesState.QUADRATIC_NURBS){
- transformOutlines2Quadratic();
- checkOverlaps();
- } else {
- throw new IllegalStateException("destinationType "+destinationType.name()+" not supported (currently "+outlineState.name()+")");
- }
- }
+ public final void setIsQuadraticNurbs() {
+ outlineState = VerticesState.QUADRATIC_NURBS;
+ // checkPossibleOverlaps = false;
}
private void subdivideTriangle(final Outline outline, Vertex a, Vertex b, Vertex c, int index){
@@ -446,6 +454,8 @@ public class OutlineShape implements Comparable<OutlineShape> {
outline.addVertex(index, vertexFactory.create(tmpV1, 0, 3, false));
outline.addVertex(index+2, vertexFactory.create(tmpV3, 0, 3, false));
+
+ addedVerticeCount += 2;
}
/**
@@ -470,21 +480,24 @@ public class OutlineShape implements Comparable<OutlineShape> {
if ( !currentVertex.isOnCurve()) {
final Vertex nextV = outline.getVertex((i+1)%vertexCount);
final Vertex prevV = outline.getVertex((i+vertexCount-1)%vertexCount);
- Vertex overlap =null;
-
- //check for overlap even if already set for subdivision
- //ensuring both trianglur overlaps get divided
- //for pref. only check in first pass
- //second pass to clear the overlaps arrray(reduces precision errors)
- if(firstpass) {
- overlap = checkTriOverlaps(prevV, currentVertex, nextV);
+ final Vertex overlap;
+
+ // check for overlap even if already set for subdivision
+ // ensuring both triangular overlaps get divided
+ // for pref. only check in first pass
+ // second pass to clear the overlaps array(reduces precision errors)
+ if( firstpass ) {
+ overlap = checkTriOverlaps0(prevV, currentVertex, nextV);
+ } else {
+ overlap = null;
}
- if(overlaps.contains(currentVertex) || overlap != null) {
+ if( overlaps.contains(currentVertex) || overlap != null ) {
overlaps.remove(currentVertex);
subdivideTriangle(outline, prevV, currentVertex, nextV, i);
i+=3;
vertexCount+=2;
+ addedVerticeCount+=2;
if(overlap != null && !overlap.isOnCurve()) {
if(!overlaps.contains(overlap)) {
@@ -496,11 +509,11 @@ public class OutlineShape implements Comparable<OutlineShape> {
}
}
firstpass = false;
- }while(!overlaps.isEmpty());
+ } while( !overlaps.isEmpty() );
}
- private Vertex checkTriOverlaps(Vertex a, Vertex b, Vertex c) {
- int count = getOutlineNumber();
+ private Vertex checkTriOverlaps0(final Vertex a, final Vertex b, final Vertex c) {
+ final int count = getOutlineNumber();
for (int cc = 0; cc < count; cc++) {
final Outline outline = getOutline(cc);
int vertexCount = outline.getVertexCount();
@@ -524,45 +537,81 @@ public class OutlineShape implements Comparable<OutlineShape> {
}
if(VectorUtil.testTri2SegIntersection(a, b, c, prevV, current) ||
VectorUtil.testTri2SegIntersection(a, b, c, current, nextV) ||
- VectorUtil.testTri2SegIntersection(a, b, c, prevV, nextV)) {
+ VectorUtil.testTri2SegIntersection(a, b, c, prevV, nextV) ) {
return current;
}
}
}
return null;
}
+ @SuppressWarnings("unused")
+ private Vertex checkTriOverlaps1(final Vertex a, final Vertex b, final Vertex c) {
+ final int count = getOutlineNumber();
+ for (int cc = 0; cc < count; cc++) {
+ final Outline outline = getOutline(cc);
+ int vertexCount = outline.getVertexCount();
+ for(int i=0; i < vertexCount; i++) {
+ final Vertex current = outline.getVertex(i);
+ if(current.isOnCurve() || current == a || current == b || current == c) {
+ continue;
+ }
+ final Vertex nextV = outline.getVertex((i+1)%vertexCount);
+ final Vertex prevV = outline.getVertex((i+vertexCount-1)%vertexCount);
- private void transformOutlines2Quadratic() {
+ //skip neighboring triangles
+ if(prevV == c || nextV == a) {
+ continue;
+ }
+
+ if( VectorUtil.isVec3InTriangle3(a.getCoord(), b.getCoord(), c.getCoord(),
+ current.getCoord(), nextV.getCoord(), prevV.getCoord(),
+ tmpV1, tmpV2, tmpV3, FloatUtil.EPSILON) ) {
+ return current;
+ }
+ if(VectorUtil.testTri2SegIntersection(a, b, c, prevV, current, FloatUtil.EPSILON) ||
+ VectorUtil.testTri2SegIntersection(a, b, c, current, nextV, FloatUtil.EPSILON) ||
+ VectorUtil.testTri2SegIntersection(a, b, c, prevV, nextV, FloatUtil.EPSILON) ) {
+ return current;
+ }
+ }
+ }
+ return null;
+ }
+
+ private void cleanupOutlines() {
+ final boolean transformOutlines2Quadratic = VerticesState.QUADRATIC_NURBS != outlineState;
int count = getOutlineNumber();
for (int cc = 0; cc < count; cc++) {
final Outline outline = getOutline(cc);
int vertexCount = outline.getVertexCount();
- for(int i=0; i < vertexCount; i++) {
- final Vertex currentVertex = outline.getVertex(i);
- final Vertex nextVertex = outline.getVertex((i+1)%vertexCount);
- if ( !currentVertex.isOnCurve() && !nextVertex.isOnCurve() ) {
- VectorUtil.midVec3(tmpV1, currentVertex.getCoord(), nextVertex.getCoord());
- final Vertex v = vertexFactory.create(tmpV1, 0, 3, true);
- i++;
- vertexCount++;
- outline.addVertex(i, v);
+ if( transformOutlines2Quadratic ) {
+ for(int i=0; i < vertexCount; i++) {
+ final Vertex currentVertex = outline.getVertex(i);
+ final int j = (i+1)%vertexCount;
+ final Vertex nextVertex = outline.getVertex(j);
+ if ( !currentVertex.isOnCurve() && !nextVertex.isOnCurve() ) {
+ VectorUtil.midVec3(tmpV1, currentVertex.getCoord(), nextVertex.getCoord());
+ System.err.println("XXX: Cubic: "+i+": "+currentVertex+", "+j+": "+nextVertex);
+ final Vertex v = vertexFactory.create(tmpV1, 0, 3, true);
+ i++;
+ vertexCount++;
+ addedVerticeCount++;
+ outline.addVertex(i, v);
+ }
}
}
- if(vertexCount <= 0) {
+ if( 0 >= vertexCount ) {
outlines.remove(outline);
cc--;
count--;
- continue;
- }
-
- if( vertexCount > 0 ) {
- if(VectorUtil.isVec3Equal( outline.getVertex(0).getCoord(), 0, outline.getLastVertex().getCoord(), 0, FloatUtil.EPSILON )) {
- outline.removeVertex(vertexCount-1);
- }
+ } else if( 0 < vertexCount &&
+ VectorUtil.isVec3Equal( outline.getVertex(0).getCoord(), 0, outline.getLastVertex().getCoord(), 0, FloatUtil.EPSILON )) {
+ outline.removeVertex(vertexCount-1);
}
}
outlineState = VerticesState.QUADRATIC_NURBS;
+ checkOverlaps();
}
private int generateVertexIds() {
@@ -616,6 +665,7 @@ public class OutlineShape implements Comparable<OutlineShape> {
triangulator2d.addCurve(triangles, outlines.get(index), sharpness);
}
triangulator2d.generate(triangles);
+ addedVerticeCount += triangulator2d.getAddedVerticeCount();
triangulator2d.reset();
}
}
@@ -631,8 +681,11 @@ public class OutlineShape implements Comparable<OutlineShape> {
*/
public ArrayList<Triangle> getTriangles(VerticesState destinationType) {
final boolean updated;
+ if(destinationType != VerticesState.QUADRATIC_NURBS) {
+ throw new IllegalStateException("destinationType "+destinationType.name()+" not supported (currently "+outlineState.name()+")");
+ }
if( 0 != ( DIRTY_TRIANGLES & dirtyBits ) ) {
- transformOutlines(destinationType);
+ cleanupOutlines();
triangulateImpl();
updated = true;
dirtyBits |= DIRTY_VERTICES;
diff --git a/src/jogl/classes/com/jogamp/graph/curve/OutlineShapeXForm.java b/src/jogl/classes/com/jogamp/graph/curve/OutlineShapeXForm.java
index b1c99f5ed..cf4d38450 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/OutlineShapeXForm.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/OutlineShapeXForm.java
@@ -4,10 +4,13 @@ import jogamp.graph.geom.plane.AffineTransform;
public class OutlineShapeXForm {
public final OutlineShape shape;
- public final AffineTransform t;
+ private AffineTransform t;
public OutlineShapeXForm(final OutlineShape shape, final AffineTransform t) {
this.shape = shape;
this.t = t;
}
+
+ public final AffineTransform getTransform() { return t; }
+ public final void setTransform(final AffineTransform t) { this.t = t; }
} \ No newline at end of file
diff --git a/src/jogl/classes/com/jogamp/graph/curve/Region.java b/src/jogl/classes/com/jogamp/graph/curve/Region.java
index 15a0d6bff..2cd68a806 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/Region.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/Region.java
@@ -78,11 +78,31 @@ public abstract class Region {
* being applied.
* </p>
*/
- public static final int VARIABLE_CURVE_WEIGHT_BIT = 1 << 8;
+ public static final int VARWEIGHT_RENDERING_BIT = 1 << 8;
+
+ /**
+ * Rendering-Mode bit for {@link Region#getRenderModes() Region} and {@link com.jogamp.graph.curve.opengl.RegionRenderer#getRenderModes() RegionRenderer}.
+ * <p>
+ * If set, a color channel attribute per vertex is added to the stream,
+ * otherwise only the
+ * {@link com.jogamp.graph.curve.opengl.RegionRenderer#setColorStatic(javax.media.opengl.GL2ES2, float, float, float, float) static color}
+ * is being used.
+ * </p>
+ */
+ public static final int COLORCHANNEL_RENDERING_BIT = 1 << 9;
+
+ /**
+ * Rendering-Mode bit for {@link Region#getRenderModes() Region} and {@link com.jogamp.graph.curve.opengl.RegionRenderer#getRenderModes() RegionRenderer}.
+ * <p>
+ * If set, a color texture is used to determine the color.
+ * </p>
+ */
+ public static final int COLORTEXTURE_RENDERING_BIT = 1 << 10;
public static final int TWO_PASS_DEFAULT_TEXTURE_UNIT = 0;
private final int renderModes;
+ private int quality;
private boolean dirty = true;
private int numVertices = 0;
protected final AABBox box = new AABBox();
@@ -91,48 +111,73 @@ public abstract class Region {
public static boolean isVBAA(int renderModes) {
return 0 != (renderModes & Region.VBAA_RENDERING_BIT);
}
+
public static boolean isMSAA(int renderModes) {
return 0 != (renderModes & Region.MSAA_RENDERING_BIT);
}
+ public static boolean isTwoPass(int renderModes) {
+ return 0 != ( renderModes & ( Region.VBAA_RENDERING_BIT | Region.MSAA_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 */
- public static boolean isNonUniformWeight(int renderModes) {
- return 0 != (renderModes & Region.VARIABLE_CURVE_WEIGHT_BIT);
+ * Returns true if render mode capable of variable weights,
+ * i.e. the bit {@link #VARWEIGHT_RENDERING_BIT} is set,
+ * otherwise false.
+ */
+ public static boolean hasVariableWeight(int renderModes) {
+ return 0 != (renderModes & Region.VARWEIGHT_RENDERING_BIT);
+ }
+
+ /**
+ * Returns true if render mode has a color channel,
+ * i.e. the bit {@link #COLORCHANNEL_RENDERING_BIT} is set,
+ * otherwise false.
+ */
+ public static boolean hasColorChannel(int renderModes) {
+ return 0 != (renderModes & Region.COLORCHANNEL_RENDERING_BIT);
+ }
+
+ /**
+ * Returns true if render mode has a color texture,
+ * i.e. the bit {@link #COLORTEXTURE_RENDERING_BIT} is set,
+ * otherwise false.
+ */
+ public static boolean hasColorTexture(int renderModes) {
+ return 0 != (renderModes & Region.COLORTEXTURE_RENDERING_BIT);
}
public static String getRenderModeString(int renderModes) {
- final String curveS = isNonUniformWeight(renderModes) ? "-curve" : "";
+ final String curveS = hasVariableWeight(renderModes) ? "-curve" : "";
+ final String cChanS = hasColorChannel(renderModes) ? "-cols" : "";
+ final String cTexS = hasColorTexture(renderModes) ? "-ctex" : "";
if( Region.isVBAA(renderModes) ) {
- return "vbaa"+curveS;
+ return "vbaa"+curveS+cChanS+cTexS;
} else if( Region.isMSAA(renderModes) ) {
- return "msaa"+curveS;
+ return "msaa"+curveS+cChanS+cTexS;
} else {
- return "norm"+curveS;
+ return "norm"+curveS+cChanS+cTexS;
}
}
protected Region(int regionRenderModes) {
this.renderModes = regionRenderModes;
+ this.quality = 99;
}
// FIXME: Better handling of impl. buffer growth .. !
+ // protected abstract void setupInitialComponentCount(int attributeCount, int indexCount);
- protected abstract void pushVertex(float[] coords, float[] texParams);
+ protected abstract void pushVertex(final float[] coords, final float[] texParams, float[] rgba);
protected abstract void pushIndex(int idx);
/**
* Return bit-field of render modes, see {@link #create(int)}.
*/
- public final int getRenderModes() {
- return renderModes;
- }
+ public final int getRenderModes() { return renderModes; }
+
+ public final int getQuality() { return quality; }
+ public final void setQuality(int q) { quality=q; }
protected void clearImpl() {
dirty = true;
@@ -141,31 +186,50 @@ public abstract class Region {
}
/**
- * Return true if capable of two pass rendering - VBAA, otherwise false.
+ * Returns true if capable of two pass rendering - VBAA, otherwise false.
*/
public final boolean isVBAA() {
- return isVBAA(renderModes);
+ return Region.isVBAA(renderModes);
}
/**
- * Return true if capable of two pass rendering - MSAA, otherwise false.
+ * Returns true if capable of two pass rendering - MSAA, otherwise false.
*/
public final boolean isMSAA() {
- return isMSAA(renderModes);
+ return Region.isMSAA(renderModes);
+ }
+
+ /**
+ * Returns true if capable of variable weights, otherwise false.
+ */
+ public final boolean hasVariableWeight() {
+ return Region.hasVariableWeight(renderModes);
}
/**
- * Return true if capable of nonuniform weights, otherwise false.
+ * Returns true if render mode has a color channel,
+ * i.e. the bit {@link #COLORCHANNEL_RENDERING_BIT} is set,
+ * otherwise false.
*/
- public final boolean isNonUniformWeight() {
- return Region.isNonUniformWeight(renderModes);
+ public boolean hasColorChannel() {
+ return Region.hasColorChannel(renderModes);
}
+ /**
+ * Returns true if render mode has a color texture,
+ * i.e. the bit {@link #COLORTEXTURE_RENDERING_BIT} is set,
+ * otherwise false.
+ */
+ public boolean hasColorTexture() {
+ return Region.hasColorTexture(renderModes);
+ }
+
+
/** See {@link #setFrustum(Frustum)} */
public final Frustum getFrustum() { return frustum; }
/**
- * Set {@link Frustum} culling for {@link #addOutlineShape(OutlineShape, AffineTransform)}.
+ * Set {@link Frustum} culling for {@link #addOutlineShape(OutlineShape, AffineTransform, float[])}.
*/
public final void setFrustum(Frustum frustum) {
this.frustum = frustum;
@@ -173,23 +237,23 @@ public abstract class Region {
final float[] coordsEx = new float[3];
- private void pushNewVertexImpl(final Vertex vertIn, final AffineTransform transform) {
+ private void pushNewVertexImpl(final Vertex vertIn, final AffineTransform transform, float[] rgba) {
if( null != transform ) {
final float[] coordsIn = vertIn.getCoord();
transform.transform(coordsIn, coordsEx);
coordsEx[2] = coordsIn[2];
box.resize(coordsEx[0], coordsEx[1], coordsEx[2]);
- pushVertex(coordsEx, vertIn.getTexCoord());
+ pushVertex(coordsEx, vertIn.getTexCoord(), rgba);
} else {
box.resize(vertIn.getX(), vertIn.getY(), vertIn.getZ());
- pushVertex(vertIn.getCoord(), vertIn.getTexCoord());
+ pushVertex(vertIn.getCoord(), vertIn.getTexCoord(), rgba);
}
numVertices++;
}
- private void pushNewVertexIdxImpl(final Vertex vertIn, final AffineTransform transform) {
+ private void pushNewVertexIdxImpl(final Vertex vertIn, final AffineTransform transform, float[] rgba) {
pushIndex(numVertices);
- pushNewVertexImpl(vertIn, transform);
+ pushNewVertexImpl(vertIn, transform, rgba);
}
private final AABBox tmpBox = new AABBox();
@@ -201,8 +265,9 @@ public abstract class Region {
* is dropped if it's {@link OutlineShape#getBounds() bounding-box} is fully outside of the frustum.
* The optional {@link AffineTransform} is applied to the bounding-box beforehand.
* </p>
+ * @param rgbaColor TODO
*/
- public final void addOutlineShape(final OutlineShape shape, final AffineTransform t) {
+ public final void addOutlineShape(final OutlineShape shape, final AffineTransform t, final float[] rgbaColor) {
if( null != frustum ) {
final AABBox shapeBox = shape.getBounds();
final AABBox shapeBoxT;
@@ -222,8 +287,15 @@ public abstract class Region {
final List<Triangle> trisIn = shape.getTriangles(OutlineShape.VerticesState.QUADRATIC_NURBS);
final ArrayList<Vertex> vertsIn = shape.getVertices();
if(DEBUG_INSTANCE) {
+ final int addedVerticeCount = shape.getAddedVerticeCount();
+ final int verticeCount = vertsIn.size() + addedVerticeCount;
+ final int indexCount = trisIn.size() * 3;
System.err.println("Region.addOutlineShape().0: tris: "+trisIn.size()+", verts "+vertsIn.size()+", transform "+t);
+ System.err.println("Region.addOutlineShape().0: VerticeCount "+vertsIn.size()+" + "+addedVerticeCount+" = "+verticeCount);
+ System.err.println("Region.addOutlineShape().0: IndexCount "+indexCount);
}
+ // setupInitialComponentCount(verticeCount, indexCount); // FIXME: Use it ?
+
final int idxOffset = numVertices;
int vertsVNewIdxCount = 0, vertsTMovIdxCount = 0, vertsTNewIdxCount = 0, tris = 0;
int vertsDupCountV = 0, vertsDupCountT = 0, vertsKnownMovedT = 0;
@@ -232,7 +304,7 @@ public abstract class Region {
System.err.println("Region.addOutlineShape(): Processing Vertices");
}
for(int i=0; i<vertsIn.size(); i++) {
- pushNewVertexImpl(vertsIn.get(i), t);
+ pushNewVertexImpl(vertsIn.get(i), t, rgbaColor);
vertsVNewIdxCount++;
}
if(DEBUG_INSTANCE) {
@@ -261,9 +333,9 @@ public abstract class Region {
if(Region.DEBUG_INSTANCE) {
System.err.println("T["+i+"]: New Idx "+numVertices);
}
- pushNewVertexIdxImpl(triInVertices[0], t);
- pushNewVertexIdxImpl(triInVertices[1], t);
- pushNewVertexIdxImpl(triInVertices[2], t);
+ pushNewVertexIdxImpl(triInVertices[0], t, rgbaColor);
+ pushNewVertexIdxImpl(triInVertices[1], t, rgbaColor);
+ pushNewVertexIdxImpl(triInVertices[2], t, rgbaColor);
vertsTNewIdxCount+=3;
}
tris++;
@@ -280,9 +352,9 @@ public abstract class Region {
setDirty(true);
}
- public final void addOutlineShapes(final List<OutlineShape> shapes, final AffineTransform transform) {
+ public final void addOutlineShapes(final List<OutlineShape> shapes, final AffineTransform transform, final float[] rgbaColor) {
for (int i = 0; i < shapes.size(); i++) {
- addOutlineShape(shapes.get(i), transform);
+ addOutlineShape(shapes.get(i), transform, rgbaColor);
}
}
@@ -306,6 +378,6 @@ public abstract class Region {
}
public String toString() {
- return "Region["+getRenderModeString(this.renderModes)+", dirty "+dirty+", vertices "+numVertices+", box "+box+"]";
+ return "Region["+getRenderModeString(this.renderModes)+", q "+quality+", dirty "+dirty+", vertices "+numVertices+", box "+box+"]";
}
} \ No newline at end of file
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 96d285898..e305cc336 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/opengl/GLRegion.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/GLRegion.java
@@ -56,7 +56,7 @@ public abstract class GLRegion extends Region {
* {@link Region#TWO_PASS_DEFAULT_TEXTURE_UNIT} is being used.</p>
*
* @param rs the RenderState to be used
- * @param renderModes bit-field of modes, e.g. {@link Region#VARIABLE_CURVE_WEIGHT_BIT}, {@link Region#VBAA_RENDERING_BIT}
+ * @param renderModes bit-field of modes, e.g. {@link Region#VARWEIGHT_RENDERING_BIT}, {@link Region#VBAA_RENDERING_BIT}
*/
public static GLRegion create(int renderModes) {
if( isVBAA(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 8233d4262..8df34ead5 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/RegionRenderer.java
@@ -27,16 +27,21 @@
*/
package com.jogamp.graph.curve.opengl;
-import java.nio.FloatBuffer;
+import java.io.IOException;
+import java.util.Iterator;
import javax.media.opengl.GL;
import javax.media.opengl.GL2ES2;
import javax.media.opengl.GLException;
import javax.media.opengl.fixedfunc.GLMatrixFunc;
+import jogamp.graph.curve.opengl.shader.AttributeNames;
+
+import com.jogamp.opengl.GLExtensions;
import com.jogamp.opengl.util.glsl.ShaderCode;
-import com.jogamp.opengl.util.glsl.ShaderState;
+import com.jogamp.opengl.util.glsl.ShaderProgram;
import com.jogamp.opengl.util.PMVMatrix;
+import com.jogamp.common.util.IntObjectHashMap;
import com.jogamp.graph.curve.Region;
/**
@@ -46,7 +51,7 @@ import com.jogamp.graph.curve.Region;
* are passed through an instance of this class.
* </p>
*/
-public abstract class RegionRenderer {
+public class RegionRenderer {
protected static final boolean DEBUG = Region.DEBUG;
protected static final boolean DEBUG_INSTANCE = Region.DEBUG_INSTANCE;
@@ -95,10 +100,6 @@ public abstract class RegionRenderer {
}
};
- public static boolean isWeightValid(float v) {
- return 0.0f <= v && v <= 1.9f ;
- }
-
/**
* Create a Hardware accelerated Region Renderer.
* <p>
@@ -108,7 +109,7 @@ public abstract class RegionRenderer {
* can be utilized to enable and disable {@link GL#GL_BLEND}.
* </p>
* @param rs the used {@link RenderState}
- * @param renderModes bit-field of modes, e.g. {@link Region#VARIABLE_CURVE_WEIGHT_BIT}, {@link Region#VBAA_RENDERING_BIT}
+ * @param renderModes bit-field of modes, e.g. {@link Region#VARWEIGHT_RENDERING_BIT}, {@link Region#VBAA_RENDERING_BIT}
* @param enableCallback optional {@link GLCallback}, if not <code>null</code> will be issued at
* {@link #init(GL2ES2) init(gl)} and {@link #enable(GL2ES2, boolean) enable(gl, true)}.
* @param disableCallback optional {@link GLCallback}, if not <code>null</code> will be issued at
@@ -118,7 +119,7 @@ public abstract class RegionRenderer {
*/
public static RegionRenderer create(final RenderState rs, final int renderModes,
final GLCallback enableCallback, final GLCallback disableCallback) {
- return new jogamp.graph.curve.opengl.RegionRendererImpl01(rs, renderModes, enableCallback, disableCallback);
+ return new RegionRenderer(rs, renderModes, enableCallback, disableCallback);
}
private final int renderModes;
@@ -139,19 +140,10 @@ public abstract class RegionRenderer {
/** Return height of current viewport */
public final int getHeight() { return vp_height; }
- public final float getWeight() { return rs.getWeight().floatValue(); }
- public final float getAlpha() { return rs.getAlpha().floatValue(); }
- public final PMVMatrix getMatrix() { return rs.pmvMatrix(); }
-
- /**
- * Implementation shall load, compile and link the shader program and leave it active.
- * @param gl referencing the current GLContext to which the ShaderState is bound to
- * @return
- */
- protected abstract boolean initImpl(GL2ES2 gl);
-
- /** Delete and clean the associated OGL objects */
- protected abstract void destroyImpl(GL2ES2 gl);
+ public final PMVMatrix getMatrix() { return rs.getMatrix(); }
+ public final PMVMatrix getMatrixMutable() { return rs.getMatrixMutable(); }
+ public final void setMatrixDirty() { rs.setMatrixDirty(); }
+ public final boolean isMatrixDirty() { return rs.isMatrixDirty(); }
//////////////////////////////////////
@@ -170,14 +162,14 @@ public abstract class RegionRenderer {
return renderModes;
}
- public final boolean usesVariableCurveWeight() { return Region.isNonUniformWeight(renderModes); }
+ public final boolean usesVariableCurveWeight() { return Region.hasVariableWeight(renderModes); }
/**
* @return true if Region's renderModes contains all bits as this Renderer's renderModes
- * except {@link Region#VARIABLE_CURVE_WEIGHT_BIT}, otherwise false.
+ * except {@link Region#VARWEIGHT_RENDERING_BIT}, otherwise false.
*/
public final boolean areRenderModesCompatible(final Region region) {
- final int cleanRenderModes = getRenderModes() & ( Region.VARIABLE_CURVE_WEIGHT_BIT );
+ final int cleanRenderModes = getRenderModes() & ( Region.VARWEIGHT_RENDERING_BIT );
return cleanRenderModes == ( region.getRenderModes() & cleanRenderModes );
}
@@ -217,28 +209,11 @@ public abstract class RegionRenderer {
enableCallback.run(gl, this);
}
- initialized = initImpl(gl);
+ useShaderProgram(gl, renderModes, true, 0, 0);
+ initialized = rs.update(gl, true, renderModes, true);
if(!initialized) {
throw new GLException("Shader initialization failed");
}
-
- if(!rs.getShaderState().uniform(gl, rs.getPMVMatrix())) {
- throw new GLException("Error setting PMVMatrix in shader: "+rs.getShaderState());
- }
-
- if( Region.isNonUniformWeight( getRenderModes() ) ) {
- if(!rs.getShaderState().uniform(gl, rs.getWeight())) {
- throw new GLException("Error setting weight in shader: "+rs.getShaderState());
- }
- }
-
- if(!rs.getShaderState().uniform(gl, rs.getAlpha())) {
- throw new GLException("Error setting global alpha in shader: "+rs.getShaderState());
- }
-
- if(!rs.getShaderState().uniform(gl, rs.getColorStatic())) {
- throw new GLException("Error setting global color in shader: "+rs.getShaderState());
- }
}
public final void destroy(GL2ES2 gl) {
@@ -248,18 +223,19 @@ public abstract class RegionRenderer {
}
return;
}
- rs.getShaderState().useProgram(gl, false);
- destroyImpl(gl);
+ for(final Iterator<IntObjectHashMap.Entry> i = shaderPrograms.iterator(); i.hasNext(); ) {
+ final ShaderProgram sp = (ShaderProgram) i.next().getValue();
+ sp.destroy(gl);
+ }
rs.destroy(gl);
initialized = false;
}
public final RenderState getRenderState() { return rs; }
- public final ShaderState getShaderState() { return rs.getShaderState(); }
/**
- * Enabling or disabling the {@link RenderState#getShaderState() RenderState}'s
- * {@link ShaderState#useProgram(GL2ES2, boolean) ShaderState program}.
+ * Enabling or disabling the {@link #getRenderState() RenderState}'s
+ * {@link RenderState#getShaderProgram() shader program}.
* <p>
* In case enable and disable {@link GLCallback}s are setup via {@link #create(RenderState, int, GLCallback, GLCallback)},
* they will be called before toggling the shader program.
@@ -276,103 +252,59 @@ public abstract class RegionRenderer {
disableCallback.run(gl, this);
}
}
- rs.getShaderState().useProgram(gl, enable);
- }
-
- public final void setWeight(GL2ES2 gl, float v) {
- if( !isWeightValid(v) ) {
- throw new IllegalArgumentException("Weight out of range");
- }
- rs.getWeight().setData(v);
- if(null != gl && rs.getShaderState().inUse() && Region.isNonUniformWeight( getRenderModes() ) ) {
- rs.getShaderState().uniform(gl, rs.getWeight());
- }
- }
-
- public final void setAlpha(GL2ES2 gl, float alpha_t) {
- rs.getAlpha().setData(alpha_t);
- if(null != gl && rs.getShaderState().inUse()) {
- rs.getShaderState().uniform(gl, rs.getAlpha());
- }
-
- }
-
- public final void getColorStatic(float[] rgb) {
- FloatBuffer fb = (FloatBuffer) rs.getColorStatic().getBuffer();
- rgb[0] = fb.get(0);
- rgb[1] = fb.get(1);
- rgb[2] = fb.get(2);
- }
-
- public final void setColorStatic(GL2ES2 gl, float r, float g, float b){
- FloatBuffer fb = (FloatBuffer) rs.getColorStatic().getBuffer();
- fb.put(0, r);
- fb.put(1, g);
- fb.put(2, b);
- if(null != gl && rs.getShaderState().inUse()) {
- rs.getShaderState().uniform(gl, rs.getColorStatic());
- }
- }
-
- public final void updateMatrix(GL2ES2 gl) {
- if(initialized && null != gl && rs.getShaderState().inUse()) {
- rs.getShaderState().uniform(gl, rs.getPMVMatrix());
+ if( !enable ) {
+ final ShaderProgram sp = rs.getShaderProgram();
+ if( null != sp ) {
+ sp.useProgram(gl, false);
+ }
}
}
- /** No PMVMatrix operation is performed here. PMVMatrix will be updated if gl is not null. */
- public final boolean reshapeNotify(GL2ES2 gl, int width, int height) {
+ /** No PMVMatrix operation is performed here. PMVMatrix is marked dirty. */
+ public final void reshapeNotify(int width, int height) {
this.vp_width = width;
this.vp_height = height;
- updateMatrix(gl);
- return true;
+ rs.setMatrixDirty();
}
- public final boolean reshapePerspective(GL2ES2 gl, float angle, int width, int height, float near, float far) {
+ public final void reshapePerspective(float angle, int width, int height, float near, float far) {
this.vp_width = width;
this.vp_height = height;
final float ratio = (float)width/(float)height;
- final PMVMatrix p = rs.pmvMatrix();
+ final PMVMatrix p = rs.getMatrixMutable();
p.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
p.glLoadIdentity();
p.gluPerspective(angle, ratio, near, far);
- updateMatrix(gl);
- return true;
}
- public final boolean reshapeOrtho(GL2ES2 gl, int width, int height, float near, float far) {
+ public final void reshapeOrtho(int width, int height, float near, float far) {
this.vp_width = width;
this.vp_height = height;
- final PMVMatrix p = rs.pmvMatrix();
+ final PMVMatrix p = rs.getMatrixMutable();
p.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
p.glLoadIdentity();
p.glOrthof(0, width, 0, height, near, far);
- updateMatrix(gl);
- return true;
}
- protected String getVertexShaderName() {
- return "curverenderer" + getImplVersion();
- }
+ //
+ // Shader Management
+ //
- protected String getFragmentShaderName() {
- final String version = getImplVersion();
- final String pass;
- if( Region.isVBAA(renderModes) ) {
- pass = "-2pass_vbaa";
- } else if( Region.isMSAA(renderModes) ) {
- pass = "-2pass_msaa";
- } else {
- pass = "-1pass_norm" ;
- }
- final String weight = Region.isNonUniformWeight(renderModes) ? "-weight" : "" ;
- return "curverenderer" + version + pass + weight;
+ private static final String SHADER_SRC_SUB = "";
+ private static final String SHADER_BIN_SUB = "bin";
+
+ private static String USE_COLOR_CHANNEL = "#define USE_COLOR_CHANNEL 1\n";
+ private static String USE_COLOR_TEXTURE = "#define USE_COLOR_TEXTURE 1\n";
+ private static String DEF_SAMPLE_COUNT = "#define SAMPLE_COUNT ";
+
+ private String getVersionedShaderName() {
+ return "curverenderer01";
}
// FIXME: Really required to have sampler2D def. precision ? If not, we can drop getFragmentShaderPrecision(..) and use default ShaderCode ..
- public static final String es2_precision_fp = "\nprecision mediump float;\nprecision mediump int;\nprecision mediump sampler2D;\n";
+ private static final String es2_precision_fp = "\nprecision mediump float;\nprecision mediump int;\nprecision mediump sampler2D;\n";
- protected String getFragmentShaderPrecision(GL2ES2 gl) {
+ private final String getFragmentShaderPrecision(GL2ES2 gl) {
if( gl.isGLES() ) {
return es2_precision_fp;
}
@@ -382,7 +314,173 @@ public abstract class RegionRenderer {
return null;
}
- protected String getImplVersion() {
- return "01";
+ private static enum ShaderModeSelector1 {
+ /** Pass-1: Curve Simple */
+ PASS1_SIMPLE("curve", "_simple", 0),
+ /** Pass-1: Curve Varying Weight */
+ PASS1_WEIGHT("curve", "_weight", 0),
+ /** Pass-2: MSAA */
+ PASS2_MSAA("msaa", "", 0),
+ /** Pass-2: VBAA Flipquad3, 1 sample */
+ PASS2_VBAA_QUAL0_SAMPLES1("vbaa", "_flipquad3", 1),
+ /** Pass-2: VBAA Flipquad3, 2 samples */
+ PASS2_VBAA_QUAL0_SAMPLES2("vbaa", "_flipquad3", 2),
+ /** Pass-2: VBAA Flipquad3, 4 samples */
+ PASS2_VBAA_QUAL0_SAMPLES4("vbaa", "_flipquad3", 4),
+ /** Pass-2: VBAA Flipquad3, 8 samples */
+ PASS2_VBAA_QUAL0_SAMPLES8("vbaa", "_flipquad3", 8),
+ /** Pass-2: VBAA All-Equal, 2 samples */
+ PASS2_VBAA_QUAL1_SAMPLES2("vbaa", "_allequal", 2),
+ /** Pass-2: VBAA All-Equal, 4 samples */
+ PASS2_VBAA_QUAL1_SAMPLES4("vbaa", "_allequal", 4),
+ /** Pass-2: VBAA All-Equal, 6 samples */
+ PASS2_VBAA_QUAL1_SAMPLES6("vbaa", "_allequal", 6),
+ /** Pass-2: VBAA All-Equal, 8 samples */
+ PASS2_VBAA_QUAL1_SAMPLES8("vbaa", "_allequal", 8);
+
+ public final String tech;
+ public final String sub;
+ public final int sampleCount;
+
+ ShaderModeSelector1(final String tech, final String sub, final int sampleCount) {
+ this.tech = tech;
+ this.sub= sub;
+ this.sampleCount = sampleCount;
+ }
+
+ public static ShaderModeSelector1 selectPass1(final int renderModes) {
+ return Region.hasVariableWeight(renderModes) ? PASS1_WEIGHT : PASS1_SIMPLE;
+ }
+
+ public static ShaderModeSelector1 selectPass2(final int renderModes, final int quality, final int sampleCount) {
+ if( Region.isMSAA(renderModes) ) {
+ return PASS2_MSAA;
+ } else if( Region.isVBAA(renderModes) ) {
+ if( 0 == quality ) {
+ if( sampleCount < 2 ) {
+ return PASS2_VBAA_QUAL0_SAMPLES1;
+ } else if( sampleCount < 4 ) {
+ return PASS2_VBAA_QUAL0_SAMPLES2;
+ } else if( sampleCount < 8 ) {
+ return PASS2_VBAA_QUAL0_SAMPLES4;
+ } else {
+ return PASS2_VBAA_QUAL0_SAMPLES8;
+ }
+ } else {
+ if( sampleCount < 4 ) {
+ return PASS2_VBAA_QUAL1_SAMPLES2;
+ } else if( sampleCount < 6 ) {
+ return PASS2_VBAA_QUAL1_SAMPLES4;
+ } else if( sampleCount < 8 ) {
+ return PASS2_VBAA_QUAL1_SAMPLES6;
+ } else {
+ return PASS2_VBAA_QUAL1_SAMPLES8;
+ }
+ }
+ } else {
+ return null;
+ }
+ }
}
+ private final IntObjectHashMap shaderPrograms = new IntObjectHashMap();
+
+ private static final int HIGH_MASK = Region.COLORCHANNEL_RENDERING_BIT | Region.COLORTEXTURE_RENDERING_BIT;
+
+ /**
+ * @param gl
+ * @param renderModes
+ * @param pass1
+ * @param quality
+ * @param sampleCount
+ * @return true if a new shader program is being used and hence external uniform-data and -location,
+ * as well as the attribute-location must be updated, otherwise false.
+ */
+ public final boolean useShaderProgram(final GL2ES2 gl, final int renderModes,
+ final boolean pass1, final int quality, final int sampleCount) {
+ final ShaderModeSelector1 sel1 = pass1 ? ShaderModeSelector1.selectPass1(renderModes) :
+ ShaderModeSelector1.selectPass2(renderModes, quality, sampleCount);
+ final int shaderKey = sel1.ordinal() | ( HIGH_MASK & renderModes );
+
+ /**
+ if(DEBUG) {
+ System.err.printf("RegionRendererImpl01.useShaderProgram.0: renderModes %s, sel1 %s, key 0x%X (pass1 %b, q %d, samples %d) - Thread %s%n",
+ Region.getRenderModeString(renderModes), sel1, shaderKey, pass1, quality, sampleCount, Thread.currentThread());
+ } */
+
+ ShaderProgram sp = (ShaderProgram) shaderPrograms.get( shaderKey );
+ if( null != sp ) {
+ final boolean spChanged = getRenderState().setShaderProgram(gl, sp);
+ if(DEBUG) {
+ if( spChanged ) {
+ System.err.printf("RegionRendererImpl01.useShaderProgram.X1: GOT renderModes %s, sel1 %s, key 0x%X (changed)%n", Region.getRenderModeString(renderModes), sel1, shaderKey);
+ }
+ }
+ return spChanged;
+ }
+ final String versionedBaseName = getVersionedShaderName();
+ final String vertexShaderName;
+ if( Region.isTwoPass( renderModes ) ) {
+ vertexShaderName = versionedBaseName+"-pass"+(pass1?1:2);
+ } else {
+ vertexShaderName = versionedBaseName+"-single";
+ }
+ final ShaderCode rsVp = ShaderCode.create(gl, GL2ES2.GL_VERTEX_SHADER, AttributeNames.class, SHADER_SRC_SUB, SHADER_BIN_SUB, vertexShaderName, true);
+ final ShaderCode rsFp = ShaderCode.create(gl, GL2ES2.GL_FRAGMENT_SHADER, AttributeNames.class, SHADER_SRC_SUB, SHADER_BIN_SUB, versionedBaseName+"-segment-head", true);
+ int posVp = rsVp.defaultShaderCustomization(gl, true, true);
+ // rsFp.defaultShaderCustomization(gl, true, true);
+ int posFp = rsFp.addGLSLVersion(gl);
+ if( gl.isGLES2() && ! gl.isGLES3() ) {
+ posFp = rsFp.insertShaderSource(0, posFp, ShaderCode.createExtensionDirective(GLExtensions.OES_standard_derivatives, ShaderCode.ENABLE));
+ }
+ final String rsFpDefPrecision = getFragmentShaderPrecision(gl);
+ if( null != rsFpDefPrecision ) {
+ rsFp.insertShaderSource(0, posFp, rsFpDefPrecision);
+ }
+ if( Region.hasColorChannel( renderModes ) ) {
+ posVp = rsVp.insertShaderSource(0, posVp, USE_COLOR_CHANNEL);
+ posFp = rsFp.insertShaderSource(0, posFp, USE_COLOR_CHANNEL);
+ }
+ if( Region.hasColorTexture( renderModes ) ) {
+ posVp = rsVp.insertShaderSource(0, posVp, USE_COLOR_TEXTURE);
+ posFp = rsFp.insertShaderSource(0, posFp, USE_COLOR_TEXTURE);
+ }
+ if( !pass1 ) {
+ posFp = rsFp.insertShaderSource(0, posFp, DEF_SAMPLE_COUNT+sel1.sampleCount+"\n");
+ }
+
+ final String passS = pass1 ? "-pass1-" : "-pass2-";
+ final String shaderSegment = versionedBaseName+passS+sel1.tech+sel1.sub+".glsl";
+ if(DEBUG) {
+ System.err.printf("RegionRendererImpl01.useShaderProgram.1: segment %s%n", shaderSegment);
+ }
+ try {
+ posFp = rsFp.insertShaderSource(0, -1, AttributeNames.class, shaderSegment);
+ } catch (IOException ioe) {
+ throw new RuntimeException("Failed to read: "+shaderSegment, ioe);
+ }
+ if( 0 > posFp ) {
+ throw new RuntimeException("Failed to read: "+shaderSegment);
+ }
+ posFp = rsFp.insertShaderSource(0, -1, "}\n");
+
+ sp = new ShaderProgram();
+ sp.add(rsVp);
+ sp.add(rsFp);
+
+ if( !sp.init(gl) ) {
+ throw new GLException("RegionRenderer: Couldn't init program: "+sp);
+ }
+ if( !sp.link(gl, System.err) ) {
+ throw new GLException("could not link program: "+sp);
+ }
+ getRenderState().setShaderProgram(gl, sp);
+
+ shaderPrograms.put(shaderKey, sp);
+ if(DEBUG) {
+ System.err.printf("RegionRendererImpl01.useShaderProgram.X1: PUT renderModes %s, sel1 %s, key 0x%X -> SP %s (changed)%n",
+ Region.getRenderModeString(renderModes), sel1, shaderKey, sp);
+ }
+ return true;
+ }
+
} \ No newline at end of file
diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java
index 490af140a..f915b7d49 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java
@@ -27,20 +27,22 @@
*/
package com.jogamp.graph.curve.opengl;
+import java.nio.FloatBuffer;
+
import javax.media.opengl.GL;
import javax.media.opengl.GL2ES2;
import javax.media.opengl.GLUniformData;
-import jogamp.graph.curve.opengl.RenderStateImpl;
import jogamp.graph.curve.opengl.shader.UniformNames;
import com.jogamp.common.os.Platform;
import com.jogamp.graph.curve.Region;
import com.jogamp.graph.geom.Vertex;
+import com.jogamp.opengl.util.GLArrayDataServer;
import com.jogamp.opengl.util.PMVMatrix;
-import com.jogamp.opengl.util.glsl.ShaderState;
+import com.jogamp.opengl.util.glsl.ShaderProgram;
-public abstract class RenderState {
+public class RenderState {
private static final String thisKey = "jogamp.graph.curve.RenderState" ;
/**
@@ -51,7 +53,7 @@ public abstract class RenderState {
* </p>
* <p>
* Due to alpha blending and multipass rendering, e.g. {@link Region#VBAA_RENDERING_BIT},
- * the clear-color shall be set to the {@link #getColorStatic() foreground color} and <i>zero alpha</i>,
+ * the clear-color shall be set to the {@link #getColorStaticUniform() foreground color} and <i>zero alpha</i>,
* otherwise blending will amplify the scene's clear-color.
* </p>
* <p>
@@ -62,37 +64,192 @@ public abstract class RenderState {
*/
public static final int BITHINT_BLENDING_ENABLED = 1 << 0 ;
- public static RenderState createRenderState(ShaderState st, Vertex.Factory<? extends Vertex> pointFactory) {
- return new RenderStateImpl(st, pointFactory, null);
+ public static RenderState createRenderState(Vertex.Factory<? extends Vertex> pointFactory) {
+ return new RenderState(pointFactory, null);
}
- public static RenderState createRenderState(ShaderState st, Vertex.Factory<? extends Vertex> pointFactory, PMVMatrix pmvMatrix) {
- return new RenderStateImpl(st, pointFactory, pmvMatrix);
+ public static RenderState createRenderState(Vertex.Factory<? extends Vertex> pointFactory, PMVMatrix pmvMatrix) {
+ return new RenderState(pointFactory, pmvMatrix);
}
public static final RenderState getRenderState(GL2ES2 gl) {
return (RenderState) gl.getContext().getAttachedObject(thisKey);
}
- protected final ShaderState st;
- protected final Vertex.Factory<? extends Vertex> vertexFactory;
- protected final PMVMatrix pmvMatrix;
- protected final GLUniformData gcu_PMVMatrix;
- protected int hintBitfield;
+ private final Vertex.Factory<? extends Vertex> vertexFactory;
+ private final PMVMatrix pmvMatrix;
+ private final GLUniformData gcu_PMVMatrix01;
+ private final GLUniformData gcu_Weight;
+ private final GLUniformData gcu_ColorStatic;
+ private boolean gcu_PMVMatrix01_dirty = true;
+ private boolean gcu_Weight_dirty = true;
+ private boolean gcu_ColorStatic_dirty = true;
+ private ShaderProgram sp;
+ private int hintBitfield;
- protected RenderState(ShaderState st, Vertex.Factory<? extends Vertex> vertexFactory, PMVMatrix pmvMatrix) {
- this.st = st;
+ protected RenderState(Vertex.Factory<? extends Vertex> vertexFactory, PMVMatrix pmvMatrix) {
+ this.sp = null;
this.vertexFactory = vertexFactory;
this.pmvMatrix = null != pmvMatrix ? pmvMatrix : new PMVMatrix();
- this.gcu_PMVMatrix = new GLUniformData(UniformNames.gcu_PMVMatrix, 4, 4, this.pmvMatrix.glGetPMvMatrixf());
- st.ownUniform(gcu_PMVMatrix);
+ this.gcu_PMVMatrix01 = new GLUniformData(UniformNames.gcu_PMVMatrix01, 4, 4, this.pmvMatrix.glGetPMvMatrixf());
+ this.gcu_Weight = new GLUniformData(UniformNames.gcu_Weight, 1.0f);
+ this.gcu_ColorStatic = new GLUniformData(UniformNames.gcu_ColorStatic, 4, FloatBuffer.allocate(4));
this.hintBitfield = 0;
}
- public final ShaderState getShaderState() { return st; }
+ public final ShaderProgram getShaderProgram() { return sp; }
+ public final boolean isShaderProgramInUse() { return null != sp ? sp.inUse() : false; }
+
+ /**
+ * Set a {@link ShaderProgram} and enable it. If the given {@link ShaderProgram} is new,
+ * method returns true, otherwise false.
+ * @param gl
+ * @param sp
+ * @return true if a new shader program is being used and hence external uniform-data and -location,
+ * as well as the attribute-location must be updated, otherwise false.
+ */
+ public final boolean setShaderProgram(final GL2ES2 gl, final ShaderProgram sp) {
+ if( sp.equals(this.sp) ) {
+ sp.useProgram(gl, true);
+ return false;
+ }
+ this.sp = sp;
+ sp.useProgram(gl, true);
+ return true;
+ }
+
public final Vertex.Factory<? extends Vertex> getVertexFactory() { return vertexFactory; }
- public final PMVMatrix pmvMatrix() { return pmvMatrix; }
- public final GLUniformData getPMVMatrix() { return gcu_PMVMatrix; }
+
+ public final PMVMatrix getMatrix() { return pmvMatrix; }
+ public final PMVMatrix getMatrixMutable() {
+ gcu_PMVMatrix01_dirty = true;
+ return pmvMatrix;
+ }
+ public final GLUniformData getMatrixUniform() { return gcu_PMVMatrix01; }
+ public final void setMatrixDirty() { gcu_PMVMatrix01_dirty = true; }
+ public final boolean isMatrixDirty() { return gcu_PMVMatrix01_dirty;}
+
+ public final void updateMatrix(GL2ES2 gl) {
+ if( gcu_PMVMatrix01_dirty && sp.inUse() ) {
+ gl.glUniform( gcu_PMVMatrix01 );
+ gcu_PMVMatrix01_dirty = false;
+ }
+ }
+
+ public static boolean isWeightValid(float v) {
+ return 0.0f <= v && v <= 1.9f ;
+ }
+ public final float getWeight() { return gcu_Weight.floatValue(); }
+ public final void setWeight(float v) {
+ if( !isWeightValid(v) ) {
+ throw new IllegalArgumentException("Weight out of range");
+ }
+ gcu_Weight_dirty = true;
+ gcu_Weight.setData(v);
+ }
+
+
+ public final float[] getColorStatic(float[] rgbaColor) {
+ FloatBuffer fb = (FloatBuffer) gcu_ColorStatic.getBuffer();
+ rgbaColor[0] = fb.get(0);
+ rgbaColor[1] = fb.get(1);
+ rgbaColor[2] = fb.get(2);
+ rgbaColor[3] = fb.get(3);
+ return rgbaColor;
+ }
+ public final void setColorStatic(float r, float g, float b, float a){
+ final FloatBuffer fb = (FloatBuffer) gcu_ColorStatic.getBuffer();
+ fb.put(0, r);
+ fb.put(1, g);
+ fb.put(2, b);
+ fb.put(3, a);
+ gcu_ColorStatic_dirty = true;
+ }
+
+
+ /**
+ *
+ * @param gl
+ * @param updateLocation
+ * @param renderModes
+ * @return true if no error occurred, i.e. all locations found, otherwise false.
+ */
+ public final boolean update(GL2ES2 gl, final boolean updateLocation, final int renderModes, final boolean pass1) {
+ boolean res = true;
+ if( null != sp && sp.inUse() ) {
+ if( ( !Region.isTwoPass(renderModes) || !pass1 ) && ( gcu_PMVMatrix01_dirty || updateLocation ) ) {
+ final boolean r0 = updateUniformDataLoc(gl, updateLocation, gcu_PMVMatrix01_dirty, gcu_PMVMatrix01);
+ System.err.println("XXX gcu_PMVMatrix01.update: "+r0);
+ res = res && r0;
+ gcu_PMVMatrix01_dirty = !r0;
+ }
+ if( pass1 ) {
+ if( Region.hasVariableWeight( renderModes ) && ( gcu_Weight_dirty || updateLocation ) ) {
+ final boolean r0 = updateUniformDataLoc(gl, updateLocation, gcu_Weight_dirty, gcu_Weight);
+ System.err.println("XXX gcu_Weight.update: "+r0);
+ res = res && r0;
+ gcu_Weight_dirty = !r0;
+ }
+ if( gcu_ColorStatic_dirty || updateLocation ) {
+ final boolean r0 = updateUniformDataLoc(gl, updateLocation, gcu_ColorStatic_dirty, gcu_ColorStatic);
+ System.err.println("XXX gcu_ColorStatic.update: "+r0);
+ res = res && r0;
+ gcu_ColorStatic_dirty = false;
+ }
+ }
+ }
+ return res;
+ }
+
+ /**
+ *
+ * @param gl
+ * @param updateLocation
+ * @param data
+ * @return true if no error occured, i.e. all locations found, otherwise false.
+ */
+ public final boolean updateUniformLoc(final GL2ES2 gl, final boolean updateLocation, final GLUniformData data) {
+ if( updateLocation || 0 > data.getLocation() ) {
+ return 0 <= data.setLocation(gl, sp.program());
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ *
+ * @param gl
+ * @param updateLocation
+ * @param updateData TODO
+ * @param data
+ * @return true if no error occured, i.e. all locations found, otherwise false.
+ */
+ public final boolean updateUniformDataLoc(final GL2ES2 gl, boolean updateLocation, boolean updateData, final GLUniformData data) {
+ updateLocation = updateLocation || 0 > data.getLocation();
+ if( updateLocation ) {
+ updateData = 0 <= data.setLocation(gl, sp.program());
+ }
+ if( updateData ){
+ gl.glUniform(data);
+ return true;
+ } else {
+ return !updateLocation;
+ }
+ }
+
+ /**
+ * @param gl
+ * @param data
+ * @return true if no error occured, i.e. all locations found, otherwise false.
+ */
+ public final boolean updateAttributeLoc(final GL2ES2 gl, final boolean updateLocation, final GLArrayDataServer data) {
+ if( updateLocation || 0 > data.getLocation() ) {
+ return 0 <= data.setLocation(gl, sp.program());
+ } else {
+ return true;
+ }
+ }
+
public final boolean isHintMaskSet(int mask) {
return mask == ( hintBitfield & mask );
@@ -105,14 +262,12 @@ public abstract class RenderState {
}
public void destroy(GL2ES2 gl) {
- st.destroy(gl);
+ if( null != sp ) {
+ sp.destroy(gl);
+ sp = null;
+ }
}
- public abstract GLUniformData getWeight();
- public abstract GLUniformData getAlpha();
- public abstract GLUniformData getColorStatic();
- // public abstract GLUniformData getStrength();
-
public final RenderState attachTo(GL2ES2 gl) {
return (RenderState) gl.getContext().attachObject(thisKey, this);
}
@@ -130,11 +285,12 @@ public abstract class RenderState {
if(null==sb) {
sb = new StringBuilder();
}
-
- sb.append("RenderState[");
- st.toString(sb, alsoUnlocated).append(Platform.getNewline());
- sb.append("]");
-
+ sb.append("RenderState[").append(sp).append(Platform.NEWLINE);
+ // pmvMatrix.toString(sb, "%.2f");
+ sb.append(", dirty[pmv "+gcu_PMVMatrix01_dirty+", color "+gcu_ColorStatic_dirty+", weight "+gcu_Weight_dirty+"], ").append(Platform.NEWLINE);
+ sb.append(gcu_PMVMatrix01).append(", ").append(Platform.NEWLINE);
+ sb.append(gcu_ColorStatic).append(", ");
+ sb.append(gcu_Weight).append("]");
return sb;
}
diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java
index 140e03cfb..6d9fdab0b 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java
@@ -68,7 +68,7 @@ public class TextRegionUtil {
* additionally passing the progressed {@link AffineTransform}.
* The latter reflects the given font metric, pixelSize and hence character position.
* @param visitor
- * @param transform
+ * @param transform optional given transform
* @param font the target {@link Font}
* @param pixelSize Use {@link Font#getPixelSize(float, float)} for resolution correct pixel-size.
* @param str string text
@@ -82,7 +82,7 @@ public class TextRegionUtil {
final float lineHeight = font.getLineHeight(pixelSize);
final float scale = metrics.getScale(pixelSize);
- final AffineTransform t = new AffineTransform(transform);
+ final AffineTransform t = null != transform ? new AffineTransform(transform) : new AffineTransform();
float y = 0;
float advanceTotal = 0;
@@ -98,7 +98,12 @@ public class TextRegionUtil {
if(Region.DEBUG_INSTANCE) {
System.err.println("XXXXXXXXXXXXXXx char: "+character+", scale: "+scale+"; translate: "+advanceTotal+", "+y);
}
- t.setTransform(transform); // reset transform
+ // reset transform
+ if( null != transform ) {
+ t.setTransform(transform);
+ } else {
+ t.setToIdentity();
+ }
t.translate(advanceTotal, y);
t.scale(scale, scale);
@@ -121,14 +126,15 @@ public class TextRegionUtil {
* @param font the target {@link Font}
* @param pixelSize Use {@link Font#getPixelSize(float, float)} for resolution correct pixel-size.
* @param str string text
+ * @param rgbaColor if {@link Region#hasColorChannel()} RGBA color must be passed, otherwise value is ignored.
*/
public static void addStringToRegion(final GLRegion region, final Factory<? extends Vertex> vertexFactory,
- final Font font, final float pixelSize, final CharSequence str) {
+ final Font font, final float pixelSize, final CharSequence str, final float[] rgbaColor) {
final ShapeVisitor visitor = new ShapeVisitor() {
public final void visit(final OutlineShape shape, final AffineTransform t) {
- region.addOutlineShape(shape, t);
+ region.addOutlineShape(shape, t, region.hasColorChannel() ? rgbaColor : null);
} };
- processString(visitor, new AffineTransform(), font, pixelSize, str);
+ processString(visitor, null, font, pixelSize, str);
}
/**
@@ -141,13 +147,14 @@ public class TextRegionUtil {
* @param font {@link Font} to be used
* @param pixelSize Use {@link Font#getPixelSize(float, float)} for resolution correct pixel-size.
* @param str text to be rendered
+ * @param rgbaColor if {@link Region#hasColorChannel()} RGBA color must be passed, otherwise value is ignored.
* @param sampleCount desired multisampling sample count for msaa-rendering.
* The actual used scample-count is written back when msaa-rendering is enabled, otherwise the store is untouched.
* @throws Exception if TextRenderer not initialized
*/
public void drawString3D(final GL2ES2 gl,
final Font font, final float pixelSize, final CharSequence str,
- final int[/*1*/] sampleCount) {
+ final float[] rgbaColor, final int[/*1*/] sampleCount) {
if( !renderer.isInitialized() ) {
throw new GLException("TextRendererImpl01: not initialized!");
}
@@ -155,7 +162,7 @@ public class TextRegionUtil {
GLRegion region = getCachedRegion(font, str, pixelSize, special);
if(null == region) {
region = GLRegion.create(renderer.getRenderModes());
- addStringToRegion(region, renderer.getRenderState().getVertexFactory(), font, pixelSize, str);
+ addStringToRegion(region, renderer.getRenderState().getVertexFactory(), font, pixelSize, str, rgbaColor);
addCachedRegion(gl, font, str, pixelSize, special, region);
}
region.draw(gl, renderer, sampleCount);
@@ -167,25 +174,26 @@ public class TextRegionUtil {
* <p>
* In case of a multisampling region renderer, i.e. {@link Region#VBAA_RENDERING_BIT}, recreating the {@link GLRegion}
* is a huge performance impact.
- * In such case better use {@link #drawString3D(GLRegion, RegionRenderer, GL2ES2, Font, float, CharSequence, int[])}
+ * In such case better use {@link #drawString3D(GLRegion, RegionRenderer, GL2ES2, Font, float, CharSequence, float[], int[])}
* instead.
* </p>
* @param gl the current GL state
* @param font {@link Font} to be used
* @param pixelSize Use {@link Font#getPixelSize(float, float)} for resolution correct pixel-size.
* @param str text to be rendered
+ * @param rgbaColor if {@link Region#hasColorChannel()} RGBA color must be passed, otherwise value is ignored.
* @param sampleCount desired multisampling sample count for msaa-rendering.
* The actual used scample-count is written back when msaa-rendering is enabled, otherwise the store is untouched.
* @throws Exception if TextRenderer not initialized
*/
public static void drawString3D(final RegionRenderer renderer, final GL2ES2 gl,
final Font font, final float pixelSize, final CharSequence str,
- final int[/*1*/] sampleCount) {
+ final float[] rgbaColor, final int[/*1*/] sampleCount) {
if(!renderer.isInitialized()){
throw new GLException("TextRendererImpl01: not initialized!");
}
final GLRegion region = GLRegion.create(renderer.getRenderModes());
- addStringToRegion(region, renderer.getRenderState().getVertexFactory(), font, pixelSize, str);
+ addStringToRegion(region, renderer.getRenderState().getVertexFactory(), font, pixelSize, str, rgbaColor);
region.draw(gl, renderer, sampleCount);
region.destroy(gl, renderer);
}
@@ -197,18 +205,19 @@ public class TextRegionUtil {
* @param font {@link Font} to be used
* @param pixelSize Use {@link Font#getPixelSize(float, float)} for resolution correct pixel-size.
* @param str text to be rendered
+ * @param rgbaColor if {@link Region#hasColorChannel()} RGBA color must be passed, otherwise value is ignored.
* @param sampleCount desired multisampling sample count for msaa-rendering.
* The actual used scample-count is written back when msaa-rendering is enabled, otherwise the store is untouched.
* @throws Exception if TextRenderer not initialized
*/
public static void drawString3D(final GLRegion region, final RegionRenderer renderer, final GL2ES2 gl,
final Font font, final float pixelSize, final CharSequence str,
- final int[/*1*/] sampleCount) {
+ final float[] rgbaColor, final int[/*1*/] sampleCount) {
if(!renderer.isInitialized()){
throw new GLException("TextRendererImpl01: not initialized!");
}
region.clear(gl, renderer);
- addStringToRegion(region, renderer.getRenderState().getVertexFactory(), font, pixelSize, str);
+ addStringToRegion(region, renderer.getRenderState().getVertexFactory(), font, pixelSize, str, rgbaColor);
region.draw(gl, renderer, sampleCount);
}
diff --git a/src/jogl/classes/com/jogamp/graph/curve/tess/Triangulator.java b/src/jogl/classes/com/jogamp/graph/curve/tess/Triangulator.java
index 96ff4bbb8..20fe9bfd9 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/tess/Triangulator.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/tess/Triangulator.java
@@ -64,8 +64,14 @@ public interface Triangulator {
*/
public void generate(List<Triangle> sink);
- /** Reset the triangulation to initial state
- * Clearing cached data
+ /**
+ * Reset the triangulation to initial state
+ * Clearing cached data
*/
public void reset();
+
+ /**
+ * Return the number of newly added vertices during {@link #addCurve(List, Outline, float)}.
+ */
+ public int getAddedVerticeCount();
}
diff --git a/src/jogl/classes/com/jogamp/graph/font/Font.java b/src/jogl/classes/com/jogamp/graph/font/Font.java
index ac7a904e7..811ab9d94 100644
--- a/src/jogl/classes/com/jogamp/graph/font/Font.java
+++ b/src/jogl/classes/com/jogamp/graph/font/Font.java
@@ -27,7 +27,10 @@
*/
package com.jogamp.graph.font;
+import jogamp.graph.geom.plane.AffineTransform;
+
import com.jogamp.graph.curve.OutlineShape;
+import com.jogamp.graph.curve.opengl.TextRegionUtil.ShapeVisitor;
import com.jogamp.opengl.math.geom.AABBox;
/**
@@ -155,9 +158,26 @@ public interface Font {
public int getNumGlyphs();
public float getLineHeight(float pixelSize);
- public float getStringWidth(CharSequence string, float pixelSize);
- public float getStringHeight(CharSequence string, float pixelSize);
- public AABBox getStringBounds(CharSequence string, float pixelSize);
+ public float getMetricWidth(CharSequence string, float pixelSize);
+ public float getMetricHeight(CharSequence string, float pixelSize);
+ /**
+ * Return the <i>layout</i> bounding box as computed by each glyph's metrics.
+ * The result is not pixel correct, bit reflects layout specific metrics.
+ * <p>
+ * See {@link #getPointsBounds(AffineTransform, CharSequence, float)} for pixel correct results.
+ * </p>
+ * @param string string text
+ * @param pixelSize Use {@link Font#getPixelSize(float, float)} for resolution correct pixel-size.
+ */
+ public AABBox getMetricBounds(CharSequence string, float pixelSize);
+
+ /**
+ * Return the bounding box by taking each glyph's point-based bounding box into account.
+ * @param transform optional given transform
+ * @param string string text
+ * @param pixelSize Use {@link Font#getPixelSize(float, float)} for resolution correct pixel-size.
+ */
+ public AABBox getPointsBounds(final AffineTransform transform, CharSequence string, float pixelSize);
public boolean isPrintableChar( char c );
diff --git a/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java b/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java
index 7fa6f2d60..557884c66 100644
--- a/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java
+++ b/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java
@@ -517,16 +517,16 @@ public class VectorUtil {
subVec3(ap, p, a); //v2
// Compute dot products
- final float dot00 = vec3Dot(ac, ac);
- final float dot01 = vec3Dot(ac, ab);
- final float dot02 = vec3Dot(ac, ap);
- final float dot11 = vec3Dot(ab, ab);
- final float dot12 = vec3Dot(ab, ap);
+ final float dotAC_AC = vec3Dot(ac, ac);
+ final float dotAC_AB = vec3Dot(ac, ab);
+ final float dotAB_AB = vec3Dot(ab, ab);
+ final float dotAC_AP = vec3Dot(ac, ap);
+ final float dotAB_AP = vec3Dot(ab, ap);
// Compute barycentric coordinates
- final float invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
- final float u = (dot11 * dot02 - dot01 * dot12) * invDenom;
- final float v = (dot00 * dot12 - dot01 * dot02) * invDenom;
+ final float invDenom = 1 / (dotAC_AC * dotAB_AB - dotAC_AB * dotAC_AB);
+ final float u = (dotAB_AB * dotAC_AP - dotAC_AB * dotAB_AP) * invDenom;
+ final float v = (dotAC_AC * dotAB_AP - dotAC_AB * dotAC_AP) * invDenom;
// Check if point is in triangle
return (u >= 0) && (v >= 0) && (u + v < 1);
@@ -564,11 +564,11 @@ public class VectorUtil {
subVec3(tmpAP, p1, a); //v2
final float dotAC_AP1 = vec3Dot(tmpAC, tmpAP);
final float dotAB_AP1 = vec3Dot(tmpAB, tmpAP);
- final float u1 = (dotAB_AB * dotAC_AP1 - dotAC_AB * dotAB_AP1) * invDenom;
- final float v1 = (dotAC_AC * dotAB_AP1 - dotAC_AB * dotAC_AP1) * invDenom;
+ final float u = (dotAB_AB * dotAC_AP1 - dotAC_AB * dotAB_AP1) * invDenom;
+ final float v = (dotAC_AC * dotAB_AP1 - dotAC_AB * dotAC_AP1) * invDenom;
// Check if point is in triangle
- if ( (u1 >= 0) && (v1 >= 0) && (u1 + v1 < 1) ) {
+ if ( (u >= 0) && (v >= 0) && (u + v < 1) ) {
return true;
}
}
@@ -598,6 +598,81 @@ public class VectorUtil {
return true;
}
}
+ return false;
+ }
+ /**
+ * Check if one of three vertices are in triangle using
+ * barycentric coordinates computation, using given epsilon for comparison.
+ * @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
+ * @param tmpAC
+ * @param tmpAB
+ * @param tmpAP
+ * @return true if p1 or p2 or p3 is in triangle (a, b, c), false otherwise.
+ */
+ public static boolean isVec3InTriangle3(final float[] a, final float[] b, final float[] c,
+ final float[] p1, final float[] p2, final float[] p3,
+ final float[] tmpAC, final float[] tmpAB, final float[] tmpAP,
+ final float epsilon){
+ // Compute vectors
+ subVec3(tmpAC, c, a); //v0
+ subVec3(tmpAB, b, a); //v1
+
+ // Compute dot products
+ final float dotAC_AC = vec3Dot(tmpAC, tmpAC);
+ final float dotAC_AB = vec3Dot(tmpAC, tmpAB);
+ final float dotAB_AB = vec3Dot(tmpAB, tmpAB);
+
+ // Compute barycentric coordinates
+ final float invDenom = 1 / (dotAC_AC * dotAB_AB - dotAC_AB * dotAC_AB);
+ {
+ subVec3(tmpAP, p1, a); //v2
+ final float dotAC_AP1 = vec3Dot(tmpAC, tmpAP);
+ final float dotAB_AP1 = vec3Dot(tmpAB, tmpAP);
+ final float u = (dotAB_AB * dotAC_AP1 - dotAC_AB * dotAB_AP1) * invDenom;
+ final float v = (dotAC_AC * dotAB_AP1 - dotAC_AB * dotAC_AP1) * invDenom;
+
+ // Check if point is in triangle
+ if( FloatUtil.compare(u, 0.0f, epsilon) >= 0 &&
+ FloatUtil.compare(v, 0.0f, epsilon) >= 0 &&
+ FloatUtil.compare(u+v, 1.0f, epsilon) < 0 ) {
+ return true;
+ }
+ }
+
+ {
+ subVec3(tmpAP, p1, a); //v2
+ final float dotAC_AP2 = vec3Dot(tmpAC, tmpAP);
+ final float dotAB_AP2 = vec3Dot(tmpAB, tmpAP);
+ 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( FloatUtil.compare(u, 0.0f, epsilon) >= 0 &&
+ FloatUtil.compare(v, 0.0f, epsilon) >= 0 &&
+ FloatUtil.compare(u+v, 1.0f, epsilon) < 0 ) {
+ return true;
+ }
+ }
+
+ {
+ subVec3(tmpAP, p2, a); //v2
+ final float dotAC_AP3 = vec3Dot(tmpAC, tmpAP);
+ final float dotAB_AP3 = vec3Dot(tmpAB, tmpAP);
+ 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( FloatUtil.compare(u, 0.0f, epsilon) >= 0 &&
+ FloatUtil.compare(v, 0.0f, epsilon) >= 0 &&
+ FloatUtil.compare(u+v, 1.0f, epsilon) < 0 ) {
+ return true;
+ }
+ }
return false;
}
@@ -701,16 +776,58 @@ public class VectorUtil {
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 gamma0 = (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) {
+ if(gamma0 <= 0 || gamma0 >= 1 || gamma1 <= 0 || gamma1 >= 1) {
return false;
}
return true;
}
+ /**
+ * Compute intersection between two segments, using given epsilon for comparison.
+ * @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(final Vert2fImmutable a, final Vert2fImmutable b,
+ final Vert2fImmutable c, final Vert2fImmutable d,
+ final float epsilon) {
+ 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 ( FloatUtil.isZero(determinant, epsilon) ) {
+ return false;
+ }
- /** Compute intersection between two lines
+ 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 gamma0 = (xi - A[0])/(B[0] - A[0]);
+ final float gamma1 = (xi - C[0])/(D[0] - C[0]);
+ if( FloatUtil.compare(gamma0, 0.0f, epsilon) <= 0 ||
+ FloatUtil.compare(gamma0, 1.0f, epsilon) >= 0 ||
+ FloatUtil.compare(gamma1, 0.0f, epsilon) <= 0 ||
+ FloatUtil.compare(gamma1, 1.0f, epsilon) >= 0 ) {
+ return false;
+ }
+
+ if(gamma0 <= 0 || gamma0 >= 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
* @param c vertex 1 of second line
@@ -737,7 +854,8 @@ public class VectorUtil {
return result;
}
- /** Check if a segment intersects with a triangle
+ /**
+ * Check if a segment intersects with a triangle
* @param a vertex 1 of the triangle
* @param b vertex 2 of the triangle
* @param c vertex 3 of the triangle
@@ -751,4 +869,20 @@ public class VectorUtil {
testSeg2SegIntersection(b, c, d, e) ||
testSeg2SegIntersection(a, c, d, e) ;
}
+ /**
+ * Check if a segment intersects with a triangle, using given epsilon for comparison.
+ * @param a vertex 1 of the triangle
+ * @param b vertex 2 of the triangle
+ * @param c vertex 3 of the triangle
+ * @param d vertex 1 of first segment
+ * @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 testTri2SegIntersection(final Vert2fImmutable a, final Vert2fImmutable b, final Vert2fImmutable c,
+ final Vert2fImmutable d, final Vert2fImmutable e,
+ final float epsilon){
+ return testSeg2SegIntersection(a, b, d, e, epsilon) ||
+ testSeg2SegIntersection(b, c, d, e, epsilon) ||
+ testSeg2SegIntersection(a, c, d, e, epsilon) ;
+ }
}
diff --git a/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderCode.java b/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderCode.java
index 264b9e2a6..812cbcc9d 100644
--- a/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderCode.java
+++ b/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderCode.java
@@ -686,13 +686,13 @@ public class ShaderCode {
}
/**
- * Adds <code>data</code> at <code>offset</code> in shader source for shader <code>shaderIdx</code>.
+ * Adds <code>data</code> at <code>position</code> in shader source for shader <code>shaderIdx</code>.
* <p>
* Note: The shader source to be edit must be created using a mutable StringBuilder.
* </p>
*
* @param shaderIdx the shader index to be used.
- * @param position in shader source segments of shader <code>shaderIdx</code>
+ * @param position in shader source segments of shader <code>shaderIdx</code>, -1 will append data
* @param data the text to be inserted. Shall end with an EOL '\n' character
* @return index after the inserted <code>data</code>
*
@@ -718,7 +718,10 @@ public class ShaderCode {
}
final StringBuilder sb = (StringBuilder)src[j];
curEndIndex += sb.length();
- if(position < curEndIndex) {
+ if( 0 > position && j == src.length - 1 ) {
+ position = curEndIndex;
+ }
+ if(0 <= position && position <= curEndIndex ) {
sb.insert(position, data);
return position+data.length();
}
@@ -726,6 +729,36 @@ public class ShaderCode {
return -1;
}
+ /**
+ * Adds shader source located in <code>path</code>,
+ * either relative to the <code>context</code> class or absolute <i>as-is</i>
+ * at <code>position</code> in shader source for shader <code>shaderIdx</code>.
+ * <p>
+ * Final location lookup is performed via {@link ClassLoader#getResource(String)} and {@link ClassLoader#getSystemResource(String)},
+ * see {@link IOUtil#getResource(Class, String)}.
+ * </p>
+ * <p>
+ * Note: The shader source to be edit must be created using a mutable StringBuilder.
+ * </p>
+ *
+ * @param shaderIdx the shader index to be used.
+ * @param position in shader source segments of shader <code>shaderIdx</code>, -1 will append data
+ * @param context class used to help resolve the source location
+ * @param path location of shader source
+ * @return index after the inserted code.
+ * @throws IOException
+ * @throws IllegalStateException if the shader source's CharSequence is immutable, i.e. not of type <code>StringBuilder</code>
+ * @see IOUtil#getResource(Class, String)
+ */
+ public int insertShaderSource(int shaderIdx, int position, Class<?> context, String path) throws IOException {
+ final CharSequence data = readShaderSource(context, path, true);
+ if( null != data ) {
+ return insertShaderSource(shaderIdx, position, data);
+ } else {
+ return position;
+ }
+ }
+
@SuppressWarnings("resource")
private static int readShaderSource(Class<?> context, URLConnection conn, StringBuilder result, int lineno) throws IOException {
if(DEBUG_CODE) {
@@ -869,7 +902,7 @@ public class ShaderCode {
* @return the complete extension directive
*/
public static String createExtensionDirective(String extensionName, String behavior) {
- return "#extension " + extensionName + " : " + behavior;
+ return "#extension " + extensionName + " : " + behavior + "\n";
}
/**
diff --git a/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java b/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java
index f60cb6088..ce4c2615d 100644
--- a/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java
+++ b/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java
@@ -766,7 +766,7 @@ public class ShaderState {
activeAttribLocationMap.clear();
for(int i=0; i<managedAttributes.size(); i++) {
- ((GLArrayData)managedAttributes.get(i)).setLocation(-1);
+ managedAttributes.get(i).setLocation(-1);
}
for(Iterator<GLArrayData> iter = activeAttribDataMap.values().iterator(); iter.hasNext(); ) {
relocateAttribute(gl, iter.next());
@@ -816,7 +816,7 @@ public class ShaderState {
* otherwise >= 0
*/
public final int getCachedUniformLocation(String name) {
- Integer idx = (Integer) activeUniformLocationMap.get(name);
+ Integer idx = activeUniformLocationMap.get(name);
return (null!=idx)?idx.intValue():-1;
}
@@ -1075,16 +1075,16 @@ public class ShaderState {
private boolean verbose = DEBUG;
private ShaderProgram shaderProgram=null;
- private HashMap<String, Boolean> activedAttribEnabledMap = new HashMap<String, Boolean>();
- private HashMap<String, Integer> activeAttribLocationMap = new HashMap<String, Integer>();
- private HashMap<String, GLArrayData> activeAttribDataMap = new HashMap<String, GLArrayData>();
- private ArrayList<GLArrayData> managedAttributes = new ArrayList<GLArrayData>();
+ private final HashMap<String, Boolean> activedAttribEnabledMap = new HashMap<String, Boolean>();
+ private final HashMap<String, Integer> activeAttribLocationMap = new HashMap<String, Integer>();
+ private final HashMap<String, GLArrayData> activeAttribDataMap = new HashMap<String, GLArrayData>();
+ private final ArrayList<GLArrayData> managedAttributes = new ArrayList<GLArrayData>();
- private HashMap<String, Integer> activeUniformLocationMap = new HashMap<String, Integer>();
- private HashMap<String, GLUniformData> activeUniformDataMap = new HashMap<String, GLUniformData>();
- private ArrayList<GLUniformData> managedUniforms = new ArrayList<GLUniformData>();
+ private final HashMap<String, Integer> activeUniformLocationMap = new HashMap<String, Integer>();
+ private final HashMap<String, GLUniformData> activeUniformDataMap = new HashMap<String, GLUniformData>();
+ private final ArrayList<GLUniformData> managedUniforms = new ArrayList<GLUniformData>();
- private HashMap<String, Object> attachedObjectsByString = new HashMap<String, Object>();
+ private final HashMap<String, Object> attachedObjectsByString = new HashMap<String, Object>();
private boolean resetAllShaderData = false;
}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java b/src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java
deleted file mode 100644
index 9a5ed62d8..000000000
--- a/src/jogl/classes/jogamp/graph/curve/opengl/RegionRendererImpl01.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Copyright 2010 JogAmp Community. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of JogAmp Community.
- */
-package jogamp.graph.curve.opengl;
-
-import javax.media.opengl.GL2ES2;
-import javax.media.opengl.GLException;
-
-import jogamp.graph.curve.opengl.shader.AttributeNames;
-import jogamp.opengl.Debug;
-
-import com.jogamp.graph.curve.opengl.RenderState;
-import com.jogamp.graph.curve.opengl.RegionRenderer;
-import com.jogamp.opengl.GLExtensions;
-import com.jogamp.opengl.util.glsl.ShaderCode;
-import com.jogamp.opengl.util.glsl.ShaderProgram;
-import com.jogamp.opengl.util.glsl.ShaderState;
-
-public class RegionRendererImpl01 extends RegionRenderer {
- private static final String CUSTOM_FP, CUSTOM_VP;
- static {
- Debug.initSingleton();
- CUSTOM_VP = Debug.getProperty("jogl.debug.graph.curve.vp", false);
- CUSTOM_FP = Debug.getProperty("jogl.debug.graph.curve.fp", false);
- }
-
- public RegionRendererImpl01(final RenderState rs, final int renderModes, final GLCallback enableCallback, final GLCallback disableCallback) {
- super(rs, renderModes, enableCallback, disableCallback);
- }
-
- @Override
- protected final boolean initImpl(GL2ES2 gl) {
- final ShaderState st = getShaderState();
- final ShaderCode rsVp, rsFp;
- if( null != CUSTOM_VP ) {
- rsVp = ShaderCode.create(gl, GL2ES2.GL_VERTEX_SHADER, RegionRendererImpl01.class, null, null, CUSTOM_VP, true);
- } else {
- rsVp = ShaderCode.create(gl, GL2ES2.GL_VERTEX_SHADER, RegionRendererImpl01.class, "shader", "shader/bin", getVertexShaderName(), true);
- }
- if( null != CUSTOM_FP ) {
- rsFp = ShaderCode.create(gl, GL2ES2.GL_FRAGMENT_SHADER, RegionRendererImpl01.class, null, null, CUSTOM_FP, true);
- } else {
- rsFp = ShaderCode.create(gl, GL2ES2.GL_FRAGMENT_SHADER, RegionRendererImpl01.class, "shader", "shader/bin", getFragmentShaderName(), true);
- }
- rsVp.defaultShaderCustomization(gl, true, true);
- // rsFp.defaultShaderCustomization(gl, true, true);
- int pos = rsFp.addGLSLVersion(gl);
- if( gl.isGLES2() && ! gl.isGLES3() ) {
- pos = rsFp.insertShaderSource(0, pos, ShaderCode.createExtensionDirective(GLExtensions.OES_standard_derivatives, ShaderCode.ENABLE));
- }
- final String rsFpDefPrecision = getFragmentShaderPrecision(gl);
- if( null != rsFpDefPrecision ) {
- rsFp.insertShaderSource(0, pos, rsFpDefPrecision);
- }
-
- final ShaderProgram sp = new ShaderProgram();
- sp.add(rsVp);
- sp.add(rsFp);
-
- if( !sp.init(gl) ) {
- throw new GLException("RegionRenderer: Couldn't init program: "+sp);
- }
- st.attachShaderProgram(gl, sp, false);
- st.bindAttribLocation(gl, AttributeNames.VERTEX_ATTR_IDX, AttributeNames.VERTEX_ATTR_NAME);
- st.bindAttribLocation(gl, AttributeNames.TEXCOORD_ATTR_IDX, AttributeNames.TEXCOORD_ATTR_NAME);
-
- if(!sp.link(gl, System.err)) {
- throw new GLException("RegionRenderer: Couldn't link program: "+sp);
- }
- st.useProgram(gl, true);
-
- if(DEBUG) {
- System.err.println("RegionRendererImpl01 initialized: " + Thread.currentThread()+" "+st);
- }
- return true;
- }
-
- @Override
- protected final void destroyImpl(GL2ES2 gl) {
- // NOP .. all will be destroyed via RenderState
- }
-}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java b/src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java
deleted file mode 100644
index 68f926b0a..000000000
--- a/src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * Copyright 2010 JogAmp Community. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of JogAmp Community.
- */
-package jogamp.graph.curve.opengl;
-
-import java.nio.FloatBuffer;
-
-import javax.media.opengl.GLUniformData;
-
-import jogamp.graph.curve.opengl.shader.UniformNames;
-
-import com.jogamp.graph.curve.opengl.RenderState;
-import com.jogamp.graph.geom.Vertex;
-import com.jogamp.opengl.util.PMVMatrix;
-import com.jogamp.opengl.util.glsl.ShaderState;
-
-public class RenderStateImpl extends RenderState {
- /**
- * weight is equivalent to the
- * global off-curve vertex weight.
- * TODO: change to per vertex
- */
- private final GLUniformData gcu_Weight;
- private final GLUniformData gcu_Alpha;
- private final GLUniformData gcu_ColorStatic;
-
- public RenderStateImpl(ShaderState st, Vertex.Factory<? extends Vertex> pointFactory, PMVMatrix pmvMatrix) {
- super(st, pointFactory, pmvMatrix);
-
- gcu_Weight = new GLUniformData(UniformNames.gcu_Weight, 1.0f);
- st.ownUniform(gcu_PMVMatrix);
- gcu_Alpha = new GLUniformData(UniformNames.gcu_Alpha, 1.0f);
- st.ownUniform(gcu_Alpha);
- gcu_ColorStatic = new GLUniformData(UniformNames.gcu_ColorStatic, 3, FloatBuffer.allocate(3));
- st.ownUniform(gcu_ColorStatic);
-// gcu_Strength = new GLUniformData(UniformNames.gcu_Strength, 3.0f);
-// st.ownUniform(gcu_Strength);
- }
-
- @Override
- public final GLUniformData getWeight() { return gcu_Weight; }
- @Override
- public final GLUniformData getAlpha() { return gcu_Alpha; }
- @Override
- public final GLUniformData getColorStatic() { return gcu_ColorStatic; }
- //public final GLUniformData getStrength() { return gcu_Strength; }
-
-
-}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
index e36f46878..4649a2714 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
@@ -33,13 +33,10 @@ import javax.media.opengl.GL2ES2;
// FIXME: Subsume GL2GL3.GL_DRAW_FRAMEBUFFER -> GL2ES2.GL_DRAW_FRAMEBUFFER !
import javax.media.opengl.GL;
import javax.media.opengl.GLUniformData;
-import javax.media.opengl.fixedfunc.GLMatrixFunc;
import jogamp.graph.curve.opengl.shader.AttributeNames;
import jogamp.graph.curve.opengl.shader.UniformNames;
-import com.jogamp.common.nio.Buffers;
-import com.jogamp.graph.curve.Region;
import com.jogamp.graph.curve.opengl.GLRegion;
import com.jogamp.graph.curve.opengl.RegionRenderer;
import com.jogamp.graph.curve.opengl.RenderState;
@@ -48,128 +45,171 @@ import com.jogamp.opengl.FBObject.Attachment;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.util.GLArrayDataServer;
import com.jogamp.opengl.util.PMVMatrix;
-import com.jogamp.opengl.util.glsl.ShaderState;
+import com.jogamp.opengl.util.glsl.ShaderProgram;
public class VBORegion2PMSAAES2 extends GLRegion {
private static final boolean DEBUG_FBO_1 = false;
private static final boolean DEBUG_FBO_2 = false;
- private GLArrayDataServer verticeTxtAttr;
- private GLArrayDataServer texCoordTxtAttr;
- private GLArrayDataServer indicesTxtBuffer;
- private GLArrayDataServer verticeFboAttr;
- private GLArrayDataServer texCoordFboAttr;
+
+ // Pass-1:
+ private GLArrayDataServer gca_VerticesAttr;
+ private GLArrayDataServer gca_CurveParamsAttr;
+ private GLArrayDataServer gca_ColorsAttr;
+ private GLArrayDataServer indicesBuffer;
+ private ShaderProgram spPass1 = null;
+
+ // Pass-2:
+ private GLArrayDataServer gca_FboVerticesAttr;
+ private GLArrayDataServer gca_FboTexCoordsAttr;
private GLArrayDataServer indicesFbo;
+ private final GLUniformData gcu_FboTexUnit;
+ private GLUniformData gcu_FboTexSize;
+ private final PMVMatrix fboPMVMatrix;
+ private final GLUniformData gcu_PMVMatrix02;
+ private boolean gcu_FboTexSize_dirty = true;
+ private boolean gcu_PMVMatrix02_dirty = true;
+ private ShaderProgram spPass2 = null;
private FBObject fbo;
- private final PMVMatrix fboPMVMatrix;
- GLUniformData mgl_fboPMVMatrix;
private int fboWidth = 0;
private int fboHeight = 0;
private boolean fboDirty = true;
- GLUniformData mgl_ActiveTexture;
- GLUniformData mgl_TextureSize;
final int[] maxTexSize = new int[] { -1 } ;
+ public void useShaderProgram(final GL2ES2 gl, final RegionRenderer renderer, final int renderModes, final boolean pass1, final int quality, final int sampleCount) {
+ final RenderState rs = renderer.getRenderState();
+ final boolean updateLocation0 = renderer.useShaderProgram(gl, renderModes, pass1, quality, sampleCount);
+ final ShaderProgram sp = renderer.getRenderState().getShaderProgram();
+ final boolean updateLocation;
+ if( pass1 ) {
+ updateLocation = !sp.equals(spPass1);
+ spPass1 = sp;
+ rs.update(gl, updateLocation, renderModes, true);
+ if( updateLocation ) {
+ gcu_PMVMatrix02.setLocation(gl, sp.program());
+ }
+ rs.updateAttributeLoc(gl, updateLocation, gca_VerticesAttr);
+ rs.updateAttributeLoc(gl, updateLocation, gca_CurveParamsAttr);
+ if( null != gca_ColorsAttr ) {
+ rs.updateAttributeLoc(gl, updateLocation, gca_ColorsAttr);
+ }
+ System.err.println("XXX changedSP.p1 "+updateLocation+" / "+updateLocation0+", "+rs);
+ } else {
+ updateLocation = !sp.equals(spPass2);
+ spPass2 = sp;
+ rs.update(gl, updateLocation, renderModes, false);
+ rs.updateAttributeLoc(gl, updateLocation, gca_FboVerticesAttr);
+ rs.updateAttributeLoc(gl, updateLocation, gca_FboTexCoordsAttr);
+ rs.updateUniformDataLoc(gl, updateLocation, true, gcu_FboTexSize);
+ if( updateLocation ) {
+ gcu_FboTexSize.setLocation(gl, sp.program());
+ }
+ System.err.println("XXX changedSP.p2 "+updateLocation+" / "+updateLocation0+", "+rs);
+ }
+ }
+
public VBORegion2PMSAAES2(final int renderModes, final int textureUnit) {
super(renderModes);
final int initialElementCount = 256;
- fboPMVMatrix = new PMVMatrix();
- mgl_fboPMVMatrix = new GLUniformData(UniformNames.gcu_PMVMatrix, 4, 4, fboPMVMatrix.glGetPMvMatrixf());
- mgl_ActiveTexture = new GLUniformData(UniformNames.gcu_TextureUnit, textureUnit);
- indicesTxtBuffer = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, initialElementCount, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);
- verticeTxtAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
+ // Pass 1:
+ indicesBuffer = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, initialElementCount, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);
+
+ gca_VerticesAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
false, initialElementCount, GL.GL_STATIC_DRAW);
- texCoordTxtAttr = GLArrayDataServer.createGLSL(AttributeNames.TEXCOORD_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
+
+ gca_CurveParamsAttr = GLArrayDataServer.createGLSL(AttributeNames.CURVEPARAMS_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
false, initialElementCount, GL.GL_STATIC_DRAW);
+
+ if( hasColorChannel() ) {
+ gca_ColorsAttr = GLArrayDataServer.createGLSL(AttributeNames.COLOR_ATTR_NAME, 4, GL2ES2.GL_FLOAT,
+ false, initialElementCount, GL.GL_STATIC_DRAW);
+ } else {
+ gca_ColorsAttr = null;
+ }
+
+ // Pass 2:
+ fboPMVMatrix = new PMVMatrix();
+ gcu_PMVMatrix02 = new GLUniformData(UniformNames.gcu_PMVMatrix01, 4, 4, fboPMVMatrix.glGetPMvMatrixf());
+ gcu_FboTexUnit = new GLUniformData(UniformNames.gcu_FboTexUnit, textureUnit);
+
+ indicesFbo = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, 2, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);
+ indicesFbo.puts((short) 0); indicesFbo.puts((short) 1); indicesFbo.puts((short) 3);
+ indicesFbo.puts((short) 1); indicesFbo.puts((short) 2); indicesFbo.puts((short) 3);
+ indicesFbo.seal(true);
+
+ gca_FboTexCoordsAttr = GLArrayDataServer.createGLSL(AttributeNames.CURVEPARAMS_ATTR_NAME, 2, GL2ES2.GL_FLOAT,
+ false, 4, GL.GL_STATIC_DRAW);
+ gca_FboTexCoordsAttr.putf(0); gca_FboTexCoordsAttr.putf(0);
+ gca_FboTexCoordsAttr.putf(0); gca_FboTexCoordsAttr.putf(1);
+ gca_FboTexCoordsAttr.putf(1); gca_FboTexCoordsAttr.putf(1);
+ gca_FboTexCoordsAttr.putf(1); gca_FboTexCoordsAttr.putf(0);
+ gca_FboTexCoordsAttr.seal(true);
+
+ gca_FboVerticesAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
+ false, 4, GL.GL_STATIC_DRAW);
}
@Override
protected final void clearImpl(final GL2ES2 gl, final RegionRenderer renderer) {
- if( null != indicesTxtBuffer ) {
- indicesTxtBuffer.seal(gl, false);
- indicesTxtBuffer.rewind();
+ if( null != indicesBuffer ) {
+ indicesBuffer.seal(gl, false);
+ indicesBuffer.rewind();
}
- if( null != verticeTxtAttr ) {
- verticeTxtAttr.seal(gl, false);
- verticeTxtAttr.rewind();
+ if( null != gca_VerticesAttr ) {
+ gca_VerticesAttr.seal(gl, false);
+ gca_VerticesAttr.rewind();
}
- if( null != texCoordTxtAttr ) {
- texCoordTxtAttr.seal(gl, false);
- texCoordTxtAttr.rewind();
+ if( null != gca_CurveParamsAttr ) {
+ gca_CurveParamsAttr.seal(gl, false);
+ gca_CurveParamsAttr.rewind();
}
fboDirty = true;
}
@Override
- protected final void pushVertex(float[] coords, float[] texParams) {
- verticeTxtAttr.putf(coords[0]);
- verticeTxtAttr.putf(coords[1]);
- verticeTxtAttr.putf(coords[2]);
-
- texCoordTxtAttr.putf(texParams[0]);
- texCoordTxtAttr.putf(texParams[1]);
- texCoordTxtAttr.putf(texParams[2]);
+ protected final void pushVertex(float[] coords, float[] texParams, float[] color) {
+ gca_VerticesAttr.putf(coords[0]);
+ gca_VerticesAttr.putf(coords[1]);
+ gca_VerticesAttr.putf(coords[2]);
+
+ gca_CurveParamsAttr.putf(texParams[0]);
+ gca_CurveParamsAttr.putf(texParams[1]);
+ gca_CurveParamsAttr.putf(texParams[2]);
}
@Override
protected final void pushIndex(int idx) {
- indicesTxtBuffer.puts((short)idx);
+ indicesBuffer.puts((short)idx);
}
@Override
protected void updateImpl(final GL2ES2 gl, final RegionRenderer renderer) {
- if(null == indicesFbo) {
- final ShaderState st = renderer.getShaderState();
-
- indicesFbo = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, 2, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);
- indicesFbo.puts((short) 0); indicesFbo.puts((short) 1); indicesFbo.puts((short) 3);
- indicesFbo.puts((short) 1); indicesFbo.puts((short) 2); indicesFbo.puts((short) 3);
- indicesFbo.seal(true);
-
- texCoordFboAttr = GLArrayDataServer.createGLSL(AttributeNames.TEXCOORD_ATTR_NAME, 2, GL2ES2.GL_FLOAT,
- false, 4, GL.GL_STATIC_DRAW);
- st.ownAttribute(texCoordFboAttr, true);
- texCoordFboAttr.putf(0); texCoordFboAttr.putf(0);
- texCoordFboAttr.putf(0); texCoordFboAttr.putf(1);
- texCoordFboAttr.putf(1); texCoordFboAttr.putf(1);
- texCoordFboAttr.putf(1); texCoordFboAttr.putf(0);
- texCoordFboAttr.seal(true);
-
- verticeFboAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
- false, 4, GL.GL_STATIC_DRAW);
- st.ownAttribute(verticeFboAttr, true);
-
- st.ownAttribute(verticeTxtAttr, true);
- st.ownAttribute(texCoordTxtAttr, true);
-
- if(Region.DEBUG_INSTANCE) {
- System.err.println("VBORegion2PMSAAES2 Create: " + this);
- }
- }
// seal buffers
- indicesTxtBuffer.seal(gl, true);
- indicesTxtBuffer.enableBuffer(gl, false);
- texCoordTxtAttr.seal(gl, true);
- texCoordTxtAttr.enableBuffer(gl, false);
- verticeTxtAttr.seal(gl, true);
- verticeTxtAttr.enableBuffer(gl, false);
+ indicesBuffer.seal(gl, true);
+ indicesBuffer.enableBuffer(gl, false);
+ gca_CurveParamsAttr.seal(gl, true);
+ gca_CurveParamsAttr.enableBuffer(gl, false);
+ gca_VerticesAttr.seal(gl, true);
+ gca_VerticesAttr.enableBuffer(gl, false);
// update all bbox related data
- verticeFboAttr.seal(gl, false);
- verticeFboAttr.rewind();
- verticeFboAttr.putf(box.getMinX()); verticeFboAttr.putf(box.getMinY()); verticeFboAttr.putf(box.getMinZ());
- verticeFboAttr.putf(box.getMinX()); verticeFboAttr.putf(box.getMaxY()); verticeFboAttr.putf(box.getMinZ());
- verticeFboAttr.putf(box.getMaxX()); verticeFboAttr.putf(box.getMaxY()); verticeFboAttr.putf(box.getMinZ());
- verticeFboAttr.putf(box.getMaxX()); verticeFboAttr.putf(box.getMinY()); verticeFboAttr.putf(box.getMinZ());
- verticeFboAttr.seal(gl, true);
- verticeFboAttr.enableBuffer(gl, false);
-
- fboPMVMatrix.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
- fboPMVMatrix.glLoadIdentity();
- fboPMVMatrix.glOrthof(box.getMinX(), box.getMaxX(), box.getMinY(), box.getMaxY(), -1, 1);
+ gca_FboVerticesAttr.seal(gl, false);
+ {
+ final FloatBuffer fb = (FloatBuffer)gca_FboVerticesAttr.getBuffer();
+ fb.put( 2, box.getMinZ());
+ fb.put( 5, box.getMinZ());
+ fb.put( 8, box.getMinZ());
+ fb.put(11, box.getMinZ());
+ }
+ // Pending .. (follow fboDirty)
+ // gca_FboVerticesAttr.seal(gl, true);
+ // gca_FboVerticesAttr.enableBuffer(gl, false);
+ // fboPMVMatrix.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
+ // fboPMVMatrix.glLoadIdentity();
+ // fboPMVMatrix.glOrthof(box.getMinX(), box.getMaxX(), box.getMinY(), box.getMaxY(), -1, 1);
// push data 2 GPU ..
indicesFbo.seal(gl, true);
@@ -187,7 +227,7 @@ public class VBORegion2PMSAAES2 extends GLRegion {
@Override
protected void drawImpl(final GL2ES2 gl, final RegionRenderer renderer, final int[/*1*/] sampleCount) {
- if( 0 >= indicesTxtBuffer.getElementCount() ) {
+ if( 0 >= indicesBuffer.getElementCount() ) {
if(DEBUG_INSTANCE) {
System.err.printf("VBORegion2PMSAAES2.drawImpl: Empty%n");
}
@@ -277,58 +317,51 @@ public class VBORegion2PMSAAES2 extends GLRegion {
final float minY = box.getMinY()-diffObjBorderHeight;
final float maxX = box.getMaxX()+diffObjBorderWidth+diffObjWidth;
final float maxY = box.getMaxY()+diffObjBorderHeight+diffObjHeight;
- verticeFboAttr.seal(false);
+ gca_FboVerticesAttr.seal(false);
{
- final FloatBuffer fb = (FloatBuffer)verticeFboAttr.getBuffer();
+ final FloatBuffer fb = (FloatBuffer)gca_FboVerticesAttr.getBuffer();
fb.put(0, minX); fb.put( 1, minY);
fb.put(3, minX); fb.put( 4, maxY);
fb.put(6, maxX); fb.put( 7, maxY);
fb.put(9, maxX); fb.put(10, minY);
}
- verticeFboAttr.seal(true);
+ gca_FboVerticesAttr.seal(true);
fboPMVMatrix.glLoadIdentity();
fboPMVMatrix.glOrthof(minX, maxX, minY, maxY, -1, 1);
+ gcu_PMVMatrix02_dirty = true;
renderRegion2FBO(gl, rs, targetFboWidth, targetFboHeight, vpWidth, vpHeight, sampleCount);
} else {
- texCoordFboAttr.setVBOWritten(false);
+ gca_FboTexCoordsAttr.setVBOWritten(false);
}
// System.out.println("Scale: " + matrix.glGetMatrixf().get(1+4*3) +" " + matrix.glGetMatrixf().get(2+4*3));
renderFBO(gl, rs, vpWidth, vpHeight, sampleCount[0]);
}
}
- private void setTexSize(final GL2ES2 gl, final ShaderState st, final boolean firstPass, final int width, final int height, final int sampleCount) {
- if(null == mgl_TextureSize) {
- mgl_TextureSize = new GLUniformData(UniformNames.gcu_TextureSize, 3, Buffers.newDirectFloatBuffer(3));
- }
- final FloatBuffer texSize = (FloatBuffer) mgl_TextureSize.getBuffer();
- texSize.put(0, width);
- texSize.put(1, height);
- if( firstPass ) {
- texSize.put(2, 0f);
- } else {
- texSize.put(2, 1f+sampleCount);
- }
- st.uniform(gl, mgl_TextureSize);
- }
private void renderFBO(final GL2ES2 gl, final RenderState rs, final int width, final int height, final int sampleCount) {
- final ShaderState st = rs.getShaderState();
-
gl.glViewport(0, 0, width, height);
- st.uniform(gl, mgl_ActiveTexture);
- gl.glActiveTexture(GL.GL_TEXTURE0 + mgl_ActiveTexture.intValue());
- setTexSize(gl, st, false, fboWidth, fboHeight, sampleCount);
+
+ if( gcu_FboTexSize_dirty ) {
+ gl.glUniform(gcu_FboTexSize);
+ gcu_FboTexSize_dirty = false;
+ }
+ if( gcu_PMVMatrix02_dirty ) {
+ gl.glUniform(gcu_PMVMatrix02);
+ gcu_PMVMatrix02_dirty = false;
+ }
+
+ gl.glActiveTexture(GL.GL_TEXTURE0 + gcu_FboTexUnit.intValue());
fbo.use(gl, fbo.getSamplingSink());
- verticeFboAttr.enableBuffer(gl, true);
- texCoordFboAttr.enableBuffer(gl, true);
+ gca_FboVerticesAttr.enableBuffer(gl, true);
+ gca_FboTexCoordsAttr.enableBuffer(gl, true);
indicesFbo.bindBuffer(gl, true); // keeps VBO binding
gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesFbo.getElementCount() * indicesFbo.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
indicesFbo.bindBuffer(gl, false);
- texCoordFboAttr.enableBuffer(gl, false);
- verticeFboAttr.enableBuffer(gl, false);
+ gca_FboTexCoordsAttr.enableBuffer(gl, false);
+ gca_FboVerticesAttr.enableBuffer(gl, false);
fbo.unuse(gl);
// setback: gl.glActiveTexture(currentActiveTextureEngine[0]);
@@ -336,8 +369,6 @@ public class VBORegion2PMSAAES2 extends GLRegion {
private void renderRegion2FBO(final GL2ES2 gl, final RenderState rs, final int targetFboWidth, final int targetFboHeight,
final int vpWidth, final int vpHeight, final int[] sampleCount) {
- final ShaderState st = rs.getShaderState();
-
if( 0 >= targetFboWidth || 0 >= targetFboHeight ) {
throw new IllegalArgumentException("fboSize must be greater than 0: "+targetFboWidth+"x"+targetFboHeight);
}
@@ -373,29 +404,26 @@ public class VBORegion2PMSAAES2 extends GLRegion {
fboHeight = targetFboHeight;
}
fbo.bind(gl);
- setTexSize(gl, st, true, vpWidth, vpHeight, sampleCount[0]);
//render texture
gl.glViewport(0, 0, fboWidth, fboHeight);
- st.uniform(gl, mgl_fboPMVMatrix); // use orthogonal matrix
gl.glClear(GL2ES2.GL_COLOR_BUFFER_BIT | GL2ES2.GL_DEPTH_BUFFER_BIT);
renderRegion(gl);
fbo.unbind(gl);
-
- st.uniform(gl, rs.getPMVMatrix()); // switch back to real PMV matrix
+ fboDirty = false;
}
private void renderRegion(final GL2ES2 gl) {
- verticeTxtAttr.enableBuffer(gl, true);
- texCoordTxtAttr.enableBuffer(gl, true);
- indicesTxtBuffer.bindBuffer(gl, true); // keeps VBO binding
+ gca_VerticesAttr.enableBuffer(gl, true);
+ gca_CurveParamsAttr.enableBuffer(gl, true);
+ indicesBuffer.bindBuffer(gl, true); // keeps VBO binding
- gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesTxtBuffer.getElementCount() * indicesTxtBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
+ gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
- indicesTxtBuffer.bindBuffer(gl, false);
- texCoordTxtAttr.enableBuffer(gl, false);
- verticeTxtAttr.enableBuffer(gl, false);
+ indicesBuffer.bindBuffer(gl, false);
+ gca_CurveParamsAttr.enableBuffer(gl, false);
+ gca_VerticesAttr.enableBuffer(gl, false);
}
@Override
@@ -403,34 +431,29 @@ public class VBORegion2PMSAAES2 extends GLRegion {
if(DEBUG_INSTANCE) {
System.err.println("VBORegion2PES2 Destroy: " + this);
}
- final ShaderState st = renderer.getShaderState();
if(null != fbo) {
fbo.destroy(gl);
fbo = null;
}
- if(null != verticeTxtAttr) {
- st.ownAttribute(verticeTxtAttr, false);
- verticeTxtAttr.destroy(gl);
- verticeTxtAttr = null;
+ if(null != gca_VerticesAttr) {
+ gca_VerticesAttr.destroy(gl);
+ gca_VerticesAttr = null;
}
- if(null != texCoordTxtAttr) {
- st.ownAttribute(texCoordTxtAttr, false);
- texCoordTxtAttr.destroy(gl);
- texCoordTxtAttr = null;
+ if(null != gca_CurveParamsAttr) {
+ gca_CurveParamsAttr.destroy(gl);
+ gca_CurveParamsAttr = null;
}
- if(null != indicesTxtBuffer) {
- indicesTxtBuffer.destroy(gl);
- indicesTxtBuffer = null;
+ if(null != indicesBuffer) {
+ indicesBuffer.destroy(gl);
+ indicesBuffer = null;
}
- if(null != verticeFboAttr) {
- st.ownAttribute(verticeFboAttr, false);
- verticeFboAttr.destroy(gl);
- verticeFboAttr = null;
+ if(null != gca_FboVerticesAttr) {
+ gca_FboVerticesAttr.destroy(gl);
+ gca_FboVerticesAttr = null;
}
- if(null != texCoordFboAttr) {
- st.ownAttribute(texCoordFboAttr, false);
- texCoordFboAttr.destroy(gl);
- texCoordFboAttr = null;
+ if(null != gca_FboTexCoordsAttr) {
+ gca_FboTexCoordsAttr.destroy(gl);
+ gca_FboTexCoordsAttr = null;
}
if(null != indicesFbo) {
indicesFbo.destroy(gl);
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
index 4a12ed8d9..afaae3679 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
@@ -32,7 +32,6 @@ import java.nio.FloatBuffer;
import javax.media.opengl.GL2ES2;
import javax.media.opengl.GL;
import javax.media.opengl.GLUniformData;
-import javax.media.opengl.fixedfunc.GLMatrixFunc;
import jogamp.graph.curve.opengl.shader.AttributeNames;
import jogamp.graph.curve.opengl.shader.UniformNames;
@@ -49,7 +48,7 @@ import com.jogamp.opengl.FBObject.TextureAttachment;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.util.GLArrayDataServer;
import com.jogamp.opengl.util.PMVMatrix;
-import com.jogamp.opengl.util.glsl.ShaderState;
+import com.jogamp.opengl.util.glsl.ShaderProgram;
public class VBORegion2PVBAAES2 extends GLRegion {
private static final boolean DEBUG_FBO_1 = false;
@@ -85,38 +84,102 @@ public class VBORegion2PVBAAES2 extends GLRegion {
}
- private GLArrayDataServer verticeTxtAttr;
- private GLArrayDataServer texCoordTxtAttr;
- private GLArrayDataServer indicesTxtBuffer;
- private GLArrayDataServer verticeFboAttr;
- private GLArrayDataServer texCoordFboAttr;
+ // Pass-1:
+ private GLArrayDataServer gca_VerticesAttr;
+ private GLArrayDataServer gca_CurveParamsAttr;
+ private GLArrayDataServer gca_ColorsAttr;
+ private GLArrayDataServer indicesBuffer;
+ private ShaderProgram spPass1 = null;
+
+ // Pass-2:
+ private GLArrayDataServer gca_FboVerticesAttr;
+ private GLArrayDataServer gca_FboTexCoordsAttr;
private GLArrayDataServer indicesFbo;
+ private final GLUniformData gcu_FboTexUnit;
+ private final GLUniformData gcu_FboTexSize;
+ private final PMVMatrix fboPMVMatrix;
+ private final GLUniformData gcu_PMVMatrix02;
+ private boolean gcu_FboTexSize_dirty = true;
+ private boolean gcu_PMVMatrix02_dirty = true;
+ private ShaderProgram spPass2 = null;
private FBObject fbo;
private TextureAttachment texA;
- private final PMVMatrix fboPMVMatrix;
- GLUniformData mgl_fboPMVMatrix;
private int fboWidth = 0;
private int fboHeight = 0;
private boolean fboDirty = true;
- GLUniformData mgl_ActiveTexture;
- GLUniformData mgl_TextureSize;
final int[] maxTexSize = new int[] { -1 } ;
+ public void useShaderProgram(final GL2ES2 gl, final RegionRenderer renderer, final int renderModes, final boolean pass1, final int quality, final int sampleCount) {
+ final RenderState rs = renderer.getRenderState();
+ final boolean updateLocation0 = renderer.useShaderProgram(gl, renderModes, pass1, quality, sampleCount);
+ final ShaderProgram sp = renderer.getRenderState().getShaderProgram();
+ final boolean updateLocation;
+ if( pass1 ) {
+ updateLocation = !sp.equals(spPass1);
+ spPass1 = sp;
+ rs.update(gl, updateLocation, renderModes, true);
+ rs.updateUniformLoc(gl, updateLocation, gcu_PMVMatrix02);
+ rs.updateAttributeLoc(gl, updateLocation, gca_VerticesAttr);
+ rs.updateAttributeLoc(gl, updateLocation, gca_CurveParamsAttr);
+ if( null != gca_ColorsAttr ) {
+ rs.updateAttributeLoc(gl, updateLocation, gca_ColorsAttr);
+ }
+ System.err.println("XXX changedSP.p1 "+updateLocation+" / "+updateLocation0+", "+rs);
+ } else {
+ updateLocation = !sp.equals(spPass2);
+ spPass2 = sp;
+ rs.update(gl, updateLocation, renderModes, false);
+ rs.updateAttributeLoc(gl, updateLocation, gca_FboVerticesAttr);
+ rs.updateAttributeLoc(gl, updateLocation, gca_FboTexCoordsAttr);
+ rs.updateUniformDataLoc(gl, updateLocation, true, gcu_FboTexUnit);
+ rs.updateUniformLoc(gl, updateLocation, gcu_FboTexSize);
+ System.err.println("XXX changedSP.p2 "+updateLocation+" / "+updateLocation0+", "+rs);
+ }
+ }
+
public VBORegion2PVBAAES2(final int renderModes, final int textureUnit) {
super(renderModes);
final int initialElementCount = 256;
- fboPMVMatrix = new PMVMatrix();
- mgl_fboPMVMatrix = new GLUniformData(UniformNames.gcu_PMVMatrix, 4, 4, fboPMVMatrix.glGetPMvMatrixf());
- mgl_ActiveTexture = new GLUniformData(UniformNames.gcu_TextureUnit, textureUnit);
- indicesTxtBuffer = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, initialElementCount, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);
- verticeTxtAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
+ // Pass 1:
+ indicesBuffer = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, initialElementCount, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);
+
+ gca_VerticesAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
false, initialElementCount, GL.GL_STATIC_DRAW);
- texCoordTxtAttr = GLArrayDataServer.createGLSL(AttributeNames.TEXCOORD_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
+
+ gca_CurveParamsAttr = GLArrayDataServer.createGLSL(AttributeNames.CURVEPARAMS_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
false, initialElementCount, GL.GL_STATIC_DRAW);
+ if( hasColorChannel() ) {
+ gca_ColorsAttr = GLArrayDataServer.createGLSL(AttributeNames.COLOR_ATTR_NAME, 4, GL2ES2.GL_FLOAT,
+ false, initialElementCount, GL.GL_STATIC_DRAW);
+ } else {
+ gca_ColorsAttr = null;
+ }
+
+ // Pass 2:
+ fboPMVMatrix = new PMVMatrix();
+ gcu_PMVMatrix02 = new GLUniformData(UniformNames.gcu_PMVMatrix02, 4, 4, fboPMVMatrix.glGetPMvMatrixf());
+ gcu_FboTexUnit = new GLUniformData(UniformNames.gcu_FboTexUnit, textureUnit);
+ gcu_FboTexSize = new GLUniformData(UniformNames.gcu_FboTexSize, 2, Buffers.newDirectFloatBuffer(2));
+
+ indicesFbo = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, 2, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);
+ indicesFbo.puts((short) 0); indicesFbo.puts((short) 1); indicesFbo.puts((short) 3);
+ indicesFbo.puts((short) 1); indicesFbo.puts((short) 2); indicesFbo.puts((short) 3);
+ indicesFbo.seal(true);
+
+ gca_FboTexCoordsAttr = GLArrayDataServer.createGLSL(AttributeNames.FBO_TEXCOORDS_ATTR_NAME, 2, GL2ES2.GL_FLOAT,
+ false, 4, GL.GL_STATIC_DRAW);
+ gca_FboTexCoordsAttr.putf(0); gca_FboTexCoordsAttr.putf(0);
+ gca_FboTexCoordsAttr.putf(0); gca_FboTexCoordsAttr.putf(1);
+ gca_FboTexCoordsAttr.putf(1); gca_FboTexCoordsAttr.putf(1);
+ gca_FboTexCoordsAttr.putf(1); gca_FboTexCoordsAttr.putf(0);
+ gca_FboTexCoordsAttr.seal(true);
+
+ gca_FboVerticesAttr = GLArrayDataServer.createGLSL(AttributeNames.FBO_VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
+ false, 4, GL.GL_STATIC_DRAW);
}
@Override
@@ -125,88 +188,86 @@ public class VBORegion2PVBAAES2 extends GLRegion {
System.err.println("VBORegion2PES2 Clear: " + this);
// Thread.dumpStack();
}
- if( null != indicesTxtBuffer ) {
- indicesTxtBuffer.seal(gl, false);
- indicesTxtBuffer.rewind();
+ if( null != indicesBuffer ) {
+ indicesBuffer.seal(gl, false);
+ indicesBuffer.rewind();
}
- if( null != verticeTxtAttr ) {
- verticeTxtAttr.seal(gl, false);
- verticeTxtAttr.rewind();
+ if( null != gca_VerticesAttr ) {
+ gca_VerticesAttr.seal(gl, false);
+ gca_VerticesAttr.rewind();
}
- if( null != texCoordTxtAttr ) {
- texCoordTxtAttr.seal(gl, false);
- texCoordTxtAttr.rewind();
+ if( null != gca_CurveParamsAttr ) {
+ gca_CurveParamsAttr.seal(gl, false);
+ gca_CurveParamsAttr.rewind();
+ }
+ if( null != gca_ColorsAttr ) {
+ gca_ColorsAttr.seal(gl, false);
+ gca_ColorsAttr.rewind();
}
fboDirty = true;
}
@Override
- protected final void pushVertex(float[] coords, float[] texParams) {
- verticeTxtAttr.putf(coords[0]);
- verticeTxtAttr.putf(coords[1]);
- verticeTxtAttr.putf(coords[2]);
-
- texCoordTxtAttr.putf(texParams[0]);
- texCoordTxtAttr.putf(texParams[1]);
- texCoordTxtAttr.putf(texParams[2]);
+ protected final void pushVertex(final float[] coords, final float[] texParams, float[] rgba) {
+ gca_VerticesAttr.putf(coords[0]);
+ gca_VerticesAttr.putf(coords[1]);
+ gca_VerticesAttr.putf(coords[2]);
+
+ gca_CurveParamsAttr.putf(texParams[0]);
+ gca_CurveParamsAttr.putf(texParams[1]);
+ gca_CurveParamsAttr.putf(texParams[2]);
+
+ if( null != gca_ColorsAttr ) {
+ if( null != rgba ) {
+ gca_ColorsAttr.putf(rgba[0]);
+ gca_ColorsAttr.putf(rgba[1]);
+ gca_ColorsAttr.putf(rgba[2]);
+ gca_ColorsAttr.putf(rgba[3]);
+ } else {
+ throw new IllegalArgumentException("Null color given for COLOR_CHANNEL rendering mode");
+ }
+ }
}
@Override
protected final void pushIndex(int idx) {
- indicesTxtBuffer.puts((short)idx);
+ indicesBuffer.puts((short)idx);
}
@Override
protected void updateImpl(final GL2ES2 gl, final RegionRenderer renderer) {
if(null == indicesFbo) {
- final ShaderState st = renderer.getShaderState();
-
- indicesFbo = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, 2, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);
- indicesFbo.puts((short) 0); indicesFbo.puts((short) 1); indicesFbo.puts((short) 3);
- indicesFbo.puts((short) 1); indicesFbo.puts((short) 2); indicesFbo.puts((short) 3);
- indicesFbo.seal(true);
-
- texCoordFboAttr = GLArrayDataServer.createGLSL(AttributeNames.TEXCOORD_ATTR_NAME, 2, GL2ES2.GL_FLOAT,
- false, 4, GL.GL_STATIC_DRAW);
- st.ownAttribute(texCoordFboAttr, true);
- texCoordFboAttr.putf(0); texCoordFboAttr.putf(0);
- texCoordFboAttr.putf(0); texCoordFboAttr.putf(1);
- texCoordFboAttr.putf(1); texCoordFboAttr.putf(1);
- texCoordFboAttr.putf(1); texCoordFboAttr.putf(0);
- texCoordFboAttr.seal(true);
-
- verticeFboAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
- false, 4, GL.GL_STATIC_DRAW);
- st.ownAttribute(verticeFboAttr, true);
-
- st.ownAttribute(verticeTxtAttr, true);
- st.ownAttribute(texCoordTxtAttr, true);
-
if(Region.DEBUG_INSTANCE) {
System.err.println("VBORegion2PVBAAES2 Create: " + this);
}
}
// seal buffers
- indicesTxtBuffer.seal(gl, true);
- indicesTxtBuffer.enableBuffer(gl, false);
- texCoordTxtAttr.seal(gl, true);
- texCoordTxtAttr.enableBuffer(gl, false);
- verticeTxtAttr.seal(gl, true);
- verticeTxtAttr.enableBuffer(gl, false);
+ indicesBuffer.seal(gl, true);
+ indicesBuffer.enableBuffer(gl, false);
+ gca_CurveParamsAttr.seal(gl, true);
+ gca_CurveParamsAttr.enableBuffer(gl, false);
+ gca_VerticesAttr.seal(gl, true);
+ gca_VerticesAttr.enableBuffer(gl, false);
+ if( null != gca_ColorsAttr ) {
+ gca_ColorsAttr.seal(gl, true);
+ gca_ColorsAttr.enableBuffer(gl, false);
+ }
// update all bbox related data
- verticeFboAttr.seal(gl, false);
- verticeFboAttr.rewind();
- verticeFboAttr.putf(box.getMinX()); verticeFboAttr.putf(box.getMinY()); verticeFboAttr.putf(box.getMinZ());
- verticeFboAttr.putf(box.getMinX()); verticeFboAttr.putf(box.getMaxY()); verticeFboAttr.putf(box.getMinZ());
- verticeFboAttr.putf(box.getMaxX()); verticeFboAttr.putf(box.getMaxY()); verticeFboAttr.putf(box.getMinZ());
- verticeFboAttr.putf(box.getMaxX()); verticeFboAttr.putf(box.getMinY()); verticeFboAttr.putf(box.getMinZ());
- verticeFboAttr.seal(gl, true);
- verticeFboAttr.enableBuffer(gl, false);
-
- fboPMVMatrix.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
- fboPMVMatrix.glLoadIdentity();
- fboPMVMatrix.glOrthof(box.getMinX(), box.getMaxX(), box.getMinY(), box.getMaxY(), -1, 1);
+ gca_FboVerticesAttr.seal(gl, false);
+ {
+ final FloatBuffer fb = (FloatBuffer)gca_FboVerticesAttr.getBuffer();
+ fb.put( 2, box.getMinZ());
+ fb.put( 5, box.getMinZ());
+ fb.put( 8, box.getMinZ());
+ fb.put(11, box.getMinZ());
+ }
+ // Pending .. (follow fboDirty)
+ // gca_FboVerticesAttr.seal(gl, true);
+ // gca_FboVerticesAttr.enableBuffer(gl, false);
+ // fboPMVMatrix.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
+ // fboPMVMatrix.glLoadIdentity();
+ // fboPMVMatrix.glOrthof(box.getMinX(), box.getMaxX(), box.getMinY(), box.getMaxY(), -1, 1);
// push data 2 GPU ..
indicesFbo.seal(gl, true);
@@ -223,7 +284,7 @@ public class VBORegion2PVBAAES2 extends GLRegion {
@Override
protected void drawImpl(final GL2ES2 gl, final RegionRenderer renderer, final int[/*1*/] sampleCount) {
- if( 0 >= indicesTxtBuffer.getElementCount() ) {
+ if( 0 >= indicesBuffer.getElementCount() ) {
if(DEBUG_INSTANCE) {
System.err.printf("VBORegion2PVBAAES2.drawImpl: Empty%n");
}
@@ -387,56 +448,47 @@ public class VBORegion2PVBAAES2 extends GLRegion {
final float minY = box.getMinY()-diffObjBorderHeight;
final float maxX = box.getMaxX()+diffObjBorderWidth+diffObjWidth+diffObjResizeWidth;
final float maxY = box.getMaxY()+diffObjBorderHeight+diffObjHeight+diffObjResizeHeight;
- verticeFboAttr.seal(false);
+ gca_FboVerticesAttr.seal(false);
{
- final FloatBuffer fb = (FloatBuffer)verticeFboAttr.getBuffer();
+ final FloatBuffer fb = (FloatBuffer)gca_FboVerticesAttr.getBuffer();
fb.put(0, minX); fb.put( 1, minY);
fb.put(3, minX); fb.put( 4, maxY);
fb.put(6, maxX); fb.put( 7, maxY);
fb.put(9, maxX); fb.put(10, minY);
}
- verticeFboAttr.seal(true);
+ gca_FboVerticesAttr.seal(true);
fboPMVMatrix.glLoadIdentity();
fboPMVMatrix.glOrthof(minX, maxX, minY, maxY, -1, 1);
+ gcu_PMVMatrix02_dirty = true;
+ useShaderProgram(gl, renderer, getRenderModes(), true, getQuality(), sampleCount[0]);
renderRegion2FBO(gl, rs, targetFboWidth, targetFboHeight, newFboWidth, newFboHeight, vpWidth, vpHeight, sampleCount[0]);
}
+ useShaderProgram(gl, renderer, getRenderModes(), false, getQuality(), sampleCount[0]);
renderFBO(gl, rs, targetFboWidth, targetFboHeight, vpWidth, vpHeight, sampleCount[0]);
}
}
- private void setTexSize(final GL2ES2 gl, final ShaderState st, final boolean firstPass, final int width, final int height, final int sampleCount) {
- if(null == mgl_TextureSize) {
- mgl_TextureSize = new GLUniformData(UniformNames.gcu_TextureSize, 3, Buffers.newDirectFloatBuffer(3));
- }
- final FloatBuffer texSize = (FloatBuffer) mgl_TextureSize.getBuffer();
- texSize.put(0, width);
- texSize.put(1, height);
- if( firstPass ) {
- texSize.put(2, 0f);
- } else {
- texSize.put(2, sampleCount);
- }
- st.uniform(gl, mgl_TextureSize);
- }
private void renderFBO(final GL2ES2 gl, final RenderState rs, final int targetFboWidth, final int targetFboHeight,
final int vpWidth, final int vpHeight, final int sampleCount) {
- final ShaderState st = rs.getShaderState();
-
gl.glViewport(0, 0, vpWidth, vpHeight);
- st.uniform(gl, mgl_ActiveTexture);
- gl.glActiveTexture(GL.GL_TEXTURE0 + mgl_ActiveTexture.intValue());
- setTexSize(gl, st, false, fboWidth, fboHeight, sampleCount);
+
+ if( gcu_FboTexSize_dirty ) {
+ gl.glUniform(gcu_FboTexSize);
+ gcu_FboTexSize_dirty = false;
+ }
+
+ gl.glActiveTexture(GL.GL_TEXTURE0 + gcu_FboTexUnit.intValue());
fbo.use(gl, texA);
- verticeFboAttr.enableBuffer(gl, true);
- texCoordFboAttr.enableBuffer(gl, true);
+ gca_FboVerticesAttr.enableBuffer(gl, true);
+ gca_FboTexCoordsAttr.enableBuffer(gl, true);
indicesFbo.bindBuffer(gl, true); // keeps VBO binding
gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesFbo.getElementCount() * indicesFbo.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
indicesFbo.bindBuffer(gl, false);
- texCoordFboAttr.enableBuffer(gl, false);
- verticeFboAttr.enableBuffer(gl, false);
+ gca_FboTexCoordsAttr.enableBuffer(gl, false);
+ gca_FboVerticesAttr.enableBuffer(gl, false);
fbo.unuse(gl);
// setback: gl.glActiveTexture(currentActiveTextureEngine[0]);
@@ -445,8 +497,6 @@ public class VBORegion2PVBAAES2 extends GLRegion {
private void renderRegion2FBO(final GL2ES2 gl, final RenderState rs,
final int targetFboWidth, final int targetFboHeight, final int newFboWidth, final int newFboHeight,
final int vpWidth, final int vpHeight, final int sampleCount) {
- final ShaderState st = rs.getShaderState();
-
if( 0 >= targetFboWidth || 0 >= targetFboHeight ) {
throw new IllegalArgumentException("fboSize must be greater than 0: "+targetFboWidth+"x"+targetFboHeight);
}
@@ -454,6 +504,12 @@ public class VBORegion2PVBAAES2 extends GLRegion {
if(null == fbo) {
fboWidth = newFboWidth;
fboHeight = newFboHeight;
+ final FloatBuffer fboTexSize = (FloatBuffer) gcu_FboTexSize.getBuffer();
+ {
+ fboTexSize.put(0, fboWidth);
+ fboTexSize.put(1, fboHeight);
+ gcu_FboTexSize_dirty=true;
+ }
fbo = new FBObject();
fbo.reset(gl, fboWidth, fboHeight);
// Shall not use bilinear (GL_LINEAR), due to own VBAA. Result is smooth w/o it now!
@@ -472,33 +528,46 @@ public class VBORegion2PVBAAES2 extends GLRegion {
}
fboWidth = newFboWidth;
fboHeight = newFboHeight;
+ final FloatBuffer fboTexSize = (FloatBuffer) gcu_FboTexSize.getBuffer();
+ {
+ fboTexSize.put(0, fboWidth);
+ fboTexSize.put(1, fboHeight);
+ gcu_FboTexSize_dirty=true;
+ }
} else {
fbo.bind(gl);
}
- setTexSize(gl, st, true, vpWidth, vpHeight, sampleCount);
//render texture
gl.glViewport(0, 0, fboWidth, fboHeight);
- st.uniform(gl, mgl_fboPMVMatrix); // use orthogonal matrix
+
+ if( gcu_PMVMatrix02_dirty ) {
+ gl.glUniform(gcu_PMVMatrix02);
+ gcu_PMVMatrix02_dirty = false;
+ }
gl.glClear(GL2ES2.GL_COLOR_BUFFER_BIT | GL2ES2.GL_DEPTH_BUFFER_BIT);
renderRegion(gl);
fbo.unbind(gl);
fboDirty = false;
-
- st.uniform(gl, rs.getPMVMatrix()); // switch back to real PMV matrix
}
private void renderRegion(final GL2ES2 gl) {
- verticeTxtAttr.enableBuffer(gl, true);
- texCoordTxtAttr.enableBuffer(gl, true);
- indicesTxtBuffer.bindBuffer(gl, true); // keeps VBO binding
+ gca_VerticesAttr.enableBuffer(gl, true);
+ gca_CurveParamsAttr.enableBuffer(gl, true);
+ if( null != gca_ColorsAttr ) {
+ gca_ColorsAttr.enableBuffer(gl, true);
+ }
+ indicesBuffer.bindBuffer(gl, true); // keeps VBO binding
- gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesTxtBuffer.getElementCount() * indicesTxtBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
+ gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
- indicesTxtBuffer.bindBuffer(gl, false);
- texCoordTxtAttr.enableBuffer(gl, false);
- verticeTxtAttr.enableBuffer(gl, false);
+ indicesBuffer.bindBuffer(gl, false);
+ if( null != gca_ColorsAttr ) {
+ gca_ColorsAttr.enableBuffer(gl, false);
+ }
+ gca_CurveParamsAttr.enableBuffer(gl, false);
+ gca_VerticesAttr.enableBuffer(gl, false);
}
@Override
@@ -507,35 +576,35 @@ public class VBORegion2PVBAAES2 extends GLRegion {
System.err.println("VBORegion2PES2 Destroy: " + this);
// Thread.dumpStack();
}
- final ShaderState st = renderer.getShaderState();
if(null != fbo) {
fbo.destroy(gl);
fbo = null;
texA = null;
}
- if(null != verticeTxtAttr) {
- st.ownAttribute(verticeTxtAttr, false);
- verticeTxtAttr.destroy(gl);
- verticeTxtAttr = null;
+ if(null != gca_VerticesAttr) {
+ gca_VerticesAttr.destroy(gl);
+ gca_VerticesAttr = null;
+ }
+ if(null != gca_CurveParamsAttr) {
+ gca_CurveParamsAttr.destroy(gl);
+ gca_CurveParamsAttr = null;
}
- if(null != texCoordTxtAttr) {
- st.ownAttribute(texCoordTxtAttr, false);
- texCoordTxtAttr.destroy(gl);
- texCoordTxtAttr = null;
+ if(null != gca_ColorsAttr) {
+ gca_ColorsAttr.destroy(gl);
+ gca_ColorsAttr = null;
}
- if(null != indicesTxtBuffer) {
- indicesTxtBuffer.destroy(gl);
- indicesTxtBuffer = null;
+ if(null != indicesBuffer) {
+ indicesBuffer.destroy(gl);
+ indicesBuffer = null;
}
- if(null != verticeFboAttr) {
- st.ownAttribute(verticeFboAttr, false);
- verticeFboAttr.destroy(gl);
- verticeFboAttr = null;
+
+ if(null != gca_FboVerticesAttr) {
+ gca_FboVerticesAttr.destroy(gl);
+ gca_FboVerticesAttr = null;
}
- if(null != texCoordFboAttr) {
- st.ownAttribute(texCoordFboAttr, false);
- texCoordFboAttr.destroy(gl);
- texCoordFboAttr = null;
+ if(null != gca_FboTexCoordsAttr) {
+ gca_FboTexCoordsAttr.destroy(gl);
+ gca_FboTexCoordsAttr = null;
}
if(null != indicesFbo) {
indicesFbo.destroy(gl);
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
index cf85628ad..659f64847 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
@@ -34,25 +34,33 @@ import jogamp.graph.curve.opengl.shader.AttributeNames;
import com.jogamp.graph.curve.opengl.GLRegion;
import com.jogamp.graph.curve.opengl.RegionRenderer;
+import com.jogamp.graph.curve.opengl.RenderState;
import com.jogamp.opengl.util.GLArrayDataServer;
-import com.jogamp.opengl.util.glsl.ShaderState;
+import com.jogamp.opengl.util.glsl.ShaderProgram;
public class VBORegionSPES2 extends GLRegion {
- private GLArrayDataServer verticeAttr = null;
- private GLArrayDataServer texCoordAttr = null;
+ private GLArrayDataServer gca_VerticesAttr = null;
+ private GLArrayDataServer gca_CurveParamsAttr = null;
+ private GLArrayDataServer gca_ColorsAttr;
private GLArrayDataServer indicesBuffer = null;
- private boolean buffersAttached = false;
public VBORegionSPES2(final int renderModes) {
super(renderModes);
final int initialElementCount = 256;
indicesBuffer = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, initialElementCount, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);
- verticeAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
- false, initialElementCount, GL.GL_STATIC_DRAW);
+ gca_VerticesAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
+ false, initialElementCount, GL.GL_STATIC_DRAW);
- texCoordAttr = GLArrayDataServer.createGLSL(AttributeNames.TEXCOORD_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
- false, initialElementCount, GL.GL_STATIC_DRAW);
+ gca_CurveParamsAttr = GLArrayDataServer.createGLSL(AttributeNames.CURVEPARAMS_ATTR_NAME, 3, GL2ES2.GL_FLOAT,
+ false, initialElementCount, GL.GL_STATIC_DRAW);
+
+ if( hasColorChannel() ) {
+ gca_ColorsAttr = GLArrayDataServer.createGLSL(AttributeNames.COLOR_ATTR_NAME, 4, GL2ES2.GL_FLOAT,
+ false, initialElementCount, GL.GL_STATIC_DRAW);
+ } else {
+ gca_ColorsAttr = null;
+ }
}
@Override
@@ -64,25 +72,40 @@ public class VBORegionSPES2 extends GLRegion {
indicesBuffer.seal(gl, false);
indicesBuffer.rewind();
}
- if( null != verticeAttr ) {
- verticeAttr.seal(gl, false);
- verticeAttr.rewind();
+ if( null != gca_VerticesAttr ) {
+ gca_VerticesAttr.seal(gl, false);
+ gca_VerticesAttr.rewind();
}
- if( null != texCoordAttr ) {
- texCoordAttr.seal(gl, false);
- texCoordAttr.rewind();
+ if( null != gca_CurveParamsAttr ) {
+ gca_CurveParamsAttr.seal(gl, false);
+ gca_CurveParamsAttr.rewind();
+ }
+ if( null != gca_ColorsAttr ) {
+ gca_ColorsAttr.seal(gl, false);
+ gca_ColorsAttr.rewind();
}
}
@Override
- protected final void pushVertex(float[] coords, float[] texParams) {
- verticeAttr.putf(coords[0]);
- verticeAttr.putf(coords[1]);
- verticeAttr.putf(coords[2]);
-
- texCoordAttr.putf(texParams[0]);
- texCoordAttr.putf(texParams[1]);
- texCoordAttr.putf(texParams[2]);
+ protected final void pushVertex(float[] coords, float[] texParams, float[] rgba) {
+ gca_VerticesAttr.putf(coords[0]);
+ gca_VerticesAttr.putf(coords[1]);
+ gca_VerticesAttr.putf(coords[2]);
+
+ gca_CurveParamsAttr.putf(texParams[0]);
+ gca_CurveParamsAttr.putf(texParams[1]);
+ gca_CurveParamsAttr.putf(texParams[2]);
+
+ if( null != gca_ColorsAttr ) {
+ if( null != rgba ) {
+ gca_ColorsAttr.putf(rgba[0]);
+ gca_ColorsAttr.putf(rgba[1]);
+ gca_ColorsAttr.putf(rgba[2]);
+ gca_ColorsAttr.putf(rgba[3]);
+ } else {
+ throw new IllegalArgumentException("Null color given for COLOR_CHANNEL rendering mode");
+ }
+ }
}
@Override
@@ -92,43 +115,67 @@ public class VBORegionSPES2 extends GLRegion {
@Override
protected void updateImpl(final GL2ES2 gl, final RegionRenderer renderer) {
- if( !buffersAttached ) {
- final ShaderState st = renderer.getShaderState();
- st.ownAttribute(verticeAttr, true);
- st.ownAttribute(texCoordAttr, true);
- buffersAttached = true;
- }
// seal buffers
indicesBuffer.seal(gl, true);
indicesBuffer.enableBuffer(gl, false);
- verticeAttr.seal(gl, true);
- verticeAttr.enableBuffer(gl, false);
- texCoordAttr.seal(gl, true);
- texCoordAttr.enableBuffer(gl, false);
+ gca_VerticesAttr.seal(gl, true);
+ gca_VerticesAttr.enableBuffer(gl, false);
+ gca_CurveParamsAttr.seal(gl, true);
+ gca_CurveParamsAttr.enableBuffer(gl, false);
+ if( null != gca_ColorsAttr ) {
+ gca_ColorsAttr.seal(gl, true);
+ gca_ColorsAttr.enableBuffer(gl, false);
+ }
if(DEBUG_INSTANCE) {
System.err.println("VBORegionSPES2 idx "+indicesBuffer);
- System.err.println("VBORegionSPES2 ver "+verticeAttr);
- System.err.println("VBORegionSPES2 tex "+texCoordAttr);
+ System.err.println("VBORegionSPES2 ver "+gca_VerticesAttr);
+ System.err.println("VBORegionSPES2 tex "+gca_CurveParamsAttr);
}
}
+ private ShaderProgram spPass1 = null;
+
+ public void useShaderProgram(final GL2ES2 gl, final RegionRenderer renderer, final int renderModes, final int quality) {
+ final RenderState rs = renderer.getRenderState();
+ final boolean updateLocation0 = renderer.useShaderProgram(gl, renderModes, true, quality, 0);
+ final ShaderProgram sp = renderer.getRenderState().getShaderProgram();
+ final boolean updateLocation = !sp.equals(spPass1);
+ spPass1 = sp;
+
+ // update attribute-location and uniform data and location
+ rs.update(gl, updateLocation, renderModes, true);
+ rs.updateAttributeLoc(gl, updateLocation, gca_VerticesAttr);
+ rs.updateAttributeLoc(gl, updateLocation, gca_CurveParamsAttr);
+ if( null != gca_ColorsAttr ) {
+ rs.updateAttributeLoc(gl, updateLocation, gca_ColorsAttr);
+ }
+ System.err.println("XXX changedSP "+updateLocation+", "+rs);
+ System.err.println("XXX gca_VerticesAttr "+gca_VerticesAttr);
+ System.err.println("XXX gca_CurveParamsAttr "+gca_CurveParamsAttr);
+ System.err.println("XXX gca_ColorsAttr "+gca_ColorsAttr);
+ }
+
+
@Override
protected void drawImpl(final GL2ES2 gl, final RegionRenderer renderer, final int[/*1*/] sampleCount) {
+ final int renderModes = getRenderModes();
+ useShaderProgram(gl, renderer, renderModes, getQuality());
+
if( 0 >= indicesBuffer.getElementCount() ) {
if(DEBUG_INSTANCE) {
System.err.printf("VBORegionSPES2.drawImpl: Empty%n");
}
return; // empty!
}
- verticeAttr.enableBuffer(gl, true);
- texCoordAttr.enableBuffer(gl, true);
+ gca_VerticesAttr.enableBuffer(gl, true);
+ gca_CurveParamsAttr.enableBuffer(gl, true);
indicesBuffer.bindBuffer(gl, true); // keeps VBO binding
gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
indicesBuffer.bindBuffer(gl, false);
- texCoordAttr.enableBuffer(gl, false);
- verticeAttr.enableBuffer(gl, false);
+ gca_CurveParamsAttr.enableBuffer(gl, false);
+ gca_VerticesAttr.enableBuffer(gl, false);
}
@Override
@@ -136,16 +183,17 @@ public class VBORegionSPES2 extends GLRegion {
if(DEBUG_INSTANCE) {
System.err.println("VBORegionSPES2 Destroy: " + this);
}
- final ShaderState st = renderer.getShaderState();
- if(null != verticeAttr) {
- st.ownAttribute(verticeAttr, false);
- verticeAttr.destroy(gl);
- verticeAttr = null;
+ if(null != gca_VerticesAttr) {
+ gca_VerticesAttr.destroy(gl);
+ gca_VerticesAttr = null;
+ }
+ if(null != gca_CurveParamsAttr) {
+ gca_CurveParamsAttr.destroy(gl);
+ gca_CurveParamsAttr = null;
}
- if(null != texCoordAttr) {
- st.ownAttribute(texCoordAttr, false);
- texCoordAttr.destroy(gl);
- texCoordAttr = null;
+ if(null != gca_ColorsAttr) {
+ gca_ColorsAttr.destroy(gl);
+ gca_ColorsAttr = null;
}
if(null != indicesBuffer) {
indicesBuffer.destroy(gl);
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/AttributeNames.java b/src/jogl/classes/jogamp/graph/curve/opengl/shader/AttributeNames.java
index b46661778..b2c73a2e4 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/AttributeNames.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/AttributeNames.java
@@ -28,18 +28,22 @@
package jogamp.graph.curve.opengl.shader;
public class AttributeNames {
- /** The vertices index in an OGL object
+ /**
+ * The vertices index in an OGL object
*/
- public static final int VERTEX_ATTR_IDX = 0; // FIXME: AMD needs this to be location 0 ? hu ?
public static final String VERTEX_ATTR_NAME = "gca_Vertices";
- /** The Texture Coord index in an OGL object
+ /**
+ * The Texture Coord index in an OGL object
*/
- public static final int TEXCOORD_ATTR_IDX = 1;
- public static final String TEXCOORD_ATTR_NAME = "gca_TexCoords";
+ public static final String CURVEPARAMS_ATTR_NAME = "gca_CurveParams";
- /** The color index in an OGL object
+ /**
+ * The color index in an OGL object
*/
- public static final int COLOR_ATTR_IDX = 2;
public static final String COLOR_ATTR_NAME = "gca_Colors";
+
+ public static final String FBO_VERTEX_ATTR_NAME = "gca_FboVertices";
+ public static final String FBO_TEXCOORDS_ATTR_NAME = "gca_FboTexCoords";
+
}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/UniformNames.java b/src/jogl/classes/jogamp/graph/curve/opengl/shader/UniformNames.java
index ce23aadac..df5ba35f2 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/UniformNames.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/UniformNames.java
@@ -1,10 +1,11 @@
package jogamp.graph.curve.opengl.shader;
public class UniformNames {
- public static final String gcu_PMVMatrix = "gcu_PMVMatrix"; // gcu_PMVMatrix[3]; // P, Mv, and Mvi
+ public static final String gcu_PMVMatrix01 = "gcu_PMVMatrix01"; // gcu_PMVMatrix[3]; // P, Mv, and Mvi
public static final String gcu_ColorStatic = "gcu_ColorStatic";
- public static final String gcu_Alpha = "gcu_Alpha";
public static final String gcu_Weight = "gcu_Weight";
- public static final String gcu_TextureUnit = "gcu_TextureUnit";
- public static final String gcu_TextureSize = "gcu_TextureSize";
+
+ public static final String gcu_PMVMatrix02 = "gcu_PMVMatrix01"; // gcu_PMVMatrix[3]; // P, Mv, and Mvi
+ public static final String gcu_FboTexUnit = "gcu_FboTexUnit";
+ public static final String gcu_FboTexSize = "gcu_FboTexSize";
}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/attributes.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/attributes.glsl
index c4d9db535..b8c68a924 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/attributes.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/attributes.glsl
@@ -12,13 +12,19 @@ attribute vec4 gca_Vertices;
* hole or holeLike: 0 > y
* !hole : 0 < y
*
- * 0 == gcv_TexCoord.x : vertex-0 of triangle
- * 0.5 == gcv_TexCoord.x : vertex-1 of triangle
- * 1 == gcv_TexCoord.x : vertex-2 of triangle
+ * 0 == gcv_CurveParams.x : vertex-0 of triangle
+ * 0.5 == gcv_CurveParams.x : vertex-1 of triangle
+ * 1 == gcv_CurveParams.x : vertex-2 of triangle
*/
-attribute vec3 gca_TexCoords;
+attribute vec3 gca_CurveParams;
+
+attribute vec4 gca_FboVertices;
+attribute vec2 gca_FboTexCoords;
+
+#ifdef USE_COLOR_CHANNEL
+ attribute vec4 gca_Colors;
+#endif
-//attribute vec4 gca_Colors;
//attribute vec3 gca_Normals;
#endif // attributes_glsl
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-1pass_norm-weight.fp b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-1pass_norm-weight.fp
index 20acfbac6..6e60fc044 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-1pass_norm-weight.fp
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-1pass_norm-weight.fp
@@ -14,15 +14,10 @@
#include uniforms.glsl
#include varyings.glsl
-const vec3 zero3 = vec3(0);
-
void main (void)
{
- vec3 color;
- float alpha;
// #include curverenderer01-pass1-curve-lineAA.glsl
#include curverenderer01-pass1-curve-weight.glsl
- mgl_FragColor = vec4(color, gcu_Alpha * alpha);
}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-1pass_norm.fp b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-1pass_norm.fp
index 03d2f9408..18f06fff0 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-1pass_norm.fp
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-1pass_norm.fp
@@ -14,15 +14,10 @@
#include uniforms.glsl
#include varyings.glsl
-const vec3 zero3 = vec3(0);
-
void main (void)
{
- vec3 color;
- float alpha;
// #include curverenderer01-pass1-curve-lineAA.glsl
#include curverenderer01-pass1-curve-simple.glsl
- mgl_FragColor = vec4(color, gcu_Alpha * alpha);
}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_msaa-weight.fp b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_msaa-weight.fp
index fba66c398..0a4f7b331 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_msaa-weight.fp
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_msaa-weight.fp
@@ -15,28 +15,21 @@
#include uniforms.glsl
#include varyings.glsl
-const vec3 zero3 = vec3(0);
-
void main (void)
{
- vec3 color;
- float alpha;
-
- if( 0.0 < gcu_TextureSize.z ) {
+ if( 0.0 < gcu_FboTexSize.z ) {
// Pass-2: Dump Texture
- vec4 t = texture2D(gcu_TextureUnit, gcv_TexCoord.st);
+ vec4 t = texture2D(gcu_FboTexUnit, gcv_FboTexCoord.st);
#if 0
if( 0.0 == t.a ) {
discard; // discard freezes NV tegra2 compiler
}
#endif
- color = t.rgb;
- alpha = gcu_Alpha * t.a;
+ mgl_FragColor = t;
} else {
#include curverenderer01-pass1-curve-weight.glsl
}
- mgl_FragColor = vec4(color, alpha);
}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_msaa.fp b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_msaa.fp
index e573bb347..c5cbb99b0 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_msaa.fp
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_msaa.fp
@@ -15,36 +15,22 @@
#include uniforms.glsl
#include varyings.glsl
-const vec3 zero3 = vec3(0);
-
void main (void)
{
- vec3 color;
- float alpha;
-
- if( 0.0 < gcu_TextureSize.z ) {
+ if( 0.0 < gcu_FboTexSize.z ) {
// Pass-2: Dump Texture
- vec4 t = texture2D(gcu_TextureUnit, gcv_TexCoord.st);
+ vec4 t = texture2D(gcu_FboTexUnit, gcv_FboTexCoord.st);
#if 0
if( 0.0 == t.a ) {
discard; // discard freezes NV tegra2 compiler
}
#endif
- color = t.rgb;
- #ifdef PREALPHA
- // alpha = mix(0.0, gcu_Alpha, t.a); // t.a one of [ 0.0, 1.0 ]
- // ^^ for = 0.0 == t.a ? 0.0 : gcu_Alpha;
- // mix(x, y, a) := x * ( 1 - a ) + y * a
- alpha = gcu_Alpha;
- #else
- alpha = gcu_Alpha * t.a;
- #endif
+ mgl_FragColor = t;
} else {
#include curverenderer01-pass1-curve-simple.glsl
}
- mgl_FragColor = vec4(color, alpha);
}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_vbaa-weight.fp b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_vbaa-weight.fp
index cca67a219..e3bcd20ae 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_vbaa-weight.fp
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_vbaa-weight.fp
@@ -15,18 +15,11 @@
#include uniforms.glsl
#include varyings.glsl
-const vec3 zero3 = vec3(0);
-
#define GetSample(texUnit, texCoord, psize, cx, cy, offX, offY) texture2D(texUnit, texCoord + psize * vec2(cx+offX, cy+offY))
void main (void)
{
- vec3 color;
- float alpha;
-
- // Note: gcu_Alpha is multiplied in pass2!
-
- if( 0.0 < gcu_TextureSize.z ) {
+ if( 0.0 < gcu_FboTexSize.z ) {
// Quality: allsamples > [flipquad,rgss, quincunx] > poles
#include curverenderer01-pass2-vbaa_allsamples_equal.glsl
@@ -48,5 +41,4 @@ void main (void)
#include curverenderer01-pass1-curve-weight.glsl
}
- mgl_FragColor = vec4(color, alpha);
}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_vbaa.fp b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_vbaa.fp
index e4dca15cb..52c719e46 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_vbaa.fp
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-2pass_vbaa.fp
@@ -15,23 +15,19 @@
#include uniforms.glsl
#include varyings.glsl
-const vec3 zero3 = vec3(0);
-
#define GetSample(texUnit, texCoord, psize, cx, cy, offX, offY) texture2D(texUnit, texCoord + psize * vec2(cx+offX, cy+offY))
void main (void)
{
- vec3 color;
- float alpha;
-
- // Note: gcu_Alpha is multiplied in pass2!
-
- if( 0.0 < gcu_TextureSize.z ) {
+ if( 0.0 < gcu_FboTexSize.z ) {
// Quality: allsamples > [flipquad,rgss, quincunx] > poles
-#include curverenderer01-pass2-vbaa_allsamples_equal.glsl
-// #include curverenderer01-pass2-vbaa_flipquad3.glsl
+ if( 0.0 >= gcu_FboTexSize.w ) {
+#include curverenderer01-pass2-vbaa_flipquad3.glsl
+ } else {
+#include curverenderer01-pass2-vbaa_allsamples_equal.glsl
+ }
// #include curverenderer01-pass2-vbaa_flipquad2.glsl
// #include curverenderer01-pass2-vbaa_flipquad.glsl
// #include curverenderer01-pass2-vbaa_rgss.glsl
@@ -48,5 +44,4 @@ void main (void)
#include curverenderer01-pass1-curve-simple.glsl
}
- mgl_FragColor = vec4(color, alpha);
}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-lineAA.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-lineAA.glsl
deleted file mode 100644
index 770ab3d71..000000000
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-lineAA.glsl
+++ /dev/null
@@ -1,20 +0,0 @@
-
- // if( gcv_TexCoord.x == 10.0 && gcv_TexCoord.y == 10.0 ) {
- if( gcv_TexCoord.z > 0.0 ) {
- // pass-1: AA Lines
- #if 1
- // float dist = sqrt( gcv_TexCoord.x*gcv_TexCoord.x + gcv_TexCoord.y*gcv_TexCoord.y ); // magnitude
- float dist = sqrt( gcv_TexCoord.y*gcv_TexCoord.y ); // magnitude
- // float a = 1.0 - smoothstep (gcv_TexCoord.y-gcv_TexCoord.z, gcv_TexCoord.y, dist);
- float r = gcv_TexCoord.x/3.0;
- float wa = gcv_TexCoord.x+r;
- float waHalf = wa/2.0;
- float a = 1.0 - smoothstep (waHalf-2.0*r, waHalf, dist);
- color = vec3(0, 0, 1.0); // gcu_ColorStatic.rgb;
- alpha = a;
- #else
- color = vec3(0, 0, 1.0);
- alpha = 1.0;
- #endif
- } else
-
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-simple.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-simple.glsl
deleted file mode 100644
index cfa1b9000..000000000
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-simple.glsl
+++ /dev/null
@@ -1,21 +0,0 @@
-
- if( gcv_TexCoord.x == 0.0 && gcv_TexCoord.y == 0.0 ) {
- // pass-1: Lines
- // color = vec3(0, 1.0, 0);
- color = gcu_ColorStatic.rgb;
- alpha = 1.0;
- } else {
- // pass-1: curves
- vec2 rtex = vec2( abs(gcv_TexCoord.x), abs(gcv_TexCoord.y) - 0.1 );
-
- vec2 dtx = dFdx(rtex);
- vec2 dty = dFdy(rtex);
-
- vec2 f = vec2((dtx.y - dtx.x + 2.0*rtex.x*dtx.x), (dty.y - dty.x + 2.0*rtex.x*dty.x));
- float position = rtex.y - (rtex.x * (1.0 - rtex.x));
-
- // color = vec3(1.0, 0, 0);
- color = gcu_ColorStatic.rgb;
- alpha = clamp(0.5 - ( position/length(f) ) * sign(gcv_TexCoord.y), 0.0, 1.0);
- }
-
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-simple.orig.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-simple.orig.glsl
deleted file mode 100644
index f73f24f12..000000000
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-simple.orig.glsl
+++ /dev/null
@@ -1,32 +0,0 @@
-
- vec2 rtex = vec2( abs(gcv_TexCoord.x), abs(gcv_TexCoord.y) );
-
- if( gcv_TexCoord.x == 0.0 && gcv_TexCoord.y == 0.0 ) {
- // pass-1: Lines
- color = gcu_ColorStatic.rgb;
- alpha = 1.0;
- } else if ( gcv_TexCoord.x > 0.0 && ( rtex.y > 0.0 || rtex.x == 1.0 ) ) {
- // pass-1: curves
- rtex.y -= 0.1;
-
- if(rtex.y < 0.0 && gcv_TexCoord.y < 0.0) {
- // discard; // freezes NV tegra2 compiler
- color = zero3;
- alpha = 0.0;
- } else {
- rtex.y = max(rtex.y, 0.0); // always >= 0
-
- vec2 dtx = dFdx(rtex);
- vec2 dty = dFdy(rtex);
-
- vec2 f = vec2((dtx.y - dtx.x + 2.0*rtex.x*dtx.x), (dty.y - dty.x + 2.0*rtex.x*dty.x));
- float position = rtex.y - (rtex.x * (1.0 - rtex.x));
-
- color = gcu_ColorStatic.rgb;
- alpha = clamp(0.5 - ( position/length(f) ) * sign(gcv_TexCoord.y), 0.0, 1.0);
- }
- } else {
- color = zero3;
- alpha = 0.0;
- }
-
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-weight.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-weight.glsl
deleted file mode 100644
index 21e44a23f..000000000
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve-weight.glsl
+++ /dev/null
@@ -1,25 +0,0 @@
-
- if( gcv_TexCoord.x == 0.0 && gcv_TexCoord.y == 0.0 ) {
- // pass-1: Lines
- color = gcu_ColorStatic.rgb;
- alpha = 1.0;
- } else {
- // pass-1: curves
- vec2 rtex = vec2( abs(gcv_TexCoord.x), abs(gcv_TexCoord.y) - 0.1 );
-
- vec2 dtx = dFdx(rtex);
- vec2 dty = dFdy(rtex);
-
- float w = gcu_Weight;
- float pd = ((2.0 - (2.0*w))*rtex.x*rtex.x) + 2.0*(w-1.0)*rtex.x + 1.0;
- float position = rtex.y - ((w*rtex.x*(1.0 - rtex.x))/pd);
-
- float aph = 2.0 - 2.0*w;
-
- float gd = (aph*rtex.x*rtex.x + 2.0*rtex.x + 1.0)*(aph*rtex.x*rtex.x + 2.0*rtex.x + 1.0);
- vec2 f = vec2((dtx.y - (w*dtx.x*(1.0 - 2.0*rtex.x))/gd), (dty.y - (w*dty.x*(1.0 - 2.0*rtex.x))/gd));
-
- color = gcu_ColorStatic.rgb;
- alpha = clamp(0.5 - ( position/length(f) ) * sign(gcv_TexCoord.y), 0.0, 1.0);
- }
-
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_lineAA.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_lineAA.glsl
new file mode 100644
index 000000000..79b3dd6fd
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_lineAA.glsl
@@ -0,0 +1,19 @@
+
+ // if( gcv_CurveParam.x == 10.0 && gcv_CurveParam.y == 10.0 ) {
+ if( gcv_CurveParam.z > 0.0 ) {
+ // pass-1: AA Lines
+ #if 1
+ // float dist = sqrt( gcv_CurveParam.x*gcv_CurveParam.x + gcv_CurveParam.y*gcv_CurveParam.y ); // magnitude
+ float dist = sqrt( gcv_CurveParam.y*gcv_CurveParam.y ); // magnitude
+ // float a = 1.0 - smoothstep (gcv_CurveParam.y-gcv_CurveParam.z, gcv_CurveParam.y, dist);
+ float r = gcv_CurveParam.x/3.0;
+ float wa = gcv_CurveParam.x+r;
+ float waHalf = wa/2.0;
+ float a = 1.0 - smoothstep (waHalf-2.0*r, waHalf, dist);
+ // mgl_FragColor = vec4(gcu_ColorStatic.rgb, gcu_ColorStatic.a * a);
+ mgl_FragColor = vec4(0, 0, 1.0, gcu_ColorStatic.a * a);
+ #else
+ mgl_FragColor = vec4(0, 0, 1.0, 1.0);
+ #endif
+ } else
+
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_simple.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_simple.glsl
new file mode 100644
index 000000000..373e8d575
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_simple.glsl
@@ -0,0 +1,26 @@
+
+ if( gcv_CurveParam.x == 0.0 && gcv_CurveParam.y == 0.0 ) {
+ // pass-1: Lines
+#ifdef USE_COLOR_CHANNEL
+ mgl_FragColor = gcv_Color * gcu_ColorStatic;
+#else
+ mgl_FragColor = gcu_ColorStatic;
+#endif
+ } else {
+ // pass-1: curves
+ vec2 rtex = vec2( abs(gcv_CurveParam.x), abs(gcv_CurveParam.y) - 0.1 );
+
+ vec2 dtx = dFdx(rtex);
+ vec2 dty = dFdy(rtex);
+
+ vec2 f = vec2((dtx.y - dtx.x + 2.0*rtex.x*dtx.x), (dty.y - dty.x + 2.0*rtex.x*dty.x));
+ float position = rtex.y - (rtex.x * (1.0 - rtex.x));
+
+ float a = clamp(0.5 - ( position/length(f) ) * sign(gcv_CurveParam.y), 0.0, 1.0);
+#ifdef USE_COLOR_CHANNEL
+ mgl_FragColor = vec4(gcv_Color.rgb * gcu_ColorStatic.rgb, gcv_Color.a * gcu_ColorStatic.a * a);
+#else
+ mgl_FragColor = vec4(gcu_ColorStatic.rgb, gcu_ColorStatic.a * a);
+#endif
+ }
+
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_simple.orig.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_simple.orig.glsl
new file mode 100644
index 000000000..92f0fc07b
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_simple.orig.glsl
@@ -0,0 +1,37 @@
+
+ vec2 rtex = vec2( abs(gcv_CurveParam.x), abs(gcv_CurveParam.y) );
+
+ if( gcv_CurveParam.x == 0.0 && gcv_CurveParam.y == 0.0 ) {
+ // pass-1: Lines
+#ifdef USE_COLOR_CHANNEL
+ mgl_FragColor = gcv_Color * gcu_ColorStatic;
+#else
+ mgl_FragColor = gcu_ColorStatic;
+#endif
+ } else if ( gcv_CurveParam.x > 0.0 && ( rtex.y > 0.0 || rtex.x == 1.0 ) ) {
+ // pass-1: curves
+ rtex.y -= 0.1;
+
+ if(rtex.y < 0.0 && gcv_CurveParam.y < 0.0) {
+ // discard; // freezes NV tegra2 compiler
+ mgl_FragColor = vec4(0);
+ } else {
+ rtex.y = max(rtex.y, 0.0); // always >= 0
+
+ vec2 dtx = dFdx(rtex);
+ vec2 dty = dFdy(rtex);
+
+ vec2 f = vec2((dtx.y - dtx.x + 2.0*rtex.x*dtx.x), (dty.y - dty.x + 2.0*rtex.x*dty.x));
+ float position = rtex.y - (rtex.x * (1.0 - rtex.x));
+
+ float a = clamp(0.5 - ( position/length(f) ) * sign(gcv_CurveParam.y), 0.0, 1.0);
+#ifdef USE_COLOR_CHANNEL
+ mgl_FragColor = vec4(gcv_Color.rgb * gcu_ColorStatic.rgb, gcv_Color.a * gcu_ColorStatic.a * a);
+#else
+ mgl_FragColor = vec4(gcu_ColorStatic.rgb, gcu_ColorStatic.a * a);
+#endif
+ }
+ } else {
+ mgl_FragColor = vec4(0);
+ }
+
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_weight.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_weight.glsl
new file mode 100644
index 000000000..1620a9532
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_weight.glsl
@@ -0,0 +1,32 @@
+
+ if( gcv_CurveParam.x == 0.0 && gcv_CurveParam.y == 0.0 ) {
+ // pass-1: Lines
+#ifdef USE_COLOR_CHANNEL
+ mgl_FragColor = gcv_Color * gcu_ColorStatic;
+#else
+ mgl_FragColor = gcu_ColorStatic;
+#endif
+ } else {
+ // pass-1: curves
+ vec2 rtex = vec2( abs(gcv_CurveParam.x), abs(gcv_CurveParam.y) - 0.1 );
+
+ vec2 dtx = dFdx(rtex);
+ vec2 dty = dFdy(rtex);
+
+ float w = gcu_Weight;
+ float pd = ((2.0 - (2.0*w))*rtex.x*rtex.x) + 2.0*(w-1.0)*rtex.x + 1.0;
+ float position = rtex.y - ((w*rtex.x*(1.0 - rtex.x))/pd);
+
+ float aph = 2.0 - 2.0*w;
+
+ float gd = (aph*rtex.x*rtex.x + 2.0*rtex.x + 1.0)*(aph*rtex.x*rtex.x + 2.0*rtex.x + 1.0);
+ vec2 f = vec2((dtx.y - (w*dtx.x*(1.0 - 2.0*rtex.x))/gd), (dty.y - (w*dty.x*(1.0 - 2.0*rtex.x))/gd));
+
+ float a = clamp(0.5 - ( position/length(f) ) * sign(gcv_CurveParam.y), 0.0, 1.0);
+#ifdef USE_COLOR_CHANNEL
+ mgl_FragColor = vec4(gcv_Color.rgb * gcu_ColorStatic.rgb, gcv_Color.a * gcu_ColorStatic.a * a);
+#else
+ mgl_FragColor = vec4(gcu_ColorStatic.rgb, gcu_ColorStatic.a * a);
+#endif
+ }
+
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1.vp b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1.vp
new file mode 100644
index 000000000..46729cfd0
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1.vp
@@ -0,0 +1,30 @@
+//Copyright 2010 JogAmp Community. All rights reserved.
+
+#if __VERSION__ >= 130
+ #define attribute in
+ #define varying out
+#endif
+
+#include uniforms.glsl
+#include attributes.glsl
+#include varyings.glsl
+
+void main(void)
+{
+ // gl_Position = gcu_PMVMatrix02[0] * gcu_PMVMatrix02[1] * vec4(gca_Vertices, 1);
+ gl_Position = gcu_PMVMatrix02[0] * gcu_PMVMatrix02[1] * gca_Vertices;
+#if 1
+ gcv_CurveParam = gca_CurveParams;
+#else
+ if( gcv_CurveParams.x <= -10.0 ) {
+ // vec4 tc = gcu_PMVMatrix02[0] * gcu_PMVMatrix02[1] * vec4(gca_CurveParams.xy, gca_Vertices.z, 1);
+ // gcv_CurveParams = vec3(tc.xy, gca_CurveParams.z);
+ gcv_CurveParam = gca_CurveParams;
+ } else {
+ gcv_CurveParam = gca_CurveParams;
+ }
+#endif
+#ifdef USE_COLOR_CHANNEL
+ gcv_Color = gca_Colors;
+#endif
+}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allequal.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allequal.glsl
new file mode 100644
index 000000000..da7feeaa7
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allequal.glsl
@@ -0,0 +1,96 @@
+ // Pass-2: AA on Texture
+ // Note: gcv_FboTexCoord is in center of sample pixels.
+
+ // float sampleCount = gcu_FboTexSize.z;
+ vec2 psize = 1.0 / gcu_FboTexSize.xy; // pixel size
+
+ // Not only the poles (NW, SW, ..) but the whole edge!
+ const float sample_weight = 1.0 / ( SAMPLE_COUNT * SAMPLE_COUNT );
+
+ // const vec4 tex_weights = vec4(0.075, 0.06, 0.045, 0.025);
+ vec2 texCoord = gcv_FboTexCoord.st;
+
+ vec4 t;
+
+ // SampleCount 2 -> 4x
+ t = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, -0.5)))*sample_weight; // NW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, 0.5)))*sample_weight; // SW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, 0.5)))*sample_weight; // SE
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, -0.5)))*sample_weight; // NE
+ #if SAMPLE_COUNT > 2
+ // SampleCount 4 -> +12x = 16p
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, -1.5)))*sample_weight; // NW -> SW Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, -0.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, 0.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, 1.5)))*sample_weight; // SW -> SE Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, 1.5)))*sample_weight; //
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, 1.5)))*sample_weight; //
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, 1.5)))*sample_weight; // SE -> NE Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, 0.5)))*sample_weight; //
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, -0.5)))*sample_weight; //
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, -1.5)))*sample_weight; // NE -> NW Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, -1.5)))*sample_weight; //
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, -1.5)))*sample_weight; // NW - 1 (closed)
+
+ #if SAMPLE_COUNT > 4
+ // SampleCount 6 -> +20x = 36p
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, -2.5)))*sample_weight; // NW -> SW Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, -1.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, -0.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, 0.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, 1.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, 2.5)))*sample_weight; // SW -> SE Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, 2.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, 2.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, 2.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, 2.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, 2.5)))*sample_weight; // SE -> NE Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, 1.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, 0.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, -0.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, -1.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, -2.5)))*sample_weight; // NE -> NW Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, -2.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, -2.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, -2.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, -2.5)))*sample_weight; // NW - 1 (closed)
+ #if SAMPLE_COUNT > 6
+ // SampleCount 8 -> +28x = 64p
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, -3.5)))*sample_weight; // NW -> SW Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, -2.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, -1.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, -0.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, 0.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, 1.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, 2.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, 3.5)))*sample_weight; // SW -> SE Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, 3.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, 3.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, 3.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, 3.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, 3.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, 3.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, 3.5)))*sample_weight; // SE -> NE Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, 2.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, 1.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, 0.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, -0.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, -1.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, -2.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, -3.5)))*sample_weight; // NE -> NW Edge
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, -3.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, -3.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, -3.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, -3.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, -3.5)))*sample_weight;
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, -3.5)))*sample_weight; // NW - 1 (closed)
+ #endif
+ #endif
+ #endif
+ #if 0
+ if(t.w == 0.0){
+ discard; // discard freezes NV tegra2 compiler
+ }
+ #endif
+
+ mgl_FragColor = t;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allprop01.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allprop01.glsl
new file mode 100644
index 000000000..436dd4ed4
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allprop01.glsl
@@ -0,0 +1,113 @@
+ // Pass-2: AA on Texture
+ // Note: gcv_FboTexCoord is in center of sample pixels.
+
+ float sampleCount = gcu_FboTexSize.z;
+ vec2 psize = 1.0 / gcu_FboTexSize.xy; // pixel size
+
+ // Not only the poles (NW, SW, ..) but the whole edge!
+ float pixelCount = sampleCount * sampleCount;
+
+ // sampleCount [0, 1, 3, 5, 7] are undefined!
+ float layerCount = ( sampleCount / 2.0 );
+
+ // sum of all integer [layerCount .. 1] -> Gauss
+ float denom = ( layerCount / 2.0 ) * ( layerCount + 1.0 );
+
+ vec2 texCoord = gcv_FboTexCoord.st;
+
+ vec4 t;
+
+ // Layer-1: SampleCount 2 -> 4x
+ t = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, -0.5))); // NW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, 0.5))); // SW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, 0.5))); // SE
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, -0.5))); // NE
+
+ t *= (layerCount - 0.0) / ( denom * 4.0 ); // weight layer 1
+
+ if( sampleCount > 2.0 ) {
+ // Layer-2: SampleCount 4 -> +12x = 16p
+ vec4 tn = vec4(0);
+ tn = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, -1.5))); // NW -> SW Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, -0.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, 0.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, 1.5))); // SW -> SE Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, 1.5))); //
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, 1.5))); //
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, 1.5))); // SE -> NE Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, 0.5))); //
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, -0.5))); //
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, -1.5))); // NE -> NW Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, -1.5))); //
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, -1.5))); // NW - 1 (closed)
+
+ t += tn * (layerCount - 1) / ( denom * 12.0 ); // weight layer 2
+
+ if( sampleCount > 4.0 ) {
+ // Layer-3: SampleCount 6 -> +20x = 36p
+ tn = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, -2.5))); // NW -> SW Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, -1.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, -0.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, 0.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, 1.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, 2.5))); // SW -> SE Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, 2.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, 2.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, 2.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, 2.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, 2.5))); // SE -> NE Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, 1.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, 0.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, -0.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, -1.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, -2.5))); // NE -> NW Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, -2.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, -2.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, -2.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, -2.5))); // NW - 1 (closed)
+
+ t += tn * (layerCount - 2) / ( denom * 20.0 ); // weight layer 3
+
+ if( sampleCount > 6.0 ) {
+ // Layer-4: SampleCount 8 -> +28x = 64p
+ tn = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, -3.5))); // NW -> SW Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, -2.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, -1.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, -0.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, 0.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, 1.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, 2.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, 3.5))); // SW -> SE Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, 3.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, 3.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, 3.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, 3.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, 3.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, 3.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, 3.5))); // SE -> NE Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, 2.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, 1.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, 0.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, -0.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, -1.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, -2.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, -3.5))); // NE -> NW Edge
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, -3.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, -3.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, -3.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, -3.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, -3.5)));
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, -3.5))); // NW - 1 (closed)
+
+ t += tn * (layerCount - 3) / ( denom * 28.0 ); // weight layer 4
+ }
+ }
+ }
+
+ #if 0
+ if(t.w == 0.0){
+ discard; // discard freezes NV tegra2 compiler
+ }
+ #endif
+
+ mgl_FragColor = t;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allsamples_equal.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allsamples_equal.glsl
deleted file mode 100644
index 1d2451755..000000000
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allsamples_equal.glsl
+++ /dev/null
@@ -1,97 +0,0 @@
- // Pass-2: AA on Texture
- // Note: gcv_TexCoord is in center of sample pixels.
-
- float sampleCount = gcu_TextureSize.z;
- vec2 psize = 1.0 / gcu_TextureSize.xy; // pixel size
-
- // Not only the poles (NW, SW, ..) but the whole edge!
- float sample_weight = 1.0 / ( sampleCount * sampleCount );
-
- // const vec4 tex_weights = vec4(0.075, 0.06, 0.045, 0.025);
- vec2 texCoord = gcv_TexCoord.st;
-
- vec4 t;
-
- // SampleCount 2 -> 4x
- t = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, -0.5)))*sample_weight; // NW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, 0.5)))*sample_weight; // SW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, 0.5)))*sample_weight; // SE
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, -0.5)))*sample_weight; // NE
- if( sampleCount > 2.0 ) {
- // SampleCount 4 -> +12x = 16p
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, -1.5)))*sample_weight; // NW -> SW Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, -0.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, 0.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, 1.5)))*sample_weight; // SW -> SE Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, 1.5)))*sample_weight; //
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, 1.5)))*sample_weight; //
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, 1.5)))*sample_weight; // SE -> NE Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, 0.5)))*sample_weight; //
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, -0.5)))*sample_weight; //
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, -1.5)))*sample_weight; // NE -> NW Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, -1.5)))*sample_weight; //
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, -1.5)))*sample_weight; // NW - 1 (closed)
-
- if( sampleCount > 4.0 ) {
- // SampleCount 6 -> +20x = 36p
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, -2.5)))*sample_weight; // NW -> SW Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, -1.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, -0.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, 0.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, 1.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, 2.5)))*sample_weight; // SW -> SE Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, 2.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, 2.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, 2.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, 2.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, 2.5)))*sample_weight; // SE -> NE Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, 1.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, 0.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, -0.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, -1.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, -2.5)))*sample_weight; // NE -> NW Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, -2.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, -2.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, -2.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, -2.5)))*sample_weight; // NW - 1 (closed)
- if( sampleCount > 6.0 ) {
- // SampleCount 8 -> +28x = 64p
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, -3.5)))*sample_weight; // NW -> SW Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, -2.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, -1.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, -0.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, 0.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, 1.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, 2.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, 3.5)))*sample_weight; // SW -> SE Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, 3.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, 3.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, 3.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, 3.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, 3.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, 3.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, 3.5)))*sample_weight; // SE -> NE Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, 2.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, 1.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, 0.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, -0.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, -1.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, -2.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, -3.5)))*sample_weight; // NE -> NW Edge
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, -3.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, -3.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, -3.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, -3.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, -3.5)))*sample_weight;
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, -3.5)))*sample_weight; // NW - 1 (closed)
- }
- }
- }
- #if 0
- if(t.w == 0.0){
- discard; // discard freezes NV tegra2 compiler
- }
- #endif
-
- color = t.rgb;
- alpha = gcu_Alpha * t.a;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allsamples_prop01.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allsamples_prop01.glsl
deleted file mode 100644
index 79c89a444..000000000
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_allsamples_prop01.glsl
+++ /dev/null
@@ -1,114 +0,0 @@
- // Pass-2: AA on Texture
- // Note: gcv_TexCoord is in center of sample pixels.
-
- float sampleCount = gcu_TextureSize.z;
- vec2 psize = 1.0 / gcu_TextureSize.xy; // pixel size
-
- // Not only the poles (NW, SW, ..) but the whole edge!
- float pixelCount = sampleCount * sampleCount;
-
- // sampleCount [0, 1, 3, 5, 7] are undefined!
- float layerCount = ( sampleCount / 2.0 );
-
- // sum of all integer [layerCount .. 1] -> Gauss
- float denom = ( layerCount / 2.0 ) * ( layerCount + 1.0 );
-
- vec2 texCoord = gcv_TexCoord.st;
-
- vec4 t;
-
- // Layer-1: SampleCount 2 -> 4x
- t = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, -0.5))); // NW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, 0.5))); // SW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, 0.5))); // SE
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, -0.5))); // NE
-
- t *= (layerCount - 0.0) / ( denom * 4.0 ); // weight layer 1
-
- if( sampleCount > 2.0 ) {
- // Layer-2: SampleCount 4 -> +12x = 16p
- vec4 tn = vec4(0);
- tn = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, -1.5))); // NW -> SW Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, -0.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, 0.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, 1.5))); // SW -> SE Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, 1.5))); //
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, 1.5))); //
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, 1.5))); // SE -> NE Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, 0.5))); //
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, -0.5))); //
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, -1.5))); // NE -> NW Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, -1.5))); //
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, -1.5))); // NW - 1 (closed)
-
- t += tn * (layerCount - 1) / ( denom * 12.0 ); // weight layer 2
-
- if( sampleCount > 4.0 ) {
- // Layer-3: SampleCount 6 -> +20x = 36p
- tn = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, -2.5))); // NW -> SW Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, -1.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, -0.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, 0.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, 1.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, 2.5))); // SW -> SE Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, 2.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, 2.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, 2.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, 2.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, 2.5))); // SE -> NE Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, 1.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, 0.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, -0.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, -1.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, -2.5))); // NE -> NW Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, -2.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, -2.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, -2.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, -2.5))); // NW - 1 (closed)
-
- t += tn * (layerCount - 2) / ( denom * 20.0 ); // weight layer 3
-
- if( sampleCount > 6.0 ) {
- // Layer-4: SampleCount 8 -> +28x = 64p
- tn = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, -3.5))); // NW -> SW Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, -2.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, -1.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, -0.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, 0.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, 1.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, 2.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, 3.5))); // SW -> SE Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, 3.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, 3.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, 3.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, 3.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, 3.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, 3.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, 3.5))); // SE -> NE Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, 2.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, 1.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, 0.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, -0.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, -1.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, -2.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, -3.5))); // NE -> NW Edge
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, -3.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, -3.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, -3.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, -3.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, -3.5)));
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, -3.5))); // NW - 1 (closed)
-
- t += tn * (layerCount - 3) / ( denom * 28.0 ); // weight layer 4
- }
- }
- }
-
- #if 0
- if(t.w == 0.0){
- discard; // discard freezes NV tegra2 compiler
- }
- #endif
-
- color = t.rgb;
- alpha = gcu_Alpha * t.a;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad.glsl
index b5c1494f8..3e74fb9a6 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad.glsl
@@ -1,9 +1,9 @@
// Pass-2: AA on Texture
- // Note: gcv_TexCoord is in center of sample pixels, origin is bottom left!
+ // Note: gcv_FboTexCoord is in center of sample pixels, origin is bottom left!
- float sampleCount = gcu_TextureSize.z;
- vec2 psize = 1.0 / gcu_TextureSize.xy; // pixel size
+ float sampleCount = gcu_FboTexSize.z;
+ vec2 psize = 1.0 / gcu_FboTexSize.xy; // pixel size
// Just poles (NW, SW, ..)
float edge1H = sampleCount / 2.0;
@@ -14,20 +14,20 @@
vec2 modPos = mod(normFragCoord, 2.0);
float orient = mod(modPos.x + modPos.y, 2.0); // mirrored on all odd columns, alternating each row (checker-board pattern)
- vec2 texCoord = gcv_TexCoord.st;
+ vec2 texCoord = gcv_FboTexCoord.st;
vec4 t;
if( 0.0 == orient ) {
// SWIPE LEFT -> RIGHT
- t = GetSample(gcu_TextureUnit, texCoord, psize, -edge1H, edgeTH, 0.0, 0.0)*0.25; // upper-left [p1]
- t += GetSample(gcu_TextureUnit, texCoord, psize, -edgeTH, -edge1H, 0.0, 0.0)*0.25; // lower-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeTH, edge1H, 0.0, 0.0)*0.25; // upper-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edge1H, -edgeTH, 0.0, 0.0)*0.25; // lower-right [p4]
+ t = GetSample(gcu_FboTexUnit, texCoord, psize, -edge1H, edgeTH, 0.0, 0.0)*0.25; // upper-left [p1]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, -edgeTH, -edge1H, 0.0, 0.0)*0.25; // lower-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeTH, edge1H, 0.0, 0.0)*0.25; // upper-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edge1H, -edgeTH, 0.0, 0.0)*0.25; // lower-right [p4]
} else {
- t = GetSample(gcu_TextureUnit, texCoord, psize, -edge1H, -edgeTH, 0.0, 0.0)*0.25; // lower-left [p4]
- t += GetSample(gcu_TextureUnit, texCoord, psize, -edgeTH, edge1H, 0.0, 0.0)*0.25; // upper-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeTH, -edge1H, 0.0, 0.0)*0.25; // lower-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edge1H, edgeTH, 0.0, 0.0)*0.25; // upper-right [p1]
+ t = GetSample(gcu_FboTexUnit, texCoord, psize, -edge1H, -edgeTH, 0.0, 0.0)*0.25; // lower-left [p4]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, -edgeTH, edge1H, 0.0, 0.0)*0.25; // upper-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeTH, -edge1H, 0.0, 0.0)*0.25; // lower-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edge1H, edgeTH, 0.0, 0.0)*0.25; // upper-right [p1]
}
@@ -37,6 +37,5 @@
}
#endif
- color = t.rgb;
- alpha = gcu_Alpha * t.a;
+ mgl_FragColor = t;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad2.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad2.glsl
index 98812861d..9e31e6bb7 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad2.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad2.glsl
@@ -1,17 +1,17 @@
// Pass-2: AA on Texture
- // Note: gcv_TexCoord is in center of sample pixels, origin is bottom left!
+ // Note: gcv_FboTexCoord is in center of sample pixels, origin is bottom left!
//
// Same as flipquad - but w/ rgss coordinates
- float sampleCount = gcu_TextureSize.z;
- vec2 psize = 1.0 / gcu_TextureSize.xy; // pixel size
+ float sampleCount = gcu_FboTexSize.z;
+ vec2 psize = 1.0 / gcu_FboTexSize.xy; // pixel size
vec2 normFragCoord = gl_FragCoord.xy - vec2(0.5, 0.5); // normalize center 0.5/0.5 -> 0/0
vec2 modPos = mod(normFragCoord, 2.0);
float orient = mod(modPos.x + modPos.y, 2.0); // mirrored on all odd columns, alternating each row (checker-board pattern)
- vec2 texCoord = gcv_TexCoord.st;
+ vec2 texCoord = gcv_FboTexCoord.st;
float edge1Q = ( sampleCount / 2.0 ) - 1.0;
vec4 t;
@@ -20,15 +20,15 @@
if( 0.0 == orient ) {
// SWIPE LEFT -> RIGHT
- t = GetSample(gcu_TextureUnit, texCoord, psize, -edge1Q, 0.0, -0.5, 0.5)*0.25; // upper-left [p1]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edge1Q, -0.5, -0.5)*0.25; // lower-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edge1Q, 0.5, 0.5)*0.25; // upper-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edge1Q, 0.0, 0.5, -0.5)*0.25; // lower-right [p4]
+ t = GetSample(gcu_FboTexUnit, texCoord, psize, -edge1Q, 0.0, -0.5, 0.5)*0.25; // upper-left [p1]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edge1Q, -0.5, -0.5)*0.25; // lower-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edge1Q, 0.5, 0.5)*0.25; // upper-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edge1Q, 0.0, 0.5, -0.5)*0.25; // lower-right [p4]
} else {
- t = GetSample(gcu_TextureUnit, texCoord, psize, -edge1Q, 0.0, -0.5, -0.5)*0.25; // lower-left [p4]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edge1Q, -0.5, 0.5)*0.25; // upper-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edge1Q, 0.5, -0.5)*0.25; // lower-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edge1Q, 0.0, 0.5, 0.5)*0.25; // upper-right [p1]
+ t = GetSample(gcu_FboTexUnit, texCoord, psize, -edge1Q, 0.0, -0.5, -0.5)*0.25; // lower-left [p4]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edge1Q, -0.5, 0.5)*0.25; // upper-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edge1Q, 0.5, -0.5)*0.25; // lower-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edge1Q, 0.0, 0.5, 0.5)*0.25; // upper-right [p1]
}
#if 0
@@ -37,6 +37,5 @@
}
#endif
- color = t.rgb;
- alpha = gcu_Alpha * t.a;
+ mgl_FragColor = t;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad3.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad3.glsl
index edfbd9deb..7a2cb0358 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad3.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_flipquad3.glsl
@@ -1,97 +1,103 @@
// Pass-2: AA on Texture
- // Note: gcv_TexCoord is in center of sample pixels, origin is bottom left!
+ // Note: gcv_FboTexCoord is in center of sample pixels, origin is bottom left!
//
// Same as flipquad - but w/ rgss coordinates
- float sampleCount = gcu_TextureSize.z;
- vec2 psize = 1.0 / gcu_TextureSize.xy; // pixel size
+ // float sampleCount = gcu_FboTexSize.z;
+ vec2 psize = 1.0 / gcu_FboTexSize.xy; // pixel size
vec2 normFragCoord = gl_FragCoord.xy - vec2(0.5, 0.5); // normalize center 0.5/0.5 -> 0/0
vec2 modPos = mod(normFragCoord, 2.0);
float orient = mod(modPos.x + modPos.y, 2.0); // mirrored on all odd columns, alternating each row (checker-board pattern)
- vec2 texCoord = gcv_TexCoord.st;
+ vec2 texCoord = gcv_FboTexCoord.st;
vec4 t;
// #define GetSample(texUnit, texCoord, psize, cx, cy, offX, offY) texture2D(texUnit, texCoord + psize * vec2(cx+offX, cy+offY))
- if( 1.0 == sampleCount ) {
- t = texture2D(gcu_TextureUnit, texCoord);
+ #if SAMPLE_COUNT == 1
+
+ t = texture2D(gcu_FboTexUnit, texCoord);
+
+ #elif SAMPLE_COUNT < 4
- } else if( 4.0 > sampleCount ) {
// SampleCount 2 -> 2p
const float weight = 1.0 / 2.0;
- float edge = ( sampleCount / 2.0 ) - 1.0;
+ const float edge = ( SAMPLE_COUNT / 2.0 ) - 1.0;
- t = GetSample(gcu_TextureUnit, texCoord, psize, -edge, edge, -0.5, 0.5)*weight; // center
- t += GetSample(gcu_TextureUnit, texCoord, psize, edge, -edge, 0.5, -0.5)*weight; // center
+ t = GetSample(gcu_FboTexUnit, texCoord, psize, -edge, edge, -0.5, 0.5)*weight; // center
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edge, -edge, 0.5, -0.5)*weight; // center
+
+ #elif SAMPLE_COUNT < 8
- } else if( 8.0 > sampleCount ) {
// SampleCount 4 -> 4p
const float weight = 1.0 / 4.0;
- float edgeS4_1Q = ( sampleCount / 2.0 ) - 1.0;
+ const float edgeS4_1Q = ( SAMPLE_COUNT / 2.0 ) - 1.0;
if( 0.0 == orient ) {
// SWIPE LEFT -> RIGHT
- t = GetSample(gcu_TextureUnit, texCoord, psize, -edgeS4_1Q, 0.0, -0.5, 0.5)*weight; // upper-left [p1]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edgeS4_1Q, -0.5, -0.5)*weight; // lower-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edgeS4_1Q, 0.5, 0.5)*weight; // upper-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeS4_1Q, 0.0, 0.5, -0.5)*weight; // lower-right [p4]
+ t = GetSample(gcu_FboTexUnit, texCoord, psize, -edgeS4_1Q, 0.0, -0.5, 0.5)*weight; // upper-left [p1]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edgeS4_1Q, -0.5, -0.5)*weight; // lower-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edgeS4_1Q, 0.5, 0.5)*weight; // upper-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeS4_1Q, 0.0, 0.5, -0.5)*weight; // lower-right [p4]
} else {
- t = GetSample(gcu_TextureUnit, texCoord, psize, -edgeS4_1Q, 0.0, -0.5, -0.5)*weight; // lower-left [p4]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edgeS4_1Q, -0.5, 0.5)*weight; // upper-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edgeS4_1Q, 0.5, -0.5)*weight; // lower-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeS4_1Q, 0.0, 0.5, 0.5)*weight; // upper-right [p1]
+ t = GetSample(gcu_FboTexUnit, texCoord, psize, -edgeS4_1Q, 0.0, -0.5, -0.5)*weight; // lower-left [p4]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edgeS4_1Q, -0.5, 0.5)*weight; // upper-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edgeS4_1Q, 0.5, -0.5)*weight; // lower-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeS4_1Q, 0.0, 0.5, 0.5)*weight; // upper-right [p1]
}
- } else {
+
+ #else
+
// SampleCount 8 -> 16p
const float weight = 1.0 / 16.0;
const float edgeS4_1Q = 1.0;
if( 0.0 == orient ) {
// SWIPE LEFT -> RIGHT
- t = GetSample(gcu_TextureUnit, texCoord, psize, -edgeS4_1Q, 0.0, -2.0-0.5, -2.0+0.5)*weight; // upper-left [p1]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edgeS4_1Q, -2.0-0.5, -2.0-0.5)*weight; // lower-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edgeS4_1Q, -2.0-0.5, -2.0-0.5)*weight; // upper-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeS4_1Q, 0.0, -2.0-0.5, -2.0-0.5)*weight; // lower-right [p4]
-
- t += GetSample(gcu_TextureUnit, texCoord, psize, -edgeS4_1Q, 0.0, -2.0-0.5, 2.0-0.5)*weight; // lower-left [p4]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edgeS4_1Q, -2.0-0.5, 2.0+0.5)*weight; // upper-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edgeS4_1Q, -2.0+0.5, 2.0-0.5)*weight; // lower-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeS4_1Q, 0.0, -2.0+0.5, 2.0+0.5)*weight; // upper-right [p1]
-
- t += GetSample(gcu_TextureUnit, texCoord, psize, -edgeS4_1Q, 0.0, 2.0-0.5, -2.0-0.5)*weight; // lower-left [p4]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edgeS4_1Q, 2.0-0.5, -2.0+0.5)*weight; // upper-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edgeS4_1Q, 2.0+0.5, -2.0-0.5)*weight; // lower-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeS4_1Q, 0.0, 2.0+0.5, -2.0+0.5)*weight; // upper-right [p1]
-
- t += GetSample(gcu_TextureUnit, texCoord, psize, -edgeS4_1Q, 0.0, 2.0-0.5, 2.0+0.5)*weight; // upper-left [p1]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edgeS4_1Q, 2.0-0.5, 2.0-0.5)*weight; // lower-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edgeS4_1Q, 2.0-0.5, 2.0-0.5)*weight; // upper-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeS4_1Q, 0.0, 2.0-0.5, 2.0-0.5)*weight; // lower-right [p4]
+ t = GetSample(gcu_FboTexUnit, texCoord, psize, -edgeS4_1Q, 0.0, -2.0-0.5, -2.0+0.5)*weight; // upper-left [p1]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edgeS4_1Q, -2.0-0.5, -2.0-0.5)*weight; // lower-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edgeS4_1Q, -2.0-0.5, -2.0-0.5)*weight; // upper-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeS4_1Q, 0.0, -2.0-0.5, -2.0-0.5)*weight; // lower-right [p4]
+
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, -edgeS4_1Q, 0.0, -2.0-0.5, 2.0-0.5)*weight; // lower-left [p4]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edgeS4_1Q, -2.0-0.5, 2.0+0.5)*weight; // upper-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edgeS4_1Q, -2.0+0.5, 2.0-0.5)*weight; // lower-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeS4_1Q, 0.0, -2.0+0.5, 2.0+0.5)*weight; // upper-right [p1]
+
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, -edgeS4_1Q, 0.0, 2.0-0.5, -2.0-0.5)*weight; // lower-left [p4]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edgeS4_1Q, 2.0-0.5, -2.0+0.5)*weight; // upper-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edgeS4_1Q, 2.0+0.5, -2.0-0.5)*weight; // lower-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeS4_1Q, 0.0, 2.0+0.5, -2.0+0.5)*weight; // upper-right [p1]
+
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, -edgeS4_1Q, 0.0, 2.0-0.5, 2.0+0.5)*weight; // upper-left [p1]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edgeS4_1Q, 2.0-0.5, 2.0-0.5)*weight; // lower-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edgeS4_1Q, 2.0-0.5, 2.0-0.5)*weight; // upper-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeS4_1Q, 0.0, 2.0-0.5, 2.0-0.5)*weight; // lower-right [p4]
} else {
- t = GetSample(gcu_TextureUnit, texCoord, psize, -edgeS4_1Q, 0.0, -2.0-0.5, -2.0-0.5)*weight; // lower-left [p4]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edgeS4_1Q, -2.0-0.5, -2.0+0.5)*weight; // upper-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edgeS4_1Q, -2.0+0.5, -2.0-0.5)*weight; // lower-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeS4_1Q, 0.0, -2.0+0.5, -2.0+0.5)*weight; // upper-right [p1]
-
- t += GetSample(gcu_TextureUnit, texCoord, psize, -edgeS4_1Q, 0.0, -2.0-0.5, 2.0+0.5)*weight; // upper-left [p1]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edgeS4_1Q, -2.0-0.5, 2.0-0.5)*weight; // lower-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edgeS4_1Q, -2.0-0.5, 2.0-0.5)*weight; // upper-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeS4_1Q, 0.0, -2.0-0.5, 2.0-0.5)*weight; // lower-right [p4]
-
- t += GetSample(gcu_TextureUnit, texCoord, psize, -edgeS4_1Q, 0.0, 2.0-0.5, -2.0+0.5)*weight; // upper-left [p1]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edgeS4_1Q, 2.0-0.5, -2.0-0.5)*weight; // lower-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edgeS4_1Q, 2.0-0.5, -2.0-0.5)*weight; // upper-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeS4_1Q, 0.0, 2.0-0.5, -2.0-0.5)*weight; // lower-right [p4]
-
- t += GetSample(gcu_TextureUnit, texCoord, psize, -edgeS4_1Q, 0.0, 2.0-0.5, 2.0-0.5)*weight; // lower-left [p4]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edgeS4_1Q, 2.0-0.5, 2.0+0.5)*weight; // upper-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edgeS4_1Q, 2.0+0.5, 2.0-0.5)*weight; // lower-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeS4_1Q, 0.0, 2.0+0.5, 2.0+0.5)*weight; // upper-right [p1]
+ t = GetSample(gcu_FboTexUnit, texCoord, psize, -edgeS4_1Q, 0.0, -2.0-0.5, -2.0-0.5)*weight; // lower-left [p4]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edgeS4_1Q, -2.0-0.5, -2.0+0.5)*weight; // upper-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edgeS4_1Q, -2.0+0.5, -2.0-0.5)*weight; // lower-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeS4_1Q, 0.0, -2.0+0.5, -2.0+0.5)*weight; // upper-right [p1]
+
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, -edgeS4_1Q, 0.0, -2.0-0.5, 2.0+0.5)*weight; // upper-left [p1]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edgeS4_1Q, -2.0-0.5, 2.0-0.5)*weight; // lower-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edgeS4_1Q, -2.0-0.5, 2.0-0.5)*weight; // upper-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeS4_1Q, 0.0, -2.0-0.5, 2.0-0.5)*weight; // lower-right [p4]
+
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, -edgeS4_1Q, 0.0, 2.0-0.5, -2.0+0.5)*weight; // upper-left [p1]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edgeS4_1Q, 2.0-0.5, -2.0-0.5)*weight; // lower-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edgeS4_1Q, 2.0-0.5, -2.0-0.5)*weight; // upper-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeS4_1Q, 0.0, 2.0-0.5, -2.0-0.5)*weight; // lower-right [p4]
+
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, -edgeS4_1Q, 0.0, 2.0-0.5, 2.0-0.5)*weight; // lower-left [p4]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edgeS4_1Q, 2.0-0.5, 2.0+0.5)*weight; // upper-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edgeS4_1Q, 2.0+0.5, 2.0-0.5)*weight; // lower-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeS4_1Q, 0.0, 2.0+0.5, 2.0+0.5)*weight; // upper-right [p1]
}
- }
+
+ #endif
#if 0
if(t.w == 0.0){
@@ -99,6 +105,5 @@
}
#endif
- color = t.rgb;
- alpha = gcu_Alpha * t.a;
+ mgl_FragColor = t;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_fxaa3.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_fxaa3.glsl
index 6a2040577..015dc1b24 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_fxaa3.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_fxaa3.glsl
@@ -1,24 +1,24 @@
// Pass-2: AA on Texture
- // Note: gcv_TexCoord is in center of sample pixels.
+ // Note: gcv_FboTexCoord is in center of sample pixels.
- if( gcu_TextureSize.z < 4.0 ) {
+ if( gcu_FboTexSize.z < 4.0 ) {
// FXAA-2
const float FXAA_REDUCE_MIN = (1.0/128.0);
const float FXAA_REDUCE_MUL = (1.0/8.0);
const float FXAA_SPAN_MAX = 8.0;
- float sampleCount = gcu_TextureSize.z;
+ float sampleCount = gcu_FboTexSize.z;
- vec2 texCoord = gcv_TexCoord.st;
+ vec2 texCoord = gcv_FboTexCoord.st;
const float poff = 1.0;
vec2 psize = 1.0 / texCoord; // pixel size
- vec3 rgbNW = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-poff, -poff))).rgb;
- vec3 rgbSW = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-poff, poff))).rgb;
- vec3 rgbSE = texture2D(gcu_TextureUnit, texCoord + psize*(vec2( poff, poff))).rgb;
- vec3 rgbNE = texture2D(gcu_TextureUnit, texCoord + psize*(vec2( poff, -poff))).rgb;
- vec4 rgbM = texture2D(gcu_TextureUnit, texCoord);
+ vec3 rgbNW = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-poff, -poff))).rgb;
+ vec3 rgbSW = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-poff, poff))).rgb;
+ vec3 rgbSE = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( poff, poff))).rgb;
+ vec3 rgbNE = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( poff, -poff))).rgb;
+ vec4 rgbM = texture2D(gcu_FboTexUnit, texCoord);
const vec3 luma = vec3(0.299, 0.587, 0.114);
float lumaNW = dot(rgbNW, luma);
@@ -37,17 +37,17 @@
max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),dir * rcpDirMin) ) * psize;
- vec3 rgbA = 0.5 * ( texture2D(gcu_TextureUnit, texCoord + dir * (1.0/3.0 - 0.5)).rgb +
- texture2D(gcu_TextureUnit, texCoord + dir * (2.0/3.0 - 0.5)).rgb );
- vec3 rgbB = rgbA * 0.5 + 0.25 * ( texture2D(gcu_TextureUnit, texCoord + (dir * - 0.5)).rgb +
- texture2D(gcu_TextureUnit, texCoord + (dir * 0.5)).rgb );
+ vec3 rgbA = 0.5 * ( texture2D(gcu_FboTexUnit, texCoord + dir * (1.0/3.0 - 0.5)).rgb +
+ texture2D(gcu_FboTexUnit, texCoord + dir * (2.0/3.0 - 0.5)).rgb );
+ vec3 rgbB = rgbA * 0.5 + 0.25 * ( texture2D(gcu_FboTexUnit, texCoord + (dir * - 0.5)).rgb +
+ texture2D(gcu_FboTexUnit, texCoord + (dir * 0.5)).rgb );
float lumaB = dot(rgbB, luma);
if((lumaB < lumaMin) || (lumaB > lumaMax)) {
- color = rgbA;
+ mgl_FragColor.rgb = rgbA;
} else {
- color = rgbB;
+ mgl_FragColor.rgb = rgbB;
}
- alpha = gcu_Alpha * rgbM.a; // mix(0.0, gcu_Alpha, rgbM.a); // t.a one of [ 0.0, 1.0 ]
+ mgl_FragColor.a = gcu_Alpha * rgbM.a; // mix(0.0, gcu_Alpha, rgbM.a); // t.a one of [ 0.0, 1.0 ]
} else {
#include curverenderer01-pass2-vbaa_poles_equalweight.glsl
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_bilin1.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_bilin1.glsl
index 08475317e..d634c1f9b 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_bilin1.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_bilin1.glsl
@@ -1,11 +1,11 @@
// Pass-2: AA on Texture
- // Note: gcv_TexCoord is in center of sample pixels.
+ // Note: gcv_FboTexCoord is in center of sample pixels.
- vec2 texCoord = gcv_TexCoord.st;
+ vec2 texCoord = gcv_FboTexCoord.st;
- float sampleCount = gcu_TextureSize.z;
- vec2 tsize = gcu_TextureSize.xy; // tex size
- vec2 psize = 1.0 / gcu_TextureSize.xy; // pixel size
+ float sampleCount = gcu_FboTexSize.z;
+ vec2 tsize = gcu_FboTexSize.xy; // tex size
+ vec2 psize = 1.0 / gcu_FboTexSize.xy; // pixel size
// mix(x,y,a): x*(1-a) + y*a
//
@@ -31,10 +31,10 @@
vec4 t, p1, p2, p3, p4;
// Layer-1: SampleCount 2 -> 4x
- p1 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, -0.5))); // NW
- p2 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, 0.5))); // SW
- p3 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, 0.5))); // SE
- p4 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, -0.5))); // NE
+ p1 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, -0.5))); // NW
+ p2 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, 0.5))); // SW
+ p3 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, 0.5))); // SE
+ p4 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, -0.5))); // NE
p1 = mix( p1, p4, uv_ratio.x);
p2 = mix( p2, p3, uv_ratio.x);
@@ -44,10 +44,10 @@
if( sampleCount > 2.0 ) {
// Layer-2: SampleCount 4 -> +4x = 8p
- p1 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, -1.5))); // NW
- p2 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, 1.5))); // SW
- p3 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, 1.5))); // SE
- p4 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, -1.5))); // NE
+ p1 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, -1.5))); // NW
+ p2 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, 1.5))); // SW
+ p3 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, 1.5))); // SE
+ p4 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, -1.5))); // NE
p1 = mix( p1, p4, uv_ratio.x);
p2 = mix( p2, p3, uv_ratio.x);
@@ -56,10 +56,10 @@
if( sampleCount > 4.0 ) {
// Layer-3: SampleCount 6 -> +4 = 12p
- p1 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, -2.5))); // NW
- p2 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, 2.5))); // SW
- p3 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, 2.5))); // SE
- p4 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, -2.5))); // NE
+ p1 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, -2.5))); // NW
+ p2 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, 2.5))); // SW
+ p3 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, 2.5))); // SE
+ p4 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, -2.5))); // NE
p1 = mix( p1, p4, uv_ratio.x);
p2 = mix( p2, p3, uv_ratio.x);
@@ -68,10 +68,10 @@
if( sampleCount > 6.0 ) {
// Layer-4: SampleCount 8 -> +4 = 16p
- p1 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, -3.5))); // NW
- p2 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, 3.5))); // SW
- p3 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, 3.5))); // SE
- p4 = texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, -3.5))); // NE
+ p1 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, -3.5))); // NW
+ p2 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, 3.5))); // SW
+ p3 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, 3.5))); // SE
+ p4 = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, -3.5))); // NE
p1 = mix( p1, p4, uv_ratio.x);
p2 = mix( p2, p3, uv_ratio.x);
@@ -88,5 +88,4 @@
}
#endif
- color = t.rgb;
- alpha = gcu_Alpha * t.a;
+ mgl_FragColor = t;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_equalweight.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_equalweight.glsl
deleted file mode 100644
index a03294034..000000000
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_equalweight.glsl
+++ /dev/null
@@ -1,50 +0,0 @@
-
- // Pass-2: AA on Texture
- // Note: gcv_TexCoord is in center of sample pixels.
-
- float sampleCount = gcu_TextureSize.z;
- vec2 psize = 1.0 / gcu_TextureSize.xy; // pixel size
-
- // Just poles (NW, SW, ..)
- float sample_weight = 1 / ( 2 * sampleCount );
-
- vec2 texCoord = gcv_TexCoord.st;
-
- vec4 t;
-
- // SampleCount 2 -> 4x
- t = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, -0.5)))*sample_weight; // NW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, 0.5)))*sample_weight; // SW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, 0.5)))*sample_weight; // SE
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, -0.5)))*sample_weight; // NE
- if( sampleCount > 2.0 ) {
- // SampleCount 4 -> +4 = 8p
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, -1.5)))*sample_weight; // NW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, 1.5)))*sample_weight; // SW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, 1.5)))*sample_weight; // SE
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, -1.5)))*sample_weight; // NE
-
- if( sampleCount > 4.0 ) {
- // SampleCount 6 -> +4 = 12p
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, -2.5)))*sample_weight; // NW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, 2.5)))*sample_weight; // SW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, 2.5)))*sample_weight; // SE
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, -2.5)))*sample_weight; // NE
- if( sampleCount > 6.0 ) {
- // SampleCount 8 -> +4 = 16p
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, -3.5)))*sample_weight; // NW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, 3.5)))*sample_weight; // SW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, 3.5)))*sample_weight; // SE
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, -3.5)))*sample_weight; // NE
- }
- }
- }
- #if 0
- if(t.w == 0.0){
- discard; // discard freezes NV tegra2 compiler
- }
- #endif
-
- color = t.rgb;
- alpha = gcu_Alpha * t.a;
-
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_propweight1.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_propweight1.glsl
deleted file mode 100644
index d63dda7cc..000000000
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_poles_propweight1.glsl
+++ /dev/null
@@ -1,66 +0,0 @@
- // Pass-2: AA on Texture
- // Note: gcv_TexCoord is in center of sample pixels.
-
- float sampleCount = gcu_TextureSize.z;
- vec2 psize = 1.0 / gcu_TextureSize.xy; // pixel size
-
- // Just poles (NW, SW, ..)
- float pixelCount = 2 * sampleCount;
-
- // sampleCount [0, 1, 3, 5, 7] are undefined!
- float layerCount = ( sampleCount / 2.0 );
-
- // sum of all integer [layerCount .. 1] -> Gauss
- float denom = ( layerCount / 2.0 ) * ( layerCount + 1.0 );
-
- vec2 texCoord = gcv_TexCoord.st;
-
- vec4 t;
-
- // Layer-1: SampleCount 2 -> 4x
- t = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, -0.5))); // NW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-0.5, 0.5))); // SW
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, 0.5))); // SE
- t += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 0.5, -0.5))); // NE
-
- t *= (layerCount - 0.0) / ( denom * 4.0 ); // weight layer 1
-
- if( sampleCount > 2.0 ) {
- // Layer-2: SampleCount 4 -> +4x = 8p
- vec4 tn = vec4(0);
- tn = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, -1.5))); // NW
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-1.5, 1.5))); // SW
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, 1.5))); // SE
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 1.5, -1.5))); // NE
-
- t += tn * (layerCount - 1) / ( denom * 4.0 ); // weight layer 2
-
- if( sampleCount > 4.0 ) {
- // Layer-3: SampleCount 6 -> +4 = 12p
- tn = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, -2.5))); // NW
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-2.5, 2.5))); // SW
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, 2.5))); // SE
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 2.5, -2.5))); // NE
-
- t += tn * (layerCount - 2) / ( denom * 4.0 ); // weight layer 3
-
- if( sampleCount > 6.0 ) {
- // Layer-4: SampleCount 8 -> +4 = 16p
- tn = texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, -3.5))); // NW
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2(-3.5, 3.5))); // SW
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, 3.5))); // SE
- tn += texture2D(gcu_TextureUnit, texCoord + psize*(vec2( 3.5, -3.5))); // NE
-
- t += tn * (layerCount - 3) / ( denom * 4.0 ); // weight layer 4
- }
- }
- }
-
- #if 0
- if(t.w == 0.0){
- discard; // discard freezes NV tegra2 compiler
- }
- #endif
-
- color = t.rgb;
- alpha = gcu_Alpha * t.a;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_polesequal.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_polesequal.glsl
new file mode 100644
index 000000000..0e8b6f161
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_polesequal.glsl
@@ -0,0 +1,49 @@
+
+ // Pass-2: AA on Texture
+ // Note: gcv_FboTexCoord is in center of sample pixels.
+
+ float sampleCount = gcu_FboTexSize.z;
+ vec2 psize = 1.0 / gcu_FboTexSize.xy; // pixel size
+
+ // Just poles (NW, SW, ..)
+ float sample_weight = 1 / ( 2 * sampleCount );
+
+ vec2 texCoord = gcv_FboTexCoord.st;
+
+ vec4 t;
+
+ // SampleCount 2 -> 4x
+ t = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, -0.5)))*sample_weight; // NW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, 0.5)))*sample_weight; // SW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, 0.5)))*sample_weight; // SE
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, -0.5)))*sample_weight; // NE
+ if( sampleCount > 2.0 ) {
+ // SampleCount 4 -> +4 = 8p
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, -1.5)))*sample_weight; // NW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, 1.5)))*sample_weight; // SW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, 1.5)))*sample_weight; // SE
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, -1.5)))*sample_weight; // NE
+
+ if( sampleCount > 4.0 ) {
+ // SampleCount 6 -> +4 = 12p
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, -2.5)))*sample_weight; // NW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, 2.5)))*sample_weight; // SW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, 2.5)))*sample_weight; // SE
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, -2.5)))*sample_weight; // NE
+ if( sampleCount > 6.0 ) {
+ // SampleCount 8 -> +4 = 16p
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, -3.5)))*sample_weight; // NW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, 3.5)))*sample_weight; // SW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, 3.5)))*sample_weight; // SE
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, -3.5)))*sample_weight; // NE
+ }
+ }
+ }
+ #if 0
+ if(t.w == 0.0){
+ discard; // discard freezes NV tegra2 compiler
+ }
+ #endif
+
+ mgl_FragColor = t;
+
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_polesprop01.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_polesprop01.glsl
new file mode 100644
index 000000000..6c263b9bd
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_polesprop01.glsl
@@ -0,0 +1,65 @@
+ // Pass-2: AA on Texture
+ // Note: gcv_FboTexCoord is in center of sample pixels.
+
+ float sampleCount = gcu_FboTexSize.z;
+ vec2 psize = 1.0 / gcu_FboTexSize.xy; // pixel size
+
+ // Just poles (NW, SW, ..)
+ float pixelCount = 2 * sampleCount;
+
+ // sampleCount [0, 1, 3, 5, 7] are undefined!
+ float layerCount = ( sampleCount / 2.0 );
+
+ // sum of all integer [layerCount .. 1] -> Gauss
+ float denom = ( layerCount / 2.0 ) * ( layerCount + 1.0 );
+
+ vec2 texCoord = gcv_FboTexCoord.st;
+
+ vec4 t;
+
+ // Layer-1: SampleCount 2 -> 4x
+ t = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, -0.5))); // NW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-0.5, 0.5))); // SW
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, 0.5))); // SE
+ t += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 0.5, -0.5))); // NE
+
+ t *= (layerCount - 0.0) / ( denom * 4.0 ); // weight layer 1
+
+ if( sampleCount > 2.0 ) {
+ // Layer-2: SampleCount 4 -> +4x = 8p
+ vec4 tn = vec4(0);
+ tn = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, -1.5))); // NW
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-1.5, 1.5))); // SW
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, 1.5))); // SE
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 1.5, -1.5))); // NE
+
+ t += tn * (layerCount - 1) / ( denom * 4.0 ); // weight layer 2
+
+ if( sampleCount > 4.0 ) {
+ // Layer-3: SampleCount 6 -> +4 = 12p
+ tn = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, -2.5))); // NW
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-2.5, 2.5))); // SW
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, 2.5))); // SE
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 2.5, -2.5))); // NE
+
+ t += tn * (layerCount - 2) / ( denom * 4.0 ); // weight layer 3
+
+ if( sampleCount > 6.0 ) {
+ // Layer-4: SampleCount 8 -> +4 = 16p
+ tn = texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, -3.5))); // NW
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2(-3.5, 3.5))); // SW
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, 3.5))); // SE
+ tn += texture2D(gcu_FboTexUnit, texCoord + psize*(vec2( 3.5, -3.5))); // NE
+
+ t += tn * (layerCount - 3) / ( denom * 4.0 ); // weight layer 4
+ }
+ }
+ }
+
+ #if 0
+ if(t.w == 0.0){
+ discard; // discard freezes NV tegra2 compiler
+ }
+ #endif
+
+ mgl_FragColor = t;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_quincunx.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_quincunx.glsl
index 545f1cc82..07a9adf46 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_quincunx.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_quincunx.glsl
@@ -1,22 +1,22 @@
// Pass-2: AA on Texture
- // Note: gcv_TexCoord is in center of sample pixels, origin is bottom left!
+ // Note: gcv_FboTexCoord is in center of sample pixels, origin is bottom left!
- float sampleCount = gcu_TextureSize.z;
- vec2 psize = 1.0 / gcu_TextureSize.xy; // pixel size
+ float sampleCount = gcu_FboTexSize.z;
+ vec2 psize = 1.0 / gcu_FboTexSize.xy; // pixel size
// Just poles (NW, SW, ..)
float edgeH = sampleCount / 2.0;
- vec2 texCoord = gcv_TexCoord.st;
+ vec2 texCoord = gcv_FboTexCoord.st;
vec4 t;
- t = GetSample(gcu_TextureUnit, texCoord, psize, 0.0, 0.0, 0.0, 0.0)*0.5; // w1 - center
- t += GetSample(gcu_TextureUnit, texCoord, psize, -edgeH, -edgeH, 0.0, 0.0)*0.125; // w2 - sharing
- t += GetSample(gcu_TextureUnit, texCoord, psize, -edgeH, edgeH, 0.0, 0.0)*0.125; // w3 - edges
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeH, -edgeH, 0.0, 0.0)*0.125; // w4 - w/ all pixels
- t += GetSample(gcu_TextureUnit, texCoord, psize, edgeH, edgeH, 0.0, 0.0)*0.125; // w5
+ t = GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, 0.0, 0.0, 0.0)*0.5; // w1 - center
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, -edgeH, -edgeH, 0.0, 0.0)*0.125; // w2 - sharing
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, -edgeH, edgeH, 0.0, 0.0)*0.125; // w3 - edges
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeH, -edgeH, 0.0, 0.0)*0.125; // w4 - w/ all pixels
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edgeH, edgeH, 0.0, 0.0)*0.125; // w5
#if 0
if(t.w == 0.0){
@@ -24,6 +24,5 @@
}
#endif
- color = t.rgb;
- alpha = gcu_Alpha * t.a;
+ mgl_FragColor = t;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_rgss.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_rgss.glsl
index 804ab6013..27a5684a6 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_rgss.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2-vbaa_rgss.glsl
@@ -1,19 +1,19 @@
// Pass-2: AA on Texture
- // Note: gcv_TexCoord is in center of sample pixels, origin is bottom left!
+ // Note: gcv_FboTexCoord is in center of sample pixels, origin is bottom left!
- float sampleCount = gcu_TextureSize.z;
- vec2 psize = 1.0 / gcu_TextureSize.xy; // pixel size
+ float sampleCount = gcu_FboTexSize.z;
+ vec2 psize = 1.0 / gcu_FboTexSize.xy; // pixel size
- vec2 texCoord = gcv_TexCoord.st;
+ vec2 texCoord = gcv_FboTexCoord.st;
float edge1Q = ( sampleCount / 2.0 ) - 1.0;
vec4 t;
// SWIPE LEFT -> RIGHT
- t = GetSample(gcu_TextureUnit, texCoord, psize, -edge1Q, 0.0, -0.5, 0.5)*0.25; // upper-left [p1]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, -edge1Q, -0.5, -0.5)*0.25; // lower-left [p3]
- t += GetSample(gcu_TextureUnit, texCoord, psize, 0.0, edge1Q, 0.5, 0.5)*0.25; // upper-right [p2]
- t += GetSample(gcu_TextureUnit, texCoord, psize, edge1Q, 0.0, 0.5, -0.5)*0.25; // lower-right [p4]
+ t = GetSample(gcu_FboTexUnit, texCoord, psize, -edge1Q, 0.0, -0.5, 0.5)*0.25; // upper-left [p1]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, -edge1Q, -0.5, -0.5)*0.25; // lower-left [p3]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, 0.0, edge1Q, 0.5, 0.5)*0.25; // upper-right [p2]
+ t += GetSample(gcu_FboTexUnit, texCoord, psize, edge1Q, 0.0, 0.5, -0.5)*0.25; // lower-right [p4]
#if 0
if(t.w == 0.0){
@@ -21,6 +21,5 @@
}
#endif
- color = t.rgb;
- alpha = gcu_Alpha * t.a;
+ mgl_FragColor = t;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2.vp b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2.vp
new file mode 100644
index 000000000..64857c9ce
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass2.vp
@@ -0,0 +1,17 @@
+//Copyright 2010 JogAmp Community. All rights reserved.
+
+#if __VERSION__ >= 130
+ #define attribute in
+ #define varying out
+#endif
+
+#include uniforms.glsl
+#include attributes.glsl
+#include varyings.glsl
+
+void main(void)
+{
+ // gl_Position = gcu_PMVMatrix01[0] * gcu_PMVMatrix01[1] * vec4(gca_FboVertices, 1);
+ gl_Position = gcu_PMVMatrix01[0] * gcu_PMVMatrix01[1] * gca_FboVertices;
+ gcv_FboTexCoord = gca_FboTexCoords;
+}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-segment-head.fp b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-segment-head.fp
new file mode 100644
index 000000000..74a1dea4e
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-segment-head.fp
@@ -0,0 +1,22 @@
+//Copyright 2010 JogAmp Community. All rights reserved.
+
+//
+// 2-pass shader w/o weight
+//
+
+#if __VERSION__ >= 130
+ #define varying in
+ out vec4 mgl_FragColor;
+ #define texture2D texture
+#else
+ #define mgl_FragColor gl_FragColor
+#endif
+
+#include uniforms.glsl
+#include varyings.glsl
+
+#define GetSample(texUnit, texCoord, psize, cx, cy, offX, offY) texture2D(texUnit, texCoord + psize * vec2(cx+offX, cy+offY))
+
+void main (void)
+{
+
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-single.vp b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-single.vp
new file mode 100644
index 000000000..7598c23f8
--- /dev/null
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-single.vp
@@ -0,0 +1,30 @@
+//Copyright 2010 JogAmp Community. All rights reserved.
+
+#if __VERSION__ >= 130
+ #define attribute in
+ #define varying out
+#endif
+
+#include uniforms.glsl
+#include attributes.glsl
+#include varyings.glsl
+
+void main(void)
+{
+ // gl_Position = gcu_PMVMatrix01[0] * gcu_PMVMatrix01[1] * vec4(gca_Vertices, 1);
+ gl_Position = gcu_PMVMatrix01[0] * gcu_PMVMatrix01[1] * gca_Vertices;
+#if 1
+ gcv_CurveParam = gca_CurveParams;
+#else
+ if( gcv_CurveParams.x <= -10.0 ) {
+ // vec4 tc = gcu_PMVMatrix01[0] * gcu_PMVMatrix01[1] * vec4(gca_CurveParams.xy, gca_Vertices.z, 1);
+ // gcv_CurveParams = vec3(tc.xy, gca_CurveParams.z);
+ gcv_CurveParam = gca_CurveParams;
+ } else {
+ gcv_CurveParam = gca_CurveParams;
+ }
+#endif
+#ifdef USE_COLOR_CHANNEL
+ gcv_Color = gca_Colors;
+#endif
+}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01.vp b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01.vp
deleted file mode 100644
index 5ab82ad40..000000000
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01.vp
+++ /dev/null
@@ -1,23 +0,0 @@
-//Copyright 2010 JogAmp Community. All rights reserved.
-
-#if __VERSION__ >= 130
- #define attribute in
- #define varying out
-#endif
-
-#include uniforms.glsl
-#include attributes.glsl
-#include varyings.glsl
-
-void main(void)
-{
- // gl_Position = gcu_PMVMatrix[0] * gcu_PMVMatrix[1] * vec4(gca_Vertices, 1);
- gl_Position = gcu_PMVMatrix[0] * gcu_PMVMatrix[1] * gca_Vertices;
- if( gcv_TexCoord.x <= -10.0 ) {
- // vec4 tc = gcu_PMVMatrix[0] * gcu_PMVMatrix[1] * vec4(gca_TexCoords.xy, gca_Vertices.z, 1);
- // gcv_TexCoord = vec3(tc.xy, gca_TexCoords.z);
- gcv_TexCoord = gca_TexCoords;
- } else {
- gcv_TexCoord = gca_TexCoords;
- }
-}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/uniforms.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/uniforms.glsl
index 92e78d5de..848c26819 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/uniforms.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/uniforms.glsl
@@ -2,14 +2,17 @@
#ifndef uniforms_glsl
#define uniforms_glsl
-uniform mat4 gcu_PMVMatrix[3]; // P, Mv, and Mvi
-uniform vec3 gcu_ColorStatic;
-uniform float gcu_Alpha;
+uniform mat4 gcu_PMVMatrix01[3]; // P, Mv, and Mvi
+uniform vec4 gcu_ColorStatic;
uniform float gcu_Weight;
-uniform sampler2D gcu_TextureUnit;
-/** 3rd component: 0: pass-1, >0: pass-2, sampleCount */
-uniform vec3 gcu_TextureSize;
+uniform mat4 gcu_PMVMatrix02[3]; // P, Mv, and Mvi
+uniform sampler2D gcu_FboTexUnit;
+
+/**
+ * .x .y : texture-, fbo- or screen-size
+ */
+uniform vec2 gcu_FboTexSize;
// const int MAX_TEXTURE_UNITS = 8; // <= gl_MaxTextureImageUnits
// const int MAX_LIGHTS = 8;
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/shader/varyings.glsl b/src/jogl/classes/jogamp/graph/curve/opengl/shader/varyings.glsl
index 17f118bc8..2054c9c21 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/varyings.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/varyings.glsl
@@ -2,8 +2,13 @@
#ifndef varyings_glsl
#define varyings_glsl
-//varying vec4 gcv_FrontColor;
-varying vec3 gcv_TexCoord;
+varying vec3 gcv_CurveParam;
+
+varying vec2 gcv_FboTexCoord;
+
+#ifdef USE_COLOR_CHANNEL
+ varying vec4 gcv_Color;
+#endif
#endif // varyings_glsl
diff --git a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java
index ad01c24fa..d2cfa42a1 100644
--- a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java
+++ b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java
@@ -54,7 +54,8 @@ public class CDTriangulator2D implements Triangulator {
private final ArrayList<Loop> loops = new ArrayList<Loop>();
- private int maxTriID = 0;
+ private int addedVerticeCount;
+ private int maxTriID;
/** Constructor for a new Delaunay triangulator
@@ -66,10 +67,17 @@ public class CDTriangulator2D implements Triangulator {
@Override
public final void reset() {
maxTriID = 0;
+ addedVerticeCount = 0;
loops.clear();
}
@Override
+ public final int getAddedVerticeCount() {
+ return addedVerticeCount;
+ }
+
+
+ @Override
public final void addCurve(final List<Triangle> sink, final Outline polyline, final float sharpness) {
Loop loop = null;
@@ -164,6 +172,7 @@ public class CDTriangulator2D implements Triangulator {
final Vertex v0 = gv0.getPoint().clone();
final Vertex v2 = gv2.getPoint().clone();
final Vertex v1 = gv1.getPoint().clone();
+ addedVerticeCount += 3;
final boolean[] boundaryVertices = { true, true, true };
gv0.setBoundaryContained(true);
diff --git a/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java b/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java
index a75c5e02c..cd48cd8d6 100644
--- a/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java
+++ b/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java
@@ -34,11 +34,14 @@ import jogamp.graph.font.typecast.ot.table.CmapIndexEntry;
import jogamp.graph.font.typecast.ot.table.CmapTable;
import jogamp.graph.font.typecast.ot.table.HdmxTable;
import jogamp.graph.font.typecast.ot.table.ID;
+import jogamp.graph.geom.plane.AffineTransform;
import com.jogamp.common.util.IntObjectHashMap;
import com.jogamp.graph.curve.OutlineShape;
+import com.jogamp.graph.curve.Region;
import com.jogamp.graph.font.Font;
import com.jogamp.graph.font.FontFactory;
+import com.jogamp.graph.font.Font.Glyph;
import com.jogamp.graph.geom.SVertex;
import com.jogamp.graph.geom.Vertex;
import com.jogamp.opengl.math.geom.AABBox;
@@ -203,6 +206,8 @@ class TypecastFont implements Font {
if(DEBUG) {
System.err.println("New glyph: " + (int)symbol + " ( " + symbol +" ) -> " + code + ", contours " + glyph.getPointCount() + ": " + shape);
}
+ glyph.clearPointData();
+
final HdmxTable hdmx = font.getHdmxTable();
if (null!= result && null != hdmx) {
/*if(DEBUG) {
@@ -238,7 +243,7 @@ class TypecastFont implements Font {
}
@Override
- public float getStringWidth(CharSequence string, float pixelSize) {
+ public float getMetricWidth(CharSequence string, float pixelSize) {
float width = 0;
final int len = string.length();
for (int i=0; i< len; i++) {
@@ -254,7 +259,7 @@ class TypecastFont implements Font {
}
@Override
- public float getStringHeight(CharSequence string, float pixelSize) {
+ public float getMetricHeight(CharSequence string, float pixelSize) {
int height = 0;
for (int i=0; i<string.length(); i++) {
@@ -269,16 +274,16 @@ class TypecastFont implements Font {
}
@Override
- public AABBox getStringBounds(CharSequence string, float pixelSize) {
+ public AABBox getMetricBounds(CharSequence string, float pixelSize) {
if (string == null) {
return new AABBox();
}
+ final int charCount = string.length();
final float lineHeight = getLineHeight(pixelSize);
-
float totalHeight = 0;
float totalWidth = 0;
float curLineWidth = 0;
- for (int i=0; i<string.length(); i++) {
+ for (int i=0; i<charCount; i++) {
char character = string.charAt(i);
if (character == '\n') {
totalWidth = Math.max(curLineWidth, totalWidth);
@@ -295,6 +300,51 @@ class TypecastFont implements Font {
}
return new AABBox(0, 0, 0, totalWidth, totalHeight,0);
}
+ @Override
+ public AABBox getPointsBounds(final AffineTransform transform, CharSequence string, float pixelSize) {
+ if (string == null) {
+ return new AABBox();
+ }
+ final int charCount = string.length();
+ final float lineHeight = getLineHeight(pixelSize);
+ final float scale = getMetrics().getScale(pixelSize);
+ final AffineTransform t = null != transform ? new AffineTransform(transform) : new AffineTransform();
+ final AABBox tbox = new AABBox();
+ final AABBox res = new AABBox();
+
+ float y = 0;
+ float advanceTotal = 0;
+
+ for(int i=0; i< charCount; i++) {
+ final char character = string.charAt(i);
+ if( '\n' == character ) {
+ y -= lineHeight;
+ advanceTotal = 0;
+ } else if (character == ' ') {
+ advanceTotal += getAdvanceWidth(Glyph.ID_SPACE, pixelSize);
+ } else {
+ // reset transform
+ if( null != transform ) {
+ t.setTransform(transform);
+ } else {
+ t.setToIdentity();
+ }
+ t.translate(advanceTotal, y);
+ t.scale(scale, scale);
+ tbox.reset();
+
+ final Font.Glyph glyph = getGlyph(character);
+ res.resize(t.transform(glyph.getBBox(), tbox));
+
+ final OutlineShape glyphShape = glyph.getShape();
+ if( null == glyphShape ) {
+ continue;
+ }
+ advanceTotal += glyph.getAdvance(pixelSize, true);
+ }
+ }
+ return res;
+ }
@Override
final public int getNumGlyphs() {
diff --git a/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java b/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java
index c540f7ddb..b6e9925d4 100644
--- a/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java
+++ b/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java
@@ -84,7 +84,7 @@ public class TypecastRenderer {
final OutlineShape shape = new OutlineShape(vertexFactory);
buildShapeImpl(shape, symbol, glyph, vertexFactory);
- shape.closeLastOutline(false);
+ shape.setIsQuadraticNurbs();
return shape;
}
diff --git a/src/jogl/classes/jogamp/graph/font/typecast/ot/OTGlyph.java b/src/jogl/classes/jogamp/graph/font/typecast/ot/OTGlyph.java
index e0d652bd4..270507fec 100644
--- a/src/jogl/classes/jogamp/graph/font/typecast/ot/OTGlyph.java
+++ b/src/jogl/classes/jogamp/graph/font/typecast/ot/OTGlyph.java
@@ -102,6 +102,10 @@ public class OTGlyph {
}
}
+ public void clearPointData() {
+ _points = null;
+ }
+
public AABBox getBBox() {
return _bbox;
}
@@ -119,13 +123,7 @@ public class OTGlyph {
}
public int getPointCount() {
- return _points.length;
- }
-
- /**
- * Resets the glyph to the TrueType table settings
- */
- public void reset() {
+ return null != _points ? _points.length : 0;
}
/**
diff --git a/src/jogl/classes/jogamp/graph/geom/plane/AffineTransform.java b/src/jogl/classes/jogamp/graph/geom/plane/AffineTransform.java
index c6efae883..04b9d3bcd 100644
--- a/src/jogl/classes/jogamp/graph/geom/plane/AffineTransform.java
+++ b/src/jogl/classes/jogamp/graph/geom/plane/AffineTransform.java
@@ -319,24 +319,24 @@ public class AffineTransform implements Cloneable {
return t;
}
- public final void translate(float mx, float my) {
- concatenate(AffineTransform.getTranslateInstance(mx, my));
+ public final AffineTransform translate(float mx, float my) {
+ return concatenate(AffineTransform.getTranslateInstance(mx, my));
}
- public final void scale(float scx, float scy) {
- concatenate(AffineTransform.getScaleInstance(scx, scy));
+ public final AffineTransform scale(float scx, float scy) {
+ return concatenate(AffineTransform.getScaleInstance(scx, scy));
}
- public final void shear(float shx, float shy) {
- concatenate(AffineTransform.getShearInstance(shx, shy));
+ public final AffineTransform shear(float shx, float shy) {
+ return concatenate(AffineTransform.getShearInstance(shx, shy));
}
- public final void rotate(float angle) {
- concatenate(AffineTransform.getRotateInstance(angle));
+ public final AffineTransform rotate(float angle) {
+ return concatenate(AffineTransform.getRotateInstance(angle));
}
- public final void rotate(float angle, float px, float py) {
- concatenate(AffineTransform.getRotateInstance(angle, px, py));
+ public final AffineTransform rotate(float angle, float px, float py) {
+ return concatenate(AffineTransform.getRotateInstance(angle, px, py));
}
/**
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/TestRegionRendererNEWT01.java b/src/test/com/jogamp/opengl/test/junit/graph/TestRegionRendererNEWT01.java
index 55a043a14..fd1486995 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/TestRegionRendererNEWT01.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/TestRegionRendererNEWT01.java
@@ -50,7 +50,6 @@ import com.jogamp.opengl.test.junit.graph.demos.GPURegionGLListener01;
import com.jogamp.opengl.test.junit.graph.demos.GPURegionGLListener02;
import com.jogamp.opengl.test.junit.graph.demos.GPURendererListenerBase01;
import com.jogamp.opengl.test.junit.util.UITestCase;
-import com.jogamp.opengl.util.glsl.ShaderState;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@@ -88,7 +87,7 @@ public class TestRegionRendererNEWT01 extends UITestCase {
caps.setAlphaBits(4);
GLWindow window = createWindow("shape-vbaa0-msaa0", caps, 800, 400);
- RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ RenderState rs = RenderState.createRenderState(SVertex.factory());
GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, 0, 0, false, false);
demo01Listener.attachInputListenerTo(window);
@@ -122,9 +121,9 @@ public class TestRegionRendererNEWT01 extends UITestCase {
caps.setAlphaBits(4);
GLWindow window = createWindow("shape-vbaa0-msaa0", caps, 800, 400);
- RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ RenderState rs = RenderState.createRenderState(SVertex.factory());
- GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, Region.VARIABLE_CURVE_WEIGHT_BIT, 0, false, false);
+ GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, Region.VARWEIGHT_RENDERING_BIT, 0, false, false);
demo01Listener.attachInputListenerTo(window);
window.addGLEventListener(demo01Listener);
@@ -153,7 +152,7 @@ public class TestRegionRendererNEWT01 extends UITestCase {
caps.setNumSamples(4);
GLWindow window = createWindow("shape-vbaa0-msaa1", caps, 800, 400);
- RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ RenderState rs = RenderState.createRenderState(SVertex.factory());
GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, 0, 0, false, false);
demo01Listener.attachInputListenerTo(window);
@@ -189,9 +188,9 @@ public class TestRegionRendererNEWT01 extends UITestCase {
caps.setNumSamples(4);
GLWindow window = createWindow("shape-vbaa0-msaa1", caps, 800, 400);
- RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ RenderState rs = RenderState.createRenderState(SVertex.factory());
- GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, Region.VARIABLE_CURVE_WEIGHT_BIT, 0, false, false);
+ GPURegionGLListener01 demo01Listener = new GPURegionGLListener01 (rs, Region.VARWEIGHT_RENDERING_BIT, 0, false, false);
demo01Listener.attachInputListenerTo(window);
window.addGLEventListener(demo01Listener);
@@ -224,7 +223,7 @@ public class TestRegionRendererNEWT01 extends UITestCase {
caps.setAlphaBits(4);
GLWindow window = createWindow("shape-vbaa1-msaa0", caps, 800,400);
- RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ RenderState rs = RenderState.createRenderState(SVertex.factory());
GPURegionGLListener02 demo02Listener = new GPURegionGLListener02 (rs, Region.VBAA_RENDERING_BIT, 4, false, false);
demo02Listener.attachInputListenerTo(window);
window.addGLEventListener(demo02Listener);
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 d00e1c5ee..b5d52739e 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT00.java
@@ -60,7 +60,6 @@ import com.jogamp.opengl.test.junit.util.MiscUtils;
import com.jogamp.opengl.test.junit.util.UITestCase;
import com.jogamp.opengl.util.Animator;
import com.jogamp.opengl.util.GLReadBufferUtil;
-import com.jogamp.opengl.util.glsl.ShaderState;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@@ -210,7 +209,7 @@ public class TestTextRendererNEWT00 extends UITestCase {
UITestCase.waitForKey("Start");
}
- final RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ final RenderState rs = RenderState.createRenderState(SVertex.factory());
final int rendererMode, sampleCount;
if( graphVBAASamples > 0 ) {
rendererMode = Region.VBAA_RENDERING_BIT;
@@ -381,9 +380,11 @@ public class TestTextRendererNEWT00 extends UITestCase {
lfps, tfps, gl.getSwapInterval(), (t1-t0)/1000.0, fontSizeAnim,
drawable.getChosenGLCapabilities().getNumSamples(), modeS, vbaaSampleCount[0]);
- if( false ) {
+ if( true ) {
// renderString(drawable, font, pixelSize, "I - / H P 7 0", 0, 0, 0, 0, -1000f, true);
- renderString(drawable, font, pixelSize, "A M > } ] ", 0, 0, 0, 0, -1000f, true);
+ // renderString(drawable, font, pixelSize, "A M > } ] ", 0, 0, 0, 0, -1000f, true);
+ renderString(drawable, font, pixelSize, "M", 0, 0, 0, 0, -1000f, true);
+ // renderString(drawable, font, pixelSize, "0 6 9 a b O Q A M > } ] ", 0, 0, 0, 0, -1000f, true);
// renderString(drawable, font, pixelSize, "012345678901234567890123456789", 0, 0, 0, -1000, true);
// renderString(drawable, font, pixelSize, textX2, 0, 0, 0, 0, -1000f, true);
// renderString(drawable, font, pixelSize, text1, 0, 0, 0, -1000f, regionFPS); // no-cache
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT01.java b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT01.java
index 8121fc03f..c1c1dc18e 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT01.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT01.java
@@ -51,7 +51,6 @@ import com.jogamp.graph.geom.SVertex;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.test.junit.graph.demos.GPUTextRendererListenerBase01;
import com.jogamp.opengl.test.junit.util.UITestCase;
-import com.jogamp.opengl.util.glsl.ShaderState;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@@ -120,7 +119,7 @@ public class TestTextRendererNEWT01 extends UITestCase {
window.display();
System.err.println("Chosen: "+window.getChosenGLCapabilities());
- RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ RenderState rs = RenderState.createRenderState(SVertex.factory());
TextGLListener textGLListener = new TextGLListener(rs, Region.VBAA_RENDERING_BIT, DEBUG, TRACE);
textGLListener.attachInputListenerTo(window);
window.addGLEventListener(textGLListener);
@@ -169,7 +168,7 @@ public class TestTextRendererNEWT01 extends UITestCase {
window.display();
System.err.println("Chosen: "+window.getChosenGLCapabilities());
- RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ RenderState rs = RenderState.createRenderState(SVertex.factory());
TextGLListener textGLListener = new TextGLListener(rs, 0, DEBUG, TRACE);
textGLListener.attachInputListenerTo(window);
window.addGLEventListener(textGLListener);
@@ -227,10 +226,8 @@ public class TestTextRendererNEWT01 extends UITestCase {
gl.setSwapInterval(1);
gl.glEnable(GL.GL_DEPTH_TEST);
- final RegionRenderer renderer = getRenderer();
-
- renderer.setAlpha(gl, 1.0f);
- renderer.setColorStatic(gl, 0.1f, 0.1f, 0.1f);
+ final RenderState rs = getRenderer().getRenderState();
+ rs.setColorStatic(0.1f, 0.1f, 0.1f, 1.0f);
}
public void display(GLAutoDrawable drawable) {
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 a23a50db7..ebb897484 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/TestTextRendererNEWT10.java
@@ -52,7 +52,6 @@ import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.test.junit.util.NEWTGLContext;
import com.jogamp.opengl.test.junit.util.UITestCase;
import com.jogamp.opengl.util.PMVMatrix;
-import com.jogamp.opengl.util.glsl.ShaderState;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@@ -140,21 +139,20 @@ public class TestTextRendererNEWT10 extends UITestCase {
System.err.println("Chosen: "+winctx.window.getChosenCapabilities());
- final RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ final RenderState rs = RenderState.createRenderState(SVertex.factory());
final RegionRenderer renderer = RegionRenderer.create(rs, 0, RegionRenderer.defaultBlendEnable, RegionRenderer.defaultBlendDisable);
final TextRegionUtil textRenderUtil = new TextRegionUtil(renderer);
// init
gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
renderer.init(gl);
- renderer.setAlpha(gl, 1.0f);
- renderer.setColorStatic(gl, 0.1f, 0.1f, 0.1f);
+ rs.setColorStatic(0.1f, 0.1f, 0.1f, 1.0f);
// reshape
gl.glViewport(0, 0, drawable.getWidth(), drawable.getHeight());
// renderer.reshapePerspective(gl, 45.0f, drawable.getWidth(), drawable.getHeight(), 0.1f, 1000.0f);
- renderer.reshapeOrtho(gl, drawable.getWidth(), drawable.getHeight(), 0.1f, 1000.0f);
+ renderer.reshapeOrtho(drawable.getWidth(), drawable.getHeight(), 0.1f, 1000.0f);
// display
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
@@ -189,16 +187,15 @@ public class TestTextRendererNEWT10 extends UITestCase {
if(0>row) {
row = lastRow + 1;
}
- AABBox textBox = font.getStringBounds(text, fontSize);
+ AABBox textBox = font.getMetricBounds(text, fontSize);
dx += font.getAdvanceWidth('X', fontSize) * column;
dy -= (int)textBox.getHeight() * ( row + 1 );
- final PMVMatrix pmv = textRenderUtil.renderer.getMatrix();
+ final PMVMatrix pmv = textRenderUtil.renderer.getMatrixMutable();
pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmv.glLoadIdentity();
pmv.glTranslatef(dx, dy, z0);
- textRenderUtil.renderer.updateMatrix(gl);
- textRenderUtil.drawString3D(gl, font, fontSize, text, texSize);
+ textRenderUtil.drawString3D(gl, font, fontSize, text, null, texSize);
lastRow = row;
}
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/TextRendererGLELBase.java b/src/test/com/jogamp/opengl/test/junit/graph/TextRendererGLELBase.java
index 4b89a85fb..fb4d0baf4 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/TextRendererGLELBase.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/TextRendererGLELBase.java
@@ -44,7 +44,6 @@ import com.jogamp.graph.font.FontSet;
import com.jogamp.graph.geom.SVertex;
import com.jogamp.newt.Window;
import com.jogamp.opengl.util.PMVMatrix;
-import com.jogamp.opengl.util.glsl.ShaderState;
public abstract class TextRendererGLELBase implements GLEventListener {
public final int usrRenderModes;
@@ -134,16 +133,14 @@ public abstract class TextRendererGLELBase implements GLEventListener {
public void init(GLAutoDrawable drawable) {
if( null == this.rs ) {
exclusivePMVMatrix = null == sharedPMVMatrix;
- this.rs = RenderState.createRenderState(new ShaderState(), SVertex.factory(), sharedPMVMatrix);
+ this.rs = RenderState.createRenderState(SVertex.factory(), sharedPMVMatrix);
}
this.renderer = RegionRenderer.create(rs, usrRenderModes, enableCallback, disableCallback);
this.textRenderUtil = new TextRegionUtil(renderer);
final GL2ES2 gl = drawable.getGL().getGL2ES2();
renderer.init(gl);
- renderer.setAlpha(gl, staticRGBAColor[3]);
- renderer.setColorStatic(gl, staticRGBAColor[0], staticRGBAColor[1], staticRGBAColor[2]);
- final ShaderState st = rs.getShaderState();
- st.useProgram(gl, false);
+ rs.setColorStatic(staticRGBAColor[0], staticRGBAColor[1], staticRGBAColor[2], staticRGBAColor[3]);
+ renderer.enable(gl, false);
final Object upObj = drawable.getUpstreamWidget();
if( upObj instanceof Window ) {
@@ -157,16 +154,15 @@ public abstract class TextRendererGLELBase implements GLEventListener {
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
if( null != renderer ) {
final GL2ES2 gl = drawable.getGL().getGL2ES2();
- final ShaderState st = rs.getShaderState();
- st.useProgram(gl, true);
+ renderer.enable(gl, true);
if( exclusivePMVMatrix ) {
// renderer.reshapePerspective(gl, 45.0f, width, height, 0.1f, 1000.0f);
- renderer.reshapeOrtho(gl, width, height, 0.1f, 1000.0f);
+ renderer.reshapeOrtho(width, height, 0.1f, 1000.0f);
pixelScale = 1.0f;
} else {
- renderer.reshapeNotify(gl, width, height);
+ renderer.reshapeNotify(width, height);
}
- st.useProgram(gl, false);
+ renderer.enable(gl, false);
}
}
@@ -257,7 +253,7 @@ public abstract class TextRendererGLELBase implements GLEventListener {
dx += pixelScale * font.getAdvanceWidth('X', pixelSize) * column;
dy -= pixelScale * lineHeight * ( row + 1 );
- final PMVMatrix pmvMatrix = rs.pmvMatrix();
+ final PMVMatrix pmvMatrix = rs.getMatrixMutable();
pmvMatrix.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
if( !exclusivePMVMatrix ) {
pmvMatrix.glPushMatrix();
@@ -271,17 +267,17 @@ public abstract class TextRendererGLELBase implements GLEventListener {
pmvMatrix.glScalef(pixelScale, pixelScale, 1f);
}
renderer.enable(gl, true);
- renderer.updateMatrix(gl);
if( cacheRegion ) {
- textRenderUtil.drawString3D(gl, font, pixelSize, text, vbaaSampleCount);
+ textRenderUtil.drawString3D(gl, font, pixelSize, text, null, vbaaSampleCount);
} else if( null != region ) {
- TextRegionUtil.drawString3D(region, renderer, gl, font, pixelSize, text, vbaaSampleCount);
+ TextRegionUtil.drawString3D(region, renderer, gl, font, pixelSize, text, null, vbaaSampleCount);
} else {
- TextRegionUtil.drawString3D(renderer, gl, font, pixelSize, text, vbaaSampleCount);
+ TextRegionUtil.drawString3D(renderer, gl, font, pixelSize, text, null, vbaaSampleCount);
}
renderer.enable(gl, false);
if( !exclusivePMVMatrix ) {
+ rs.setMatrixDirty();
pmvMatrix.glPopMatrix();
}
lastRow = row + newLineCount;
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 f14da399e..b5ac6cdaa 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
@@ -91,7 +91,7 @@ public class GPURegionGLListener01 extends GPURendererListenerBase01 {
outlineShape.closeLastOutline(true);
region = GLRegion.create(getRenderModes());
- region.addOutlineShape(outlineShape, null);
+ region.addOutlineShape(outlineShape, null, region.hasColorChannel() ? getRenderer().getRenderState().getColorStatic(new float[4]) : null);
}
public void init(GLAutoDrawable drawable) {
@@ -99,13 +99,12 @@ public class GPURegionGLListener01 extends GPURendererListenerBase01 {
GL2ES2 gl = drawable.getGL().getGL2ES2();
- final RegionRenderer regionRenderer = getRenderer();
+ final RenderState rs = getRenderer().getRenderState();
gl.setSwapInterval(1);
gl.glEnable(GL2ES2.GL_DEPTH_TEST);
gl.glEnable(GL2ES2.GL_BLEND);
- regionRenderer.setAlpha(gl, 1.0f);
- regionRenderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f);
+ rs.setColorStatic(0.0f, 0.0f, 0.0f, 1.0f);
createTestOutline();
}
@@ -117,14 +116,13 @@ public class GPURegionGLListener01 extends GPURendererListenerBase01 {
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
final RegionRenderer regionRenderer = getRenderer();
- final PMVMatrix pmv = regionRenderer.getMatrix();
+ final PMVMatrix pmv = regionRenderer.getMatrixMutable();
pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmv.glLoadIdentity();
pmv.glTranslatef(getXTran(), getYTran(), getZTran());
pmv.glRotatef(getAngle(), 0, 1, 0);
- regionRenderer.updateMatrix(gl);
- if( weight != regionRenderer.getWeight()) {
- regionRenderer.setWeight(gl, weight);
+ if( weight != regionRenderer.getRenderState().getWeight() ) {
+ regionRenderer.getRenderState().setWeight(weight);
}
region.draw(gl, regionRenderer, getSampleCount());
}
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 23ccef640..d9e962ea6 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
@@ -93,7 +93,7 @@ public class GPURegionGLListener02 extends GPURendererListenerBase01 {
shape.closeLastOutline(true);
region = GLRegion.create(getRenderModes());
- region.addOutlineShapes(outlineShapes, null);
+ region.addOutlineShapes(outlineShapes, null, null);
}
public void init(GLAutoDrawable drawable) {
@@ -101,13 +101,12 @@ public class GPURegionGLListener02 extends GPURendererListenerBase01 {
GL2ES2 gl = drawable.getGL().getGL2ES2();
- final RegionRenderer regionRenderer = getRenderer();
+ final RenderState rs = getRenderer().getRenderState();
gl.setSwapInterval(1);
gl.glEnable(GL2ES2.GL_DEPTH_TEST);
gl.glEnable(GL2ES2.GL_BLEND);
- regionRenderer.setAlpha(gl, 1.0f);
- regionRenderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f);
+ rs.setColorStatic(0.0f, 0.0f, 0.0f, 1.0f);
createTestOutline();
}
@@ -120,14 +119,13 @@ public class GPURegionGLListener02 extends GPURendererListenerBase01 {
final RegionRenderer regionRenderer = getRenderer();
- final PMVMatrix pmv = regionRenderer.getMatrix();
+ final PMVMatrix pmv = regionRenderer.getMatrixMutable();
pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmv.glLoadIdentity();
pmv.glTranslatef(getXTran(), getYTran(), getZTran());
pmv.glRotatef(getAngle(), 0, 1, 0);
- regionRenderer.updateMatrix(gl);
- if( weight != regionRenderer.getWeight()) {
- regionRenderer.setWeight(gl, weight);
+ if( weight != regionRenderer.getRenderState().getWeight() ) {
+ regionRenderer.getRenderState().setWeight(weight);
}
region.draw(gl, regionRenderer, getSampleCount());
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo.java
index 7bcbe0484..7897d0a00 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURegionNewtDemo.java
@@ -41,7 +41,6 @@ import com.jogamp.newt.event.WindowEvent;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.test.junit.util.MiscUtils;
import com.jogamp.opengl.util.Animator;
-import com.jogamp.opengl.util.glsl.ShaderState;
/** Demonstrate the rendering of multiple outlines into one region/OutlineShape
* These Outlines are not necessary connected or contained.
@@ -97,7 +96,7 @@ public class GPURegionNewtDemo {
}
System.out.println("Requested: " + caps);
- int rmode = GraphUseWeight ? Region.VARIABLE_CURVE_WEIGHT_BIT : 0;
+ int rmode = GraphUseWeight ? Region.VARWEIGHT_RENDERING_BIT : 0;
int sampleCount = 0;
if( GraphVBAASamples > 0 ) {
rmode |= Region.VBAA_RENDERING_BIT;
@@ -112,7 +111,7 @@ public class GPURegionNewtDemo {
window.setSize(800, 400);
window.setTitle("GPU Curve Region Newt Demo - graph[vbaa"+GraphVBAASamples+" msaa"+GraphMSAASamples+"], msaa "+SceneMSAASamples);
- RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ RenderState rs = RenderState.createRenderState(SVertex.factory());
GPURegionGLListener01 regionGLListener = new GPURegionGLListener01 (rs, rmode, sampleCount, DEBUG, TRACE);
regionGLListener.attachInputListenerTo(window);
window.addGLEventListener(regionGLListener);
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java
index 30c6bdea5..65ed86947 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPURendererListenerBase01.java
@@ -46,6 +46,7 @@ import javax.media.opengl.fixedfunc.GLMatrixFunc;
import com.jogamp.graph.curve.Region;
import com.jogamp.graph.curve.opengl.GLRegion;
import com.jogamp.graph.curve.opengl.RegionRenderer;
+import com.jogamp.graph.curve.opengl.RenderState;
import com.jogamp.newt.event.KeyEvent;
import com.jogamp.newt.event.KeyListener;
import com.jogamp.newt.opengl.GLWindow;
@@ -145,13 +146,10 @@ public abstract class GPURendererListenerBase01 implements GLEventListener {
@Override
public void reshape(GLAutoDrawable drawable, int xstart, int ystart, int width, int height) {
- GL2ES2 gl = drawable.getGL().getGL2ES2();
-
- final PMVMatrix pmv = renderer.getMatrix();
- renderer.reshapePerspective(null, 45.0f, width, height, zNear, zFar);
+ final PMVMatrix pmv = renderer.getMatrixMutable();
+ renderer.reshapePerspective(45.0f, width, height, zNear, zFar);
pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmv.glLoadIdentity();
- renderer.updateMatrix(gl);
System.err.printf("Reshape: zNear %f, zFar %f%n", zNear, zFar);
System.err.printf("Reshape: Frustum: %s%n", pmv.glGetFrustum());
{
@@ -207,7 +205,7 @@ public abstract class GPURendererListenerBase01 implements GLEventListener {
dumpMatrix();
}
public void editGlobalWeight(float delta) {
- if( !RegionRenderer.isWeightValid(weight+delta) ) {
+ if( !RenderState.isWeightValid(weight+delta) ) {
return;
}
weight += delta;
@@ -328,7 +326,7 @@ public abstract class GPURendererListenerBase01 implements GLEventListener {
public boolean run(GLAutoDrawable drawable) {
try {
final String modeS = Region.getRenderModeString(renderer.getRenderModes());
- final String type = modeS + ( Region.isNonUniformWeight(renderModes) ? "-vc" : "-uc" ) ;
+ final String type = modeS + ( Region.hasVariableWeight(renderModes) ? "-vc" : "-uc" ) ;
printScreen(drawable, "./", "demo-"+type, "snap"+screenshot_num, false);
screenshot_num++;
} catch (GLException e) {
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextGLListener0A.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextGLListener0A.java
index a484c08ef..08d2f0d70 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextGLListener0A.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextGLListener0A.java
@@ -36,12 +36,11 @@ import com.jogamp.graph.curve.opengl.RenderState;
import com.jogamp.graph.curve.opengl.RegionRenderer;
import com.jogamp.graph.geom.SVertex;
import com.jogamp.newt.opengl.GLWindow;
-import com.jogamp.opengl.util.glsl.ShaderState;
public class GPUTextGLListener0A extends GPUTextRendererListenerBase01 {
public GPUTextGLListener0A() {
- super(RenderState.createRenderState(new ShaderState(), SVertex.factory()), Region.VBAA_RENDERING_BIT, 4, true, false, false);
+ super(RenderState.createRenderState(SVertex.factory()), Region.VBAA_RENDERING_BIT, 4, true, false, false);
}
public GPUTextGLListener0A(RenderState rs, int renderModes, int sampleCount, boolean blending, boolean debug, boolean trace) {
@@ -57,13 +56,12 @@ public class GPUTextGLListener0A extends GPUTextRendererListenerBase01 {
GL2ES2 gl = drawable.getGL().getGL2ES2();
- final RegionRenderer renderer = getRenderer();
+ final RenderState rs = getRenderer().getRenderState();
gl.setSwapInterval(1);
gl.glEnable(GL2ES2.GL_DEPTH_TEST);
gl.glEnable(GL2ES2.GL_BLEND);
- renderer.setAlpha(gl, 1.0f);
- renderer.setColorStatic(gl, 0.1f, 0.1f, 0.1f);
+ rs.setColorStatic(0.1f, 0.1f, 0.1f, 1.0f);
}
public void dispose(GLAutoDrawable drawable) {
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo.java
index f63b9b70a..e6b1f9c9c 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUTextNewtDemo.java
@@ -40,7 +40,6 @@ import com.jogamp.newt.event.WindowEvent;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.test.junit.util.MiscUtils;
import com.jogamp.opengl.util.Animator;
-import com.jogamp.opengl.util.glsl.ShaderState;
public class GPUTextNewtDemo {
/**
@@ -110,7 +109,7 @@ public class GPUTextNewtDemo {
window.setSize(800, 400);
window.setTitle("GPU Text Newt Demo - graph[vbaa"+GraphVBAASamples+" msaa"+GraphMSAASamples+"], msaa "+SceneMSAASamples);
- RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ RenderState rs = RenderState.createRenderState(SVertex.factory());
GPUTextGLListener0A textGLListener = new GPUTextGLListener0A(rs, rmode, sampleCount, true, DEBUG, TRACE);
// ((TextRenderer)textGLListener.getRenderer()).setCacheLimit(32);
window.addGLEventListener(textGLListener);
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 f187dcc6b..7372eb8f6 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
@@ -156,7 +156,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB
headtext = text1;
}
if(null != headtext) {
- headbox = font.getStringBounds(headtext, font.getPixelSize(fontSizeHead, dpiH));
+ headbox = font.getMetricBounds(headtext, font.getPixelSize(fontSizeHead, dpiH));
}
}
@@ -169,7 +169,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB
((Window)upObj).getMainMonitor().getPixelsPerMM(pixelsPerMM);
dpiH = pixelsPerMM[1]*25.4f;
}
- fontNameBox = font.getStringBounds(fontName, font.getPixelSize(fontSizeFName, dpiH));
+ fontNameBox = font.getMetricBounds(fontName, font.getPixelSize(fontSizeFName, dpiH));
switchHeadBox();
}
@@ -213,10 +213,11 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB
// final int[] view = new int[] { 0, 0, drawable.getWidth(), drawable.getHeight() };
final RegionRenderer renderer = getRenderer();
- final PMVMatrix pmv = renderer.getMatrix();
+ final RenderState rs = renderer.getRenderState();
+ final PMVMatrix pmv = renderer.getMatrixMutable();
pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmv.glLoadIdentity();
- renderer.setColorStatic(gl, 0.1f, 0.1f, 0.1f);
+ rs.setColorStatic(0.1f, 0.1f, 0.1f, 1.0f);
if( renderer.getRenderState().isHintMaskSet(RenderState.BITHINT_BLENDING_ENABLED) ) {
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}
@@ -245,45 +246,44 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB
// bottom, half line up
pmv.glTranslatef(nearPlaneX0, nearPlaneY0+(nearPlaneS * pixelSizeFPS / 2f), nearPlaneZ0);
- renderer.updateMatrix(gl);
// No cache, keep region alive!
- TextRegionUtil.drawString3D(regionFPS, renderer, gl, font, nearPlaneS * pixelSizeFPS, text, sampleCountFPS);
+ TextRegionUtil.drawString3D(regionFPS, renderer, gl, font, nearPlaneS * pixelSizeFPS, text, null, sampleCountFPS);
}
float dx = width-fontNameBox.getWidth()-2f;
float dy = height - 10f;
+ renderer.setMatrixDirty();
pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmv.glLoadIdentity();
pmv.glTranslatef(nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy), nearPlaneZ0);
- renderer.updateMatrix(gl);
// System.err.printf("FontN: [%f %f] -> [%f %f]%n", dx, dy, nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy));
- textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeFName, fontName, getSampleCount());
+ textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeFName, fontName, null, getSampleCount());
dx = 10f;
dy += -fontNameBox.getHeight() - 10f;
if(null != headtext) {
+ renderer.setMatrixDirty();
pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmv.glLoadIdentity();
// System.err.printf("Head: [%f %f] -> [%f %f]%n", dx, dy, nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy));
pmv.glTranslatef(nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy), nearPlaneZ0);
// pmv.glTranslatef(x0, y1, z0);
- renderer.updateMatrix(gl);
- textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeHead, headtext, getSampleCount());
+ textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeHead, headtext, null, getSampleCount());
}
dy += -headbox.getHeight() - font.getLineHeight(pixelSizeBottom);
+ renderer.setMatrixDirty();
pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmv.glLoadIdentity();
pmv.glTranslatef(nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy), nearPlaneZ0);
// System.err.printf("Bottom: [%f %f] -> [%f %f]%n", dx, dy, nearPlaneX0+(dx*nearPlaneSx), nearPlaneY0+(dy*nearPlaneSy));
pmv.glTranslatef(getXTran(), getYTran(), getZTran());
pmv.glRotatef(getAngle(), 0, 1, 0);
- renderer.updateMatrix(gl);
- renderer.setColorStatic(gl, 0.9f, 0.0f, 0.0f);
+ rs.setColorStatic(0.9f, 0.0f, 0.0f, 1.0f);
if( renderer.getRenderState().isHintMaskSet(RenderState.BITHINT_BLENDING_ENABLED) ) {
gl.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
}
@@ -293,15 +293,15 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB
}
if(!userInput) {
if( bottomTextUseFrustum ) {
- TextRegionUtil.drawString3D(regionBottom, renderer, gl, font, nearPlaneS * pixelSizeBottom, text2, getSampleCount());
+ TextRegionUtil.drawString3D(regionBottom, renderer, gl, font, nearPlaneS * pixelSizeBottom, text2, null, getSampleCount());
} else {
- textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeBottom, text2, getSampleCount());
+ textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeBottom, text2, null, getSampleCount());
}
} else {
if( bottomTextUseFrustum ) {
- TextRegionUtil.drawString3D(regionBottom, renderer, gl, font, nearPlaneS * pixelSizeBottom, userString.toString(), getSampleCount());
+ TextRegionUtil.drawString3D(regionBottom, renderer, gl, font, nearPlaneS * pixelSizeBottom, userString.toString(), null, getSampleCount());
} else {
- textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeBottom, userString.toString(), getSampleCount());
+ textRegionUtil.drawString3D(gl, font, nearPlaneS * pixelSizeBottom, userString.toString(), null, getSampleCount());
}
}
}
@@ -315,7 +315,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB
public void fontHeadIncr(int v) {
fontSizeHead = Math.abs((fontSizeHead + v) % fontSizeModulo) ;
if(null != headtext) {
- headbox = font.getStringBounds(headtext, font.getPixelSize(fontSizeHead, dpiH));
+ headbox = font.getMetricBounds(headtext, font.getPixelSize(fontSizeHead, dpiH));
}
}
@@ -327,7 +327,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB
fontSet = set;
font = _font;
fontName = font.getFullFamilyName(null).toString();
- fontNameBox = font.getStringBounds(fontName, font.getPixelSize(fontSizeFName, dpiH));
+ fontNameBox = font.getMetricBounds(fontName, font.getPixelSize(fontSizeFName, dpiH));
dumpFontNames();
return true;
}
@@ -344,7 +344,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB
fontSet = set;
font = _font;
fontName = font.getFullFamilyName(null).toString();
- fontNameBox = font.getStringBounds(fontName, font.getPixelSize(fontSizeFName, dpiH));
+ fontNameBox = font.getMetricBounds(fontName, font.getPixelSize(fontSizeFName, dpiH));
dumpFontNames();
return true;
}
@@ -359,7 +359,7 @@ public abstract class GPUTextRendererListenerBase01 extends GPURendererListenerB
void dumpMatrix(boolean bbox) {
System.err.println("Matrix: " + getXTran() + "/" + getYTran() + " x"+getZTran() + " @"+getAngle() +" fontSize "+fontSizeBottom);
if(bbox) {
- System.err.println("bbox: "+font.getStringBounds(text2, nearPlaneS * font.getPixelSize(fontSizeBottom, dpiH)));
+ System.err.println("bbox: "+font.getMetricBounds(text2, nearPlaneS * font.getPixelSize(fontSizeBottom, dpiH)));
}
}
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 f9becfaed..b3b17375d 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
@@ -33,7 +33,6 @@ import com.jogamp.opengl.test.junit.graph.demos.ui.RIButton;
import com.jogamp.opengl.test.junit.graph.demos.ui.SceneUIController;
import com.jogamp.opengl.test.junit.graph.demos.ui.UIShape;
import com.jogamp.opengl.util.GLReadBufferUtil;
-import com.jogamp.opengl.util.glsl.ShaderState;
public class GPUUISceneGLListener0A implements GLEventListener {
@@ -87,12 +86,12 @@ public class GPUUISceneGLListener0A implements GLEventListener {
}
public GPUUISceneGLListener0A(int renderModes) {
- this(RenderState.createRenderState(new ShaderState(), SVertex.factory()), renderModes, false, false);
+ this(RenderState.createRenderState(SVertex.factory()), renderModes, false, false);
}
public GPUUISceneGLListener0A(RenderState rs, int renderModes, boolean debug, boolean trace) {
this.rs = rs;
- this.renderModes = renderModes;
+ this.renderModes = renderModes | Region.COLORCHANNEL_RENDERING_BIT;
this.debug = debug;
this.trace = trace;
@@ -261,14 +260,41 @@ public class GPUUISceneGLListener0A implements GLEventListener {
} } );
button.addMouseListener(dragZoomRotateListener);
buttons.add(button);
+
+ button = new RIButton(SVertex.factory(), font, "< quality >", buttonXSize, buttonYSize);
+ button.translate(xstart,ystart - diffY*buttons.size(), 0f);
+ button.setLabelColor(1.0f, 1.0f, 1.0f);
+ button.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ final Object attachment = e.getAttachment();
+ if( attachment instanceof UIShape.EventDetails ) {
+ final UIShape.EventDetails shapeEvent = (UIShape.EventDetails)attachment;
+ int quality = shapeEvent.shape.getQuality();
+
+ if( shapeEvent.rotPosition[0] < shapeEvent.rotBounds.getCenter()[0] ) {
+ // left-half pressed
+ if( quality > 0 ) {
+ quality=0;
+ }
+ } else {
+ // right-half pressed
+ if( quality < 1 ) {
+ quality=1;
+ }
+ }
+ sceneUIController.setAllShapesQuality(quality);
+ }
+ } } );
+ button.addMouseListener(dragZoomRotateListener);
+ buttons.add(button);
}
button = new RIButton(SVertex.factory(), font, "Quit", buttonXSize, buttonYSize);
button.translate(xstart,ystart - diffY*buttons.size(), 0f);
- button.setColor(0.8f, 0.0f, 0.0f);
+ button.setColor(0.8f, 0.0f, 0.0f, 1.0f);
button.setLabelColor(1.0f, 1.0f, 1.0f);
- button.setSelectedColor(0.8f, 0.8f, 0.8f);
- button.setLabelSelectedColor(0.8f, 0.0f, 0.0f);
+ button.setSelectedColorMod(0.8f, 0.8f, 0.8f, 1.0f);
button.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
@@ -511,7 +537,6 @@ public class GPUUISceneGLListener0A implements GLEventListener {
gl.glEnable(GL2ES2.GL_BLEND);
renderer.init(gl);
- renderer.setAlpha(gl, 1.0f);
initTexts();
@@ -529,7 +554,7 @@ public class GPUUISceneGLListener0A implements GLEventListener {
sceneUIController.addShape(truePtSizeLabel);
truePtSizeLabel.setEnabled(enableOthers);
truePtSizeLabel.translate(0, - 1.5f * jogampLabel.getLineHeight(), 0f);
- truePtSizeLabel.setColor(0.1f, 0.1f, 0.1f);
+ truePtSizeLabel.setColor(0.1f, 0.1f, 0.1f, 1.0f);
/**
*
@@ -541,7 +566,7 @@ public class GPUUISceneGLListener0A implements GLEventListener {
fpsLabel.addMouseListener(dragZoomRotateListener);
sceneUIController.addShape(fpsLabel);
fpsLabel.setEnabled(enableOthers);
- fpsLabel.setColor(0.3f, 0.3f, 0.3f);
+ fpsLabel.setColor(0.3f, 0.3f, 0.3f, 1.0f);
crossHairCtr = new CrossHair(renderer.getRenderState().getVertexFactory(), 100f, 100f, 2f);
crossHairCtr.addMouseListener(dragZoomRotateListener);
@@ -603,7 +628,7 @@ public class GPUUISceneGLListener0A implements GLEventListener {
final float dyTop = drawable.getHeight() * relTop;
final float dxRight = drawable.getWidth() * relRight;
labels[currentText] = new Label(SVertex.factory(), font, pixelSizeFixed, strings[currentText]);
- labels[currentText].setColor(0.1f, 0.1f, 0.1f);
+ labels[currentText].setColor(0.1f, 0.1f, 0.1f, 1.0f);
labels[currentText].setEnabled(enableOthers);
labels[currentText].translate(dxRight,
dyTop - 1.5f * jogampLabel.getLineHeight()
@@ -627,8 +652,8 @@ public class GPUUISceneGLListener0A implements GLEventListener {
final String text;
if( null == actionText ) {
final String timePrec = gl.isGLES() ? "4.0" : "4.1";
- text = String.format("%03.1f/%03.1f fps, v-sync %d, fontSize %.1f, %s-samples %d, td %"+timePrec+"f, blend %b, alpha-bits %d, msaa-bits %d",
- lfps, tfps, gl.getSwapInterval(), fontSizeFixedPVP, modeS, sceneUIController.getSampleCount(), td,
+ text = String.format("%03.1f/%03.1f fps, v-sync %d, fontSize %.1f, %s-samples %d, q %d, td %"+timePrec+"f, blend %b, alpha-bits %d, msaa-bits %d",
+ lfps, tfps, gl.getSwapInterval(), fontSizeFixedPVP, modeS, sceneUIController.getSampleCount(), fpsLabel.getQuality(), td,
renderer.getRenderState().isHintMaskSet(RenderState.BITHINT_BLENDING_ENABLED),
drawable.getChosenGLCapabilities().getAlphaBits(),
drawable.getChosenGLCapabilities().getNumSamples());
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo.java
index c59d85824..a4da58eac 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/GPUUISceneNewtDemo.java
@@ -11,7 +11,6 @@ import com.jogamp.newt.event.WindowEvent;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.test.junit.util.MiscUtils;
import com.jogamp.opengl.util.Animator;
-import com.jogamp.opengl.util.glsl.ShaderState;
public class GPUUISceneNewtDemo {
static final boolean DEBUG = false;
@@ -68,14 +67,14 @@ public class GPUUISceneNewtDemo {
window.setSize(800, 400);
window.setTitle("GraphUI Newt Demo: graph["+Region.getRenderModeString(rmode)+"], msaa "+SceneMSAASamples);
- final RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ final RenderState rs = RenderState.createRenderState(SVertex.factory());
GPUUISceneGLListener0A sceneGLListener = new GPUUISceneGLListener0A(rs, rmode, DEBUG, TRACE);
window.addGLEventListener(sceneGLListener);
sceneGLListener.attachInputListenerTo(window);
final Animator animator = new Animator();
- animator.setUpdateFPSFrames(60, null); // System.err);
+ animator.setUpdateFPSFrames(60, System.err);
animator.add(window);
window.addWindowListener(new WindowAdapter() {
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/CrossHair.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/CrossHair.java
index 75fc0eb8f..450d5743a 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/CrossHair.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/CrossHair.java
@@ -30,7 +30,6 @@ package com.jogamp.opengl.test.junit.graph.demos.ui;
import javax.media.opengl.GL2ES2;
import com.jogamp.graph.curve.OutlineShape;
-import com.jogamp.graph.curve.OutlineShapeXForm;
import com.jogamp.graph.curve.opengl.RegionRenderer;
import com.jogamp.graph.geom.Vertex;
import com.jogamp.graph.geom.Vertex.Factory;
@@ -56,7 +55,7 @@ public class CrossHair extends UIShape {
this.width = width;
this.height = height;
this.lineWidth = lineWidth;
- dirty |= DIRTY_SHAPE | DIRTY_REGION;
+ dirty |= DIRTY_SHAPE;
}
@Override
@@ -68,7 +67,7 @@ public class CrossHair extends UIShape {
}
@Override
- protected void createShape(GL2ES2 gl, RegionRenderer renderer) {
+ protected void addShapeToRegion(GL2ES2 gl, RegionRenderer renderer) {
final OutlineShape shape = new OutlineShape(renderer.getRenderState().getVertexFactory());
final float tw = getWidth();
@@ -97,7 +96,9 @@ public class CrossHair extends UIShape {
shape.addVertex(ctrX-twh, ctrY+lwh, ctrZ, true);
shape.closeLastOutline(true);
- shapes.add(new OutlineShapeXForm(shape, null));
+ shape.setIsQuadraticNurbs();
+ shape.setSharpness(shapesSharpness);
+ region.addOutlineShape(shape, null, rgbaColor);
box.resize(shape.getBounds());
}
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label.java
index 78c42b2d0..2f942fd13 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label.java
@@ -32,7 +32,6 @@ import javax.media.opengl.GL2ES2;
import jogamp.graph.geom.plane.AffineTransform;
import com.jogamp.graph.curve.OutlineShape;
-import com.jogamp.graph.curve.OutlineShapeXForm;
import com.jogamp.graph.curve.opengl.RegionRenderer;
import com.jogamp.graph.curve.opengl.TextRegionUtil;
import com.jogamp.graph.font.Font;
@@ -57,7 +56,7 @@ public class Label extends UIShape {
public void setText(String text) {
this.text = text;
- dirty |= DIRTY_SHAPE | DIRTY_REGION;
+ dirty |= DIRTY_SHAPE;
}
public Font getFont() {
@@ -66,7 +65,7 @@ public class Label extends UIShape {
public void setFont(Font font) {
this.font = font;
- dirty |= DIRTY_SHAPE | DIRTY_REGION;
+ dirty |= DIRTY_SHAPE;
}
public float getPixelSize() {
@@ -79,7 +78,7 @@ public class Label extends UIShape {
public void setPixelSize(float pixelSize) {
this.pixelSize = pixelSize;
- dirty |= DIRTY_SHAPE | DIRTY_REGION;
+ dirty |= DIRTY_SHAPE;
}
@Override
@@ -95,14 +94,15 @@ public class Label extends UIShape {
private final TextRegionUtil.ShapeVisitor shapeVisitor = new TextRegionUtil.ShapeVisitor() {
@Override
public void visit(OutlineShape shape, AffineTransform t) {
- shapes.add(new OutlineShapeXForm(shape, new AffineTransform(t)));
+ shape.setSharpness(shapesSharpness);
+ region.addOutlineShape(shape, t, rgbaColor);
box.resize(shape.getBounds(), t, tmpV3);
}
};
@Override
- protected void createShape(GL2ES2 gl, RegionRenderer renderer) {
- TextRegionUtil.processString(shapeVisitor, new AffineTransform(), font, pixelSize, text);
+ protected void addShapeToRegion(GL2ES2 gl, RegionRenderer renderer) {
+ TextRegionUtil.processString(shapeVisitor, null, font, pixelSize, text);
final float[] ctr = box.getCenter();
setRotationOrigin( ctr[0], ctr[1], ctr[2]);
}
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label0.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label0.java
new file mode 100644
index 000000000..dff9cd1c7
--- /dev/null
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/Label0.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright 2010 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package com.jogamp.opengl.test.junit.graph.demos.ui;
+
+import jogamp.graph.geom.plane.AffineTransform;
+
+import com.jogamp.graph.curve.OutlineShape;
+import com.jogamp.graph.curve.Region;
+import com.jogamp.graph.curve.opengl.TextRegionUtil;
+import com.jogamp.graph.font.Font;
+import com.jogamp.opengl.math.geom.AABBox;
+
+public class Label0 {
+ protected Font font;
+ protected String text;
+ protected final float[] rgbaColor;
+ protected final AABBox box;
+
+ public Label0(Font font, String text, float[] rgbaColor) {
+ this.font = font;
+ this.text = text;
+ this.rgbaColor = rgbaColor;
+ this.box = new AABBox();
+ }
+
+ public final String getText() { return text; }
+
+ public final float[] getColor() { return rgbaColor; }
+
+ public final void setColor(float r, float g, float b, float a) {
+ this.rgbaColor[0] = r;
+ this.rgbaColor[1] = g;
+ this.rgbaColor[2] = b;
+ this.rgbaColor[3] = a;
+ }
+
+ public final void setText(String text) {
+ this.text = text;
+ }
+
+ public final Font getFont() { return font; }
+
+ public final void setFont(Font font) {
+ this.font = font;
+ }
+
+ public final AABBox getBounds() { return box; }
+
+ private final float[] tmpV3 = new float[3];
+
+ private final TextRegionUtil.ShapeVisitor shapeVisitor = new TextRegionUtil.ShapeVisitor() {
+ @Override
+ public void visit(OutlineShape shape, AffineTransform t) {
+ final AffineTransform t1 = new AffineTransform(tLeft).concatenate( t );
+ region.addOutlineShape(shape, t1, rgbaColor);
+ box.resize(shape.getBounds(), t1, tmpV3);
+ }
+ };
+
+ private Region region;
+ private AffineTransform tLeft;
+
+ public final AABBox addShapeToRegion(final float pixelSize, final Region region, final AffineTransform tLeft) {
+ box.reset();
+ this.region = region;
+ this.tLeft = tLeft;
+ TextRegionUtil.processString(shapeVisitor, null, font, pixelSize, text);
+ this.region = null;
+ this.tLeft = null;
+ return box;
+ }
+
+ @Override
+ public final String toString(){
+ return "Label0 [" + font.toString() + ", " + getText() + "]";
+ }
+}
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 cfce04dd0..d46343f9d 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
@@ -29,8 +29,9 @@ package com.jogamp.opengl.test.junit.graph.demos.ui;
import javax.media.opengl.GL2ES2;
+import jogamp.graph.geom.plane.AffineTransform;
+
import com.jogamp.graph.curve.OutlineShape;
-import com.jogamp.graph.curve.OutlineShapeXForm;
import com.jogamp.graph.curve.opengl.RegionRenderer;
import com.jogamp.graph.font.Font;
import com.jogamp.graph.geom.Vertex;
@@ -49,7 +50,7 @@ public class RIButton extends UIShape {
public static final float DEFAULT_CORNER = 1f;
private float width, height;
- private final Label label;
+ private final Label0 label;
private float spacingX = DEFAULT_SPACING_X;
private float spacingY = DEFAULT_SPACING_Y;
private float corner = DEFAULT_CORNER;
@@ -58,13 +59,7 @@ public class RIButton extends UIShape {
public RIButton(Factory<? extends Vertex> factory, Font labelFont, String labelText, float width, float height) {
super(factory);
- final float pixelSize = height * ( 1f - spacingY ) ;
- System.err.printf("RIButton: height %f -> pixelSize %f%n", height, pixelSize);
- this.label = new Label(factory, labelFont, pixelSize, labelText);
- this.label.setSelectedColor(this.color[0], this.color[1], this.color[2]);
- this.label.setColor(0.9f, 0.9f, 0.9f);
- this.label.setSelectedColor(1f, 1f, 1f);
-
+ this.label = new Label0(labelFont, labelText, new float[] { 0.9f, 0.9f, 0.9f, 1.0f });
this.width = width;
this.height = height;
}
@@ -72,82 +67,73 @@ public class RIButton extends UIShape {
public final float getWidth() { return width; }
public final float getHeight() { return height; }
public final float getCorner() { return corner; }
- public final Label getLabel() { return label; }
public void setDimension(float width, float height) {
this.width = width;
this.height = height;
- dirty |= DIRTY_SHAPE | DIRTY_REGION;
+ dirty |= DIRTY_SHAPE;
}
@Override
protected void clearImpl(GL2ES2 gl, RegionRenderer renderer) {
- label.clear(gl, renderer);
}
@Override
protected void destroyImpl(GL2ES2 gl, RegionRenderer renderer) {
- label.destroy(gl, renderer);
}
@Override
public void drawShape(GL2ES2 gl, RegionRenderer renderer, int[] sampleCount) {
- gl.glEnable(GL2ES2.GL_POLYGON_OFFSET_FILL);
- gl.glPolygonOffset(0.0f, 1f);
+ // No need to setup an poly offset for z-fighting, using one region now
+ // gl.glEnable(GL2ES2.GL_POLYGON_OFFSET_FILL);
+ // gl.glPolygonOffset(0.0f, 1f);
super.drawShape(gl, renderer, sampleCount);
- gl.glDisable(GL2ES2.GL_POLYGON_OFFSET_FILL);
-
- label.drawShape(gl, renderer, sampleCount);
+ // gl.glDisable(GL2ES2.GL_POLYGON_OFFSET_FILL);
}
@Override
- protected void createShape(GL2ES2 gl, RegionRenderer renderer) {
- label.clear(gl, renderer);
-
+ protected void addShapeToRegion(GL2ES2 gl, RegionRenderer renderer) {
final OutlineShape shape = new OutlineShape(renderer.getRenderState().getVertexFactory());
if(corner == 0.0f) {
createSharpOutline(shape);
} else {
createCurvedOutline(shape);
}
+ shape.setIsQuadraticNurbs();
+ shape.setSharpness(shapesSharpness);
+ region.addOutlineShape(shape, null, rgbaColor);
box.resize(shape.getBounds());
// Precompute text-box size .. guessing pixelSize
final float lPixelSize0 = 10f;
final float lw = width * ( 1f - spacingX ) ;
final float lh = height * ( 1f - spacingY ) ;
- final AABBox lbox0 = label.font.getStringBounds(label.text, lPixelSize0);
+ final AABBox lbox0 = label.font.getMetricBounds(label.text, lPixelSize0);
final float lsx = lw / lbox0.getWidth();
final float lsy = lh / lbox0.getHeight();
final float lPixelSize1 = lsx < lsy ? lPixelSize0 * lsx : lPixelSize0 * lsy;
if( DRAW_DEBUG_BOX ) {
System.err.println("RIButton: spacing "+spacingX+", "+spacingY);
System.err.println("RIButton: bbox "+box);
- System.err.println("RIButton: lbox "+lbox0);
+ System.err.println("RIButton: lbox "+lbox0+", "+label.text);
System.err.println("RIButton: net-text "+lw+" x "+lh);
System.err.println("RIButton: lsx "+lsx+", lsy "+lsy+": pixelSize "+lPixelSize0+" -> "+lPixelSize1);
}
// Setting pixelSize based on actual text-box size
- label.setPixelSize(lPixelSize1);
- label.createShape(gl, renderer);
- final AABBox lbox1 = label.getBounds();
- if( DRAW_DEBUG_BOX ) {
- System.err.printf("RIButton: lbox1 %s .... %s%n", lbox1, this.label.text);
- }
-
+ final AABBox lbox1 = label.font.getPointsBounds(null, label.text, lPixelSize1);
// Center text .. (share same center w/ button)
final float[] lctr = lbox1.getCenter();
final float[] ctr = box.getCenter();
final float[] ltx = new float[] { ctr[0] - lctr[0], ctr[1] - lctr[1], 0f };
- label.translateShape( ltx[0], ltx[1] );
- lbox1.translate( ltx );
- // rotate center of button/label ..
- label.setRotationOrigin( ctr[0], ctr[1], ctr[2]);
- setRotationOrigin( ctr[0], ctr[1], ctr[2]);
+ final AABBox lbox2 = label.addShapeToRegion(lPixelSize1, region, AffineTransform.getTranslateInstance(ltx[0], ltx[1]));
+ if( DRAW_DEBUG_BOX ) {
+ System.err.printf("RIButton.0: lbox1 %s%n", lbox1);
+ System.err.printf("RIButton.0: lbox2 %s%n", lbox2);
+ }
- shapes.add(new OutlineShapeXForm(shape, null));
+ setRotationOrigin( ctr[0], ctr[1], ctr[2]);
if( DRAW_DEBUG_BOX ) {
System.err.println("XXX.UIShape.RIButton: Added Shape: "+shape+", "+box);
@@ -205,7 +191,7 @@ public class RIButton extends UIShape {
else{
this.corner = corner;
}
- dirty |= DIRTY_SHAPE | DIRTY_REGION;
+ dirty |= DIRTY_SHAPE;
}
public float getLabelZOffset() {
@@ -214,7 +200,7 @@ public class RIButton extends UIShape {
public void setLabelZOffset(float labelZOffset) {
this.labelZOffset = -labelZOffset;
- dirty |= DIRTY_SHAPE | DIRTY_REGION;
+ dirty |= DIRTY_SHAPE;
}
public final float getSpacingX() { return spacingX; }
public final float getSpacingY() { return spacingY; }
@@ -239,7 +225,7 @@ public class RIButton extends UIShape {
} else {
this.spacingY = spacingY;
}
- dirty |= DIRTY_SHAPE | DIRTY_REGION;
+ dirty |= DIRTY_SHAPE;
}
public float[] getLabelColor() {
@@ -247,17 +233,13 @@ public class RIButton extends UIShape {
}
public void setLabelColor(float r, float g, float b) {
- label.setColor(r, g, b);
- }
-
- public void setLabelSelectedColor(float r, float g, float b){
- label.setSelectedColor(r, g, b);
+ label.setColor(r, g, b, 1.0f);
}
@Override
public String toString() {
return "RIButton [" + translate[0]+getWidth()/2f+" / "+translate[1]+getHeight()/2f+" "+getWidth() + "x" + getHeight() + ", "
- + getLabel() + ", " + "spacing: " + spacingX+"/"+spacingY
+ + label + ", " + "spacing: " + spacingX+"/"+spacingY
+ ", " + "corner: " + corner + ", " + "shapeOffset: " + labelZOffset + ", "+box+" ]";
}
}
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/SceneUIController.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/SceneUIController.java
index 124729563..4f77ad3ad 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/SceneUIController.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/SceneUIController.java
@@ -82,6 +82,16 @@ public class SceneUIController implements GLEventListener{
public int getSampleCount() { return sampleCount[0]; }
public void setSampleCount(int v) { sampleCount[0]=v; markAllShapesDirty(); }
+ public void setAllShapesQuality(final int q) {
+ for(int i=0; i<shapes.size(); i++) {
+ shapes.get(i).setQuality(q);
+ }
+ }
+ public void setAllShapesSharpness(final float sharpness) {
+ for(int i=0; i<shapes.size(); i++) {
+ shapes.get(i).setSharpness(sharpness);
+ }
+ }
public void markAllShapesDirty() {
for(int i=0; i<shapes.size(); i++) {
shapes.get(i).markDirty();
@@ -168,7 +178,7 @@ public class SceneUIController implements GLEventListener{
gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
- final PMVMatrix pmv = renderer.getMatrix();
+ final PMVMatrix pmv = renderer.getMatrixMutable();
pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
final int shapeCount = shapes.size();
@@ -178,8 +188,8 @@ public class SceneUIController implements GLEventListener{
uiShape.validate(gl, renderer);
pmv.glPushMatrix();
transformShape(pmv, uiShape);
- renderer.updateMatrix(gl);
uiShape.drawShape(gl, renderer, sampleCount);
+ renderer.setMatrixDirty();
pmv.glPopMatrix();
}
}
@@ -206,9 +216,8 @@ public class SceneUIController implements GLEventListener{
viewport[2] = width;
viewport[3] = height;
- final GL2ES2 gl = drawable.getGL().getGL2ES2();
- final PMVMatrix pmv = renderer.getMatrix();
- renderer.reshapePerspective(gl, 45.0f, width, height, zNear, zFar);
+ final PMVMatrix pmv = renderer.getMatrixMutable();
+ renderer.reshapePerspective(45.0f, width, height, zNear, zFar);
pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmv.glLoadIdentity();
@@ -249,7 +258,6 @@ public class SceneUIController implements GLEventListener{
pmv.glTranslatef(scenePlaneOrigin[0], scenePlaneOrigin[1], scenePlaneOrigin[2]);
pmv.glScalef(sceneScale[0], sceneScale[1], sceneScale[2]);
- renderer.updateMatrix(gl);
}
public UIShape getActiveUI() {
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 d8b28c518..5010e2d94 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
@@ -89,13 +89,12 @@ public class UIGLListener01 extends UIListenerBase01 {
final float[] translate = button.getTranslate();
final RegionRenderer regionRenderer = getRegionRenderer();
- final PMVMatrix pmv = regionRenderer.getMatrix();
+ final PMVMatrix pmv = regionRenderer.getMatrixMutable();
pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmv.glLoadIdentity();
pmv.glTranslatef(getXTran(), getYTran(), getZoom());
pmv.glRotatef(getAngle(), 0, 1, 0);
pmv.glTranslatef(translate[0], translate[1], 0);
- regionRenderer.updateMatrix(gl);
button.drawShape(gl, regionRenderer, sampleCount);
}
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIListenerBase01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIListenerBase01.java
index 6c192e37d..21a2b079d 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIListenerBase01.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIListenerBase01.java
@@ -119,7 +119,7 @@ public abstract class UIListenerBase01 implements GLEventListener {
GL2ES2 gl = drawable.getGL().getGL2ES2();
gl.glViewport(xstart, ystart, width, height);
- rRenderer.reshapePerspective(gl, 45.0f, width, height, 0.1f, 7000.0f);
+ rRenderer.reshapePerspective(45.0f, width, height, 0.1f, 7000.0f);
dumpMatrix();
}
@@ -208,12 +208,12 @@ public abstract class UIListenerBase01 implements GLEventListener {
public void mousePressed(MouseEvent e) {
button.setLabelColor(0.8f,0.8f,0.8f);
- button.setColor(0.1f, 0.1f, 0.1f);
+ button.setColor(0.1f, 0.1f, 0.1f, 1.0f);
}
public void mouseReleased(MouseEvent e) {
button.setLabelColor(1.0f,1.0f,1.0f);
- button.setColor(0.6f,0.6f,0.6f);
+ button.setColor(0.6f,0.6f,0.6f, 1.0f);
}
public void mouseMoved(MouseEvent e) {
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UINewtDemo01.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UINewtDemo01.java
index 031d43e79..2c444d47e 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UINewtDemo01.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UINewtDemo01.java
@@ -39,7 +39,6 @@ import com.jogamp.newt.event.WindowAdapter;
import com.jogamp.newt.event.WindowEvent;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.util.Animator;
-import com.jogamp.opengl.util.glsl.ShaderState;
/** Demonstrate the rendering of multiple outlines into one region/OutlineShape
* These Outlines are not necessary connected or contained.
@@ -64,7 +63,7 @@ public class UINewtDemo01 {
window.setPosition(10, 10);
window.setSize(800, 400);
window.setTitle("GPU UI Newt Demo 01");
- RenderState rs = RenderState.createRenderState(new ShaderState(), SVertex.factory());
+ RenderState rs = RenderState.createRenderState(SVertex.factory());
UIGLListener01 uiGLListener = new UIGLListener01 (rs, DEBUG, TRACE);
uiGLListener.attachInputListenerTo(window);
window.addGLEventListener(uiGLListener);
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIShape.java b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIShape.java
index 58c237e8c..bca60494b 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIShape.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/demos/ui/UIShape.java
@@ -32,10 +32,7 @@ import java.util.ArrayList;
import javax.media.nativewindow.NativeWindowException;
import javax.media.opengl.GL2ES2;
-import jogamp.graph.geom.plane.AffineTransform;
-
import com.jogamp.graph.curve.OutlineShape;
-import com.jogamp.graph.curve.OutlineShapeXForm;
import com.jogamp.graph.curve.Region;
import com.jogamp.graph.curve.opengl.GLRegion;
import com.jogamp.graph.curve.opengl.RegionRenderer;
@@ -54,11 +51,9 @@ public abstract class UIShape {
private final Factory<? extends Vertex> vertexFactory;
- protected final ArrayList<OutlineShapeXForm> shapes;
-
protected static final int DIRTY_SHAPE = 1 << 0 ;
- protected static final int DIRTY_REGION = 1 << 2 ;
- protected int dirty = DIRTY_SHAPE | DIRTY_REGION;
+ protected int dirty = DIRTY_SHAPE;
+ protected float shapesSharpness = OutlineShape.DEFAULT_SHARPNESS;
protected final AABBox box;
protected final float[] translate = new float[] { 0f, 0f, 0f };
@@ -66,12 +61,11 @@ public abstract class UIShape {
protected final float[] rotOrigin = new float[] { 0f, 0f, 0f };
protected final float[] scale = new float[] { 1f, 1f, 1f };
- protected final float[] shapeTranslate2D = new float[] { 0f, 0f };
- protected final float[] shapeScale2D = new float[] { 1f, 1f };
- private GLRegion region = null;
+ protected GLRegion region = null;
+ protected int regionQuality = 99;
- protected final float[] color = {0.6f, 0.6f, 0.6f};
- protected final float[] selectedColor = {0.8f, 0.8f, 0.8f};
+ protected final float[] rgbaColor = {0.6f, 0.6f, 0.6f, 1.0f};
+ protected final float[] selectedRGBAModulate = {1.4f, 1.4f, 1.4f, 1.0f};
private boolean down = false;
private boolean toggle =false;
@@ -81,7 +75,6 @@ public abstract class UIShape {
public UIShape(Factory<? extends Vertex> factory) {
this.vertexFactory = factory;
- this.shapes = new ArrayList<OutlineShapeXForm>();
this.box = new AABBox();
}
@@ -97,7 +90,6 @@ public abstract class UIShape {
*/
public void clear(GL2ES2 gl, RegionRenderer renderer) {
clearImpl(gl, renderer);
- shapes.clear();
translate[0] = 0f;
translate[1] = 0f;
translate[2] = 0f;
@@ -108,12 +100,8 @@ public abstract class UIShape {
scale[0] = 1f;
scale[1] = 1f;
scale[2] = 1f;
- shapeTranslate2D[0] = 0f;
- shapeTranslate2D[1] = 0f;
- shapeScale2D[0] = 1f;
- shapeScale2D[1] = 1f;
box.reset();
- dirty = DIRTY_SHAPE | DIRTY_REGION;
+ dirty = DIRTY_SHAPE;
}
/**
@@ -123,7 +111,6 @@ public abstract class UIShape {
*/
public void destroy(GL2ES2 gl, RegionRenderer renderer) {
destroyImpl(gl, renderer);
- shapes.clear();
translate[0] = 0f;
translate[1] = 0f;
translate[2] = 0f;
@@ -134,12 +121,8 @@ public abstract class UIShape {
scale[0] = 1f;
scale[1] = 1f;
scale[2] = 1f;
- shapeTranslate2D[0] = 0f;
- shapeTranslate2D[1] = 0f;
- shapeScale2D[0] = 1f;
- shapeScale2D[1] = 1f;
box.reset();
- dirty = DIRTY_SHAPE | DIRTY_REGION;
+ dirty = DIRTY_SHAPE;
}
public void setTranslate(float tx, float ty, float tz) {
@@ -174,42 +157,17 @@ public abstract class UIShape {
}
public final float[] getScale() { return scale; }
- public final void translateShape(float tx, float ty) {
- shapeTranslate2D[0] += tx;
- shapeTranslate2D[1] += ty;
- }
- public final void scaleShape(float sx, float sy) {
- shapeScale2D[0] *= sx;
- shapeScale2D[1] *= sy;
- }
-
public final void markDirty() {
- dirty = DIRTY_SHAPE | DIRTY_REGION;
+ dirty = DIRTY_SHAPE;
}
public final boolean isShapeDirty() {
return 0 != ( dirty & DIRTY_SHAPE ) ;
}
- public final boolean isRegionDirty() {
- return 0 != ( dirty & DIRTY_REGION ) ;
- }
-
- public ArrayList<OutlineShapeXForm> getShapes() { return shapes; }
-
public final AABBox getBounds() { return box; }
public GLRegion getRegion(GL2ES2 gl, RegionRenderer renderer) {
validate(gl, renderer);
- if( isRegionDirty() ) {
- if( null == region ) {
- region = GLRegion.create(renderer.getRenderModes());
- } else {
- region.clear(gl, renderer);
- }
- addToRegion(region);
- dirty &= ~DIRTY_REGION;
- // System.err.println("XXX.UIShape: updated: "+region);
- }
return region;
}
@@ -223,85 +181,93 @@ public abstract class UIShape {
* @param sampleCount
*/
public void drawShape(GL2ES2 gl, RegionRenderer renderer, int[] sampleCount) {
- final float[] _color;
+ final float r, g, b, a;
+ final boolean isSelect;
if( isPressed() || toggle ) {
- _color = selectedColor;
+ isSelect = true;
+ r = rgbaColor[0]*selectedRGBAModulate[0];
+ g = rgbaColor[1]*selectedRGBAModulate[1];
+ b = rgbaColor[2]*selectedRGBAModulate[2];
+ a = rgbaColor[3]*selectedRGBAModulate[3];
} else {
- _color = color;
-
+ isSelect = false;
+ r = rgbaColor[0];
+ g = rgbaColor[1];
+ b = rgbaColor[2];
+ a = rgbaColor[3];
}
+
if( renderer.getRenderState().isHintMaskSet(RenderState.BITHINT_BLENDING_ENABLED) ) {
- gl.glClearColor(_color[0], _color[1], _color[2], 0.0f);
+ gl.glClearColor(r, g, b, 0.0f);
}
- renderer.setColorStatic(gl, _color[0], _color[1], _color[2]);
+ final RenderState rs = renderer.getRenderState();
+ if( Region.hasColorChannel( renderer.getRenderModes() ) ) {
+ if( isSelect ) {
+ rs.setColorStatic(selectedRGBAModulate[0], selectedRGBAModulate[1], selectedRGBAModulate[2], selectedRGBAModulate[3]);
+ } else {
+ rs.setColorStatic(1.0f, 1.0f, 1.0f, 1.0f);
+ }
+ } else {
+ rs.setColorStatic(r, g, b, a);
+ }
getRegion(gl, renderer).draw(gl, renderer, sampleCount);
}
public final boolean validate(GL2ES2 gl, RegionRenderer renderer) {
if( isShapeDirty() ) {
- shapes.clear();
box.reset();
- createShape(gl, renderer);
+ if( null == region ) {
+ region = GLRegion.create(renderer.getRenderModes());
+ } else {
+ region.clear(gl, renderer);
+ }
+ addShapeToRegion(gl, renderer);
if( DRAW_DEBUG_BOX ) {
- shapes.clear();
+ region.clear(gl, renderer);
final OutlineShape shape = new OutlineShape(renderer.getRenderState().getVertexFactory());
- shapes.add(new OutlineShapeXForm(createDebugOutline(shape, box), null));
+ shape.setSharpness(shapesSharpness);
+ shape.setIsQuadraticNurbs();
+ region.addOutlineShape(shape, null, rgbaColor);
}
+ region.setQuality(regionQuality);
dirty &= ~DIRTY_SHAPE;
- dirty |= DIRTY_REGION;
+ return true;
+ } else {
return false;
}
- return true;
}
- private final void addToRegion(Region region) {
- final boolean hasLocTrans = 0f != shapeTranslate2D[0] || 0f != shapeTranslate2D[1];
- final boolean hasLocScale = 1f != shapeScale2D[0] || 1f != shapeScale2D[1];
- final AffineTransform t;
- if( hasLocScale || hasLocTrans ) {
- // System.err.printf("UIShape.addToRegion: locTranslate %f x %f, locScale %f x %f%n",
- // shapeTranslate[0], shapeTranslate[1], shapeScale[0], shapeScale[1]);
- t = new AffineTransform();
- if( hasLocTrans ) {
- t.translate(shapeTranslate2D[0], shapeTranslate2D[1]);
- }
- if( hasLocScale ) {
- t.scale(shapeScale2D[0], shapeScale2D[1]);
- }
- } else {
- t = null;
- }
- final int shapeCount = shapes.size();
- for(int i=0; i<shapeCount; i++) {
- final OutlineShapeXForm tshape = shapes.get(i);
- final AffineTransform t2;
- if( null != tshape.t ) {
- if( null != t ) {
- t2 = new AffineTransform(t).concatenate(tshape.t);
- } else {
- t2 = tshape.t;
- }
- } else {
- t2 = t;
- }
- region.addOutlineShape(tshape.shape, t2);
- }
+ public float[] getColor() {
+ return rgbaColor;
}
- public float[] getColor() {
- return color;
+ public final int getQuality() { return regionQuality; }
+ public final void setQuality(final int q) {
+ this.regionQuality = q;
+ if( null != region ) {
+ region.setQuality(q);
+ }
+ }
+ public final void setSharpness(float sharpness) {
+ this.shapesSharpness = sharpness;
+ dirty = DIRTY_SHAPE;
+ }
+ public final float getSharpness() {
+ return shapesSharpness;
}
- public void setColor(float r, float g, float b) {
- this.color[0] = r;
- this.color[1] = g;
- this.color[2] = b;
+ public final void setColor(float r, float g, float b, float a) {
+ this.rgbaColor[0] = r;
+ this.rgbaColor[1] = g;
+ this.rgbaColor[2] = b;
+ this.rgbaColor[3] = a;
}
- public void setSelectedColor(float r, float g, float b){
- this.selectedColor[0] = r;
- this.selectedColor[1] = g;
- this.selectedColor[2] = b;
+ public final void setSelectedColorMod(float r, float g, float b, float a){
+ this.selectedRGBAModulate[0] = r;
+ this.selectedRGBAModulate[1] = g;
+ this.selectedRGBAModulate[2] = b;
+ this.selectedRGBAModulate[3] = a;
}
public String toString() {
@@ -443,7 +409,7 @@ public abstract class UIShape {
protected abstract void clearImpl(GL2ES2 gl, RegionRenderer renderer);
protected abstract void destroyImpl(GL2ES2 gl, RegionRenderer renderer);
- protected abstract void createShape(GL2ES2 gl, RegionRenderer renderer);
+ protected abstract void addShapeToRegion(GL2ES2 gl, RegionRenderer renderer);
//
//