From 2ded30739d6a0d2bc3bca7cb82da2aea0cdf2a25 Mon Sep 17 00:00:00 2001 From: "bre..ns" Date: Sat, 18 Jun 2011 00:10:36 +0000 Subject: [PATCH] * bumped up terrain material texture support * updated the test case example git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7655 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../MatDefs/Terrain/TerrainLighting.frag | 171 ++++++++++++++++++ .../MatDefs/Terrain/TerrainLighting.j3md | 33 ++++ .../Textures/Terrain/splat/alpha1.png | Bin 0 -> 14499 bytes .../Textures/Terrain/splat/alpha2.png | Bin 0 -> 8151 bytes .../jme3test/terrain/TerrainTestAdvanced.java | 26 ++- 5 files changed, 225 insertions(+), 5 deletions(-) create mode 100644 engine/src/test-data/Textures/Terrain/splat/alpha1.png create mode 100644 engine/src/test-data/Textures/Terrain/splat/alpha2.png diff --git a/engine/src/terrain/Common/MatDefs/Terrain/TerrainLighting.frag b/engine/src/terrain/Common/MatDefs/Terrain/TerrainLighting.frag index ac91d07f1..dafb43257 100644 --- a/engine/src/terrain/Common/MatDefs/Terrain/TerrainLighting.frag +++ b/engine/src/terrain/Common/MatDefs/Terrain/TerrainLighting.frag @@ -26,6 +26,18 @@ varying vec4 vnLightDir; #ifdef DIFFUSEMAP_3 uniform sampler2D m_DiffuseMap_3; #endif +#ifdef DIFFUSEMAP_4 + uniform sampler2D m_DiffuseMap_4; +#endif +#ifdef DIFFUSEMAP_5 + uniform sampler2D m_DiffuseMap_5; +#endif +#ifdef DIFFUSEMAP_6 + uniform sampler2D m_DiffuseMap_6; +#endif +#ifdef DIFFUSEMAP_7 + uniform sampler2D m_DiffuseMap_7; +#endif #ifdef DIFFUSEMAP_0_SCALE @@ -40,6 +52,18 @@ varying vec4 vnLightDir; #ifdef DIFFUSEMAP_3_SCALE uniform float m_DiffuseMap_3_scale; #endif +#ifdef DIFFUSEMAP_4_SCALE + uniform float m_DiffuseMap_4_scale; +#endif +#ifdef DIFFUSEMAP_5_SCALE + uniform float m_DiffuseMap_5_scale; +#endif +#ifdef DIFFUSEMAP_6_SCALE + uniform float m_DiffuseMap_6_scale; +#endif +#ifdef DIFFUSEMAP_7_SCALE + uniform float m_DiffuseMap_7_scale; +#endif #ifdef ALPHAMAP @@ -64,6 +88,19 @@ varying vec4 vnLightDir; #ifdef NORMALMAP_3 uniform sampler2D m_NormalMap_3; #endif +#ifdef NORMALMAP_4 + uniform sampler2D m_NormalMap_4; +#endif +#ifdef NORMALMAP_5 + uniform sampler2D m_NormalMap_5; +#endif +#ifdef NORMALMAP_6 + uniform sampler2D m_NormalMap_6; +#endif +#ifdef NORMALMAP_7 + uniform sampler2D m_NormalMap_7; +#endif + #ifdef TRI_PLANAR_MAPPING varying vec4 wVertex; @@ -119,6 +156,11 @@ vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 w vec4 calculateDiffuseBlend(in vec2 texCoord) { vec4 alphaBlend = texture2D( m_AlphaMap, texCoord.xy ); + + #ifdef ALPHAMAP_1 + vec4 alphaBlend1 = texture2D( m_AlphaMap_1, texCoord.xy ); + #endif + vec4 diffuseColor = texture2D(m_DiffuseMap, texCoord * m_DiffuseMap_0_scale); diffuseColor *= alphaBlend.r; #ifdef DIFFUSEMAP_1 @@ -130,6 +172,24 @@ vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 w #ifdef DIFFUSEMAP_3 vec4 diffuseColor3 = texture2D(m_DiffuseMap_3, texCoord * m_DiffuseMap_3_scale); diffuseColor = mix( diffuseColor, diffuseColor3, alphaBlend.a ); + #ifdef ALPHAMAP_1 + #ifdef DIFFUSEMAP_4 + vec4 diffuseColor4 = texture2D(m_DiffuseMap_4, texCoord * m_DiffuseMap_4_scale); + diffuseColor = mix( diffuseColor, diffuseColor4, alphaBlend1.r ); + #ifdef DIFFUSEMAP_5 + vec4 diffuseColor5 = texture2D(m_DiffuseMap_5, texCoord * m_DiffuseMap_5_scale); + diffuseColor = mix( diffuseColor, diffuseColor5, alphaBlend1.g ); + #ifdef DIFFUSEMAP_6 + vec4 diffuseColor6 = texture2D(m_DiffuseMap_6, texCoord * m_DiffuseMap_6_scale); + diffuseColor = mix( diffuseColor, diffuseColor6, alphaBlend1.b ); + #ifdef DIFFUSEMAP_7 + vec4 diffuseColor7 = texture2D(m_DiffuseMap_7, texCoord * m_DiffuseMap_7_scale); + diffuseColor = mix( diffuseColor, diffuseColor7, alphaBlend1.a ); + #endif + #endif + #endif + #endif + #endif #endif #endif #endif @@ -143,6 +203,10 @@ vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 w vec4 alphaBlend = texture2D( m_AlphaMap, texCoord.xy ); + #ifdef ALPHAMAP_1 + vec4 alphaBlend1 = texture2D( m_AlphaMap_1, texCoord.xy ); + #endif + #ifdef NORMALMAP normalHeight = texture2D(m_NormalMap, texCoord * m_DiffuseMap_0_scale); n = (normalHeight.xyz * vec3(2.0) - vec3(1.0)); @@ -175,6 +239,40 @@ vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 w normal += n * alphaBlend.a; #endif + #ifdef ALPHAMAP_1 + #ifdef NORMALMAP_4 + normalHeight = texture2D(m_NormalMap_4, texCoord * m_DiffuseMap_4_scale); + n = (normalHeight.xyz * vec3(2.0) - vec3(1.0)); + n.z = sqrt(1.0 - (n.x * n.x) - (n.y * n.y)); + n.y = -n.y; + normal += n * alphaBlend1.r; + #endif + + #ifdef NORMALMAP_5 + normalHeight = texture2D(m_NormalMap_5, texCoord * m_DiffuseMap_5_scale); + n = (normalHeight.xyz * vec3(2.0) - vec3(1.0)); + n.z = sqrt(1.0 - (n.x * n.x) - (n.y * n.y)); + n.y = -n.y; + normal += n * alphaBlend1.g; + #endif + + #ifdef NORMALMAP_6 + normalHeight = texture2D(m_NormalMap_6, texCoord * m_DiffuseMap_6_scale); + n = (normalHeight.xyz * vec3(2.0) - vec3(1.0)); + n.z = sqrt(1.0 - (n.x * n.x) - (n.y * n.y)); + n.y = -n.y; + normal += n * alphaBlend1.b; + #endif + + #ifdef NORMALMAP_7 + normalHeight = texture2D(m_NormalMap_7, texCoord * m_DiffuseMap_67_scale); + n = (normalHeight.xyz * vec3(2.0) - vec3(1.0)); + n.z = sqrt(1.0 - (n.x * n.x) - (n.y * n.y)); + n.y = -n.y; + normal += n * alphaBlend1.a; + #endif + #endif + return normalize(normal); } @@ -215,8 +313,29 @@ vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 w // blend the results of the 3 planar projections. vec4 tex3 = getTriPlanarBlend(coords, blending, m_DiffuseMap_3, m_DiffuseMap_3_scale); #endif + #ifdef DIFFUSEMAP_4 + // blend the results of the 3 planar projections. + vec4 tex4 = getTriPlanarBlend(coords, blending, m_DiffuseMap_4, m_DiffuseMap_4_scale); + #endif + #ifdef DIFFUSEMAP_5 + // blend the results of the 3 planar projections. + vec4 tex5 = getTriPlanarBlend(coords, blending, m_DiffuseMap_5, m_DiffuseMap_5_scale); + #endif + #ifdef DIFFUSEMAP_6 + // blend the results of the 3 planar projections. + vec4 tex6 = getTriPlanarBlend(coords, blending, m_DiffuseMap_6, m_DiffuseMap_6_scale); + #endif + #ifdef DIFFUSEMAP_7 + // blend the results of the 3 planar projections. + vec4 tex7 = getTriPlanarBlend(coords, blending, m_DiffuseMap_7, m_DiffuseMap_7_scale); + #endif vec4 alphaBlend = texture2D( m_AlphaMap, texCoord.xy ); + + #ifdef ALPHAMAP_1 + vec4 alphaBlend1 = texture2D( m_AlphaMap_1, texCoord.xy ); + #endif + vec4 diffuseColor = tex0 * alphaBlend.r; #ifdef DIFFUSEMAP_1 diffuseColor = mix( diffuseColor, tex1, alphaBlend.g ); @@ -224,6 +343,20 @@ vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 w diffuseColor = mix( diffuseColor, tex2, alphaBlend.b ); #ifdef DIFFUSEMAP_3 diffuseColor = mix( diffuseColor, tex3, alphaBlend.a ); + #ifdef ALPHAMAP_1 + #ifdef DIFFUSEMAP_4 + diffuseColor = mix( diffuseColor, tex4, alphaBlend1.r ); + #ifdef DIFFUSEMAP_5 + diffuseColor = mix( diffuseColor, tex5, alphaBlend1.g ); + #ifdef DIFFUSEMAP_6 + diffuseColor = mix( diffuseColor, tex6, alphaBlend1.b ); + #ifdef DIFFUSEMAP_7 + diffuseColor = mix( diffuseColor, tex7, alphaBlend1.a ); + #endif + #endif + #endif + #endif + #endif #endif #endif #endif @@ -243,6 +376,10 @@ vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 w vec4 coords = wVert; vec4 alphaBlend = texture2D( m_AlphaMap, texCoord.xy ); + #ifdef ALPHAMAP_1 + vec4 alphaBlend1 = texture2D( m_AlphaMap_1, texCoord.xy ); + #endif + vec3 normal = vec3(0,0,1); vec3 n = vec3(0,0,0); vec4 normalHeight = vec4(0,0,0,0); @@ -279,6 +416,40 @@ vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 w normal += n * alphaBlend.a; #endif + #ifdef ALPHAMAP_1 + #ifdef NORMALMAP_4 + normalHeight = getTriPlanarBlend(coords, blending, m_NormalMap_4, m_DiffuseMap_4_scale); + n = (normalHeight.xyz * vec3(2.0) - vec3(1.0)); + n.z = sqrt(1.0 - (n.x * n.x) - (n.y * n.y)); + n.y = -n.y; + normal += n * alphaBlend1.r; + #endif + + #ifdef NORMALMAP_5 + normalHeight = getTriPlanarBlend(coords, blending, m_NormalMap_5, m_DiffuseMap_5_scale); + n = (normalHeight.xyz * vec3(2.0) - vec3(1.0)); + n.z = sqrt(1.0 - (n.x * n.x) - (n.y * n.y)); + n.y = -n.y; + normal += n * alphaBlend1.g; + #endif + + #ifdef NORMALMAP_6 + normalHeight = getTriPlanarBlend(coords, blending, m_NormalMap_6, m_DiffuseMap_6_scale); + n = (normalHeight.xyz * vec3(2.0) - vec3(1.0)); + n.z = sqrt(1.0 - (n.x * n.x) - (n.y * n.y)); + n.y = -n.y; + normal += n * alphaBlend1.b; + #endif + + #ifdef NORMALMAP_7 + normalHeight = getTriPlanarBlend(coords, blending, m_NormalMap_7, m_DiffuseMap_7_scale); + n = (normalHeight.xyz * vec3(2.0) - vec3(1.0)); + n.z = sqrt(1.0 - (n.x * n.x) - (n.y * n.y)); + n.y = -n.y; + normal += n * alphaBlend1.a; + #endif + #endif + return normalize(normal); } #endif diff --git a/engine/src/terrain/Common/MatDefs/Terrain/TerrainLighting.j3md b/engine/src/terrain/Common/MatDefs/Terrain/TerrainLighting.j3md index 766e25b3d..5760da612 100644 --- a/engine/src/terrain/Common/MatDefs/Terrain/TerrainLighting.j3md +++ b/engine/src/terrain/Common/MatDefs/Terrain/TerrainLighting.j3md @@ -40,6 +40,27 @@ MaterialDef Terrain Lighting { Float DiffuseMap_3_scale Texture2D NormalMap_3 + // Texture map #4 + Texture2D DiffuseMap_4 + Float DiffuseMap_4_scale + Texture2D NormalMap_4 + + // Texture map #5 + Texture2D DiffuseMap_5 + Float DiffuseMap_5_scale + Texture2D NormalMap_5 + + // Texture map #6 + Texture2D DiffuseMap_6 + Float DiffuseMap_6_scale + Texture2D NormalMap_6 + + // Texture map #7 + Texture2D DiffuseMap_7 + Float DiffuseMap_7_scale + Texture2D NormalMap_7 + + // Specular/gloss map Texture2D SpecularMap @@ -78,10 +99,18 @@ MaterialDef Terrain Lighting { DIFFUSEMAP_1 : DiffuseMap_1 DIFFUSEMAP_2 : DiffuseMap_2 DIFFUSEMAP_3 : DiffuseMap_3 + DIFFUSEMAP_4 : DiffuseMap_4 + DIFFUSEMAP_5 : DiffuseMap_5 + DIFFUSEMAP_6 : DiffuseMap_6 + DIFFUSEMAP_7 : DiffuseMap_7 NORMALMAP : NormalMap NORMALMAP_1 : NormalMap_1 NORMALMAP_2 : NormalMap_2 NORMALMAP_3 : NormalMap_3 + NORMALMAP_4 : NormalMap_4 + NORMALMAP_5 : NormalMap_5 + NORMALMAP_6 : NormalMap_6 + NORMALMAP_7 : NormalMap_7 SPECULARMAP : SpecularMap ALPHAMAP : AlphaMap ALPHAMAP_1 : AlphaMap_1 @@ -90,6 +119,10 @@ MaterialDef Terrain Lighting { DIFFUSEMAP_1_SCALE : DiffuseMap_1_scale DIFFUSEMAP_2_SCALE : DiffuseMap_2_scale DIFFUSEMAP_3_SCALE : DiffuseMap_3_scale + DIFFUSEMAP_4_SCALE : DiffuseMap_4_scale + DIFFUSEMAP_5_SCALE : DiffuseMap_5_scale + DIFFUSEMAP_6_SCALE : DiffuseMap_6_scale + DIFFUSEMAP_7_SCALE : DiffuseMap_7_scale } } diff --git a/engine/src/test-data/Textures/Terrain/splat/alpha1.png b/engine/src/test-data/Textures/Terrain/splat/alpha1.png new file mode 100644 index 0000000000000000000000000000000000000000..4179ba517c244ba70ad0bb11d7809b1826f03fba GIT binary patch literal 14499 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 N*jhPRR$6$+{vWcDF@695 literal 0 HcmV?d00001 diff --git a/engine/src/test-data/Textures/Terrain/splat/alpha2.png b/engine/src/test-data/Textures/Terrain/splat/alpha2.png new file mode 100644 index 0000000000000000000000000000000000000000..49eacecf0ba6a88df58ef6f5e89194a4b1d414a6 GIT binary patch literal 8151 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 VY1cIQ>i>NpO?4f$QWdMv{{x(uE%5*V literal 0 HcmV?d00001 diff --git a/engine/src/test/jme3test/terrain/TerrainTestAdvanced.java b/engine/src/test/jme3test/terrain/TerrainTestAdvanced.java index 2f60e7f7e..6ad3b9433 100644 --- a/engine/src/test/jme3test/terrain/TerrainTestAdvanced.java +++ b/engine/src/test/jme3test/terrain/TerrainTestAdvanced.java @@ -47,12 +47,10 @@ import com.jme3.math.Vector3f; import com.jme3.renderer.Camera; import com.jme3.scene.Geometry; import com.jme3.scene.Spatial; -import com.jme3.scene.shape.Box; import com.jme3.terrain.geomipmap.TerrainLodControl; import com.jme3.terrain.heightmap.AbstractHeightMap; import com.jme3.terrain.heightmap.ImageBasedHeightMap; import com.jme3.terrain.geomipmap.TerrainQuad; -import com.jme3.terrain.geomipmap.lodcalc.LodPerspectiveCalculatorFactory; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; import com.jme3.util.SkyFactory; @@ -60,7 +58,7 @@ import java.util.ArrayList; import java.util.List; /** - * + * Uses the terrain's lighting texture with normal maps and lights. * * @author bowens */ @@ -104,18 +102,19 @@ public class TerrainTestAdvanced extends SimpleApplication { matTerrain.setBoolean("WardIso", true); // ALPHA map (for splat textures) - matTerrain.setTexture("AlphaMap", assetManager.loadTexture("Textures/Terrain/splat/alphamap.png")); + matTerrain.setTexture("AlphaMap", assetManager.loadTexture("Textures/Terrain/splat/alpha1.png")); + matTerrain.setTexture("AlphaMap_1", assetManager.loadTexture("Textures/Terrain/splat/alpha2.png")); // HEIGHTMAP image (for the terrain heightmap) Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png"); + // GRASS texture Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg"); grass.setWrap(WrapMode.Repeat); matTerrain.setTexture("DiffuseMap", grass); matTerrain.setFloat("DiffuseMap_0_scale", grassScale); - // DIRT texture Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg"); dirt.setWrap(WrapMode.Repeat); @@ -128,6 +127,18 @@ public class TerrainTestAdvanced extends SimpleApplication { matTerrain.setTexture("DiffuseMap_2", rock); matTerrain.setFloat("DiffuseMap_2_scale", rockScale); + // 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); + + // RIVER ROCK texture + Texture riverRock = assetManager.loadTexture("Textures/Terrain/Pond/Pond.png"); + riverRock.setWrap(WrapMode.Repeat); + matTerrain.setTexture("DiffuseMap_4", riverRock); + matTerrain.setFloat("DiffuseMap_4_scale", rockScale); + Texture normalMap0 = assetManager.loadTexture("Textures/Terrain/splat/grass_normal.jpg"); normalMap0.setWrap(WrapMode.Repeat); @@ -138,6 +149,7 @@ public class TerrainTestAdvanced extends SimpleApplication { matTerrain.setTexture("NormalMap", normalMap0); matTerrain.setTexture("NormalMap_1", normalMap2); matTerrain.setTexture("NormalMap_2", normalMap2); + matTerrain.setTexture("NormalMap_4", normalMap2); // WIREFRAME material matWire = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); @@ -230,11 +242,15 @@ public class TerrainTestAdvanced extends SimpleApplication { 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)); } 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); } } }