1package jme3test.post;
2
3import com.jme3.app.SimpleApplication;
4import com.jme3.collision.CollisionResult;
5import com.jme3.collision.CollisionResults;
6import com.jme3.input.controls.ActionListener;
7import com.jme3.input.controls.AnalogListener;
8import com.jme3.input.controls.KeyTrigger;
9import com.jme3.light.DirectionalLight;
10import com.jme3.material.Material;
11import com.jme3.math.*;
12import com.jme3.post.FilterPostProcessor;
13import com.jme3.post.filters.DepthOfFieldFilter;
14import com.jme3.renderer.Camera;
15import com.jme3.renderer.queue.RenderQueue.ShadowMode;
16import com.jme3.scene.Node;
17import com.jme3.scene.Spatial;
18import com.jme3.terrain.geomipmap.TerrainQuad;
19import com.jme3.terrain.heightmap.AbstractHeightMap;
20import com.jme3.terrain.heightmap.ImageBasedHeightMap;
21import com.jme3.texture.Texture;
22import com.jme3.texture.Texture.WrapMode;
23import com.jme3.util.SkyFactory;
24import java.util.ArrayList;
25import java.util.List;
26
27/**
28 * test
29 * @author Nehon
30 */
31public 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