diff --git a/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java b/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java index a7de31e9b..92016aa12 100644 --- a/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java +++ b/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java @@ -40,6 +40,7 @@ import com.jme3.texture.FrameBuffer; import com.jme3.texture.Image.Format; import com.jme3.texture.Texture2D; import com.jme3.ui.Picture; +import com.jme3.util.SafeArrayList; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -62,7 +63,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable { private FrameBuffer renderFrameBuffer; private Texture2D filterTexture; private Texture2D depthTexture; - private List filters = new ArrayList(); + private SafeArrayList filters = new SafeArrayList(Filter.class); private AssetManager assetManager; private Picture fsQuad; private boolean computeDepth = false; @@ -185,7 +186,10 @@ public class FilterPostProcessor implements SceneProcessor, Savable { if (buff == outputBuffer) { viewPort.getCamera().resize(originalWidth, originalHeight, false); viewPort.getCamera().setViewPort(left, right, bottom, top); - viewPort.getCamera().update(); + // update is redundant because resize and setViewPort will both + // run the appropriate (and same) onXXXChange methods. + // Also, update() updates some things that don't need to be updated. + //viewPort.getCamera().update(); renderManager.setCamera( viewPort.getCamera(), false); if (mat.getAdditionalRenderState().isDepthWrite()) { mat.getAdditionalRenderState().setDepthTest(false); @@ -194,7 +198,10 @@ public class FilterPostProcessor implements SceneProcessor, Savable { }else{ viewPort.getCamera().resize(buff.getWidth(), buff.getHeight(), false); viewPort.getCamera().setViewPort(0, 1, 0, 1); - viewPort.getCamera().update(); + // update is redundant because resize and setViewPort will both + // run the appropriate (and same) onXXXChange methods. + // Also, update() updates some things that don't need to be updated. + //viewPort.getCamera().update(); renderManager.setCamera( viewPort.getCamera(), false); mat.getAdditionalRenderState().setDepthTest(true); mat.getAdditionalRenderState().setDepthWrite(true); @@ -216,8 +223,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable { public void postQueue(RenderQueue rq) { - for (Iterator it = filters.iterator(); it.hasNext();) { - Filter filter = it.next(); + for (Filter filter : filters.getArray()) { if (filter.isEnabled()) { filter.postQueue(rq); } @@ -330,8 +336,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable { } } - for (Iterator it = filters.iterator(); it.hasNext();) { - Filter filter = it.next(); + for (Filter filter : filters.getArray()) { if (filter.isEnabled()) { filter.preFrame(tpf); } @@ -392,7 +397,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable { if(renderFrameBufferMS != null){ renderFrameBufferMS.dispose(); } - for (Filter filter : filters) { + for (Filter filter : filters.getArray()) { filter.cleanup(renderer); } } @@ -457,8 +462,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable { renderFrameBuffer.setColorTexture(filterTexture); } - for (Iterator it = filters.iterator(); it.hasNext();) { - Filter filter = it.next(); + for (Filter filter : filters.getArray()) { initFilter(filter, vp); } setupViewPortFrameBuffer(); @@ -504,14 +508,14 @@ public class FilterPostProcessor implements SceneProcessor, Savable { public void write(JmeExporter ex) throws IOException { OutputCapsule oc = ex.getCapsule(this); oc.write(numSamples, "numSamples", 0); - oc.writeSavableArrayList((ArrayList) filters, "filters", null); + oc.writeSavableArrayList(new ArrayList(filters), "filters", null); } public void read(JmeImporter im) throws IOException { InputCapsule ic = im.getCapsule(this); numSamples = ic.readInt("numSamples", 0); - filters = ic.readSavableArrayList("filters", null); - for (Filter filter : filters) { + filters = new SafeArrayList(Filter.class, ic.readSavableArrayList("filters", null)); + for (Filter filter : filters.getArray()) { filter.setProcessor(this); setFilterState(filter, filter.isEnabled()); } @@ -543,7 +547,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable { * @return a filter assignable form the given type */ public T getFilter(Class filterType) { - for (Filter c : filters) { + for (Filter c : filters.getArray()) { if (filterType.isAssignableFrom(c.getClass())) { return (T) c; }