use of com.jme3.terrain.geomipmap.TerrainGrid in project jmonkeyengine by jMonkeyEngine.
the class TerrainTestModifyHeight method createTerrainGrid.
private void createTerrainGrid() {
// TERRAIN TEXTURE material
matTerrain = new Material(this.assetManager, "Common/MatDefs/Terrain/HeightBasedTerrain.j3md");
// Parameters to material:
// regionXColorMap: X = 1..4 the texture that should be appliad to state X
// regionX: a Vector3f containing the following information:
// regionX.x: the start height of the region
// regionX.y: the end height of the region
// regionX.z: the texture scale for the region
// it might not be the most elegant way for storing these 3 values, but it packs the data nicely :)
// slopeColorMap: the texture to be used for cliffs, and steep mountain sites
// slopeTileFactor: the texture scale for slopes
// terrainSize: the total size of the terrain (used for scaling the texture)
// GRASS texture
Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
grass.setWrap(WrapMode.Repeat);
matTerrain.setTexture("region1ColorMap", grass);
matTerrain.setVector3("region1", new Vector3f(88, 200, this.grassScale));
// DIRT texture
Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");
dirt.setWrap(WrapMode.Repeat);
matTerrain.setTexture("region2ColorMap", dirt);
matTerrain.setVector3("region2", new Vector3f(0, 90, this.dirtScale));
// ROCK texture
Texture rock = assetManager.loadTexture("Textures/Terrain/Rock2/rock.jpg");
rock.setWrap(WrapMode.Repeat);
matTerrain.setTexture("region3ColorMap", rock);
matTerrain.setVector3("region3", new Vector3f(198, 260, this.rockScale));
matTerrain.setTexture("region4ColorMap", rock);
matTerrain.setVector3("region4", new Vector3f(198, 260, this.rockScale));
matTerrain.setTexture("slopeColorMap", rock);
matTerrain.setFloat("slopeTileFactor", 32);
matTerrain.setFloat("terrainSize", 513);
FractalSum base = new FractalSum();
base.setRoughness(0.7f);
base.setFrequency(1.0f);
base.setAmplitude(1.0f);
base.setLacunarity(2.12f);
base.setOctaves(8);
base.setScale(0.02125f);
base.addModulator(new NoiseModulator() {
@Override
public float value(float... in) {
return ShaderUtils.clamp(in[0] * 0.5f + 0.5f, 0, 1);
}
});
FilteredBasis ground = new FilteredBasis(base);
PerturbFilter perturb = new PerturbFilter();
perturb.setMagnitude(0.119f);
OptimizedErode therm = new OptimizedErode();
therm.setRadius(5);
therm.setTalus(0.011f);
SmoothFilter smooth = new SmoothFilter();
smooth.setRadius(1);
smooth.setEffect(0.7f);
IterativeFilter iterate = new IterativeFilter();
iterate.addPreFilter(perturb);
iterate.addPostFilter(smooth);
iterate.setFilter(therm);
iterate.setIterations(1);
ground.addPreFilter(iterate);
this.terrain = new TerrainGrid("terrain", 65, 257, new FractalTileLoader(ground, 256f));
terrain.setMaterial(matTerrain);
terrain.setLocalTranslation(0, 0, 0);
terrain.setLocalScale(2f, 1f, 2f);
rootNode.attachChild(this.terrain);
TerrainLodControl control = new TerrainLodControl(this.terrain, getCamera());
this.terrain.addControl(control);
}
use of com.jme3.terrain.geomipmap.TerrainGrid in project jmonkeyengine by jMonkeyEngine.
the class TerrainGridLodControl method updateLOD.
@Override
protected void updateLOD(List<Vector3f> locations, LodCalculator lodCalculator) {
TerrainGrid terrainGrid = (TerrainGrid) getSpatial();
// for now, only the first camera is handled.
// to accept more, there are two ways:
// 1: every camera has an associated grid, then the location is not enough to identify which camera location has changed
// 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.isEmpty() ? Vector3f.ZERO.clone() : locations.get(0);
// get the grid index value of where the camera is (ie. 2,1)
Vector3f camCell = terrainGrid.getCamCell(cam);
if (terrainGrid.cellsLoaded > 1) {
// Check if cells are updated before updating gridoffset.
terrainGrid.gridOffset[0] = Math.round(camCell.x * (terrainGrid.size / 2));
terrainGrid.gridOffset[1] = Math.round(camCell.z * (terrainGrid.size / 2));
terrainGrid.cellsLoaded = 0;
}
if (camCell.x != terrainGrid.currentCamCell.x || camCell.z != terrainGrid.currentCamCell.z || !terrainGrid.runOnce) {
// if the camera has moved into a new cell, load new terrain into the visible 4 center quads
terrainGrid.updateChildren(camCell);
for (TerrainGridListener l : terrainGrid.listeners) {
l.gridMoved(camCell);
}
}
terrainGrid.runOnce = true;
super.updateLOD(locations, lodCalculator);
}
Aggregations