Home | History | Annotate | Download | only in post
      1 package jme3test.post;
      2 
      3 import com.jme3.app.SimpleApplication;
      4 import com.jme3.collision.CollisionResult;
      5 import com.jme3.collision.CollisionResults;
      6 import com.jme3.input.controls.ActionListener;
      7 import com.jme3.input.controls.AnalogListener;
      8 import com.jme3.input.controls.KeyTrigger;
      9 import com.jme3.light.DirectionalLight;
     10 import com.jme3.material.Material;
     11 import com.jme3.math.*;
     12 import com.jme3.post.FilterPostProcessor;
     13 import com.jme3.post.filters.DepthOfFieldFilter;
     14 import com.jme3.renderer.Camera;
     15 import com.jme3.renderer.queue.RenderQueue.ShadowMode;
     16 import com.jme3.scene.Node;
     17 import com.jme3.scene.Spatial;
     18 import com.jme3.terrain.geomipmap.TerrainQuad;
     19 import com.jme3.terrain.heightmap.AbstractHeightMap;
     20 import com.jme3.terrain.heightmap.ImageBasedHeightMap;
     21 import com.jme3.texture.Texture;
     22 import com.jme3.texture.Texture.WrapMode;
     23 import com.jme3.util.SkyFactory;
     24 import java.util.ArrayList;
     25 import java.util.List;
     26 
     27 /**
     28  * test
     29  * @author Nehon
     30  */
     31 public class TestDepthOfField extends SimpleApplication {
     32 
     33     private FilterPostProcessor fpp;
     34     private Vector3f lightDir = new Vector3f(-4.9236743f, -1.27054665f, 5.896916f);
     35     TerrainQuad terrain;
     36     Material matRock;
     37     DepthOfFieldFilter dofFilter;
     38 
     39     public static void main(String[] args) {
     40         TestDepthOfField app = new TestDepthOfField();
     41         app.start();
     42     }
     43 
     44     @Override
     45     public void simpleInitApp() {
     46 
     47 
     48         Node mainScene = new Node("Main Scene");
     49         rootNode.attachChild(mainScene);
     50 
     51         createTerrain(mainScene);
     52         DirectionalLight sun = new DirectionalLight();
     53         sun.setDirection(lightDir);
     54         sun.setColor(ColorRGBA.White.clone().multLocal(1.7f));
     55         mainScene.addLight(sun);
     56 
     57         DirectionalLight l = new DirectionalLight();
     58         l.setDirection(Vector3f.UNIT_Y.mult(-1));
     59         l.setColor(ColorRGBA.White.clone().multLocal(0.3f));
     60         mainScene.addLight(l);
     61 
     62         flyCam.setMoveSpeed(50);
     63         cam.setFrustumFar(3000);
     64         cam.setLocation(new Vector3f(-700, 100, 300));
     65         cam.setRotation(new Quaternion().fromAngles(new float[]{FastMath.PI * 0.06f, FastMath.PI * 0.65f, 0}));
     66 
     67 
     68         Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false);
     69         sky.setLocalScale(350);
     70         mainScene.attachChild(sky);
     71 
     72 
     73 
     74         fpp = new FilterPostProcessor(assetManager);
     75         //     fpp.setNumSamples(4);
     76 
     77         dofFilter = new DepthOfFieldFilter();
     78         dofFilter.setFocusDistance(0);
     79         dofFilter.setFocusRange(50);
     80         dofFilter.setBlurScale(1.4f);
     81         fpp.addFilter(dofFilter);
     82         viewPort.addProcessor(fpp);
     83 
     84         inputManager.addListener(new ActionListener() {
     85 
     86             public void onAction(String name, boolean isPressed, float tpf) {
     87                 if (isPressed) {
     88                     if (name.equals("toggle")) {
     89                         dofFilter.setEnabled(!dofFilter.isEnabled());
     90                     }
     91 
     92 
     93                 }
     94             }
     95         }, "toggle");
     96         inputManager.addListener(new AnalogListener() {
     97 
     98             public void onAnalog(String name, float value, float tpf) {
     99                 if (name.equals("blurScaleUp")) {
    100                     dofFilter.setBlurScale(dofFilter.getBlurScale() + 0.01f);
    101                     System.out.println("blurScale : " + dofFilter.getBlurScale());
    102                 }
    103                 if (name.equals("blurScaleDown")) {
    104                     dofFilter.setBlurScale(dofFilter.getBlurScale() - 0.01f);
    105                     System.out.println("blurScale : " + dofFilter.getBlurScale());
    106                 }
    107                 if (name.equals("focusRangeUp")) {
    108                     dofFilter.setFocusRange(dofFilter.getFocusRange() + 1f);
    109                     System.out.println("focusRange : " + dofFilter.getFocusRange());
    110                 }
    111                 if (name.equals("focusRangeDown")) {
    112                     dofFilter.setFocusRange(dofFilter.getFocusRange() - 1f);
    113                     System.out.println("focusRange : " + dofFilter.getFocusRange());
    114                 }
    115                 if (name.equals("focusDistanceUp")) {
    116                     dofFilter.setFocusDistance(dofFilter.getFocusDistance() + 1f);
    117                     System.out.println("focusDistance : " + dofFilter.getFocusDistance());
    118                 }
    119                 if (name.equals("focusDistanceDown")) {
    120                     dofFilter.setFocusDistance(dofFilter.getFocusDistance() - 1f);
    121                     System.out.println("focusDistance : " + dofFilter.getFocusDistance());
    122                 }
    123 
    124             }
    125         }, "blurScaleUp", "blurScaleDown", "focusRangeUp", "focusRangeDown", "focusDistanceUp", "focusDistanceDown");
    126 
    127 
    128         inputManager.addMapping("toggle", new KeyTrigger(keyInput.KEY_SPACE));
    129         inputManager.addMapping("blurScaleUp", new KeyTrigger(keyInput.KEY_U));
    130         inputManager.addMapping("blurScaleDown", new KeyTrigger(keyInput.KEY_J));
    131         inputManager.addMapping("focusRangeUp", new KeyTrigger(keyInput.KEY_I));
    132         inputManager.addMapping("focusRangeDown", new KeyTrigger(keyInput.KEY_K));
    133         inputManager.addMapping("focusDistanceUp", new KeyTrigger(keyInput.KEY_O));
    134         inputManager.addMapping("focusDistanceDown", new KeyTrigger(keyInput.KEY_L));
    135 
    136     }
    137 
    138     private void createTerrain(Node rootNode) {
    139         matRock = new Material(assetManager, "Common/MatDefs/Terrain/TerrainLighting.j3md");
    140         matRock.setBoolean("useTriPlanarMapping", false);
    141         matRock.setBoolean("WardIso", true);
    142         matRock.setTexture("AlphaMap", assetManager.loadTexture("Textures/Terrain/splat/alphamap.png"));
    143         Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png");
    144         Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
    145         grass.setWrap(WrapMode.Repeat);
    146         matRock.setTexture("DiffuseMap", grass);
    147         matRock.setFloat("DiffuseMap_0_scale", 64);
    148         Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");
    149         dirt.setWrap(WrapMode.Repeat);
    150         matRock.setTexture("DiffuseMap_1", dirt);
    151         matRock.setFloat("DiffuseMap_1_scale", 16);
    152         Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg");
    153         rock.setWrap(WrapMode.Repeat);
    154         matRock.setTexture("DiffuseMap_2", rock);
    155         matRock.setFloat("DiffuseMap_2_scale", 128);
    156         Texture normalMap0 = assetManager.loadTexture("Textures/Terrain/splat/grass_normal.jpg");
    157         normalMap0.setWrap(WrapMode.Repeat);
    158         Texture normalMap1 = assetManager.loadTexture("Textures/Terrain/splat/dirt_normal.png");
    159         normalMap1.setWrap(WrapMode.Repeat);
    160         Texture normalMap2 = assetManager.loadTexture("Textures/Terrain/splat/road_normal.png");
    161         normalMap2.setWrap(WrapMode.Repeat);
    162         matRock.setTexture("NormalMap", normalMap0);
    163         matRock.setTexture("NormalMap_1", normalMap2);
    164         matRock.setTexture("NormalMap_2", normalMap2);
    165 
    166         AbstractHeightMap heightmap = null;
    167         try {
    168             heightmap = new ImageBasedHeightMap(heightMapImage.getImage(), 0.25f);
    169             heightmap.load();
    170         } catch (Exception e) {
    171             e.printStackTrace();
    172         }
    173         terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap());
    174         List<Camera> cameras = new ArrayList<Camera>();
    175         cameras.add(getCamera());
    176         terrain.setMaterial(matRock);
    177         terrain.setLocalScale(new Vector3f(5, 5, 5));
    178         terrain.setLocalTranslation(new Vector3f(0, -30, 0));
    179         terrain.setLocked(false); // unlock it so we can edit the height
    180 
    181         terrain.setShadowMode(ShadowMode.Receive);
    182         rootNode.attachChild(terrain);
    183 
    184     }
    185 
    186     @Override
    187     public void simpleUpdate(float tpf) {
    188         Vector3f origin = cam.getWorldCoordinates(new Vector2f(settings.getWidth() / 2, settings.getHeight() / 2), 0.0f);
    189         Vector3f direction = cam.getWorldCoordinates(new Vector2f(settings.getWidth() / 2, settings.getHeight() / 2), 0.3f);
    190         direction.subtractLocal(origin).normalizeLocal();
    191         Ray ray = new Ray(origin, direction);
    192         CollisionResults results = new CollisionResults();
    193         int numCollisions = terrain.collideWith(ray, results);
    194         if (numCollisions > 0) {
    195             CollisionResult hit = results.getClosestCollision();
    196             fpsText.setText(""+hit.getDistance());
    197             dofFilter.setFocusDistance(hit.getDistance()/10.0f);
    198         }
    199     }
    200 }
    201