1 package jme3test.terrain; 2 3 import com.jme3.app.SimpleApplication; 4 import com.jme3.app.state.ScreenshotAppState; 5 import com.jme3.asset.plugins.HttpZipLocator; 6 import com.jme3.asset.plugins.ZipLocator; 7 import com.jme3.bullet.BulletAppState; 8 import com.jme3.bullet.collision.shapes.CapsuleCollisionShape; 9 import com.jme3.bullet.collision.shapes.HeightfieldCollisionShape; 10 import com.jme3.bullet.control.CharacterControl; 11 import com.jme3.bullet.control.RigidBodyControl; 12 import com.jme3.input.KeyInput; 13 import com.jme3.input.controls.ActionListener; 14 import com.jme3.input.controls.KeyTrigger; 15 import com.jme3.material.Material; 16 import com.jme3.math.ColorRGBA; 17 import com.jme3.math.Vector3f; 18 import com.jme3.terrain.geomipmap.TerrainGrid; 19 import com.jme3.terrain.geomipmap.TerrainGridListener; 20 import com.jme3.terrain.geomipmap.TerrainLodControl; 21 import com.jme3.terrain.geomipmap.TerrainQuad; 22 import com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator; 23 import java.io.File; 24 25 public class TerrainGridSerializationTest extends SimpleApplication { 26 27 private TerrainGrid terrain; 28 private boolean usePhysics = true; 29 30 public static void main(final String[] args) { 31 TerrainGridSerializationTest app = new TerrainGridSerializationTest(); 32 app.start(); 33 } 34 private CharacterControl player3; 35 36 @Override 37 public void simpleInitApp() { 38 File file = new File("TerrainGridTestData.zip"); 39 if (!file.exists()) { 40 assetManager.registerLocator("http://jmonkeyengine.googlecode.com/files/TerrainGridTestData.zip", HttpZipLocator.class); 41 } else { 42 assetManager.registerLocator("TerrainGridTestData.zip", ZipLocator.class); 43 } 44 45 this.flyCam.setMoveSpeed(100f); 46 ScreenshotAppState state = new ScreenshotAppState(); 47 this.stateManager.attach(state); 48 49 this.terrain= (TerrainGrid) assetManager.loadModel("TerrainGrid/TerrainGrid.j3o"); 50 51 this.rootNode.attachChild(this.terrain); 52 53 TerrainLodControl control = new TerrainLodControl(this.terrain, getCamera()); 54 control.setLodCalculator( new DistanceLodCalculator(65, 2.7f) ); // patch size, and a multiplier 55 this.terrain.addControl(control); 56 57 final BulletAppState bulletAppState = new BulletAppState(); 58 stateManager.attach(bulletAppState); 59 60 this.getCamera().setLocation(new Vector3f(0, 256, 0)); 61 62 this.viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f)); 63 64 if (usePhysics) { 65 CapsuleCollisionShape capsuleShape = new CapsuleCollisionShape(0.5f, 1.8f, 1); 66 player3 = new CharacterControl(capsuleShape, 0.5f); 67 player3.setJumpSpeed(20); 68 player3.setFallSpeed(10); 69 player3.setGravity(10); 70 71 player3.setPhysicsLocation(new Vector3f(cam.getLocation().x, 256, cam.getLocation().z)); 72 73 bulletAppState.getPhysicsSpace().add(player3); 74 75 terrain.addListener(new TerrainGridListener() { 76 77 public void gridMoved(Vector3f newCenter) { 78 } 79 80 public Material tileLoaded(Material material, Vector3f cell) { 81 return material; 82 } 83 84 public void tileAttached(Vector3f cell, TerrainQuad quad) { 85 //workaround for bugged test j3o's 86 while(quad.getControl(RigidBodyControl.class)!=null){ 87 quad.removeControl(RigidBodyControl.class); 88 } 89 quad.addControl(new RigidBodyControl(new HeightfieldCollisionShape(quad.getHeightMap(), terrain.getLocalScale()), 0)); 90 bulletAppState.getPhysicsSpace().add(quad); 91 } 92 93 public void tileDetached(Vector3f cell, TerrainQuad quad) { 94 bulletAppState.getPhysicsSpace().remove(quad); 95 quad.removeControl(RigidBodyControl.class); 96 } 97 98 }); 99 } 100 101 this.initKeys(); 102 } 103 104 private void initKeys() { 105 // You can map one or several inputs to one named action 106 this.inputManager.addMapping("Lefts", new KeyTrigger(KeyInput.KEY_A)); 107 this.inputManager.addMapping("Rights", new KeyTrigger(KeyInput.KEY_D)); 108 this.inputManager.addMapping("Ups", new KeyTrigger(KeyInput.KEY_W)); 109 this.inputManager.addMapping("Downs", new KeyTrigger(KeyInput.KEY_S)); 110 this.inputManager.addMapping("Jumps", new KeyTrigger(KeyInput.KEY_SPACE)); 111 this.inputManager.addListener(this.actionListener, "Lefts"); 112 this.inputManager.addListener(this.actionListener, "Rights"); 113 this.inputManager.addListener(this.actionListener, "Ups"); 114 this.inputManager.addListener(this.actionListener, "Downs"); 115 this.inputManager.addListener(this.actionListener, "Jumps"); 116 } 117 private boolean left; 118 private boolean right; 119 private boolean up; 120 private boolean down; 121 private final ActionListener actionListener = new ActionListener() { 122 123 @Override 124 public void onAction(final String name, final boolean keyPressed, final float tpf) { 125 if (name.equals("Lefts")) { 126 if (keyPressed) { 127 TerrainGridSerializationTest.this.left = true; 128 } else { 129 TerrainGridSerializationTest.this.left = false; 130 } 131 } else if (name.equals("Rights")) { 132 if (keyPressed) { 133 TerrainGridSerializationTest.this.right = true; 134 } else { 135 TerrainGridSerializationTest.this.right = false; 136 } 137 } else if (name.equals("Ups")) { 138 if (keyPressed) { 139 TerrainGridSerializationTest.this.up = true; 140 } else { 141 TerrainGridSerializationTest.this.up = false; 142 } 143 } else if (name.equals("Downs")) { 144 if (keyPressed) { 145 TerrainGridSerializationTest.this.down = true; 146 } else { 147 TerrainGridSerializationTest.this.down = false; 148 } 149 } else if (name.equals("Jumps")) { 150 TerrainGridSerializationTest.this.player3.jump(); 151 } 152 } 153 }; 154 private final Vector3f walkDirection = new Vector3f(); 155 156 @Override 157 public void simpleUpdate(final float tpf) { 158 Vector3f camDir = this.cam.getDirection().clone().multLocal(0.6f); 159 Vector3f camLeft = this.cam.getLeft().clone().multLocal(0.4f); 160 this.walkDirection.set(0, 0, 0); 161 if (this.left) { 162 this.walkDirection.addLocal(camLeft); 163 } 164 if (this.right) { 165 this.walkDirection.addLocal(camLeft.negate()); 166 } 167 if (this.up) { 168 this.walkDirection.addLocal(camDir); 169 } 170 if (this.down) { 171 this.walkDirection.addLocal(camDir.negate()); 172 } 173 174 if (usePhysics) { 175 this.player3.setWalkDirection(this.walkDirection); 176 this.cam.setLocation(this.player3.getPhysicsLocation()); 177 } 178 } 179 } 180