Search in sources :

Example 6 with TerrainGrid

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);
}
Also used : FractalTileLoader(com.jme3.terrain.geomipmap.grid.FractalTileLoader) PerturbFilter(com.jme3.terrain.noise.filter.PerturbFilter) FilteredBasis(com.jme3.terrain.noise.basis.FilteredBasis) TerrainGrid(com.jme3.terrain.geomipmap.TerrainGrid) IterativeFilter(com.jme3.terrain.noise.filter.IterativeFilter) Material(com.jme3.material.Material) Texture(com.jme3.texture.Texture) OptimizedErode(com.jme3.terrain.noise.filter.OptimizedErode) NoiseModulator(com.jme3.terrain.noise.modulator.NoiseModulator) Vector3f(com.jme3.math.Vector3f) TerrainLodControl(com.jme3.terrain.geomipmap.TerrainLodControl) SmoothFilter(com.jme3.terrain.noise.filter.SmoothFilter) FractalSum(com.jme3.terrain.noise.fractal.FractalSum)

Example 7 with TerrainGrid

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);
}
Also used : Vector3f(com.jme3.math.Vector3f)

Aggregations

Vector3f (com.jme3.math.Vector3f)7 TerrainLodControl (com.jme3.terrain.geomipmap.TerrainLodControl)6 ScreenshotAppState (com.jme3.app.state.ScreenshotAppState)5 Material (com.jme3.material.Material)5 ColorRGBA (com.jme3.math.ColorRGBA)5 TerrainGrid (com.jme3.terrain.geomipmap.TerrainGrid)5 TerrainGridLodControl (com.jme3.terrain.geomipmap.TerrainGridLodControl)5 DistanceLodCalculator (com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator)5 Texture (com.jme3.texture.Texture)5 BulletAppState (com.jme3.bullet.BulletAppState)4 CapsuleCollisionShape (com.jme3.bullet.collision.shapes.CapsuleCollisionShape)4 HeightfieldCollisionShape (com.jme3.bullet.collision.shapes.HeightfieldCollisionShape)4 CharacterControl (com.jme3.bullet.control.CharacterControl)4 RigidBodyControl (com.jme3.bullet.control.RigidBodyControl)4 TerrainGridListener (com.jme3.terrain.geomipmap.TerrainGridListener)4 TerrainQuad (com.jme3.terrain.geomipmap.TerrainQuad)4 File (java.io.File)4 FractalTileLoader (com.jme3.terrain.geomipmap.grid.FractalTileLoader)3 FilteredBasis (com.jme3.terrain.noise.basis.FilteredBasis)3 IterativeFilter (com.jme3.terrain.noise.filter.IterativeFilter)3