[SOLVED] Need help with WaterFilter / TestPostWater.java

Hello,

since the tutorial game I’m writing is using the WaterFilter when my app is set to “useShading” and “useTextures”, I ran into an issue:

In the scene I have a particle system (a campfire on an island), which renders nicely when the WaterFilter is not used. But it renders through any other opaque Geometry objects of the scene when the WaterFilter is used.

I tried to fiddle with ViewPort via

ViewPort post=renderManager.createPostView("transpPost", cam);

(Which is already a hint in the TestPostWater.java)
But it did not change anything.

Here is the situation with WaterFilter on:


Here is the situation with WaterFilter off:



I have no idea what’s happening and why things break. I understand that the WaterFilter is a post processing effect and that the rendering order is very important. But I’m just not into the details how to fix that. I used the code found in the TestPostWater.java and have been doing a guess and trial and error. :chimpanzee_sad:


Also, a second problem: When I set the Material of the fire ParticleEmitter from BlendMode.Additive to BlendMode.Alpha, then this happens:

As you may or may not know, Additive blending looks awful, because we can “see through” the flame:

Same here, I just don’t get why I can’t use Alpha blending instead of Additive blending. :chimpanzee_sad:


Help for this is very much appreciated. It will lead to a contributed game having less graphics bugs when released… :chimpanzee_smile:

And here is some code (it’s a modified version of TestPostWater.java):

package jme3test.water;

import com.jme3.app.SimpleApplication;
import com.jme3.audio.AudioNode;
import com.jme3.audio.LowPassFilter;
import com.jme3.effect.ParticleEmitter;
import com.jme3.effect.ParticleMesh;
import com.jme3.effect.ParticleMesh.Type;
import com.jme3.effect.influencers.DefaultParticleInfluencer;
import com.jme3.effect.influencers.EmptyParticleInfluencer;
import com.jme3.effect.influencers.NewtonianParticleInfluencer;
import com.jme3.effect.influencers.RadialParticleInfluencer;
import com.jme3.effect.shapes.EmitterMeshFaceShape;
import com.jme3.effect.shapes.EmitterShape;
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.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
import com.jme3.post.filters.BloomFilter;
import com.jme3.post.filters.DepthOfFieldFilter;
import com.jme3.post.filters.LightScatteringFilter;
import com.jme3.renderer.Camera;
import com.jme3.renderer.ViewPort;
import com.jme3.renderer.queue.RenderQueue.Bucket;
import com.jme3.renderer.queue.RenderQueue.ShadowMode;
import com.jme3.scene.Geometry;
import com.jme3.scene.Mesh;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Cylinder;
import com.jme3.terrain.geomipmap.TerrainQuad;
import com.jme3.terrain.heightmap.AbstractHeightMap;
import com.jme3.terrain.heightmap.ImageBasedHeightMap;
import com.jme3.texture.Texture;
import com.jme3.texture.Texture.WrapMode;
import com.jme3.texture.Texture2D;
import com.jme3.util.SkyFactory;
import com.jme3.water.WaterFilter;
import java.util.ArrayList;
import java.util.List;

/**
 * test
 *
 * @author normenhansen
 */
public class TestPostWater extends SimpleApplication {

    private Vector3f lightDir = new Vector3f(-4.9236743f, -1.27054665f, 5.896916f);
    
    private boolean haveBoxOpaque = false;
    private boolean haveBoxTransparent = false;
    private boolean haveFire = false;
    private boolean haveWater = false;
    
    private ParticleEmitter fire;
    private WaterFilter water;
    private TerrainQuad terrain;
    private Material matRock;
    private AudioNode waves;
    private LowPassFilter underWaterAudioFilter = new LowPassFilter(0.5f, 0.1f);
    private LowPassFilter underWaterReverbFilter = new LowPassFilter(0.5f, 0.1f);
    private LowPassFilter aboveWaterAudioFilter = new LowPassFilter(1, 1);

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

    @Override
    public void simpleInitApp() {

        setDisplayFps(false);
        setDisplayStatView(false);

        Node mainScene = new Node("Main Scene");
        rootNode.attachChild(mainScene);

        createTerrain(mainScene);
        DirectionalLight sun = new DirectionalLight();
        sun.setDirection(lightDir);
        sun.setColor(ColorRGBA.White.clone().multLocal(1.7f));
        mainScene.addLight(sun);
        
        DirectionalLight l = new DirectionalLight();
        l.setDirection(Vector3f.UNIT_Y.mult(-1));
        l.setColor(ColorRGBA.White.clone().multLocal(0.3f));
//        mainScene.addLight(l);

        flyCam.setMoveSpeed(50);

        cam.setLocation(new Vector3f(-361.26004f, 111.80121f, 141.52994f));
        cam.setRotation(new Quaternion(0.010351023f, 0.86325f, -0.01771374f, 0.5043596f));


        cam.setRotation(new Quaternion().fromAngles(new float[]{FastMath.PI * 0.06f, FastMath.PI * 0.65f, 0}));


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

        mainScene.attachChild(sky);
        cam.setFrustumFar(4000);
        //cam.setFrustumNear(100);

        createFire();
        createBoxOpaque();
        createBoxTransparent();
        
        createWater();
    }
    
    Geometry boxOpaque;

    private void createBoxOpaque() {
        
        haveBoxOpaque = true;
        
        Vector3f boxPosition = new Vector3f(-340.21957f, 109.1872f, 130.884346f);
        
        //creating a transluscent box
        boxOpaque = new Geometry("box", new Box(new Vector3f(0, 0, 0), 2, 2, 2));
        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", new ColorRGBA(0.0f, 0.0f, 1.0f, 1.0f));
        boxOpaque.setMaterial(mat);

        boxOpaque.setLocalTranslation(boxPosition);
        
//        //transparent or translucent?
//        if(true) {
//            
//            box.setQueueBucket(Bucket.Transparent);
//            
//            //creating a post view port
//            ViewPort post=renderManager.createPostView("transpPost", cam);
//            post.setClearFlags(false, true, true);
//
//            //attaching the box to the post viewport
//            //Don't forget to updateGeometricState() the box in the simpleUpdate
//            post.attachScene(box);
//        }
//        else {
//            
//            box.setQueueBucket(Bucket.Translucent);
//        }

        rootNode.attachChild(boxOpaque);
    }
    
    Geometry boxTransparent;
    
    private void createBoxTransparent() {
        
        haveBoxTransparent = true;
        
        Vector3f boxPosition = new Vector3f(-337.21957f, 109.1872f, 126.884346f);
        
        //creating a transluscent box
        boxTransparent = new Geometry("box", new Box(new Vector3f(0, 0, 0), 2, 2, 2));
        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", new ColorRGBA(1.0f, 0, 0, 0.3f));
        mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
        //mat.getAdditionalRenderState().setDepthWrite(false);
        //mat.getAdditionalRenderState().setDepthTest(false);
        boxTransparent.setMaterial(mat);

        boxTransparent.setLocalTranslation(boxPosition);
        
        //transparent or translucent?
        if(false) {
            
            boxTransparent.setQueueBucket(Bucket.Transparent);
            
            //creating a post view port
            ViewPort post=renderManager.createPostView("transpPost", cam);
            post.setClearFlags(false, false, false);

            //attaching the box to the post viewport
            //Don't forget to updateGeometricState() the box in the simpleUpdate
            post.attachScene(boxTransparent);
        }
        else {
            
            boxTransparent.setQueueBucket(Bucket.Translucent);
        }

        rootNode.attachChild(boxTransparent);
    }
    
    private void createFire() {
        
        haveFire = true;
        
        Vector3f firePosition = new Vector3f(-327.21957f, 109.1872f, 126.884346f);
        //
        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"));
        //mat_red.setTexture("GlowMap", assetManager.loadTexture("Effects/Explosion/flame.png"));
        //mat_red.setColor("GlowColor", ColorRGBA.White);
        //mat_red.setFloat("Quadratic",1f);
        //mat_red.setBoolean("PointSprite",false); 
        //
        fire.setMaterial(mat_red);
        fire.setImagesX(2);
        fire.setImagesY(2); // 2x2 texture animation
        fire.setEndColor(new ColorRGBA(1f, 0f, 0f, 0.5f));   // red
        fire.setStartColor(new ColorRGBA(1f, 1f, 0f, 0.0f)); // yellow
        //
        DefaultParticleInfluencer influencer1 = new DefaultParticleInfluencer();
        //
        NewtonianParticleInfluencer influencer2 = new NewtonianParticleInfluencer();
        influencer2.setNormalVelocity(1.4f);
        influencer2.setSurfaceTangentFactor(1.2f);
        influencer2.setSurfaceTangentRotation(1.1f);
        //
        RadialParticleInfluencer influencer3 = new RadialParticleInfluencer();
        influencer3.setOrigin(firePosition);
        influencer3.setRadialVelocity(3.1f);
        //
        EmptyParticleInfluencer influencer4 = new EmptyParticleInfluencer();
        //
        fire.setParticleInfluencer(influencer2);
        fire.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 0, 0));
        fire.getParticleInfluencer().setVelocityVariation(0.51f);
        //
        fire.setStartSize(2f);
        fire.setEndSize(0f);
        fire.setGravity(0, -4, 0);
        fire.setLowLife(1.5f);
        fire.setHighLife(2.5f);
        fire.setNumParticles(1000);
        fire.setParticlesPerSec(400);
        Cylinder cyl = new Cylinder(6,12,2f,0.0f,0.5f,false,false);
        List<Mesh> meshList = new ArrayList<Mesh>();
        meshList.add(cyl);
        EmitterShape emitterShape = new EmitterMeshFaceShape(meshList);
        fire.setShape(emitterShape);
        fire.setRandomAngle(true);
        fire.setRotateSpeed(1.25664f);
        //fire.setLocalTranslation(-350, 40, 430);
        fire.setLocalTranslation(firePosition);
        fire.setLocalRotation(new Quaternion().fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_X));
        
        //transparent or translucent?
        if(true) {
            
            mat_red.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
            //mat_red.getAdditionalRenderState().setDepthWrite(false);
            //mat_red.getAdditionalRenderState().setAlphaTest(true);
            //mat_red.getAdditionalRenderState().setColorWrite(true);
            fire.setQueueBucket(Bucket.Translucent);
            
            //creating a post view port
            ViewPort post=renderManager.createPostView("transpPost", cam);
            //post.getBackgroundColor().a = 0.0f;
            //ColorRGBA backCol = post.getBackgroundColor().clone();
            //backCol.a = 0.0f;
            //post.setBackgroundColor(backCol);
            //System.out.println("queue:"+post.getQueue());
            post.setClearFlags(false, false, false);

            //attaching the box to the post viewport
            //Don't forget to updateGeometricState() the box in the simpleUpdate
            post.attachScene(fire);
        }
        else {
            
            mat_red.getAdditionalRenderState().setBlendMode(BlendMode.Additive);
            //mat_red.getAdditionalRenderState().setDepthWrite(false);
            fire.setQueueBucket(Bucket.Translucent);
        }
        
        rootNode.attachChild(fire);
    }

    private void createWater() {
        
        haveWater = true;
        
        water = new WaterFilter(rootNode, lightDir);

        FilterPostProcessor fpp = new FilterPostProcessor(assetManager);

        fpp.addFilter(water);
        BloomFilter bloom = new BloomFilter();
        //bloom.getE
        bloom.setExposurePower(55);
        bloom.setBloomIntensity(1.0f);
        fpp.addFilter(bloom);
        LightScatteringFilter lsf = new LightScatteringFilter(lightDir.mult(-300));
        lsf.setLightDensity(1.0f);
        fpp.addFilter(lsf);
        DepthOfFieldFilter dof = new DepthOfFieldFilter();
        dof.setFocusDistance(0);
        dof.setFocusRange(100);
        fpp.addFilter(dof);
//        

        //   fpp.addFilter(new TranslucentBucketFilter());
        //       

        // fpp.setNumSamples(4);


        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.setNormalScale(0.5f);

        //water.setRefractionConstant(0.25f);
        water.setRefractionStrength(0.2f);
        //water.setFoamHardness(0.6f);

        water.setWaterHeight(initialWaterHeight);
        uw = cam.getLocation().y < waterHeight;

        waves = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", false);
        waves.setLooping(true);
        waves.setReverbEnabled(true);
        if (uw) {
            waves.setDryFilter(new LowPassFilter(0.5f, 0.1f));
        } else {
            waves.setDryFilter(aboveWaterAudioFilter);
        }
        audioRenderer.playSource(waves);
        //  
        viewPort.addProcessor(fpp);

        inputManager.addListener(new ActionListener() {
            public void onAction(String name, boolean isPressed, float tpf) {
                if (isPressed) {
                    if (name.equals("foam1")) {
                        water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam.jpg"));
                    }
                    if (name.equals("foam2")) {
                        water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam2.jpg"));
                    }
                    if (name.equals("foam3")) {
                        water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam3.jpg"));
                    }

                    if (name.equals("upRM")) {
                        water.setReflectionMapSize(Math.min(water.getReflectionMapSize() * 2, 4096));
                        System.out.println("Reflection map size : " + water.getReflectionMapSize());
                    }
                    if (name.equals("downRM")) {
                        water.setReflectionMapSize(Math.max(water.getReflectionMapSize() / 2, 32));
                        System.out.println("Reflection map size : " + water.getReflectionMapSize());
                    }
                }
            }
        }, "foam1", "foam2", "foam3", "upRM", "downRM");
        inputManager.addMapping("foam1", new KeyTrigger(KeyInput.KEY_1));
        inputManager.addMapping("foam2", new KeyTrigger(KeyInput.KEY_2));
        inputManager.addMapping("foam3", new KeyTrigger(KeyInput.KEY_3));
        inputManager.addMapping("upRM", new KeyTrigger(KeyInput.KEY_PGUP));
        inputManager.addMapping("downRM", new KeyTrigger(KeyInput.KEY_PGDN));
        
    }

    private void createTerrain(Node rootNode) {
        matRock = new Material(assetManager, "Common/MatDefs/Terrain/TerrainLighting.j3md");
        matRock.setBoolean("useTriPlanarMapping", false);
        matRock.setBoolean("WardIso", true);
        matRock.setTexture("AlphaMap", assetManager.loadTexture("Textures/Terrain/splat/alphamap.png"));
        Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png");
        Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
        grass.setWrap(WrapMode.Repeat);
        matRock.setTexture("DiffuseMap", grass);
        matRock.setFloat("DiffuseMap_0_scale", 64);
        Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");
        dirt.setWrap(WrapMode.Repeat);
        matRock.setTexture("DiffuseMap_1", dirt);
        matRock.setFloat("DiffuseMap_1_scale", 16);
        Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg");
        rock.setWrap(WrapMode.Repeat);
        matRock.setTexture("DiffuseMap_2", rock);
        matRock.setFloat("DiffuseMap_2_scale", 128);
        Texture normalMap0 = assetManager.loadTexture("Textures/Terrain/splat/grass_normal.jpg");
        normalMap0.setWrap(WrapMode.Repeat);
        Texture normalMap1 = assetManager.loadTexture("Textures/Terrain/splat/dirt_normal.png");
        normalMap1.setWrap(WrapMode.Repeat);
        Texture normalMap2 = assetManager.loadTexture("Textures/Terrain/splat/road_normal.png");
        normalMap2.setWrap(WrapMode.Repeat);
        matRock.setTexture("NormalMap", normalMap0);
        matRock.setTexture("NormalMap_1", normalMap2);
        matRock.setTexture("NormalMap_2", normalMap2);

        AbstractHeightMap heightmap = null;
        try {
            heightmap = new ImageBasedHeightMap(heightMapImage.getImage(), 0.25f);
            heightmap.load();
        } catch (Exception e) {
            e.printStackTrace();
        }
        terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap());
        List<Camera> cameras = new ArrayList<Camera>();
        cameras.add(getCamera());
        terrain.setMaterial(matRock);
        terrain.setLocalScale(new Vector3f(5, 5, 5));
        terrain.setLocalTranslation(new Vector3f(0, -30, 0));
        terrain.setLocked(false); // unlock it so we can edit the height

        terrain.setShadowMode(ShadowMode.Receive);
        rootNode.attachChild(terrain);

    }
    //This part is to emulate tides, slightly varrying the height of the water plane
    private float time = 0.0f;
    private float waterHeight = 0.0f;
    private float initialWaterHeight = 90f;//0.8f;
    private boolean uw = false;

    @Override
    public void simpleUpdate(float tpf) {
        super.simpleUpdate(tpf);
        
        if(haveFire)
            fire.updateGeometricState();
        
        if(haveBoxTransparent)
            boxTransparent.updateGeometricState();
        
        if(haveWater){
            time += tpf;
            waterHeight = (float) Math.cos(((time * 0.6f) % FastMath.TWO_PI)) * 1.5f;
            water.setWaterHeight(initialWaterHeight + waterHeight);
            if (water.isUnderWater() && !uw) {

                waves.setDryFilter(new LowPassFilter(0.5f, 0.1f));
                uw = true;
            }
            if (!water.isUnderWater() && uw) {
                uw = false;
                //waves.setReverbEnabled(false);
                waves.setDryFilter(new LowPassFilter(1, 1f));
                //waves.setDryFilter(new LowPassFilter(1,1f));

            }
        }
    }
}

There are some switches in the code and you can uncomment the ‘createWater’ line, to deactivate the WaterFilter.

Translucent requires special setup. Why are you using it instead of transparent?

Basically, when I saw your issues I only had to scan the code to find it… as it causes transparent objects to be rendered last of the last last last unless you add a translucent filter to the FPP. I think it may even force depth write off.

Go back to the transparent bucket and work from there.

Very likely the same issue.

This is how it looks with Transparent bucket:



Setting fire to Bucket transparent results in the same black quads. Only Additive blending seems to not cause black quads to render.

Then your images do not have alpha.

Show the latest code… like, to make sure you’ve left depth write on.

1 Like

All lines with the string “DepthWrite” in them are being uncommented, yes.

This is what happens when DepthWrite is explicitly true for the fire:

This is when all lines with DepthWrite are commented out (uncommented):

Ah, excellent hint. I checked flames.png and it only has R,G,B (no A). Added that and will show a picture of “PacificJaime” in a few minutes. Thanks for that! :chimpanzee_smile:

“I uncommented the commented out stuff that I uncommented with the comments where I set the false thing to true but false…”

…if only there were a way to post the actual source used so there was absolutely no chance of translation errors…

Anyway… going afk for a few hours. Someone else can play now.

This is for the first image:

package jme3test.water;

import com.jme3.app.SimpleApplication;
import com.jme3.audio.AudioNode;
import com.jme3.audio.LowPassFilter;
import com.jme3.effect.ParticleEmitter;
import com.jme3.effect.ParticleMesh;
import com.jme3.effect.ParticleMesh.Type;
import com.jme3.effect.influencers.DefaultParticleInfluencer;
import com.jme3.effect.influencers.EmptyParticleInfluencer;
import com.jme3.effect.influencers.NewtonianParticleInfluencer;
import com.jme3.effect.influencers.RadialParticleInfluencer;
import com.jme3.effect.shapes.EmitterMeshFaceShape;
import com.jme3.effect.shapes.EmitterShape;
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.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
import com.jme3.post.filters.BloomFilter;
import com.jme3.post.filters.DepthOfFieldFilter;
import com.jme3.post.filters.LightScatteringFilter;
import com.jme3.renderer.Camera;
import com.jme3.renderer.ViewPort;
import com.jme3.renderer.queue.RenderQueue.Bucket;
import com.jme3.renderer.queue.RenderQueue.ShadowMode;
import com.jme3.scene.Geometry;
import com.jme3.scene.Mesh;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Cylinder;
import com.jme3.terrain.geomipmap.TerrainQuad;
import com.jme3.terrain.heightmap.AbstractHeightMap;
import com.jme3.terrain.heightmap.ImageBasedHeightMap;
import com.jme3.texture.Texture;
import com.jme3.texture.Texture.WrapMode;
import com.jme3.texture.Texture2D;
import com.jme3.util.SkyFactory;
import com.jme3.water.WaterFilter;
import java.util.ArrayList;
import java.util.List;

/**
 * test
 *
 * @author normenhansen
 */
public class TestPostWater extends SimpleApplication {

    private Vector3f lightDir = new Vector3f(-4.9236743f, -1.27054665f, 5.896916f);
    
    private boolean haveBoxOpaque = false;
    private boolean haveBoxTransparent = false;
    private boolean haveFire = false;
    private boolean haveWater = false;
    
    private ParticleEmitter fire;
    private WaterFilter water;
    private TerrainQuad terrain;
    private Material matRock;
    private AudioNode waves;
    private LowPassFilter underWaterAudioFilter = new LowPassFilter(0.5f, 0.1f);
    private LowPassFilter underWaterReverbFilter = new LowPassFilter(0.5f, 0.1f);
    private LowPassFilter aboveWaterAudioFilter = new LowPassFilter(1, 1);

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

    @Override
    public void simpleInitApp() {

        setDisplayFps(false);
        setDisplayStatView(false);

        Node mainScene = new Node("Main Scene");
        rootNode.attachChild(mainScene);

        createTerrain(mainScene);
        DirectionalLight sun = new DirectionalLight();
        sun.setDirection(lightDir);
        sun.setColor(ColorRGBA.White.clone().multLocal(1.7f));
        mainScene.addLight(sun);
        
        DirectionalLight l = new DirectionalLight();
        l.setDirection(Vector3f.UNIT_Y.mult(-1));
        l.setColor(ColorRGBA.White.clone().multLocal(0.3f));
//        mainScene.addLight(l);

        flyCam.setMoveSpeed(50);

        cam.setLocation(new Vector3f(-345.45306f, 116.492874f, 107.50886f));
        cam.setRotation(new Quaternion(0.07447736f, 0.2786104f, -0.02167663f, 0.9572667f));


        //cam.setRotation(new Quaternion().fromAngles(new float[]{FastMath.PI * 0.06f, FastMath.PI * 0.65f, 0}));


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

        mainScene.attachChild(sky);
        cam.setFrustumFar(4000);
        //cam.setFrustumNear(100);

        createFire();
        createBoxOpaque();
        createBoxTransparent();
        
        createWater();
    }
    
    Geometry boxOpaque;

    private void createBoxOpaque() {
        
        haveBoxOpaque = true;
        
        Vector3f boxPosition = new Vector3f(-340.21957f, 109.1872f, 130.884346f);
        
        //creating a transluscent box
        boxOpaque = new Geometry("box", new Box(new Vector3f(0, 0, 0), 2, 2, 2));
        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", new ColorRGBA(0.0f, 0.0f, 1.0f, 1.0f));
        boxOpaque.setMaterial(mat);

        boxOpaque.setLocalTranslation(boxPosition);
        
//        //transparent or translucent?
//        if(true) {
//            
//            box.setQueueBucket(Bucket.Transparent);
//            
//            //creating a post view port
//            ViewPort post=renderManager.createPostView("transpPost", cam);
//            post.setClearFlags(false, true, true);
//
//            //attaching the box to the post viewport
//            //Don't forget to updateGeometricState() the box in the simpleUpdate
//            post.attachScene(box);
//        }
//        else {
//            
//            box.setQueueBucket(Bucket.Translucent);
//        }

        rootNode.attachChild(boxOpaque);
    }
    
    Geometry boxTransparent;
    
    private void createBoxTransparent() {
        
        haveBoxTransparent = true;
        
        Vector3f boxPosition = new Vector3f(-337.21957f, 109.1872f, 126.884346f);
        
        //creating a transluscent box
        boxTransparent = new Geometry("box", new Box(new Vector3f(0, 0, 0), 2, 2, 2));
        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", new ColorRGBA(1.0f, 0, 0, 0.3f));
        mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
        //mat.getAdditionalRenderState().setDepthWrite(false);
        boxTransparent.setMaterial(mat);

        boxTransparent.setLocalTranslation(boxPosition);
        
        //transparent or translucent?
        if(false) {
            
            boxTransparent.setQueueBucket(Bucket.Transparent);
            
            //creating a post view port
            ViewPort post=renderManager.createPostView("transpPost", cam);
            post.setClearFlags(false, false, false);

            //attaching the box to the post viewport
            //Don't forget to updateGeometricState() the box in the simpleUpdate
            post.attachScene(boxTransparent);
        }
        else {
            
            boxTransparent.setQueueBucket(Bucket.Transparent);
        }

        rootNode.attachChild(boxTransparent);
    }
    
    private void createFire() {
        
        haveFire = true;
        
        Vector3f firePosition = new Vector3f(-327.21957f, 109.1872f, 126.884346f);
        //
        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"));
        //mat_red.setTexture("GlowMap", assetManager.loadTexture("Effects/Explosion/flame.png"));
        //mat_red.setColor("GlowColor", ColorRGBA.White);
        //mat_red.setFloat("Quadratic",1f);
        //mat_red.setBoolean("PointSprite",false); 
        //
        fire.setMaterial(mat_red);
        fire.setImagesX(2);
        fire.setImagesY(2); // 2x2 texture animation
        fire.setEndColor(new ColorRGBA(1f, 0f, 0f, 0.5f));   // red
        fire.setStartColor(new ColorRGBA(1f, 1f, 0f, 0.0f)); // yellow
        //
        DefaultParticleInfluencer influencer1 = new DefaultParticleInfluencer();
        //
        NewtonianParticleInfluencer influencer2 = new NewtonianParticleInfluencer();
        influencer2.setNormalVelocity(1.4f);
        influencer2.setSurfaceTangentFactor(1.2f);
        influencer2.setSurfaceTangentRotation(1.1f);
        //
        RadialParticleInfluencer influencer3 = new RadialParticleInfluencer();
        influencer3.setOrigin(firePosition);
        influencer3.setRadialVelocity(3.1f);
        //
        EmptyParticleInfluencer influencer4 = new EmptyParticleInfluencer();
        //
        fire.setParticleInfluencer(influencer2);
        fire.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 0, 0));
        fire.getParticleInfluencer().setVelocityVariation(0.51f);
        //
        fire.setStartSize(2f);
        fire.setEndSize(0f);
        fire.setGravity(0, -4, 0);
        fire.setLowLife(1.5f);
        fire.setHighLife(2.5f);
        fire.setNumParticles(1000);
        fire.setParticlesPerSec(400);
        Cylinder cyl = new Cylinder(6,12,2f,0.0f,0.5f,false,false);
        List<Mesh> meshList = new ArrayList<Mesh>();
        meshList.add(cyl);
        EmitterShape emitterShape = new EmitterMeshFaceShape(meshList);
        fire.setShape(emitterShape);
        fire.setRandomAngle(true);
        fire.setRotateSpeed(1.25664f);
        //fire.setLocalTranslation(-350, 40, 430);
        fire.setLocalTranslation(firePosition);
        fire.setLocalRotation(new Quaternion().fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_X));
        
        //transparent or translucent?
        if(false) {
            
            mat_red.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
            //mat_red.getAdditionalRenderState().setDepthWrite(false);
            //mat_red.getAdditionalRenderState().setAlphaTest(true);
            //mat_red.getAdditionalRenderState().setColorWrite(true);
            fire.setQueueBucket(Bucket.Transparent);
            
            //creating a post view port
            ViewPort post=renderManager.createPostView("transpPost", cam);
            //post.getBackgroundColor().a = 0.0f;
            //ColorRGBA backCol = post.getBackgroundColor().clone();
            //backCol.a = 0.0f;
            //post.setBackgroundColor(backCol);
            //System.out.println("queue:"+post.getQueue());
            post.setClearFlags(false, false, false);

            //attaching the box to the post viewport
            //Don't forget to updateGeometricState() the box in the simpleUpdate
            post.attachScene(fire);
        }
        else {
            
            mat_red.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
            mat_red.getAdditionalRenderState().setDepthWrite(true);
            fire.setQueueBucket(Bucket.Transparent);
        }
        
        rootNode.attachChild(fire);
    }

    private void createWater() {
        
        haveWater = true;
        
        water = new WaterFilter(rootNode, lightDir);

        FilterPostProcessor fpp = new FilterPostProcessor(assetManager);

        fpp.addFilter(water);
        BloomFilter bloom = new BloomFilter();
        //bloom.getE
        bloom.setExposurePower(55);
        bloom.setBloomIntensity(1.0f);
        fpp.addFilter(bloom);
        LightScatteringFilter lsf = new LightScatteringFilter(lightDir.mult(-300));
        lsf.setLightDensity(1.0f);
        fpp.addFilter(lsf);
        DepthOfFieldFilter dof = new DepthOfFieldFilter();
        dof.setFocusDistance(0);
        dof.setFocusRange(100);
        fpp.addFilter(dof);
//        

        //   fpp.addFilter(new TranslucentBucketFilter());
        //       

        // fpp.setNumSamples(4);


        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.setNormalScale(0.5f);

        //water.setRefractionConstant(0.25f);
        water.setRefractionStrength(0.2f);
        //water.setFoamHardness(0.6f);

        water.setWaterHeight(initialWaterHeight);
        uw = cam.getLocation().y < waterHeight;

        waves = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", false);
        waves.setLooping(true);
        waves.setReverbEnabled(true);
        if (uw) {
            waves.setDryFilter(new LowPassFilter(0.5f, 0.1f));
        } else {
            waves.setDryFilter(aboveWaterAudioFilter);
        }
        audioRenderer.playSource(waves);
        //  
        viewPort.addProcessor(fpp);

        inputManager.addListener(new ActionListener() {
            public void onAction(String name, boolean isPressed, float tpf) {
                if (isPressed) {
                    if (name.equals("foam1")) {
                        water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam.jpg"));
                    }
                    if (name.equals("foam2")) {
                        water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam2.jpg"));
                    }
                    if (name.equals("foam3")) {
                        water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam3.jpg"));
                    }

                    if (name.equals("upRM")) {
                        water.setReflectionMapSize(Math.min(water.getReflectionMapSize() * 2, 4096));
                        System.out.println("Reflection map size : " + water.getReflectionMapSize());
                    }
                    if (name.equals("downRM")) {
                        water.setReflectionMapSize(Math.max(water.getReflectionMapSize() / 2, 32));
                        System.out.println("Reflection map size : " + water.getReflectionMapSize());
                    }
                }
            }
        }, "foam1", "foam2", "foam3", "upRM", "downRM");
        inputManager.addMapping("foam1", new KeyTrigger(KeyInput.KEY_1));
        inputManager.addMapping("foam2", new KeyTrigger(KeyInput.KEY_2));
        inputManager.addMapping("foam3", new KeyTrigger(KeyInput.KEY_3));
        inputManager.addMapping("upRM", new KeyTrigger(KeyInput.KEY_PGUP));
        inputManager.addMapping("downRM", new KeyTrigger(KeyInput.KEY_PGDN));
        
    }

    private void createTerrain(Node rootNode) {
        matRock = new Material(assetManager, "Common/MatDefs/Terrain/TerrainLighting.j3md");
        matRock.setBoolean("useTriPlanarMapping", false);
        matRock.setBoolean("WardIso", true);
        matRock.setTexture("AlphaMap", assetManager.loadTexture("Textures/Terrain/splat/alphamap.png"));
        Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png");
        Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
        grass.setWrap(WrapMode.Repeat);
        matRock.setTexture("DiffuseMap", grass);
        matRock.setFloat("DiffuseMap_0_scale", 64);
        Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");
        dirt.setWrap(WrapMode.Repeat);
        matRock.setTexture("DiffuseMap_1", dirt);
        matRock.setFloat("DiffuseMap_1_scale", 16);
        Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg");
        rock.setWrap(WrapMode.Repeat);
        matRock.setTexture("DiffuseMap_2", rock);
        matRock.setFloat("DiffuseMap_2_scale", 128);
        Texture normalMap0 = assetManager.loadTexture("Textures/Terrain/splat/grass_normal.jpg");
        normalMap0.setWrap(WrapMode.Repeat);
        Texture normalMap1 = assetManager.loadTexture("Textures/Terrain/splat/dirt_normal.png");
        normalMap1.setWrap(WrapMode.Repeat);
        Texture normalMap2 = assetManager.loadTexture("Textures/Terrain/splat/road_normal.png");
        normalMap2.setWrap(WrapMode.Repeat);
        matRock.setTexture("NormalMap", normalMap0);
        matRock.setTexture("NormalMap_1", normalMap2);
        matRock.setTexture("NormalMap_2", normalMap2);

        AbstractHeightMap heightmap = null;
        try {
            heightmap = new ImageBasedHeightMap(heightMapImage.getImage(), 0.25f);
            heightmap.load();
        } catch (Exception e) {
            e.printStackTrace();
        }
        terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap());
        List<Camera> cameras = new ArrayList<Camera>();
        cameras.add(getCamera());
        terrain.setMaterial(matRock);
        terrain.setLocalScale(new Vector3f(5, 5, 5));
        terrain.setLocalTranslation(new Vector3f(0, -30, 0));
        terrain.setLocked(false); // unlock it so we can edit the height

        terrain.setShadowMode(ShadowMode.Receive);
        rootNode.attachChild(terrain);

    }
    //This part is to emulate tides, slightly varrying the height of the water plane
    private float time = 0.0f;
    private float waterHeight = 0.0f;
    private float initialWaterHeight = 90f;//0.8f;
    private boolean uw = false;

    @Override
    public void simpleUpdate(float tpf) {
        super.simpleUpdate(tpf);
        
        if(haveFire)
            fire.updateGeometricState();
        
        if(haveBoxTransparent)
            boxTransparent.updateGeometricState();
        
        if(haveWater){
            time += tpf;
            waterHeight = (float) Math.cos(((time * 0.6f) % FastMath.TWO_PI)) * 1.5f;
            water.setWaterHeight(initialWaterHeight + waterHeight);
            if (water.isUnderWater() && !uw) {

                waves.setDryFilter(new LowPassFilter(0.5f, 0.1f));
                uw = true;
            }
            if (!water.isUnderWater() && uw) {
                uw = false;
                //waves.setReverbEnabled(false);
                waves.setDryFilter(new LowPassFilter(1, 1f));
                //waves.setDryFilter(new LowPassFilter(1,1f));

            }
        }
    }
}

This is for the second image:

package jme3test.water;

import com.jme3.app.SimpleApplication;
import com.jme3.audio.AudioNode;
import com.jme3.audio.LowPassFilter;
import com.jme3.effect.ParticleEmitter;
import com.jme3.effect.ParticleMesh;
import com.jme3.effect.ParticleMesh.Type;
import com.jme3.effect.influencers.DefaultParticleInfluencer;
import com.jme3.effect.influencers.EmptyParticleInfluencer;
import com.jme3.effect.influencers.NewtonianParticleInfluencer;
import com.jme3.effect.influencers.RadialParticleInfluencer;
import com.jme3.effect.shapes.EmitterMeshFaceShape;
import com.jme3.effect.shapes.EmitterShape;
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.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
import com.jme3.post.filters.BloomFilter;
import com.jme3.post.filters.DepthOfFieldFilter;
import com.jme3.post.filters.LightScatteringFilter;
import com.jme3.renderer.Camera;
import com.jme3.renderer.ViewPort;
import com.jme3.renderer.queue.RenderQueue.Bucket;
import com.jme3.renderer.queue.RenderQueue.ShadowMode;
import com.jme3.scene.Geometry;
import com.jme3.scene.Mesh;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Cylinder;
import com.jme3.terrain.geomipmap.TerrainQuad;
import com.jme3.terrain.heightmap.AbstractHeightMap;
import com.jme3.terrain.heightmap.ImageBasedHeightMap;
import com.jme3.texture.Texture;
import com.jme3.texture.Texture.WrapMode;
import com.jme3.texture.Texture2D;
import com.jme3.util.SkyFactory;
import com.jme3.water.WaterFilter;
import java.util.ArrayList;
import java.util.List;

/**
 * test
 *
 * @author normenhansen
 */
public class TestPostWater extends SimpleApplication {

    private Vector3f lightDir = new Vector3f(-4.9236743f, -1.27054665f, 5.896916f);
    
    private boolean haveBoxOpaque = false;
    private boolean haveBoxTransparent = false;
    private boolean haveFire = false;
    private boolean haveWater = false;
    
    private ParticleEmitter fire;
    private WaterFilter water;
    private TerrainQuad terrain;
    private Material matRock;
    private AudioNode waves;
    private LowPassFilter underWaterAudioFilter = new LowPassFilter(0.5f, 0.1f);
    private LowPassFilter underWaterReverbFilter = new LowPassFilter(0.5f, 0.1f);
    private LowPassFilter aboveWaterAudioFilter = new LowPassFilter(1, 1);

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

    @Override
    public void simpleInitApp() {

        setDisplayFps(false);
        setDisplayStatView(false);

        Node mainScene = new Node("Main Scene");
        rootNode.attachChild(mainScene);

        createTerrain(mainScene);
        DirectionalLight sun = new DirectionalLight();
        sun.setDirection(lightDir);
        sun.setColor(ColorRGBA.White.clone().multLocal(1.7f));
        mainScene.addLight(sun);
        
        DirectionalLight l = new DirectionalLight();
        l.setDirection(Vector3f.UNIT_Y.mult(-1));
        l.setColor(ColorRGBA.White.clone().multLocal(0.3f));
//        mainScene.addLight(l);

        flyCam.setMoveSpeed(50);

        cam.setLocation(new Vector3f(-345.45306f, 116.492874f, 107.50886f));
        cam.setRotation(new Quaternion(0.07447736f, 0.2786104f, -0.02167663f, 0.9572667f));


        //cam.setRotation(new Quaternion().fromAngles(new float[]{FastMath.PI * 0.06f, FastMath.PI * 0.65f, 0}));


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

        mainScene.attachChild(sky);
        cam.setFrustumFar(4000);
        //cam.setFrustumNear(100);

        createFire();
        createBoxOpaque();
        createBoxTransparent();
        
        createWater();
    }
    
    Geometry boxOpaque;

    private void createBoxOpaque() {
        
        haveBoxOpaque = true;
        
        Vector3f boxPosition = new Vector3f(-340.21957f, 109.1872f, 130.884346f);
        
        //creating a transluscent box
        boxOpaque = new Geometry("box", new Box(new Vector3f(0, 0, 0), 2, 2, 2));
        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", new ColorRGBA(0.0f, 0.0f, 1.0f, 1.0f));
        boxOpaque.setMaterial(mat);

        boxOpaque.setLocalTranslation(boxPosition);
        
//        //transparent or translucent?
//        if(true) {
//            
//            box.setQueueBucket(Bucket.Transparent);
//            
//            //creating a post view port
//            ViewPort post=renderManager.createPostView("transpPost", cam);
//            post.setClearFlags(false, true, true);
//
//            //attaching the box to the post viewport
//            //Don't forget to updateGeometricState() the box in the simpleUpdate
//            post.attachScene(box);
//        }
//        else {
//            
//            box.setQueueBucket(Bucket.Translucent);
//        }

        rootNode.attachChild(boxOpaque);
    }
    
    Geometry boxTransparent;
    
    private void createBoxTransparent() {
        
        haveBoxTransparent = true;
        
        Vector3f boxPosition = new Vector3f(-337.21957f, 109.1872f, 126.884346f);
        
        //creating a transluscent box
        boxTransparent = new Geometry("box", new Box(new Vector3f(0, 0, 0), 2, 2, 2));
        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", new ColorRGBA(1.0f, 0, 0, 0.3f));
        mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
        //mat.getAdditionalRenderState().setDepthWrite(false);
        boxTransparent.setMaterial(mat);

        boxTransparent.setLocalTranslation(boxPosition);
        
        //transparent or translucent?
        if(false) {
            
            boxTransparent.setQueueBucket(Bucket.Transparent);
            
            //creating a post view port
            ViewPort post=renderManager.createPostView("transpPost", cam);
            post.setClearFlags(false, false, false);

            //attaching the box to the post viewport
            //Don't forget to updateGeometricState() the box in the simpleUpdate
            post.attachScene(boxTransparent);
        }
        else {
            
            boxTransparent.setQueueBucket(Bucket.Transparent);
        }

        rootNode.attachChild(boxTransparent);
    }
    
    private void createFire() {
        
        haveFire = true;
        
        Vector3f firePosition = new Vector3f(-327.21957f, 109.1872f, 126.884346f);
        //
        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"));
        //mat_red.setTexture("GlowMap", assetManager.loadTexture("Effects/Explosion/flame.png"));
        //mat_red.setColor("GlowColor", ColorRGBA.White);
        //mat_red.setFloat("Quadratic",1f);
        //mat_red.setBoolean("PointSprite",false); 
        //
        fire.setMaterial(mat_red);
        fire.setImagesX(2);
        fire.setImagesY(2); // 2x2 texture animation
        fire.setEndColor(new ColorRGBA(1f, 0f, 0f, 0.5f));   // red
        fire.setStartColor(new ColorRGBA(1f, 1f, 0f, 0.0f)); // yellow
        //
        DefaultParticleInfluencer influencer1 = new DefaultParticleInfluencer();
        //
        NewtonianParticleInfluencer influencer2 = new NewtonianParticleInfluencer();
        influencer2.setNormalVelocity(1.4f);
        influencer2.setSurfaceTangentFactor(1.2f);
        influencer2.setSurfaceTangentRotation(1.1f);
        //
        RadialParticleInfluencer influencer3 = new RadialParticleInfluencer();
        influencer3.setOrigin(firePosition);
        influencer3.setRadialVelocity(3.1f);
        //
        EmptyParticleInfluencer influencer4 = new EmptyParticleInfluencer();
        //
        fire.setParticleInfluencer(influencer2);
        fire.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 0, 0));
        fire.getParticleInfluencer().setVelocityVariation(0.51f);
        //
        fire.setStartSize(2f);
        fire.setEndSize(0f);
        fire.setGravity(0, -4, 0);
        fire.setLowLife(1.5f);
        fire.setHighLife(2.5f);
        fire.setNumParticles(1000);
        fire.setParticlesPerSec(400);
        Cylinder cyl = new Cylinder(6,12,2f,0.0f,0.5f,false,false);
        List<Mesh> meshList = new ArrayList<Mesh>();
        meshList.add(cyl);
        EmitterShape emitterShape = new EmitterMeshFaceShape(meshList);
        fire.setShape(emitterShape);
        fire.setRandomAngle(true);
        fire.setRotateSpeed(1.25664f);
        //fire.setLocalTranslation(-350, 40, 430);
        fire.setLocalTranslation(firePosition);
        fire.setLocalRotation(new Quaternion().fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_X));
        
        //transparent or translucent?
        if(false) {
            
            mat_red.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
            //mat_red.getAdditionalRenderState().setDepthWrite(false);
            //mat_red.getAdditionalRenderState().setAlphaTest(true);
            //mat_red.getAdditionalRenderState().setColorWrite(true);
            fire.setQueueBucket(Bucket.Transparent);
            
            //creating a post view port
            ViewPort post=renderManager.createPostView("transpPost", cam);
            //post.getBackgroundColor().a = 0.0f;
            //ColorRGBA backCol = post.getBackgroundColor().clone();
            //backCol.a = 0.0f;
            //post.setBackgroundColor(backCol);
            //System.out.println("queue:"+post.getQueue());
            post.setClearFlags(false, false, false);

            //attaching the box to the post viewport
            //Don't forget to updateGeometricState() the box in the simpleUpdate
            post.attachScene(fire);
        }
        else {
            
            mat_red.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
            //mat_red.getAdditionalRenderState().setDepthWrite(true);
            fire.setQueueBucket(Bucket.Transparent);
        }
        
        rootNode.attachChild(fire);
    }

    private void createWater() {
        
        haveWater = true;
        
        water = new WaterFilter(rootNode, lightDir);

        FilterPostProcessor fpp = new FilterPostProcessor(assetManager);

        fpp.addFilter(water);
        BloomFilter bloom = new BloomFilter();
        //bloom.getE
        bloom.setExposurePower(55);
        bloom.setBloomIntensity(1.0f);
        fpp.addFilter(bloom);
        LightScatteringFilter lsf = new LightScatteringFilter(lightDir.mult(-300));
        lsf.setLightDensity(1.0f);
        fpp.addFilter(lsf);
        DepthOfFieldFilter dof = new DepthOfFieldFilter();
        dof.setFocusDistance(0);
        dof.setFocusRange(100);
        fpp.addFilter(dof);
//        

        //   fpp.addFilter(new TranslucentBucketFilter());
        //       

        // fpp.setNumSamples(4);


        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.setNormalScale(0.5f);

        //water.setRefractionConstant(0.25f);
        water.setRefractionStrength(0.2f);
        //water.setFoamHardness(0.6f);

        water.setWaterHeight(initialWaterHeight);
        uw = cam.getLocation().y < waterHeight;

        waves = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", false);
        waves.setLooping(true);
        waves.setReverbEnabled(true);
        if (uw) {
            waves.setDryFilter(new LowPassFilter(0.5f, 0.1f));
        } else {
            waves.setDryFilter(aboveWaterAudioFilter);
        }
        audioRenderer.playSource(waves);
        //  
        viewPort.addProcessor(fpp);

        inputManager.addListener(new ActionListener() {
            public void onAction(String name, boolean isPressed, float tpf) {
                if (isPressed) {
                    if (name.equals("foam1")) {
                        water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam.jpg"));
                    }
                    if (name.equals("foam2")) {
                        water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam2.jpg"));
                    }
                    if (name.equals("foam3")) {
                        water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam3.jpg"));
                    }

                    if (name.equals("upRM")) {
                        water.setReflectionMapSize(Math.min(water.getReflectionMapSize() * 2, 4096));
                        System.out.println("Reflection map size : " + water.getReflectionMapSize());
                    }
                    if (name.equals("downRM")) {
                        water.setReflectionMapSize(Math.max(water.getReflectionMapSize() / 2, 32));
                        System.out.println("Reflection map size : " + water.getReflectionMapSize());
                    }
                }
            }
        }, "foam1", "foam2", "foam3", "upRM", "downRM");
        inputManager.addMapping("foam1", new KeyTrigger(KeyInput.KEY_1));
        inputManager.addMapping("foam2", new KeyTrigger(KeyInput.KEY_2));
        inputManager.addMapping("foam3", new KeyTrigger(KeyInput.KEY_3));
        inputManager.addMapping("upRM", new KeyTrigger(KeyInput.KEY_PGUP));
        inputManager.addMapping("downRM", new KeyTrigger(KeyInput.KEY_PGDN));
        
    }

    private void createTerrain(Node rootNode) {
        matRock = new Material(assetManager, "Common/MatDefs/Terrain/TerrainLighting.j3md");
        matRock.setBoolean("useTriPlanarMapping", false);
        matRock.setBoolean("WardIso", true);
        matRock.setTexture("AlphaMap", assetManager.loadTexture("Textures/Terrain/splat/alphamap.png"));
        Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png");
        Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
        grass.setWrap(WrapMode.Repeat);
        matRock.setTexture("DiffuseMap", grass);
        matRock.setFloat("DiffuseMap_0_scale", 64);
        Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");
        dirt.setWrap(WrapMode.Repeat);
        matRock.setTexture("DiffuseMap_1", dirt);
        matRock.setFloat("DiffuseMap_1_scale", 16);
        Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg");
        rock.setWrap(WrapMode.Repeat);
        matRock.setTexture("DiffuseMap_2", rock);
        matRock.setFloat("DiffuseMap_2_scale", 128);
        Texture normalMap0 = assetManager.loadTexture("Textures/Terrain/splat/grass_normal.jpg");
        normalMap0.setWrap(WrapMode.Repeat);
        Texture normalMap1 = assetManager.loadTexture("Textures/Terrain/splat/dirt_normal.png");
        normalMap1.setWrap(WrapMode.Repeat);
        Texture normalMap2 = assetManager.loadTexture("Textures/Terrain/splat/road_normal.png");
        normalMap2.setWrap(WrapMode.Repeat);
        matRock.setTexture("NormalMap", normalMap0);
        matRock.setTexture("NormalMap_1", normalMap2);
        matRock.setTexture("NormalMap_2", normalMap2);

        AbstractHeightMap heightmap = null;
        try {
            heightmap = new ImageBasedHeightMap(heightMapImage.getImage(), 0.25f);
            heightmap.load();
        } catch (Exception e) {
            e.printStackTrace();
        }
        terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap());
        List<Camera> cameras = new ArrayList<Camera>();
        cameras.add(getCamera());
        terrain.setMaterial(matRock);
        terrain.setLocalScale(new Vector3f(5, 5, 5));
        terrain.setLocalTranslation(new Vector3f(0, -30, 0));
        terrain.setLocked(false); // unlock it so we can edit the height

        terrain.setShadowMode(ShadowMode.Receive);
        rootNode.attachChild(terrain);

    }
    //This part is to emulate tides, slightly varrying the height of the water plane
    private float time = 0.0f;
    private float waterHeight = 0.0f;
    private float initialWaterHeight = 90f;//0.8f;
    private boolean uw = false;

    @Override
    public void simpleUpdate(float tpf) {
        super.simpleUpdate(tpf);
        
        if(haveFire)
            fire.updateGeometricState();
        
        if(haveBoxTransparent)
            boxTransparent.updateGeometricState();
        
        if(haveWater){
            time += tpf;
            waterHeight = (float) Math.cos(((time * 0.6f) % FastMath.TWO_PI)) * 1.5f;
            water.setWaterHeight(initialWaterHeight + waterHeight);
            if (water.isUnderWater() && !uw) {

                waves.setDryFilter(new LowPassFilter(0.5f, 0.1f));
                uw = true;
            }
            if (!water.isUnderWater() && uw) {
                uw = false;
                //waves.setReverbEnabled(false);
                waves.setDryFilter(new LowPassFilter(1, 1f));
                //waves.setDryFilter(new LowPassFilter(1,1f));

            }
        }
    }
}

Thanks so far though,
not using Translucent with WaterFilter and checking the texture for Alpha was both right.
Sorry for having caused so much trouble.

I think I have an idea what to do now…
Will use the Smoke.png (has an Alpha channel) when the WaterFilter is on.
This should render a nice looking fire.

Will also try to experiment a little with this idea:
Try to use the gray flame texture somehow to mirror the data and load it as an alpha channel.
(But that’s a very long shot - an idea for later which can be delayed now).

Why the transparent box or particles reveal the background underneath the water is what I’d like to know, but don’t really need by now.

Also, I will try to experiment with the heritage water from here: ProjectedGrid and legacy water effects from jME 2 (MrCoder wrote that for jME2, someone ported it to jME3)

Many new ideas,
Thanks to pspeed for the quick and profound help,
Ogli

I’ve got it!!!
:chimpanzee_closedlaugh: (lucky monkey)

So the trick was to add this line:

fpp.addFilter(new TranslucentBucketFilter());

And then to put all transparent objects in the translucent queue.
Works with both "flame.png" (BlendMode.Additive) and "Smoke.png" (BlendMode.Alpha).
I added another mapping “change fire” for KeyInput.KEY_F to toggle between them.
Will probably file an update report (PR) for github once I’ve polished that thing.
Took me all in all more than 10 hours to extract a jewel from a rough diamond…

Pictures:

(using “flame.png” with additive blending)

(using “Smoke.png” with alpha blending)