diff --git a/jme3-core/src/main/java/com/jme3/light/NullLightFilter.java b/jme3-core/src/main/java/com/jme3/light/NullLightFilter.java new file mode 100644 index 0000000000..55f46d1802 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/light/NullLightFilter.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2009-2022 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 com.jme3.light; + +import com.jme3.renderer.Camera; +import com.jme3.scene.Geometry; +/** + * NullLightFilter does nothing. Used when you want + * to disable the light filter + * + * @author Michael Zuegg + */ +public class NullLightFilter implements LightFilter { + @Override + public void setCamera(Camera camera) { + + } + + @Override + public void filterLights(Geometry geometry, LightList filteredLightList) { + + } +} diff --git a/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowRenderer.java b/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowRenderer.java index 384630b521..65cb39bc30 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowRenderer.java +++ b/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowRenderer.java @@ -33,6 +33,8 @@ import com.jme3.asset.AssetManager; import com.jme3.export.*; +import com.jme3.light.LightFilter; +import com.jme3.light.NullLightFilter; import com.jme3.material.Material; import com.jme3.material.RenderState; import com.jme3.math.ColorRGBA; @@ -77,7 +79,7 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable, JmeCloneable, Cloneable { protected static final Logger logger = Logger.getLogger(AbstractShadowRenderer.class.getName()); - + private static final LightFilter NULL_LIGHT_FILTER = new NullLightFilter(); protected int nbShadowMaps = 1; protected float shadowMapSize; protected float shadowIntensity = 0.7f; @@ -443,10 +445,14 @@ protected void renderShadowMap(int shadowMapIndex) { renderManager.getRenderer().clearBuffers(true, true, true); renderManager.setForcedRenderState(forcedRenderState); - // render shadow casters to shadow map + // render shadow casters to shadow map and disables the lightfilter + LightFilter tmpLightFilter = renderManager.getLightFilter(); + renderManager.setLightFilter(NULL_LIGHT_FILTER); viewPort.getQueue().renderShadowQueue(shadowMapOccluders, renderManager, shadowCam, true); + renderManager.setLightFilter(tmpLightFilter); renderManager.setForcedRenderState(null); } + boolean debugfrustums = false; public void displayFrustum() { diff --git a/jme3-core/src/main/java/com/jme3/shadow/BasicShadowRenderer.java b/jme3-core/src/main/java/com/jme3/shadow/BasicShadowRenderer.java index dcd49be09a..886abc45ec 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/BasicShadowRenderer.java +++ b/jme3-core/src/main/java/com/jme3/shadow/BasicShadowRenderer.java @@ -32,6 +32,8 @@ package com.jme3.shadow; import com.jme3.asset.AssetManager; +import com.jme3.light.LightFilter; +import com.jme3.light.NullLightFilter; import com.jme3.material.Material; import com.jme3.math.Vector3f; import com.jme3.post.SceneProcessor; @@ -59,7 +61,7 @@ */ @Deprecated public class BasicShadowRenderer implements SceneProcessor { - + private static final LightFilter NULL_LIGHT_FILTER = new NullLightFilter(); private RenderManager renderManager; private ViewPort viewPort; final private FrameBuffer shadowFB; @@ -196,7 +198,11 @@ public void postQueue(RenderQueue rq) { r.setFrameBuffer(shadowFB); r.clearBuffers(true, true, true); + // render shadow casters to shadow map and disables the lightfilter + LightFilter tmpLightFilter = renderManager.getLightFilter(); + renderManager.setLightFilter(NULL_LIGHT_FILTER); viewPort.getQueue().renderShadowQueue(shadowOccluders, renderManager, shadowCam, true); + renderManager.setLightFilter(tmpLightFilter); r.setFrameBuffer(viewPort.getOutputFrameBuffer()); renderManager.setForcedMaterial(null); diff --git a/jme3-core/src/main/java/com/jme3/shadow/PssmShadowRenderer.java b/jme3-core/src/main/java/com/jme3/shadow/PssmShadowRenderer.java index 7612342404..a0d405000b 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/PssmShadowRenderer.java +++ b/jme3-core/src/main/java/com/jme3/shadow/PssmShadowRenderer.java @@ -32,6 +32,8 @@ package com.jme3.shadow; import com.jme3.asset.AssetManager; +import com.jme3.light.LightFilter; +import com.jme3.light.NullLightFilter; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; import com.jme3.math.Matrix4f; @@ -75,7 +77,7 @@ */ @Deprecated public class PssmShadowRenderer implements SceneProcessor { - + private static final LightFilter NULL_LIGHT_FILTER = new NullLightFilter(); /** * FilterMode specifies how shadows are filtered * @deprecated use {@link EdgeFilteringMode} @@ -448,8 +450,11 @@ public void postQueue(RenderQueue rq) { r.setFrameBuffer(shadowFB[i]); r.clearBuffers(true, true, true); - // render shadow casters to shadow map + // render shadow casters to shadow map and disables the lightfilter + LightFilter tmpLightFilter = renderManager.getLightFilter(); + renderManager.setLightFilter(NULL_LIGHT_FILTER); viewPort.getQueue().renderShadowQueue(splitOccluders, renderManager, shadowCam, true); + renderManager.setLightFilter(tmpLightFilter); } debugfrustums = false; diff --git a/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowRendererVR.java b/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowRendererVR.java index 4b545daf29..7338864dd8 100644 --- a/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowRendererVR.java +++ b/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowRendererVR.java @@ -34,6 +34,8 @@ import com.jme3.asset.AssetManager; import com.jme3.export.*; +import com.jme3.light.LightFilter; +import com.jme3.light.NullLightFilter; import com.jme3.material.Material; import com.jme3.material.RenderState; import com.jme3.math.ColorRGBA; @@ -75,7 +77,7 @@ * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public abstract class AbstractShadowRendererVR implements SceneProcessor, Savable { - + private static final LightFilter NULL_LIGHT_FILTER = new NullLightFilter(); protected int nbShadowMaps = 1; protected float shadowMapSize; protected float shadowIntensity = 0.7f; @@ -440,8 +442,11 @@ protected void renderShadowMap(int shadowMapIndex) { renderManager.getRenderer().clearBuffers(true, true, true); renderManager.setForcedRenderState(forcedRenderState); - // render shadow casters to shadow map + // render shadow casters to shadow map and disables the lightfilter + LightFilter tmpLightFilter = renderManager.getLightFilter(); + renderManager.setLightFilter(NULL_LIGHT_FILTER); viewPort.getQueue().renderShadowQueue(shadowMapOccluders, renderManager, shadowCam, true); + renderManager.setLightFilter(tmpLightFilter); renderManager.setForcedRenderState(null); } boolean debugfrustums = false;