diff options
Diffstat (limited to 'game/addons/zylann.hterrain/tools/brush/decal.gdshader')
-rw-r--r-- | game/addons/zylann.hterrain/tools/brush/decal.gdshader | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/game/addons/zylann.hterrain/tools/brush/decal.gdshader b/game/addons/zylann.hterrain/tools/brush/decal.gdshader new file mode 100644 index 0000000..b56f43a --- /dev/null +++ b/game/addons/zylann.hterrain/tools/brush/decal.gdshader @@ -0,0 +1,41 @@ +shader_type spatial; +render_mode unshaded;//, depth_test_disable; + +#include "res://addons/zylann.hterrain/shaders/include/heightmap.gdshaderinc" + +uniform sampler2D u_terrain_heightmap; +uniform mat4 u_terrain_inverse_transform; +uniform mat3 u_terrain_normal_basis; + +float get_height(sampler2D heightmap, vec2 uv) { + return sample_heightmap(heightmap, uv); +} + +void vertex() { + vec2 cell_coords = (u_terrain_inverse_transform * MODEL_MATRIX * vec4(VERTEX, 1)).xz; + + vec2 ps = vec2(1.0) / vec2(textureSize(u_terrain_heightmap, 0)); + vec2 uv = ps * cell_coords; + + // Get terrain normal + float k = 1.0; + float left = get_height(u_terrain_heightmap, uv + vec2(-ps.x, 0)) * k; + float right = get_height(u_terrain_heightmap, uv + vec2(ps.x, 0)) * k; + float back = get_height(u_terrain_heightmap, uv + vec2(0, -ps.y)) * k; + float fore = get_height(u_terrain_heightmap, uv + vec2(0, ps.y)) * k; + vec3 n = normalize(vec3(left - right, 2.0, back - fore)); + + n = u_terrain_normal_basis * n; + + float h = get_height(u_terrain_heightmap, uv); + VERTEX.y = h; + VERTEX += 1.0 * n; + NORMAL = n;//vec3(0.0, 1.0, 0.0); +} + +void fragment() { + float len = length(2.0 * UV - 1.0); + float g = clamp(1.0 - 15.0 * abs(0.9 - len), 0.0, 1.0); + ALBEDO = vec3(1.0, 0.1, 0.1); + ALPHA = g; +} |