feat(render3d): an aspen quakes, and a tree is no longer bent like a bow

layer_flutter(l, v) gives a scatter layer a per-leaf tremble. The vertex stage offsets
each leaf by a phase taken from its own place on the card, so neighbouring leaves are
never in step, and writes the result out as a varying the fragment stage uses to flash
the leaf's pale underside as it turns - which is the part that reads, since a still
frame of a tremble is a still frame of nothing. One uniform, one varying, no extra pass.

And the sway itself was measured in METRES: hgt * hgt * 0.35 is right for a 40 cm
flower and puts ten metres of sideways into a 14 m trunk, so every tall tree in the
valley stood bent over like a fishing rod. It is a fraction of the model's own height
now - the tip moves a few per cent of the tree whatever the tree is, and the base does
not move at all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-19 21:13:42 +03:00
parent 4975c60ac1
commit ab6f310013
47 changed files with 99 additions and 19 deletions

View file

@ -1076,7 +1076,7 @@ T 4d4fa91b u_shadow 7
T 4d4fa91b u_tershadow 8
T 4d4fa91b u_ts_height 9
P 9dce3246 model.vert bake.frag
B 9dce3246 vert 0 232
B 9dce3246 vert 0 236
U 9dce3246 vert u_view 0 mat4 1 0
U 9dce3246 vert u_proj 64 mat4 1 0
U 9dce3246 vert u_light_vp 128 mat4 1 0
@ -1088,6 +1088,7 @@ U 9dce3246 vert u_ground 208 float 1 0
U 9dce3246 vert u_ts_origin 216 vec2 1 0
U 9dce3246 vert u_ts_half 224 float 1 0
U 9dce3246 vert u_model_h 228 float 1 0
U 9dce3246 vert u_flutter 232 float 1 0
I 9dce3246 i_rot 4 vec4
I 9dce3246 a_pos 0 vec3
I 9dce3246 i_pos 3 vec4
@ -1137,7 +1138,7 @@ T 9dce3246 u_shadow 7
T 9dce3246 u_tershadow 8
T 9dce3246 u_ts_height 9
P 439a2253 model.vert bake.frag #define CARD;
B 439a2253 vert 0 232
B 439a2253 vert 0 236
U 439a2253 vert u_view 0 mat4 1 0
U 439a2253 vert u_proj 64 mat4 1 0
U 439a2253 vert u_light_vp 128 mat4 1 0
@ -1149,6 +1150,7 @@ U 439a2253 vert u_ground 208 float 1 0
U 439a2253 vert u_ts_origin 216 vec2 1 0
U 439a2253 vert u_ts_half 224 float 1 0
U 439a2253 vert u_model_h 228 float 1 0
U 439a2253 vert u_flutter 232 float 1 0
I 439a2253 i_rot 4 vec4
I 439a2253 a_pos 0 vec3
I 439a2253 i_pos 3 vec4
@ -1198,7 +1200,7 @@ T 439a2253 u_shadow 7
T 439a2253 u_tershadow 8
T 439a2253 u_ts_height 9
P 86f427b0 model.vert bake.frag #define FLOWER;
B 86f427b0 vert 0 232
B 86f427b0 vert 0 236
U 86f427b0 vert u_view 0 mat4 1 0
U 86f427b0 vert u_proj 64 mat4 1 0
U 86f427b0 vert u_light_vp 128 mat4 1 0
@ -1210,6 +1212,7 @@ U 86f427b0 vert u_ground 208 float 1 0
U 86f427b0 vert u_ts_origin 216 vec2 1 0
U 86f427b0 vert u_ts_half 224 float 1 0
U 86f427b0 vert u_model_h 228 float 1 0
U 86f427b0 vert u_flutter 232 float 1 0
I 86f427b0 i_rot 4 vec4
I 86f427b0 a_pos 0 vec3
I 86f427b0 i_pos 3 vec4
@ -1259,7 +1262,7 @@ T 86f427b0 u_shadow 7
T 86f427b0 u_tershadow 8
T 86f427b0 u_ts_height 9
P bfa15301 model.vert depth.frag #define FOLIAGE;#define WIND;#define ALPHA_TEST;
B bfa15301 vert 0 232
B bfa15301 vert 0 236
U bfa15301 vert u_view 0 mat4 1 0
U bfa15301 vert u_proj 64 mat4 1 0
U bfa15301 vert u_light_vp 128 mat4 1 0
@ -1271,6 +1274,7 @@ U bfa15301 vert u_ground 208 float 1 0
U bfa15301 vert u_ts_origin 216 vec2 1 0
U bfa15301 vert u_ts_half 224 float 1 0
U bfa15301 vert u_model_h 228 float 1 0
U bfa15301 vert u_flutter 232 float 1 0
I bfa15301 i_rot 4 vec4
I bfa15301 a_pos 0 vec3
I bfa15301 i_pos 3 vec4
@ -1319,7 +1323,7 @@ T bfa15301 u_shadow 6
T bfa15301 u_tershadow 7
T bfa15301 u_ts_height 8
P 01089da8 model.vert model.frag
B 01089da8 vert 0 232
B 01089da8 vert 0 236
U 01089da8 vert u_view 0 mat4 1 0
U 01089da8 vert u_proj 64 mat4 1 0
U 01089da8 vert u_light_vp 128 mat4 1 0
@ -1331,6 +1335,7 @@ U 01089da8 vert u_ground 208 float 1 0
U 01089da8 vert u_ts_origin 216 vec2 1 0
U 01089da8 vert u_ts_half 224 float 1 0
U 01089da8 vert u_model_h 228 float 1 0
U 01089da8 vert u_flutter 232 float 1 0
I 01089da8 i_rot 4 vec4
I 01089da8 a_pos 0 vec3
I 01089da8 i_pos 3 vec4
@ -1386,7 +1391,7 @@ T 01089da8 u_shadow 8
T 01089da8 u_tershadow 9
T 01089da8 u_ts_height 10
P 254e7887 model.vert model.frag #define CARD;#define CHEAP;
B 254e7887 vert 0 232
B 254e7887 vert 0 236
U 254e7887 vert u_view 0 mat4 1 0
U 254e7887 vert u_proj 64 mat4 1 0
U 254e7887 vert u_light_vp 128 mat4 1 0
@ -1398,6 +1403,7 @@ U 254e7887 vert u_ground 208 float 1 0
U 254e7887 vert u_ts_origin 216 vec2 1 0
U 254e7887 vert u_ts_half 224 float 1 0
U 254e7887 vert u_model_h 228 float 1 0
U 254e7887 vert u_flutter 232 float 1 0
I 254e7887 i_rot 4 vec4
I 254e7887 a_pos 0 vec3
I 254e7887 i_pos 3 vec4
@ -1454,7 +1460,7 @@ T 254e7887 u_shadow 8
T 254e7887 u_tershadow 9
T 254e7887 u_ts_height 10
P 1ce5c5d1 model.vert model.frag #define FOLIAGE;#define WIND;#define ALPHA_TEST;
B 1ce5c5d1 vert 0 232
B 1ce5c5d1 vert 0 236
U 1ce5c5d1 vert u_view 0 mat4 1 0
U 1ce5c5d1 vert u_proj 64 mat4 1 0
U 1ce5c5d1 vert u_light_vp 128 mat4 1 0
@ -1466,6 +1472,7 @@ U 1ce5c5d1 vert u_ground 208 float 1 0
U 1ce5c5d1 vert u_ts_origin 216 vec2 1 0
U 1ce5c5d1 vert u_ts_half 224 float 1 0
U 1ce5c5d1 vert u_model_h 228 float 1 0
U 1ce5c5d1 vert u_flutter 232 float 1 0
I 1ce5c5d1 i_rot 4 vec4
I 1ce5c5d1 a_pos 0 vec3
I 1ce5c5d1 i_pos 3 vec4
@ -1521,7 +1528,7 @@ T 1ce5c5d1 u_shadow 8
T 1ce5c5d1 u_tershadow 9
T 1ce5c5d1 u_ts_height 10
P f4a2b586 model.vert model.frag #define FOLIAGE;#define WIND;#define BLADE;
B f4a2b586 vert 0 248
B f4a2b586 vert 0 252
U f4a2b586 vert u_view 0 mat4 1 0
U f4a2b586 vert u_proj 64 mat4 1 0
U f4a2b586 vert u_light_vp 128 mat4 1 0
@ -1535,6 +1542,7 @@ U f4a2b586 vert u_ground 224 float 1 0
U f4a2b586 vert u_ts_origin 232 vec2 1 0
U f4a2b586 vert u_ts_half 240 float 1 0
U f4a2b586 vert u_model_h 244 float 1 0
U f4a2b586 vert u_flutter 248 float 1 0
I f4a2b586 i_rot 4 vec4
I f4a2b586 a_pos 0 vec3
I f4a2b586 i_pos 3 vec4
@ -1592,7 +1600,7 @@ T f4a2b586 u_shadow 8
T f4a2b586 u_tershadow 9
T f4a2b586 u_ts_height 10
P b4587cd4 model.vert model.frag #define FOLIAGE;#define WIND;#define CARD;
B b4587cd4 vert 0 232
B b4587cd4 vert 0 236
U b4587cd4 vert u_view 0 mat4 1 0
U b4587cd4 vert u_proj 64 mat4 1 0
U b4587cd4 vert u_light_vp 128 mat4 1 0
@ -1604,6 +1612,7 @@ U b4587cd4 vert u_ground 208 float 1 0
U b4587cd4 vert u_ts_origin 216 vec2 1 0
U b4587cd4 vert u_ts_half 224 float 1 0
U b4587cd4 vert u_model_h 228 float 1 0
U b4587cd4 vert u_flutter 232 float 1 0
I b4587cd4 i_rot 4 vec4
I b4587cd4 a_pos 0 vec3
I b4587cd4 i_pos 3 vec4
@ -1660,7 +1669,7 @@ T b4587cd4 u_shadow 8
T b4587cd4 u_tershadow 9
T b4587cd4 u_ts_height 10
P 4dda406a model.vert model.frag #define FOLIAGE;#define WIND;#define EQ_PASS;
B 4dda406a vert 0 232
B 4dda406a vert 0 236
U 4dda406a vert u_view 0 mat4 1 0
U 4dda406a vert u_proj 64 mat4 1 0
U 4dda406a vert u_light_vp 128 mat4 1 0
@ -1672,6 +1681,7 @@ U 4dda406a vert u_ground 208 float 1 0
U 4dda406a vert u_ts_origin 216 vec2 1 0
U 4dda406a vert u_ts_half 224 float 1 0
U 4dda406a vert u_model_h 228 float 1 0
U 4dda406a vert u_flutter 232 float 1 0
I 4dda406a i_rot 4 vec4
I 4dda406a a_pos 0 vec3
I 4dda406a i_pos 3 vec4
@ -1727,7 +1737,7 @@ T 4dda406a u_shadow 8
T 4dda406a u_tershadow 9
T 4dda406a u_ts_height 10
P 3b183d8f model.vert model.frag #define FOLIAGE;#define WIND;#define FLOWER;
B 3b183d8f vert 0 232
B 3b183d8f vert 0 236
U 3b183d8f vert u_view 0 mat4 1 0
U 3b183d8f vert u_proj 64 mat4 1 0
U 3b183d8f vert u_light_vp 128 mat4 1 0
@ -1739,6 +1749,7 @@ U 3b183d8f vert u_ground 208 float 1 0
U 3b183d8f vert u_ts_origin 216 vec2 1 0
U 3b183d8f vert u_ts_half 224 float 1 0
U 3b183d8f vert u_model_h 228 float 1 0
U 3b183d8f vert u_flutter 232 float 1 0
I 3b183d8f i_rot 4 vec4
I 3b183d8f a_pos 0 vec3
I 3b183d8f i_pos 3 vec4
@ -1794,7 +1805,7 @@ T 3b183d8f u_shadow 8
T 3b183d8f u_tershadow 9
T 3b183d8f u_ts_height 10
P 79b77ed9 model.vert model.frag #define SHADOW_PASS;#define WIND;#define CARD;
B 79b77ed9 vert 0 232
B 79b77ed9 vert 0 236
U 79b77ed9 vert u_view 0 mat4 1 0
U 79b77ed9 vert u_proj 64 mat4 1 0
U 79b77ed9 vert u_light_vp 128 mat4 1 0
@ -1806,6 +1817,7 @@ U 79b77ed9 vert u_ground 208 float 1 0
U 79b77ed9 vert u_ts_origin 216 vec2 1 0
U 79b77ed9 vert u_ts_half 224 float 1 0
U 79b77ed9 vert u_model_h 228 float 1 0
U 79b77ed9 vert u_flutter 232 float 1 0
I 79b77ed9 i_rot 4 vec4
I 79b77ed9 a_pos 0 vec3
I 79b77ed9 i_pos 3 vec4
@ -1862,7 +1874,7 @@ T 79b77ed9 u_shadow 8
T 79b77ed9 u_tershadow 9
T 79b77ed9 u_ts_height 10
P b9fc2041 model.vert model.frag #define WIND;
B b9fc2041 vert 0 232
B b9fc2041 vert 0 236
U b9fc2041 vert u_view 0 mat4 1 0
U b9fc2041 vert u_proj 64 mat4 1 0
U b9fc2041 vert u_light_vp 128 mat4 1 0
@ -1874,6 +1886,7 @@ U b9fc2041 vert u_ground 208 float 1 0
U b9fc2041 vert u_ts_origin 216 vec2 1 0
U b9fc2041 vert u_ts_half 224 float 1 0
U b9fc2041 vert u_model_h 228 float 1 0
U b9fc2041 vert u_flutter 232 float 1 0
I b9fc2041 i_rot 4 vec4
I b9fc2041 a_pos 0 vec3
I b9fc2041 i_pos 3 vec4
@ -1929,7 +1942,7 @@ T b9fc2041 u_shadow 8
T b9fc2041 u_tershadow 9
T b9fc2041 u_ts_height 10
P f34dce08 model.vert shadow.frag #define SHADOW_PASS;
B f34dce08 vert 0 232
B f34dce08 vert 0 236
U f34dce08 vert u_view 0 mat4 1 0
U f34dce08 vert u_proj 64 mat4 1 0
U f34dce08 vert u_light_vp 128 mat4 1 0
@ -1941,6 +1954,7 @@ U f34dce08 vert u_ground 208 float 1 0
U f34dce08 vert u_ts_origin 216 vec2 1 0
U f34dce08 vert u_ts_half 224 float 1 0
U f34dce08 vert u_model_h 228 float 1 0
U f34dce08 vert u_flutter 232 float 1 0
I f34dce08 i_rot 4 vec4
I f34dce08 a_pos 0 vec3
I f34dce08 i_pos 3 vec4
@ -1989,7 +2003,7 @@ T f34dce08 u_shadow 6
T f34dce08 u_tershadow 7
T f34dce08 u_ts_height 8
P 512004a1 model.vert shadow.frag #define SHADOW_PASS;#define WIND;
B 512004a1 vert 0 232
B 512004a1 vert 0 236
U 512004a1 vert u_view 0 mat4 1 0
U 512004a1 vert u_proj 64 mat4 1 0
U 512004a1 vert u_light_vp 128 mat4 1 0
@ -2001,6 +2015,7 @@ U 512004a1 vert u_ground 208 float 1 0
U 512004a1 vert u_ts_origin 216 vec2 1 0
U 512004a1 vert u_ts_half 224 float 1 0
U 512004a1 vert u_model_h 228 float 1 0
U 512004a1 vert u_flutter 232 float 1 0
I 512004a1 i_rot 4 vec4
I 512004a1 a_pos 0 vec3
I 512004a1 i_pos 3 vec4
@ -2049,7 +2064,7 @@ T 512004a1 u_shadow 6
T 512004a1 u_tershadow 7
T 512004a1 u_ts_height 8
P b964507f model.vert shadow.frag #define SHADOW_PASS;#define WIND;#define ALPHA_TEST;
B b964507f vert 0 232
B b964507f vert 0 236
U b964507f vert u_view 0 mat4 1 0
U b964507f vert u_proj 64 mat4 1 0
U b964507f vert u_light_vp 128 mat4 1 0
@ -2061,6 +2076,7 @@ U b964507f vert u_ground 208 float 1 0
U b964507f vert u_ts_origin 216 vec2 1 0
U b964507f vert u_ts_half 224 float 1 0
U b964507f vert u_model_h 228 float 1 0
U b964507f vert u_flutter 232 float 1 0
I b964507f i_rot 4 vec4
I b964507f a_pos 0 vec3
I b964507f i_pos 3 vec4