Home | History | Annotate | Download | only in post
      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 jme3test.post;
     34 
     35 import com.jme3.app.SimpleApplication;
     36 import com.jme3.material.Material;
     37 import com.jme3.renderer.RenderManager;
     38 import com.jme3.renderer.Renderer;
     39 import com.jme3.scene.Geometry;
     40 import com.jme3.scene.Node;
     41 import com.jme3.scene.shape.Sphere;
     42 import com.jme3.texture.FrameBuffer;
     43 import com.jme3.texture.Image.Format;
     44 import com.jme3.texture.Texture2D;
     45 import com.jme3.ui.Picture;
     46 
     47 /**
     48  * Demonstrates FrameBuffer usage.
     49  * The scene is first rendered to an FB with a texture attached,
     50  * the texture is then rendered onto the screen in ortho mode.
     51  *
     52  * @author Kirill
     53  */
     54 public class TestFBOPassthrough extends SimpleApplication {
     55 
     56     private Node fbNode = new Node("Framebuffer Node");
     57     private FrameBuffer fb;
     58 
     59     public static void main(String[] args){
     60         TestFBOPassthrough app = new TestFBOPassthrough();
     61         app.start();
     62     }
     63 
     64     @Override
     65     public void simpleInitApp() {
     66         int w = settings.getWidth();
     67         int h = settings.getHeight();
     68 
     69         //setup framebuffer
     70         fb = new FrameBuffer(w, h, 1);
     71 
     72         Texture2D fbTex = new Texture2D(w, h, Format.RGBA8);
     73         fb.setDepthBuffer(Format.Depth);
     74         fb.setColorTexture(fbTex);
     75 
     76         // setup framebuffer's scene
     77         Sphere sphMesh = new Sphere(20, 20, 1);
     78         Material solidColor = assetManager.loadMaterial("Common/Materials/RedColor.j3m");
     79 
     80         Geometry sphere = new Geometry("sphere", sphMesh);
     81         sphere.setMaterial(solidColor);
     82         fbNode.attachChild(sphere);
     83 
     84         //setup main scene
     85         Picture p = new Picture("Picture");
     86         p.setPosition(0, 0);
     87         p.setWidth(w);
     88         p.setHeight(h);
     89         p.setTexture(assetManager, fbTex, false);
     90 
     91         rootNode.attachChild(p);
     92     }
     93 
     94     @Override
     95     public void simpleUpdate(float tpf){
     96         fbNode.updateLogicalState(tpf);
     97         fbNode.updateGeometricState();
     98     }
     99 
    100     @Override
    101     public void simpleRender(RenderManager rm){
    102         Renderer r = rm.getRenderer();
    103 
    104         //do FBO rendering
    105         r.setFrameBuffer(fb);
    106 
    107         rm.setCamera(cam, false); // FBO uses current camera
    108         r.clearBuffers(true, true, true);
    109         rm.renderScene(fbNode, viewPort);
    110         rm.flushQueue(viewPort);
    111 
    112         //go back to default rendering and let
    113         //SimpleApplication render the default scene
    114         r.setFrameBuffer(null);
    115     }
    116 
    117 }
    118