|
@@ -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<Filter> filters = new ArrayList<Filter>();
|
|
|
+ private SafeArrayList<Filter> filters = new SafeArrayList<Filter>(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<Filter> 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<Filter> 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<Filter> 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>(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 extends Filter> T getFilter(Class<T> filterType) {
|
|
|
- for (Filter c : filters) {
|
|
|
+ for (Filter c : filters.getArray()) {
|
|
|
if (filterType.isAssignableFrom(c.getClass())) {
|
|
|
return (T) c;
|
|
|
}
|