aboutsummaryrefslogtreecommitdiff
path: root/engine/src/core-effects/com/jme3/post/filters/TranslucentBucketFilter.java
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/core-effects/com/jme3/post/filters/TranslucentBucketFilter.java')
-rw-r--r--engine/src/core-effects/com/jme3/post/filters/TranslucentBucketFilter.java75
1 files changed, 75 insertions, 0 deletions
diff --git a/engine/src/core-effects/com/jme3/post/filters/TranslucentBucketFilter.java b/engine/src/core-effects/com/jme3/post/filters/TranslucentBucketFilter.java
index 47be413..c377a58 100644
--- a/engine/src/core-effects/com/jme3/post/filters/TranslucentBucketFilter.java
+++ b/engine/src/core-effects/com/jme3/post/filters/TranslucentBucketFilter.java
@@ -5,6 +5,7 @@
package com.jme3.post.filters;
import com.jme3.asset.AssetManager;
+import com.jme3.effect.ParticleEmitter;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.post.Filter;
@@ -12,8 +13,14 @@ import com.jme3.renderer.RenderManager;
import com.jme3.renderer.Renderer;
import com.jme3.renderer.ViewPort;
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.Texture;
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
@@ -22,11 +29,25 @@ import com.jme3.texture.Texture2D;
*/
public final class TranslucentBucketFilter extends Filter {
+ private final static Logger logger = Logger.getLogger(TranslucentBucketFilter.class.getName());
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
protected void initFilter(AssetManager manager, RenderManager rm, ViewPort vp, int w, int h) {
this.renderManager = rm;
+ this.viewPort = vp;
material = new Material(manager, "Common/MatDefs/Post/Overlay.j3md");
material.setColor("Color", ColorRGBA.White);
Texture2D tex = processor.getFilterTexture();
@@ -37,6 +58,26 @@ public final class TranslucentBucketFilter extends Filter {
material.clearParam("NumSamples");
}
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);
+ }
}
/**
@@ -49,6 +90,11 @@ public final class TranslucentBucketFilter extends Filter {
}
@Override
+ protected boolean isRequiresDepthTexture() {
+ return enabledSoftParticles;
+ }
+
+ @Override
protected void postFrame(RenderManager renderManager, ViewPort viewPort, FrameBuffer prevFilterBuffer, FrameBuffer sceneBuffer) {
renderManager.setCamera(viewPort.getCamera(), false);
if (prevFilterBuffer != sceneBuffer) {
@@ -63,6 +109,8 @@ public final class TranslucentBucketFilter extends Filter {
if (renderManager != null) {
renderManager.setHandleTranslucentBucket(true);
}
+
+ initSoftParticles(viewPort, false);
}
@Override
@@ -76,5 +124,32 @@ public final class TranslucentBucketFilter extends Filter {
if (renderManager != null) {
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());
+ }
+ }
}
}