Filters randomly crashing

Hey guys!
When I add filters to my scene, it randomly crashes.
I made a little test case:


package mygame;

import com.jme3.app.SimpleApplication;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
import com.jme3.post.filters.BloomFilter;
import com.jme3.post.filters.CartoonEdgeFilter;
import com.jme3.post.filters.LightScatteringFilter;
import com.jme3.post.filters.PosterizationFilter;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;

public class Main extends SimpleApplication implements ActionListener
{

    public static void main(String[] args)
    {
        new Main().start();
    }
    FilterPostProcessor fpp;

    @Override
    public void simpleInitApp()
    {
        Geometry geom = new Geometry("Box", new Box(1, 1, 1));
        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        geom.setMaterial(mat);
        rootNode.attachChild(geom);
        initInput();
        fpp = new FilterPostProcessor(assetManager);
        viewPort.addProcessor(fpp);
    }

    @Override
    public void onAction(String name, boolean isPressed, float tpf)
    {
        if (isPressed)
        {
            if (name.equals("LightScattering"))
            {
                fpp.addFilter(new LightScatteringFilter(Vector3f.ZERO));
                System.out.println("Adding " + name);
            } else if (name.equals("Posterization"))
            {
                fpp.addFilter(new PosterizationFilter(12));
                System.out.println("Adding " + name);
            } else if (name.equals("Cartoon"))
            {
                fpp.addFilter(new CartoonEdgeFilter());
                System.out.println("Adding " + name);
            } else if (name.equals("Bloom"))
            {
                fpp.addFilter(new BloomFilter(BloomFilter.GlowMode.Scene));
                System.out.println("Adding " + name);
            }
        }
    }

    private void initInput()
    {
        inputManager.addMapping("LightScattering", new KeyTrigger(KeyInput.KEY_L));
        inputManager.addMapping("Posterization", new KeyTrigger(KeyInput.KEY_P));
        inputManager.addMapping("Bloom", new KeyTrigger(KeyInput.KEY_B));
        inputManager.addMapping("Cartoon", new KeyTrigger(KeyInput.KEY_C));
        inputManager.addListener(this, "LightScattering");
        inputManager.addListener(this, "Posterization");
        inputManager.addListener(this, "Bloom");
        inputManager.addListener(this, "Cartoon");
    }
}

It creates the default scene with a box.
By pressing L, you add a LightScatteringFilter, with P Posterization, B Bloom and C Cartoon.
Sometimes when I run it, it works fine, but most times, it crashes after 2 or 3 filters with the following exception:


java.lang.UnsupportedOperationException: FrameBuffer already initialized.
	at com.jme3.texture.FrameBuffer.setDepthTexture(FrameBuffer.java:400)
	at com.jme3.post.FilterPostProcessor.initFilter(FilterPostProcessor.java:162)
	at com.jme3.post.FilterPostProcessor.addFilter(FilterPostProcessor.java:109)
	at mygame.Main.onAction(Main.java:69)
	at com.jme3.input.InputManager.invokeActions(InputManager.java:169)
	at com.jme3.input.InputManager.onKeyEventQueued(InputManager.java:455)
	at com.jme3.input.InputManager.processQueue(InputManager.java:831)
	at com.jme3.input.InputManager.update(InputManager.java:883)
	at com.jme3.app.Application.update(Application.java:604)
	at com.jme3.app.SimpleApplication.update(SimpleApplication.java:231)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:151)
	at com.jme3.system.lwjgl.LwjglDisplay.runLoop(LwjglDisplay.java:185)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:228)
	at java.lang.Thread.run(Thread.java:744)

For instance: It never works when I first add Posterization and LightScattering afterwards.

I posted a similar thread some time ago HERE
But it did not lead to anything, I thought it was only caused by adding bloom - and water filters and I kind of ended up making a fool of myself…
So, second attempt:
Does anyone know what is causing that / how to avoid it (except not letting the user decide what filters to add)?

Thank you.

EDIT: Don’t know why " looks so weird in code view, sorry about that.
Here it is as plain text:
package mygame;

import com.jme3.app.SimpleApplication;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
import com.jme3.post.filters.BloomFilter;
import com.jme3.post.filters.CartoonEdgeFilter;
import com.jme3.post.filters.LightScatteringFilter;
import com.jme3.post.filters.PosterizationFilter;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;

public class Main extends SimpleApplication implements ActionListener
{

public static void main(String[] args)
{
    new Main().start();
}
FilterPostProcessor fpp;

@Override
public void simpleInitApp()
{
    Geometry geom = new Geometry("Box", new Box(1, 1, 1));
    Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
    geom.setMaterial(mat);
    rootNode.attachChild(geom);
    initInput();
    fpp = new FilterPostProcessor(assetManager);
    viewPort.addProcessor(fpp);
}

@Override
public void onAction(String name, boolean isPressed, float tpf)
{
    if (isPressed)
    {
        if (name.equals("LightScattering"))
        {
            fpp.addFilter(new LightScatteringFilter(Vector3f.ZERO));
            System.out.println("Adding " + name);
        } else if (name.equals("Posterization"))
        {
            fpp.addFilter(new PosterizationFilter(12));
            System.out.println("Adding " + name);
        } else if (name.equals("Cartoon"))
        {
            fpp.addFilter(new CartoonEdgeFilter());
            System.out.println("Adding " + name);
        } else if (name.equals("Bloom"))
        {
            fpp.addFilter(new BloomFilter(BloomFilter.GlowMode.Scene));
            System.out.println("Adding " + name);
        }
    }
}

private void initInput()
{
    inputManager.addMapping("LightScattering", new KeyTrigger(KeyInput.KEY_L));
    inputManager.addMapping("Posterization", new KeyTrigger(KeyInput.KEY_P));
    inputManager.addMapping("Bloom", new KeyTrigger(KeyInput.KEY_B));
    inputManager.addMapping("Cartoon", new KeyTrigger(KeyInput.KEY_C));
    inputManager.addListener(this, "LightScattering");
    inputManager.addListener(this, "Posterization");
    inputManager.addListener(this, "Bloom");
    inputManager.addListener(this, "Cartoon");
}

}

1 Like

Mhh that’s strange.
I reproduced the issue by adding bloom then light scattering.
Gonna look into it. thanks for the test case.