1package jme3test.terrain;
2
3import com.jme3.app.SimpleApplication;
4import com.jme3.app.state.ScreenshotAppState;
5import com.jme3.asset.plugins.HttpZipLocator;
6import com.jme3.asset.plugins.ZipLocator;
7import com.jme3.bullet.BulletAppState;
8import com.jme3.bullet.collision.shapes.CapsuleCollisionShape;
9import com.jme3.bullet.collision.shapes.HeightfieldCollisionShape;
10import com.jme3.bullet.control.CharacterControl;
11import com.jme3.bullet.control.RigidBodyControl;
12import com.jme3.input.KeyInput;
13import com.jme3.input.controls.ActionListener;
14import com.jme3.input.controls.KeyTrigger;
15import com.jme3.material.Material;
16import com.jme3.math.ColorRGBA;
17import com.jme3.math.Vector3f;
18import com.jme3.terrain.geomipmap.TerrainGrid;
19import com.jme3.terrain.geomipmap.TerrainGridListener;
20import com.jme3.terrain.geomipmap.TerrainLodControl;
21import com.jme3.terrain.geomipmap.TerrainQuad;
22import com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator;
23import java.io.File;
24
25public 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