فهرست منبع

Fix #1867 (LightFilter gets applied even if not needed) (#1872)

* Add NullLightFilter.java

* Add usage of null light filter when rendering shadowmaps

* Fix formatting

* Make static NullLightFilter final

* Fix formatting and author
Michael Zuegg 2 سال پیش
والد
کامیت
5d1ee2624b

+ 53 - 0
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) {
+
+    }
+}

+ 8 - 2
jme3-core/src/main/java/com/jme3/shadow/AbstractShadowRenderer.java

@@ -33,6 +33,8 @@ package com.jme3.shadow;
 
 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 @@ import java.util.logging.Logger;
 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 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable,
         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() {

+ 7 - 1
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 @@ import com.jme3.ui.Picture;
  */
 @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 class BasicShadowRenderer implements SceneProcessor {
 
         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);

+ 7 - 2
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 @@ import java.util.List;
  */
 @Deprecated
 public class PssmShadowRenderer implements SceneProcessor {
-
+    private static final LightFilter NULL_LIGHT_FILTER = new NullLightFilter();
     /**
      * <code>FilterMode</code> specifies how shadows are filtered
      * @deprecated use {@link EdgeFilteringMode}
@@ -448,8 +450,11 @@ public class PssmShadowRenderer implements SceneProcessor {
             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;
 

+ 7 - 2
jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowRendererVR.java

@@ -34,6 +34,8 @@ package com.jme3.shadow;
 
 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 @@ import java.util.List;
  * @author Julien Seinturier - COMEX SA - <a href="http://www.seinturier.fr">http://www.seinturier.fr</a>
  */
 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 @@ public abstract class AbstractShadowRendererVR implements SceneProcessor, Savabl
         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;