|
@@ -5,6 +5,7 @@
|
|
package com.jme3.post.filters;
|
|
package com.jme3.post.filters;
|
|
|
|
|
|
import com.jme3.asset.AssetManager;
|
|
import com.jme3.asset.AssetManager;
|
|
|
|
+import com.jme3.effect.ParticleEmitter;
|
|
import com.jme3.material.Material;
|
|
import com.jme3.material.Material;
|
|
import com.jme3.math.ColorRGBA;
|
|
import com.jme3.math.ColorRGBA;
|
|
import com.jme3.post.Filter;
|
|
import com.jme3.post.Filter;
|
|
@@ -12,8 +13,14 @@ import com.jme3.renderer.RenderManager;
|
|
import com.jme3.renderer.Renderer;
|
|
import com.jme3.renderer.Renderer;
|
|
import com.jme3.renderer.ViewPort;
|
|
import com.jme3.renderer.ViewPort;
|
|
import com.jme3.renderer.queue.RenderQueue;
|
|
import com.jme3.renderer.queue.RenderQueue;
|
|
|
|
+import com.jme3.scene.Node;
|
|
|
|
+
|
|
|
|
+import com.jme3.scene.Spatial;
|
|
import com.jme3.texture.FrameBuffer;
|
|
import com.jme3.texture.FrameBuffer;
|
|
|
|
+import com.jme3.texture.Texture;
|
|
import com.jme3.texture.Texture2D;
|
|
import com.jme3.texture.Texture2D;
|
|
|
|
+import java.util.logging.Level;
|
|
|
|
+import java.util.logging.Logger;
|
|
|
|
|
|
/**
|
|
/**
|
|
* A filter to handle translucent objects when rendering a scene with filters that uses depth like WaterFilter and SSAOFilter
|
|
* A filter to handle translucent objects when rendering a scene with filters that uses depth like WaterFilter and SSAOFilter
|
|
@@ -22,11 +29,25 @@ import com.jme3.texture.Texture2D;
|
|
*/
|
|
*/
|
|
public final class TranslucentBucketFilter extends Filter {
|
|
public final class TranslucentBucketFilter extends Filter {
|
|
|
|
|
|
|
|
+ private final static Logger logger = Logger.getLogger(TranslucentBucketFilter.class.getName());
|
|
private RenderManager renderManager;
|
|
private RenderManager renderManager;
|
|
|
|
+ private boolean enabledSoftParticles = false;
|
|
|
|
+ private Texture depthTexture;
|
|
|
|
+ private ViewPort viewPort;
|
|
|
|
+
|
|
|
|
+ public TranslucentBucketFilter() {
|
|
|
|
+ super("TranslucentBucketFilter");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public TranslucentBucketFilter(boolean enabledSoftParticles) {
|
|
|
|
+ this();
|
|
|
|
+ this.enabledSoftParticles = enabledSoftParticles;
|
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
@Override
|
|
protected void initFilter(AssetManager manager, RenderManager rm, ViewPort vp, int w, int h) {
|
|
protected void initFilter(AssetManager manager, RenderManager rm, ViewPort vp, int w, int h) {
|
|
this.renderManager = rm;
|
|
this.renderManager = rm;
|
|
|
|
+ this.viewPort = vp;
|
|
material = new Material(manager, "Common/MatDefs/Post/Overlay.j3md");
|
|
material = new Material(manager, "Common/MatDefs/Post/Overlay.j3md");
|
|
material.setColor("Color", ColorRGBA.White);
|
|
material.setColor("Color", ColorRGBA.White);
|
|
Texture2D tex = processor.getFilterTexture();
|
|
Texture2D tex = processor.getFilterTexture();
|
|
@@ -37,6 +58,26 @@ public final class TranslucentBucketFilter extends Filter {
|
|
material.clearParam("NumSamples");
|
|
material.clearParam("NumSamples");
|
|
}
|
|
}
|
|
renderManager.setHandleTranslucentBucket(false);
|
|
renderManager.setHandleTranslucentBucket(false);
|
|
|
|
+ if (enabledSoftParticles && depthTexture != null) {
|
|
|
|
+ initSoftParticles(vp, true);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void initSoftParticles(ViewPort vp, boolean enabledSP) {
|
|
|
|
+ if (depthTexture != null) {
|
|
|
|
+ for (Spatial scene : vp.getScenes()) {
|
|
|
|
+ makeSoftParticleEmitter(scene, enabledSP && enabled);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ protected void setDepthTexture(Texture depthTexture) {
|
|
|
|
+ this.depthTexture = depthTexture;
|
|
|
|
+ if (enabledSoftParticles && depthTexture != null) {
|
|
|
|
+ initSoftParticles(viewPort, true);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -48,6 +89,11 @@ public final class TranslucentBucketFilter extends Filter {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ protected boolean isRequiresDepthTexture() {
|
|
|
|
+ return enabledSoftParticles;
|
|
|
|
+ }
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
protected void postFrame(RenderManager renderManager, ViewPort viewPort, FrameBuffer prevFilterBuffer, FrameBuffer sceneBuffer) {
|
|
protected void postFrame(RenderManager renderManager, ViewPort viewPort, FrameBuffer prevFilterBuffer, FrameBuffer sceneBuffer) {
|
|
renderManager.setCamera(viewPort.getCamera(), false);
|
|
renderManager.setCamera(viewPort.getCamera(), false);
|
|
@@ -63,6 +109,8 @@ public final class TranslucentBucketFilter extends Filter {
|
|
if (renderManager != null) {
|
|
if (renderManager != null) {
|
|
renderManager.setHandleTranslucentBucket(true);
|
|
renderManager.setHandleTranslucentBucket(true);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ initSoftParticles(viewPort, false);
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -76,5 +124,32 @@ public final class TranslucentBucketFilter extends Filter {
|
|
if (renderManager != null) {
|
|
if (renderManager != null) {
|
|
renderManager.setHandleTranslucentBucket(!enabled);
|
|
renderManager.setHandleTranslucentBucket(!enabled);
|
|
}
|
|
}
|
|
|
|
+ initSoftParticles(viewPort, enabledSoftParticles);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void makeSoftParticleEmitter(Spatial scene, boolean enabled) {
|
|
|
|
+ if (scene instanceof Node) {
|
|
|
|
+ Node n = (Node) scene;
|
|
|
|
+ for (Spatial child : n.getChildren()) {
|
|
|
|
+ makeSoftParticleEmitter(child, enabled);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (scene instanceof ParticleEmitter) {
|
|
|
|
+ ParticleEmitter emitter = (ParticleEmitter) scene;
|
|
|
|
+ if (enabled) {
|
|
|
|
+ enabledSoftParticles = enabled;
|
|
|
|
+
|
|
|
|
+ emitter.getMaterial().selectTechnique("SoftParticles", renderManager);
|
|
|
|
+ emitter.getMaterial().setTexture("DepthTexture", processor.getDepthTexture());
|
|
|
|
+ emitter.setQueueBucket(RenderQueue.Bucket.Translucent);
|
|
|
|
+
|
|
|
|
+ logger.log(Level.INFO, "Made particle Emitter {0} soft.", emitter.getName());
|
|
|
|
+ } else {
|
|
|
|
+ emitter.getMaterial().clearParam("DepthTexture");
|
|
|
|
+ emitter.getMaterial().selectTechnique("Default", renderManager);
|
|
|
|
+ // emitter.setQueueBucket(RenderQueue.Bucket.Transparent);
|
|
|
|
+ logger.log(Level.INFO, "Particle Emitter {0} is not soft anymore.", emitter.getName());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|