com.jme3.terrain.noise.ShaderUtils Java Examples
The following examples show how to use
com.jme3.terrain.noise.ShaderUtils.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: RoughTerrainToolControl.java From jmonkeybuilder with Apache License 2.0 | 5 votes |
@JmeThread private @NotNull Basis createFractalGenerator() { final FractalSum fractalSum = new FractalSum(); fractalSum.setRoughness(getRoughness()); fractalSum.setFrequency(getFrequency()); fractalSum.setAmplitude(getBrushPower()); fractalSum.setLacunarity(getLacunarity()); // make it greater than 1.0f fractalSum.setOctaves(getOctaves()); fractalSum.setScale(max(min(getScale(), 1.0F), 0F)); //0.02125f fractalSum.addModulator((NoiseModulator) in -> ShaderUtils.clamp(in[0] * 0.5f + 0.5f, 0, 1)); final FilteredBasis ground = new FilteredBasis(fractalSum); final PerturbFilter perturb = new PerturbFilter(); perturb.setMagnitude(0.2f);//0.119 the higher, the slower it is final OptimizedErode therm = new OptimizedErode(); therm.setRadius(5); therm.setTalus(0.011f); final SmoothFilter smooth = new SmoothFilter(); smooth.setRadius(1); smooth.setEffect(0.1f); // 0.7 final IterativeFilter iterate = new IterativeFilter(); iterate.addPreFilter(perturb); iterate.addPostFilter(smooth); iterate.setFilter(therm); iterate.setIterations(1); ground.addPreFilter(iterate); return ground; }
Example #2
Source File: FractalSum.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 5 votes |
@Override public float value(final float x, final float y, final float z) { float total = 0; for (float f = this.frequency, a = this.amplitude; f < this.maxFreq; f *= this.lacunarity, a *= this.roughness) { total += this.basis.value(this.scale * x * f, this.scale * y * f, this.scale * z * f) * a; } return ShaderUtils.clamp(total, -1, 1); }
Example #3
Source File: CatRom2.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 5 votes |
@Override public float value(final float... in) { if (in[0] >= 4) { return 0; } in[0] = in[0] * this.sampleRate + 0.5f; int i = ShaderUtils.floor(in[0]); if (i >= 4 * this.sampleRate + 1) { return 0; } return this.table[i]; }
Example #4
Source File: ImprovedNoise.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 5 votes |
static public float noise(float x, float y, float z) { int X = ShaderUtils.floor(x), // FIND UNIT CUBE THAT Y = ShaderUtils.floor(y), // CONTAINS POINT. Z = ShaderUtils.floor(z); x -= X; // FIND RELATIVE X,Y,Z y -= Y; // OF POINT IN CUBE. z -= Z; X = X & 255; Y = Y & 255; Z = Z & 255; float u = ImprovedNoise.fade(x), // COMPUTE FADE CURVES v = ImprovedNoise.fade(y), // FOR EACH OF X,Y,Z. w = ImprovedNoise.fade(z); int A = ImprovedNoise.p[X] + Y; int AA = ImprovedNoise.p[A] + Z; int AB = ImprovedNoise.p[A + 1] + Z; int B = ImprovedNoise.p[X + 1] + Y; int BA = ImprovedNoise.p[B] + Z; int BB = ImprovedNoise.p[B + 1] + Z; return ImprovedNoise.lerp( w, ImprovedNoise.lerp( v, ImprovedNoise.lerp(u, ImprovedNoise.grad3(ImprovedNoise.p[AA], x, y, z), ImprovedNoise.grad3(ImprovedNoise.p[BA], x - 1, y, z)), // BLENDED ImprovedNoise.lerp(u, ImprovedNoise.grad3(ImprovedNoise.p[AB], x, y - 1, z), // RESULTS ImprovedNoise.grad3(ImprovedNoise.p[BB], x - 1, y - 1, z))),// FROM ImprovedNoise.lerp(v, ImprovedNoise.lerp(u, ImprovedNoise.grad3(ImprovedNoise.p[AA + 1], x, y, z - 1), // CORNERS ImprovedNoise.grad3(ImprovedNoise.p[BA + 1], x - 1, y, z - 1)), // OF ImprovedNoise.lerp(u, ImprovedNoise.grad3(ImprovedNoise.p[AB + 1], x, y - 1, z - 1), ImprovedNoise.grad3(ImprovedNoise.p[BB + 1], x - 1, y - 1, z - 1)))); }
Example #5
Source File: PerturbFilter.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 5 votes |
@Override public FloatBuffer filter(float sx, float sy, float base, FloatBuffer data, int workSize) { float[] arr = data.array(); int origSize = (int) Math.ceil(workSize / (2 * this.magnitude + 1)); int offset = (workSize - origSize) / 2; Logger.getLogger(PerturbFilter.class.getCanonicalName()).info( "Found origSize : " + origSize + " and offset: " + offset + " for workSize : " + workSize + " and magnitude : " + this.magnitude); float[] retval = new float[workSize * workSize]; float[] perturbx = new FractalSum().setOctaves(8).setScale(5f).getBuffer(sx, sy, base, workSize).array(); float[] perturby = new FractalSum().setOctaves(8).setScale(5f).getBuffer(sx, sy, base + 1, workSize).array(); for (int y = 0; y < workSize; y++) { for (int x = 0; x < workSize; x++) { // Perturb our coordinates float noisex = perturbx[y * workSize + x]; float noisey = perturby[y * workSize + x]; int px = (int) (origSize * noisex * this.magnitude); int py = (int) (origSize * noisey * this.magnitude); float c00 = arr[this.wrap(y - py, workSize) * workSize + this.wrap(x - px, workSize)]; float c01 = arr[this.wrap(y - py, workSize) * workSize + this.wrap(x + px, workSize)]; float c10 = arr[this.wrap(y + py, workSize) * workSize + this.wrap(x - px, workSize)]; float c11 = arr[this.wrap(y + py, workSize) * workSize + this.wrap(x + px, workSize)]; float c0 = ShaderUtils.mix(c00, c01, noisex); float c1 = ShaderUtils.mix(c10, c11, noisex); retval[y * workSize + x] = ShaderUtils.mix(c0, c1, noisey); } } return FloatBuffer.wrap(retval); }
Example #6
Source File: FractalSum.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 5 votes |
@Override public float value(final float x, final float y, final float z) { float total = 0; for (float f = this.frequency, a = this.amplitude; f < this.maxFreq; f *= this.lacunarity, a *= this.roughness) { total += this.basis.value(this.scale * x * f, this.scale * y * f, this.scale * z * f) * a; } return ShaderUtils.clamp(total, -1, 1); }
Example #7
Source File: CatRom2.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 5 votes |
@Override public float value(final float... in) { if (in[0] >= 4) { return 0; } in[0] = in[0] * this.sampleRate + 0.5f; int i = ShaderUtils.floor(in[0]); if (i >= 4 * this.sampleRate + 1) { return 0; } return this.table[i]; }
Example #8
Source File: ImprovedNoise.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 5 votes |
static public float noise(float x, float y, float z) { int X = ShaderUtils.floor(x), // FIND UNIT CUBE THAT Y = ShaderUtils.floor(y), // CONTAINS POINT. Z = ShaderUtils.floor(z); x -= X; // FIND RELATIVE X,Y,Z y -= Y; // OF POINT IN CUBE. z -= Z; X = X & 255; Y = Y & 255; Z = Z & 255; float u = ImprovedNoise.fade(x), // COMPUTE FADE CURVES v = ImprovedNoise.fade(y), // FOR EACH OF X,Y,Z. w = ImprovedNoise.fade(z); int A = ImprovedNoise.p[X] + Y; int AA = ImprovedNoise.p[A] + Z; int AB = ImprovedNoise.p[A + 1] + Z; int B = ImprovedNoise.p[X + 1] + Y; int BA = ImprovedNoise.p[B] + Z; int BB = ImprovedNoise.p[B + 1] + Z; return ImprovedNoise.lerp( w, ImprovedNoise.lerp( v, ImprovedNoise.lerp(u, ImprovedNoise.grad3(ImprovedNoise.p[AA], x, y, z), ImprovedNoise.grad3(ImprovedNoise.p[BA], x - 1, y, z)), // BLENDED ImprovedNoise.lerp(u, ImprovedNoise.grad3(ImprovedNoise.p[AB], x, y - 1, z), // RESULTS ImprovedNoise.grad3(ImprovedNoise.p[BB], x - 1, y - 1, z))),// FROM ImprovedNoise.lerp(v, ImprovedNoise.lerp(u, ImprovedNoise.grad3(ImprovedNoise.p[AA + 1], x, y, z - 1), // CORNERS ImprovedNoise.grad3(ImprovedNoise.p[BA + 1], x - 1, y, z - 1)), // OF ImprovedNoise.lerp(u, ImprovedNoise.grad3(ImprovedNoise.p[AB + 1], x, y - 1, z - 1), ImprovedNoise.grad3(ImprovedNoise.p[BB + 1], x - 1, y - 1, z - 1)))); }
Example #9
Source File: PerturbFilter.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 5 votes |
@Override public FloatBuffer filter(float sx, float sy, float base, FloatBuffer data, int workSize) { float[] arr = data.array(); int origSize = (int) Math.ceil(workSize / (2 * this.magnitude + 1)); int offset = (workSize - origSize) / 2; Logger.getLogger(PerturbFilter.class.getCanonicalName()).info( "Found origSize : " + origSize + " and offset: " + offset + " for workSize : " + workSize + " and magnitude : " + this.magnitude); float[] retval = new float[workSize * workSize]; float[] perturbx = new FractalSum().setOctaves(8).setScale(5f).getBuffer(sx, sy, base, workSize).array(); float[] perturby = new FractalSum().setOctaves(8).setScale(5f).getBuffer(sx, sy, base + 1, workSize).array(); for (int y = 0; y < workSize; y++) { for (int x = 0; x < workSize; x++) { // Perturb our coordinates float noisex = perturbx[y * workSize + x]; float noisey = perturby[y * workSize + x]; int px = (int) (origSize * noisex * this.magnitude); int py = (int) (origSize * noisey * this.magnitude); float c00 = arr[this.wrap(y - py, workSize) * workSize + this.wrap(x - px, workSize)]; float c01 = arr[this.wrap(y - py, workSize) * workSize + this.wrap(x + px, workSize)]; float c10 = arr[this.wrap(y + py, workSize) * workSize + this.wrap(x - px, workSize)]; float c11 = arr[this.wrap(y + py, workSize) * workSize + this.wrap(x + px, workSize)]; float c0 = ShaderUtils.mix(c00, c01, noisex); float c1 = ShaderUtils.mix(c10, c11, noisex); retval[y * workSize + x] = ShaderUtils.mix(c0, c1, noisey); } } return FloatBuffer.wrap(retval); }
Example #10
Source File: TerrainFractalGridTest.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 4 votes |
@Override public void simpleInitApp() { this.flyCam.setMoveSpeed(100f); ScreenshotAppState state = new ScreenshotAppState(); this.stateManager.attach(state); // TERRAIN TEXTURE material this.mat_terrain = 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 = this.assetManager.loadTexture("Textures/Terrain/splat/grass.jpg"); grass.setWrap(WrapMode.Repeat); this.mat_terrain.setTexture("region1ColorMap", grass); this.mat_terrain.setVector3("region1", new Vector3f(15, 200, this.grassScale)); // DIRT texture Texture dirt = this.assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg"); dirt.setWrap(WrapMode.Repeat); this.mat_terrain.setTexture("region2ColorMap", dirt); this.mat_terrain.setVector3("region2", new Vector3f(0, 20, this.dirtScale)); // ROCK texture Texture rock = this.assetManager.loadTexture("Textures/Terrain/Rock2/rock.jpg"); rock.setWrap(WrapMode.Repeat); this.mat_terrain.setTexture("region3ColorMap", rock); this.mat_terrain.setVector3("region3", new Vector3f(198, 260, this.rockScale)); this.mat_terrain.setTexture("region4ColorMap", rock); this.mat_terrain.setVector3("region4", new Vector3f(198, 260, this.rockScale)); this.mat_terrain.setTexture("slopeColorMap", rock); this.mat_terrain.setFloat("slopeTileFactor", 32); this.mat_terrain.setFloat("terrainSize", 513); this.base = new FractalSum(); this.base.setRoughness(0.7f); this.base.setFrequency(1.0f); this.base.setAmplitude(1.0f); this.base.setLacunarity(2.12f); this.base.setOctaves(8); this.base.setScale(0.02125f); this.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(this.base); this.perturb = new PerturbFilter(); this.perturb.setMagnitude(0.119f); this.therm = new OptimizedErode(); this.therm.setRadius(5); this.therm.setTalus(0.011f); this.smooth = new SmoothFilter(); this.smooth.setRadius(1); this.smooth.setEffect(0.7f); this.iterate = new IterativeFilter(); this.iterate.addPreFilter(this.perturb); this.iterate.addPostFilter(this.smooth); this.iterate.setFilter(this.therm); this.iterate.setIterations(1); ground.addPreFilter(this.iterate); this.terrain = new TerrainGrid("terrain", 33, 129, new FractalTileLoader(ground, 256f)); this.terrain.setMaterial(this.mat_terrain); this.terrain.setLocalTranslation(0, 0, 0); this.terrain.setLocalScale(2f, 1f, 2f); this.rootNode.attachChild(this.terrain); TerrainLodControl control = new TerrainGridLodControl(this.terrain, this.getCamera()); control.setLodCalculator(new DistanceLodCalculator(33, 2.7f)); // patch size, and a multiplier this.terrain.addControl(control); this.getCamera().setLocation(new Vector3f(0, 300, 0)); cam.setRotation(new Quaternion(0.51176f, -0.14f, 0.085f, 0.84336f)); this.viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f)); }
Example #11
Source File: TerrainTestModifyHeight.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 4 votes |
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); }
Example #12
Source File: TerrainFractalGridTest.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
@Override public void simpleInitApp() { this.flyCam.setMoveSpeed(100f); ScreenshotAppState state = new ScreenshotAppState(); this.stateManager.attach(state); // TERRAIN TEXTURE material this.mat_terrain = 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 = this.assetManager.loadTexture("Textures/Terrain/splat/grass.jpg"); grass.setWrap(WrapMode.Repeat); this.mat_terrain.setTexture("region1ColorMap", grass); this.mat_terrain.setVector3("region1", new Vector3f(15, 200, this.grassScale)); // DIRT texture Texture dirt = this.assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg"); dirt.setWrap(WrapMode.Repeat); this.mat_terrain.setTexture("region2ColorMap", dirt); this.mat_terrain.setVector3("region2", new Vector3f(0, 20, this.dirtScale)); // ROCK texture Texture rock = this.assetManager.loadTexture("Textures/Terrain/Rock2/rock.jpg"); rock.setWrap(WrapMode.Repeat); this.mat_terrain.setTexture("region3ColorMap", rock); this.mat_terrain.setVector3("region3", new Vector3f(198, 260, this.rockScale)); this.mat_terrain.setTexture("region4ColorMap", rock); this.mat_terrain.setVector3("region4", new Vector3f(198, 260, this.rockScale)); this.mat_terrain.setTexture("slopeColorMap", rock); this.mat_terrain.setFloat("slopeTileFactor", 32); this.mat_terrain.setFloat("terrainSize", 513); this.base = new FractalSum(); this.base.setRoughness(0.7f); this.base.setFrequency(1.0f); this.base.setAmplitude(1.0f); this.base.setLacunarity(2.12f); this.base.setOctaves(8); this.base.setScale(0.02125f); this.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(this.base); this.perturb = new PerturbFilter(); this.perturb.setMagnitude(0.119f); this.therm = new OptimizedErode(); this.therm.setRadius(5); this.therm.setTalus(0.011f); this.smooth = new SmoothFilter(); this.smooth.setRadius(1); this.smooth.setEffect(0.7f); this.iterate = new IterativeFilter(); this.iterate.addPreFilter(this.perturb); this.iterate.addPostFilter(this.smooth); this.iterate.setFilter(this.therm); this.iterate.setIterations(1); ground.addPreFilter(this.iterate); this.terrain = new TerrainGrid("terrain", 33, 129, new FractalTileLoader(ground, 256f)); this.terrain.setMaterial(this.mat_terrain); this.terrain.setLocalTranslation(0, 0, 0); this.terrain.setLocalScale(2f, 1f, 2f); this.rootNode.attachChild(this.terrain); TerrainLodControl control = new TerrainGridLodControl(this.terrain, this.getCamera()); control.setLodCalculator(new DistanceLodCalculator(33, 2.7f)); // patch size, and a multiplier this.terrain.addControl(control); this.getCamera().setLocation(new Vector3f(0, 300, 0)); this.viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f)); }
Example #13
Source File: TerrainTestModifyHeight.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
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); }