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