Fix: the new way to add physics to terrainGrid is to use the listener interface, see updated tests
new heightmaps are provided for TerrainGridTest git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7836 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
4eeab63f9f
commit
07e096ae71
Binary file not shown.
@ -106,6 +106,7 @@ public class TerrainGrid extends TerrainQuad {
|
||||
final TerrainQuad newQuad = q;
|
||||
// back on the OpenGL thread:
|
||||
getControl(UpdateControl.class).enqueue(new Callable() {
|
||||
|
||||
public Object call() throws Exception {
|
||||
attachQuadAt(newQuad, quadrant, temp);
|
||||
return null;
|
||||
@ -123,14 +124,15 @@ public class TerrainGrid extends TerrainQuad {
|
||||
}
|
||||
|
||||
private int getQuadrant(int quadIndex) {
|
||||
if (quadIndex == 9)
|
||||
if (quadIndex == 9) {
|
||||
return 1;
|
||||
else if (quadIndex == 5)
|
||||
} else if (quadIndex == 5) {
|
||||
return 2;
|
||||
else if (quadIndex == 10)
|
||||
} else if (quadIndex == 10) {
|
||||
return 3;
|
||||
else if (quadIndex == 6)
|
||||
} else if (quadIndex == 6) {
|
||||
return 4;
|
||||
}
|
||||
return 0; // error
|
||||
}
|
||||
|
||||
@ -190,6 +192,7 @@ public class TerrainGrid extends TerrainQuad {
|
||||
for (TerrainGridListener l : this.listeners.values()) {
|
||||
l.gridMoved(camCell);
|
||||
}
|
||||
updatePhysics();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -205,6 +208,7 @@ public class TerrainGrid extends TerrainQuad {
|
||||
for (TerrainGridListener l : this.listeners.values()) {
|
||||
l.gridMoved(camCell);
|
||||
}
|
||||
updatePhysics();
|
||||
}
|
||||
|
||||
super.update(locations);
|
||||
@ -250,7 +254,7 @@ public class TerrainGrid extends TerrainQuad {
|
||||
updateModelBound();
|
||||
}
|
||||
|
||||
private void updateChildrens(Vector3f cam) {
|
||||
public void updatePhysics() {
|
||||
RigidBodyControl control = getControl(RigidBodyControl.class);
|
||||
if (control != null) {
|
||||
this.space = control.getPhysicsSpace();
|
||||
@ -261,22 +265,29 @@ public class TerrainGrid extends TerrainQuad {
|
||||
for (int i = 0; i < 4; i++) {
|
||||
int collisionGroupsCollideWith = control.getCollideWithGroups();
|
||||
int collisionGroups = control.getCollisionGroup();
|
||||
quadControls[i] = new RigidBodyControl(new HeightfieldCollisionShape(new float[quadSize * quadSize], getLocalScale()), 0);
|
||||
TerrainQuad q = getQuad(i + 1);
|
||||
quadControls[i] = new RigidBodyControl(new HeightfieldCollisionShape(q == null ? new float[quadSize * quadSize] : q.getHeightMap(), getLocalScale()), 0);
|
||||
quadControls[i].setCollideWithGroups(collisionGroupsCollideWith);
|
||||
quadControls[i].setCollisionGroup(collisionGroups);
|
||||
//quadControls[i].setPhysicsSpace(space);
|
||||
//this.addControl(quadControls[i]);
|
||||
//space.add(quadControls[i]);
|
||||
if (q != null) {
|
||||
getQuad(i + 1).addControl(quadControls[i]);
|
||||
space.add(quadControls[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateChildrens(Vector3f cam) {
|
||||
//TerrainQuad q1 = cache.get(cam.add(quadIndex[9]));
|
||||
//TerrainQuad q2 = cache.get(cam.add(quadIndex[5]));
|
||||
//TerrainQuad q3 = cache.get(cam.add(quadIndex[10]));
|
||||
//TerrainQuad q4 = cache.get(cam.add(quadIndex[6]));
|
||||
|
||||
// ---------------------------------------------------
|
||||
// what does this block do?
|
||||
// LRU cache is used, so elements that need to remain
|
||||
// should be touched.
|
||||
// ---------------------------------------------------
|
||||
int dx = 0;
|
||||
int dy = 0;
|
||||
@ -309,8 +320,9 @@ public class TerrainGrid extends TerrainQuad {
|
||||
// ---------------------------------------------------
|
||||
// ---------------------------------------------------
|
||||
|
||||
if (executor == null)
|
||||
if (executor == null) {
|
||||
executor = createExecutorService();
|
||||
}
|
||||
|
||||
executor.submit(new UpdateQuadCache(cam));
|
||||
|
||||
@ -372,11 +384,50 @@ public class TerrainGrid extends TerrainQuad {
|
||||
@Override
|
||||
public void adjustHeight(List<Vector2f> xz, List<Float> height) {
|
||||
Vector3f currentGridLocation = getCurrentCell().mult(getLocalScale()).multLocal(quadSize - 1);
|
||||
for ( Vector2f vect : xz )
|
||||
{
|
||||
for (Vector2f vect : xz) {
|
||||
vect.x -= currentGridLocation.x;
|
||||
vect.y -= currentGridLocation.z;
|
||||
}
|
||||
super.adjustHeight(xz, height);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TerrainQuad findDownQuad() {
|
||||
if (quadrant == 1) {
|
||||
return cache.get(currentCell.add(quadIndex[13]));
|
||||
} else if (quadrant == 3) {
|
||||
return cache.get(currentCell.add(quadIndex[14]));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TerrainQuad findLeftQuad() {
|
||||
if (quadrant == 1) {
|
||||
return cache.get(currentCell.add(quadIndex[8]));
|
||||
} else if (quadrant == 2) {
|
||||
return cache.get(currentCell.add(quadIndex[4]));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TerrainQuad findRightQuad() {
|
||||
if (quadrant == 3) {
|
||||
return cache.get(currentCell.add(quadIndex[11]));
|
||||
} else if (quadrant == 4) {
|
||||
return cache.get(currentCell.add(quadIndex[7]));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TerrainQuad findTopQuad() {
|
||||
if (quadrant == 2) {
|
||||
return cache.get(currentCell.add(quadIndex[1]));
|
||||
} else if (quadrant == 4) {
|
||||
return cache.get(currentCell.add(quadIndex[2]));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -15,9 +15,11 @@ import com.jme3.input.controls.ActionListener;
|
||||
import com.jme3.input.controls.KeyTrigger;
|
||||
import com.jme3.material.Material;
|
||||
import com.jme3.math.ColorRGBA;
|
||||
import com.jme3.math.Vector2f;
|
||||
import com.jme3.math.Vector3f;
|
||||
import com.jme3.renderer.Camera;
|
||||
import com.jme3.terrain.geomipmap.TerrainGrid;
|
||||
import com.jme3.terrain.geomipmap.TerrainGridListener;
|
||||
import com.jme3.terrain.geomipmap.TerrainLodControl;
|
||||
import com.jme3.terrain.heightmap.FractalHeightMapGrid;
|
||||
import com.jme3.texture.Texture;
|
||||
@ -39,6 +41,7 @@ public class TerrainFractalGridTest extends SimpleApplication {
|
||||
private float dirtScale = 16;
|
||||
private float rockScale = 128;
|
||||
private boolean usePhysics = true;
|
||||
private boolean physicsAdded = false;
|
||||
|
||||
public static void main(final String[] args) {
|
||||
TerrainFractalGridTest app = new TerrainFractalGridTest();
|
||||
@ -132,12 +135,11 @@ public class TerrainFractalGridTest extends SimpleApplication {
|
||||
|
||||
ground.addPreFilter(this.iterate);
|
||||
|
||||
this.terrain = new TerrainGrid("terrain", 65, 257, new FractalHeightMapGrid(ground, null, 256f));
|
||||
this.terrain = new TerrainGrid("terrain", 65, 257, new FractalHeightMapGrid(ground, "D:\\work5\\temp", 256f));
|
||||
|
||||
this.terrain.setMaterial(this.mat_terrain);
|
||||
this.terrain.setLocalTranslation(0, 0, 0);
|
||||
this.terrain.setLocalScale(2f, 1f, 2f);
|
||||
this.terrain.initialize(Vector3f.ZERO);
|
||||
this.rootNode.attachChild(this.terrain);
|
||||
|
||||
List<Camera> cameras = new ArrayList<Camera>();
|
||||
@ -145,28 +147,40 @@ public class TerrainFractalGridTest extends SimpleApplication {
|
||||
TerrainLodControl control = new TerrainLodControl(this.terrain, cameras);
|
||||
this.terrain.addControl(control);
|
||||
|
||||
BulletAppState bulletAppState = new BulletAppState();
|
||||
final BulletAppState bulletAppState = new BulletAppState();
|
||||
stateManager.attach(bulletAppState);
|
||||
|
||||
|
||||
this.getCamera().setLocation(new Vector3f(0, 256, 0));
|
||||
this.getCamera().setLocation(new Vector3f(0, 0, 0));
|
||||
|
||||
this.viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f));
|
||||
|
||||
if (usePhysics) {
|
||||
terrain.addListener("physicsStartListener", new TerrainGridListener() {
|
||||
|
||||
public void gridMoved(Vector3f newCenter) {
|
||||
terrain.removeListener("physicsStartListener");
|
||||
RigidBodyControl body = new RigidBodyControl(new HeightfieldCollisionShape(terrain.getHeightMap(), terrain.getLocalScale()), 0);
|
||||
terrain.addControl(body);
|
||||
bulletAppState.getPhysicsSpace().add(terrain);
|
||||
CapsuleCollisionShape capsuleShape = new CapsuleCollisionShape(0.5f, 1.8f, 1);
|
||||
this.player3 = new CharacterControl(capsuleShape, 0.5f);
|
||||
this.player3.setJumpSpeed(20);
|
||||
this.player3.setFallSpeed(30);
|
||||
this.player3.setGravity(30);
|
||||
player3 = new CharacterControl(capsuleShape, 0.5f);
|
||||
player3.setJumpSpeed(20);
|
||||
player3.setFallSpeed(10);
|
||||
player3.setGravity(10);
|
||||
|
||||
this.player3.setPhysicsLocation(new Vector3f(0, 256, 0));
|
||||
player3.setPhysicsLocation(new Vector3f(cam.getLocation().x, 256, cam.getLocation().z));
|
||||
|
||||
bulletAppState.getPhysicsSpace().add(this.player3);
|
||||
bulletAppState.getPhysicsSpace().add(player3);
|
||||
physicsAdded = true;
|
||||
}
|
||||
|
||||
public Material tileLoaded(Material material, Vector3f cell) {
|
||||
return material;
|
||||
}
|
||||
});
|
||||
}
|
||||
this.terrain.initialize(cam.getLocation());
|
||||
this.initKeys();
|
||||
}
|
||||
|
||||
@ -183,7 +197,6 @@ public class TerrainFractalGridTest extends SimpleApplication {
|
||||
this.inputManager.addListener(this.actionListener, "Downs");
|
||||
this.inputManager.addListener(this.actionListener, "Jumps");
|
||||
}
|
||||
|
||||
private boolean left;
|
||||
private boolean right;
|
||||
private boolean up;
|
||||
@ -241,7 +254,7 @@ public class TerrainFractalGridTest extends SimpleApplication {
|
||||
this.walkDirection.addLocal(camDir.negate());
|
||||
}
|
||||
|
||||
if (usePhysics) {
|
||||
if (usePhysics && physicsAdded) {
|
||||
this.player3.setWalkDirection(this.walkDirection);
|
||||
this.cam.setLocation(this.player3.getPhysicsLocation());
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
package jme3test.terrain;
|
||||
|
||||
|
||||
import com.jme3.app.SimpleApplication;
|
||||
import com.jme3.app.state.ScreenshotAppState;
|
||||
import com.jme3.asset.plugins.HttpZipLocator;
|
||||
@ -17,6 +16,7 @@ import com.jme3.material.Material;
|
||||
import com.jme3.math.ColorRGBA;
|
||||
import com.jme3.math.Vector3f;
|
||||
import com.jme3.terrain.geomipmap.TerrainGrid;
|
||||
import com.jme3.terrain.geomipmap.TerrainGridListener;
|
||||
import com.jme3.terrain.geomipmap.TerrainLodControl;
|
||||
import com.jme3.terrain.heightmap.ImageBasedHeightMapGrid;
|
||||
import com.jme3.terrain.heightmap.Namer;
|
||||
@ -32,6 +32,7 @@ public class TerrainGridTest extends SimpleApplication {
|
||||
private float dirtScale = 16;
|
||||
private float rockScale = 128;
|
||||
private boolean usePhysics = true;
|
||||
private boolean physicsAdded = false;
|
||||
|
||||
public static void main(final String[] args) {
|
||||
TerrainGridTest app = new TerrainGridTest();
|
||||
@ -89,24 +90,24 @@ public class TerrainGridTest extends SimpleApplication {
|
||||
this.mat_terrain.setTexture("slopeColorMap", rock);
|
||||
this.mat_terrain.setFloat("slopeTileFactor", 32);
|
||||
|
||||
this.mat_terrain.setFloat("terrainSize", 513);
|
||||
this.mat_terrain.setFloat("terrainSize", 129);
|
||||
|
||||
this.terrain = new TerrainGrid("terrain", 65, 257, new ImageBasedHeightMapGrid(assetManager, new Namer() {
|
||||
|
||||
this.terrain = new TerrainGrid("terrain", 65, 1025, new ImageBasedHeightMapGrid(assetManager, new Namer() {
|
||||
public String getName(int x, int y) {
|
||||
return "Scenes/TerrainMountains/mountains_" + (x * 512) + "_" + (y * 512) + ".png";
|
||||
return "Scenes/TerrainMountains/terrain_" + x + "_" + y + ".png";
|
||||
}
|
||||
}));
|
||||
|
||||
this.terrain.setMaterial(this.mat_terrain);
|
||||
this.terrain.setLocalTranslation(0, 0, 0);
|
||||
this.terrain.setLocalScale(2f, 1f, 2f);
|
||||
this.terrain.initialize(Vector3f.ZERO);
|
||||
this.rootNode.attachChild(this.terrain);
|
||||
|
||||
TerrainLodControl control = new TerrainLodControl(this.terrain, getCamera());
|
||||
this.terrain.addControl(control);
|
||||
|
||||
BulletAppState bulletAppState = new BulletAppState();
|
||||
final BulletAppState bulletAppState = new BulletAppState();
|
||||
stateManager.attach(bulletAppState);
|
||||
|
||||
this.getCamera().setLocation(new Vector3f(0, 256, 0));
|
||||
@ -114,19 +115,31 @@ public class TerrainGridTest extends SimpleApplication {
|
||||
this.viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f));
|
||||
|
||||
if (usePhysics) {
|
||||
terrain.addListener("physicsStartListener", new TerrainGridListener() {
|
||||
|
||||
public void gridMoved(Vector3f newCenter) {
|
||||
terrain.removeListener("physicsStartListener");
|
||||
RigidBodyControl body = new RigidBodyControl(new HeightfieldCollisionShape(terrain.getHeightMap(), terrain.getLocalScale()), 0);
|
||||
terrain.addControl(body);
|
||||
bulletAppState.getPhysicsSpace().add(terrain);
|
||||
CapsuleCollisionShape capsuleShape = new CapsuleCollisionShape(0.5f, 1.8f, 1);
|
||||
this.player3 = new CharacterControl(capsuleShape, 0.5f);
|
||||
this.player3.setJumpSpeed(20);
|
||||
this.player3.setFallSpeed(30);
|
||||
this.player3.setGravity(30);
|
||||
player3 = new CharacterControl(capsuleShape, 0.5f);
|
||||
player3.setJumpSpeed(20);
|
||||
player3.setFallSpeed(30);
|
||||
player3.setGravity(30);
|
||||
|
||||
this.player3.setPhysicsLocation(new Vector3f(0, 256, 0));
|
||||
player3.setPhysicsLocation(new Vector3f(cam.getLocation().x, 256, cam.getLocation().z));
|
||||
|
||||
bulletAppState.getPhysicsSpace().add(this.player3);
|
||||
bulletAppState.getPhysicsSpace().add(player3);
|
||||
physicsAdded = true;
|
||||
}
|
||||
|
||||
public Material tileLoaded(Material material, Vector3f cell) {
|
||||
return material;
|
||||
}
|
||||
});
|
||||
}
|
||||
this.terrain.initialize(cam.getLocation());
|
||||
this.initKeys();
|
||||
}
|
||||
|
||||
@ -143,7 +156,6 @@ public class TerrainGridTest extends SimpleApplication {
|
||||
this.inputManager.addListener(this.actionListener, "Downs");
|
||||
this.inputManager.addListener(this.actionListener, "Jumps");
|
||||
}
|
||||
|
||||
private boolean left;
|
||||
private boolean right;
|
||||
private boolean up;
|
||||
@ -201,7 +213,7 @@ public class TerrainGridTest extends SimpleApplication {
|
||||
this.walkDirection.addLocal(camDir.negate());
|
||||
}
|
||||
|
||||
if (usePhysics) {
|
||||
if (usePhysics && physicsAdded) {
|
||||
this.player3.setWalkDirection(this.walkDirection);
|
||||
this.cam.setLocation(this.player3.getPhysicsLocation());
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user