summaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/jogamp/graph
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2014-04-04 02:30:00 +0200
committerSven Gothel <[email protected]>2014-04-04 02:30:00 +0200
commit9c71f276d1fcc87b69b413847fd1da34b30d0932 (patch)
tree71f738861036221827062450a9d7d4cff5a9f766 /src/jogl/classes/jogamp/graph
parentabc833631e0ab30a06c7aff47a39a551544fd735 (diff)
Bug 801: Cleanup shader-program location/data update ; Add COLORTEXTURE + TextureSequence to Region (Demo: TextureButton)
Cleanup shader-program location/data update - GLUniformData: - Allow lazy data setup, as used for RenderState.ProgramLocal, see below - RenderState - Separate data (pmv, weight, colorStatic) from program-local uniforms -> add class ProgramLocal. Reduces uniform location lookups, since ProgramLocal is bound to Region impl. - ProgramLocal.update(..) needs to write uniform data always, since data is being used in multiple programs! - No 'dirty' tracking possible, removed - see above. - RegionRenderer - Fix shader-selection: 2-pass programs differ from 1-pass! - No shader-setup at init +++ Add COLORTEXTURE + TextureSequence to Region - Create color-texture coords in vertex-shader via region's bounding box (pass-1) - Use color-texture unit in pass-1 if enabled (own shader program) - Use TextureSequence in Region impl. providing all required data (unit + texture-name) - Demo: TextureButton (a UIShape)
Diffstat (limited to 'src/jogl/classes/jogamp/graph')
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java123
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java113
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java94
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/AttributeNames.java1
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/UniformNames.java2
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1-curve_simple.glsl14
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1.vp5
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-single.vp5
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/uniforms.glsl12
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/shader/varyings.glsl4
10 files changed, 284 insertions, 89 deletions
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
index 172bd52c8..33527381d 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
@@ -36,7 +36,6 @@ import javax.media.opengl.GLUniformData;
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.opengl.GLRegion;
import com.jogamp.graph.curve.opengl.RegionRenderer;
import com.jogamp.graph.curve.opengl.RenderState;
@@ -46,16 +45,23 @@ import com.jogamp.opengl.math.FloatUtil;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.util.GLArrayDataServer;
import com.jogamp.opengl.util.glsl.ShaderProgram;
+import com.jogamp.opengl.util.texture.Texture;
+import com.jogamp.opengl.util.texture.TextureSequence;
public class VBORegion2PMSAAES2 extends GLRegion {
private static final boolean DEBUG_FBO_1 = false;
private static final boolean DEBUG_FBO_2 = false;
+ private final RenderState.ProgramLocal rsLocal;
+
// Pass-1:
private GLArrayDataServer gca_VerticesAttr;
private GLArrayDataServer gca_CurveParamsAttr;
private GLArrayDataServer gca_ColorsAttr;
private GLArrayDataServer indicesBuffer;
+ private final GLUniformData gcu_ColorTexUnit;
+ private final float[] colorTexBBox; // x0, y0, x1, y1
+ private final GLUniformData gcu_ColorTexBBox;
private ShaderProgram spPass1 = null;
// Pass-2:
@@ -63,7 +69,6 @@ public class VBORegion2PMSAAES2 extends GLRegion {
private GLArrayDataServer gca_FboTexCoordsAttr;
private GLArrayDataServer indicesFbo;
private final GLUniformData gcu_FboTexUnit;
- private final GLUniformData gcu_FboTexSize;
private final float[] pmvMatrix02 = new float[2*16]; // P + Mv
private final GLUniformData gcu_PMVMatrix02;
private ShaderProgram spPass2 = null;
@@ -76,34 +81,63 @@ public class VBORegion2PMSAAES2 extends GLRegion {
final int[] maxTexSize = new int[] { -1 } ;
+ /**
+ * <p>
+ * Since multiple {@link Region}s may share one
+ * {@link ShaderProgram}, the uniform data must always be updated.
+ * </p>
+ *
+ * @param gl
+ * @param renderer
+ * @param renderModes
+ * @param pass1
+ * @param quality
+ * @param sampleCount
+ */
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();
- renderer.useShaderProgram(gl, renderModes, pass1, quality, sampleCount);
+ final boolean updateLocGlobal = renderer.useShaderProgram(gl, renderModes, pass1, quality, sampleCount);
final ShaderProgram sp = renderer.getRenderState().getShaderProgram();
- final boolean updateLocation;
+ final boolean updateLocLocal;
if( pass1 ) {
- updateLocation = !sp.equals(spPass1);
+ updateLocLocal = !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);
+ if( DEBUG ) {
+ System.err.println("XXX changedSP.p1 updateLocation loc "+updateLocLocal+" / glob "+updateLocGlobal);
+ }
+ if( updateLocLocal ) {
+ rs.updateAttributeLoc(gl, true, gca_VerticesAttr, true);
+ rs.updateAttributeLoc(gl, true, gca_CurveParamsAttr, true);
+ if( null != gca_ColorsAttr ) {
+ rs.updateAttributeLoc(gl, true, gca_ColorsAttr, true);
+ }
+ }
+ rsLocal.update(gl, rs, updateLocLocal, renderModes, true, true);
+ rs.updateUniformLoc(gl, updateLocLocal, gcu_PMVMatrix02, true);
+ if( null != gcu_ColorTexUnit ) {
+ rs.updateUniformLoc(gl, updateLocLocal, gcu_ColorTexUnit, true);
+ rs.updateUniformLoc(gl, updateLocLocal, gcu_ColorTexBBox, true);
}
} else {
- updateLocation = !sp.equals(spPass2);
+ updateLocLocal = !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);
+ if( DEBUG ) {
+ System.err.println("XXX changedSP.p2 updateLocation loc "+updateLocLocal+" / glob "+updateLocGlobal);
+ }
+ if( updateLocLocal ) {
+ rs.updateAttributeLoc(gl, true, gca_FboVerticesAttr, true);
+ rs.updateAttributeLoc(gl, true, gca_FboTexCoordsAttr, true);
+ }
+ rsLocal.update(gl, rs, updateLocLocal, renderModes, false, true);
+ rs.updateUniformDataLoc(gl, updateLocLocal, false /* updateData */, gcu_FboTexUnit, true); // FIXME always update if changing tex-unit
}
}
- public VBORegion2PMSAAES2(final int renderModes, final int textureUnit) {
- super(renderModes);
+ public VBORegion2PMSAAES2(final int renderModes, final TextureSequence colorTexSeq, final int pass2TexUnit) {
+ super(renderModes, colorTexSeq);
+
+ rsLocal = new RenderState.ProgramLocal();
+
final int initialElementCount = 256;
// Pass 1:
@@ -121,14 +155,22 @@ public class VBORegion2PMSAAES2 extends GLRegion {
} else {
gca_ColorsAttr = null;
}
+ if( hasColorTexture() ) {
+ gcu_ColorTexUnit = new GLUniformData(UniformNames.gcu_ColorTexUnit, colorTexSeq.getTextureUnit());
+ colorTexBBox = new float[4];
+ gcu_ColorTexBBox = new GLUniformData(UniformNames.gcu_ColorTexBBox, 4, FloatBuffer.wrap(colorTexBBox));
+ } else {
+ gcu_ColorTexUnit = null;
+ colorTexBBox = null;
+ gcu_ColorTexBBox = null;
+ }
FloatUtil.makeIdentityf(pmvMatrix02, 0);
FloatUtil.makeIdentityf(pmvMatrix02, 16);
gcu_PMVMatrix02 = new GLUniformData(UniformNames.gcu_PMVMatrix02, 4, 4, FloatBuffer.wrap(pmvMatrix02));
// Pass 2:
- gcu_FboTexUnit = new GLUniformData(UniformNames.gcu_FboTexUnit, textureUnit);
- gcu_FboTexSize = new GLUniformData(UniformNames.gcu_FboTexSize, 2, Buffers.newDirectFloatBuffer(2));
+ gcu_FboTexUnit = new GLUniformData(UniformNames.gcu_FboTexUnit, pass2TexUnit);
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);
@@ -208,8 +250,12 @@ public class VBORegion2PMSAAES2 extends GLRegion {
gca_ColorsAttr.seal(gl, true);
gca_ColorsAttr.enableBuffer(gl, false);
}
-
- // update all bbox related data
+ if( null != gcu_ColorTexUnit ) {
+ colorTexBBox[0] = box.getMinX();
+ colorTexBBox[1] = box.getMinY();
+ colorTexBBox[2] = box.getMaxX();
+ colorTexBBox[3] = box.getMaxY();
+ }
gca_FboVerticesAttr.seal(gl, false);
{
final FloatBuffer fb = (FloatBuffer)gca_FboVerticesAttr.getBuffer();
@@ -350,8 +396,6 @@ public class VBORegion2PMSAAES2 extends GLRegion {
private void renderFBO(final GL2ES2 gl, final RenderState rs, final int width, final int height, final int sampleCount) {
gl.glViewport(0, 0, width, height);
- gl.glUniform(gcu_FboTexSize);
-
gl.glActiveTexture(GL.GL_TEXTURE0 + gcu_FboTexUnit.intValue());
fbo.use(gl, fbo.getSamplingSink());
@@ -378,11 +422,6 @@ public class VBORegion2PMSAAES2 extends GLRegion {
if(null == fbo) {
fboWidth = targetFboWidth;
fboHeight = targetFboHeight;
- final FloatBuffer fboTexSize = (FloatBuffer) gcu_FboTexSize.getBuffer();
- {
- fboTexSize.put(0, fboWidth);
- fboTexSize.put(1, fboHeight);
- }
fbo = new FBObject();
fbo.reset(gl, fboWidth, fboHeight, sampleCount[0], false);
sampleCount[0] = fbo.getNumSamples();
@@ -409,11 +448,6 @@ public class VBORegion2PMSAAES2 extends GLRegion {
}
fboWidth = targetFboWidth;
fboHeight = targetFboHeight;
- final FloatBuffer fboTexSize = (FloatBuffer) gcu_FboTexSize.getBuffer();
- {
- fboTexSize.put(0, fboWidth);
- fboTexSize.put(1, fboHeight);
- }
}
fbo.bind(gl);
@@ -434,8 +468,23 @@ public class VBORegion2PMSAAES2 extends GLRegion {
gca_ColorsAttr.enableBuffer(gl, true);
}
indicesBuffer.bindBuffer(gl, true); // keeps VBO binding
-
- gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
+ if( null != gcu_ColorTexUnit ) {
+ final TextureSequence.TextureFrame frame = colorTexSeq.getNextTexture(gl);
+ gl.glActiveTexture(GL.GL_TEXTURE0 + colorTexSeq.getTextureUnit());
+ final Texture tex = frame.getTexture();
+ tex.bind(gl);
+ tex.enable(gl); // nop on core
+ final int colorTexUnit = colorTexSeq.getTextureUnit();
+ if( colorTexUnit != gcu_ColorTexUnit.intValue() ) {
+ gcu_ColorTexUnit.setData(colorTexUnit);
+ gl.glUniform(gcu_ColorTexUnit);
+ }
+ gl.glUniform(gcu_ColorTexBBox); // FIXME: Only if changed!
+ gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
+ tex.disable(gl); // nop on core
+ } else {
+ gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
+ }
indicesBuffer.bindBuffer(gl, false);
if( null != gca_ColorsAttr ) {
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
index a701a4b19..c623eddb7 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
@@ -37,7 +37,6 @@ import jogamp.graph.curve.opengl.shader.AttributeNames;
import jogamp.graph.curve.opengl.shader.UniformNames;
import jogamp.opengl.Debug;
-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;
@@ -49,6 +48,8 @@ import com.jogamp.opengl.math.FloatUtil;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.util.GLArrayDataServer;
import com.jogamp.opengl.util.glsl.ShaderProgram;
+import com.jogamp.opengl.util.texture.Texture;
+import com.jogamp.opengl.util.texture.TextureSequence;
public class VBORegion2PVBAAES2 extends GLRegion {
private static final boolean DEBUG_FBO_1 = false;
@@ -84,11 +85,16 @@ public class VBORegion2PVBAAES2 extends GLRegion {
}
+ private final RenderState.ProgramLocal rsLocal;
+
// Pass-1:
private GLArrayDataServer gca_VerticesAttr;
private GLArrayDataServer gca_CurveParamsAttr;
private GLArrayDataServer gca_ColorsAttr;
private GLArrayDataServer indicesBuffer;
+ private final GLUniformData gcu_ColorTexUnit;
+ private final float[] colorTexBBox; // x0, y0, x1, y1
+ private final GLUniformData gcu_ColorTexBBox;
private ShaderProgram spPass1 = null;
// Pass-2:
@@ -110,34 +116,64 @@ public class VBORegion2PVBAAES2 extends GLRegion {
final int[] maxTexSize = new int[] { -1 } ;
+ /**
+ * <p>
+ * Since multiple {@link Region}s may share one
+ * {@link ShaderProgram}, the uniform data must always be updated.
+ * </p>
+ *
+ * @param gl
+ * @param renderer
+ * @param renderModes
+ * @param pass1
+ * @param quality
+ * @param sampleCount
+ */
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();
- renderer.useShaderProgram(gl, renderModes, pass1, quality, sampleCount);
+ final boolean updateLocGlobal = renderer.useShaderProgram(gl, renderModes, pass1, quality, sampleCount);
final ShaderProgram sp = renderer.getRenderState().getShaderProgram();
- final boolean updateLocation;
+ final boolean updateLocLocal;
if( pass1 ) {
- updateLocation = !sp.equals(spPass1);
+ updateLocLocal = !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);
+ if( DEBUG ) {
+ System.err.println("XXX changedSP.p1 updateLocation loc "+updateLocLocal+" / glob "+updateLocGlobal);
+ }
+ if( updateLocLocal ) {
+ rs.updateAttributeLoc(gl, true, gca_VerticesAttr, true);
+ rs.updateAttributeLoc(gl, true, gca_CurveParamsAttr, true);
+ if( null != gca_ColorsAttr ) {
+ rs.updateAttributeLoc(gl, true, gca_ColorsAttr, true);
+ }
+ }
+ rsLocal.update(gl, rs, updateLocLocal, renderModes, true, true);
+ rs.updateUniformLoc(gl, updateLocLocal, gcu_PMVMatrix02, true);
+ if( null != gcu_ColorTexUnit ) {
+ rs.updateUniformLoc(gl, updateLocLocal, gcu_ColorTexUnit, true);
+ rs.updateUniformLoc(gl, updateLocLocal, gcu_ColorTexBBox, true);
}
} else {
- updateLocation = !sp.equals(spPass2);
+ updateLocLocal = !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);
+ if( DEBUG ) {
+ System.err.println("XXX changedSP.p2 updateLocation loc "+updateLocLocal+" / glob "+updateLocGlobal);
+ }
+ if( updateLocLocal ) {
+ rs.updateAttributeLoc(gl, true, gca_FboVerticesAttr, true);
+ rs.updateAttributeLoc(gl, true, gca_FboTexCoordsAttr, true);
+ }
+ rsLocal.update(gl, rs, updateLocLocal, renderModes, false, true);
+ rs.updateUniformDataLoc(gl, updateLocLocal, false /* updateData */, gcu_FboTexUnit, true); // FIXME always update if changing tex-unit
+ rs.updateUniformLoc(gl, updateLocLocal, gcu_FboTexSize, true);
}
}
- public VBORegion2PVBAAES2(final int renderModes, final int textureUnit) {
- super(renderModes);
+ public VBORegion2PVBAAES2(final int renderModes, final TextureSequence colorTexSeq, final int pass2TexUnit) {
+ super(renderModes, colorTexSeq);
+
+ rsLocal = new RenderState.ProgramLocal();
+
final int initialElementCount = 256;
// Pass 1:
@@ -154,14 +190,23 @@ public class VBORegion2PVBAAES2 extends GLRegion {
} else {
gca_ColorsAttr = null;
}
+ if( hasColorTexture() ) {
+ gcu_ColorTexUnit = new GLUniformData(UniformNames.gcu_ColorTexUnit, colorTexSeq.getTextureUnit());
+ colorTexBBox = new float[4];
+ gcu_ColorTexBBox = new GLUniformData(UniformNames.gcu_ColorTexBBox, 4, FloatBuffer.wrap(colorTexBBox));
+ } else {
+ gcu_ColorTexUnit = null;
+ colorTexBBox = null;
+ gcu_ColorTexBBox = null;
+ }
FloatUtil.makeIdentityf(pmvMatrix02, 0);
FloatUtil.makeIdentityf(pmvMatrix02, 16);
gcu_PMVMatrix02 = new GLUniformData(UniformNames.gcu_PMVMatrix02, 4, 4, FloatBuffer.wrap(pmvMatrix02));
// Pass 2:
- gcu_FboTexUnit = new GLUniformData(UniformNames.gcu_FboTexUnit, textureUnit);
- gcu_FboTexSize = new GLUniformData(UniformNames.gcu_FboTexSize, 2, Buffers.newDirectFloatBuffer(2));
+ gcu_FboTexUnit = new GLUniformData(UniformNames.gcu_FboTexUnit, pass2TexUnit);
+ gcu_FboTexSize = new GLUniformData(UniformNames.gcu_FboTexSize, 2, FloatBuffer.wrap(new float[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);
@@ -250,8 +295,12 @@ public class VBORegion2PVBAAES2 extends GLRegion {
gca_ColorsAttr.seal(gl, true);
gca_ColorsAttr.enableBuffer(gl, false);
}
-
- // update all bbox related data
+ if( null != gcu_ColorTexUnit ) {
+ colorTexBBox[0] = box.getMinX();
+ colorTexBBox[1] = box.getMinY();
+ colorTexBBox[2] = box.getMaxX();
+ colorTexBBox[3] = box.getMaxY();
+ }
gca_FboVerticesAttr.seal(gl, false);
{
final FloatBuffer fb = (FloatBuffer)gca_FboVerticesAttr.getBuffer();
@@ -537,14 +586,30 @@ public class VBORegion2PVBAAES2 extends GLRegion {
private void renderRegion(final GL2ES2 gl) {
gl.glUniform(gcu_PMVMatrix02);
+
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, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
+ if( null != gcu_ColorTexUnit ) {
+ final TextureSequence.TextureFrame frame = colorTexSeq.getNextTexture(gl);
+ gl.glActiveTexture(GL.GL_TEXTURE0 + colorTexSeq.getTextureUnit());
+ final Texture tex = frame.getTexture();
+ tex.bind(gl);
+ tex.enable(gl); // nop on core
+ final int colorTexUnit = colorTexSeq.getTextureUnit();
+ if( colorTexUnit != gcu_ColorTexUnit.intValue() ) {
+ gcu_ColorTexUnit.setData(colorTexUnit);
+ gl.glUniform(gcu_ColorTexUnit);
+ }
+ gl.glUniform(gcu_ColorTexBBox); // FIXME: Only if changed!
+ gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
+ tex.disable(gl); // nop on core
+ } else {
+ gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
+ }
indicesBuffer.bindBuffer(gl, false);
if( null != gca_ColorsAttr ) {
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
index 8268394dd..0ec139a0f 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
@@ -27,26 +27,41 @@
*/
package 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.shader.AttributeNames;
+import jogamp.graph.curve.opengl.shader.UniformNames;
+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.opengl.util.GLArrayDataServer;
import com.jogamp.opengl.util.glsl.ShaderProgram;
+import com.jogamp.opengl.util.texture.Texture;
+import com.jogamp.opengl.util.texture.TextureSequence;
public class VBORegionSPES2 extends GLRegion {
+ private final RenderState.ProgramLocal rsLocal;
+
private GLArrayDataServer gca_VerticesAttr = null;
private GLArrayDataServer gca_CurveParamsAttr = null;
private GLArrayDataServer gca_ColorsAttr;
private GLArrayDataServer indicesBuffer = null;
+ private final GLUniformData gcu_ColorTexUnit;
+ private final float[] colorTexBBox; // x0, y0, x1, y1
+ private final GLUniformData gcu_ColorTexBBox;
private ShaderProgram spPass1 = null;
- public VBORegionSPES2(final int renderModes) {
- super(renderModes);
+ public VBORegionSPES2(final int renderModes, final TextureSequence colorTexSeq) {
+ super(renderModes, colorTexSeq);
+
+ rsLocal = new RenderState.ProgramLocal();
+
final int initialElementCount = 256;
indicesBuffer = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, initialElementCount, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER);
@@ -62,6 +77,15 @@ public class VBORegionSPES2 extends GLRegion {
} else {
gca_ColorsAttr = null;
}
+ if( hasColorTexture() ) {
+ gcu_ColorTexUnit = new GLUniformData(UniformNames.gcu_ColorTexUnit, colorTexSeq.getTextureUnit());
+ colorTexBBox = new float[4];
+ gcu_ColorTexBBox = new GLUniformData(UniformNames.gcu_ColorTexBBox, 4, FloatBuffer.wrap(colorTexBBox));
+ } else {
+ gcu_ColorTexUnit = null;
+ colorTexBBox = null;
+ gcu_ColorTexBBox = null;
+ }
}
@Override
@@ -117,8 +141,6 @@ public class VBORegionSPES2 extends GLRegion {
@Override
protected void updateImpl(final GL2ES2 gl) {
// seal buffers
- indicesBuffer.seal(gl, true);
- indicesBuffer.enableBuffer(gl, false);
gca_VerticesAttr.seal(gl, true);
gca_VerticesAttr.enableBuffer(gl, false);
gca_CurveParamsAttr.seal(gl, true);
@@ -127,6 +149,14 @@ public class VBORegionSPES2 extends GLRegion {
gca_ColorsAttr.seal(gl, true);
gca_ColorsAttr.enableBuffer(gl, false);
}
+ if( null != gcu_ColorTexUnit ) {
+ colorTexBBox[0] = box.getMinX();
+ colorTexBBox[1] = box.getMinY();
+ colorTexBBox[2] = box.getMaxX();
+ colorTexBBox[3] = box.getMaxY();
+ }
+ indicesBuffer.seal(gl, true);
+ indicesBuffer.enableBuffer(gl, false);
if(DEBUG_INSTANCE) {
System.err.println("VBORegionSPES2 idx "+indicesBuffer);
System.err.println("VBORegionSPES2 ver "+gca_VerticesAttr);
@@ -134,22 +164,37 @@ public class VBORegionSPES2 extends GLRegion {
}
}
+ /**
+ * <p>
+ * Since multiple {@link Region}s may share one
+ * {@link ShaderProgram}, the uniform data must always be updated.
+ * </p>
+ *
+ * @param gl
+ * @param renderer
+ * @param renderModes
+ * @param quality
+ */
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 boolean updateLocGlobal = renderer.useShaderProgram(gl, renderModes, true, quality, 0);
final ShaderProgram sp = renderer.getRenderState().getShaderProgram();
- final boolean updateLocation = !sp.equals(spPass1);
+ final boolean updateLocLocal = !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);
- }
if( DEBUG ) {
- System.err.println("XXX changedSP.p1 "+updateLocation+" / "+updateLocation0);
+ System.err.println("XXX changedSP.p1 updateLocation loc "+updateLocLocal+" / glob "+updateLocGlobal);
+ }
+ if( updateLocLocal ) {
+ rs.updateAttributeLoc(gl, true, gca_VerticesAttr, true);
+ rs.updateAttributeLoc(gl, true, gca_CurveParamsAttr, true);
+ if( null != gca_ColorsAttr ) {
+ rs.updateAttributeLoc(gl, true, gca_ColorsAttr, true);
+ }
+ }
+ rsLocal.update(gl, rs, updateLocLocal, renderModes, true, true);
+ if( null != gcu_ColorTexUnit ) {
+ rs.updateUniformLoc(gl, updateLocLocal, gcu_ColorTexUnit, true);
+ rs.updateUniformLoc(gl, updateLocLocal, gcu_ColorTexBBox, true);
}
}
@@ -171,8 +216,23 @@ public class VBORegionSPES2 extends GLRegion {
gca_ColorsAttr.enableBuffer(gl, true);
}
indicesBuffer.bindBuffer(gl, true); // keeps VBO binding
-
- gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
+ if( null != gcu_ColorTexUnit ) {
+ final TextureSequence.TextureFrame frame = colorTexSeq.getNextTexture(gl);
+ gl.glActiveTexture(GL.GL_TEXTURE0 + colorTexSeq.getTextureUnit());
+ final Texture tex = frame.getTexture();
+ tex.bind(gl);
+ tex.enable(gl); // nop on core
+ final int colorTexUnit = colorTexSeq.getTextureUnit();
+ if( colorTexUnit != gcu_ColorTexUnit.intValue() ) {
+ gcu_ColorTexUnit.setData(colorTexUnit);
+ gl.glUniform(gcu_ColorTexUnit);
+ }
+ gl.glUniform(gcu_ColorTexBBox); // FIXME: Only if changed!
+ gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
+ tex.disable(gl); // nop on core
+ } else {
+ gl.glDrawElements(GL2ES2.GL_TRIANGLES, indicesBuffer.getElementCount() * indicesBuffer.getComponentCount(), GL2ES2.GL_UNSIGNED_SHORT, 0);
+ }
indicesBuffer.bindBuffer(gl, false);
if( null != gca_ColorsAttr ) {
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 b2c73a2e4..dff536645 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/AttributeNames.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/AttributeNames.java
@@ -44,6 +44,7 @@ public class AttributeNames {
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 f37025516..7244851ff 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/UniformNames.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/UniformNames.java
@@ -4,6 +4,8 @@ public class UniformNames {
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_Weight = "gcu_Weight";
+ public static final String gcu_ColorTexUnit = "gcu_ColorTexUnit";
+ public static final String gcu_ColorTexBBox = "gcu_ColorTexBBox";
public static final String gcu_PMVMatrix02 = "gcu_PMVMatrix02"; // gcu_PMVMatrix[3]; // P, Mv, and Mvi
public static final String gcu_FboTexUnit = "gcu_FboTexUnit";
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
index 373e8d575..83b312a0b 100644
--- 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
@@ -1,7 +1,11 @@
if( gcv_CurveParam.x == 0.0 && gcv_CurveParam.y == 0.0 ) {
// pass-1: Lines
-#ifdef USE_COLOR_CHANNEL
+#if defined(USE_COLOR_TEXTURE) && defined(USE_COLOR_CHANNEL)
+ mgl_FragColor = texture2D(gcu_ColorTexUnit, gcv_ColorTexCoord.st) * gcv_Color * gcu_ColorStatic;
+#elif defined(USE_COLOR_TEXTURE)
+ mgl_FragColor = texture2D(gcu_ColorTexUnit, gcv_ColorTexCoord.st) * gcu_ColorStatic;
+#elif defined(USE_COLOR_CHANNEL)
mgl_FragColor = gcv_Color * gcu_ColorStatic;
#else
mgl_FragColor = gcu_ColorStatic;
@@ -17,7 +21,13 @@
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
+#if defined(USE_COLOR_TEXTURE) && defined(USE_COLOR_CHANNEL)
+ vec4 t = texture2D(gcu_ColorTexUnit, gcv_ColorTexCoord.st);
+ mgl_FragColor = vec4(t.rgb * gcv_Color.rgb * gcu_ColorStatic.rgb, t.a * gcv_Color.a * gcu_ColorStatic.a * a);
+#elif defined(USE_COLOR_TEXTURE)
+ vec4 t = texture2D(gcu_ColorTexUnit, gcv_ColorTexCoord.st);
+ mgl_FragColor = vec4(t.rgb * gcu_ColorStatic.rgb, t.a * gcu_ColorStatic.a * a);
+#elif defined(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);
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
index 46729cfd0..c6ed4ca58 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1.vp
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-pass1.vp
@@ -11,7 +11,6 @@
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;
@@ -24,6 +23,10 @@ void main(void)
gcv_CurveParam = gca_CurveParams;
}
#endif
+#ifdef USE_COLOR_TEXTURE
+ vec2 dim = vec2(gcu_ColorTexBBox.z - gcu_ColorTexBBox.x, gcu_ColorTexBBox.w - gcu_ColorTexBBox.y);
+ gcv_ColorTexCoord = vec2(gca_Vertices.x - gcu_ColorTexBBox.x, gca_Vertices.y - gcu_ColorTexBBox.y) / dim;
+#endif
#ifdef USE_COLOR_CHANNEL
gcv_Color = gca_Colors;
#endif
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
index 7598c23f8..14210be39 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-single.vp
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/curverenderer01-single.vp
@@ -11,7 +11,6 @@
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;
@@ -24,6 +23,10 @@ void main(void)
gcv_CurveParam = gca_CurveParams;
}
#endif
+#ifdef USE_COLOR_TEXTURE
+ vec2 dim = vec2(gcu_ColorTexBBox.z - gcu_ColorTexBBox.x, gcu_ColorTexBBox.w - gcu_ColorTexBBox.y);
+ gcv_ColorTexCoord = vec2(gca_Vertices.x - gcu_ColorTexBBox.x, gca_Vertices.y - gcu_ColorTexBBox.y) / dim;
+#endif
#ifdef USE_COLOR_CHANNEL
gcv_Color = gca_Colors;
#endif
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 848c26819..ae7fa8490 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/uniforms.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/uniforms.glsl
@@ -6,6 +6,11 @@ uniform mat4 gcu_PMVMatrix01[3]; // P, Mv, and Mvi
uniform vec4 gcu_ColorStatic;
uniform float gcu_Weight;
+#ifdef USE_COLOR_TEXTURE
+ uniform sampler2D gcu_ColorTexUnit;
+ uniform vec4 gcu_ColorTexBBox;
+#endif
+
uniform mat4 gcu_PMVMatrix02[3]; // P, Mv, and Mvi
uniform sampler2D gcu_FboTexUnit;
@@ -14,11 +19,4 @@ uniform sampler2D gcu_FboTexUnit;
*/
uniform vec2 gcu_FboTexSize;
-// const int MAX_TEXTURE_UNITS = 8; // <= gl_MaxTextureImageUnits
-// const int MAX_LIGHTS = 8;
-// uniform mat3 gcu_NormalMatrix; // transpose(inverse(ModelView)).3x3
-// uniform int gcu_ColorEnabled;
-// uniform int gcu_TexCoordEnabled[MAX_TEXTURE_UNITS];
-// uniform int gcu_CullFace;
-
#endif // uniforms_glsl
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 2054c9c21..265ab6915 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/shader/varyings.glsl
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/shader/varyings.glsl
@@ -6,6 +6,10 @@ varying vec3 gcv_CurveParam;
varying vec2 gcv_FboTexCoord;
+#ifdef USE_COLOR_TEXTURE
+ varying vec2 gcv_ColorTexCoord;
+#endif
+
#ifdef USE_COLOR_CHANNEL
varying vec4 gcv_Color;
#endif