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");
}
}