fixed TerrainGrid.getHeightmapHeight, fix thanks to @Makeshift

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8198 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
bre..ns 13 years ago
parent ce767f9729
commit a899fbc075
  1. 16
      engine/src/terrain/com/jme3/terrain/geomipmap/TerrainGrid.java
  2. 65
      engine/src/test/jme3test/terrain/TerrainTestModifyHeight.java

@ -67,6 +67,8 @@ public class TerrainGrid extends TerrainQuad {
protected LRUCache<Vector3f, TerrainQuad> cache = new LRUCache<Vector3f, TerrainQuad>(16); protected LRUCache<Vector3f, TerrainQuad> cache = new LRUCache<Vector3f, TerrainQuad>(16);
protected RigidBodyControl[] quadControls; protected RigidBodyControl[] quadControls;
protected PhysicsSpace space; protected PhysicsSpace space;
private int cellsLoaded = 0;
private int[] gridOffset;
protected class UpdateQuadCache implements Runnable { protected class UpdateQuadCache implements Runnable {
@ -142,6 +144,7 @@ public class TerrainGrid extends TerrainQuad {
this.offset = offset; this.offset = offset;
this.offsetAmount = offsetAmount; this.offsetAmount = offsetAmount;
this.lodCalculatorFactory = lodCalculatorFactory; this.lodCalculatorFactory = lodCalculatorFactory;
this.gridOffset = new int[]{0,0};
if (lodCalculatorFactory == null) { if (lodCalculatorFactory == null) {
lodCalculatorFactory = new LodDistanceCalculatorFactory(); lodCalculatorFactory = new LodDistanceCalculatorFactory();
} }
@ -189,13 +192,17 @@ public class TerrainGrid extends TerrainQuad {
// 2: grids are associated with locations, and no incremental update is done, we load new grids for new locations, and unload those that are not needed anymore // 2: grids are associated with locations, and no incremental update is done, we load new grids for new locations, and unload those that are not needed anymore
Vector3f cam = locations.get(0); Vector3f cam = locations.get(0);
Vector3f camCell = this.getCell(cam); Vector3f camCell = this.getCell(cam);
if(cellsLoaded>1){ // Check if cells are updated before updating gridoffset.
gridOffset[0] = Math.round(camCell.x*(size/2));
gridOffset[1] = Math.round(camCell.z*(size/2));
cellsLoaded=0;
}
if (camCell.x != this.currentCell.x || camCell.z != currentCell.z) { if (camCell.x != this.currentCell.x || camCell.z != currentCell.z) {
this.updateChildrens(camCell); this.updateChildrens(camCell);
for (TerrainGridListener l : this.listeners.values()) { for (TerrainGridListener l : this.listeners.values()) {
l.gridMoved(camCell); l.gridMoved(camCell);
} }
} }
super.update(locations); super.update(locations);
} }
@ -213,8 +220,8 @@ public class TerrainGrid extends TerrainQuad {
l.tileDetached(getCell(this.getQuad(idx).getWorldTranslation()), this.getQuad(idx)); l.tileDetached(getCell(this.getQuad(idx).getWorldTranslation()), this.getQuad(idx));
} }
this.detachChild(this.getQuad(idx)); this.detachChild(this.getQuad(idx));
cellsLoaded++; // For gridoffset calc., maybe the run() method is a better location for this.
} }
} }
/** /**
@ -314,6 +321,11 @@ public class TerrainGrid extends TerrainQuad {
super.adjustHeight(xz, height); super.adjustHeight(xz, height);
} }
@Override
protected float getHeightmapHeight(int x, int z) {
return super.getHeightmapHeight(x-gridOffset[0], z-gridOffset[1]);
}
@Override @Override
protected TerrainQuad findDownQuad() { protected TerrainQuad findDownQuad() {
if (quadrant == 1) { if (quadrant == 1) {

@ -32,8 +32,12 @@
package jme3test.terrain; package jme3test.terrain;
import com.jme3.app.SimpleApplication; import com.jme3.app.SimpleApplication;
import com.jme3.bounding.BoundingBox;
import com.jme3.collision.CollisionResult; import com.jme3.collision.CollisionResult;
import com.jme3.collision.CollisionResults; import com.jme3.collision.CollisionResults;
import com.jme3.export.Savable;
import com.jme3.export.binary.BinaryExporter;
import com.jme3.export.binary.BinaryImporter;
import com.jme3.font.BitmapText; import com.jme3.font.BitmapText;
import com.jme3.input.KeyInput; import com.jme3.input.KeyInput;
import com.jme3.input.MouseInput; import com.jme3.input.MouseInput;
@ -43,18 +47,34 @@ import com.jme3.input.controls.MouseButtonTrigger;
import com.jme3.light.AmbientLight; import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight; import com.jme3.light.DirectionalLight;
import com.jme3.material.Material; import com.jme3.material.Material;
import com.jme3.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.math.Ray; import com.jme3.math.Ray;
import com.jme3.math.Vector2f; import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.renderer.queue.RenderQueue.Bucket;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.shape.Sphere;
import com.jme3.terrain.geomipmap.TerrainGrid; import com.jme3.terrain.geomipmap.TerrainGrid;
import com.jme3.terrain.geomipmap.TerrainLodControl; import com.jme3.terrain.geomipmap.TerrainLodControl;
import com.jme3.terrain.geomipmap.TerrainQuad; import com.jme3.terrain.geomipmap.TerrainQuad;
import com.jme3.terrain.heightmap.AbstractHeightMap;
import com.jme3.terrain.heightmap.FractalHeightMapGrid; import com.jme3.terrain.heightmap.FractalHeightMapGrid;
import com.jme3.terrain.heightmap.ImageBasedHeightMap;
import com.jme3.texture.Texture; import com.jme3.texture.Texture;
import com.jme3.texture.Texture.WrapMode; import com.jme3.texture.Texture.WrapMode;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import jme3tools.converters.ImageToAwt;
import org.novyon.noise.ShaderUtils; import org.novyon.noise.ShaderUtils;
import org.novyon.noise.basis.FilteredBasis; import org.novyon.noise.basis.FilteredBasis;
import org.novyon.noise.filter.IterativeFilter; import org.novyon.noise.filter.IterativeFilter;
@ -85,6 +105,8 @@ public class TerrainTestModifyHeight extends SimpleApplication {
private boolean raiseTerrain = false; private boolean raiseTerrain = false;
private boolean lowerTerrain = false; private boolean lowerTerrain = false;
private Geometry marker;
public static void main(String[] args) { public static void main(String[] args) {
TerrainTestModifyHeight app = new TerrainTestModifyHeight(); TerrainTestModifyHeight app = new TerrainTestModifyHeight();
app.start(); app.start();
@ -105,6 +127,12 @@ public class TerrainTestModifyHeight extends SimpleApplication {
adjustHeight(intersection, 64, -tpf * 60); adjustHeight(intersection, 64, -tpf * 60);
} }
} }
if (terrain != null && intersection != null) {
float h = terrain.getHeight(new Vector2f(intersection.x, intersection.z));
Vector3f tl = terrain.getWorldTranslation();
marker.setLocalTranslation(tl.add(new Vector3f(intersection.x, h, intersection.z)) );
}
} }
@Override @Override
@ -113,6 +141,8 @@ public class TerrainTestModifyHeight extends SimpleApplication {
initCrossHairs(); initCrossHairs();
setupKeys(); setupKeys();
createMarker();
// WIREFRAME material // WIREFRAME material
matWire = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); matWire = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
matWire.getAdditionalRenderState().setWireframe(true); matWire.getAdditionalRenderState().setWireframe(true);
@ -130,7 +160,7 @@ public class TerrainTestModifyHeight extends SimpleApplication {
rootNode.addLight(ambLight); rootNode.addLight(ambLight);
cam.setLocation(new Vector3f(0, 256, 0)); cam.setLocation(new Vector3f(0, 256, 0));
cam.lookAtDirection(new Vector3f(0, -1.5f, -1).normalizeLocal(), Vector3f.UNIT_Y); cam.lookAtDirection(new Vector3f(0, -1f, 0).normalizeLocal(), Vector3f.UNIT_X);
} }
public void loadHintText() { public void loadHintText() {
@ -162,7 +192,6 @@ public class TerrainTestModifyHeight extends SimpleApplication {
private void setupKeys() { private void setupKeys() {
flyCam.setMoveSpeed(100); flyCam.setMoveSpeed(100);
inputManager.addMapping("wireframe", new KeyTrigger(KeyInput.KEY_T)); inputManager.addMapping("wireframe", new KeyTrigger(KeyInput.KEY_T));
inputManager.addListener(actionListener, "wireframe"); inputManager.addListener(actionListener, "wireframe");
inputManager.addMapping("Raise", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); inputManager.addMapping("Raise", new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
@ -281,13 +310,25 @@ public class TerrainTestModifyHeight extends SimpleApplication {
matTerrain.setTexture("DiffuseMap_2", rock); matTerrain.setTexture("DiffuseMap_2", rock);
matTerrain.setFloat("DiffuseMap_2_scale", rockScale); matTerrain.setFloat("DiffuseMap_2_scale", rockScale);
// HEIGHTMAP image (for the terrain heightmap)
Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png");
AbstractHeightMap heightmap = null;
try {
heightmap = new ImageBasedHeightMap(ImageToAwt.convert(heightMapImage.getImage(), false, true, 0), 0.5f);
heightmap.load();
heightmap.smooth(0.9f, 1);
} catch (Exception e) {
e.printStackTrace();
}
// CREATE THE TERRAIN // CREATE THE TERRAIN
terrain = new TerrainQuad("terrain", 65, 513, null); terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap());
TerrainLodControl control = new TerrainLodControl(terrain, getCamera()); TerrainLodControl control = new TerrainLodControl(terrain, getCamera());
terrain.addControl(control); terrain.addControl(control);
terrain.setMaterial(matTerrain); terrain.setMaterial(matTerrain);
terrain.setLocalTranslation(0, -100, 0); terrain.setLocalTranslation(0, -100, 0);
terrain.setLocalScale(2f, 1f, 2f); terrain.setLocalScale(2.5f, 0.5f, 2.5f);
rootNode.attachChild(terrain); rootNode.attachChild(terrain);
} }
@ -370,7 +411,7 @@ public class TerrainTestModifyHeight extends SimpleApplication {
this.terrain = new TerrainGrid("terrain", 65, 257, new FractalHeightMapGrid(ground, null, 256f)); this.terrain = new TerrainGrid("terrain", 65, 257, new FractalHeightMapGrid(ground, null, 256f));
terrain.setMaterial(matWire); terrain.setMaterial(matTerrain);
terrain.setLocalTranslation(0, 0, 0); terrain.setLocalTranslation(0, 0, 0);
terrain.setLocalScale(2f, 1f, 2f); terrain.setLocalScale(2f, 1f, 2f);
((TerrainGrid)terrain).initialize(Vector3f.ZERO); ((TerrainGrid)terrain).initialize(Vector3f.ZERO);
@ -379,4 +420,18 @@ public class TerrainTestModifyHeight extends SimpleApplication {
TerrainLodControl control = new TerrainLodControl(this.terrain, getCamera()); TerrainLodControl control = new TerrainLodControl(this.terrain, getCamera());
this.terrain.addControl(control); this.terrain.addControl(control);
} }
private void createMarker() {
Sphere sphere = new Sphere(8, 8, 0.5f);
marker = new Geometry("Marker");
marker.setMesh(sphere);
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", new ColorRGBA(251f/255f, 130f/255f, 0f, 0.6f));
mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
marker.setMaterial(mat);
rootNode.attachChild(marker);
}
} }

Loading…
Cancel
Save