Introduced a LightProbeBlendingStrategy, that can be passed to the default light filter upon construction.

It sets how multiple LightProbes will be blended or selected for the final render.
This is meant to be highly customizable as there are already several strategies with pros and cons in the industry and some may arise in the future.
define_list_fix
Nehon 9 years ago
parent fcff7f6933
commit 52154e1cea
  1. 70
      jme3-core/src/main/java/com/jme3/light/BasicProbeBlendingStrategy.java
  2. 22
      jme3-core/src/main/java/com/jme3/light/DefaultLightFilter.java
  3. 55
      jme3-core/src/main/java/com/jme3/light/LightProbeBlendingStrategy.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<LightProbe> lightProbes = new ArrayList<LightProbe>();
@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();
}
}
}

@ -43,6 +43,15 @@ public final class DefaultLightFilter implements LightFilter {
private Camera camera;
private final HashSet<Light> processedLights = new HashSet<Light>();
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();
}

@ -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);
}
Loading…
Cancel
Save