aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/jogamp/java3d/Jogl2es2Context.java1213
-rw-r--r--src/main/java/org/jogamp/java3d/Jogl2es2Pipeline.java76
2 files changed, 684 insertions, 605 deletions
diff --git a/src/main/java/org/jogamp/java3d/Jogl2es2Context.java b/src/main/java/org/jogamp/java3d/Jogl2es2Context.java
index b3f94f4..93bf5f1 100644
--- a/src/main/java/org/jogamp/java3d/Jogl2es2Context.java
+++ b/src/main/java/org/jogamp/java3d/Jogl2es2Context.java
@@ -1,604 +1,609 @@
-/* Copyright (c) 2016 JogAmp Community. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- */
-
-package org.jogamp.java3d;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.jogamp.vecmath.Matrix3d;
-import org.jogamp.vecmath.Matrix4d;
-import org.jogamp.vecmath.Vector3f;
-import org.jogamp.vecmath.Vector4f;
-
-import com.jogamp.opengl.GL2ES2;
-import com.jogamp.opengl.GL2ES3;
-import com.jogamp.opengl.GLContext;
-
-
-public class Jogl2es2Context extends JoglContext
-{
-
- public Jogl2es2Context(GLContext context)
- {
- super(context);
- }
-
- public GL2ES2 gl2es2()
- {
- return context.getGL().getGL2ES2();
- }
-
- public GL2ES3 gl2es3()
- {
- return context.getGL().getGL2ES3();
- }
-
- public JoglShaderObject shaderProgram;
- public int shaderProgramId = -1;
- public ProgramData programData;
-
- @Override
- void setShaderProgram(JoglShaderObject object)
- {
- super.setShaderProgram(object);
- shaderProgram = object;
- shaderProgramId = object == null ? -1 : object.getValue();
- programData = allProgramData.get(shaderProgramId);
- if (programData == null)
- {
- programData = new ProgramData();
- allProgramData.put(shaderProgramId, programData);
- }
-
- }
-
- // all buffers created are recorded for each render pass, and for cleanup
- public ArrayList<GeometryArrayRetained> geoToClearBuffers = new ArrayList<GeometryArrayRetained>();
-
- public SparseArray<GeometryData> allGeometryData = new SparseArray<GeometryData>();
-
- public static class GeometryData
- {
- public int nativeId = -1;
-
- public int geoToIndBuf = -1;
- public int geoToIndBufSize = -1;
- public int[] geoToIndStripBuf = null;
- //public int geoToIndStripSwappedSize = -1;// removed into j3dnotristrips
- public int geoToCoordBuf = -1;
- public int geoToCoordBuf1 = -2;// double buffered for updates
- public int geoToCoordBuf2 = -3;
- public int geoToCoordBuf3 = -3;
- public int geoToCoordBufSize = -1;
- public int geoToColorBuf = -1;
- public int geoToNormalBuf = -1;
- public SparseArray<Integer> geoToTexCoordsBuf = new SparseArray<Integer>();
- public SparseArray<Integer> geoToVertAttribBuf = new SparseArray<Integer>();
-
- //Every thing below relates to interleaved data
- public int coordBufId = -1; // if separate
- public int interleavedBufId = -1;
- public int interleavedStride = 0;
- public int geoToCoordOffset = -1;
- public int geoToColorsOffset = -1;
- public int geoToNormalsOffset = -1;
- public int[] geoToVattrOffset = new int[10];
- public int[] geoToTexCoordOffset = new int[10];
-
- // vertex array object id for this geom
- public int vaoId = -1;
-
- //used to identify each geometry as we see it
- private static int nextNativeId = 0;
-
- public GeometryData()
- {
- nativeId = nextNativeId++;
- nextNativeId = nextNativeId > Integer.MAX_VALUE - 10 ? 0 : nextNativeId;// desperate loop
- }
-
- }
-
- public SparseArray<ProgramData> allProgramData = new SparseArray<ProgramData>();
-
- public static class ProgramData
- {
- public HashMap<String, Integer> progToGenVertAttNameToGenVertAttIndex = new HashMap<String, Integer>();
- public LocationData programToLocationData = null;// null to indicate need to load
- public ByteBuffer programToUBOBB = null;
- public int programToUBOBuf = -1;
- }
-
- public fogData fogData = new fogData();
-
- public glFrontMaterial materialData = new glFrontMaterial();
- // should use getMaximumLights() in pipeline? though it's up to the shader
- public static int MAX_LIGHTS = 32;
- public int maxLights;
- public int numberOfLights;
- public glLightSource[] glLightSource = new glLightSource[MAX_LIGHTS];
-
- //See here http://download.java.net/media/java3d/javadoc/1.3.2/javax/media/j3d/RenderingAttributes.html
- // For coloring implementation details
-
- //only for no lighting, materialDiffuse or vertex colors otherwise
- public Vector4f objectColor = new Vector4f();
-
- public float pointSize = 0;
-
- public int polygonMode = PolygonAttributes.POLYGON_FILL;
-
- public static class RenderingData
- {
- public boolean alphaTestEnabled = false;
- public int alphaTestFunction = RenderingAttributes.ALWAYS;
- public float alphaTestValue = 0;
- public int ignoreVertexColors; //-1 is not set 1,0 bool
- }
-
- public RenderingData renderingData = new RenderingData();
-
- public Vector4f currentAmbientColor = new Vector4f();
-
- public Matrix4d textureTransform = new Matrix4d();
-
- //various ffp matrixes
- public Matrix4d currentModelMat = new Matrix4d();
- public Matrix4d currentViewMat = new Matrix4d();
- public Matrix4d currentModelViewMat = new Matrix4d();
- public Matrix4d currentModelViewMatInverse = new Matrix4d();
- public Matrix4d currentModelViewProjMat = new Matrix4d();
- public Matrix3d currentNormalMat = new Matrix3d();
- public Matrix4d currentProjMat = new Matrix4d();
- public Matrix4d currentProjMatInverse = new Matrix4d();
-
- /**
- * On shader creation the various FFP locations are discovered and recorded for use later
- * @author phil
- *
- */
- public static class LocationData
- {
- //normal uniform data
- public int glProjectionMatrix = -1;
- public int glProjectionMatrixInverse = -1;
- public int glModelMatrix = -1;
- public int glViewMatrix = -1;
- public int glModelViewMatrix = -1;
- public int glModelViewMatrixInverse = -1;
- public int glModelViewProjectionMatrix = -1;
- public int glNormalMatrix = -1;
- public int ignoreVertexColors = -1;
- public int glLightModelambient = -1;
- public int objectColor = -1;
- public int alphaTestEnabled = -1;
- public int alphaTestFunction = -1;
- public int alphaTestValue = -1;
- public int textureTransform = -1;
-
- public fogDataLocs fogData = new fogDataLocs();
-
- public glFrontMaterialLocs glFrontMaterial = new glFrontMaterialLocs();
- public int numberOfLights = -1;
- public glLightSourceLocs[] glLightSource = new glLightSourceLocs[MAX_LIGHTS];
-
- public int glVertex = -1;
- public int glColor = -1;
- public int glNormal = -1;
-
- public int[] glMultiTexCoord = new int[16];
- public SparseArray<Integer> genAttIndexToLoc = new SparseArray<Integer>();
-
- }
-
- /**
- * below here are openGL state tracking to reduce unnecessary native calls
- * Note this is NOT like the "new" or so called current staet above taht needs to be st in the FFP
- * call, this is the old or previously set data, that might not need to be updated
- * @author phil
- *
- */
- public static class GL_State
- {
- public boolean depthBufferEnableOverride;
- public boolean depthBufferEnable;
- public int depthTestFunction;
- public boolean depthBufferWriteEnableOverride;
- public boolean depthBufferWriteEnable;
- public boolean userStencilAvailable;
- public boolean stencilEnable;
- public boolean glDepthMask;
- public boolean glEnableGL_STENCIL_TEST;
- public int stencilFailOp;
- public int stencilZFailOp;
- public int stencilZPassOp;
- public int stencilFunction;
- public int stencilReferenceValue;
- public int stencilCompareMask;
- public int stencilWriteMask;
- public int[] setGLSLUniform1i = new int[500];
- public int[] clearer1 = new int[500];
- public float[] setGLSLUniform1f = new float[500];
- public float[] clearer2 = new float[500];
- public boolean glEnableGL_BLEND;
- public int srcBlendFunction;
- public int dstBlendFunction;
- public int glActiveTexture;
- public int currentProgramId;
- public int[] glBindTextureGL_TEXTURE_2D = new int[35000];// indexed based on current glActiveTexture
- public int[] clearer3 = new int[35000];
- public int cullFace;
- public float polygonOffsetFactor;
- public float polygonOffset;
-
- public int ignoreVertexColors; //-1 indicates not set yet, always set
- public Vector4f glLightModelambient = new Vector4f();
- public Vector4f objectColor = new Vector4f();
- public Matrix4d textureTransform = new Matrix4d();
- public Matrix4d modelMatrix = new Matrix4d();
- public Matrix4d glModelViewMatrix = new Matrix4d();
- public Matrix4d glModelViewMatrixInverse = new Matrix4d();
- public Matrix4d glModelViewProjectionMatrix = new Matrix4d();
- public Matrix3d glNormalMatrix = new Matrix3d();
- public boolean alphaTestEnabled = false;
- public int alphaTestFunction;
- public float alphaTestValue;
-
- public fogData fogData = new fogData();
- public glFrontMaterial glFrontMaterial = new glFrontMaterial();
- public int numberOfLights = -1;
- public glLightSource[] glLightSource = new glLightSource[MAX_LIGHTS];
-
- public void clear()
- {
- depthBufferEnableOverride = false;
- depthBufferEnable = false;
- depthTestFunction = -1;
- depthBufferWriteEnableOverride = false;
- depthBufferWriteEnable = false;
- userStencilAvailable = false;
- stencilEnable = false;
- glDepthMask = false;
- glEnableGL_STENCIL_TEST = false;
- stencilFailOp = -1;
- stencilZFailOp = -1;
- stencilZPassOp = -1;
- stencilFunction = -1;
- stencilReferenceValue = -1;
- stencilCompareMask = -1;
- stencilWriteMask = -1;
- System.arraycopy(clearer1, 0, setGLSLUniform1i, 0, setGLSLUniform1i.length);
- System.arraycopy(clearer2, 0, setGLSLUniform1f, 0, setGLSLUniform1f.length);
- glEnableGL_BLEND = false;
- srcBlendFunction = -1;
- dstBlendFunction = -1;
- glActiveTexture = -1;
- currentProgramId = -1;
- System.arraycopy(clearer3, 0, glBindTextureGL_TEXTURE_2D, 0, glBindTextureGL_TEXTURE_2D.length);
- cullFace = -1;
- polygonOffsetFactor = -1;
- polygonOffset = -1;
- ignoreVertexColors = -1;
- glLightModelambient.set(-999f, -999f, -999f, -999f);
- objectColor.set(-999f, -999f, -999f, -999f);
- textureTransform.setIdentity();
- modelMatrix.setIdentity();
- glModelViewMatrix.setIdentity();
- glModelViewMatrixInverse.setIdentity();
- glModelViewProjectionMatrix.setIdentity();
- glNormalMatrix.setIdentity();
- alphaTestEnabled = false;
- alphaTestFunction = -1;
- alphaTestValue = -99f;
-
- fogData.clear();
- glFrontMaterial.clear();
- for (int i = 0; i < MAX_LIGHTS; i++)
- {
- if (glLightSource[i] != null)
- glLightSource[i].clear();
- }
- }
- }
-
- public GL_State gl_state = new GL_State();
-
- /**
- * program used on last run through of FFP, so nearly like gl_state above, just a desperate attempt
- * to see if the uniform locations have changed even if a new shader is being used
- */
- public int prevShaderProgram;
-
- // The per frame stats
- public Jogl2es2PerFrameStats perFrameStats = new Jogl2es2PerFrameStats();
-
- private int statsFrame = 0;
- private int STATS_OUTPUT_FRAME_FREQ = 50;
-
- public void outputPerFrameData()
- {
- statsFrame++;
- if (statsFrame % STATS_OUTPUT_FRAME_FREQ == 0)
- {
- statsFrame = 0;
- System.out.println("======================================================");
- perFrameStats.outputPerFrameData();
- }
- // clear for next frame
- perFrameStats = new Jogl2es2PerFrameStats();
- perFrameStats.endOfPrevFrameTime = System.nanoTime();
- }
-
- // texture and raster fill variables
-
- // raster vao and buf are not in the by geom bucket because I don't get given geom
- // background has to be created and destroyed
-
- public int simpleTextureShaderProgramId = -1;
- public int simpleTextureShaderProgramVertLoc = -1;
- public int simpleTextureShaderProgramTexCoordLoc = -1;
- public int simpleTextureShaderProgramBaseMapLoc = -1;
-
- // just a singleton of the handy matrix/array operations
- public Jogl2es2MatrixUtil matrixUtil = new Jogl2es2MatrixUtil();
-
- /////////////////////////////////////S H A D E R S T R U C T S /////////////////////////////////////////////////////
-
- // in the shader as follows
- // struct material
- // {
- // int lightEnabled;
- // vec4 ambient;
- // vec4 diffuse;
- // vec4 emission;
- // vec3 specular;
- // float shininess;
- // };
- // uniform material glFrontMaterial;
- public static class glFrontMaterial
- {
- public int lightEnabled = -1;
- public Vector4f ambient = new Vector4f();
- public Vector4f diffuse = new Vector4f();
- public Vector3f emission = new Vector3f();
- public Vector3f specular = new Vector3f();
- public float shininess;
-
- public void clear()
- {
- lightEnabled = -1;
- ambient.set(-999f, -999f, -999f, -999f);
- diffuse.set(-999f, -999f, -999f, -999f);
- emission.set(-999f, -999f, -999f);
- specular.set(-999f, -999f, -999f);
- shininess = -99;
- }
-
- public void set(glFrontMaterial ogfm)
- {
- lightEnabled = ogfm.lightEnabled;
- ambient.set(ogfm.ambient);
- diffuse.set(ogfm.diffuse);
- emission.set(ogfm.emission);
- specular.set(ogfm.specular);
- shininess = ogfm.shininess;
- }
-
- @Override
- public boolean equals(Object o)
- {
- if (o instanceof glFrontMaterial)
- {
- glFrontMaterial ogfm = (glFrontMaterial) o;
- return ogfm.lightEnabled == lightEnabled && ogfm.ambient.equals(ambient) && ogfm.diffuse.equals(diffuse)
- && ogfm.emission.equals(emission) && ogfm.specular.equals(specular) && ogfm.shininess == shininess;
- }
- else
- {
- return false;
- }
- }
- }
-
- public static class glFrontMaterialLocs
- {
- public int lightEnabled = -1;
- public int ambient = -1;
- public int diffuse = -1;
- public int emission = -1;
- public int specular = -1;
- public int shininess = -1;
-
- public boolean present()
- {
- return lightEnabled != -1 || ambient != -1 || diffuse != -1 || emission != -1 || specular != -1 || shininess != -1;
- }
- }
- // struct lightSource
- // {
- // vec4 position;
- // vec4 diffuse;
- // vec4 specular;
- // float constantAttenuation, linearAttenuation, quadraticAttenuation;
- // float spotCutoff, spotExponent;
- // vec3 spotDirection;
- // };
- //
- // uniform int numberOfLights;
- // const int maxLights = 2;
- // uniform lightSource glLightSource[maxLights];
-
- //see https://en.wikibooks.org/wiki/GLSL_Programming/GLUT/Multiple_Lights
- public static class glLightSource
- {
- public int enabled = -1;
- public int prevLightSlot = -1;
- public Vector4f position = new Vector4f();
- //public Vector4f ambient = new Vector4f();//removed as an oddity
- public Vector4f diffuse = new Vector4f();
- public Vector4f specular = new Vector4f();
- public float constantAttenuation;
- public float linearAttenuation;
- public float quadraticAttenuation;
- public float spotCutoff;
- public float spotExponent;
- public Vector3f spotDirection = new Vector3f();
-
- public void clear()
- {
- enabled = -1;
- prevLightSlot = -1;
- position.set(-999f, -999f, -999f, -999f);
- diffuse.set(-999f, -999f, -999f, -999f);
- specular.set(-999f, -999f, -999f, -999f);
- constantAttenuation = -99;
- linearAttenuation = -99;
- quadraticAttenuation = -99;
- spotCutoff = -99;
- spotExponent = -99;
- spotDirection.set(-999f, -999f, -999f);
- }
-
- public void set(glLightSource ogfm)
- {
- enabled = ogfm.enabled;
- prevLightSlot = ogfm.prevLightSlot;
- position.set(ogfm.position);
- diffuse.set(ogfm.diffuse);
- specular.set(ogfm.specular);
- constantAttenuation = ogfm.constantAttenuation;
- linearAttenuation = ogfm.linearAttenuation;
- quadraticAttenuation = ogfm.quadraticAttenuation;
- spotCutoff = ogfm.spotCutoff;
- spotExponent = ogfm.spotExponent;
- spotDirection.set(ogfm.spotDirection);
- }
-
- @Override
- public boolean equals(Object o)
- {
- if (o instanceof glLightSource)
- {
- glLightSource ogfm = (glLightSource) o;
- return enabled == ogfm.enabled && prevLightSlot == ogfm.prevLightSlot && ogfm.position.equals(position)
- && ogfm.diffuse.equals(diffuse) && ogfm.specular.equals(specular) && ogfm.constantAttenuation == constantAttenuation
- && ogfm.linearAttenuation == linearAttenuation && ogfm.quadraticAttenuation == quadraticAttenuation
- && ogfm.spotCutoff == spotCutoff && ogfm.spotExponent == spotExponent && ogfm.spotDirection.equals(spotDirection);
- }
- else
- {
- return false;
- }
- }
- }
-
- public static class glLightSourceLocs
- {
- public int position = -1;
- public int diffuse = -1;
- public int specular = -1;
- public int constantAttenuation = -1;
- public int linearAttenuation = -1;
- public int quadraticAttenuation = -1;
- public int spotCutoff = -1;
- public int spotExponent = -1;
- public int spotDirection = -1;
-
- public boolean present()
- {
- return position != -1 || diffuse != -1 || specular != -1 || constantAttenuation != -1 || linearAttenuation != -1
- || quadraticAttenuation != -1 || spotCutoff != -1 || spotExponent != -1 || spotDirection != -1;
- }
- }
-
- // in the shader as follows
- // struct fogDataStruct
- // {
- // int fogEnabled;
- // vec4 expColor;
- // float expDensity;
- // vec4 linearColor;
- // float linearStart;
- // float linearEnd;
- // };
- // uniform fogDataStruct fogData;
- public static class fogData
- {
- public int fogEnabled = -1;
- public Vector3f expColor = new Vector3f();
- public float expDensity;
- public Vector3f linearColor = new Vector3f();
- public float linearStart;
- public float linearEnd;
-
- public void clear()
- {
- fogEnabled = -1;
- expColor.set(-999f, -999f, -999f);
- expDensity = -99;
- linearColor.set(-999f, -999f, -999f);
- linearStart = -99;
- linearEnd = -99;
- }
-
- public void set(fogData ogfm)
- {
- fogEnabled = ogfm.fogEnabled;
- expColor.set(ogfm.expColor);
- expDensity = ogfm.expDensity;
- linearColor.set(ogfm.linearColor);
- linearStart = ogfm.linearStart;
- linearEnd = ogfm.linearEnd;
- }
-
- @Override
- public boolean equals(Object o)
- {
- if (o instanceof fogData)
- {
- fogData ogfm = (fogData) o;
- return ogfm.fogEnabled == fogEnabled && ogfm.expColor.equals(expColor) && ogfm.expDensity == expDensity
- && ogfm.linearColor.equals(linearColor) && ogfm.linearStart == linearStart && ogfm.linearEnd == linearEnd;
- }
- else
- {
- return false;
- }
- }
- }
-
- public static class fogDataLocs
- {
- public int fogEnabled = -1;
- public int expColor = -1;
- public int expDensity = -1;
- public int linearColor = -1;
- public int linearStart = -1;
- public int linearEnd = -1;
-
- public boolean present()
- {
- return fogEnabled != -1 || expColor != -1 || expDensity != -1 || linearColor != -1 || linearStart != -1 || linearEnd != -1;
- }
- }
-}
+/* Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jogamp.java3d;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.jogamp.vecmath.Matrix3d;
+import org.jogamp.vecmath.Matrix4d;
+import org.jogamp.vecmath.Vector3f;
+import org.jogamp.vecmath.Vector4f;
+
+import com.jogamp.opengl.GL2ES2;
+import com.jogamp.opengl.GL2ES3;
+import com.jogamp.opengl.GLContext;
+
+
+public class Jogl2es2Context extends JoglContext
+{
+
+ public Jogl2es2Context(GLContext context)
+ {
+ super(context);
+ }
+
+ public GL2ES2 gl2es2()
+ {
+ return context.getGL().getGL2ES2();
+ }
+
+ public GL2ES3 gl2es3()
+ {
+ return context.getGL().getGL2ES3();
+ }
+
+ public JoglShaderObject shaderProgram;
+ public int shaderProgramId = -1;
+ public ProgramData programData;
+
+ @Override
+ void setShaderProgram(JoglShaderObject object)
+ {
+ super.setShaderProgram(object);
+ shaderProgram = object;
+ shaderProgramId = object == null ? -1 : object.getValue();
+ programData = allProgramData.get(shaderProgramId);
+ if (programData == null)
+ {
+ programData = new ProgramData();
+ allProgramData.put(shaderProgramId, programData);
+ }
+
+ }
+
+ // all buffers created are recorded for each render pass, and for cleanup
+ public ArrayList<GeometryArrayRetained> geoToClearBuffers = new ArrayList<GeometryArrayRetained>();
+
+ public SparseArray<GeometryData> allGeometryData = new SparseArray<GeometryData>();
+
+ public static class GeometryData
+ {
+ public int nativeId = -1;
+
+ public int geoToIndBuf = -1;
+ public int geoToIndBufSize = -1;
+ public int[] geoToIndStripBuf = null;
+ //public int geoToIndStripSwappedSize = -1;// removed into j3dnotristrips
+ public int geoToCoordBuf = -1;
+ public int geoToCoordBuf1 = -2;// double buffered for updates
+ public int geoToCoordBuf2 = -3;
+ public int geoToCoordBuf3 = -3;
+ public int geoToCoordBufSize = -1;
+ public int geoToColorBuf = -1;
+ public int geoToNormalBuf = -1;
+ public SparseArray<Integer> geoToTexCoordsBuf = new SparseArray<Integer>();
+ public SparseArray<Integer> geoToVertAttribBuf = new SparseArray<Integer>();
+
+ //Every thing below relates to interleaved data
+ public int coordBufId = -1; // if separate
+ public int interleavedBufId = -1;
+ public int interleavedStride = 0;
+ public int geoToCoordOffset = -1;
+ public int geoToColorsOffset = -1;
+ public int geoToNormalsOffset = -1;
+ public int[] geoToVattrOffset = new int[10];
+ public int[] geoToTexCoordOffset = new int[10];
+
+ // vertex array object id for this geom
+ public int vaoId = -1;
+
+ //used to identify each geometry as we see it
+ private static int nextNativeId = 0;
+
+ public GeometryData()
+ {
+ nativeId = nextNativeId++;
+ nextNativeId = nextNativeId > Integer.MAX_VALUE - 10 ? 0 : nextNativeId;// desperate loop
+ }
+
+ }
+
+ public SparseArray<ProgramData> allProgramData = new SparseArray<ProgramData>();
+
+ public static class ProgramData
+ {
+ public HashMap<String, Integer> progToGenVertAttNameToGenVertAttIndex = new HashMap<String, Integer>();
+ public LocationData programToLocationData = null;// null to indicate need to load
+ public ByteBuffer programToUBOBB = null;
+ public int programToUBOBuf = -1;
+ }
+
+ public fogData fogData = new fogData();
+
+ public glFrontMaterial materialData = new glFrontMaterial();
+ // should use getMaximumLights() in pipeline? though it's up to the shader
+ public static int MAX_LIGHTS = 32;
+ public int maxLights;
+ public int numberOfLights;
+ public glLightSource[] glLightSource = new glLightSource[MAX_LIGHTS];
+
+ //See here http://download.java.net/media/java3d/javadoc/1.3.2/javax/media/j3d/RenderingAttributes.html
+ // For coloring implementation details
+
+ //only for no lighting, materialDiffuse or vertex colors otherwise
+ public Vector4f objectColor = new Vector4f();
+
+ public float pointSize = 0;
+
+ public int polygonMode = PolygonAttributes.POLYGON_FILL;
+
+ public static class RenderingData
+ {
+ public boolean alphaTestEnabled = false;
+ public int alphaTestFunction = RenderingAttributes.ALWAYS;
+ public float alphaTestValue = 0;
+ public int ignoreVertexColors; //-1 is not set 1,0 bool
+ }
+
+ public RenderingData renderingData = new RenderingData();
+
+ public float transparencyAlpha = 0;
+
+ public Vector4f currentAmbientColor = new Vector4f();
+
+ public Matrix4d textureTransform = new Matrix4d();
+
+ //various ffp matrixes
+ public Matrix4d currentModelMat = new Matrix4d();
+ public Matrix4d currentViewMat = new Matrix4d();
+ public Matrix4d currentModelViewMat = new Matrix4d();
+ public Matrix4d currentModelViewMatInverse = new Matrix4d();
+ public Matrix4d currentModelViewProjMat = new Matrix4d();
+ public Matrix3d currentNormalMat = new Matrix3d();
+ public Matrix4d currentProjMat = new Matrix4d();
+ public Matrix4d currentProjMatInverse = new Matrix4d();
+
+ /**
+ * On shader creation the various FFP locations are discovered and recorded for use later
+ * @author phil
+ *
+ */
+ public static class LocationData
+ {
+ //normal uniform data
+ public int glProjectionMatrix = -1;
+ public int glProjectionMatrixInverse = -1;
+ public int glModelMatrix = -1;
+ public int glViewMatrix = -1;
+ public int glModelViewMatrix = -1;
+ public int glModelViewMatrixInverse = -1;
+ public int glModelViewProjectionMatrix = -1;
+ public int glNormalMatrix = -1;
+ public int ignoreVertexColors = -1;
+ public int glLightModelambient = -1;
+ public int objectColor = -1;
+ public int transparencyAlpha = -1;
+ public int alphaTestEnabled = -1;
+ public int alphaTestFunction = -1;
+ public int alphaTestValue = -1;
+ public int textureTransform = -1;
+
+ public fogDataLocs fogData = new fogDataLocs();
+
+ public glFrontMaterialLocs glFrontMaterial = new glFrontMaterialLocs();
+ public int numberOfLights = -1;
+ public glLightSourceLocs[] glLightSource = new glLightSourceLocs[MAX_LIGHTS];
+
+ public int glVertex = -1;
+ public int glColor = -1;
+ public int glNormal = -1;
+
+ public int[] glMultiTexCoord = new int[16];
+ public SparseArray<Integer> genAttIndexToLoc = new SparseArray<Integer>();
+
+ }
+
+ /**
+ * below here are openGL state tracking to reduce unnecessary native calls
+ * Note this is NOT like the "new" or so called current staet above taht needs to be st in the FFP
+ * call, this is the old or previously set data, that might not need to be updated
+ * @author phil
+ *
+ */
+ public static class GL_State
+ {
+ public boolean depthBufferEnableOverride;
+ public boolean depthBufferEnable;
+ public int depthTestFunction;
+ public boolean depthBufferWriteEnableOverride;
+ public boolean depthBufferWriteEnable;
+ public boolean userStencilAvailable;
+ public boolean stencilEnable;
+ public boolean glDepthMask;
+ public boolean glEnableGL_STENCIL_TEST;
+ public int stencilFailOp;
+ public int stencilZFailOp;
+ public int stencilZPassOp;
+ public int stencilFunction;
+ public int stencilReferenceValue;
+ public int stencilCompareMask;
+ public int stencilWriteMask;
+ public int[] setGLSLUniform1i = new int[500];
+ public int[] clearer1 = new int[500];
+ public float[] setGLSLUniform1f = new float[500];
+ public float[] clearer2 = new float[500];
+ public boolean glEnableGL_BLEND;
+ public int srcBlendFunction;
+ public int dstBlendFunction;
+ public int glActiveTexture;
+ public int currentProgramId;
+ public int[] glBindTextureGL_TEXTURE_2D = new int[35000];// indexed based on current glActiveTexture
+ public int[] clearer3 = new int[35000];
+ public int cullFace;
+ public float polygonOffsetFactor;
+ public float polygonOffset;
+
+ public int ignoreVertexColors; //-1 indicates not set yet, always set
+ public Vector4f glLightModelambient = new Vector4f();
+ public Vector4f objectColor = new Vector4f();
+ public float transparencyAlpha;
+ public Matrix4d textureTransform = new Matrix4d();
+ public Matrix4d modelMatrix = new Matrix4d();
+ public Matrix4d glModelViewMatrix = new Matrix4d();
+ public Matrix4d glModelViewMatrixInverse = new Matrix4d();
+ public Matrix4d glModelViewProjectionMatrix = new Matrix4d();
+ public Matrix3d glNormalMatrix = new Matrix3d();
+ public boolean alphaTestEnabled = false;
+ public int alphaTestFunction;
+ public float alphaTestValue;
+
+ public fogData fogData = new fogData();
+ public glFrontMaterial glFrontMaterial = new glFrontMaterial();
+ public int numberOfLights = -1;
+ public glLightSource[] glLightSource = new glLightSource[MAX_LIGHTS];
+
+ public void clear()
+ {
+ depthBufferEnableOverride = false;
+ depthBufferEnable = false;
+ depthTestFunction = -1;
+ depthBufferWriteEnableOverride = false;
+ depthBufferWriteEnable = false;
+ userStencilAvailable = false;
+ stencilEnable = false;
+ glDepthMask = false;
+ glEnableGL_STENCIL_TEST = false;
+ stencilFailOp = -1;
+ stencilZFailOp = -1;
+ stencilZPassOp = -1;
+ stencilFunction = -1;
+ stencilReferenceValue = -1;
+ stencilCompareMask = -1;
+ stencilWriteMask = -1;
+ System.arraycopy(clearer1, 0, setGLSLUniform1i, 0, setGLSLUniform1i.length);
+ System.arraycopy(clearer2, 0, setGLSLUniform1f, 0, setGLSLUniform1f.length);
+ glEnableGL_BLEND = false;
+ srcBlendFunction = -1;
+ dstBlendFunction = -1;
+ glActiveTexture = -1;
+ currentProgramId = -1;
+ System.arraycopy(clearer3, 0, glBindTextureGL_TEXTURE_2D, 0, glBindTextureGL_TEXTURE_2D.length);
+ cullFace = -1;
+ polygonOffsetFactor = -1;
+ polygonOffset = -1;
+ ignoreVertexColors = -1;
+ glLightModelambient.set(-999f, -999f, -999f, -999f);
+ objectColor.set(-999f, -999f, -999f, -999f);
+ transparencyAlpha = -1;
+ textureTransform.setIdentity();
+ modelMatrix.setIdentity();
+ glModelViewMatrix.setIdentity();
+ glModelViewMatrixInverse.setIdentity();
+ glModelViewProjectionMatrix.setIdentity();
+ glNormalMatrix.setIdentity();
+ alphaTestEnabled = false;
+ alphaTestFunction = -1;
+ alphaTestValue = -99f;
+
+ fogData.clear();
+ glFrontMaterial.clear();
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (glLightSource[i] != null)
+ glLightSource[i].clear();
+ }
+ }
+ }
+
+ public GL_State gl_state = new GL_State();
+
+ /**
+ * program used on last run through of FFP, so nearly like gl_state above, just a desperate attempt
+ * to see if the uniform locations have changed even if a new shader is being used
+ */
+ public int prevShaderProgram;
+
+ // The per frame stats
+ public Jogl2es2PerFrameStats perFrameStats = new Jogl2es2PerFrameStats();
+
+ private int statsFrame = 0;
+ private int STATS_OUTPUT_FRAME_FREQ = 50;
+
+ public void outputPerFrameData()
+ {
+ statsFrame++;
+ if (statsFrame % STATS_OUTPUT_FRAME_FREQ == 0)
+ {
+ statsFrame = 0;
+ System.out.println("======================================================");
+ perFrameStats.outputPerFrameData();
+ }
+ // clear for next frame
+ perFrameStats = new Jogl2es2PerFrameStats();
+ perFrameStats.endOfPrevFrameTime = System.nanoTime();
+ }
+
+ // texture and raster fill variables
+
+ // raster vao and buf are not in the by geom bucket because I don't get given geom
+ // background has to be created and destroyed
+
+ public int simpleTextureShaderProgramId = -1;
+ public int simpleTextureShaderProgramVertLoc = -1;
+ public int simpleTextureShaderProgramTexCoordLoc = -1;
+ public int simpleTextureShaderProgramBaseMapLoc = -1;
+
+ // just a singleton of the handy matrix/array operations
+ public Jogl2es2MatrixUtil matrixUtil = new Jogl2es2MatrixUtil();
+
+ /////////////////////////////////////S H A D E R S T R U C T S /////////////////////////////////////////////////////
+
+ // in the shader as follows
+ // struct material
+ // {
+ // int lightEnabled;
+ // vec4 ambient;
+ // vec4 diffuse;
+ // vec4 emission;
+ // vec3 specular;
+ // float shininess;
+ // };
+ // uniform material glFrontMaterial;
+ public static class glFrontMaterial
+ {
+ public int lightEnabled = -1;
+ public Vector4f ambient = new Vector4f();
+ public Vector4f diffuse = new Vector4f();
+ public Vector3f emission = new Vector3f();
+ public Vector3f specular = new Vector3f();
+ public float shininess;
+
+ public void clear()
+ {
+ lightEnabled = -1;
+ ambient.set(-999f, -999f, -999f, -999f);
+ diffuse.set(-999f, -999f, -999f, -999f);
+ emission.set(-999f, -999f, -999f);
+ specular.set(-999f, -999f, -999f);
+ shininess = -99;
+ }
+
+ public void set(glFrontMaterial ogfm)
+ {
+ lightEnabled = ogfm.lightEnabled;
+ ambient.set(ogfm.ambient);
+ diffuse.set(ogfm.diffuse);
+ emission.set(ogfm.emission);
+ specular.set(ogfm.specular);
+ shininess = ogfm.shininess;
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (o instanceof glFrontMaterial)
+ {
+ glFrontMaterial ogfm = (glFrontMaterial) o;
+ return ogfm.lightEnabled == lightEnabled && ogfm.ambient.equals(ambient) && ogfm.diffuse.equals(diffuse)
+ && ogfm.emission.equals(emission) && ogfm.specular.equals(specular) && ogfm.shininess == shininess;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+
+ public static class glFrontMaterialLocs
+ {
+ public int lightEnabled = -1;
+ public int ambient = -1;
+ public int diffuse = -1;
+ public int emission = -1;
+ public int specular = -1;
+ public int shininess = -1;
+
+ public boolean present()
+ {
+ return lightEnabled != -1 || ambient != -1 || diffuse != -1 || emission != -1 || specular != -1 || shininess != -1;
+ }
+ }
+ // struct lightSource
+ // {
+ // vec4 position;
+ // vec4 diffuse;
+ // vec4 specular;
+ // float constantAttenuation, linearAttenuation, quadraticAttenuation;
+ // float spotCutoff, spotExponent;
+ // vec3 spotDirection;
+ // };
+ //
+ // uniform int numberOfLights;
+ // const int maxLights = 2;
+ // uniform lightSource glLightSource[maxLights];
+
+ //see https://en.wikibooks.org/wiki/GLSL_Programming/GLUT/Multiple_Lights
+ public static class glLightSource
+ {
+ public int enabled = -1;
+ public int prevLightSlot = -1;
+ public Vector4f position = new Vector4f();
+ //public Vector4f ambient = new Vector4f();//removed as an oddity
+ public Vector4f diffuse = new Vector4f();
+ public Vector4f specular = new Vector4f();
+ public float constantAttenuation;
+ public float linearAttenuation;
+ public float quadraticAttenuation;
+ public float spotCutoff;
+ public float spotExponent;
+ public Vector3f spotDirection = new Vector3f();
+
+ public void clear()
+ {
+ enabled = -1;
+ prevLightSlot = -1;
+ position.set(-999f, -999f, -999f, -999f);
+ diffuse.set(-999f, -999f, -999f, -999f);
+ specular.set(-999f, -999f, -999f, -999f);
+ constantAttenuation = -99;
+ linearAttenuation = -99;
+ quadraticAttenuation = -99;
+ spotCutoff = -99;
+ spotExponent = -99;
+ spotDirection.set(-999f, -999f, -999f);
+ }
+
+ public void set(glLightSource ogfm)
+ {
+ enabled = ogfm.enabled;
+ prevLightSlot = ogfm.prevLightSlot;
+ position.set(ogfm.position);
+ diffuse.set(ogfm.diffuse);
+ specular.set(ogfm.specular);
+ constantAttenuation = ogfm.constantAttenuation;
+ linearAttenuation = ogfm.linearAttenuation;
+ quadraticAttenuation = ogfm.quadraticAttenuation;
+ spotCutoff = ogfm.spotCutoff;
+ spotExponent = ogfm.spotExponent;
+ spotDirection.set(ogfm.spotDirection);
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (o instanceof glLightSource)
+ {
+ glLightSource ogfm = (glLightSource) o;
+ return enabled == ogfm.enabled && prevLightSlot == ogfm.prevLightSlot && ogfm.position.equals(position)
+ && ogfm.diffuse.equals(diffuse) && ogfm.specular.equals(specular) && ogfm.constantAttenuation == constantAttenuation
+ && ogfm.linearAttenuation == linearAttenuation && ogfm.quadraticAttenuation == quadraticAttenuation
+ && ogfm.spotCutoff == spotCutoff && ogfm.spotExponent == spotExponent && ogfm.spotDirection.equals(spotDirection);
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+
+ public static class glLightSourceLocs
+ {
+ public int position = -1;
+ public int diffuse = -1;
+ public int specular = -1;
+ public int constantAttenuation = -1;
+ public int linearAttenuation = -1;
+ public int quadraticAttenuation = -1;
+ public int spotCutoff = -1;
+ public int spotExponent = -1;
+ public int spotDirection = -1;
+
+ public boolean present()
+ {
+ return position != -1 || diffuse != -1 || specular != -1 || constantAttenuation != -1 || linearAttenuation != -1
+ || quadraticAttenuation != -1 || spotCutoff != -1 || spotExponent != -1 || spotDirection != -1;
+ }
+ }
+
+ // in the shader as follows
+ // struct fogDataStruct
+ // {
+ // int fogEnabled;
+ // vec4 expColor;
+ // float expDensity;
+ // vec4 linearColor;
+ // float linearStart;
+ // float linearEnd;
+ // };
+ // uniform fogDataStruct fogData;
+ public static class fogData
+ {
+ public int fogEnabled = -1;
+ public Vector3f expColor = new Vector3f();
+ public float expDensity;
+ public Vector3f linearColor = new Vector3f();
+ public float linearStart;
+ public float linearEnd;
+
+ public void clear()
+ {
+ fogEnabled = -1;
+ expColor.set(-999f, -999f, -999f);
+ expDensity = -99;
+ linearColor.set(-999f, -999f, -999f);
+ linearStart = -99;
+ linearEnd = -99;
+ }
+
+ public void set(fogData ogfm)
+ {
+ fogEnabled = ogfm.fogEnabled;
+ expColor.set(ogfm.expColor);
+ expDensity = ogfm.expDensity;
+ linearColor.set(ogfm.linearColor);
+ linearStart = ogfm.linearStart;
+ linearEnd = ogfm.linearEnd;
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (o instanceof fogData)
+ {
+ fogData ogfm = (fogData) o;
+ return ogfm.fogEnabled == fogEnabled && ogfm.expColor.equals(expColor) && ogfm.expDensity == expDensity
+ && ogfm.linearColor.equals(linearColor) && ogfm.linearStart == linearStart && ogfm.linearEnd == linearEnd;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+
+ public static class fogDataLocs
+ {
+ public int fogEnabled = -1;
+ public int expColor = -1;
+ public int expDensity = -1;
+ public int linearColor = -1;
+ public int linearStart = -1;
+ public int linearEnd = -1;
+
+ public boolean present()
+ {
+ return fogEnabled != -1 || expColor != -1 || expDensity != -1 || linearColor != -1 || linearStart != -1 || linearEnd != -1;
+ }
+ }
+}
diff --git a/src/main/java/org/jogamp/java3d/Jogl2es2Pipeline.java b/src/main/java/org/jogamp/java3d/Jogl2es2Pipeline.java
index 3e2ba74..e3ed085 100644
--- a/src/main/java/org/jogamp/java3d/Jogl2es2Pipeline.java
+++ b/src/main/java/org/jogamp/java3d/Jogl2es2Pipeline.java
@@ -3149,6 +3149,20 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
}
}
+ // always bind object color, the shader can decide to use it if it's no lighting and no vertex colors
+ if (locs.transparencyAlpha != -1)
+ {
+ if (!MINIMISE_NATIVE_CALLS_FFP
+ || (shaderProgramId != ctx.prevShaderProgram || ctx.gl_state.transparencyAlpha != ctx.transparencyAlpha))
+ {
+ gl.glUniform1f(locs.transparencyAlpha, ctx.transparencyAlpha);
+ if (DO_OUTPUT_ERRORS)
+ outputErrors(ctx);
+ if (MINIMISE_NATIVE_CALLS_FFP)
+ ctx.gl_state.transparencyAlpha = ctx.transparencyAlpha;
+ }
+ }
+
// count of enabled lights currentEnabledLights
if (locs.numberOfLights != -1)
{
@@ -3322,6 +3336,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
locs.ignoreVertexColors = gl.glGetUniformLocation(shaderProgramId, "ignoreVertexColors");
locs.glLightModelambient = gl.glGetUniformLocation(shaderProgramId, "glLightModelambient");
locs.objectColor = gl.glGetUniformLocation(shaderProgramId, "objectColor");
+ locs.transparencyAlpha = gl.glGetUniformLocation(shaderProgramId, "transparencyAlpha");
locs.alphaTestEnabled = gl.glGetUniformLocation(shaderProgramId, "alphaTestEnabled");
locs.alphaTestFunction = gl.glGetUniformLocation(shaderProgramId, "alphaTestFunction");
locs.alphaTestValue = gl.glGetUniformLocation(shaderProgramId, "alphaTestValue");
@@ -5301,6 +5316,8 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
GL2ES2 gl = ((Jogl2es2Context) ctx).gl2es2();
Jogl2es2Context joglesctx = ((Jogl2es2Context) ctx);
+ joglesctx.transparencyAlpha = alpha;
+
if ((transparencyMode < TransparencyAttributes.SCREEN_DOOR)
|| ((((geometryType & RenderMolecule.LINE) != 0) || (polygonMode == PolygonAttributes.POLYGON_LINE)) && lineAA)
|| ((((geometryType & RenderMolecule.POINT) != 0) || (polygonMode == PolygonAttributes.POLYGON_POINT)) && pointAA))
@@ -5348,6 +5365,9 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
GL2ES2 gl = ((Jogl2es2Context) ctx).gl2es2();
Jogl2es2Context joglesctx = ((Jogl2es2Context) ctx);
+
+ joglesctx.transparencyAlpha = 1.0f;
+
if (((((geometryType & RenderMolecule.LINE) != 0) || (polygonMode == PolygonAttributes.POLYGON_LINE)) && lineAA)
|| ((((geometryType & RenderMolecule.POINT) != 0) || (polygonMode == PolygonAttributes.POLYGON_POINT)) && pointAA))
{
@@ -7901,7 +7921,61 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
throw new AssertionError("illegal format " + format);
}
- gl.glReadPixels(0, 0, width, height, type, GL.GL_UNSIGNED_BYTE, ByteBuffer.wrap((byte[]) data));
+ ByteBuffer buf = null;
+ if (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY)
+ {
+ buf = ByteBuffer.wrap((byte[]) data);
+ }
+ else
+ {
+ buf = (ByteBuffer) data;
+ }
+
+ gl.glReadPixels(0, 0, width, height, type, GL.GL_UNSIGNED_BYTE, buf);
+ if (DO_OUTPUT_ERRORS)
+ outputErrors(ctx);
+ }
+ else if ((dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY)
+ || (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_BUFFER))
+ {
+ switch (format)
+ {
+ // GL_BGR
+ case ImageComponentRetained.TYPE_INT_BGR:
+ type = GL2.GL_BGR;// not ok
+ break;
+ case ImageComponentRetained.TYPE_INT_RGB:
+ type = GL.GL_RGB;//ok
+ break;
+ case ImageComponentRetained.TYPE_INT_ARGB:
+ type = GL.GL_RGBA;// this a valid case for GL2ES2
+ break;
+
+ /*
+ * This method only supports 3 and 4 components formats and INT
+ * types.
+ */
+ case ImageComponentRetained.TYPE_BYTE_LA:
+ case ImageComponentRetained.TYPE_BYTE_GRAY:
+ case ImageComponentRetained.TYPE_USHORT_GRAY:
+ case ImageComponentRetained.TYPE_BYTE_BGR:
+ case ImageComponentRetained.TYPE_BYTE_RGB:
+ case ImageComponentRetained.TYPE_BYTE_RGBA:
+ default:
+ throw new AssertionError("illegal format " + format);
+ }
+
+ IntBuffer buf = null;
+ if (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY)
+ {
+ buf = IntBuffer.wrap((int[]) data);
+ }
+ else
+ {
+ buf = (IntBuffer) data;
+ }
+
+ gl.glReadPixels(0, 0, width, height, type, GL.GL_UNSIGNED_BYTE, buf);
if (DO_OUTPUT_ERRORS)
outputErrors(ctx);
}