ludic/packages/ludic.render3d
Orkuncakilkaya 9dff8f21bd feat(render3d): one wind, and everything in the valley is moved by it
The grass had a gust built from two sines; the trees had no gust term AT ALL, only a
per-instance wobble. So the meadow rippled and the canopy above it swayed to an unrelated
rhythm, and nothing ever crossed the valley.

wind.glsl is prepended to every stage (programs.ludic, and shaders.ludic for the SPIR-V
build) so grass, crowns and water read the same field at the same world position. It
declares no uniforms on purpose: u_time and u_wind already exist in several of those
files and redeclaring them is a compile error in whichever stage includes both.

The wavelength is what made it work. At 0.030 the front was 209 m crest to crest -
longer than the meadow you can see - so the whole frame sat in one phase and the gust
read as everything breathing together. At 0.085 it is 74 m and a front crosses a view in
a couple of seconds.

R3D_DEBUG_WIND=1 paints the field on the ground. It is the only honest way to show a gust
in a still image, and two shots 0.3 s apart move by 39/255.

400 frames: GL 6.9 s, VK 7.2 s. Backends agree to 0.68/255.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 18:24:43 +03:00
..
shaders feat(render3d): one wind, and everything in the valley is moved by it 2026-09-19 18:24:43 +03:00
actor.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
assets.manifest feat(gl): OpenGL 4.1 and the ludic.render3d renderer 2026-09-10 03:31:12 +03:00
camera.ludic feat(render3d): DLSS super resolution and Reflex through NVIDIA Streamline 2026-09-15 19:26:12 +03:00
collide.ludic feat(render3d): replace the world at run time, water bodies, terrain_sea 2026-09-13 00:03:40 +03:00
daylight.ludic fix(render3d): the ground keeps more of its own colour, and the rock keeps all of it 2026-09-19 16:29:17 +03:00
drawstats.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
env.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
FEATURES.md feat: per-voice audio, outlines for what is not an actor, and a coast 2026-09-11 15:25:46 +03:00
fmath.ludic feat(render3d): gpu.ludic - the seam for a second graphics API, and what the GPU can do 2026-09-15 09:52:12 +03:00
gltf.ludic render3d(vulkan): GPU-driven trees - one merged mesh per material, one draw per material; on by default 2026-09-15 16:44:00 +03:00
gpu.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
gpu_manifest.ludic feat(render3d): read the SPIR-V manifest the way a Vulkan backend will 2026-09-15 10:41:43 +03:00
gpu_vk.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
gpu_vk_draw.ludic fix(window): the title a program passes to gl_open / gvk_open reaches the window 2026-09-17 14:02:23 +03:00
gpu_vk_res.ludic feat(render3d): HDR10 output, and DLSS that stays still 2026-09-15 20:06:18 +03:00
grass.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
mesh.ludic perf(render3d): Vulkan draws find pipelines by integer and reuse descriptor sets 2026-09-15 13:22:51 +03:00
overlay.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
package.ludic feat(gl): OpenGL 4.1 and the ludic.render3d renderer 2026-09-10 03:31:12 +03:00
post.ludic feat(render3d): anti-aliasing that exists, and a lens for the viewfinder 2026-09-19 17:38:25 +03:00
prof.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
programs.ludic feat(render3d): one wind, and everything in the valley is moved by it 2026-09-19 18:24:43 +03:00
quat.ludic feat(gl): OpenGL 4.1 and the ludic.render3d renderer 2026-09-10 03:31:12 +03:00
r3d.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
render.ludic feat(render3d): anti-aliasing that exists, and a lens for the viewfinder 2026-09-19 17:38:25 +03:00
scatter.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
shadow.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
skin.ludic refactor(render3d): vertex data and draws behind gpu.ludic 2026-09-15 10:21:55 +03:00
sky.ludic perf(render3d): the sky light baked once at start, the terrain load in four steps, actor cull bounds by height 2026-09-15 15:03:06 +03:00
stream.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
streamline.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
terrain.ludic feat(render3d): one wind, and everything in the valley is moved by it 2026-09-19 18:24:43 +03:00
texture.ludic feat(render3d): texture filtering and shadow resolution a game can change while it runs 2026-09-15 14:25:55 +03:00
water.ludic Merge the R3D_DEV gate: render3d's debug switches only in headless or R3D_DEV builds 2026-09-16 15:31:54 +03:00