Odd particle behavior

Hello,

I found some odd behavior when addind a water post effect and particles to a node. The particles aren’t rendered when looking at the water:

package game;

import com.jme3.app.SimpleApplication;
import com.jme3.effect.ParticleEmitter;
import com.jme3.effect.ParticleMesh;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
import com.jme3.scene.Spatial;
import com.jme3.texture.Texture2D;
import com.jme3.util.SkyFactory;
import com.jme3.water.WaterFilter;

public class WaterTest extends SimpleApplication {

	private final Vector3f lightDir = new Vector3f(-4.9236743f, -1.27054665f, 5.896916f);
	private WaterFilter water;

	public static void main(String[] args) {
		WaterTest app = new WaterTest();
		app.start();
	}

	@Override
	public void simpleInitApp() {
		setDisplayFps(false);
		setDisplayStatView(false);

		DirectionalLight sun = new DirectionalLight();
		sun.setDirection(lightDir);
		sun.setColor(ColorRGBA.White.clone().multLocal(1.7f));
		rootNode.addLight(sun);

		flyCam.setMoveSpeed(100);

		cam.setLocation(new Vector3f(0, 200, 0));
		cam.setRotation(new Quaternion(0.5f, 0.5f, -0.5f, 0.5f));

		Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false);
		sky.setLocalScale(3500);

		rootNode.attachChild(sky);
		cam.setFrustumFar(40000);

		water = new WaterFilter(rootNode, lightDir);

		FilterPostProcessor fpp = new FilterPostProcessor(assetManager);

		fpp.addFilter(water);

		water.setWaveScale(0.003f);
		water.setMaxAmplitude(2f);
		water.setFoamExistence(new Vector3f(1f, 4, 0.5f));
		water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam2.jpg"));

		water.setRefractionStrength(0.2f);

		water.setWaterHeight(50);
		viewPort.addProcessor(fpp);

		inputManager.addListener(new ActionListener() {
			@Override
			public void onAction(String name, boolean isPressed, float tpf) {
				if (isPressed) {
					if (name.equals("explosion")) {
						createExplosion(cam.getLocation().subtract(new Vector3f(0, 5, 0)));
					}
				}
			}
		}, "explosion");
		inputManager.addMapping("explosion", new KeyTrigger(KeyInput.KEY_SPACE));
	}

	@Override
	public void simpleUpdate(float tpf) {
		super.simpleUpdate(tpf);
	}

	private void createExplosion(Vector3f position) {
		ParticleEmitter fire = new ParticleEmitter("Emitter", ParticleMesh.Type.Triangle, 30);
		Material mat_red = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md");
		mat_red.setTexture("Texture", assetManager.loadTexture("Effects/Explosion/flame.png"));
		fire.setMaterial(mat_red);
		fire.setImagesX(2);
		fire.setImagesY(2); // 2x2 texture animation
		fire.setEndColor(new ColorRGBA(1f, 0f, 0f, 1f)); // red
		fire.setStartColor(new ColorRGBA(1f, 1f, 0f, 0.5f)); // yellow
		fire.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 2, 0));
		fire.setStartSize(1.5f);
		fire.setEndSize(0.1f);
		fire.setGravity(0, 0, 0);
		fire.setLowLife(1f);
		fire.setHighLife(3f);
		fire.getParticleInfluencer().setVelocityVariation(0.3f);
		fire.setLocalTranslation(position.subtract(new Vector3f(0, 20, 0)));
		rootNode.attachChild(fire);

		ParticleEmitter debris = new ParticleEmitter("Debris", ParticleMesh.Type.Triangle, 10);
		Material debris_mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md");
		debris_mat.setTexture("Texture", assetManager.loadTexture("Effects/Explosion/Debris.png"));
		debris.setMaterial(debris_mat);
		debris.setImagesX(3);
		debris.setImagesY(3); // 3x3 texture animation
		debris.setRotateSpeed(4);
		debris.setSelectRandomImage(true);
		debris.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 4, 0));
		debris.setStartColor(ColorRGBA.White);
		debris.setGravity(0, 6, 0);
		debris.getParticleInfluencer().setVelocityVariation(.60f);
		debris.setLocalTranslation(position.subtract(new Vector3f(0, 20, 0)));
		rootNode.attachChild(debris);
		debris.emitAllParticles();
	}

}

Hope anyone can help me =)

Regards,
Dustin

You have to put the particle emitter in the translucent bucket and add a TranslucentBucketFilter at the end of your filter stack.

1 Like

Thank you so much nehon =) Helped me a lot!
Sorry for my late answer, I wasn’t logged in and didn’t see that you replied up till now =(