diff --git a/engine/src/android/com/jme3/renderer/android/OGLESShaderRenderer.java b/engine/src/android/com/jme3/renderer/android/OGLESShaderRenderer.java index 84b554ee1..00559e5dc 100644 --- a/engine/src/android/com/jme3/renderer/android/OGLESShaderRenderer.java +++ b/engine/src/android/com/jme3/renderer/android/OGLESShaderRenderer.java @@ -400,14 +400,7 @@ public class OGLESShaderRenderer implements Renderer { GLES20.glDisable(GLES20.GL_DEPTH_TEST); 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) { GLES20.glDepthMask(true); context.depthWriteEnabled = true; @@ -422,14 +415,14 @@ public class OGLESShaderRenderer implements Renderer { GLES20.glColorMask(false, false, false, 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 (!context.polyOffsetEnabled) { diff --git a/engine/src/core/com/jme3/material/FixedFuncBinding.java b/engine/src/core/com/jme3/material/FixedFuncBinding.java index e316ad803..b8235a33e 100644 --- a/engine/src/core/com/jme3/material/FixedFuncBinding.java +++ b/engine/src/core/com/jme3/material/FixedFuncBinding.java @@ -76,5 +76,11 @@ public enum FixedFuncBinding { * If lighting is disabled, vertex color is modulated with * {@link #Color material color}. */ - UseVertexColor + UseVertexColor, + + /** + * Set the alpha threshold to discard pixels. + * @see RenderState#setAlphaFallOff + */ + AlphaTestFallOff } diff --git a/engine/src/core/com/jme3/renderer/RenderContext.java b/engine/src/core/com/jme3/renderer/RenderContext.java index ee9ff9c0f..7b1a12cc3 100644 --- a/engine/src/core/com/jme3/renderer/RenderContext.java +++ b/engine/src/core/com/jme3/renderer/RenderContext.java @@ -58,7 +58,7 @@ public class RenderContext { /** * @see RenderState#setAlphaTest(boolean) */ - public boolean alphaTestEnabled = false; + public float alphaTestFallOff = 0f; /** * @see RenderState#setDepthWrite(boolean) @@ -271,7 +271,7 @@ public class RenderContext { public void reset(){ cullMode = RenderState.FaceCullMode.Off; depthTestEnabled = false; - alphaTestEnabled = false; + alphaTestFallOff = 0f; depthWriteEnabled = false; colorWriteEnabled = false; clipRectEnabled = false; diff --git a/engine/src/core/com/jme3/renderer/RenderManager.java b/engine/src/core/com/jme3/renderer/RenderManager.java index e192c4555..8a337ea96 100644 --- a/engine/src/core/com/jme3/renderer/RenderManager.java +++ b/engine/src/core/com/jme3/renderer/RenderManager.java @@ -500,11 +500,14 @@ public class RenderManager { //else the geom is not rendered if (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"; g.getMaterial().selectTechnique(forcedTechnique, this); // use geometry's material g.getMaterial().render(g, this); g.getMaterial().selectTechnique(tmpTech, this); + forcedRenderState = s; //Reverted this part from revision 6197 //If forcedTechnique does not exists, and frocedMaterial is not set, the geom MUST NOT be rendered } else if (forcedMaterial != null) { diff --git a/engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java b/engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java index 4e12694a1..6030b0c69 100644 --- a/engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java +++ b/engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java @@ -225,8 +225,7 @@ public class LwjglGL1Renderer implements GL1Renderer { context.useVertexColor = false; } - public void setFixedFuncBinding(FixedFuncBinding ffBinding, Object val) { - float falloff; + public void setFixedFuncBinding(FixedFuncBinding ffBinding, Object val) { switch (ffBinding) { case Color: context.color = (ColorRGBA) val; diff --git a/engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglRenderer.java b/engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglRenderer.java index cc51bb958..a2e61d8d0 100644 --- a/engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglRenderer.java +++ b/engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglRenderer.java @@ -363,7 +363,7 @@ public class LwjglRenderer implements Renderer { caps.add(Caps.FrameBufferMRT); logger.log(Level.FINER, "FBO Max MRT renderbuffers: {0}", maxMRTFBOAttachs); } - + // if (ctxCaps.GL_ARB_draw_buffers) { // caps.add(Caps.FrameBufferMRT); // glGetInteger(ARBDrawBuffers.GL_MAX_DRAW_BUFFERS_ARB, intBuf16); @@ -387,7 +387,7 @@ public class LwjglRenderer implements Renderer { logger.log(Level.INFO, "Caps: {0}", caps); } - + public void invalidateState() { context.reset(); boundShader = null; @@ -486,13 +486,13 @@ public class LwjglRenderer implements Renderer { context.depthTestEnabled = false; } - if (state.isAlphaTest() && !context.alphaTestEnabled) { + if (state.isAlphaTest() && context.alphaTestFallOff == 0) { glEnable(GL_ALPHA_TEST); 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); - context.alphaTestEnabled = false; + context.alphaTestFallOff = 0; } if (state.isDepthWrite() && !context.depthWriteEnabled) { @@ -1038,14 +1038,14 @@ public class LwjglRenderer implements Renderer { // Check if GLSL version is 1.5 for shader GL30.glBindFragDataLocation(id, 0, "outFragColor"); // For MRT - for(int i = 0 ; i < maxMRTFBOAttachs ; i++) { + for (int i = 0; i < maxMRTFBOAttachs; i++) { GL30.glBindFragDataLocation(id, i, "outFragData[" + i + "]"); } } // Link shaders to program glLinkProgram(id); - + // Check link status glGetProgram(id, GL_LINK_STATUS, intBuf1); boolean linkOK = intBuf1.get(0) == GL_TRUE; @@ -1097,7 +1097,7 @@ public class LwjglRenderer implements Renderer { if (shader.isUpdateNeeded()) { updateShaderData(shader); } - + // NOTE: might want to check if any of the // sources need an update? @@ -1149,14 +1149,14 @@ public class LwjglRenderer implements Renderer { int srcY0 = 0; int srcX1 = 0; int srcY1 = 0; - + int dstX0 = 0; int dstY0 = 0; int dstX1 = 0; int dstY1 = 0; - + int prevFBO = context.boundFBO; - + if (mainFbOverride != null) { if (src == null) { src = mainFbOverride; @@ -1201,8 +1201,8 @@ public class LwjglRenderer implements Renderer { mask |= GL_DEPTH_BUFFER_BIT; } glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, - dstX0, dstY0, dstX1, dstY1, mask, - GL_NEAREST); + dstX0, dstY0, dstX1, dstY1, mask, + GL_NEAREST); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, prevFBO); @@ -1892,10 +1892,10 @@ public class LwjglRenderer implements Renderer { img.clearUpdateNeeded(); } - + public void setTexture(int unit, Texture tex) { Image image = tex.getImage(); - if (image.isUpdateNeeded() || (image.isGeneratedMipmapsRequired() && !image.isMipmapsGenerated()) ) { + if (image.isUpdateNeeded() || (image.isGeneratedMipmapsRequired() && !image.isMipmapsGenerated())) { updateTexImageData(image, tex.getType(), unit); }