159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage jme3test.post;
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.app.SimpleApplication;
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.collision.CollisionResult;
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.collision.CollisionResults;
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.controls.ActionListener;
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.controls.AnalogListener;
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.controls.KeyTrigger;
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.light.DirectionalLight;
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.Material;
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.*;
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.post.FilterPostProcessor;
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.post.filters.DepthOfFieldFilter;
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.Camera;
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.queue.RenderQueue.ShadowMode;
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Node;
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Spatial;
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.terrain.geomipmap.TerrainQuad;
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.terrain.heightmap.AbstractHeightMap;
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.terrain.heightmap.ImageBasedHeightMap;
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture;
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture.WrapMode;
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.SkyFactory;
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.ArrayList;
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.List;
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/**
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * test
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Nehon
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class TestDepthOfField extends SimpleApplication {
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private FilterPostProcessor fpp;
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private Vector3f lightDir = new Vector3f(-4.9236743f, -1.27054665f, 5.896916f);
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    TerrainQuad terrain;
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    Material matRock;
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    DepthOfFieldFilter dofFilter;
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static void main(String[] args) {
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        TestDepthOfField app = new TestDepthOfField();
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        app.start();
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void simpleInitApp() {
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Node mainScene = new Node("Main Scene");
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        rootNode.attachChild(mainScene);
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        createTerrain(mainScene);
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        DirectionalLight sun = new DirectionalLight();
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        sun.setDirection(lightDir);
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        sun.setColor(ColorRGBA.White.clone().multLocal(1.7f));
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        mainScene.addLight(sun);
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        DirectionalLight l = new DirectionalLight();
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        l.setDirection(Vector3f.UNIT_Y.mult(-1));
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        l.setColor(ColorRGBA.White.clone().multLocal(0.3f));
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        mainScene.addLight(l);
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        flyCam.setMoveSpeed(50);
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        cam.setFrustumFar(3000);
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        cam.setLocation(new Vector3f(-700, 100, 300));
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        cam.setRotation(new Quaternion().fromAngles(new float[]{FastMath.PI * 0.06f, FastMath.PI * 0.65f, 0}));
6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false);
6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        sky.setLocalScale(350);
7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        mainScene.attachChild(sky);
7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        fpp = new FilterPostProcessor(assetManager);
7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        //     fpp.setNumSamples(4);
7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        dofFilter = new DepthOfFieldFilter();
7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        dofFilter.setFocusDistance(0);
7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        dofFilter.setFocusRange(50);
8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        dofFilter.setBlurScale(1.4f);
8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        fpp.addFilter(dofFilter);
8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        viewPort.addProcessor(fpp);
8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        inputManager.addListener(new ActionListener() {
8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            public void onAction(String name, boolean isPressed, float tpf) {
8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (isPressed) {
8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    if (name.equals("toggle")) {
8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        dofFilter.setEnabled(!dofFilter.isEnabled());
9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    }
9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }
9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }, "toggle");
9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        inputManager.addListener(new AnalogListener() {
9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            public void onAnalog(String name, float value, float tpf) {
9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (name.equals("blurScaleUp")) {
10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    dofFilter.setBlurScale(dofFilter.getBlurScale() + 0.01f);
10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    System.out.println("blurScale : " + dofFilter.getBlurScale());
10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }
10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (name.equals("blurScaleDown")) {
10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    dofFilter.setBlurScale(dofFilter.getBlurScale() - 0.01f);
10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    System.out.println("blurScale : " + dofFilter.getBlurScale());
10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }
10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (name.equals("focusRangeUp")) {
10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    dofFilter.setFocusRange(dofFilter.getFocusRange() + 1f);
10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    System.out.println("focusRange : " + dofFilter.getFocusRange());
11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }
11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (name.equals("focusRangeDown")) {
11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    dofFilter.setFocusRange(dofFilter.getFocusRange() - 1f);
11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    System.out.println("focusRange : " + dofFilter.getFocusRange());
11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }
11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (name.equals("focusDistanceUp")) {
11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    dofFilter.setFocusDistance(dofFilter.getFocusDistance() + 1f);
11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    System.out.println("focusDistance : " + dofFilter.getFocusDistance());
11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }
11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (name.equals("focusDistanceDown")) {
12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    dofFilter.setFocusDistance(dofFilter.getFocusDistance() - 1f);
12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    System.out.println("focusDistance : " + dofFilter.getFocusDistance());
12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }
12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }, "blurScaleUp", "blurScaleDown", "focusRangeUp", "focusRangeDown", "focusDistanceUp", "focusDistanceDown");
12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        inputManager.addMapping("toggle", new KeyTrigger(keyInput.KEY_SPACE));
12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        inputManager.addMapping("blurScaleUp", new KeyTrigger(keyInput.KEY_U));
13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        inputManager.addMapping("blurScaleDown", new KeyTrigger(keyInput.KEY_J));
13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        inputManager.addMapping("focusRangeUp", new KeyTrigger(keyInput.KEY_I));
13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        inputManager.addMapping("focusRangeDown", new KeyTrigger(keyInput.KEY_K));
13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        inputManager.addMapping("focusDistanceUp", new KeyTrigger(keyInput.KEY_O));
13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        inputManager.addMapping("focusDistanceDown", new KeyTrigger(keyInput.KEY_L));
13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private void createTerrain(Node rootNode) {
13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock = new Material(assetManager, "Common/MatDefs/Terrain/TerrainLighting.j3md");
14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setBoolean("useTriPlanarMapping", false);
14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setBoolean("WardIso", true);
14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setTexture("AlphaMap", assetManager.loadTexture("Textures/Terrain/splat/alphamap.png"));
14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png");
14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        grass.setWrap(WrapMode.Repeat);
14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setTexture("DiffuseMap", grass);
14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setFloat("DiffuseMap_0_scale", 64);
14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");
14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        dirt.setWrap(WrapMode.Repeat);
15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setTexture("DiffuseMap_1", dirt);
15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setFloat("DiffuseMap_1_scale", 16);
15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg");
15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        rock.setWrap(WrapMode.Repeat);
15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setTexture("DiffuseMap_2", rock);
15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setFloat("DiffuseMap_2_scale", 128);
15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Texture normalMap0 = assetManager.loadTexture("Textures/Terrain/splat/grass_normal.jpg");
15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        normalMap0.setWrap(WrapMode.Repeat);
15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Texture normalMap1 = assetManager.loadTexture("Textures/Terrain/splat/dirt_normal.png");
15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        normalMap1.setWrap(WrapMode.Repeat);
16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Texture normalMap2 = assetManager.loadTexture("Textures/Terrain/splat/road_normal.png");
16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        normalMap2.setWrap(WrapMode.Repeat);
16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setTexture("NormalMap", normalMap0);
16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setTexture("NormalMap_1", normalMap2);
16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        matRock.setTexture("NormalMap_2", normalMap2);
16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        AbstractHeightMap heightmap = null;
16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        try {
16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            heightmap = new ImageBasedHeightMap(heightMapImage.getImage(), 0.25f);
16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            heightmap.load();
17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        } catch (Exception e) {
17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            e.printStackTrace();
17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap());
17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        List<Camera> cameras = new ArrayList<Camera>();
17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        cameras.add(getCamera());
17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        terrain.setMaterial(matRock);
17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        terrain.setLocalScale(new Vector3f(5, 5, 5));
17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        terrain.setLocalTranslation(new Vector3f(0, -30, 0));
17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        terrain.setLocked(false); // unlock it so we can edit the height
18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        terrain.setShadowMode(ShadowMode.Receive);
18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        rootNode.attachChild(terrain);
18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void simpleUpdate(float tpf) {
18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Vector3f origin = cam.getWorldCoordinates(new Vector2f(settings.getWidth() / 2, settings.getHeight() / 2), 0.0f);
18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Vector3f direction = cam.getWorldCoordinates(new Vector2f(settings.getWidth() / 2, settings.getHeight() / 2), 0.3f);
19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        direction.subtractLocal(origin).normalizeLocal();
19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Ray ray = new Ray(origin, direction);
19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        CollisionResults results = new CollisionResults();
19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int numCollisions = terrain.collideWith(ray, results);
19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (numCollisions > 0) {
19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            CollisionResult hit = results.getClosestCollision();
19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            fpsText.setText(""+hit.getDistance());
19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            dofFilter.setFocusDistance(hit.getDistance()/10.0f);
19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}
201