| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- package jme3test.terrain;
- import com.jme3.app.SimpleApplication;
- import com.jme3.app.state.ScreenshotAppState;
- import com.jme3.material.Material;
- import com.jme3.math.ColorRGBA;
- import com.jme3.math.Quaternion;
- import com.jme3.math.Vector3f;
- import com.jme3.terrain.geomipmap.TerrainGrid;
- import com.jme3.terrain.geomipmap.TerrainGridLodControl;
- import com.jme3.terrain.geomipmap.TerrainLodControl;
- import com.jme3.terrain.geomipmap.grid.FractalTileLoader;
- import com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator;
- import com.jme3.terrain.noise.ShaderUtils;
- import com.jme3.terrain.noise.basis.FilteredBasis;
- import com.jme3.terrain.noise.filter.IterativeFilter;
- import com.jme3.terrain.noise.filter.OptimizedErode;
- import com.jme3.terrain.noise.filter.PerturbFilter;
- import com.jme3.terrain.noise.filter.SmoothFilter;
- import com.jme3.terrain.noise.fractal.FractalSum;
- import com.jme3.terrain.noise.modulator.NoiseModulator;
- import com.jme3.texture.Texture;
- import com.jme3.texture.Texture.WrapMode;
- public class TerrainFractalGridTest extends SimpleApplication {
- final private float grassScale = 64;
- final private float dirtScale = 16;
- final private float rockScale = 128;
- public static void main(final String[] args) {
- TerrainFractalGridTest app = new TerrainFractalGridTest();
- app.start();
- }
- @Override
- public void simpleInitApp() {
- this.flyCam.setMoveSpeed(100f);
- ScreenshotAppState state = new ScreenshotAppState();
- this.stateManager.attach(state);
- // TERRAIN TEXTURE material
- Material 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);
- mat_terrain.setTexture("region1ColorMap", grass);
- 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);
- mat_terrain.setTexture("region2ColorMap", dirt);
- 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);
- mat_terrain.setTexture("region3ColorMap", rock);
- mat_terrain.setVector3("region3", new Vector3f(198, 260, this.rockScale));
- mat_terrain.setTexture("region4ColorMap", rock);
- mat_terrain.setVector3("region4", new Vector3f(198, 260, this.rockScale));
- mat_terrain.setTexture("slopeColorMap", rock);
- mat_terrain.setFloat("slopeTileFactor", 32);
- mat_terrain.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);
- TerrainGrid terrain
- = new TerrainGrid("terrain", 33, 129, new FractalTileLoader(ground, 256f));
- terrain.setMaterial(mat_terrain);
- terrain.setLocalTranslation(0, 0, 0);
- terrain.setLocalScale(2f, 1f, 2f);
- this.rootNode.attachChild(terrain);
- TerrainLodControl control
- = new TerrainGridLodControl(terrain, this.getCamera());
- control.setLodCalculator(new DistanceLodCalculator(33, 2.7f)); // patch size, and a multiplier
- 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));
-
- }
- @Override
- public void simpleUpdate(final float tpf) {
- }
- }
|