Removed the redundant camera.update() calls.

Switched many of the lists to SafeArrayList to avoid
per frame iterator allocations.
experimental
pspeed42 11 years ago
parent 5d6d2b9bd7
commit 852ae28605
  1. 32
      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.Image.Format;
import com.jme3.texture.Texture2D; import com.jme3.texture.Texture2D;
import com.jme3.ui.Picture; import com.jme3.ui.Picture;
import com.jme3.util.SafeArrayList;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -62,7 +63,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
private FrameBuffer renderFrameBuffer; private FrameBuffer renderFrameBuffer;
private Texture2D filterTexture; private Texture2D filterTexture;
private Texture2D depthTexture; private Texture2D depthTexture;
private List<Filter> filters = new ArrayList<Filter>(); private SafeArrayList<Filter> filters = new SafeArrayList<Filter>(Filter.class);
private AssetManager assetManager; private AssetManager assetManager;
private Picture fsQuad; private Picture fsQuad;
private boolean computeDepth = false; private boolean computeDepth = false;
@ -185,7 +186,10 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
if (buff == outputBuffer) { if (buff == outputBuffer) {
viewPort.getCamera().resize(originalWidth, originalHeight, false); viewPort.getCamera().resize(originalWidth, originalHeight, false);
viewPort.getCamera().setViewPort(left, right, bottom, top); 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); renderManager.setCamera( viewPort.getCamera(), false);
if (mat.getAdditionalRenderState().isDepthWrite()) { if (mat.getAdditionalRenderState().isDepthWrite()) {
mat.getAdditionalRenderState().setDepthTest(false); mat.getAdditionalRenderState().setDepthTest(false);
@ -194,7 +198,10 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
}else{ }else{
viewPort.getCamera().resize(buff.getWidth(), buff.getHeight(), false); viewPort.getCamera().resize(buff.getWidth(), buff.getHeight(), false);
viewPort.getCamera().setViewPort(0, 1, 0, 1); 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); renderManager.setCamera( viewPort.getCamera(), false);
mat.getAdditionalRenderState().setDepthTest(true); mat.getAdditionalRenderState().setDepthTest(true);
mat.getAdditionalRenderState().setDepthWrite(true); mat.getAdditionalRenderState().setDepthWrite(true);
@ -216,8 +223,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
public void postQueue(RenderQueue rq) { public void postQueue(RenderQueue rq) {
for (Iterator<Filter> it = filters.iterator(); it.hasNext();) { for (Filter filter : filters.getArray()) {
Filter filter = it.next();
if (filter.isEnabled()) { if (filter.isEnabled()) {
filter.postQueue(rq); filter.postQueue(rq);
} }
@ -330,8 +336,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
} }
} }
for (Iterator<Filter> it = filters.iterator(); it.hasNext();) { for (Filter filter : filters.getArray()) {
Filter filter = it.next();
if (filter.isEnabled()) { if (filter.isEnabled()) {
filter.preFrame(tpf); filter.preFrame(tpf);
} }
@ -392,7 +397,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
if(renderFrameBufferMS != null){ if(renderFrameBufferMS != null){
renderFrameBufferMS.dispose(); renderFrameBufferMS.dispose();
} }
for (Filter filter : filters) { for (Filter filter : filters.getArray()) {
filter.cleanup(renderer); filter.cleanup(renderer);
} }
} }
@ -457,8 +462,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
renderFrameBuffer.setColorTexture(filterTexture); renderFrameBuffer.setColorTexture(filterTexture);
} }
for (Iterator<Filter> it = filters.iterator(); it.hasNext();) { for (Filter filter : filters.getArray()) {
Filter filter = it.next();
initFilter(filter, vp); initFilter(filter, vp);
} }
setupViewPortFrameBuffer(); setupViewPortFrameBuffer();
@ -504,14 +508,14 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
public void write(JmeExporter ex) throws IOException { public void write(JmeExporter ex) throws IOException {
OutputCapsule oc = ex.getCapsule(this); OutputCapsule oc = ex.getCapsule(this);
oc.write(numSamples, "numSamples", 0); 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 { public void read(JmeImporter im) throws IOException {
InputCapsule ic = im.getCapsule(this); InputCapsule ic = im.getCapsule(this);
numSamples = ic.readInt("numSamples", 0); numSamples = ic.readInt("numSamples", 0);
filters = ic.readSavableArrayList("filters", null); filters = new SafeArrayList<Filter>(Filter.class, ic.readSavableArrayList("filters", null));
for (Filter filter : filters) { for (Filter filter : filters.getArray()) {
filter.setProcessor(this); filter.setProcessor(this);
setFilterState(filter, filter.isEnabled()); setFilterState(filter, filter.isEnabled());
} }
@ -543,7 +547,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable {
* @return a filter assignable form the given type * @return a filter assignable form the given type
*/ */
public <T extends Filter> T getFilter(Class<T> filterType) { public <T extends Filter> T getFilter(Class<T> filterType) {
for (Filter c : filters) { for (Filter c : filters.getArray()) {
if (filterType.isAssignableFrom(c.getClass())) { if (filterType.isAssignableFrom(c.getClass())) {
return (T) c; return (T) c;
} }

Loading…
Cancel
Save