1 /* 2 * Copyright (c) 2009-2010 jMonkeyEngine 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 package com.jme3.post; 34 35 import com.jme3.asset.AssetManager; 36 import com.jme3.material.Material; 37 import com.jme3.material.RenderState; 38 import com.jme3.material.RenderState.FaceCullMode; 39 import com.jme3.renderer.RenderManager; 40 import com.jme3.renderer.ViewPort; 41 import com.jme3.renderer.queue.RenderQueue; 42 import com.jme3.texture.FrameBuffer; 43 44 /** 45 * Processor that lays depth first, this can improve performance in complex 46 * scenes. 47 */ 48 public class PreDepthProcessor implements SceneProcessor { 49 50 private RenderManager rm; 51 private ViewPort vp; 52 private AssetManager assetManager; 53 private Material preDepth; 54 private RenderState forcedRS; 55 56 public PreDepthProcessor(AssetManager assetManager){ 57 this.assetManager = assetManager; 58 preDepth = new Material(assetManager, "Common/MatDefs/Shadow/PreShadow.j3md"); 59 preDepth.getAdditionalRenderState().setPolyOffset(0, 0); 60 preDepth.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Back); 61 62 forcedRS = new RenderState(); 63 forcedRS.setDepthTest(true); 64 forcedRS.setDepthWrite(false); 65 } 66 67 public void initialize(RenderManager rm, ViewPort vp) { 68 this.rm = rm; 69 this.vp = vp; 70 } 71 72 public void reshape(ViewPort vp, int w, int h) { 73 this.vp = vp; 74 } 75 76 public boolean isInitialized() { 77 return vp != null; 78 } 79 80 public void preFrame(float tpf) { 81 } 82 83 public void postQueue(RenderQueue rq) { 84 // lay depth first 85 rm.setForcedMaterial(preDepth); 86 rq.renderQueue(RenderQueue.Bucket.Opaque, rm, vp.getCamera(), false); 87 rm.setForcedMaterial(null); 88 89 rm.setForcedRenderState(forcedRS); 90 } 91 92 public void postFrame(FrameBuffer out) { 93 rm.setForcedRenderState(null); 94 } 95 96 public void cleanup() { 97 vp = null; 98 } 99 100 } 101