Browse Source

Implemented fixedfunc binding for AlphaTestFallOff
- Made the relvent changes in lwjgl1Renderer
- Changed the check in the lwjglRenderer (note that it's deprecated in opengl 3)
- Removed the test in the OglESRenderer since GL_ALPHA_TEST/GL_ALPHA_FUNC no longer exists in OGLES 2, this must be handled in the fragment shader aka the alphaDiscardThreshold that is coming back in an upcoming commit.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9747 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

rem..om 13 years ago
parent
commit
5111fd8b66

+ 9 - 16
engine/src/android/com/jme3/renderer/android/OGLESShaderRenderer.java

@@ -400,14 +400,7 @@ public class OGLESShaderRenderer implements Renderer {
             GLES20.glDisable(GLES20.GL_DEPTH_TEST);
             GLES20.glDisable(GLES20.GL_DEPTH_TEST);
             context.depthTestEnabled = false;
             context.depthTestEnabled = false;
         }
         }
-        if (state.isAlphaTest() && !context.alphaTestEnabled) {
-//            GLES20.glEnable(GLES20.GL_ALPHA_TEST);
-//           GLES20.glAlphaFunc(GLES20.GL_GREATER, state.getAlphaFallOff());
-            context.alphaTestEnabled = true;
-        } else if (!state.isAlphaTest() && context.alphaTestEnabled) {
-//            GLES20.glDisable(GLES20.GL_ALPHA_TEST);
-            context.alphaTestEnabled = false;
-        }
+        
         if (state.isDepthWrite() && !context.depthWriteEnabled) {
         if (state.isDepthWrite() && !context.depthWriteEnabled) {
             GLES20.glDepthMask(true);
             GLES20.glDepthMask(true);
             context.depthWriteEnabled = true;
             context.depthWriteEnabled = true;
@@ -422,14 +415,14 @@ public class OGLESShaderRenderer implements Renderer {
             GLES20.glColorMask(false, false, false, false);
             GLES20.glColorMask(false, false, false, false);
             context.colorWriteEnabled = false;
             context.colorWriteEnabled = false;
         }
         }
-        if (state.isPointSprite() && !context.pointSprite) {
-//            GLES20.glEnable(GLES20.GL_POINT_SPRITE);
-//            GLES20.glTexEnvi(GLES20.GL_POINT_SPRITE, GLES20.GL_COORD_REPLACE, GLES20.GL_TRUE);
-//            GLES20.glEnable(GLES20.GL_VERTEX_PROGRAM_POINT_SIZE);
-//            GLES20.glPointParameterf(GLES20.GL_POINT_SIZE_MIN, 1.0f);
-        } else if (!state.isPointSprite() && context.pointSprite) {
-//            GLES20.glDisable(GLES20.GL_POINT_SPRITE);
-        }
+//        if (state.isPointSprite() && !context.pointSprite) {
+////            GLES20.glEnable(GLES20.GL_POINT_SPRITE);
+////            GLES20.glTexEnvi(GLES20.GL_POINT_SPRITE, GLES20.GL_COORD_REPLACE, GLES20.GL_TRUE);
+////            GLES20.glEnable(GLES20.GL_VERTEX_PROGRAM_POINT_SIZE);
+////            GLES20.glPointParameterf(GLES20.GL_POINT_SIZE_MIN, 1.0f);
+//        } else if (!state.isPointSprite() && context.pointSprite) {
+////            GLES20.glDisable(GLES20.GL_POINT_SPRITE);
+//        }
 
 
         if (state.isPolyOffset()) {
         if (state.isPolyOffset()) {
             if (!context.polyOffsetEnabled) {
             if (!context.polyOffsetEnabled) {

+ 7 - 1
engine/src/core/com/jme3/material/FixedFuncBinding.java

@@ -76,5 +76,11 @@ public enum FixedFuncBinding {
      * If lighting is disabled, vertex color is modulated with
      * If lighting is disabled, vertex color is modulated with
      * {@link #Color material color}.
      * {@link #Color material color}.
      */
      */
-    UseVertexColor
+    UseVertexColor,
+    
+    /**
+     * Set the alpha threshold to discard pixels.
+     * @see RenderState#setAlphaFallOff
+     */
+    AlphaTestFallOff
 }
 }

+ 2 - 2
engine/src/core/com/jme3/renderer/RenderContext.java

@@ -58,7 +58,7 @@ public class RenderContext {
     /**
     /**
      * @see RenderState#setAlphaTest(boolean) 
      * @see RenderState#setAlphaTest(boolean) 
      */
      */
-    public boolean alphaTestEnabled = false;
+    public float alphaTestFallOff = 0f;
 
 
     /**
     /**
      * @see RenderState#setDepthWrite(boolean) 
      * @see RenderState#setDepthWrite(boolean) 
@@ -271,7 +271,7 @@ public class RenderContext {
     public void reset(){
     public void reset(){
         cullMode = RenderState.FaceCullMode.Off;
         cullMode = RenderState.FaceCullMode.Off;
         depthTestEnabled = false;
         depthTestEnabled = false;
-        alphaTestEnabled = false;
+        alphaTestFallOff = 0f;
         depthWriteEnabled = false;
         depthWriteEnabled = false;
         colorWriteEnabled = false;
         colorWriteEnabled = false;
         clipRectEnabled = false;
         clipRectEnabled = false;

+ 3 - 0
engine/src/core/com/jme3/renderer/RenderManager.java

@@ -500,11 +500,14 @@ public class RenderManager {
         //else the geom is not rendered
         //else the geom is not rendered
         if (forcedTechnique != null) {
         if (forcedTechnique != null) {
             if (g.getMaterial().getMaterialDef().getTechniqueDef(forcedTechnique) != null) {
             if (g.getMaterial().getMaterialDef().getTechniqueDef(forcedTechnique) != null) {
+                RenderState s = forcedRenderState;
+                forcedRenderState = g.getMaterial().getMaterialDef().getTechniqueDef(forcedTechnique).getRenderState();
                 tmpTech = g.getMaterial().getActiveTechnique() != null ? g.getMaterial().getActiveTechnique().getDef().getName() : "Default";
                 tmpTech = g.getMaterial().getActiveTechnique() != null ? g.getMaterial().getActiveTechnique().getDef().getName() : "Default";
                 g.getMaterial().selectTechnique(forcedTechnique, this);
                 g.getMaterial().selectTechnique(forcedTechnique, this);
                 // use geometry's material
                 // use geometry's material
                 g.getMaterial().render(g, this);
                 g.getMaterial().render(g, this);
                 g.getMaterial().selectTechnique(tmpTech, this);
                 g.getMaterial().selectTechnique(tmpTech, this);
+                forcedRenderState = s;
                 //Reverted this part from revision 6197
                 //Reverted this part from revision 6197
                 //If forcedTechnique does not exists, and frocedMaterial is not set, the geom MUST NOT be rendered
                 //If forcedTechnique does not exists, and frocedMaterial is not set, the geom MUST NOT be rendered
             } else if (forcedMaterial != null) {
             } else if (forcedMaterial != null) {

+ 1 - 2
engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java

@@ -225,8 +225,7 @@ public class LwjglGL1Renderer implements GL1Renderer {
         context.useVertexColor = false;
         context.useVertexColor = false;
     }
     }
     
     
-    public void setFixedFuncBinding(FixedFuncBinding ffBinding, Object val) {
-        float falloff;
+        public void setFixedFuncBinding(FixedFuncBinding ffBinding, Object val) {        
         switch (ffBinding) {
         switch (ffBinding) {
             case Color:
             case Color:
                 context.color = (ColorRGBA) val;
                 context.color = (ColorRGBA) val;

+ 16 - 16
engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglRenderer.java

@@ -363,7 +363,7 @@ public class LwjglRenderer implements Renderer {
                 caps.add(Caps.FrameBufferMRT);
                 caps.add(Caps.FrameBufferMRT);
                 logger.log(Level.FINER, "FBO Max MRT renderbuffers: {0}", maxMRTFBOAttachs);
                 logger.log(Level.FINER, "FBO Max MRT renderbuffers: {0}", maxMRTFBOAttachs);
             }
             }
-            
+
 //            if (ctxCaps.GL_ARB_draw_buffers) {
 //            if (ctxCaps.GL_ARB_draw_buffers) {
 //                caps.add(Caps.FrameBufferMRT);
 //                caps.add(Caps.FrameBufferMRT);
 //                glGetInteger(ARBDrawBuffers.GL_MAX_DRAW_BUFFERS_ARB, intBuf16);
 //                glGetInteger(ARBDrawBuffers.GL_MAX_DRAW_BUFFERS_ARB, intBuf16);
@@ -387,7 +387,7 @@ public class LwjglRenderer implements Renderer {
 
 
         logger.log(Level.INFO, "Caps: {0}", caps);
         logger.log(Level.INFO, "Caps: {0}", caps);
     }
     }
-    
+
     public void invalidateState() {
     public void invalidateState() {
         context.reset();
         context.reset();
         boundShader = null;
         boundShader = null;
@@ -486,13 +486,13 @@ public class LwjglRenderer implements Renderer {
             context.depthTestEnabled = false;
             context.depthTestEnabled = false;
         }
         }
 
 
-        if (state.isAlphaTest() && !context.alphaTestEnabled) {
+        if (state.isAlphaTest() && context.alphaTestFallOff == 0) {
             glEnable(GL_ALPHA_TEST);
             glEnable(GL_ALPHA_TEST);
             glAlphaFunc(GL_GREATER, state.getAlphaFallOff());
             glAlphaFunc(GL_GREATER, state.getAlphaFallOff());
-            context.alphaTestEnabled = true;
-        } else if (!state.isAlphaTest() && context.alphaTestEnabled) {
+            context.alphaTestFallOff = state.getAlphaFallOff();
+        } else if (!state.isAlphaTest() && context.alphaTestFallOff != 0) {
             glDisable(GL_ALPHA_TEST);
             glDisable(GL_ALPHA_TEST);
-            context.alphaTestEnabled = false;
+            context.alphaTestFallOff = 0;
         }
         }
 
 
         if (state.isDepthWrite() && !context.depthWriteEnabled) {
         if (state.isDepthWrite() && !context.depthWriteEnabled) {
@@ -1038,14 +1038,14 @@ public class LwjglRenderer implements Renderer {
             // Check if GLSL version is 1.5 for shader
             // Check if GLSL version is 1.5 for shader
             GL30.glBindFragDataLocation(id, 0, "outFragColor");
             GL30.glBindFragDataLocation(id, 0, "outFragColor");
             // For MRT
             // For MRT
-            for(int i = 0 ; i < maxMRTFBOAttachs ; i++) {
+            for (int i = 0; i < maxMRTFBOAttachs; i++) {
                 GL30.glBindFragDataLocation(id, i, "outFragData[" + i + "]");
                 GL30.glBindFragDataLocation(id, i, "outFragData[" + i + "]");
             }
             }
         }
         }
 
 
         // Link shaders to program
         // Link shaders to program
         glLinkProgram(id);
         glLinkProgram(id);
-        
+
         // Check link status
         // Check link status
         glGetProgram(id, GL_LINK_STATUS, intBuf1);
         glGetProgram(id, GL_LINK_STATUS, intBuf1);
         boolean linkOK = intBuf1.get(0) == GL_TRUE;
         boolean linkOK = intBuf1.get(0) == GL_TRUE;
@@ -1097,7 +1097,7 @@ public class LwjglRenderer implements Renderer {
             if (shader.isUpdateNeeded()) {
             if (shader.isUpdateNeeded()) {
                 updateShaderData(shader);
                 updateShaderData(shader);
             }
             }
-            
+
             // NOTE: might want to check if any of the
             // NOTE: might want to check if any of the
             // sources need an update?
             // sources need an update?
 
 
@@ -1149,14 +1149,14 @@ public class LwjglRenderer implements Renderer {
             int srcY0 = 0;
             int srcY0 = 0;
             int srcX1 = 0;
             int srcX1 = 0;
             int srcY1 = 0;
             int srcY1 = 0;
-            
+
             int dstX0 = 0;
             int dstX0 = 0;
             int dstY0 = 0;
             int dstY0 = 0;
             int dstX1 = 0;
             int dstX1 = 0;
             int dstY1 = 0;
             int dstY1 = 0;
-            
+
             int prevFBO = context.boundFBO;
             int prevFBO = context.boundFBO;
-            
+
             if (mainFbOverride != null) {
             if (mainFbOverride != null) {
                 if (src == null) {
                 if (src == null) {
                     src = mainFbOverride;
                     src = mainFbOverride;
@@ -1201,8 +1201,8 @@ public class LwjglRenderer implements Renderer {
                 mask |= GL_DEPTH_BUFFER_BIT;
                 mask |= GL_DEPTH_BUFFER_BIT;
             }
             }
             glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1,
             glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1,
-                                 dstX0, dstY0, dstX1, dstY1, mask,
-                                 GL_NEAREST);
+                    dstX0, dstY0, dstX1, dstY1, mask,
+                    GL_NEAREST);
 
 
 
 
             glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, prevFBO);
             glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, prevFBO);
@@ -1892,10 +1892,10 @@ public class LwjglRenderer implements Renderer {
 
 
         img.clearUpdateNeeded();
         img.clearUpdateNeeded();
     }
     }
-    
+
     public void setTexture(int unit, Texture tex) {
     public void setTexture(int unit, Texture tex) {
         Image image = tex.getImage();
         Image image = tex.getImage();
-        if (image.isUpdateNeeded() || (image.isGeneratedMipmapsRequired() && !image.isMipmapsGenerated()) ) {
+        if (image.isUpdateNeeded() || (image.isGeneratedMipmapsRequired() && !image.isMipmapsGenerated())) {
             updateTexImageData(image, tex.getType(), unit);
             updateTexImageData(image, tex.getType(), unit);
         }
         }