@ -32,6 +32,7 @@
package jme3test.terrain ;
import com.jme3.app.SimpleApplication ;
import com.jme3.asset.TextureKey ;
import com.jme3.bounding.BoundingBox ;
import com.jme3.font.BitmapText ;
import com.jme3.input.KeyInput ;
@ -72,9 +73,14 @@ public class TerrainTestAdvanced extends SimpleApplication {
protected BitmapText hintText ;
PointLight pl ;
Geometry lightMdl ;
private float grassScale = 64 ;
private float dirtScale = 16 ;
private float rockScale = 128 ;
private float darkRockScale = 32 ;
private float pinkRockScale = 32 ;
private float riverRockScale = 80 ;
private float grassScale = 32 ;
private float brickScale = 128 ;
private float roadScale = 200 ;
public static void main ( String [ ] args ) {
TerrainTestAdvanced app = new TerrainTestAdvanced ( ) ;
@ -105,7 +111,8 @@ public class TerrainTestAdvanced extends SimpleApplication {
// this material also supports 'AlphaMap_2', so you can get up to 12 diffuse textures
// HEIGHTMAP image (for the terrain heightmap)
Texture heightMapImage = assetManager . loadTexture ( "Textures/Terrain/splat/mountains512.png" ) ;
TextureKey hmKey = new TextureKey ( "Textures/Terrain/splat/mountains512.png" , false ) ;
Texture heightMapImage = assetManager . loadTexture ( hmKey ) ;
// DIRT texture, Diffuse textures 0 to 3 use the first AlphaMap
Texture dirt = assetManager . loadTexture ( "Textures/Terrain/splat/dirt.jpg" ) ;
@ -113,43 +120,62 @@ public class TerrainTestAdvanced extends SimpleApplication {
matTerrain . setTexture ( "DiffuseMap" , dirt ) ;
matTerrain . setFloat ( "DiffuseMap_0_scale" , dirtScale ) ;
// DARK ROCK texture
Texture darkRock = assetManager . loadTexture ( "Textures/Terrain/Rock2/rock.jpg" ) ;
darkRock . setWrap ( WrapMode . Repeat ) ;
matTerrain . setTexture ( "DiffuseMap_1" , darkRock ) ;
matTerrain . setFloat ( "DiffuseMap_1_scale" , darkRockScale ) ;
// PINK ROCK texture
Texture pinkRock = assetManager . loadTexture ( "Textures/Terrain/Rock/Rock.PNG" ) ;
pinkRock . setWrap ( WrapMode . Repeat ) ;
matTerrain . setTexture ( "DiffuseMap_2" , pinkRock ) ;
matTerrain . setFloat ( "DiffuseMap_2_scale" , pinkRockScale ) ;
// RIVER ROCK texture, this texture will use the next alphaMap: AlphaMap_1
Texture riverRock = assetManager . loadTexture ( "Textures/Terrain/Pond/Pond.jpg" ) ;
riverRock . setWrap ( WrapMode . Repeat ) ;
matTerrain . setTexture ( "DiffuseMap_3" , riverRock ) ;
matTerrain . setFloat ( "DiffuseMap_3_scale" , riverRockScale ) ;
// GRASS texture
Texture grass = assetManager . loadTexture ( "Textures/Terrain/splat/grass.jpg" ) ;
grass . setWrap ( WrapMode . Repeat ) ;
matTerrain . setTexture ( "DiffuseMap_1" , grass ) ;
matTerrain . setFloat ( "DiffuseMap_1_scale" , grassScale ) ;
// ROCK texture
Texture rock = assetManager . loadTexture ( "Textures/Terrain/splat/road.jpg" ) ;
rock . setWrap ( WrapMode . Repeat ) ;
matTerrain . setTexture ( "DiffuseMap_2" , rock ) ;
matTerrain . setFloat ( "DiffuseMap_2_scale" , rockScale ) ;
matTerrain . setTexture ( "DiffuseMap_4" , grass ) ;
matTerrain . setFloat ( "DiffuseMap_4_scale" , grassScale ) ;
// BRICK texture
Texture brick = assetManager . loadTexture ( "Textures/Terrain/BrickWall/BrickWall.jpg" ) ;
brick . setWrap ( WrapMode . Repeat ) ;
matTerrain . setTexture ( "DiffuseMap_3" , brick ) ;
matTerrain . setFloat ( "DiffuseMap_3_scale" , rockScale ) ;
matTerrain . setTexture ( "DiffuseMap_5" , brick ) ;
matTerrain . setFloat ( "DiffuseMap_5_scale" , brickScale ) ;
// ROAD texture
Texture road = assetManager . loadTexture ( "Textures/Terrain/splat/road.jpg" ) ;
road . setWrap ( WrapMode . Repeat ) ;
matTerrain . setTexture ( "DiffuseMap_6" , road ) ;
matTerrain . setFloat ( "DiffuseMap_6_scale" , roadScale ) ;
// RIVER ROCK texture, this texture will use the next alphaMap: AlphaMap_1
Texture riverRock = assetManager . loadTexture ( "Textures/Terrain/Pond/Pond.jpg" ) ;
riverRock . setWrap ( WrapMode . Repeat ) ;
matTerrain . setTexture ( "DiffuseMap_4" , riverRock ) ;
matTerrain . setFloat ( "DiffuseMap_4_scale" , rockScale ) ;
// diffuse textures 0 to 3 use AlphaMap
// diffuse textures 4 to 7 use AlphaMap_1
// diffuse textures 8 to 11 use AlphaMap_2
Texture normalMap0 = assetManager . loadTexture ( "Textures/Terrain/splat/grass_normal.jpg" ) ;
normalMap0 . setWrap ( WrapMode . Repeat ) ;
Texture normalMap1 = assetManager . loadTexture ( "Textures/Terrain/splat/dirt_normal.png" ) ;
normalMap1 . setWrap ( WrapMode . Repeat ) ;
Texture normalMap2 = assetManager . loadTexture ( "Textures/Terrain/splat/road_normal.png" ) ;
normalMap2 . setWrap ( WrapMode . Repeat ) ;
//matTerrain.setTexture("NormalMap", normalMap0);
matTerrain . setTexture ( "NormalMap_1" , normalMap2 ) ;
matTerrain . setTexture ( "NormalMap_2" , normalMap2 ) ;
matTerrain . setTexture ( "NormalMap_4" , normalMap2 ) ;
// NORMAL MAPS
Texture normalMapDirt = assetManager . loadTexture ( "Textures/Terrain/splat/dirt_normal.png" ) ;
normalMapDirt . setWrap ( WrapMode . Repeat ) ;
Texture normalMapPinkRock = assetManager . loadTexture ( "Textures/Terrain/Rock/Rock_normal.png" ) ;
normalMapPinkRock . setWrap ( WrapMode . Repeat ) ;
Texture normalMapGrass = assetManager . loadTexture ( "Textures/Terrain/splat/grass_normal.jpg" ) ;
normalMapGrass . setWrap ( WrapMode . Repeat ) ;
Texture normalMapRoad = assetManager . loadTexture ( "Textures/Terrain/splat/road_normal.png" ) ;
normalMapRoad . setWrap ( WrapMode . Repeat ) ;
matTerrain . setTexture ( "NormalMap" , normalMapDirt ) ;
matTerrain . setTexture ( "NormalMap_1" , normalMapPinkRock ) ;
matTerrain . setTexture ( "NormalMap_2" , normalMapPinkRock ) ;
matTerrain . setTexture ( "NormalMap_4" , normalMapGrass ) ;
matTerrain . setTexture ( "NormalMap_6" , normalMapRoad ) ;
// WIREFRAME material (used to debug the terrain, only useful for this test case)
@ -162,7 +188,7 @@ public class TerrainTestAdvanced extends SimpleApplication {
// CREATE HEIGHTMAP
AbstractHeightMap heightmap = null ;
try {
heightmap = new ImageBasedHeightMap ( heightMapImage . getImage ( ) , 0 . 5 f) ;
heightmap = new ImageBasedHeightMap ( heightMapImage . getImage ( ) , 0 . 3 f) ;
heightmap . load ( ) ;
heightmap . smooth ( 0 . 9f , 1 ) ;
@ -177,7 +203,7 @@ public class TerrainTestAdvanced extends SimpleApplication {
/ * *
* Optimal terrain patch size is 65 ( 64x64 ) .
* The total size is up to you . At 1025 it ran fine for me ( 200 + FPS ) , however at
* size = 2049 , it got really slow . But that is a jump from 2 million to 8 million triangles . . .
* size = 2049 it got really slow . But that is a jump from 2 million to 8 million triangles . . .
* /
terrain = new TerrainQuad ( "terrain" , 65 , 513 , heightmap . getHeightMap ( ) ) ; //, new LodPerspectiveCalculatorFactory(getCamera(), 4)); // add this in to see it use entropy for LOD calculations
TerrainLodControl control = new TerrainLodControl ( terrain , getCamera ( ) ) ;
@ -239,19 +265,27 @@ public class TerrainTestAdvanced extends SimpleApplication {
matTerrain . setBoolean ( "useTriPlanarMapping" , true ) ;
// planar textures don't use the mesh's texture coordinates but real world coordinates,
// so we need to convert these texture coordinate scales into real world scales so it looks
// the same when we switch to/from tr-planar mode
matTerrain . setFloat ( "DiffuseMap_0_scale" , 1f / ( float ) ( 512f / grassScale ) ) ;
matTerrain . setFloat ( "DiffuseMap_1_scale" , 1f / ( float ) ( 512f / dirtScale ) ) ;
matTerrain . setFloat ( "DiffuseMap_2_scale" , 1f / ( float ) ( 512f / rockScale ) ) ;
matTerrain . setFloat ( "DiffuseMap_3_scale" , 1f / ( float ) ( 512f / rockScale ) ) ;
matTerrain . setFloat ( "DiffuseMap_4_scale" , 1f / ( float ) ( 512f / rockScale ) ) ;
// the same when we switch to/from tr-planar mode (1024f is the alphamap size)
matTerrain . setFloat ( "DiffuseMap_0_scale" , 1f / ( float ) ( 1024f / dirtScale ) ) ;
matTerrain . setFloat ( "DiffuseMap_1_scale" , 1f / ( float ) ( 1024f / darkRockScale ) ) ;
matTerrain . setFloat ( "DiffuseMap_2_scale" , 1f / ( float ) ( 1024f / pinkRockScale ) ) ;
matTerrain . setFloat ( "DiffuseMap_3_scale" , 1f / ( float ) ( 1024f / riverRockScale ) ) ;
matTerrain . setFloat ( "DiffuseMap_4_scale" , 1f / ( float ) ( 1024f / grassScale ) ) ;
matTerrain . setFloat ( "DiffuseMap_5_scale" , 1f / ( float ) ( 1024f / brickScale ) ) ;
matTerrain . setFloat ( "DiffuseMap_6_scale" , 1f / ( float ) ( 1024f / roadScale ) ) ;
} else {
matTerrain . setBoolean ( "useTriPlanarMapping" , false ) ;
matTerrain . setFloat ( "DiffuseMap_0_scale" , grassScale ) ;
matTerrain . setFloat ( "DiffuseMap_1_scale" , dirtScale ) ;
matTerrain . setFloat ( "DiffuseMap_2_scale" , rockScale ) ;
matTerrain . setFloat ( "DiffuseMap_3_scale" , rockScale ) ;
matTerrain . setFloat ( "DiffuseMap_4_scale" , rockScale ) ;
matTerrain . setFloat ( "DiffuseMap_0_scale" , dirtScale ) ;
matTerrain . setFloat ( "DiffuseMap_1_scale" , darkRockScale ) ;
matTerrain . setFloat ( "DiffuseMap_2_scale" , pinkRockScale ) ;
matTerrain . setFloat ( "DiffuseMap_3_scale" , riverRockScale ) ;
matTerrain . setFloat ( "DiffuseMap_4_scale" , grassScale ) ;
matTerrain . setFloat ( "DiffuseMap_5_scale" , brickScale ) ;
matTerrain . setFloat ( "DiffuseMap_6_scale" , roadScale ) ;
}
} if ( name . equals ( "DetachControl" ) & & ! pressed ) {
TerrainLodControl control = terrain . getControl ( TerrainLodControl . class ) ;