Merge pull request #605 from JavaSaBr/add_cloneable_support_to_shadow_renderers_and_filters
Add cloneable support to shadow renderers and filters
This commit is contained in:
commit
4fbe5ec84d
@ -45,6 +45,8 @@ import com.jme3.renderer.RenderManager;
|
||||
import com.jme3.renderer.ViewPort;
|
||||
import com.jme3.renderer.queue.RenderQueue;
|
||||
import com.jme3.texture.FrameBuffer;
|
||||
import com.jme3.util.clone.Cloner;
|
||||
import com.jme3.util.clone.JmeCloneable;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@ -55,7 +57,7 @@ import java.io.IOException;
|
||||
*
|
||||
* @author Rémy Bouquet aka Nehon
|
||||
*/
|
||||
public abstract class AbstractShadowFilter<T extends AbstractShadowRenderer> extends Filter {
|
||||
public abstract class AbstractShadowFilter<T extends AbstractShadowRenderer> extends Filter implements Cloneable, JmeCloneable {
|
||||
|
||||
protected T shadowRenderer;
|
||||
protected ViewPort viewPort;
|
||||
@ -303,17 +305,31 @@ public abstract class AbstractShadowFilter<T extends AbstractShadowRenderer> ext
|
||||
return shadowRenderer.getEdgeFilteringMode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractShadowFilter<T> jmeClone() {
|
||||
try {
|
||||
return (AbstractShadowFilter<T>) super.clone();
|
||||
} catch (final CloneNotSupportedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cloneFields(final Cloner cloner, final Object original) {
|
||||
material = cloner.clone(material);
|
||||
shadowRenderer = cloner.clone(shadowRenderer);
|
||||
shadowRenderer.setPostShadowMaterial(material);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(JmeExporter ex) throws IOException {
|
||||
super.write(ex);
|
||||
OutputCapsule oc = ex.getCapsule(this);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(JmeImporter im) throws IOException {
|
||||
super.read(im);
|
||||
InputCapsule ic = im.getCapsule(this);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -45,7 +45,6 @@ import com.jme3.math.Vector2f;
|
||||
import com.jme3.math.Vector3f;
|
||||
import com.jme3.post.SceneProcessor;
|
||||
import com.jme3.renderer.Camera;
|
||||
import com.jme3.renderer.Caps;
|
||||
import com.jme3.renderer.RenderManager;
|
||||
import com.jme3.renderer.Renderer;
|
||||
import com.jme3.renderer.ViewPort;
|
||||
@ -63,10 +62,13 @@ import com.jme3.texture.Texture.MinFilter;
|
||||
import com.jme3.texture.Texture.ShadowCompareMode;
|
||||
import com.jme3.texture.Texture2D;
|
||||
import com.jme3.ui.Picture;
|
||||
import com.jme3.util.clone.Cloner;
|
||||
import com.jme3.util.clone.JmeCloneable;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* abstract shadow renderer that holds commons feature to have for a shadow
|
||||
@ -74,7 +76,9 @@ import java.util.List;
|
||||
*
|
||||
* @author Rémy Bouquet aka Nehon
|
||||
*/
|
||||
public abstract class AbstractShadowRenderer implements SceneProcessor, Savable {
|
||||
public abstract class AbstractShadowRenderer implements SceneProcessor, Savable, JmeCloneable, Cloneable {
|
||||
|
||||
protected static final Logger logger = Logger.getLogger(AbstractShadowRenderer.class.getName());
|
||||
|
||||
protected int nbShadowMaps = 1;
|
||||
protected float shadowMapSize;
|
||||
@ -678,8 +682,7 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable
|
||||
}
|
||||
|
||||
/**
|
||||
* returns true if the light source bounding box is in the view frustum
|
||||
* @return
|
||||
* @return true if the light source bounding box is in the view frustum
|
||||
*/
|
||||
protected abstract boolean checkCulling(Camera viewCam);
|
||||
|
||||
@ -748,7 +751,6 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable
|
||||
@Deprecated
|
||||
public void setFlushQueues(boolean flushQueues) {}
|
||||
|
||||
|
||||
/**
|
||||
* returns the pre shadows pass render state.
|
||||
* use it to adjust the RenderState parameters of the pre shadow pass.
|
||||
@ -790,13 +792,28 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable
|
||||
return renderBackFacesShadows != null?renderBackFacesShadows:false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object jmeClone() {
|
||||
try {
|
||||
return super.clone();
|
||||
} catch (final CloneNotSupportedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cloneFields(final Cloner cloner, final Object original) {
|
||||
forcedRenderState = cloner.clone(forcedRenderState);
|
||||
init(assetManager, nbShadowMaps, (int) shadowMapSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* De-serialize this instance, for example when loading from a J3O file.
|
||||
*
|
||||
* @param im importer (not null)
|
||||
*/
|
||||
public void read(JmeImporter im) throws IOException {
|
||||
InputCapsule ic = (InputCapsule) im.getCapsule(this);
|
||||
InputCapsule ic = im.getCapsule(this);
|
||||
assetManager = im.getAssetManager();
|
||||
nbShadowMaps = ic.readInt("nbShadowMaps", 1);
|
||||
shadowMapSize = ic.readFloat("shadowMapSize", 0f);
|
||||
@ -815,7 +832,7 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable
|
||||
* @param ex exporter (not null)
|
||||
*/
|
||||
public void write(JmeExporter ex) throws IOException {
|
||||
OutputCapsule oc = (OutputCapsule) ex.getCapsule(this);
|
||||
OutputCapsule oc = ex.getCapsule(this);
|
||||
oc.write(nbShadowMaps, "nbShadowMaps", 1);
|
||||
oc.write(shadowMapSize, "shadowMapSize", 0);
|
||||
oc.write(shadowIntensity, "shadowIntensity", 0.7f);
|
||||
|
@ -46,6 +46,8 @@ import com.jme3.renderer.queue.GeometryList;
|
||||
import com.jme3.renderer.queue.RenderQueue;
|
||||
import com.jme3.scene.Node;
|
||||
import com.jme3.scene.Spatial;
|
||||
import com.jme3.util.clone.Cloner;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
@ -112,8 +114,6 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer {
|
||||
protected void initFrustumCam() {
|
||||
//nothing to do
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* return the light used to cast shadows
|
||||
@ -136,6 +136,11 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer {
|
||||
@Override
|
||||
protected void updateShadowCams(Camera viewCam) {
|
||||
|
||||
if (light == null) {
|
||||
logger.warning("The light can't be null for a " + getClass().getName());
|
||||
return;
|
||||
}
|
||||
|
||||
float zFar = zFarOverride;
|
||||
if (zFar == 0) {
|
||||
zFar = viewCam.getFrustumFar();
|
||||
@ -215,7 +220,7 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer {
|
||||
@Override
|
||||
protected void setMaterialParameters(Material material) {
|
||||
material.setColor("Splits", splits);
|
||||
material.setVector3("LightDir", light.getDirection());
|
||||
material.setVector3("LightDir", light == null ? new Vector3f() : light.getDirection());
|
||||
if (fadeInfo != null) {
|
||||
material.setVector2("FadeInfo", fadeInfo);
|
||||
}
|
||||
@ -248,11 +253,9 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer {
|
||||
public void setLambda(float lambda) {
|
||||
this.lambda = lambda;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* retruns true if stabilization is enabled
|
||||
* @return
|
||||
* @return true if stabilization is enabled
|
||||
*/
|
||||
public boolean isEnabledStabilization() {
|
||||
return stabilize;
|
||||
@ -267,11 +270,18 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer {
|
||||
public void setEnabledStabilization(boolean stabilize) {
|
||||
this.stabilize = stabilize;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void cloneFields(final Cloner cloner, final Object original) {
|
||||
light = cloner.clone(light);
|
||||
init(nbShadowMaps, (int) shadowMapSize);
|
||||
super.cloneFields(cloner, original);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(JmeImporter im) throws IOException {
|
||||
super.read(im);
|
||||
InputCapsule ic = (InputCapsule) im.getCapsule(this);
|
||||
InputCapsule ic = im.getCapsule(this);
|
||||
lambda = ic.readFloat("lambda", 0.65f);
|
||||
zFarOverride = ic.readInt("zFarOverride", 0);
|
||||
light = (DirectionalLight) ic.readSavable("light", null);
|
||||
@ -283,7 +293,7 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer {
|
||||
@Override
|
||||
public void write(JmeExporter ex) throws IOException {
|
||||
super.write(ex);
|
||||
OutputCapsule oc = (OutputCapsule) ex.getCapsule(this);
|
||||
OutputCapsule oc = ex.getCapsule(this);
|
||||
oc.write(lambda, "lambda", 0.65f);
|
||||
oc.write(zFarOverride, "zFarOverride", 0);
|
||||
oc.write(light, "light", null);
|
||||
|
@ -46,6 +46,8 @@ import com.jme3.scene.Geometry;
|
||||
import com.jme3.scene.Node;
|
||||
import com.jme3.scene.Spatial;
|
||||
import com.jme3.util.TempVars;
|
||||
import com.jme3.util.clone.Cloner;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
@ -100,7 +102,8 @@ public class PointLightShadowRenderer extends AbstractShadowRenderer {
|
||||
protected void updateShadowCams(Camera viewCam) {
|
||||
|
||||
if (light == null) {
|
||||
throw new IllegalStateException("The light can't be null for a " + this.getClass().getName());
|
||||
logger.warning("The light can't be null for a " + getClass().getName());
|
||||
return;
|
||||
}
|
||||
|
||||
//bottom
|
||||
@ -171,7 +174,7 @@ public class PointLightShadowRenderer extends AbstractShadowRenderer {
|
||||
|
||||
@Override
|
||||
protected void setMaterialParameters(Material material) {
|
||||
material.setVector3("LightPos", light.getPosition());
|
||||
material.setVector3("LightPos", light == null ? new Vector3f() : light.getPosition());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -197,10 +200,18 @@ public class PointLightShadowRenderer extends AbstractShadowRenderer {
|
||||
this.light = light;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cloneFields(final Cloner cloner, final Object original) {
|
||||
light = cloner.clone(light);
|
||||
init((int) shadowMapSize);
|
||||
frustums = null;
|
||||
super.cloneFields(cloner, original);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(JmeImporter im) throws IOException {
|
||||
super.read(im);
|
||||
InputCapsule ic = (InputCapsule) im.getCapsule(this);
|
||||
InputCapsule ic = im.getCapsule(this);
|
||||
light = (PointLight) ic.readSavable("light", null);
|
||||
init((int) shadowMapSize);
|
||||
}
|
||||
@ -208,7 +219,7 @@ public class PointLightShadowRenderer extends AbstractShadowRenderer {
|
||||
@Override
|
||||
public void write(JmeExporter ex) throws IOException {
|
||||
super.write(ex);
|
||||
OutputCapsule oc = (OutputCapsule) ex.getCapsule(this);
|
||||
OutputCapsule oc = ex.getCapsule(this);
|
||||
oc.write(light, "light", null);
|
||||
}
|
||||
|
||||
@ -218,7 +229,12 @@ public class PointLightShadowRenderer extends AbstractShadowRenderer {
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected boolean checkCulling(Camera viewCam) {
|
||||
protected boolean checkCulling(Camera viewCam) {
|
||||
|
||||
if (light == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Camera cam = viewCam;
|
||||
if(frustumCam != null){
|
||||
cam = frustumCam;
|
||||
|
@ -47,6 +47,8 @@ import com.jme3.renderer.queue.RenderQueue;
|
||||
import com.jme3.scene.Node;
|
||||
import com.jme3.scene.Spatial;
|
||||
import com.jme3.util.TempVars;
|
||||
import com.jme3.util.clone.Cloner;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
@ -123,6 +125,11 @@ public class SpotLightShadowRenderer extends AbstractShadowRenderer {
|
||||
@Override
|
||||
protected void updateShadowCams(Camera viewCam) {
|
||||
|
||||
if (light == null) {
|
||||
logger.warning("The light can't be null for a " + getClass().getName());
|
||||
return;
|
||||
}
|
||||
|
||||
float zFar = zFarOverride;
|
||||
if (zFar == 0) {
|
||||
zFar = viewCam.getFrustumFar();
|
||||
@ -139,7 +146,6 @@ public class SpotLightShadowRenderer extends AbstractShadowRenderer {
|
||||
|
||||
shadowCam.update();
|
||||
shadowCam.updateViewProjection();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -186,11 +192,17 @@ public class SpotLightShadowRenderer extends AbstractShadowRenderer {
|
||||
material.clearParam("LightDir");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void cloneFields(final Cloner cloner, final Object original) {
|
||||
light = cloner.clone(light);
|
||||
init((int) shadowMapSize);
|
||||
super.cloneFields(cloner, original);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(JmeImporter im) throws IOException {
|
||||
super.read(im);
|
||||
InputCapsule ic = (InputCapsule) im.getCapsule(this);
|
||||
InputCapsule ic = im.getCapsule(this);
|
||||
zFarOverride = ic.readInt("zFarOverride", 0);
|
||||
light = (SpotLight) ic.readSavable("light", null);
|
||||
fadeInfo = (Vector2f) ic.readSavable("fadeInfo", null);
|
||||
@ -202,7 +214,7 @@ public class SpotLightShadowRenderer extends AbstractShadowRenderer {
|
||||
@Override
|
||||
public void write(JmeExporter ex) throws IOException {
|
||||
super.write(ex);
|
||||
OutputCapsule oc = (OutputCapsule) ex.getCapsule(this);
|
||||
OutputCapsule oc = ex.getCapsule(this);
|
||||
oc.write(zFarOverride, "zFarOverride", 0);
|
||||
oc.write(light, "light", null);
|
||||
oc.write(fadeInfo, "fadeInfo", null);
|
||||
|
Loading…
x
Reference in New Issue
Block a user