Browse Source

Issue 801 (#1269)

* Test case for issue #801

* Reset the context with the initial values
Toni Helenius 5 năm trước cách đây
mục cha
commit
867e46190e

+ 120 - 104
jme3-core/src/main/java/com/jme3/renderer/RenderContext.java

@@ -32,7 +32,6 @@
 package com.jme3.renderer;
 
 import com.jme3.material.RenderState;
-import com.jme3.material.RenderState.BlendFunc;
 import com.jme3.math.ColorRGBA;
 import com.jme3.scene.Mesh;
 import com.jme3.scene.VertexBuffer;
@@ -49,123 +48,123 @@ public class RenderContext {
     /**
      * @see RenderState#setFaceCullMode(com.jme3.material.RenderState.FaceCullMode)
      */
-    public RenderState.FaceCullMode cullMode = RenderState.FaceCullMode.Off;
+    public RenderState.FaceCullMode cullMode;
 
     /**
-     * @see RenderState#setDepthTest(boolean) 
+     * @see RenderState#setDepthTest(boolean)
      */
-    public boolean depthTestEnabled = false;
+    public boolean depthTestEnabled;
 
     /**
-     * @see RenderState#setDepthWrite(boolean) 
+     * @see RenderState#setDepthWrite(boolean)
      */
-    public boolean depthWriteEnabled = true;
+    public boolean depthWriteEnabled;
 
     /**
-     * @see RenderState#setColorWrite(boolean) 
+     * @see RenderState#setColorWrite(boolean)
      */
-    public boolean colorWriteEnabled = true;
+    public boolean colorWriteEnabled;
 
     /**
-     * @see Renderer#setClipRect(int, int, int, int) 
+     * @see Renderer#setClipRect(int, int, int, int)
      */
-    public boolean clipRectEnabled = false;
+    public boolean clipRectEnabled;
 
     /**
-     * @see RenderState#setPolyOffset(float, float) 
+     * @see RenderState#setPolyOffset(float, float)
      */
-    public boolean polyOffsetEnabled = false;
-    
+    public boolean polyOffsetEnabled;
+
     /**
-     * @see RenderState#setPolyOffset(float, float) 
+     * @see RenderState#setPolyOffset(float, float)
      */
-    public float polyOffsetFactor = 0;
-    
+    public float polyOffsetFactor;
+
     /**
-     * @see RenderState#setPolyOffset(float, float) 
+     * @see RenderState#setPolyOffset(float, float)
      */
-    public float polyOffsetUnits = 0;
+    public float polyOffsetUnits;
 
     /**
-     * @see Mesh#setPointSize(float) 
+     * @see Mesh#setPointSize(float)
      */
-    public float pointSize = 1;
-    
+    public float pointSize;
+
     /**
      * @see RenderState#setLineWidth(float)
      */
-    public float lineWidth = 1;
+    public float lineWidth;
 
     /**
-     * @see RenderState#setBlendMode(com.jme3.material.RenderState.BlendMode) 
+     * @see RenderState#setBlendMode(com.jme3.material.RenderState.BlendMode)
      */
-    public RenderState.BlendMode blendMode = RenderState.BlendMode.Off;
+    public RenderState.BlendMode blendMode;
 
     /**
-     * @see RenderState#setBlendEquation(com.jme3.material.RenderState.BlendEquation) 
+     * @see RenderState#setBlendEquation(com.jme3.material.RenderState.BlendEquation)
      */
-    public RenderState.BlendEquation blendEquation = RenderState.BlendEquation.Add;
-    
+    public RenderState.BlendEquation blendEquation;
+
     /**
-     * @see RenderState#setBlendEquationAlpha(com.jme3.material.RenderState.BlendEquationAlpha) 
+     * @see RenderState#setBlendEquationAlpha(com.jme3.material.RenderState.BlendEquationAlpha)
      */
-    public RenderState.BlendEquationAlpha blendEquationAlpha = RenderState.BlendEquationAlpha.InheritColor;
+    public RenderState.BlendEquationAlpha blendEquationAlpha;
 
     /**
      * @see RenderState#setCustomBlendFactors(com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc,
      *      com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc)
      */
-    public RenderState.BlendFunc sfactorRGB = RenderState.BlendFunc.One;
+    public RenderState.BlendFunc sfactorRGB;
 
     /**
      * @see RenderState#setCustomBlendFactors(com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc,
      *      com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc)
      */
-    public RenderState.BlendFunc dfactorRGB = RenderState.BlendFunc.One;
+    public RenderState.BlendFunc dfactorRGB;
 
     /**
      * @see RenderState#setCustomBlendFactors(com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc,
      *      com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc)
      */
-    public RenderState.BlendFunc sfactorAlpha = RenderState.BlendFunc.One;
+    public RenderState.BlendFunc sfactorAlpha;
 
     /**
      * @see RenderState#setCustomBlendFactors(com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc,
      *      com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc)
      */
-    public RenderState.BlendFunc dfactorAlpha = RenderState.BlendFunc.One;
+    public RenderState.BlendFunc dfactorAlpha;
 
     /**
-     * @see RenderState#setWireframe(boolean) 
+     * @see RenderState#setWireframe(boolean)
      */
-    public boolean wireframe = false;
+    public boolean wireframe;
 
     /**
-     * @see Renderer#setShader(com.jme3.shader.Shader) 
+     * @see Renderer#setShader(com.jme3.shader.Shader)
      */
     public int boundShaderProgram;
-    
+
     /**
-     * @see Renderer#setShader(com.jme3.shader.Shader) 
+     * @see Renderer#setShader(com.jme3.shader.Shader)
      */
     public Shader boundShader;
 
     /**
-     * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer) 
+     * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
      */
-    public int boundFBO = 0;
-    
+    public int boundFBO;
+
     /**
-     * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer) 
+     * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
      */
     public FrameBuffer boundFB;
 
     /**
      * Currently bound Renderbuffer
-     * 
-     * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer) 
+     *
+     * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
      */
-    public int boundRB = 0;
+    public int boundRB;
 
     /**
      * Currently bound draw buffer
@@ -174,20 +173,20 @@ public class RenderContext {
      *  0 = GL_COLOR_ATTACHMENT0
      *  n = GL_COLOR_ATTACHMENTn
      *  where n is an integer greater than 1
-     * 
-     * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer) 
-     * @see FrameBuffer#setTargetIndex(int) 
+     *
+     * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
+     * @see FrameBuffer#setTargetIndex(int)
      */
-    public int boundDrawBuf = -1;
+    public int boundDrawBuf;
 
     /**
      * Currently bound read buffer
      *
      * @see RenderContext#boundDrawBuf
-     * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer) 
-     * @see FrameBuffer#setTargetIndex(int) 
+     * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
+     * @see FrameBuffer#setTargetIndex(int)
      */
-    public int boundReadBuf = -1;
+    public int boundReadBuf;
 
     /**
      * Currently bound element array vertex buffer.
@@ -207,118 +206,114 @@ public class RenderContext {
      * @see Renderer#renderMesh(com.jme3.scene.Mesh, int, int, com.jme3.scene.VertexBuffer[]) 
      */
     public int boundArrayVBO;
-    
+
     /**
      * Currently bound pixel pack pixel buffer.
      */
     public int boundPixelPackPBO;
 
-    public int numTexturesSet = 0;
+    public int numTexturesSet;
 
     /**
      * Current bound texture IDs for each texture unit.
-     * 
-     * @see Renderer#setTexture(int, com.jme3.texture.Texture) 
+     *
+     * @see Renderer#setTexture(int, com.jme3.texture.Texture)
      */
-    public Image[] boundTextures = new Image[16];
+    public final Image[] boundTextures = new Image[16];
 
     /**
      * IDList for texture units
-     * 
-     * @see Renderer#setTexture(int, com.jme3.texture.Texture) 
+     *
+     * @see Renderer#setTexture(int, com.jme3.texture.Texture)
      */
-    public IDList textureIndexList = new IDList();
+    public final IDList textureIndexList = new IDList();
 
     /**
      * Currently bound texture unit
-     * 
-     * @see Renderer#setTexture(int, com.jme3.texture.Texture) 
+     *
+     * @see Renderer#setTexture(int, com.jme3.texture.Texture)
      */
-    public int boundTextureUnit = 0;
+    public int boundTextureUnit;
 
     /**
      * Stencil Buffer state
      */
-    public boolean stencilTest = false;
-    public RenderState.StencilOperation frontStencilStencilFailOperation = RenderState.StencilOperation.Keep;
-    public RenderState.StencilOperation frontStencilDepthFailOperation = RenderState.StencilOperation.Keep;
-    public RenderState.StencilOperation frontStencilDepthPassOperation = RenderState.StencilOperation.Keep;
-    public RenderState.StencilOperation backStencilStencilFailOperation = RenderState.StencilOperation.Keep;
-    public RenderState.StencilOperation backStencilDepthFailOperation = RenderState.StencilOperation.Keep;
-    public RenderState.StencilOperation backStencilDepthPassOperation = RenderState.StencilOperation.Keep;
-    public RenderState.TestFunction frontStencilFunction = RenderState.TestFunction.Always;
-    public RenderState.TestFunction backStencilFunction = RenderState.TestFunction.Always;
+    public boolean stencilTest;
+    public RenderState.StencilOperation frontStencilStencilFailOperation;
+    public RenderState.StencilOperation frontStencilDepthFailOperation;
+    public RenderState.StencilOperation frontStencilDepthPassOperation;
+    public RenderState.StencilOperation backStencilStencilFailOperation;
+    public RenderState.StencilOperation backStencilDepthFailOperation;
+    public RenderState.StencilOperation backStencilDepthPassOperation;
+    public RenderState.TestFunction frontStencilFunction;
+    public RenderState.TestFunction backStencilFunction;
 
     /**
      * Vertex attribs currently bound and enabled. If a slot is null, then
      * it is disabled.
      */
-    public VertexBuffer[] boundAttribs = new VertexBuffer[16];
+    public final VertexBuffer[] boundAttribs = new VertexBuffer[16];
 
     /**
      * IDList for vertex attributes
      */
-    public IDList attribIndexList = new IDList();
-    
+    public final IDList attribIndexList = new IDList();
+
     /**
      * depth test function
      */
-    public RenderState.TestFunction depthFunc = RenderState.TestFunction.Less;
-    
+    public RenderState.TestFunction depthFunc;
+
      /**
      * alpha test function
      */
-    public RenderState.TestFunction alphaFunc = RenderState.TestFunction.Greater;
+    public RenderState.TestFunction alphaFunc;
 
     public int initialDrawBuf;
     public int initialReadBuf;
-    
-    public ColorRGBA clearColor = new ColorRGBA(0,0,0,0);
-    
-    /**
-     * Reset the RenderContext to default GL state
-     */
-    public void reset(){
+
+    public ColorRGBA clearColor = new ColorRGBA(0, 0, 0, 0);
+
+    public RenderContext() {
+        init();
+    }
+
+
+    private void init() {
         cullMode = RenderState.FaceCullMode.Off;
         depthTestEnabled = false;
-        depthWriteEnabled = false;
-        colorWriteEnabled = false;
+        depthWriteEnabled = true;
+        colorWriteEnabled = true;
         clipRectEnabled = false;
         polyOffsetEnabled = false;
         polyOffsetFactor = 0;
         polyOffsetUnits = 0;
         pointSize = 1;
+        lineWidth = 1;
         blendMode = RenderState.BlendMode.Off;
         blendEquation = RenderState.BlendEquation.Add;
         blendEquationAlpha = RenderState.BlendEquationAlpha.InheritColor;
-        sfactorRGB = BlendFunc.One;
-        dfactorRGB = BlendFunc.One;
-        sfactorAlpha = BlendFunc.One;
-        dfactorAlpha = BlendFunc.One;
+        sfactorRGB = RenderState.BlendFunc.One;
+        dfactorRGB = RenderState.BlendFunc.One;
+        sfactorAlpha = RenderState.BlendFunc.One;
+        dfactorAlpha = RenderState.BlendFunc.One;
         wireframe = false;
+
         boundShaderProgram = 0;
         boundShader = null;
         boundFBO = 0;
         boundFB = null;
         boundRB = 0;
-        boundDrawBuf = -1; 
+        boundDrawBuf = -1;
         boundReadBuf = -1;
         boundElementArrayVBO = 0;
         boundVertexArray = 0;
         boundArrayVBO = 0;
         boundPixelPackPBO = 0;
         numTexturesSet = 0;
-        for (int i = 0; i < boundTextures.length; i++)
-            boundTextures[i] = null;
-
-        textureIndexList.reset();
         boundTextureUnit = 0;
-        for (int i = 0; i < boundAttribs.length; i++)
-            boundAttribs[i] = null;
-
-        attribIndexList.reset();
-        
         stencilTest = false;
+
         frontStencilStencilFailOperation = RenderState.StencilOperation.Keep;
         frontStencilDepthFailOperation = RenderState.StencilOperation.Keep;
         frontStencilDepthPassOperation = RenderState.StencilOperation.Keep;
@@ -327,9 +322,30 @@ public class RenderContext {
         backStencilDepthPassOperation = RenderState.StencilOperation.Keep;
         frontStencilFunction = RenderState.TestFunction.Always;
         backStencilFunction = RenderState.TestFunction.Always;
-        
-        depthFunc = RenderState.TestFunction.LessOrEqual;    
+
+        depthFunc = RenderState.TestFunction.Less;
         alphaFunc = RenderState.TestFunction.Greater;
-        clearColor.set(0,0,0,0);
+        cullMode = RenderState.FaceCullMode.Off;
+
+        clearColor.set(0, 0, 0, 0);
+    }
+
+    /**
+     * Reset the RenderContext to default GL state
+     */
+    public void reset(){
+        init();
+
+        for (int i = 0; i < boundTextures.length; i++) {
+            boundTextures[i] = null;
+        }
+
+        textureIndexList.reset();
+
+        for (int i = 0; i < boundAttribs.length; i++) {
+            boundAttribs[i] = null;
+        }
+
+        attribIndexList.reset();
     }
 }

+ 87 - 0
jme3-examples/src/main/java/jme3test/renderer/TestIssue801.java

@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2009-2020 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package jme3test.renderer;
+
+import com.jme3.app.SimpleApplication;
+import com.jme3.input.KeyInput;
+import com.jme3.input.controls.ActionListener;
+import com.jme3.input.controls.KeyTrigger;
+import com.jme3.material.Material;
+import com.jme3.math.ColorRGBA;
+import com.jme3.scene.Geometry;
+import com.jme3.scene.shape.Box;
+import com.jme3.system.AppSettings;
+
+public class TestIssue801 extends SimpleApplication {
+
+    public static void main(String[] args) {
+        AppSettings initialSettings = new AppSettings(true);
+        initialSettings.setBitsPerPixel(24);
+
+        TestIssue801 app = new TestIssue801();
+        app.setSettings(initialSettings);
+        app.start();
+    }
+
+    @Override
+    public void simpleInitApp() {
+        viewPort.setBackgroundColor(new ColorRGBA(0.3f, 0.3f, 0.3f, 1f));
+
+        Box b = new Box(1, 1, 1);
+        Geometry geom = new Geometry("Box", b);
+
+        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
+        mat.setColor("Color", ColorRGBA.Blue);
+        geom.setMaterial(mat);
+
+        rootNode.attachChild(geom);
+        inputManager.addMapping("changeBpp", new KeyTrigger(KeyInput.KEY_P));
+        ActionListener listener = new ActionListener() {
+            @Override
+            public void onAction(String name, boolean keyPressed, float tpf) {
+                if (name.equals("changeBpp") && keyPressed) {
+                    goWindowed();
+                }
+            }
+        };
+        inputManager.addListener(listener, "changeBpp");
+    }
+
+    void goWindowed() {
+        AppSettings newSettings = new AppSettings(false);
+        newSettings.copyFrom(settings);
+        newSettings.setBitsPerPixel(16);
+
+        setSettings(newSettings);
+        restart();
+    }
+}