diff --git a/jme3-core/src/main/java/com/jme3/light/BasicProbeBlendingStrategy.java b/jme3-core/src/main/java/com/jme3/light/BasicProbeBlendingStrategy.java new file mode 100644 index 000000000..e4c16728a --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/light/BasicProbeBlendingStrategy.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2009-2015 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.scene.Geometry; +import java.util.ArrayList; +import java.util.List; + +/** + * This strategy returns the closest probe from the rendered object. + * + * This is the most basic strategy : The fastest and the easiest. + * Though it has severe graphical draw backs as there might be very visible seams + * on static object and some "poping" on dynamic objects. + * + * @author Nehon + */ +public class BasicProbeBlendingStrategy implements LightProbeBlendingStrategy { + + List lightProbes = new ArrayList(); + + @Override + public void registerProbe(LightProbe probe) { + lightProbes.add(probe); + } + + @Override + public void populateProbes(Geometry g, LightList lightList) { + if (!lightProbes.isEmpty()) { + //The first probe is actually the closest to the geometry since the + //light list is sorted according to the distance to the geom. + LightProbe p = lightProbes.get(0); + if (p.isReady()) { + lightList.add(p); + } + //clearing the list for next pass. + lightProbes.clear(); + } + } + +} diff --git a/jme3-core/src/main/java/com/jme3/light/DefaultLightFilter.java b/jme3-core/src/main/java/com/jme3/light/DefaultLightFilter.java index de4e088da..855f2e49a 100644 --- a/jme3-core/src/main/java/com/jme3/light/DefaultLightFilter.java +++ b/jme3-core/src/main/java/com/jme3/light/DefaultLightFilter.java @@ -43,6 +43,15 @@ public final class DefaultLightFilter implements LightFilter { private Camera camera; private final HashSet processedLights = new HashSet(); + private final LightProbeBlendingStrategy probeBlendStrat; + + public DefaultLightFilter() { + probeBlendStrat = new BasicProbeBlendingStrategy(); + } + + public DefaultLightFilter(LightProbeBlendingStrategy probeBlendStrat) { + this.probeBlendStrat = probeBlendStrat; + } @Override public void setCamera(Camera camera) { @@ -57,7 +66,7 @@ public final class DefaultLightFilter implements LightFilter { TempVars vars = TempVars.get(); try { LightList worldLights = geometry.getWorldLightList(); - boolean probeAdded = false; + for (int i = 0; i < worldLights.size(); i++) { Light light = worldLights.get(i); @@ -86,16 +95,15 @@ public final class DefaultLightFilter implements LightFilter { } if (light.getType() == Light.Type.Probe) { - if (!probeAdded && ((LightProbe)light).isReady()) { - //only adding the first probe (the closest to the geom as lights are sorted by the distance to the geom - probeAdded = true; - filteredLightList.add(light); - } - + probeBlendStrat.registerProbe((LightProbe) light); } else { filteredLightList.add(light); } + } + + probeBlendStrat.populateProbes(geometry, filteredLightList); + } finally { vars.release(); } diff --git a/jme3-core/src/main/java/com/jme3/light/LightProbeBlendingStrategy.java b/jme3-core/src/main/java/com/jme3/light/LightProbeBlendingStrategy.java new file mode 100644 index 000000000..a3a6ac516 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/light/LightProbeBlendingStrategy.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2009-2015 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.scene.Geometry; + +/** + * This is the interface to implement if you want to make your own LightProbe blending strategy. + * The strategy sets the way multiple LightProbes will be handled for a given object. + * + * @author Nehon + */ +public interface LightProbeBlendingStrategy { + + /** + * Registers a probe with this strategy + * @param probe + */ + public void registerProbe(LightProbe probe); + /** + * Populates the resulting light probes into the given light list. + * @param g the geometry for wich the light list is computed + * @param lightList the result light list + */ + public void populateProbes(Geometry g, LightList lightList); +}