diff --git a/packages/ludic.render3d/grass.ludic b/packages/ludic.render3d/grass.ludic index c07f1d18..3828670c 100644 --- a/packages/ludic.render3d/grass.ludic +++ b/packages/ludic.render3d/grass.ludic @@ -15,6 +15,13 @@ var grass_prog: int = 0 var grass_mesh: Mesh = null var grass_on: bool = true var grass_wind: int = 0 +# Where a body is standing, and how wide it pushes. The grass has never known the player was +# in it: you walked through a meadow and every blade ignored you, which is the single most +# noticeable thing missing from every step the game asks you to take. The game sets this each +# frame; radius 0 means nobody is there. +var grass_push_x: int = 0 +var grass_push_z: int = 0 +var grass_push_r: int = 0 var grass_s0: int = 0 # float bits: blade spacing at the camera (m) var grass_d0: int = 0 # the distance at which the spacing has doubled (m) var grass_radius: int = 0 # no blades past this (m) @@ -174,6 +181,7 @@ function grass_draw() -> void { u_mat4(gpu_uniform(p, "u_proj"), cam_proj) u_mat4(gpu_uniform(p, "u_vp"), cam_vp_clean) u_f(gpu_uniform(p, "u_wind"), grass_wind) + u_f3(gpu_uniform(p, "u_push"), grass_push_x, grass_push_z, grass_push_r) u_f(gpu_uniform(p, "u_rough_scale"), F_ONE) u_v3(gpu_uniform(p, "u_tint"), sc_blade_tint) u_v3(gpu_uniform(p, "u_blade_base"), sc_blade_base) diff --git a/packages/ludic.render3d/shaders/grass.vert b/packages/ludic.render3d/shaders/grass.vert index 3a7132ff..aa4b8b1f 100644 --- a/packages/ludic.render3d/shaders/grass.vert +++ b/packages/ludic.render3d/shaders/grass.vert @@ -24,6 +24,7 @@ uniform float u_sea_level; // the sea (terrain_sea); the lake's level when th uniform vec4 u_lake; // the carved lake: centre x/z, half extents (z = 0: none) uniform float u_snow_line; uniform float u_wind; +uniform vec3 u_push; // x, z, radius: a body standing in the grass uniform vec2 u_tile; // world xz of this tile's corner uniform int u_tile_cells; // 16 m cells per tile side uniform int u_per_cell; // indices drawn per cell in this tile @@ -157,6 +158,23 @@ void main() { p.x += sway * hgt * hgt * 0.35; p.z += sway * hgt * hgt * 0.15 * cos(ph * 0.7); p = vec3(c_ * p.x + s * p.z, p.y, -s * p.x + c_ * p.z); + // A BODY STANDING IN IT. Applied here, after the blade's own yaw has put p into world axes + // and before it is tipped onto the ground normal, so the push is a world direction rather + // than something in the blade's private frame. The blade bends AWAY and DOWN - a trodden + // stem is shorter as well as leaning, and leaving the height alone made them splay outward + // like a fan instead of being walked through. + if (u_push.z > 0.0) { + vec2 away = xz - u_push.xy; + float pd = length(away); + float push = smoothstep(u_push.z, u_push.z * 0.2, pd); + if (push > 0.0) { + vec2 pdir = (pd > 1e-3) ? away / pd : vec2(1.0, 0.0); + float bh = max(p.y, 0.0); + p.x += pdir.x * push * bh * 1.05; + p.z += pdir.y * push * bh * 1.05; + p.y -= push * bh * 0.40; + } + } n = normalize(vec3(c_ * n.x + s * n.z, n.y, -s * n.x + c_ * n.z)); // stand on the ground: rotate the blade's frame from world-up to the surface normal { diff --git a/packages/ludic.render3d/shaders/spv/7ed7de52.vert.spv b/packages/ludic.render3d/shaders/spv/7ed7de52.vert.spv index 35b48072..22392dee 100644 Binary files a/packages/ludic.render3d/shaders/spv/7ed7de52.vert.spv and b/packages/ludic.render3d/shaders/spv/7ed7de52.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/7f096322.vert.spv b/packages/ludic.render3d/shaders/spv/7f096322.vert.spv index 046c02dd..97f7b3f0 100644 Binary files a/packages/ludic.render3d/shaders/spv/7f096322.vert.spv and b/packages/ludic.render3d/shaders/spv/7f096322.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/manifest.txt b/packages/ludic.render3d/shaders/spv/manifest.txt index 93c90128..bf688c9a 100644 --- a/packages/ludic.render3d/shaders/spv/manifest.txt +++ b/packages/ludic.render3d/shaders/spv/manifest.txt @@ -798,7 +798,7 @@ T d48d6a48 u_shadow 9 T d48d6a48 u_tershadow 10 T d48d6a48 u_ts_height 11 P 7ed7de52 grass.vert model.frag #define FOLIAGE;#define BLADE; -B 7ed7de52 vert 0 296 +B 7ed7de52 vert 0 320 U 7ed7de52 vert u_view 0 mat4 1 0 U 7ed7de52 vert u_proj 64 mat4 1 0 U 7ed7de52 vert u_vp 128 mat4 1 0 @@ -812,13 +812,14 @@ U 7ed7de52 vert u_sea_level 228 float 1 0 U 7ed7de52 vert u_lake 240 vec4 1 0 U 7ed7de52 vert u_snow_line 256 float 1 0 U 7ed7de52 vert u_wind 260 float 1 0 -U 7ed7de52 vert u_tile 264 vec2 1 0 -U 7ed7de52 vert u_tile_cells 272 int 1 0 -U 7ed7de52 vert u_per_cell 276 int 1 0 -U 7ed7de52 vert u_s0 280 float 1 0 -U 7ed7de52 vert u_d0 284 float 1 0 -U 7ed7de52 vert u_radius 288 float 1 0 -U 7ed7de52 vert u_dbg 292 int 1 0 +U 7ed7de52 vert u_push 272 vec3 1 0 +U 7ed7de52 vert u_tile 288 vec2 1 0 +U 7ed7de52 vert u_tile_cells 296 int 1 0 +U 7ed7de52 vert u_per_cell 300 int 1 0 +U 7ed7de52 vert u_s0 304 float 1 0 +U 7ed7de52 vert u_d0 308 float 1 0 +U 7ed7de52 vert u_radius 312 float 1 0 +U 7ed7de52 vert u_dbg 316 int 1 0 I 7ed7de52 a_pos 0 vec3 I 7ed7de52 a_uv 2 vec2 B 7ed7de52 frag 1 956 @@ -874,7 +875,7 @@ T 7ed7de52 u_shadow 9 T 7ed7de52 u_tershadow 10 T 7ed7de52 u_ts_height 11 P 7f096322 grass.vert model.frag #define FOLIAGE;#define BLADE;#define TILES; -B 7f096322 vert 0 4400 +B 7f096322 vert 0 4416 U 7f096322 vert u_view 0 mat4 1 0 U 7f096322 vert u_proj 64 mat4 1 0 U 7f096322 vert u_vp 128 mat4 1 0 @@ -888,14 +889,15 @@ U 7f096322 vert u_sea_level 228 float 1 0 U 7f096322 vert u_lake 240 vec4 1 0 U 7f096322 vert u_snow_line 256 float 1 0 U 7f096322 vert u_wind 260 float 1 0 -U 7f096322 vert u_tile 264 vec2 1 0 -U 7f096322 vert u_tile_cells 272 int 1 0 -U 7f096322 vert u_per_cell 276 int 1 0 -U 7f096322 vert u_tiles 288 vec4 256 16 -U 7f096322 vert u_s0 4384 float 1 0 -U 7f096322 vert u_d0 4388 float 1 0 -U 7f096322 vert u_radius 4392 float 1 0 -U 7f096322 vert u_dbg 4396 int 1 0 +U 7f096322 vert u_push 272 vec3 1 0 +U 7f096322 vert u_tile 288 vec2 1 0 +U 7f096322 vert u_tile_cells 296 int 1 0 +U 7f096322 vert u_per_cell 300 int 1 0 +U 7f096322 vert u_tiles 304 vec4 256 16 +U 7f096322 vert u_s0 4400 float 1 0 +U 7f096322 vert u_d0 4404 float 1 0 +U 7f096322 vert u_radius 4408 float 1 0 +U 7f096322 vert u_dbg 4412 int 1 0 I 7f096322 a_pos 0 vec3 I 7f096322 a_uv 2 vec2 B 7f096322 frag 1 956