From 867e46190ee56cb9c12a0b105933e6b5f94c7894 Mon Sep 17 00:00:00 2001 From: Toni Helenius Date: Tue, 28 Jan 2020 20:35:17 +0200 Subject: [PATCH] Issue 801 (#1269) * Test case for issue #801 * Reset the context with the initial values --- .../java/com/jme3/renderer/RenderContext.java | 224 ++++++++++-------- .../java/jme3test/renderer/TestIssue801.java | 87 +++++++ 2 files changed, 207 insertions(+), 104 deletions(-) create mode 100644 jme3-examples/src/main/java/jme3test/renderer/TestIssue801.java diff --git a/jme3-core/src/main/java/com/jme3/renderer/RenderContext.java b/jme3-core/src/main/java/com/jme3/renderer/RenderContext.java index f7626f1bd..c931531bc 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/RenderContext.java +++ b/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(); } } diff --git a/jme3-examples/src/main/java/jme3test/renderer/TestIssue801.java b/jme3-examples/src/main/java/jme3test/renderer/TestIssue801.java new file mode 100644 index 000000000..0f1893c43 --- /dev/null +++ b/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(); + } +}