From e908672034dcae69277ef183fc70ba2775f1998a Mon Sep 17 00:00:00 2001 From: Orkuncakilkaya Date: Tue, 29 Sep 2026 19:03:33 +0300 Subject: [PATCH] render3d: a grass kind - the GPU blades' per-kind numbers are a GrassKind record the game hands over (grass_kind_set), not constants GrassKind (grass_kind.ludic) carries what grass.ludic, grass_gpu.ludic, grass.vert, grass_cull.comp and model.frag's BLADE path held as constants: the cell, s0 / d0 / radius, the row bands and rows, the blade profile (neck, root, swell, tip, bend), the heights, clumps, widths and arch, where it grows (slope, snow, the photograph's test), the root / tip / gone-to-seed colours, the far tufts, the root occlusion, the roughness, the sheen and the wind. Its defaults are those constants exactly, so a game that sets nothing draws as before. The shaders read them as u_gk_* (the cull as five more Params vec4s, 288 bytes); grass_reset.comp writes each band's index count so a kind of other rows reaches the draw in order. grass_quality holds the kind to a settings tier (never denser, never farther); R3D_GRASS_* still win. grass_profile_w / _bend are the one profile, for the meshes and a game's preview. grass.mesh takes only the cell: the rest of it is an older copy that already differs from grass.vert, left as it draws. Co-Authored-By: Claude Opus 5.5 --- changes/render3d-grass-kind.md | 10 ++ packages/ludic.render3d/env.ludic | 5 +- packages/ludic.render3d/gpu_vk.ludic | 4 +- packages/ludic.render3d/grass.ludic | 65 +++++---- packages/ludic.render3d/grass_bind.ludic | 36 +++++ packages/ludic.render3d/grass_gpu.ludic | 34 +++-- packages/ludic.render3d/grass_kind.ludic | 136 ++++++++++++++++++ packages/ludic.render3d/r3d.ludic | 2 + packages/ludic.render3d/scatter.ludic | 7 +- packages/ludic.render3d/shaders/grass.mesh | 5 +- packages/ludic.render3d/shaders/grass.vert | 22 +-- .../ludic.render3d/shaders/grass_cull.comp | 22 +-- .../ludic.render3d/shaders/grass_reset.comp | 8 +- packages/ludic.render3d/shaders/model.frag | 12 +- .../shaders/spv/b20fdcb5.frag.spv | Bin 50244 -> 50696 bytes .../shaders/spv/b8cff226.frag.spv | Bin 50244 -> 50696 bytes .../shaders/spv/b8cff226.vert.spv | Bin 38560 -> 39748 bytes .../shaders/spv/cb13f3c6.frag.spv | Bin 50244 -> 50696 bytes .../shaders/spv/cb13f3c6.vert.spv | Bin 38228 -> 39416 bytes .../shaders/spv/d48d6a48.frag.spv | Bin 55044 -> 55528 bytes .../shaders/spv/d48d6a48.vert.spv | Bin 32468 -> 32736 bytes .../shaders/spv/f4a2b586.frag.spv | Bin 55044 -> 55528 bytes .../shaders/spv/grass_cull.comp.spv | Bin 28356 -> 29488 bytes .../shaders/spv/grass_reset.comp.spv | Bin 1112 -> 1280 bytes .../ludic.render3d/shaders/spv/manifest.txt | 42 ++++-- 25 files changed, 335 insertions(+), 75 deletions(-) create mode 100644 changes/render3d-grass-kind.md create mode 100644 packages/ludic.render3d/grass_bind.ludic create mode 100644 packages/ludic.render3d/grass_kind.ludic diff --git a/changes/render3d-grass-kind.md b/changes/render3d-grass-kind.md new file mode 100644 index 00000000..02b65734 --- /dev/null +++ b/changes/render3d-grass-kind.md @@ -0,0 +1,10 @@ +bump: minor +type: feature +**`ludic.render3d`: a grass kind.** The GPU blades' per-kind numbers - the cell, the spacing and its +doubling distance, the reach, the row bands and rows, the blade's profile, heights, tussocks, width and +arch, where it grows (slope, snow line, the photograph's green), its root, tip and gone-to-seed colours, +the far tufts, the root's occlusion, roughness, sheen and wind - are a `GrassKind` record a game hands +over with `grass_kind_set`, not constants in `grass.ludic` and the blade shaders. The defaults are the +old constants, so a game that sets nothing draws what it drew. `grass_quality(s0_min, r_max)` holds a +kind to a settings tier; `grass_profile_w` / `grass_profile_bend` are the one blade profile, for the +meshes and a game's own preview of a kind. diff --git a/packages/ludic.render3d/env.ludic b/packages/ludic.render3d/env.ludic index a6188f2f..e26b5ce8 100644 --- a/packages/ludic.render3d/env.ludic +++ b/packages/ludic.render3d/env.ludic @@ -406,7 +406,10 @@ export state Render3dState { grass_prog: int = 0 grass_mesh: Mesh = null grass_on: bool = true - grass_wind: float = 0.0 + grass_kind: GrassKind = null # the kind the blades are (grass_kind.ludic); its wind, sheen and shape + grass_cell: int = 4 # the kind's hash cell in metres (1, 2 or 4) + grass_q_s0: float = 0.0 # the settings' tier: no closer spacing than this (grass_quality) + grass_q_r: float = 0.0 # ... and no blades past this (0: the kind's own radius) grass_s0: float = 0.0 # float bits: blade spacing at the camera (m) grass_d0: float = 0.0 # the distance at which the spacing has doubled (m) grass_radius: float = 0.0 # no blades past this (m) diff --git a/packages/ludic.render3d/gpu_vk.ludic b/packages/ludic.render3d/gpu_vk.ludic index 4de95209..bcd4de09 100644 --- a/packages/ludic.render3d/gpu_vk.ludic +++ b/packages/ludic.render3d/gpu_vk.ludic @@ -814,8 +814,8 @@ function gvk_startup_state(render3d_st: mut Render3dState) -> void { render3d_st.gvk_pc_pass = new []int; render3d_st.gvk_pc_pipe = new []long render3d_st.gvk_pc_last = words(4096) for i in 0 .. 4096 { render3d_st.gvk_pc_last[i] = -1 } - render3d_st.gg_rb = words(4); render3d_st.gg_cb = words(1); render3d_st.gg_bufs = words(3) - render3d_st.gg_texs = words(7); render3d_st.gg_pr = words(52) + render3d_st.gg_rb = words(8); render3d_st.gg_cb = words(1); render3d_st.gg_bufs = words(3) + render3d_st.gg_texs = words(7); render3d_st.gg_pr = words(72) if render3d_st.gpu_unit_2d == null { render3d_st.gpu_unit_2d = words(32) for i in 0 .. 32 { render3d_st.gpu_unit_2d[i] = -1 } diff --git a/packages/ludic.render3d/grass.ludic b/packages/ludic.render3d/grass.ludic index 6059d5d3..de093b42 100644 --- a/packages/ludic.render3d/grass.ludic +++ b/packages/ludic.render3d/grass.ludic @@ -10,7 +10,7 @@ # draw count down — the cells and their hashes are the same in every tile size. # ============================================================================ -const GRASS_CELL: int = 4 +# The cell (GRASS_CELL until the kinds) is the kind's now: render3d_st.grass_cell (grass_kind.ludic). # A photographed blade, as an atlas of straightened blades side by side (the game sets # this; the renderer does not name a game asset). 0 = the procedural gradient, which is # what this was for a year: a two-tone ramp with a hard edge, and every blade in the @@ -39,6 +39,7 @@ function grass_mesh_live(render3d_st: Render3dState) -> bool { return render3d_s # a blade: `rows` rows of 2 vertices (x across, y along, z bend), attribute 2 = uv function grass_blade_mesh(render3d_st: mut Render3dState, rows: int) -> Mesh { + let gk = grass_kind(render3d_st) let m = gpu_mesh_new(render3d_st) let v = gl_floats(rows * 2 * 5) var k = 0 @@ -53,14 +54,12 @@ function grass_blade_mesh(render3d_st: mut Render3dState, rows: int) -> Mesh { # so the point is a point and not a cut-off stub, but not so low that the last quad is # degenerate. # - # grass.mesh carries A COPY of these two lines for the mesh-shader path; change both or - # the Windows blades stop matching the ones everywhere else. + # The numbers are the kind's (grass_profile_w / _bend). grass.mesh carries A COPY of the + # default profile for the mesh-shader path; change both or the Windows blades stop matching. for r in 0 .. rows { let t = float(r) / float(rows - 1) - let grow = Math.min(t / 0.22, 1.0) - let wide = (0.50 + 0.33 * grow) * (1.0 - t * (t * t)) - let taper = Math.max(wide, 0.05) - let bend = t * t * 0.52 + let taper = grass_profile_w(gk, t) + let bend = grass_profile_bend(gk, t) for sd in 0 .. 2 { var x = -0.5 if sd == 1 { x = 0.5 } @@ -108,12 +107,7 @@ function grass_init__t(render3d_st: mut Render3dState) -> void { } render3d_st.grass_prog = r3d_program(render3d_st, "grass.vert", "model.frag", defs) if render3d_st.grass_merge and gpu_has_mesh(render3d_st) { render3d_st.grass_mesh_prog = r3d_program(render3d_st, "grass.mesh", "model.frag", "#define FOLIAGE\n#define BLADE\n#define MESH\n") } - # five rows, four quads: the arch above needs somewhere to bend, and at four rows a - # blade that leans over is three straight segments and shows every join - render3d_st.grass_mesh = grass_blade_mesh(render3d_st, 5) - render3d_st.grass_mesh3 = grass_blade_mesh(render3d_st, 3) - render3d_st.grass_mesh2 = grass_blade_mesh(render3d_st, 2) - render3d_st.grass_wind = 2.4 + grass_meshes_build(render3d_st) # Matched to the blade's width: a 1 cm blade at 0.11 m spacing covers a third of what a # 2.8 cm blade did, and the meadow goes bare. The game's graphics settings override this # (gfx_grass_spacing), but only once game_init has run - a plain headless render never @@ -122,17 +116,30 @@ function grass_init__t(render3d_st: mut Render3dState) -> void { # because this line, not the settings, was deciding. # The spacing doubles every 18 m and the blades stop at 70 m: at 45 m and 1600 m a 1 cm blade # was under a pixel from 20 m on, costing a full blade's vertices to shimmer (5 ms of 9.7 on GL). - render3d_st.grass_s0 = 0.066 - render3d_st.grass_d0 = 18.0 - render3d_st.grass_radius = 70.0 + # The spacing, its doubling distance and the reach are the kind's (0.066, 18 and 70 by default), + # held to the settings' tier (grass_quality) and then to R3D_GRASS_S0 / _D0 / _R (grass_derive). + grass_derive(render3d_st) if r3d_env_has(render3d_st, "R3D_NOBLADES") { render3d_st.grass_on = false } - if r3d_env_has(render3d_st, "R3D_GRASS_R") { render3d_st.grass_radius = float(Text.to_int(r3d_env(render3d_st, "R3D_GRASS_R"))) } - if r3d_env_has(render3d_st, "R3D_GRASS_S0") { render3d_st.grass_s0 = float(Text.to_int(r3d_env(render3d_st, "R3D_GRASS_S0"))) / 1000.0 } - if r3d_env_has(render3d_st, "R3D_GRASS_D0") { render3d_st.grass_d0 = float(Text.to_int(r3d_env(render3d_st, "R3D_GRASS_D0"))) } if r3d_env_has(render3d_st, "R3D_GRASS_DBG") { render3d_st.grass_dbg = Text.to_int(r3d_env(render3d_st, "R3D_GRASS_DBG")) } gg_init(render3d_st) } +# The three blades, at the kind's rows: five, four quads, near (the arch needs somewhere to bend, and +# at four rows a blade that leans over is three straight segments); three; and one quad far out. +# Made again only when a kind with other rows or another profile is set (grass_kind_set). +@alloc_ok("start-up, and a kind of another shape set at a world build: the blade meshes are made once") +function grass_meshes_build(render3d_st: mut Render3dState) -> void { + if render3d_st.grass_prog == 0 { return } + let k = grass_kind(render3d_st) + mesh_free(render3d_st, render3d_st.grass_mesh) + mesh_free(render3d_st, render3d_st.grass_mesh3) + mesh_free(render3d_st, render3d_st.grass_mesh2) + render3d_st.grass_mesh = grass_blade_mesh(render3d_st, k.rows_near) + render3d_st.grass_mesh3 = grass_blade_mesh(render3d_st, k.rows_mid) + render3d_st.grass_mesh2 = grass_blade_mesh(render3d_st, k.rows_far) + if render3d_st.gg_on { gg_meshes_build(render3d_st) } +} + # indices per 16 m cell that could exist at distance d (the count the shader computes) # Under a fog wall the blades end at three quarters of it. A blade's tip stands against ground # much farther off, and a dark blade 85% fogged read as a dark band against fully fogged ground @@ -146,14 +153,14 @@ function grass_reach(render3d_st: Render3dState) -> float { function grass_count_at(render3d_st: Render3dState, d: float) -> int { let spacing = render3d_st.grass_s0 * (1.0 + d / render3d_st.grass_d0) - let n = float(GRASS_CELL * GRASS_CELL) / (spacing * spacing) + let n = float(render3d_st.grass_cell * render3d_st.grass_cell) / (spacing * spacing) return int(n) + 1 } # one tile size over one distance band function grass_tiles(render3d_st: mut Render3dState, size: int, d_min: float, d_max: float, blade: Mesh) -> void { let p = render3d_st.grass_prog - let cells = size / GRASS_CELL + let cells = size / render3d_st.grass_cell if d_min >= grass_reach(render3d_st) { return } if render3d_st.grass_merge { render3d_st.grass_band_start[render3d_st.grass_band_n] = render3d_st.grass_n; render3d_st.grass_band_cells[render3d_st.grass_band_n] = cells @@ -231,7 +238,8 @@ function grass_bind(render3d_st: mut Render3dState, p: int) -> void { u_mat4(render3d_st, gpu_uniform(render3d_st, p, "u_view"), render3d_st.cam_view) u_mat4(render3d_st, gpu_uniform(render3d_st, p, "u_proj"), render3d_st.cam_proj) u_mat4(render3d_st, gpu_uniform(render3d_st, p, "u_vp"), render3d_st.cam_vp_clean) - u_f(render3d_st, gpu_uniform(render3d_st, p, "u_wind"), render3d_st.grass_wind) + u_f(render3d_st, gpu_uniform(render3d_st, p, "u_wind"), grass_kind(render3d_st).wind) + grass_bind_kind(render3d_st, p) # copied into a local first: a global reaching a uniform call is the codegen fault # CLAUDE.md records against u_wade and u_flutter, and it costs a day every time let btex = render3d_st.grass_blade_tex @@ -274,17 +282,20 @@ function grass_bind(render3d_st: mut Render3dState, p: int) -> void { # caught the sun, and a white blade of grass is the one thing grass is never. Measured: # at 0.15, 0.70% of a near-ground frame was over 210 of 255; at 0.0 it is 0.05%. A blade # does have a faint sheen, so this is small rather than nothing - the foliage layers have - # used 0.05 all along and never showed the fault. - u_f(render3d_st, gpu_uniform(render3d_st, p, "u_spec_scale"), 0.008) + # used 0.05 all along and never showed the fault. The kind's `spec` (0.008). + u_f(render3d_st, gpu_uniform(render3d_st, p, "u_spec_scale"), grass_kind(render3d_st).spec) } # the per-vertex path's tiles, in four bands function grass_bands(render3d_st: mut Render3dState) -> void { # four bands: the tile grows and the blade loses rows with distance (a band past the radius is # skipped); a tile asks for what its NEAREST point needs, so a wide tile far out wastes the rest - grass_tiles(render3d_st, 4, 0.0, 6.0, render3d_st.grass_mesh) - grass_tiles(render3d_st, 4, 6.0, 16.0, render3d_st.grass_mesh3) - grass_tiles(render3d_st, 8, 16.0, 40.0, render3d_st.grass_mesh2) + # the kind's row bands, inside the 40 m where the tiles grow to 16 m + let mid = Math.min(grass_kind(render3d_st).band_mid, 40.0) + let near = Math.min(grass_kind(render3d_st).band_near, mid) + grass_tiles(render3d_st, 4, 0.0, near, render3d_st.grass_mesh) + grass_tiles(render3d_st, 4, near, mid, render3d_st.grass_mesh3) + grass_tiles(render3d_st, 8, mid, 40.0, render3d_st.grass_mesh2) grass_tiles(render3d_st, 16, 40.0, grass_reach(render3d_st), render3d_st.grass_mesh2) } diff --git a/packages/ludic.render3d/grass_bind.ludic b/packages/ludic.render3d/grass_bind.ludic new file mode 100644 index 00000000..7d09ac2b --- /dev/null +++ b/packages/ludic.render3d/grass_bind.ludic @@ -0,0 +1,36 @@ +# ============================================================================ +# grass_bind.ludic — the kind's numbers into the blade programs: the per-vertex path (grass.vert), +# the cull's Params (grass_cull.comp, gg_params) and model.frag's BLADE colouring, which the +# scatter's blade layers share. Four floats a uniform, named u_gk_*. +# ============================================================================ + +# the vertex stage's (grass.vert; grass.mesh reads only the cell) and the fragment stage's +function grass_bind_kind(render3d_st: mut Render3dState, p: int) -> void { + let k = grass_kind(render3d_st) + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_gk_tall"), k.tall_min, k.tall_max, k.cell_lo, k.cell_hi) + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_gk_grow"), k.tall_far, k.width, k.width_far, k.clump_freq) + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_gk_clump"), k.clump_lo, k.clump_hi, k.arch, k.arch_var) + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_gk_ground"), k.slope_lo, k.slope_hi, k.snow_in, k.snow_out) + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_gk_ortho"), k.ortho_floor, k.ortho_gain, k.ortho_green, float(render3d_st.grass_cell)) + grass_bind_look(render3d_st, p) +} + +# model.frag's BLADE path: the blades gone to seed, the far tufts, the root's occlusion, the roughness +function grass_bind_look(render3d_st: mut Render3dState, p: int) -> void { + let k = grass_kind(render3d_st) + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_gk_seed"), k.seed_r, k.seed_g, k.seed_b, k.seed_mix) + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_gk_look"), k.seed_lo, k.seed_hi, k.tuft_mix, k.tuft_shade) + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_gk_mat"), k.ao_root, k.rough, 0.0, 0.0) +} + +# grass_cull.comp's Params from word 52: the same four vec4s as u_gk_tall .. u_gk_ortho, then the +# bands' outer distances into word 36 (they were GG_NEAR and GG_MID) +function grass_params_kind(render3d_st: mut Render3dState, pr: words) -> void { + let k = grass_kind(render3d_st) + pr[36] = float_bits(k.band_near); pr[37] = float_bits(k.band_mid) + pr[52] = float_bits(k.tall_min); pr[53] = float_bits(k.tall_max); pr[54] = float_bits(k.cell_lo); pr[55] = float_bits(k.cell_hi) + pr[56] = float_bits(k.tall_far); pr[57] = float_bits(k.width); pr[58] = float_bits(k.width_far); pr[59] = float_bits(k.clump_freq) + pr[60] = float_bits(k.clump_lo); pr[61] = float_bits(k.clump_hi); pr[62] = float_bits(k.arch); pr[63] = float_bits(k.arch_var) + pr[64] = float_bits(k.slope_lo); pr[65] = float_bits(k.slope_hi); pr[66] = float_bits(k.snow_in); pr[67] = float_bits(k.snow_out) + pr[68] = float_bits(k.ortho_floor); pr[69] = float_bits(k.ortho_gain); pr[70] = float_bits(k.ortho_green); pr[71] = float_bits(float(render3d_st.grass_cell)) +} diff --git a/packages/ludic.render3d/grass_gpu.ludic b/packages/ludic.render3d/grass_gpu.ludic index 732d0275..9e85da0c 100644 --- a/packages/ludic.render3d/grass_gpu.ludic +++ b/packages/ludic.render3d/grass_gpu.ludic @@ -11,8 +11,7 @@ const GG_TILES: int = 4096 const GG_BANDS: int = 3 -const GG_NEAR: float = 6.0 # band 0, five rows -const GG_MID: float = 16.0 # band 1, three rows; band 2 is one quad +# band 0 is the kind's rows_near out to its band_near, band 1 rows_mid to band_mid, band 2 rows_far function gg_cap(b: int) -> int { if b == 0 { return 16384 } @@ -48,9 +47,9 @@ function gg_init__t(render3d_st: mut Render3dState) -> void { gpu_buffer_upload(render3d_st, render3d_st.gg_out, (gg_base(2) + gg_cap(2)) * 64, null, GPU_DYNAMIC) gpu_buffer_gpu_owned(render3d_st, render3d_st.gg_out) render3d_st.gg_mesh = new []Mesh - push(render3d_st.gg_mesh, gg_blade(render3d_st, 5)) - push(render3d_st.gg_mesh, gg_blade(render3d_st, 3)) - push(render3d_st.gg_mesh, gg_blade(render3d_st, 2)) + for b in 0 .. GG_BANDS { push(render3d_st.gg_mesh, null) } + gg_meshes_build(render3d_st) + # each band's index count is grass_reset.comp's to write, every frame, from the blade it draws let rec = words(GG_BANDS * 5) for b in 0 .. GG_BANDS { rec[b * 5] = render3d_st.gg_mesh[b].count; rec[b * 5 + 1] = 0; rec[b * 5 + 2] = 0; rec[b * 5 + 3] = 0; rec[b * 5 + 4] = gg_base(b) @@ -62,6 +61,17 @@ function gg_init__t(render3d_st: mut Render3dState) -> void { print("r3d: grass: blades are culled on the GPU") } +# the three instanced blades at the kind's rows, the old ones let go (grass_meshes_build) +@alloc_ok("start-up, and a kind of another shape set at a world build: the blade meshes are made once") +function gg_meshes_build(render3d_st: mut Render3dState) -> void { + if render3d_st.gg_mesh == null { return } + let k = grass_kind(render3d_st) + for b in 0 .. GG_BANDS { mesh_free(render3d_st, render3d_st.gg_mesh[b]) } + render3d_st.gg_mesh[0] = gg_blade(render3d_st, k.rows_near) + render3d_st.gg_mesh[1] = gg_blade(render3d_st, k.rows_mid) + render3d_st.gg_mesh[2] = gg_blade(render3d_st, k.rows_far) +} + # a blade mesh reading its instance record (four vec4s) from the cull's output function gg_blade(render3d_st: mut Render3dState, rows: int) -> Mesh { let m = grass_blade_mesh(render3d_st, rows) @@ -74,7 +84,7 @@ function gg_blade(render3d_st: mut Render3dState, rows: int) -> Mesh { # one tile size over one distance band: its visible tiles into gg_tv (corner, indices per cell, cells) function gg_tiles(render3d_st: mut Render3dState, size: int, d_min: float, d_max: float) -> void { if d_min >= grass_reach(render3d_st) { return } - let cells = size / GRASS_CELL + let cells = size / render3d_st.grass_cell let sz = float(size) let half = sz * 0.5 let reach = d_max + half * 1.5 @@ -113,9 +123,11 @@ function gg_cull_frame(render3d_st: mut Render3dState) -> void { # made once, with the device (gvk_startup_state) let rb = render3d_st.gg_rb rb[0] = GG_BANDS; rb[1] = 0; rb[2] = 0; rb[3] = 0 + for b in 0 .. 4 { rb[4 + b] = 0 } + for b in 0 .. GG_BANDS { rb[4 + b] = render3d_st.gg_mesh[b].count } let cb = render3d_st.gg_cb cb[0] = render3d_st.gg_cmds - gpu_dispatch(render3d_st, render3d_st.gg_reset, data_of(rb), 16, cb, 1) + gpu_dispatch(render3d_st, render3d_st.gg_reset, data_of(rb), 32, cb, 1) if render3d_st.gg_n == 0 { return } # the tile list alternates buffers by frame, so the frame still on the GPU keeps its own let tb = render3d_st.gg_tiles_buf[render3d_st.r3d_test_frame % 2] @@ -126,7 +138,7 @@ function gg_cull_frame(render3d_st: mut Render3dState) -> void { let texs = render3d_st.gg_texs texs[0] = render3d_st.ter_height_tex; texs[1] = render3d_st.ter_ortho_tex; texs[2] = render3d_st.ter_normal_tex gg_page_texs(render3d_st, texs) - gpu_dispatch_tex(render3d_st, render3d_st.gg_cull, data_of(pr), 208, bufs, texs, (render3d_st.gg_max + 63) / 64, render3d_st.gg_n) + gpu_dispatch_tex(render3d_st, render3d_st.gg_cull, data_of(pr), 288, bufs, texs, (render3d_st.gg_max + 63) / 64, render3d_st.gg_n) } # the page pool's four, after the three whole-map ones (the stand-ins while paging is off) @@ -136,10 +148,10 @@ function gg_page_texs(render3d_st: mut Render3dState, texs: words) -> void { if render3d_st.tp_on { texs[3] = render3d_st.tp_page_tex; texs[4] = render3d_st.tp_h_tex; texs[5] = render3d_st.tp_n_tex; texs[6] = render3d_st.tp_o_tex } } -# grass_cull.comp's Params, std140: 13 vec4s, into the block made once in gg_cull_frame +# grass_cull.comp's Params, std140: 18 vec4s, into the block made once with the device function gg_params(render3d_st: mut Render3dState) -> words { let pr = render3d_st.gg_pr - for i in 0 .. 52 { pr[i] = 0 } + for i in 0 .. 72 { pr[i] = 0 } if render3d_st.cam_planes != null { for i in 0 .. 16 { pr[i] = float_bits(render3d_st.cam_planes[i]) } } pr[16] = float_bits(render3d_st.cam_pos[0]); pr[17] = float_bits(render3d_st.cam_pos[1]); pr[18] = float_bits(render3d_st.cam_pos[2]); pr[19] = float_bits(grass_reach(render3d_st)) var ph = render3d_st.post_h @@ -154,7 +166,7 @@ function gg_params(render3d_st: mut Render3dState) -> words { if render3d_st.ter_ortho_tex != 0 { oon = 1.0 } pr[28] = float_bits(lake); pr[29] = float_bits(sea); pr[30] = float_bits(oon) pr[32] = float_bits(render3d_st.ter_ox); pr[33] = float_bits(render3d_st.ter_oz); pr[34] = float_bits(float(render3d_st.TERRAIN_HALF)) - pr[36] = float_bits(GG_NEAR); pr[37] = float_bits(GG_MID) + grass_params_kind(render3d_st, pr) for b in 0 .. GG_BANDS { pr[40 + b] = gg_base(b); pr[44 + b] = gg_cap(b) } # the page pool (terrain_pages.ludic): on in lev.w, and its dims as the terrain's shaders take them if render3d_st.tp_on { pr[31] = float_bits(1.0) } diff --git a/packages/ludic.render3d/grass_kind.ludic b/packages/ludic.render3d/grass_kind.ludic new file mode 100644 index 00000000..fe83e51d --- /dev/null +++ b/packages/ludic.render3d/grass_kind.ludic @@ -0,0 +1,136 @@ +# ============================================================================ +# grass_kind.ludic — what one kind of GPU blade IS, handed in by the game as data. +# +# Every number here was a constant in grass.ludic, grass_gpu.ludic or the blade shaders (grass.vert, +# grass_cull.comp, model.frag's BLADE path) until the game's meadow became a row of its own. The +# defaults are those constants exactly, so a game that sets nothing draws what it always drew. +# grass_kind_set hands a kind over; the graphics settings only ever thin it (grass_quality). +# ============================================================================ + +property GrassKind { + cell: float = 4.0 # the hash cell (m): 1, 2 or 4, so the 4, 8 and 16 m tiles hold whole cells + s0: float = 0.066 # blade spacing at the camera (m) + d0: float = 18.0 # the distance at which the spacing has doubled (m) + radius: float = 70.0 # no blades past this (m) + band_near: float = 6.0 # full-row blades inside this (m) + band_mid: float = 16.0 # mid-row blades inside this; one quad past it + rows_near: int = 5 + rows_mid: int = 3 + rows_far: int = 2 + # the profile (grass_blade_mesh): narrow at the sheath, widest at `neck`, tapering to a point, arched + neck: float = 0.22 # where the blade is widest, as a share of its length + root_w: float = 0.50 # its width at the sheath, of the blade's width + swell_w: float = 0.33 # what it gains by the neck + tip_w: float = 0.05 # the point, floored so the last quad is not degenerate + bend: float = 0.52 # how far the tip arches, of the blade's height + # height (m), biased short: tall_min..tall_max over h^2, times the cell's own factor + tall_min: float = 0.09 + tall_max: float = 0.60 + cell_lo: float = 0.8 + cell_hi: float = 1.2 + tall_far: float = 0.35 # height gained where the spacing has grown twelvefold + clump_freq: float = 0.85 # the tussocks' noise frequency (per m) + clump_lo: float = 0.45 # a tussock's height factor, low to high + clump_hi: float = 1.40 + width: float = 0.010 # blade width at the camera (m) + width_far: float = 0.45 # how it widens with the spacing + arch: float = 0.6 # the arch: arch + arch_var * a per-blade hash + arch_var: float = 0.8 + # where it grows + slope_lo: float = 0.30 # 1 - normal.y where blades start to thin ... + slope_hi: float = 0.55 # ... and are gone + snow_in: float = 80.0 # blades thin from this far under the snow line ... + snow_out: float = 200.0 # ... and are full this far under it + ortho_floor: float = 0.40 # density on ground the photograph calls bare ... + ortho_gain: float = 0.60 # ... and what vegetated ground adds to it + ortho_green: float = 0.025 # the photograph's g - b at which ground counts as vegetated + # colour (linear albedo): root to tip; the blades gone to seed; the far tufts + base_r: float = 0.045 + base_g: float = 0.06 + base_b: float = 0.025 + tip_r: float = 0.22 + tip_g: float = 0.27 + tip_b: float = 0.13 + seed_r: float = 0.40 + seed_g: float = 0.36 + seed_b: float = 0.13 + seed_lo: float = 0.7 # a blade's seed hash past this starts to go to seed ... + seed_hi: float = 0.8 # ... and past this has + seed_mix: float = 0.75 + tuft_mix: float = 0.45 # a far tuft: this far from root to tip colour ... + tuft_shade: float = 0.72 # ... and this dark + ao_root: float = 0.55 # the blade's own occlusion at the root + rough: float = 0.85 + spec: float = 0.008 # its sheen (u_spec_scale) + wind: float = 2.4 +} + +# the kind in use, made with its defaults the first time it is asked for (render3d's start-up) +@alloc_ok("start-up: the default kind is made once") +function grass_kind(render3d_st: mut Render3dState) -> GrassKind { + if render3d_st.grass_kind == null { render3d_st.grass_kind = new GrassKind } + return render3d_st.grass_kind +} + +# The game's kind (a row of its data). The renderer keeps the record, so hand a new one or call this +# again after changing one; the blade meshes are rebuilt only when the rows or the profile changed. +function grass_kind_set(render3d_st: mut Render3dState, k: GrassKind) -> void { + if k == null { return } + let was = grass_kind(render3d_st) + render3d_st.grass_kind = k + if not grass_shape_same(was, k) { grass_meshes_build(render3d_st) } + grass_derive(render3d_st) + grass_kind_colours(render3d_st) +} + +# The graphics settings' tier: no closer spacing than s0_min and no farther than r_max (0: no limit). +# A tier thins the kind; it never makes a sparse kind denser. +function grass_quality(render3d_st: mut Render3dState, s0_min: float, r_max: float) -> void { + render3d_st.grass_q_s0 = s0_min + render3d_st.grass_q_r = r_max + grass_derive(render3d_st) +} + +# the spacing, the doubling distance and the reach the tiles and the shaders use: the kind's, held +# to the tier, then the developer's switches +function grass_derive(render3d_st: mut Render3dState) -> void { + let k = grass_kind(render3d_st) + render3d_st.grass_s0 = Math.max(k.s0, render3d_st.grass_q_s0) + render3d_st.grass_d0 = k.d0 + render3d_st.grass_radius = k.radius + if render3d_st.grass_q_r > 0.0 { render3d_st.grass_radius = Math.min(k.radius, render3d_st.grass_q_r) } + if r3d_env_has(render3d_st, "R3D_GRASS_R") { render3d_st.grass_radius = float(Text.to_int(r3d_env(render3d_st, "R3D_GRASS_R"))) } + if r3d_env_has(render3d_st, "R3D_GRASS_S0") { render3d_st.grass_s0 = float(Text.to_int(r3d_env(render3d_st, "R3D_GRASS_S0"))) / 1000.0 } + if r3d_env_has(render3d_st, "R3D_GRASS_D0") { render3d_st.grass_d0 = float(Text.to_int(r3d_env(render3d_st, "R3D_GRASS_D0"))) } + render3d_st.grass_cell = grass_cell_of(k) +} + +# the cell in whole metres, held to one the 4 m tile divides +function grass_cell_of(k: GrassKind) -> int { + let c = int(k.cell + 0.5) + if c == 1 or c == 2 { return c } + return 4 +} + +# the root and tip colour the blades (and the scatter's blade layers) start from; the game's season +# may move them afterwards, as it always has +function grass_kind_colours(render3d_st: mut Render3dState) -> void { + let k = grass_kind(render3d_st) + if render3d_st.sc_blade_base != null { v3_set(render3d_st.sc_blade_base, k.base_r, k.base_g, k.base_b) } + if render3d_st.sc_blade_tip != null { v3_set(render3d_st.sc_blade_tip, k.tip_r, k.tip_g, k.tip_b) } +} + +# whether two kinds build the same blade meshes +function grass_shape_same(a: GrassKind, b: GrassKind) -> bool { + if a.rows_near != b.rows_near or a.rows_mid != b.rows_mid or a.rows_far != b.rows_far { return false } + return a.neck == b.neck and a.root_w == b.root_w and a.swell_w == b.swell_w and a.tip_w == b.tip_w and a.bend == b.bend +} + +# The blade's profile at t (0 sheath .. 1 tip): its width, of the blade's width, and its arch, of +# its height. The one source for the meshes and the game's preview; grass.mesh keeps a copy. +function grass_profile_w(k: GrassKind, t: float) -> float { + let grow = Math.min(t / k.neck, 1.0) + let wide = (k.root_w + k.swell_w * grow) * (1.0 - t * (t * t)) + return Math.max(wide, k.tip_w) +} +function grass_profile_bend(k: GrassKind, t: float) -> float { return t * t * k.bend } diff --git a/packages/ludic.render3d/r3d.ludic b/packages/ludic.render3d/r3d.ludic index cf69746e..5e6f1f6b 100644 --- a/packages/ludic.render3d/r3d.ludic +++ b/packages/ludic.render3d/r3d.ludic @@ -53,6 +53,8 @@ import "stream.ludic" import "place_rec.ludic" import "stream_baked.ludic" import "fog_streams.ludic" +import "grass_kind.ludic" +import "grass_bind.ludic" import "grass.ludic" import "grass_gpu.ludic" import "water.ludic" diff --git a/packages/ludic.render3d/scatter.ludic b/packages/ludic.render3d/scatter.ludic index 616ab527..42d4ff93 100644 --- a/packages/ludic.render3d/scatter.ludic +++ b/packages/ludic.render3d/scatter.ludic @@ -226,8 +226,10 @@ function scatter_init(render3d_st: mut Render3dState) -> void { render3d_st.sc_prog_card_shadow = r3d_program(render3d_st, "model.vert", "model.frag", "#define SHADOW_PASS\n#define WIND\n#define CARD\n") render3d_st.sc_prog_card_cheap = r3d_program(render3d_st, "model.vert", "model.frag", "#define CARD\n#define CHEAP\n") # a dry alpine meadow: brown-olive roots, straw with a little green at the tips - render3d_st.sc_blade_base = v3_new(0.045, 0.06, 0.025) - render3d_st.sc_blade_tip = v3_new(0.22, 0.27, 0.13) + # (the default GrassKind's base and tip, grass_kind.ludic) + render3d_st.sc_blade_base = v3_new(0.0, 0.0, 0.0) + render3d_st.sc_blade_tip = v3_new(0.0, 0.0, 0.0) + grass_kind_colours(render3d_st) render3d_st.sc_blade_tint = v3_new(1.0, 1.0, 1.0) render3d_st.sc_prog_shadow = r3d_program(render3d_st, "model.vert", "shadow.frag", "#define SHADOW_PASS\n") render3d_st.sc_prog_shadow_wind = r3d_program(render3d_st, "model.vert", "shadow.frag", "#define SHADOW_PASS\n#define WIND\n") @@ -951,6 +953,7 @@ function layer_draw_model(render3d_st: mut Render3dState, l: Layer, model: Model } u_f(render3d_st, gpu_uniform(render3d_st, p, "u_rough_scale"), l.rough) if l.blade { u_v3(render3d_st, gpu_uniform(render3d_st, p, "u_blade_base"), render3d_st.sc_blade_base); u_v3(render3d_st, gpu_uniform(render3d_st, p, "u_blade_tip"), render3d_st.sc_blade_tip) } + if l.blade { grass_bind_look(render3d_st, p) } u_f(render3d_st, gpu_uniform(render3d_st, p, "u_cull"), r3d_reach(render3d_st, l.cull)) sky_bind_lighting(render3d_st, p) shadow_bind(render3d_st, p) diff --git a/packages/ludic.render3d/shaders/grass.mesh b/packages/ludic.render3d/shaders/grass.mesh index 38c1ea7a..a684c814 100644 --- a/packages/ludic.render3d/shaders/grass.mesh +++ b/packages/ludic.render3d/shaders/grass.mesh @@ -116,6 +116,7 @@ uniform float u_d0; uniform float u_radius; uniform float u_px; // one pixel in radians (grass.vert) uniform int u_dbg; +uniform vec4 u_gk_ortho; // the grass kind's (grass_bind_kind): w its cell (m); the rest is grass.vert's out vec3 v_wpos[]; out vec3 v_nrm[]; out vec2 v_uv[]; @@ -124,7 +125,9 @@ out vec2 v_rot[]; out float v_hull[]; out float v_quake[]; // grass does not quake; written so model.frag can read it -const float CELL = 4.0; // grass.ludic GRASS_CELL: 4 m, so a near tile asks for what its blades need +// The kind's cell, as the CPU's tiles count it. Nothing else of the kind reaches this path yet: its +// shape, sizes and density test are an older copy of grass.vert's, kept as they draw today. +#define CELL u_gk_ortho.w float hash1(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123); } uint pcg(uint v) { uint s = v * 747796405u + 2891336453u; uint w = ((s >> ((s >> 28u) + 4u)) ^ s) * 277803737u; return (w >> 22u) ^ w; } float bladeHash(ivec2 cell, int j, int k) { diff --git a/packages/ludic.render3d/shaders/grass.vert b/packages/ludic.render3d/shaders/grass.vert index e3afa1c5..a8ec80b4 100644 --- a/packages/ludic.render3d/shaders/grass.vert +++ b/packages/ludic.render3d/shaders/grass.vert @@ -119,6 +119,12 @@ uniform float u_d0; // distance at which the spacing has doubled (m) uniform float u_radius; // no blades past this uniform float u_px; // one pixel's height in radians: no blade is drawn narrower than a pixel uniform int u_dbg; // R3D_GRASS_DBG: 1 lift blades 0.3 m, 2 light as ground everywhere, 3 both +// the grass kind (grass_kind.ludic, grass_bind_kind); grass_cull.comp's Params carry the same four +uniform vec4 u_gk_tall; // tall_min, tall_max, cell_lo, cell_hi +uniform vec4 u_gk_grow; // tall_far, width, width_far, clump_freq +uniform vec4 u_gk_clump; // clump_lo, clump_hi, arch, arch_var +uniform vec4 u_gk_ground; // slope_lo, slope_hi, snow_in, snow_out +uniform vec4 u_gk_ortho; // ortho_floor, ortho_gain, ortho_green, cell (m) out vec3 v_wpos; out vec3 v_nrm; out vec2 v_uv; @@ -128,7 +134,7 @@ out float v_hull; out float v_quake; // only aspens quake; written so model.frag can read it out vec3 v_tint; // the blade's colour field at its root (model.frag's regionTint and patchiness, once a blade) -const float CELL = 4.0; // grass.ludic GRASS_CELL: 4 m, so a near tile asks for what its blades need +#define CELL u_gk_ortho.w // the kind's cell (4 m by default, so a near tile asks for what its blades need) // hash1 and fbm come from noise.glsl, which a GBLADE vertex stage is given (programs.ludic) // An integer hash (PCG) for the per-blade values. The sine hash advanced linearly with // the blade index, so a cell's blades fell into diagonal rows, and the rows read as @@ -207,7 +213,7 @@ void main() { // line for both left a lake above the sea with grass on its bed or a valley with none. float wl = u_sea_level; if (u_lake.z > 0.0) { vec2 q = (xz - u_lake.xy) / u_lake.zw; if (dot(q, q) < 1.0) wl = max(wl, u_lake_level); } - float ok = (1.0 - smoothstep(0.30, 0.55, 1.0 - gn.y)) * smoothstep(0.0, 0.6, ht.r - wl - 0.15) * smoothstep(u_snow_line - 80.0, u_snow_line - 200.0, ht.r); + float ok = (1.0 - smoothstep(u_gk_ground.x, u_gk_ground.y, 1.0 - gn.y)) * smoothstep(0.0, 0.6, ht.r - wl - 0.15) * smoothstep(u_snow_line - u_gk_ground.z, u_snow_line - u_gk_ground.w, ht.r); if (u_ortho_on > 0.5) { vec3 oc = textureLod(u_ortho, huv, tpOrthoLod(1.5)).rgb; // Is this ground vegetated, by the photograph? The test used to be green DOMINANCE - @@ -218,7 +224,7 @@ void main() { // and -0.002 six hundred metres away, flipping between full density and a quarter over // open meadow; g - b reads +0.076 and +0.014 and separates plant from rock and snow // just as well, because rock and snow are neutral and vegetation is not. - ok *= 0.40 + 0.60 * smoothstep(0.0, 0.025, oc.g - oc.b); + ok *= u_gk_ortho.x + u_gk_ortho.y * smoothstep(0.0, u_gk_ortho.z, oc.g - oc.b); } if (h4 > ok) { cull(); return; } // the root on the drawn surface: the CDLOD mesh follows the B-spline to within @@ -242,22 +248,22 @@ void main() { // are what carry the silhouette against the light. An even 0.18-0.42 spread read as a lawn // that had been cut, which is the one thing an alpine meadow is not. float hh = h3 * h3; - float tall = mix(0.09, 0.60, hh) * mix(0.8, 1.2, hash1(cid * 0.1)) * (1.0 + 0.35 * smoothstep(1.0, 12.0, grow)) * life; + float tall = mix(u_gk_tall.x, u_gk_tall.y, hh) * mix(u_gk_tall.z, u_gk_tall.w, hash1(cid * 0.1)) * (1.0 + u_gk_grow.x * smoothstep(1.0, 12.0, grow)) * life; // CLUMPS: grass grows in tussocks, taller and shorter patches a metre or so across, and that // relief is the texture a meadow has from above - an even height reads as felt - float clump = gnoise(xz * 0.85 + 3.7) * 0.5 + 0.5; - tall *= mix(0.45, 1.40, clump * clump * (3.0 - 2.0 * clump)); + float clump = gnoise(xz * u_gk_grow.w + 3.7) * 0.5 + 0.5; + tall *= mix(u_gk_clump.x, u_gk_clump.y, clump * clump * (3.0 - 2.0 * clump)); // 2.8 cm was FIVE TIMES a blade of meadow grass, which is 3-6 mm. At 2 m from the // camera that is a broad dark scimitar lying along the ground rather than a blade // standing in a sward, and no amount of profile or colour work fixes a blade that is // the wrong size. Measured, not guessed: it is the one number behind every "too wide // and too flat" note in this stage. - float bw = 0.010 * mix(1.0, 0.45 * grow, smoothstep(1.0, 4.0, grow)); + float bw = u_gk_grow.y * mix(1.0, u_gk_grow.z * grow, smoothstep(1.0, 4.0, grow)); if (far) { bw = max(bw, spacing * 0.35); tall = min(tall, spacing * 0.3); } // a blade under a pixel is a vertex bill that shimmers: widen it to one and a bit, and let the // thinning (spacing) keep the coverage bw = max(bw, dist * u_px * 1.1); - vec3 p = vec3(a_pos.x * bw, a_pos.y * tall, a_pos.z * tall * (0.6 + 0.8 * h4)); + vec3 p = vec3(a_pos.x * bw, a_pos.y * tall, a_pos.z * tall * (u_gk_clump.z + u_gk_clump.w * h4)); vec3 n = vec3(0.0, 0.3, 1.0); // The shared field (wind.glsl), so the gust that crosses this meadow is the same gust that // reaches the trees behind it a moment later. The two sines that used to live here were a diff --git a/packages/ludic.render3d/shaders/grass_cull.comp b/packages/ludic.render3d/shaders/grass_cull.comp index 76d8445f..e533d3c2 100644 --- a/packages/ludic.render3d/shaders/grass_cull.comp +++ b/packages/ludic.render3d/shaders/grass_cull.comp @@ -21,6 +21,12 @@ layout(set = 0, binding = 0) uniform Params { uvec4 base; // each band's first record in Out uvec4 cap; // ... and how many it holds vec4 tp; // the page pool (u_tp_dims): tiles a side, height texels a tile, photograph texels a tile, height texels a side + // the grass kind (grass_kind.ludic, grass_params_kind): grass.vert's u_gk_* by the same names + vec4 gk_tall; // tall_min, tall_max, cell_lo, cell_hi + vec4 gk_grow; // tall_far, width, width_far, clump_freq + vec4 gk_clump; // clump_lo, clump_hi, arch, arch_var + vec4 gk_ground; // slope_lo, slope_hi, snow_in, snow_out + vec4 gk_ortho; // ortho_floor, ortho_gain, ortho_green, cell (m) } pr; layout(set = 0, binding = 1) readonly buffer Tiles { vec4 tiles[]; }; // corner x/z, indices per cell, cells per side @@ -36,7 +42,7 @@ layout(set = 0, binding = 8) uniform sampler2DArray u_tp_h; // (T + layout(set = 0, binding = 9) uniform sampler2DArray u_tp_nrm; layout(set = 0, binding = 10) uniform sampler2DArray u_tp_ortho; // (S + 2)^2 a layer -const float CELL = 4.0; // grass.ludic GRASS_CELL +#define CELL pr.gk_ortho.w // the kind's cell (m) uint pcg(uint v) { uint s = v * 747796405u + 2891336453u; uint w = ((s >> ((s >> 28u) + 4u)) ^ s) * 277803737u; return (w >> 22u) ^ w; } float bladeHash(ivec2 cell, int j, int k) { @@ -132,10 +138,10 @@ void main() { float h3 = bladeHash(ci, j, 2), h4 = bladeHash(ci, j, 3); float wl = pr.lev.y; if (pr.lake.z > 0.0) { vec2 q = (xz - pr.lake.xy) / pr.lake.zw; if (dot(q, q) < 1.0) wl = max(wl, pr.lev.x); } - float ok = (1.0 - smoothstep(0.30, 0.55, 1.0 - gn.y)) * smoothstep(0.0, 0.6, ht.r - wl - 0.15) * smoothstep(pr.dens.w - 80.0, pr.dens.w - 200.0, ht.r); + float ok = (1.0 - smoothstep(pr.gk_ground.x, pr.gk_ground.y, 1.0 - gn.y)) * smoothstep(0.0, 0.6, ht.r - wl - 0.15) * smoothstep(pr.dens.w - pr.gk_ground.z, pr.dens.w - pr.gk_ground.w, ht.r); if (pr.lev.z > 0.5) { vec3 oc = groundO(huv); - ok *= 0.40 + 0.60 * smoothstep(0.0, 0.025, oc.g - oc.b); + ok *= pr.gk_ortho.x + pr.gk_ortho.y * smoothstep(0.0, pr.gk_ortho.z, oc.g - oc.b); } if (h4 > ok) return; float h = heightSmooth(huv); @@ -143,10 +149,10 @@ void main() { float ang = bladeHash(ci, j, 6) * 6.2831853; float grow = spacing / pr.dens.x; float hh = h3 * h3; - float tall = mix(0.09, 0.60, hh) * mix(0.8, 1.2, hash1(cid * 0.1)) * (1.0 + 0.35 * smoothstep(1.0, 12.0, grow)) * life; - float clump = gnoise(xz * 0.85 + 3.7) * 0.5 + 0.5; - tall *= mix(0.45, 1.40, clump * clump * (3.0 - 2.0 * clump)); - float bw = 0.010 * mix(1.0, 0.45 * grow, smoothstep(1.0, 4.0, grow)); + float tall = mix(pr.gk_tall.x, pr.gk_tall.y, hh) * mix(pr.gk_tall.z, pr.gk_tall.w, hash1(cid * 0.1)) * (1.0 + pr.gk_grow.x * smoothstep(1.0, 12.0, grow)) * life; + float clump = gnoise(xz * pr.gk_grow.w + 3.7) * 0.5 + 0.5; + tall *= mix(pr.gk_clump.x, pr.gk_clump.y, clump * clump * (3.0 - 2.0 * clump)); + float bw = pr.gk_grow.y * mix(1.0, pr.gk_grow.z * grow, smoothstep(1.0, 4.0, grow)); bw = max(bw, dist * pr.dens.z * 1.1); uint b = dist < pr.bands.x ? 0u : (dist < pr.bands.y ? 1u : 2u); uint slot = atomicAdd(cmds[b * 5u + 1u], 1u); @@ -154,6 +160,6 @@ void main() { uint o = (pr.base[b] + slot) * 4u; outv[o] = vec4(xz.x, h - 0.02, xz.y, seed); outv[o + 1u] = vec4(sin(ang), cos(ang), tall, bw); - outv[o + 2u] = vec4(bladeField(xz, h), 0.6 + 0.8 * h4); + outv[o + 2u] = vec4(bladeField(xz, h), pr.gk_clump.z + pr.gk_clump.w * h4); outv[o + 3u] = vec4(gn, dist); } diff --git a/packages/ludic.render3d/shaders/grass_reset.comp b/packages/ludic.render3d/shaders/grass_reset.comp index f810b0bc..d059eb23 100644 --- a/packages/ludic.render3d/shaders/grass_reset.comp +++ b/packages/ludic.render3d/shaders/grass_reset.comp @@ -1,8 +1,10 @@ // grass_reset.comp - zero each band's instance count before grass_cull.comp counts into it. On the -// GPU, in order, because the frame before may still be drawing from the same records. +// GPU, in order, because the frame before may still be drawing from the same records. Each band's +// index count is written here too, from the blade the CPU draws it with, so a grass kind of other +// rows (grass_kind_set) reaches the draw in the frame's own order. layout(local_size_x = 1) in; -layout(set = 0, binding = 0) uniform Params { uvec4 n; } pr; +layout(set = 0, binding = 0) uniform Params { uvec4 n; uvec4 idx; } pr; layout(set = 0, binding = 1) buffer Cmds { uint cmds[]; }; void main() { - for (uint b = 0u; b < pr.n.x; b++) { cmds[b * 5u + 1u] = 0u; } + for (uint b = 0u; b < pr.n.x; b++) { cmds[b * 5u] = pr.idx[b]; cmds[b * 5u + 1u] = 0u; } } diff --git a/packages/ludic.render3d/shaders/model.frag b/packages/ludic.render3d/shaders/model.frag index 2518d569..6a14ba6f 100644 --- a/packages/ludic.render3d/shaders/model.frag +++ b/packages/ludic.render3d/shaders/model.frag @@ -31,6 +31,10 @@ uniform vec3 u_blade_tip; uniform sampler2D u_blade_tex; // straightened photographic blades, side by side uniform float u_blade_cols; // how many are in it uniform float u_blade_tex_on; +// the grass kind (grass_kind.ludic, grass_bind_look): the scatter's blade layers bind it too +uniform vec4 u_gk_seed; // gone to seed: colour, and how far a seeded blade goes to it +uniform vec4 u_gk_look; // seed_lo, seed_hi (the share gone to seed), tuft_mix, tuft_shade +uniform vec4 u_gk_mat; // ao_root, roughness #endif #ifdef CARD uniform float u_cull; // the layer's cull distance (m); 0 = none @@ -105,8 +109,8 @@ void main() { vec3 field = v_tint; #endif alb = mix(u_blade_base, u_blade_tip, smoothstep(0.0, 0.55, t)) * field; - float dry = smoothstep(0.7, 0.8, fract(v_seed * 3.17)); - alb = mix(alb, vec3(0.40, 0.36, 0.13) * (0.45 + 0.55 * t), dry * 0.75); + float dry = smoothstep(u_gk_look.x, u_gk_look.y, fract(v_seed * 3.17)); + alb = mix(alb, u_gk_seed.rgb * (0.45 + 0.55 * t), dry * u_gk_seed.w); // A REAL BLADE, if the game gave us one. Each blade picks a column of the atlas from // its own seed and runs v from sheath to tip, so a meadow is eight different plants // rather than one plant ten thousand times. The photograph carries the midrib, the @@ -135,7 +139,7 @@ void main() { alb *= mix(vec3(1.0), min(g, vec3(1.15)), 0.85); } // a far tuft is a patch of the meadow, darker than a lit blade tip and never straw - if (v_hull < 0.0) alb = mix(u_blade_base, u_blade_tip, 0.45) * field * 0.72; + if (v_hull < 0.0) alb = mix(u_blade_base, u_blade_tip, u_gk_look.z) * field * u_gk_look.w; // a rounded cross-section reads softer than a flat card vec3 side = normalize(cross(N, vec3(0.0, 1.0, 0.0)) + vec3(1e-4)); n = (v_hull < 0.0) ? N : normalize(N + side * (v_uv.x * 2.0 - 1.0) * 0.6); @@ -149,7 +153,7 @@ void main() { // an occlusion term; grass albedo is capped near 0.5 and this was dividing it by five. // A blade is a thin thing standing in open air: shaded at the root by its neighbours, // not buried. - arm = vec3(mix(0.55, 1.0, t), 0.85, 0.0); + arm = vec3(mix(u_gk_mat.x, 1.0, t), u_gk_mat.y, 0.0); #elif defined(CARD) // thin grass is lit from either side: face the card toward the sun before shading if (dot(N, u_sun_dir) < 0.0) N = -N; diff --git a/packages/ludic.render3d/shaders/spv/b20fdcb5.frag.spv b/packages/ludic.render3d/shaders/spv/b20fdcb5.frag.spv index 8f5ad99d53e8436f11c36e45bbb26f51bdeed3f9..e95e173bef85e43491ece69f24ba8aae5f3be983 100644 GIT binary patch delta 9342 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 delta 8850 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 delta 8850 zcmZ9R2Yi;*6~ZT-;bO7JkL4z+;jIAvhe(}`xcgUDQmk! zWsIwkFs@fUZQ-gSAqBsm0WaQh?~O&N2`x%HizsyYwqm};6^J*T#Ia*|XeWyu@x z6Y6JV_yh2y#<}3~bI=wfPSFHd@d=S-Vi z3(ai(;WKkQ8eB8`MD+4B%WH1+tj3z@wVC4tjI(mbqro#WT%ODX }KTtCl%<;gtw zNj0-;PR#A|Tk(@y@w62`E#pJJ4RCrZhXwH2^^H^O4rm_1*>Gm2G_FVYuIIM$J+HKX zk3OY_9-E~XwX&32@k_tM%aY6CbMqlw4W3kU!gOdh#KrJ=vujQYej~i0Zkp4W*_XqM zQ?RNsNee<*vKoiEM0a7=fa~g-@tfd7>krEG^%*`U3-}>;PF-zn^Foy;9oZ|z4t8qA zcW%W8wokv?zztVl&8*eW&N|rrI}Iw5QSipl^Y>j>-7U z+M3zTqaK^JnLKUElx99I<1^V$@N#xWRnx4k)AFW4y@$8Sws&s~Wt0Q4xox*=#kYt1 z(e5eHAGeG<0J$ISCT#nz1zv1#^7@xI+b1PvuRxUrFna@36nHU!qtQ+tnZLYfugdLh zb9+_O_`Y|PwHaFaVu$;imiIfZLu%>|@nhJqVdDmpi2PxGtXO`?xKZ#^!Jhgy=wW{Z ze$XoiR|Q{{`7a+E{0aEF2}@h}lklazE5;5Y`sT!W3T_+x(nMo4d>TAu%G#EOFTj(e zDod;b=oR>2>hOOHzTlm=vP876gYQOd;_InhKR@AL!8}bqbYN8^Qdv1QN$$lVN;r1F zaoDiZxNz(USBnyU+n}wRFrvk;FMLTJ&pO&~Um7yF$Fz~T)nRHiifLD&@0@cp-VeTE zz-v`8|8BG5{2vdWGG%egdQG$a#6>Oh+gMsTxJP;uD(7pT$o1xopRsTBdK&|DKhD}eHa_^qjGvZGzFB_-AJg&atUaSjlOAlofq4fGb9?ws)O{KD zZeUN@WfX@g_w=Ym2P5Dc225-j=1BO&MQxevifqI04cA9KR@@WkXH;@vd2$|wKW3ab3vR{XpIH_8R2w}$pi3L=|ZqWU%Ddqr7Ln@y5I&JSm3tbz3GbKohs5X z>?Sr&vVtGpu?yJP@<;ih<~`dPMeQ+uxNke=_Rj1>^_96k1nfQT-L3Cfj?#nF+U>`C z_i^xDIj2gKXZYDfiH@HI*Yeh=pPnc49M}s>+l6QbdLHa0t}OqW4dclhC? zYP*-f>dl4M-%)6I8PU;sd7Gsj=pf}NqOYt^b&6g&Y;vH}-h4x5nJ=ny2g(BX&VD*@l z_rSJSPb1*_5CgJH5*-}1H;#G)`Vg#UXTHfFQEsO+(I$L8&h^+EpTLbfkfLn~wJ%-1 zv}v*d(ZD*!C_V+Z9>r&9>I>n+p0(BpM%{?XXZX%fbC5Ea5T@umtfm!8=ItM z**&UgkaakG1NPCD+rS^*wZ{^`r=ks9AN9lXz0($~Zt>%Y{l4QYdM|4?p8KpEtd?zL z_FvKtLD6ppHt^zBiw5n%YMtrP0G+^g(4V5sF9xx@JA=pZRW3?w?k;&7H+Lo282V=C z-=Ld7+~sZ(`KE9+8^#Gx+sL@w$!=O}lcY*E!?p;pl=klau5dNi+uh#{?8n`&ZF34* zngx=$_D|xl1=zJ;mIpVP?r7@avt{mccfqFzntIH{R$%XpC@~XTqdR-fME6SO--bHJ zboT_`LBp7dUT_oe8+wIf`T|JgyM{scoc7m(L66^x@;}U4wnUW6ThuKOZ+ks%SwG+P; z$Q_vh^tDa+?h4j7_-=3$bE&)|27_DQ5xb+QGs9`Nd4@m~AK=Wy*&Pa3_x#4R4};r* zw$O%y)lX!4Vg~nso0ztk!9Bq-gW8)1$NXz3j?PiWX!Zg-13LSCNglQlV72IUZ?M`( zN_0939Gz;9IO@h}=lYLVB20RFCQrcp9z6Z8r zZIQ^q;QX#hv)%oD1Vx=4jYhR>iU|Az@FA3VS`P)Q#m+t)?8lw0?J&v-6gR6l;v4}s zP7LBm&%fe5Y&_4Vqc{rgh`nBq1pDQ|q$Ys1#VC#eo9HF^=#Pb~9i00g4OR>P;*v2}4ojw}+X2VYCT7|}^^ zwaT*Q*KQ8jj|0*+oAPst0}@AK4JqUl0>vdV7v4Z=q?p(|YBlkE>b{gn;uP>=+G;x) zEFYOPZ{kzIjU-@u+iBNt7PU49W|FBHnOS7?3ve-^U&7TQArn?J*lEufY8& z+RmkxH``eM^C4~yjpu>o(fNg7JJNOmwOqW2+RMl5wiETm@X?gwH{oBy)%CxKS{`vP z0XvwnGcc9_3Ss;WIHvJZuzVz^+?{+G_)Ka?=txZ1#7xLejAa`;J)2s8lk`ovqO|g$ zZt0aMS5TVApCrEpJ8!~eh2pO`|U%!(J!Y~k2u$W)zW-Dt_7<_@7IBO zkXB zk~Yu9pAoWenT2Hjf~FqH{1t3N^>{IsfYtq_&NEBQ+oN&oob6<{{uVn@OcodpL+N_1olve&%j+RM4kex z-^8|d`Mma?hL5H+fnye)fvZQmXTi2r$7j#1)8`X?<7W?Fd?CN?Em_jU>UtTjk9u5PuYlv~(r)zC)anuERj^w0_8PeL0cI6BjA zXKSd{qqDcb{R{kUus(6?yaU!pJ#LeA;5PK1-GMrI2O9iMu*L}fF1Q%{J-8!_;O~R= zQIFssfa9vt98aLt7-CZUHG?3EkmpIy>U4guuJaknHvPY7NEC(N09r)-W|6q_p@v>Uuc7ze>o7?s$v~0`X;dYlOYac6f}lu8q)8P;6cj|7 zfPhj(ib${j@4N4=$;tcqe|k7;t-a4a`;>d`eQ#b~+l)*1YcytP%+l!Jc(8Aydd=0C z5v9?vUXyy3M&F8Wv*R8+t~!3guvOPudvzUWZ?suewmBMeSGb-3j_&LpBYA4ZM&nt^ z^OV0)UZ%W4`8(xR%4?Lp3DMoB(Kwa9AE31HKjg*}B+#eP&i|&x>(l7hm<@hJ_n2YZ zOdLO9;H2SeZa9364UzC|BhN}s zuSPU>Was#kI_9n6Gqk} zZO+A@Uf+I=b(_9B_lz6eIcneir}JB<*ROBG#hfs9mvIwD_Uza*Y+&yiZGb+iXIPcn zV12sAHDlG0oSRM2o4K_&wg!(KI%43&dfv8zGZnP&-`JUY$f(X?UE8vF11EK_xgoRb z1XuR<#tzg&yGD&_^0vl~fI}-=TVp5c<{Y&*b_EZeIBJyh?B3jqx{AAXch{(4(`MS- z_Q00CxhMFjs!iXJcuDx-IHm(h-ich5;+c~atbj>fDj<+=)gLhZ9w#FZ*n|r&h@g#U+rMEX; zqAp|nvxR@y!atvmw>A23Eq9_hu6|&KQQ`hz4+`~Jz~gE>H@KNodt-6%w7&Z{)`K%s zTXqfaoH%O2USqn4v!ga2)iabu=}RQ-z9x1|>h3yXnx;IlW9+yd7BYUGGx&MAqV=uX zdZJD27}`0yV{DIk#@BObV#kE;(HsWx?bFo8cl3I|py>Il9oui!3=p3}f=y7j% z^f2(m?%(tus~F#zq7CaF-OQt3mEX*jKC1Juu8vV%le(%snl`gkw((t^wJGsu?QJtH zm)V-WV|tG07}Y(dt2dX~E8Wv_T7Gj>+SrNXM^4k`th5Q;Y&+UEbMx$Ujz)ELc=?!i z?|8gBF#lcSD$}$$^YpeE-jonGtQ%soZ1_EPUq9!*n2wOx6#>b!=4>e-L}$hQl&Q+)v+B9Z=UV# zjT5Ge(bhO0-pr}3F%|57vdxWPmafX<&voVG1Sb&uV$d;EmXF+;uHn>NooZQRCsZRY2* zn=j|dXShinM^p!*+~>JT9nFc9`)oI*+!+{b*>=Y1cw3`CJUK2@*(MAf$&K1EEH<4l_oWuT5}bZG6`KBoTI@Sa$J-iv z!Y6QH`P|?$Fl(^gnC9ASH)dFK%^myx*m5uIsM>hq+OAJyIDFcPs@B#Rg*LRZw>8Fs zo6jxnjY;aoGtFu8Zl9;vqZMwpzX&{>M(R_+BUx3)e<`?}yUSbnl`Z`07XFhKe(iL; zt#Lg(&qp_dhgD}td*eyH_sr?w9-gHfhMr;V|#@icsR=eWx6S#Zv>SElo8Z+rxAo&?R9 zU%)%-wfnNg_v;q^?R31YF+-neXK6clC=bTYX+Lm%tFH2y6+W`QFU|?BZ|{}w67Xr` zXm6|vuW#p-eVys-ZH?{VLpZdZj}h9cd1|lTvv$_ch}tG&%b9b$es%vBg2(f|GyC@< zZN>BWB`y527JkKaysdE!eB=n<^YL5`?(B`-)_7gtVa+*tLtH(vHTg%Ct=mhX8q2rv zAytlTjdgfnoyfo($GTvazrq`W$Jcvd6R^+N`b+{h?_=%N`}WS_?7swCIlfD$<9)05 z_?&gk8(V$SZNpgB5e zwVj&n22;|`zRPy<)^=*Pn@mYwZMF7Lp|OoCzb6XK*tUJD&>X+o3x#H%YA+XB|5|&k z(0sq3-$#Y!dj&N=phdU+I{}j?t0l?UfMfryZb}CytMnwYkT*ecKI}WTlEZzRIQKCufB}s%WEo{ zYwjA#NwM;=j%HKawH2CJ&Fjd%eIE65GGB6^N9D$m`#dT)mfYu2xpCw^kIECz&m-kt zliGbAm3uwPU#q#-qTJ^-^I56petxOHFYSJoDW_S*{ajQ36)E$est+I=^AXPvvacm6 z3(($v4mKv+46-e1^c)j1`~Z;A7^!dE@YI`0(M&4G#AWDZIDe9{9fN|8k?)y=h-Mb-!M_ zpUYi3^~GL(H2ldYp4cS*$HHfRe(B!+j;rjm_WGaH^uIs;Cs+K&Ui(?_OQ$Z>%g==m z8Z=LDzURXmjmf?Ct6-N-o!Z;~FW`d)eYbhy->Ch?%eKfI-2~T1JwCUB&-h@)ZNl${ zHy%29i|~7(Pwu#GZ;X54`l!d}VKA@WJfCjTUhaL>SMqoftY(S!I@s~48P~n{4#ih| z-Un;fFWRRyS4+F^!86p{{nb~}Xl%M5ac2U%r)H$M*JrM|dd4#=c!3xH)H~0!!Jl60 zvflkTJ6s?2w3(yn)4LzNr>p5_uEw8>Vq0yt8$b^8fPKwNMvD~sDqu}sZ)*V@hv%ka zSR1Y;&zRTInX)LV&ve?=7H=$BJ;&K5CFg#y&Cy5yO$Y^%*St;IQB zAKm%(d2+*=dtX+|JZuQ}Jko!o+GhOB@4;w|#^eX%KLqX>vJn3r1J<{4(XD=kFTy$B z1JTd;V{3z&`N+NR`!e3S;4)rq>Wy!_^APnj-ubnIn(^cp)LP>ET;MC~bsOCCIOBV! zvOhF9{P~Jc9-MeSH~31t&YCCQSh!N`J}3B!{X+PiN1V5E_{H!(JM4X9_~me)r^2s< zm;37)_=_K(HD~PC!M&f!2T7;pYEZ%~xg)9oOq{b4tnFzk&YM`|oWaAAtRxx?Sua z!tY+ZPw)Bo5q!{~LB0IHaCYOC@&BaaNB7=SzO4N3=)G@!1?Rrk%fEs5%zeU!Y5!f- ze$LIDmwpV$IWzy*XL68@t9$#O89sdYb)47Dan1tQN8NjR+RX(YH0b=^c5}mr4?nrL z-8^u8)E#5mEdu}dZtL~l=a+&%`NWRB?Ut_n)qMs?yJafBGkX1&g{v9A%xmS!Z^z#G zSQY-8Pk+|SSBLYL`^^$}J@^tQ9o9RJ_2GjCjqmMe1Gqk}v$nL`5WM@{i}(6%1b2?i zNn8B305jg+_*=qPIBayTA5@tArl{ zp9jVEL%=S-*JbQSq4|DG`_Z-CII*9EwpeYywYF!!=ywlVd3HSl_q}e~{|@f^-0-*H zzDJRJJ$?pnGzM>K|KEYl&pjFc896xh)4m*7TbchVXtvS5YK^@&C;nDwjmAU0^SK** z(4adiZvLa;zOPAtW8r?55Pk~W_a@)@WSR zd;PuvKl_nStLJ3ny$xTG+IaeZ4}WQn#|J0=Tuk0Vg?%wN&&}2KWBaAyz86aS<(%xs z;NJZ`sPZ4x8*c-+p9dsed6Iu$;!9+&OUgmc~Zo&)E>S2*zO-f>+8_j7~9dlv5d!^Ha-&N)||v&P$;|15CV z)9b~4G<@dgui41FPXRjy*U53oeZQ*~|I^{ahrhK+t~1~NYF~%l>wa@AzTCcFpwN9| zeN=6~!gn9)%~(P2C3nHSclvxfmU?6SkQ#UMA8qlwr||QcCVuy#YnwtZRE_)ik8RaY zsK{$HLWo{~Mpf!DXN0;cDKe z(kFk0sXmw2mUW&4R`x z*Pxt4Ihmr*ckD@RHK9~4fn3CKU0h`-m)XD8muzGU)6yov27Ot*;;y(wr4{he>JgTLy=fRHCYutSPMp1i_qQCR3wtj7Y8SMU7PmEW< z=9@hJ4puWp_WrA2+iFX@*T7}p|A4E#PO)#-R4skK0k&`T#CQ{2_Wc%I%^2zXZLn>% zZN@mff4oa^F5aOS%f0$9ihAya?}1(4RVn6g9DUOFzrkhxAHdb#rQG!nlY09f5EoZmUf?j%f3H@t9?qbZ}+=e`u+lJ-|C6+CAjSSE4Z35()ZV3 z+iJ_)eFJWtyKm9dGk4#CGk4~19DNc)qcOgxn2+;6gAFK&F(X*X`FAaHx4Yv?b*3lsht{?qfNf>4>oJ-3@>RiV{*A=;+SJPRb}f?s zYGCIpe08v6Jhh&`HNg6)dp*d@>tO}@^ff;v*TX=td9Fz9HLxA^A+&RRUYGt2V`GYc z=kRYE>3fq}zZ)O-(xwzO=kjO7Q5#HA|D3UHPVLKmroI_P&A!Ds1GWI0Q+Wn&iKd>u zwgRhp%{W(yWBnuf(xVUOR#9+g$axkL0y8Si5=cO6|+M)OVq%nU^?u?FMe0uieqqAE?)653t(# z#B;t9$2xiK3AS%@)!#mn*Ir=l=Cu#CFY{90o1$i3;^eh2xOKkvLsL&)`-9bzSK?SF zuLHpLZLa#;hj|=Cojmk8kfLTDV)y^SHCK1vx~DtA=H=%!?(Lxz_x2FVJLuWp!)jZe zx4PiARnPO`a4`R`o)5K;p^t6hBf#3y$4K!1>Z2Q7o9zbB?ohDW@vNKtFtD2EgU{Q> z9tBpn%*u$=MuYi(bsw{DeLPPNq1NV@dZ@=y4zIcG#)I`4hJ6h61d2W##9fPeVy)>n zBmVPH??xV;y_0G?u=hRP5oqeJr}Hn*`QzMs&-S$vWnJ>?PrY)DXQEz(;`*&do%K4J z82V%`kAeTMxjYtKTh{9bVB4x^y?zMh|JD0A?OE&N!1kTCli~WR=Y7r;u;a2!VGbP6 z@o4J$C)NpIW9j2Ood{QZ7@Sxq!PPCE-Nrf@Y&>nwojh}AoHZ!E%CmcQxbw9pb)H{- zL_6c_N5oEpQ|a3MZ4FJ^N=_{uI)(Gddr;$ z=fixwUazHGQ*-nFDcE^P{Of8T_15^;qiOf$ev+5_X|1Mdy8Sc=%^cRI&i=W9cIAG$ zxrN`?!XIwokGAl~TKID<{OuP0VGIAfg@4_`zi;9G`=B!aMO(Q4MyRx})xtNax%ah= zi2VzS`)xx?_RWp8elI?YfN!Fx^`*G)Z>9F-zSnjO`M3wHp7`=IzWo?q z-+RI4ps)Ky9^0?M?yKsAqf+f}J}{K0kN}tgklvao?#W?jvBeob|r} z^Z)9s*Jc~{rh3}^7F@RZ9i0DH_a$w%asR5P&F{g+Nv@BBb6-fVe?U{$H|_oiF55i; zZ*BJ^n!3K3pFe?(r!BGm3@&3m1#gY@G@81;iS-w-@w6rXzk;8sOYTL_!u8eW9C*#D zrT-Ve_MiLZi(ob5#OH5debVyo*91+K1tV*MRl_V+4W&Cj~x^IGkb z{$7XcryiewwD|lJuAh4D>2H9|L0j^C6WlsSZ=va{%{lTMQ%hg(fXzAl-I^!Af5G)p zkI#E8KL3X6r=DEi2e;<(0h+$r%*8WQEpa~ryM~GJA8_k_`4~-I-?aNL*l}fTJ^|~e z9-mLa_7|Ve!1}41%ZJoz@&5vBF5zE-?IZL56<8m2+k4)t#s3?yF~h$F+ke`B2i8a3 z_Fq%0#h;_Gx~4N1Gr(KtVn#Imw544e*gV7A;pUcWrVm^n_2kkQY%Fc*uOGNC?JV)@ zuSU_9_%nfTDB{ly*H7JXeUD8o{yv{mlbz9oM{Q`f5x3`M~A4=7;O2?zp^Pt8K=;$>-Arz>f8u`dar{ctJGv z_$*ZWl+S+)qp2sqMZmUGw;!Ja)beb*7}#fQ^~7Bq>>8JSFM+1+b!;w6f^Dmwb_2kU zqinYnTs=NZgB@3y^D=1a$$43@?bOZLXBD;Nygb;P)f0Ch*!3&>UI9%#Ij;z|t@@OD z94mnxi?+mC8SMDW99Kb8PpnnJwpCBN)xfQ5wmO=6eAWOvM`i3a;p!RxAh7M!9ly_J zY8n69V8^eXxa)vh*KA!h_2j%B*tY6vw?4Ra%{D+&kI#m+Pnq*ZXzIy%W3cVi&DrNi zwdA}h*qqf9cQCkh%{D_*PtKczZL2<|Ub8L0jzwEyZ3#A3nd4Sy>WQ^A*tY74wGG&{ z)aLsIdEPJhjJGbu*TR&%cV7qWv*vo#dH=aR?aJrr9a{LF1^4>iyXH9`c7z+(xwEZ2 zbGH-N_n+$8?MuzJUW+?})$;yx7qD91f9?kM<#V{UT`6jgL2R7!n7ci|yVu;Y>;+Cv z<}c4P`##_eXfvc`&i6&vW}c2wp7)>ofqnmJEN#huf3W%IJ>mgieSJkcu-52~J=c8y zc@Ubu+KiF+hX;cli+28B&BHFNj$`UT&~EW%Jl9>_`EXv$tH-f{J8N#+p!%AryTw=fQP2Kz?KZ5e&QWuJxi>bTn9D}g?(dCgJd$?K_lA_rTQ{0|K8HON ztmgg5_g|yHzFc>0hf&mwEl!-#VEc3)#MY4i^z>_F>?{*|uE$`iq0;|nK4(^cwfYDo$Aaxo z-SPN=!_pnf9Uc3w}~a3b@+kl*GIWtbQdWepiEyr7f|33^w-f>R3Mk>!+Ta zuLY}LLoq+csFoN%1*@f>>%nT*QR4G6us-SM=V1NRoqu`e-)mxLim&Y{&i{7QJJfh7 z>KzNb6WDdxg*xkUBk{_0`EAYJC$_%{ZoKT{0pOd_)blsRTfu6#P>!wF^ER-0=H?Et z+U=CY{w3Jh*@MQu6HPs_e+5=6W8Vc=PwacZYIjpIZ})=jQ=4;Z?EApZM{@i%TrF`P z0IS_kNt_44#?qEJ4}qP_#CaI5mN>rwt35(VoJYaN(&pZ9p4B{0HYe8az+Ox0+Fcj5 z?2E_1YGWCT>;8MNTF&u5fYlzSxKHHSCqS<0=Btg$J+K?K>+lzh&rqJCc%Iw0{Ar5# zS?cF%{5cE*W%U}r0)D^7e+PS3>GNvg^BVYdO8K2+&+WY^zILbN+}@+c z-kbNNnET$;dG`AUak78=qrY45rQrW6xG_Fx;a?Qo_A@X+iD&y63+}(4@%MIOH{L=8 zx4pl)6T9vG&7E-l{mq?l{r%0IlKY!Ga@XDZpXBEpsTYIFXb7d5eS@(v~6-Fy$c9BuT`mOb@vu(o_|;J$kwuC8V*=U>fywf_gKmhaAd z492y3|M4OCBZ@xp{}k-H#{V;T{QnF7grZM!`W$Rb{p{cMRLgvQ4KC;FTe#Xcl+4%n z;P2{^`65(9Uv0*9AE=4l1Lb_R!JRLCv?aH8u(oo(`oPuIGRD5}jPXnQ`--BUeYqdC zXMSb{JI3@e8(htHxlhjyS5L7YuctZC?8oPRuQ&fKm%jGnKGtqO`pyYfOTY7i%_aTL z2UoM-X!FC>&!T;DSpcq{l3W%Li z-V-tR6#4!I_ny;HaP7le_^1{>w&1p()WT0I_;%ROFSz%-iwbW0sRh^n(t?}Mi-sZhL>j zEq2=vFSzaf9krOeWvH_E!^LJEB*cLx03t& zZ{g=MlMAlDzx@`w+~0o-H@?6B7Ovgje=E7a z|5kE;|E=Wy{#&^5{0+Ep7_Wo8}xc!~j!u`Ft*p27!#mT+z44~eJ7<*Gr;VhT$2UhdnYI{HNd{&G90bu>Z z4+QJu`$^j$1XiY)@rH#~$|n|^D-ht;-xM%x8f zv-rZLitjx`TjGxZH{9PcT7?gOjm?~A_%+fMy+Vm?6a%fB;e zyPu-w=VapiM!|z%KLhkLH*NZ)-`{}k_Yvyk_9$3A{I}pT*T>+t`CZ}jd$4-`-t#!v zcIvL1WBvp9d}?iZPxMEy{b_Ta9;Q~yK6w&sUnfzQ=g^~id;G9qIg5}0|kNPc2 z&cA?9Vo^?fiY7#>XzKE z`+@C4Tm1UViC^BYXF}6gn`8TioYc(8=kA%oYVUxP(=2G}`MdnAU^V|fk$+n>8(iIW zo`c$#>#ROIMa^{{A|t$odfrk*`CH(1T}@O#UNW1W9nG!NLm-6#6nNAj8%tlhlk zr}kxD>hn?5%uAfS766-9{)XncuppXx=3pVPnsZ=YiDR9-76#k5x$18p$!ig?cJo?{ z+Lw8$FG^7}FLCl(9Ne1M5@_m~uO-21nXkmLPF@4R_HC~E+lP59O`SaSS&E`&9^zb| z%Ye)4Q=jbn6~N}`-tsdQc|PM?5$rXmzAIOf@0C^ptCz*LemM`sxO!uaRK6F%G3}{;jI{-t92Bec4_= z?fP|5Yjb^lUoZyjc`};XKHRrGV0HaRQOoljd^lMDvDD?~Fyr9bvd_nZ)x0mbeiOmI z+^gCqP}E#Mv3>hYaRfNe6hpX{j)bQ_eLPo=LQ~IstE0hc7GJnj&oIV22F;lIIA&uW z3vP}112px-{2^G);(Ilk^*&=9hh|)ToTEw9Y8k_1uv++(n&-P$$HVne&pCGjSl#o} z`8o;g%lXoFB1O&l5*ypKIvMO5Wj#*?JGN5_pC5tM^PR5Kz|PUYy1n+SwKlKK^kps2 zT3Kf=oC&tCGpNgR^(?ry_?=z&m1od7=-SNPXRdR>UU#L>d2sbSlb#QDj@0uUdjZ(- zcu%!&qy(J6g96Sv2pxP@EzbutfAa<0^ zE3cPdqic)b{e@q-XC6S;mi2oOY%XQ2hv4e*dARl|<2-_U<$JFsKcmbHEi?4C%w--Ffk&3;kyyviC|r~TvLu7dvoY`pB9 zKZ5m9cket&?aRHR?FovSdq2nu980f3RioEV$M%ftLeW8lk^-| z&Hi7cPXFpJP+q3kzc}miH*o8<_Y#`AeLPPscV3KXd*j%rd;Ra=?Dbc`^6d3j!T#H7 z^~6#uV;M8!eGP1X`aVl7&)8lEXKeoj`*Lp8|3OhRH*w;<2{uml#am#tHz?^t&3w|{ z+POK}YY6Q1^ft9I2hiucVD-oFk^c*<=I2enKyw}5gRA>_xNGq~*q8Zg`!_|+e8tK4 z18|w|hj6v4Xq$Z1%s1_=vzGq>Pi?vOKSoo}zW*;+?IRA6wEF~ZyYl+|6iq$tJ_D+kQcS@ylT(;>8x6SN^2HU2cT0L$0gZ+%w z`SiJXCb;|N5w!TsjHaH?AZG#FPTiRP?OiSYvw;sL_wd3@E(edJtT0PMW1N-?JX`Xugx;PhXf`3s?Ii{HY9 zU-{gy2)Z`=_ncW2d>Zqazr8FDSMztL9lzg2P|Mk~BzQsEsVCaWXL+z|n7#&r?aTX?&yW88wLa-<1+X#n%k{J(SYK`NTM2Al z+S1p`U_Vcd&nj^J)SU~zr=ga)TMgWNU)21apVi?RQ#t2rplizoUw7|c(<^tBDxwM>j{!D_b4I;&;e+k>;N<+yi1*A~AW3%~N(+zDM<`rjGs zo=*R}fb~(2&#qv7GN#?Yjw$=z?|$nO`|h>fF}v4|X`A%12iSb|bBx2`+_~M)8~G0HNQig_qqGS9mhb5?e$4M+7jykuxk{4 zAh?Wu5M1pl;w1LLaAPk^vAsT7Pi@}cGY;#-?f{qLI0WwVVeUIa;I4mX(Pk)EJ!2gP zww-#kF0lGC#7d6C;TgaE>XY$nv(H1R52JKb%Ik4dttao%aPv-oW5D{TCr%I8IOV<_ z3s+B^!@KfbJ5fj>wK`G5D!6sNE=5z<{}O6>=IL^<@wHt>Ef-%w?R(bs>%WU%37;2kf5y;PpY(e**nY2~ zPV66p)ic(gfQ_SW9~V-qWxlQjyBEsq=%;Y?T-(=y>83i{w3(x^t^sRH-`9hUAO172 zKFQ_hV13l%a|5{a`2}1*^|ZSYtnPW6yl;Y=cX^K73|F7Rx_Euu0#>tq+T99HJI5f` zFZtXCF2`^?yv*+oxIXG>^UD^WJK_4NXAHjrtNYnq+T8_rAH?Twu-Zq}eWm&Ditm9t z_r9Od9^ZSx#?+p%-3NAT<@xh#xO(Q~ez2PD)9wLq+Bqk3{gUT{;C4#<9|C6%-S(|mHYT{xO!s$0c`)r zaZS5F{s>k}j3>aY<9ZTJJ^B0zY&-SD{WG|ok~mL+TgUY@ntI~=1#CO@jO!V&@wMgb z{wvt=Iu`A&kFnKrPk9dPIq)oXx%SV)wdM1m7r<&>zkbf}H?S|ChqS#&QS*67?D#zU zUIsVc4>Z4n_6j`x>EqwD{*I=eziGS*RBp z+kSJ3Hru>Tt)4k}6P%pNId}_QTm0VsfBfD-*Ov8p7p%52XMWcCUvT@)v*~+a^YYo% zer%(U`Mp7{J#GIDR?Awv4_3=sd`CyusH zDPL2JBhDOu4t9`cliozJ8h2f6KXY|Kke5(>?^j{Nu;#tlm5Q} z+g{&~sO7nSz5~0*%WL_2xO(nMUck=1&)eE^Px=*TuxzU}bDTM|AQUatQDH1*`a6xep^iL*3#h9b@~aO0Hoy)2q~ z;w%TYo%)nU^BHJ)u<^Aer-5K&m2an+O+ERn3bvhk z;;sfR=Vx_z>$uiHQ%{^V!M0P+xCViZuPyh=wZM+ov1s@H;k{{XuxG_q6n$J*`&1YE z?`-@%0CUuTJ-Ax<`r!Sm&xQL{_6^|1+p_l6ZXEx8j<&Sh2&|U-*v4Snc^}he8~+WD zdggUguzi(lGZ;->fB%h-JoC93*ciDVYyno=oZ|gpD{5cfSF~+OQS+=8C(hR3Dwlc= zwt<^_=5|}KJ}KT4oU857^wpj@P|F-_5B7RWKRf70@iRl)?+DgMJ#BUZ+jscRU}Jdp z+h!Md=3ig!iN7n@aU}k3VExtIJGS2)Y`@yl#~$Fa&pliCUT|~B_bT>=>!Y5&_5mA5 zTk_c#?09qL><9L9EcLY8A8cD~$?*WNd1`ZB?OQGR9td_1r=NrLqa^0RV13lnrUP7# z@esH%GOwNR%&WfI6MqP}oY$dn{neB6FtGhVVDr?L^I;6wac@P@?tGh*y61eZ7we3x2b}qLPmP6p z-6p@o;eOVZXT@=F`|w%uVajsE*C*H4c(6VxwlnU8x}BeY+Nb^Ko7^YXc5~M^xvOv1 zXnwwO1i1C{l_SyAlkZVr|CX42dJJ6cXiDN73vT^v zGF)GEbDl)47XK+=HEsTOi#)dD!Op!lf6GO#&Ch#J0O#}Glfk|``_xaOoJ;ZS6FaU$ ziSr}ysg&{_eHvUnK4;WE<+*$&ntJY2XMugcpzb)S8fWvL(<$2WY<&*c_}U!9iPUQD zHFGvU^K?wUUpfzLe({x;zP5?)`C#Me>u=l0wNW)L;6Hvor_JBGk;ir+*!z9>MR4!a z$@yZqKI*pj_i@z3`AwYUFcm$Ym0bdsC+=ln_nGZ31Y7Wew)V1GNuHrn)gjegYA z{t9sU9fvF7YF<I1heT`xj{H@wu_~F^~A%gr?%06m-_xuht+v~60@#H()zl7VrKIZIiI^79=irSnV Lw_Lyc=Fl}ab2QHF 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 delta 8850 zcmZ9R2Yi;*6~ZT-;bO7JkL4z+;jIAvhe(}`xcgUDQmk! zWsIwkFs@fUZQ-gSAqBsm0WaQh?~O&N2`x%HizsyYwqm};6^J*T#Ia*|XeWyu@x z6Y6JV_yh2y#<}3~bI=wfPSFHd@d=S-Vi z3(ai(;WKkQ8eB8`MD+4B%WH1+tj3z@wVC4tjI(mbqro#WT%ODX }KTtCl%<;gtw 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 literal 38228 zcmZ{t2b^71^|mj}q|i&~AP{QkCG?tv79jNA945&m8AviAjjAMcrB@}OfCaJ8M5I_~ zDi*4MfD}OxQ2`O@QvT0#?s;!^?(h4q?Cke_*V=2ZUCut|-kG^}%)k18Mq|FlLXClq z)B887*Ak8SQ5p^FO{o`Z^so4CqYfCg;k4;vH{5LVjdfhK(P35D7Hce7;ZFXY)ZIH- z^2q#+#uJpMD9=#-OnHv-Jmm$-iUH z5%}@FlgI8hW7_l~GskVZ?YK?0MZ&j(JR6M@PHN(X!P6^!U}Gt2+Z=Fw_lapkv#O=- z7BAW@(Q4OOjcCe*?rA+$oX*A|>S@z^$BnCazs7RZm?vyf1#R}bEZUUXzEW-9w6L#O z*jE9MpWN3wt*7Z=E-M%IwZP*>PpXW)3{(3WEqg~}O>p0s>FE6$>wu?EIbdR6b5<(f zA!svZnpgkEhL!!GgR5Z0oUPyT>1b>KK9-{YCi?eG9of@6enK6xis`~PV-9R=R{9(; zsjqMPgnFdSxft5=9njda>AQE|)JfeF4?TPyzb#sR{TnXk^eOvHoj##&RNvSktu@*P zePZ9(Dz{ul@_o-$_qkQw#7?E+^iXg{#AH}&X=-D7)3vUo#g z_HMc@v+D#`_Rhwh)MI)kPHggy#wfrsm93+(7j<)vIve|f$IO^G(Rp@n9zI;FV)_6&9GpEkR%HX+u z4{U4!XQp=U8P`2y;`D9h_ z@fU8jnVZWZP2b6V$9GNao!ryPWzkCaw49sYVwE;!#b7N}Jj}ws%Gyx4G8KRQi+? zs9Nopt+cVDo7YH3W2<^kxX-=__Tuo&>;seUl&&e=;~7S^56?!k1FxlXz;pLrXXBFi zGY{G?YqMW55AWBwuIWFmYeIF3R`G8@o7yw2!gqn2xpXw{0q5GgADnCQ*Wlxs33Go^ z%)u=Fn|NpwzbWQMt^OX^*%W^yuKhm+_tp9WZ2Z1T?`*69F2}e=8{f2zZ#NI`XpDqs zzILC-)~~TIyqe$1Q$2pjsk5>FJU*R`1LxuW8(qyd?32mWts?EFS9*2rRAZY3Z=R=} zjoI_W=xAIFZ|2m|_!^jFplb62FiThE@xVN7`ZpeebFS>$Gxgw}sndJv{nXUWL0jLn z-s!#7H9Da3XG)uT@8szR^q%Avs;&iN@t?MxCiYI*xp&(1?#W}k#+vOsW3+MWXxUsZ zpO<_&Pd+!z>^iCT~qs-`>V5h z=9<|xfi9bNpTA~y9XEr6r1JM!Y$n(4WEz;uOYr8|+}Zd$xZESJxA8aN-P5M@S*+bC&y(g+w?ILxH&q873cBoY^>DA*MZZ|l+3{>h`{tWOq8mXTRp1?}l_c`EluD{yG&uilswDF7D_$Bl3j>hHi zJcrBykFCy)&c=0OHfrYbM)8auii{<9p1*dH%EQX3e;J&136q?9;~gn}_q<2S2{L<~kZj zfsd>A%rtNx&n%AdQt_B({42n7$Jo)h5k9VaYUOt;IOo@0^Z0c(9)dTo{$|W4;obGx zJ=Ny>bQ^zm9^TP-0iN^oCGZ#?K%LW9z~iU(d7M`HybhmG-wWRWPw&n%b7$jS_}p=m7gHtIxLJ=Dn-4dVkzqocBj!E64Z6d3gWo zy)@@r^JZ3`Zo3iF=VOlK#z@AMXJt}>&wY0GId$wDaCqwv)HFQ?uPLO4`|X z*-qZxPR(|+D9Nj%*6uAdc2(u~P@x&ywvQDWQ&VZr6qzH+8u*-d1?3A zTDx+SQM zFJt*~Z%1?P-4k+BtbDAa+0=F&g(g;WKijv@etr(*OYXCu+&FTd{p7}y`|Kw-j@)NI zdE)tbo7`(dyU%`duM4@)esZq~xu40I&w4fY4A$;TyPws`X;yJRx6^-J${ydcUJ4HUETgxr%vqEYR$PwjP$d0?I(9!+t=K2+wTt4YUy_bcvXro$GH== zG1c|oxyI_o8(Had=V^Di{!P7qV-K)-s+(tW-5;EO&22qm>30O>{UJy07=9%D$P4G+ zaec;Y+@oqA_4sr*eeQ|RXt@=`Z#AKnWeH*T$A;lBBUxBBgaAG-BVwu{}H z<(w-IYuWwWY0j0;wm2W@HXeTHp&jCX3Vgw*S8w%qYGq%z<$q?={}=H;tKvUu*)M?4 zxpMgyzZgDr=%7}KgGSiV9nJto`u27KKn>( zo)>{XzS>o-{kSMxAN90Ztm)I*kKS9=^fOoEFF~=bHrov*he2RpOOervg}wn;lh@m3 z0LS6E=@>SLtI1d96!CdUEhX2x}9a&1sEAG!B$ zU&gx-T*j+St@y^f2vI-dU0ge;8Bgy0-dEyZS99}skKPRTT+R3%uk7~@3xBHOvxX&} z_kUlB=l$MS;!TDt#qRyySL~OuT=P74R@c!ejWVTcP>~w z{5x>(OY*_gH^LjU=K9|PKkD6ao$>!E{F-5F&lmnP_#K~r)Uw|TzxBi|zp351e-KW< zjaGvH0j%crxiZLSk?ccl7T4inYUfnD^C0&#D7E$3skV6(o-^b=bgzHgK34nbBmZN~ z-Q&iR`yA7Z)xWwQJqb@N>-hP6Q~Ld>_RBeC{HJRluOHjVeGamn_GfGCxV6iDF47)< zpNqn^`&?9VpNqoH-{&Iv`plu@`U~8gQZn~{MgRECe{CZljQzE`UF>hd?_9ZG>zsQF zK6L2N7XJ^N-MDl7->LXXt$V`b<`X2}%H|~1Q-R3wKunk4sdvn??1|K@~(pJ00;p4`g)oQl{TpxAEn0Cv< z-`H=f*8O@__`?s4YPB0&`>T5|PrKDBzw=sttHafdU*@%LF5&&f3y$Yw-SeuH5q52JRf0leYK`2Q%JQ{1NbV zj$Ew8cZLrg`rj7c72as9F~apa0L&#-?IZWC+~;vMXM?P8yV=KCnyUtQa?KlJ-9n(qVSe-nIA!G8?*y`y%ox4Ynt#;j_7ZT|?|_ZqRk zSlNeFPO&8@ueU56$-&@t+0veR}#k9nSUAdfq#`;v=i;b1;_k;hBHOH3!b~>UQ?` zquQ2d4(&Hr?XPHE-}k~Vy#KxGdDwUlzB0=oF}`YdEWaR?KPEo9*J&h8P{I$A;mcNhjUJ}#&HOIog*)-_+Z+Nh5LCy z;?05kzA*9bfO9TZ=d$?>;GbphczmnacZ4ta^tY>Z8U=O?uA}3U`#x7K*P-uo z*EXA8s2Zp8k8Rb@thHHSb)Ul%Z#KN_cL%an)Av(GvlYehK&w4ZRb2~P;^*_F*OAy~ zN3S8r>6|+!YKKuWXY#H#KDOqLL%+i*#=NZV^NY216t%e-Pc8mOgG>K0aJA7C{q0XJ z^V9=2M&@KZSZy37J`=!>B|gW1)p{wX*LfWawym~>nH}e6BE|LhY|x%~lfh-5Q{Za8 z&yCM<;IhwYa5e8^>60IGRG)im%R0{ltNWffdH9)d^3a}foB*Cg(Vq4vg3Vi7ayc37 zyrtcjz-qp)j?b6DWxliEYNt|??`*JbXHk;dY2f6hJ$;-G_I{OUZb($M^o)b{}=} zcmV7=T3lP(|B9loHs?y7x#|yIh2pDR$CcsE)vDB9|6bn@Qj8b=`!@b?8-K2iztYD4 z-NrwtdFJf5aP!EV{SNFrn2R>&*__nV<`3Yq%|r0aoi^K;w|d$<0#*xuwC3(X$NLyX zANBbB5p0{R#S>t)axI>OKVFxt#Zz!~{S*IBVEfQ!e$Jy>`g$7dIK9Tr=g$<3+HVF|zmn0=BKTw0j9$_Wf75+RGICc1_jN_p4z0R!@w- zfy=&MgR2=Meg7S7TW!M`hxdH7_Eng3gG zwKpl|?;cc3{%?cLUp+DY11|G_2d-v}qQS96Ou9m((1lzZI zVtfQH`~DcNW{mXxKd^1JW$r!!x6j?DXzH1}&%l{G^EZw@iJ{RLpHs}o`Jc}Ql*E`H ztmOQ=7FA3H&lzpyIkOgaU#nAcCa+QB)u`8`c;>84oo5bzXLdlr{k_?e`@6H@ezxxK z&xRXw$%1=s_|C0sW0bqE zT(ec>)atpf4h9=TTVk#Tb{;%uY_~dCP2bFsTKv}lCkOr4ggbX>zZO_cKig|lOZ&CK zwogt&z-n0&ZEE`a^Ne*Uu7}()uM2j}7n84iz1m0J{?k&q8dkO|4vS*CP3E1a`i{HwHV#bL#oq1gwv`*Mq#g9@e2xU&~N(Jq!Vx=epEh z1G`iEySk3g>(ZZbY-=2fKl@1E+tvD=__&w0r>HrXHxNf{2a5U!jBOaTFZY@HjubWf z7Uv8Y4mPLq3?8AKlD>8Vt9i{hSBYc&9+}(s&J_E0T>9Hb^4bNg-Mn_A_GMn`yHeE5 zOPst$g3YTun|4Q2PhNX~)sk1@SSPPN!S-#g`rAkH8U@yFUVBsfGB5SLC~D>l?C;UFEzetH;I>uI^Wj)9|5eY2+9%V;NO%ueTlyFW{(to`9$lO52Gec= zSnV{{P2LMu^L+4m+t|l|)h!D%BDG_|{8!z_>{}nt6R%@!j%gD06iQ#sZFd}4pRw2{ zQctDm(?#6PsHfGMe)Hq+y=Xu3@a&yl+kvh3bTiP@T~FsRGQ-!2DOekJFyD{u0=})Aq}7 zebw_m=Txxcvdm@<9M3E?b^Q}-HrQDDI8Ud+)$Ri)*6DC{i)Xj7&Hx)vn{y}6+!<#R zim&qQ-WcwDZAzWzm$PYSyu4>Rr;T4$aOeDrnrFVh0ynPv$F}m^*S`w(9-^+@zSJ`I zbHQr4zRv@zc^-PrUI6yx*`e)xikf2(8|NbGODUJs+_78^PEO`8&wltCIQyYIo4<~( z%{(2W+|NghcO}@pXe@2Xe-7CEv&XLj>+37p)wQO)FY&gg{su%}ZN@m1UN)otCdIL6 z_xf=j66c!Qj#RC;+<9<5%*X5XTa@c+ZrD$;kazFj3jo;PA?`h-rxA9-M@h98(-`e<_ZT!79{!ttMw2k{WH)Z}S zv~mCLrnGO`#<#1v_qA<^{e6o2ZEH&Q%@1n*ZhTe*|B#~ApW?p1iQ1R@UfYe7+bGVp zID7dPaQ5=e;KaWbtS#rqkHKmd_qS`J=Dpp%jBEVtqo07?M>*$j2dnuP2HppL3RW9L z=_5zy;|{QT;>*kU_G5f~?*yBJzU~)!YyytSeh$`0J>&ZY*txUh^MhZ4 z_0?uS?mM-_y%(&Ov;ICX|5azbHru#2)zjtyaM|WpaQ>_AOWJJX{#8$#-++yiTptAI zzK~phi>9t`+Wih(w);K2z1<(s)b-8$JOnnLw#0fET*i6?-X7~wGoKtLv?c#P zf*-F-?nO_)_0{Gac+IM%|3884KljV0!D_~d&of|s()Y7q{nXRn%{lz*&p+CH{t4GlJ-Pe~+@8xDX!>e17tc_&#C;3w8YafS!R`Cy zZ8UX#)9ycD$Cb5t2dtlZeEtizzxcch)=%AB-lSHG|NCHb3I70WADRCT!TPA%-t%59 z{vU&l8U8=8{ippWV13kW{}HuX{67PGO=m7X2e;1!$7e%7ZD}_jnt6uL4>z}5GaYb! z)RRjm*jU=qUq5hv+F9b)A5C9vi9Y~*LlJ);~y$#{OXCj8MuATHb+xW&Rc+OtDbgSg4@?@D>U`^Y+d`5 zId6leo}9M@+fLn_eSTC+&f9~{Sv_%g0JpE%j%e!1c^KHX>a*)L8xD3X+7fF7*jQzb zJE5s3*3SA<)DvqLuxqK!_Y3m8U+@`kONy@*D0%O`1=wfJt*G<e}r~&9+{Pqrhr;|G5`fE$=_~0sHbfT-)9hHOC+} z&PB}Ke&Bs;?pO{0Cnxil=b8N=@K&@rx^2!6M%QMZj!~ZXpND{b|7k33$^THW`R6_2 zVPJiIMLWFK=#D+teE)d_n!ehMk@ts3f*p%?{;TF;A6CaP9fhFX;>&ohySnq?yqMP{ z#|G}Ixox|_&PVzg4cAAV|K{mu41#uxuk@py{pH$iTUni>=KgYTY(p`Z?Wo<~+t7HN z?Wnh=WZuT3spoUp31BtvN520$2JFjq*Vao>GqyN!js@GN^B~r)U+j}=d)B@Wp0%G` z_)P(8i{EjDUwJN1Mc0<=avIpS>Y4i);OUgScbf@T%X_!u!D@pTt9xWH`JVt+_vQOJ z=l4Xoy7zVYNnra^_dS!^$zZ}%KhM_gGoAV=V8^cA&m7gh1lD&*ZTA{;-qf?Mel{|U z;%f&=&W#9doE}@9qjp}uH9H_ITOzStCe$q zCR{!7&#HaG&#rlX=6McWAN9=3SHM1FY0JEP6`Xm|?!07v&#i5%py`+V&I6lYd1jvv zSI;$m0oa_4q0PBg%Uq8j=B^Z9J5!wNov3%AIM=&TJJ)I#(=Kx@|60u*yKydo+wKhJ zSAH2>?NW+AyHdLXtbRGgIX9+SVtgH}7Jg;T@2}fm1y`FxNz8A6)vu<+@0(y_X-lkY zz{dVf9qU@Ke(K5jTVVC;DCXxF)e_^|V72t~U9j4BDDk--tWWy+9#}th=U<-r_nO$7 z;%g6z^S?Xwo;6;LdQ^e;0=q8zP-k6!K)iBY9;mtd#P&ag8!!8KF!)Dk>iL=CO<=Vf zDW}xyc{5l&b8{_KDShNhm_KLM+iv2TZ~C-xm+wVzTlZ+C+2Q=4;Z z?7P6uM{>Lyu9i4I2dn*zk~qHr8%tZ_{1WV3CeA%@wZyp(tadLYaqb5jOPhPcc~tnu?;&nop73ZECjf1#AW zlkB;D5XIO2l$_fK)VO+X1DpH7)Oq%Mi8$H61JVCp@YUe27u*Or#G<~%>|IUk=*g1KPlHc9@2Y4;o=%X!r>Yre3`P{&L_b<4* znz5XJHS^W}Z?IZ^cjj#{uGRaGH^FaF^ojp}!3ScG|GV(`{|EdIMW5vK9@v=r*}vod5%+KlTyP!s!KIbZX^oiBZ~CAay(+RFLrfUB!z zjGg+`bMgT(KBVYpU+zcknV$v0jxl{K1Xr_N?$Zmy)l=-p>uC`*`|-Ko>&?IQ(${|6 z$J*^j-$lV{>32!6xuoAga5ejlwiI0b0@^2+rQzx+$z>U|}9WIwamd9V6}{GO|V)@#&JKxm_FV+?tDXJp`;~yNq8g<6jS4j(-EVnt$t-J-iWk!@6V-Zw%L0n{ho` z)bd_-Q?Sp0>Y10JVD)ldHiN5|dv z^XA{-`8Rg@X5MxHm-DtGT+McwH?{Z=1M8o8+zDLH<1TQuohg~e-N3unCG$8EuCF%x z@l00BJnjK@9@R6CdxF)=c^m~-SBu|X@DUVk_UDb=L>GWuNK_Dk@S1e%JuWR(89G3DtJHI`dw(T8_(}U3%5VN4=vn${Z6!S^YuH? zO73@}h1-5q!EL`+!ENvNqQzhC_o9W{{(yp;pWlsE+NTxV@myMP+xtCf@%L{mZ!EZW zzbh?v`E3QaKfgb%v_I6w{rVj`zu&7?^1BMIzu&VKyW{n{)=KX8t%d9FAzO04 zcP-rZe)n3q{qNq!{rA4c)>I{%J4_oc&Y zU4PGJx&B8{f03g9k<^LbRqOhDcFSYy2HR)&Xs|wK6VKenfb~(g{n6BF@$Uhb?Z?6O ziG4iSc)qta-UP5d>aE`y1RF=2eR%)qr5M9`Iu`6W6LTWiJ~HOXV8=YE@aY4qpIi4k z1#CO@e7<-bSUqv4g3Gwm;O%jzqp4?pW`J#{p13o?>Ul;u9&BIgc^`HHSiOADbt2rc zYI7dEZ>nV;P6n$b?kV8BZ_Cd@!53Eu7O+(e%}p-#?iJ#;y8Y67A;T zy;?mvoCa3Q?~R@gR@2w}xIFWDCfK#iyqpDA)7N{vT;GxO`4zD3wRwM+C(gNG<7o3< zFBf~C_cMpB*(F?3jq~Ato@IOev?u{_#F7nTF=i=u7RsreBs*2??GIPW=wtTZw|Fu`ui4GEuRg48|;1=LD6QL>!{Uj zEaZByIexeB`5st3KLfh~Y&-Q2i1`C*U;Zpa+xIDIewHK7-_idN?B`T| zE~HJL^m{Ydes7{qZnuEd!*2zbx!wl1&5sM8pMcf#Gl|>5wo{+Y7#;IZ!Ix5N%X9l3 zVEfbNJl#mGmcH)>tA+op=4t{;G^W*z3$N4KT(^GvmV@&<^$o4R#*%OW(f%o3}RS;ZAC`^zmD;ntU*A ze+NE-;?FANzX#i=eoe!eAK=7@$YA;ga^AcE}@Rz~nnKk|^*!lM7|F+j(pRDmKVAohb z$NfCDn(;jM{sz9B;yyc+`ZbFC%sGtD-)lYR(Ccv9sb_!w6KuPGP$$=afz>m|-qdVa3^U$B~= zZ|84Q-i52X&hJzEa-G%Rqo}#g;`H?axV^6r(bThtJ_4(`9{%2I;#lWzQ$7aUxBEnY z`$%5@18X<0PpN&Gm-;6ZHS-cDug}2dm7l?QE_@DG&m0h<(wqbHN*wFtH6K3qUCjsB zK9bk`aP8*RN$tzL)H^6@<|R&E{lM*c^+!|Bd<_7rWxf)}I(ZEQ+qb#uZy)BdAa(N4 zX90?ud5Cj;E(9*GPkplQ7YCc8d&~Fe@_a_L1lVg%eP6Dm&Di@(g4N4nTi@?%bL@Tx z(lQjU6~7zFzBUIhTkDyh<=|eI<=$N$O+7v1!>peU;-~8?K&bo*`hmArha#@=w~X18&cAT{QKaPwRoz1~6Z<8Nb)c25|ND zDcP4Bg6&6}*GqD>&c56T?D*VI`a6z{ePgh8$G$1GFUPLF2}RAZiuA1T+8=ITw%1R)exsIuxw`A=Hz3 z#!Q>T;M%g!4+pDxUvT}71p9KYYCD3W=K6_^<1@tEUdfxYp zhO1e8;nK+S#uzkX>XVpb!R;}7(9{!i99Yf5Fd4zzXN>V^#?{9;I*M8?W0(L|3-7IY zes|{>xIXGR=Z*!ddwx1!lfb^5FKrVkYR;F~*sj%Nuxpg{oC0=ieTC0)VDq zo(*=MXHlpB)4=NK>kP2k>6ElP6WreJEHw4BI|rY;f*LxbZT5`JpY;NaMXG|A@)pK261XlBT+I@Nn*q8fM+r<<$_o>)8{?6uQ z;OX^w;dOpF{MGu*yaK#FCC^7+1N-}z>iM0{uY-+YJFiE5_NjlCeI;1C#g}uSk7K+P zO?&3?DzI9)XRn5<$LAZhPkFw56HPs9bPd>c>Y4v*!S?OGb|1}w>zDbz4(#62Z#LJE z*YCH$CsAw5oPQha+N9lgz-szt-PF7;GuPH>|6TB?f?p3dUe@q?V13kG!|zl3at*cJ zKv8oI#ksfs09@W%^+}&Mfv;md)5k4vwVNsCd?U4*{wp#`KL)GW|LxT2U;QVPJ1O=r z&bs^*yeOqS1MYyU+sAFxa_7aEwl|J_y65f&XV2XQmS@lX4D8>aswb9O8OxX%@6W;Z zr|+%Q@{H{l;Ee4aurKFU{g)Iqa}y`tePH8cU)&E?yO)wa)XXRCt(}{rnD<|Sy>=g< zHs)aZ{54qpL44%D0jv4B$`8?8hX>*6e%9(*{0{8Pe6{_SqGrD0S^~!u$sAKKA(UaPn-EY zM6Kp{M&kD;aGtrI0?RXx&w$6$r|q5w%f-)9`^L^0 zyb1Qq)JK1>FI5u3vKg0Bj!m zCC`t*jy*9x1{=fk-e;T-;rb-T|G@rElz!QVpMdq%7QavRqi9QCpMm|nEk2*a^;36@ zZ&0gcPUhq1nm#vYPUeTJO{K4V4%P|xJAW#NPU{`^=ib2k9I3V!OzWgu8R zKXdXvwg6mR%{YXww2WsVxLWwaHBZb%;QFY?XVEsF#o+f5Mm_i8#lerGX-ljnz{b;- zwOSIK_4a#?w_@(}OJ9S)&S_#S1y{3O=36cP%Yxkt@m~&ZT=n=YU;8A772xH5@#jJM z#J*x}ci+25jA@(nu@cztWY*7|{Mo*m{dtyu0i65JDqvrpx0!Z)(yb6Q;)VGSba5OCC8268NdDNlksb_ zPrv_qGm77dUEbq1ul3}x1>C&T-9*m}*Scihu4xuF0VPNBFb53@n zRg;YWgvtL+G|+&-PJFM`|Ws|!tC|D&konWt{B@wFXIEf#z?XvC zpE2~+C;j$-?RPA7Vvhr>XRPDF#!QFWU%g=WLb>mcfve|QJQhqh)mfy?9E~*r ztSx;{1RFnm5?G()G8wFodVKo8rOy<&e(Gs=99Z4+F?mmgn|FELPlKz^W?j5Kri0aN zpLR3AY3CT^`X!&4;BpMd!^`|mfa{~4HYc|EoCMcTJ!3c-tnOzbX?F_TeGs27fz^B# z&okLoH8QUzdV=K>|*>LsD$!TJW?bGgbaN0R1a{ZF$8Q_<=uH%1Z z?O)FQS!n9X?`*K`)D!0%u+P_t^A&jdjn7xn)D!1iu z`a0P7+H!VZ33j}WMZ4=`Z1sFzd==PpU=DTJ=hbj+`Mls8U^TB_--liU_T}@7wr^6@ ze0~u-KF_}Ez@B~1)78}9f~P-y{A~Z*XzKZF_d8%Ui!b-E&y&XcE}Aj*aXi;jtEIp1 zfz@&i+yJ)y2#Pk_Tu-f@IrsrMIhAwpLv(HN`_cc$??!ZOS)ZH0YU?uItn!6m7XD-4E85Sib=qzr3a&gsW%l zzXiKCS^M9C^-+({@4?27&mX}0sYiPVtiE`Ct@v#7Fx;_}{XYU%&vpMOSk3my`!R6Z zIY)B+Vt*X$xXL;DBV0W>KLIYs^(0&$_4qsmF30sJxPIyx*VAD2a$L{A&9A)Ho`tJt zTz>|u**kelNoHQBQt<0jv8NZ~A!&Za?MxybM>*``W*P z)oh=3uYl9e{N(z%k8?d*%deq!&s!(oSHUk8_qe~occGN){~BC9`TrekJN3kQ9bDck z{{c5nIp6<;t0&ICz_wG*8oU8EzP60b9j{~2?)}4i)5l=Xid`uB zxUTl8F8&|2e^+ac`hN;n3;zr}oHh0A(f&Eycstj=+KuxGwYIdIkB1Dk+{fmJ+s^x# zHrx0hqMmu}6w_C^HvQ1l_4jw@<(bd^U}NNdFc7Tf|NoNrg9WL5d0)}C07cDxD^8q+ zz{W}L3xmx)bGry!pA_#2&c&i=`fAS{s3p!~V6Uh2vpC!__!*k*mjLUdo;FK@?K^xB z+!&evrQn%=eYGe4(qPAt_{)IxS9kB&=dxh?)s{Y%1DAa+-^N#fn?ruSydqp5_4Kt8 z*f`pf&lkXsH)qbuU_WS?nE zxE$k}aARa%*MetW_0^vEYlF*q9Rk;1JvpxfwqI@Ob6s%R=Xz~?eYiPfUN?a2qn`QM z5NsT6$!8;QIjdSv7K?ZuG{%}rG46uzR7)?+HUUp zCU^DW?026*wgb0+zOp@o_*?jP!6Ja z_K6+WP~z+j-iuP+qxXTU$7kQ#r#zSULsQRvYJafr7t|dmRpS8uS&%-o<=Of`u<^Ay zhTW;v+-v4+e&*?ze7|%s*!mYUy z`19WhVBcewKmYATQ_s(Tj{&PKMgRHv@3C-ofBx&bCAM{bCvPIyd|XTY?f3i43sqwh z|7iF3Gd<&+7r)y>-Q1R@ugPF@^XJaagTJ%dho&B%DYcJz#OF9P^-G9jo2g*isq5pq zOapr@=KIK|gVlURn^9|oXlXNRja1o3&ELU29?kapYj-^PUDgxe_OFjQ``suff*+wa MXU8qqFW+7Ae^JrW`2YX_ diff --git a/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv b/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv index 9c842354ea3bf59e6f26109f48822215b85c645a..7ab3908eff05fee4a6058c8311ee187d89e5dbed 100644 GIT binary patch delta 9117 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 delta 8658 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 KUmx`GU;YpM1mg4n diff --git a/packages/ludic.render3d/shaders/spv/d48d6a48.vert.spv b/packages/ludic.render3d/shaders/spv/d48d6a48.vert.spv index 9cc1e17df7ffaf62757c8014a6c4f477d92fb273..1e70bc506a89f80ed9d859687815e85932ceac9e 100644 GIT binary patch literal 32736 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 bzXVpB19#nj3s%eZ`#Z4O%M|yC+&{(lC zv~km*Ms=*#Sgx@X$oh^o8jTeigBwR5aa{X;#~;%^yK~;m_IWcqrgiqvW^iKwev=M4 z`jGAB&7Zd2&b#bjfK?i8R+Vkl##)Wni7^m9yQ6E4`Z&rtl-nr}P&x=Qm+}$HpD3fr zV|&WZln+o2ryN5$k#Y)UA?4r!gR7XE(|$-%hN0TmdX!#D_;utkx#De={fqE6{%<+7 zW%N0au}nJTe}>o?gr&@V5X#E5nLqdFS>5wTFPy&9o+xdNmCzO}Y=8$hhFA7ukE^WH zciaB@*>gZ=*NmBU$jX1sKL4SObxWV4XLoncpV{oZiqY0s zr_XmtW5cHJVck8mJ7yh!Vn4qP`uqkrM(Q{B@SgcIyASD}HoD5xv5Y{U)jh2mi}Oov z%~*9LeKtdHj(1RFOYqE&c{6t`?4!}YioqEbFmeT*m^0vmVfDc!;w#IJM%{d&}*cUuwR{O-x=^YDZ%|CWd z*K|fdepdHX90n6fyT^j|g>B!pSx>&LHoQp z-HY01bL|=Rd5^Hm^^s)_?oFYL7?`UIz=> zr`1|>KD>SwwD)vO>srt+CYLPw+|#N0Vpi8k`?M)D&|F*NG;)Yt8}lnXsM>EhCv)59 zcFbV7mHm2ZJ8+HOKs~pkr(<@_-J2@^nN9nrTkLoBT>?Ys}v*F!b7CGgYFY{tB*UyQcKz3^sEZH))PT-sHe$HAPsDvuXi+Wa0q zpGkMG_I|^@@xkt%Qz!LwFPMAa#AchnRX(#^D)hfoE2I4{RI^F3Go#{Xz^8UEnA4o2fsHHRv%03&^W4_B9zK&Bi(`0HjH7e=7`Pn66Y!}$ z+y?9UdILU#y;I*e`}wvt-iFVtuAhO8|MasBY`oLL-|NTQ8Uxt)XYSmLyBxU8VPFd% z+>f_4hQb%II2_CB;M3|{w*YsuIjJ8kp4yCm82J78ZH+GY^p2j&Z#FpVc|kwFfsKpd z^Ex}(nVT`Mgm+Z)-PX8PTdm&!p4#5*>t^tbo^CIfYR+zjvy!X(hI4oiyv*e*@F{p} z`>|~o@lXT+NtQ!so&4?*?#3eNUI) zR&k$fn!b0zNx#ZvDR}0L`4xT-+}vvhHkKbm{7S zx!$?x>6*=CEbKg{r;BAgtMkA))B5tAM7(_%qt8;qD3gfivz>Et0Jc2m5f=XbbDz&x z`j^@$xJTMK=Vd#2YdbaDjiscWeV6Uzt?kro*Gowbo-4IS3XNq|Y0C=D*!n$PXpUd) zxk9r~wHFF)Xsx|eXv^2y-wVy>N89?+mi$(%wSk4UQmqXuG@lu5JEG8hUR2w((0pE0 z8(nCg6SW-*ZMA5Ct`HzB*i0qlP0aW@21+# zO}o6b-(K4tqjq^|f1tM0U1gV-cHei6?|j%^UfO*Z*6#dkmzQ>*kF510qQDQj(szpgPXk1epm}Xx#GQ*zwNu4{NeQHOON9V z_W^?G;k(W94PITUKIP>RzCLU6EDZXY@7cAJn&XqZ2YDoZZ^hmp&ypq|Yk!{tn`7d) z*7kQRcKz({HfoPsDfTD7o#K)H-NQUGUk`&_zjFI}nbK%HGB*5`iud;MS1UetY~pte zsD!@w?r|Q8e;(X(mj2!2JQDv7_?R*8jt~Dd{HEt`p0Ewqr03yIxIXIfxf^`hU$>f+ zKJJHqdC^tdgg*cubntPX5B~~$gSt=pyUpM^j4-dlb47vK+^vD+=$o#WrY3Anx2=pVr5yh{t>QO z-8qwcA5hc&=Nj9_c;@$av|+XVHE?sj-?zVu=ALEy_iDTC(ta=v-h1zT-VRSblflLt zRrt?9@SdIa-SE{4J`e7FKI1*p0FB;p;fvv8#*FE^2Csxawd|0Jo7atSZVy$yH-Y)D z-!*v)g5!5Q-v+zKx(6kn@78U!KUrh8aEzv;#s_X*z;{?xLS`uf|xvaj36cW&~^-}%@b?z36i z?+GXWzH4URiXSi`{qF}i=lCC0*?ar?Kf2;$`}#WuzQVJ2?B#f8)@{9qr2VOt|8-S- z*YDZzD;|A)uk?2w+-I}+Uk(4os!xs$zYYHCk-PWxe>;5d6`t+mcfy&UzI;9de`?vX zz0>|)IOn6!|2}x5F}80#Jp>;=`IRak^IHm^KK*x?q*=2qG{S5x< zkxQ%o^nVVX{h`_u;Y&9f)YtzXtM-TV<@Xx=rW>E{i}yNwbTR&S;ai?`MW6p*f{z(9 zyl;M1fHU5{d{>40Ou7xLd=&K>aPMQ@yR0*gk?3nb^rPM5w{`93deb+4XQ4m#`rUo` zp98;dQb!-Z9M1Um^%-Ck7oKBw{cJ@4K4<3suFYaxufNT}z0|hb9IUUJ>u3vV(x`Oz zF}d%qYTCE1v9WExE!?rD{dToo-S%>yQPX~>8rvpzpINmVZ+EcwkHp)fwyEnc_nB7z z%+q){`_Mk-cW`YphVc%CJ1>cMSZ!A~p4?~Rx8{qn=yQXY= zBiOZ&vMW2Y+a*h;I_&S?D7aO5_zdcIS^dq+eb8^P;oAKMTXMg@mfY{JCHMPl$^8af za=*it+;6cZ_j_!~{U#f3etwrNx!+~OeYW=7Y`FJPzt4u--fy(w`um+W-0}LIw&Z@N z4cFiAwBh>uownqDrwzA1zte`BkKbxb?zh^K`>nR*eya^Pp5JQ2y`TEMHe9>kY{Rwt z%{JWoqu*@9_4m7NxcT|rHr(<0?Ka%;`t7#le!C5~{QwqOxb6LZ8*Y2Q-#3Y4=-i$^G72 za=-bO{MLfo-#rC4AHVsQ{(ko@x!-+D?zi7?=fiKmCHMPpxbgi4TynnyhdW<>3l2A) z--5$!Ke^zZPrnD3cE1Ui-0#9A_q%Yo?fotsZhw9o4tIY1HXN?qZ^Pl{U#0krZ;ZX!Gu`|DQtM~KeJ1%UTx}nA zc=uPizS{l)RvSl4pa1_^;pTgRHvPQM{;RefPEX#~UWcn$JgkiGeyuI>-vl?~52@b4 z{|z69ukRh&e8{@^)vzW;%%+n4tOdHQ+>tmfSKuHwyR9F^}d z@fm=oejz@Ne>t%2)YGo5!u{I~L{m?@L15deuf&`fYY5nGx1ebE-N-zvdlWe5YTM4Y@ycyH`oSN8sTrV-i-rs_~w~60kz{9}aYpvg)&(*1i zQ#`bGyPg%HFJ2I81mI9#xk}zZPx*tWB9t@WADn)q2SzJ{!Vq7rqhLxxT+{voTyB^}A|q1lU;G-lX46s68BywviMy z$0K%bGCuY6wHdhVdvmz?UPM2xg)QLvs5?HNBh=DuxtR^~}%iVB4uD?jB(EBk0@wKLEBb^~-B*Pq6wc*caE@UU0{%&3W*d zOfB=U4_Ga6_XXSDa&aAFESi4W;x`WL-eXB$d(tLZzDTAukl0PMNUyc`Ht({~cJTwmiH0=B)jgQ?|-a~Rk-+I)_biw~#n zrR^THe()7t(F+4fYrPXCR2A*xY1~*)@Ky` zPO0_W@20}lEFM-D)N5xN#F+ZHCY;kwuxnyGMZ0;NOs#Go`b-C_na2e9%nI`}+QO#` zto|*0+=D+1ww=2B*DPue_b+XyQqm!@aKO z6+R2V>Rv~VX(8Bl>RvNyi@<(U(Dsp9I~{C)+MJs?)N1MbEU;Sm*)>o5bKv@@r|)yY zXHv9foaa@z|D5)ssVCO?V70}Rw7a0f{o7rLrk&sA{y@!7`QuLe7|(G+ctBlCU@-1hopF0KVBx5$*!3<@wL~{R~`vDL!83cZ1dZW_LGpqIM5l z-Shl8Y7ft|`e!L>o@a6T`aHO`uY1wdzgG8kA6U(E(@E|_I*FtzFjl=+eh;H z0$96weUaM3ywo3{sF{~Ic|8a=ue`T72Va7#XAZs$R&x%_D{-uo*H^&yZLa#;NAh|I ztlhl6O6_4@>PsnV<|R&EUjw)1^>sA$%-1)-YMHOZu})s!1lzZ{>Te(B@i2Ar(C1qe zHS-Xc*Qa`}hwp&R%k}gawR{iGpY!&AV1MSMegre>``Y7R^|ILZQ8aCi_etvSRk+dk zF13C6vySig>CN@J41PSNT(3{T)iZBD02{mX`5|0AK2L* z&HdkVwi?*O^{H(bMa^?2wr`&uhJ%l19OmaYtu^32JJ_E-?j>u2)$@G67Ff;V;o8k} z#oB1b)F(05sc`?8>!PVA=6YZ?OMQC!o+Z{tGp;_)k>8coGKLMnYT+B!{F-_%*a)tV zdiJ)B!Rqdr&euq=hx4Uv1VzpH5*yodwF%gBl=Hc1h54CU;j((wDV7=gQi?d=}aY>~&J^C0nDZ=UH(Zuwzos^X0Z+`}evU4c?NXU)pR3wvB%2 zYX@-aJ!(fZ^~}XiVCN!n#(?!vkG2a~-Ji85pIyPp$Mw2BT)*sTyMfI~zs&O<73LbF zPX8YOtEaEMz-s>7KJE6daQ}AupsAO0 zjzvGuw?F?-OK$sDm~R`@8Pg=NdammOz?H^4xlRv)d$>-u9Y|4gor;Zf7WPBH{tl4b z>-}dakn%fz8G1%=X%Ij!y#HuRb|{Cxi9( zx^Nx(`x*M>{G9?mnxfz0dM{}QA4SoYb2b_5xlOwcu$sO(?`mGxIak(cKLtFX;8VfI z%Nm#l)<@knFrC`NHK47NqUIV9m-l1!^z&ix$(*Rfods7rm13S<)N1{?uK*iQ zoB3T#t(Le;z^!qwLQ_xNYrtw(Q;cyXwOZ!nI) z1h>s96m7P-fm%InJ^`Ln&&dS*J_#R3-HjHXThP?=ZRk^A+o>D#W@@$g-vRd7HT&16 z;pVX&r`6n*sfTDnV&f4=|T4OjaN#rXG7tL6IoEO<-Wsi%+6fz!v8#JUr%U*`Ms zVDr!~dEO5;_r&-D*ck4!K4;tq*C#O^0N+c|FKgk8V12d4??JHrX-i*U0$)L1@%b`b zKXu1=E45nuzX~?D_xm*e<8+ z1s_Mfj5=+809Mafe+agndbA&b)t{y$$7jG9zy0cy@oURI^AoV|MCHEsQ#AF&e-^Cv zGfHxOzQWDlYfP>`M^jI`Ux3xjD{K7)u<^8IU-~83T-}$nr~R+M+Wd~1d|!l{Z@J&T zgr=T$zXq$lOi8}Ksc`>%e~YG`cCUcdy!P`f^*gxnv?Yh%gInk94`}L%^(U~}A1N98 zpTWk{ma)GI&e*l5{a?V^@-s%?$Nma;PPBP0e@v~GG5)>6{m1wZH1)*&Cs^$@O3vHA zz!y{E^9ES$bxLx76Kq>;nTLOaTj${|H1))K8?08&!++q$)0SBO1-G8pchJ-m>pigA zyOiX`*3mGYHs|DT)M^>qa$vR0cN;wOtu3(!g0*drZ`uxm+crK!;A;M^ZTcSyR(CH< zAIrnjhxW8z5vz{jLo5+{R}WxPI#6>b+uEh56kH>a<%8te*Z>2isQN zx$$?f)WrV&mA?aQ+fn4c7FaEOZLsg(?kC#Ufjg#&wXb&L_qCagG2RBhU7mfYtonW&Qo#Fg5+X=ZpfYdC%F5 z+QWN}`lb{$?>XZ1u{qd2GOjJaj_U}%RXHD{!TO~5T%*1vn!egIKWg3+(vP(^e`n3# zuTG!afPJ>gyle~Cr`(&jgRAEpZx6PedgAN=zP5<7BiuOU`{Yh=^~4ziww-#`-Oga+ zYfDbMfQ?n|zq`WK)BkQ@`#+C4cHi0^u9g^kfLq7)0W|gGvnSYg>WRA-xSXH8;jQD^ zM}JD<>tFVZ4%gZ?(?hm1Hk&Ir_F(2*I@WTU}NMOJs6y8RA23he+bz1ocM== z^;dUZ?DH_N{c1}ehl9&Lk7(gX!p$MyACCg-qn^Hw1{+6P@;L_VcypgU7VI9Xo_5E9 zZL2Lgeh_S)+H#JL2j?7V&pA@}y371qXIv+M%{%-=uzOJQ`w-k`vpn~n1h)^L>z7dO zYvcP0TGr3WV0}_-=bWBWxAS?~KJ7=}ssqijx z%I~vHgX^cBpXqdh)!heYP5K}-s3+ER`cf(d5=F8 zuHH)@o`b};&d*?Gfz8MBqQCv#!*%DLF&nJC3+%dZUM9oU#dD~8(T&{=Hg9Wxhw(J( z9*T$dd9~fz`SRPte6TU{JB$m!YBw?l=R`i2Vk~2e({>Tqw)s7*)4^(aw><-_=DU-* zE(ELPe4Y(fi~qS`wR0$Wem@WFdh;DayK|5|trvb4MW5_xi@`oCYD+)ogY75$f|@7J zg>Ze;Ns3E1;z?b^7S`WlLd_G@dqwfVRx5t7YzP2CI3lGX77%os*31lVJVS<8uqRoTE>{9dq`d zTfw%|Pn+{_1GRc`yB%ESb_ZN7eS8{hANd`YJHh&>8}Bx1HTMRe+dc!fkMjBCZn%14 z-UIfXH)H!OTp#ts`5f3d0cIWXfYW3v(Rj^t){;$E+ zb1i)xoNGzjVa&g=mV&h<_iyM|@Na_kNsiwF>!Y4F4}(jeN8tLYr`@-~>i06{{GJ8dPCap+1DEdx&%@Jie149mo;be%+fF@WcmZsD zZ5hKa!Nw}r@vq?OiTxtDd^dOru9g@tgN;#+>(_Agvw4C ziSv7~?bI`_KY)#|E!XfL!H(ClXwNmQZvQ@i{RzA=#b>KmsXe?`sQ;Ow=Dk8}n^D;R z0yf8t;jiEgD0%+<8(1IpwD~)D&4T{}Y>d1EyaslyPNe9oJ@NkuUYC;i{{ri;?)c5= zb+G+vOP_Cm%Rb+1;s1u4L*4=20_&rmzTO5KM_cmw57_bM-uPdz&lT!v_YT;$+LGhD zVDr?LbD`$_Jo9XwHO0{W=R4H^H1*`N9C$YSLUL(?s~v-uI0NCW->3$msb{SW1{>S< z+A@bjz|K*|Fchw@x?^|`o0@(3`*$l;nENql8pGeeTM@0PH+@#BeR>O@mC@9%B93iV z0ozVJxvUDdza#PSS$h~<%_G`swdPuiwtB6R9^-BP?0h(y?e*90`CCF*u`q z+_xckWd;|%5qu8wl)tsv7_R1XU@v{!W(3@J+R|<$_)6NvXA`)7>h|m3_Nm2xOR$>U zdD{wXp8j5xf78AV#lLgcuNS*9)bvY?9l(j3&ckN>+{;j)ywwLRZ_Pc<~ z_PfHjD%$S`-DR%RWwmPp;R9 zIi5`M-yhJ=_HupFz8!4)jA=6X6pFh3a-VCR(`$(9{9C7e2ln#1ngUmIkF>ouHQO(# z+h0vB@2RpR!!G`L#gX;ZU(H`shmqqeV3^xitx>0oWvzGKd$?xJ|u_QSQ^ zI(?rCHpT;-U$2*0V72EsM_woL85Cm~Tb#CYz~w&G4L4Tyskvaaa-TX4ZaZ!ME$LwT z>;bDg9{+w=o<0_VSE=_xeNTt$qg{SR&7C{>nQ*mSmuhFV_?!(_bHDd~>AwYW4&2zb z*Y4Ulm-;-)LW+5qpIqPM*9$hkoV&$vwcIc5|9rSPC&vrGYGsZWw)lJmu9o|aaX#AO za}ivv9LL3Q_N(>$F72dR+n+k$RSy8Gd#^i)+QVyD z{XmMEeT(hOd)*-vb1Lt3ht_)fIvlQ+Juz{t^9}U~uzfo&{p}-p9SPQMUPn`Vn3wud z6gBe_C$D3`=H< zPF^1Zx6ao|XzKZ!w^P7sK7+d66304uwS(>3T=ln)JEyUd5M$P zRB-EjO+!;pUY%gIw(qq4I9Olx zJQrRLcAZ)l*K6Vmu)6+N_a6*W9_elaidwU!L{wnF=@8gX2yv zcZ0Q=r(=}wQD3+BfL)8m(v~)#1)G1?_~*d-dPMs?Sj}~mZyWc5_0?vK{QmrXV8^1} z>&JOWocqDrJv`rX=fU|fAFtOhQXZ(e^Y9?Wc}V;(f%Q>ujsImd?Hrv<56I%){*V8vz_>(RChb{b>7XH%~{@WJ*Mhkzph5NtXQRcHk3-^D=qqO_K zD4p-Zs;=2D9wTJ6o+cznX zQJiaW*7742Zm#8r!C9Bz25Zay@hDi$;`;WSsCjR*zaR*HQNQ{{ySdU`#tw zKTc8WrTFtX*V+>l^~9H#@$JX>`hJ&U4*I%YS^;c zuyK;>v*45Kl3bsItLvL~&x6Z$KZm!r`vsc1zL}pFz{b;-Sic09v3><_jrAg$y1t3^ z64-d!lK-#4FV`jaqTj$@qG)ptyk^zX|L?%|pZn$S!D_~d&mX}0r0+k1^;1vZe*(W! zm(1Ot;p+M))?dJ7e}9Fmy;}JEt@cTOe~0U*o;d$#@p%odpL*`;{{)+Zw&eLQaO)hs zj;60R=g56bEq%QSHs|nv*F5>X1=mMCK5w`9{0FX|dUE+MxHXq|(Dc=2F7BafiTfVd zbC?(|^49e-08L%rv|A4DxN>gV;QFb@XCT=A;xh=YpSroci%l*5L%`+|J``>rng8YC z`l#F9{a!8pD}s#~z7pL2(|%>RKI*pj{-75BRl#1>O+RgEw>sE7!-vDo zE!WH%V13k+%bH+gX-j`=fwQ;8Z*4SvwI%*K;HC7J`0K*;Q+Hh6=hWiAKDZp$2Jnn4 z{cMP)pSHBy2<-fYZwzWRB8 z*mGR=y&YWL>)2ej2isOX?REe=j+T>ZL6Mk`+!@|*}iD% z@fiztj>_2M;OZIwc(Co%9sdMswTyov*zv0;?tb9bbGAR4dUBowwyk>F9RO}UX9uFG z$LFBhr_A|aH1*_s2-tS&=6oo%T5>)NY|iS5dpNlDoE?Fto}7;a+g5#Xea?;oI~Hw; zbu`#mWsb+d)f4Mjux-^7>o~CIQk(A!^1LrBPre&cJl3b={c{7b&zc)i=l$~p+SzyB zA5LuHQw#3(-C6VO4c?wwVFl;`DPX>GV z9ImaMqUIRH#<>;y6mUn)9s4wJax#B;p4q2Y_lgdEwLRy)7d{UE z*_87Nzs2CDt@-bFoL~5r`|<_o+Hzf92)3Zl2<-Doq zypBTKoZ_)5CHux^VCQxV>g*FsXjkqVSJm8kaLru}x1HCMHo5zPwrjxdPwLu@rItPM zTCiF<_t(MI6aV_!C;Wz*=XZB*gzKZ8dASMfGnTf@%gtc^tL8zDjK z3C{TK-#NbpO+DB6r@-cH3~kP}TISj|TT(n$q-3r~gPrTGs57?PX{VmC-33>>lagFN z1LnVKztx^KdJkCJ-IVx#7R-OuyS8?7Q%i1xv2923*oI!zdZBr+Sr}qu`|W_--&vc8jqpgwZOZ9JuiDu=e#^lyz;!fSaa8~?Vo@f?_i2K zx(|I9O+7zD{T^8DNlJch`F*f@=H@A|+A>OF{{U=k`%mm2qNykL(_pnS_K)D|iTz`+ z+B1~Q+fTsusV%X83U)q{rM0zn^m9~e zhkFlXQ$LLzSrXV%ogSp0culqx(B|0>$D_(3_PKI4!9=02%a&eb#^N;YWeRa zcze@?Y0VQ`nr64m&HWdnP0sB#=?Czv117dWb6YLFm|oz1;O4f2&}%l$yEmt4W_$D0 zmfUeOj578fQUV+b^a)85@+ZVvg9lb8+S@gU*-HtGa=uY0f;3-o&@x$Qpt=s4N z6FJ^954aFKYf4K?=fu>cCGc_sJy~*PzFZf+f_zwM=v}9+O$>HxTi!sQpH!$#{VR)B zYZ&KBp3~IU$|B6Y2IPEtOLJQ%9|&)6ns~sZNu7M{oKI)Pbn-zR!&lF0M%tg)1_Lpz zP?J(Hvz+uoH3CPR#L500rQGZa!^=r+ntr}h#I{5DT zVO1%0mX0NZN7rXV$)h)p=Mc@o+5$cf?0JA|(r#iG!?$0w!`Se@0`9rfANvBZjTtxm zuST0R>CMsMe;a&*QoQ@%^WS@C>e7G@BCL;t2^>Zsr@>DId>uY<{Lrz(NT(6~E%;o9 zC`#xYndu(vS5SP0-mR`Oev_56zJ=NRG)I1Gpt~@F4}z~-aQnY5{EH#4kB#wh6_m$k zBs`_DVNrq}+GLmf?GH&X3$G+CB}wcB$=i;m6<6o{y!u zTmUEbsHp#3UjMOi!56_t)h}G?{|WrzhaQT#$kKNRLyHES{2r{B!91PJ2C!Sf$+WX_ zm$+Iqum=2#A^R@v?3(a>kMA~S7;BbsO^tAU)MGx~7Jjx!+ts8)@p2zHf-$0QgWxUz zw}GDs;4&}sL6v2Of4h_7*CubzQhOQ`lD}ikDHD zdm)v%mr|MUSs6Z}vDbcOwX*AohF%j(O8?4UQuQ46;+zvQ>1%JL0LVkDIrn(03-jb*_S|b@ZrA zpSEe$_3_MsRI5fjt4>pvx==Tj^Q;hMt5gh4!&dm^hH=%2z z%`ETp%@8YV*agJ~ZUL)DaeUNoMRR<-B<#P5=#B22k5w6t%Co+{6*+UT}Gq?}w{-rNt~i05(}CS$ib*5ZJ^X zTnP{X9|mifUzsuMXFvd-@tiUv89R9^=BIw0qfUg00l`Mn6>N`Dosk9w^3MPPM{AA9UOilgYA zpxt<`tk=M5`4VSgq&FanzH?Y%F;BIq@FrNTXX=p$cpGd3gDBeGqQr832YeszdQoCI zzgyICIZx+3#u)l$(a3uc*R>neEZ+yKSuxhU+Sl|emZ?wcI~^Z@_n=%y{d%%n0#uCqUdM4R9lB3vDH^`nL>7j9DMJ znP`hKTN&(_F=ScNA^M}C=uh4q$0gEV1#F-7^*vA?wpGDu(dcSmHNQ1PqpO39Mw9l= zI4oNYvCP&4yUhGrQ9g_t;o5A_P1+yq`51@uT5yAVD(LG-=@W4WfFte_Y!PQ*hCyQ- zJ8OdtHjv`#FiYQR)txvu_BvpL4dNLiFc_>Jfro%EB*B>0pTX7qJ`^|AP;h3}-gY{K z^Dyw47<6z*?eThG&q8f6-|K^ISX(5r0l0kpZ3tJ>*Uo5DD-zAp#t^@ib>8nOZ30${ zy)hi@$GxF#Q_A)f_l7unJOXT-=)~q=wVn6|$KZo044}9$->zIGD@{5AT=*2I< zW_nW5`%!SU70~qei-cPEj|S@>d`yYk@L0HYVw%T+)y6vif-r0ezM4Q$;tbsi-OOEJ z1~-7dF%?^b^_jty6eF??+>S-;ZNX|$jJ=*`*mj5!+@2Ur=a?_;Zp-17c{?^_zl1r^ zaY5|>R*MPy71)mxrfo-xniD3D^mYQ5Cv0c9+IUK=x?RBTC2hsnW@%T5gB^YUHC#>S zNLkI4qhX(U7kHY8t11%N9XyG6(V;!yYA3LAym9vi`>{iNxMKD~Xr>rQTx6Dh10GAD zIEH=;SKEhTV*Bz`6Ys~9@n4!m6L=bRwfzn(A6YEh--GAjZvFjSF*@kDCr^#`%q&gF z#3G>y;BrFy!_^|8iC{HjweTz_G#MTVO#;hJD04kefgH}$09Mo?64F*q$i!l(4*;9A zzPs_1ix1@KJV)XO!A)G-G_bs|WvLZXOVK!;r#vdo1iLo0%>c`z@mXLS($>aPE}qTP z#q0U%x6e87ew6YBa4=jwf6;9RC`8~x!1l&qb9u_cb{IH@@lddQBnOiF?r?C0r#-YI zCTwCRWE;k^j&Y~*)PI~WI^F_*fOrecFLt~ET^s5#8h->kj9%p0=fU++k9+Y*u$!OD zIJeu_5oqcW=V-86#tz5~G#{eqkeSS%z$UXjTP7;~8BIOT&||>XQ;!4rFJK!VLecIt zgzc||Z8bFgZskdGS^h^2jnUBGz`hklGJl76P3AZ>^+@J;u=UjA#yA12?iWk9unYY} zxVlp9{f` zZ}?mUzJQ`0lXWrJy4s4%AxoD)Y*b?eyA*6+;|945te<-LTn=_qhtCyY{nYibGgpG+ zm|6gqk1SSB2l!}qOwtfRt^ylKV+6SxJe6WE40;V%OZAB_?Sy&m-30GPDW7{c!_}kSEnw@aM?$xP%N@84uBLAm zJy495aR<2T(RC-9dIY@-Tt2$)hU=pqN7p@I_mfALcH6q0r+N`5OZPz(qw)K}T~CJx z(9~lJ9t2xYJsNum9F1wWv3q%{N79dgYfJo5-xhR=W9KojPLERJoO>K>;2{+4ahf~~ z))v8^1eb$91-D}n`)RN~>Jj^y3=+Y0h~Q6vpP?Asqv~0(4MxT1!PfKe)%F}Ew%!Y1 z?f%&@>c0p#W*lWNfj!DH4H5KZa0Jz1N3O02`U+fo2j4NA29tUfZe!XU?u9(nqS3`* z8;$ezHL&sB0oBA_RL5`DIz@%o!3K#&-vFywF&a<{|2M&9|F__37t%`jtHs)SJ3sQ? zL3x`JQQid`CHByJV13lX=Y8;Ql<@fgte?6*Ztf4kaoQ{a%j2~92z)d?=-JXBA0rw_ zV+8&bto{kbwB7ihfxB+}&(YLlsJ;L@;p#CzUxK|Jv_<@{>UahCv~v5N4f(Glx|;hp zxO`3disHyk<*62Z`xYFRhgaSAaChlJcaL%Ym_JH_IEYLQvE> z8di%6-HHllFv!Dcuo|v*I@~|M)qvH!O1ty)<5j9&OHuPG6-WFr)cZPR-If}4a zssr0If4qw%mI12=uLl>s$UCttTur}dL@oS#f%Vtsk1O&~zN|U)%R^$>_(O}_iVkUS zux}_<^hX!DFZtG65qt(u16ogeG_EZgUl|;Y`#%iGU6%Qa;wq4V1kn(Ut_q$@qr2i{ x5`E$N`3Y^cLSvwoYO5ETe-GY;B>fw5KQ!y>uie-t$xol%QooKqdw=+c{{zA20AK(B delta 8658 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 Ku0LnS9Yh2{x>Q3G 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 diff --git a/packages/ludic.render3d/shaders/spv/grass_reset.comp.spv b/packages/ludic.render3d/shaders/spv/grass_reset.comp.spv index 0d6a330234f111f0231975dba7375cea307f4fcb..ad53d657d0824b8e9ebdd2dcd94dc30adfb56a2a 100644 GIT binary patch delta 375 zcmX|6yAAyBNR&CBJm4qmCg+JDkeK; zX3m_u5BHGtoJcbvq9i4*OwQgV9hazNg_6i-y*uBQ*@eXZQWJ7Udupo!eNwB$FPza& zb)DzoHO#7ynmBmh%q7fYaB2=P1mhe4%zUBmk=H&no4n)#b0mxSwtyVK3-oNR4NlMI zI^Y$c0MvmQ?ongT?sUP~eZ-&fMLmF8O=KzuBMywgr`d8J+?La4xv$?&wLQedO1nJ* Or^e?pMQ^0TX!!$jS{$|j delta 231 zcmZqRy1~KA%%sfDz`)4B&A`E+HIaAu#3M12O&CiUH7BoROk`$e5S%Q?wAzu4fq_8@ zh#7%cn}LNv1W2nv`Qkvn29OO>!wkeaKo*Fv3B({hU_ALR(`Um523D{tWuT}cRK^h~ zA_iou0I?hpivlr7-VSJ%%H)MC@(!v%9tRM^bgKi|ATf~rAXOkakl0TKCI&7b{R2qz M0O`L#*IEEE0M8W`rT_o{ diff --git a/packages/ludic.render3d/shaders/spv/manifest.txt b/packages/ludic.render3d/shaders/spv/manifest.txt index 4481d6c9..ac8d72d4 100644 --- a/packages/ludic.render3d/shaders/spv/manifest.txt +++ b/packages/ludic.render3d/shaders/spv/manifest.txt @@ -926,7 +926,7 @@ T 74258189 u_tershadow 7 T 74258189 u_tershadow_aux 8 T 74258189 u_ts_height 9 P d48d6a48 grass.mesh model.frag #define FOLIAGE;#define BLADE;#define MESH; -B d48d6a48 vert 0 4420 +B d48d6a48 vert 0 4448 U d48d6a48 vert u_view 0 mat4 1 0 U d48d6a48 vert u_proj 64 mat4 1 0 U d48d6a48 vert u_vp 128 mat4 1 0 @@ -949,7 +949,8 @@ U d48d6a48 vert u_d0 4404 float 1 0 U d48d6a48 vert u_radius 4408 float 1 0 U d48d6a48 vert u_px 4412 float 1 0 U d48d6a48 vert u_dbg 4416 int 1 0 -B d48d6a48 frag 1 1028 +U d48d6a48 vert u_gk_ortho 4432 vec4 1 0 +B d48d6a48 frag 1 1088 U d48d6a48 frag u_cascade_vp 0 mat4 5 64 U d48d6a48 frag u_cascade_split 320 float 5 16 U d48d6a48 frag u_cascade_range 400 float 5 16 @@ -998,6 +999,9 @@ U d48d6a48 frag u_blade_base 992 vec3 1 0 U d48d6a48 frag u_blade_tip 1008 vec3 1 0 U d48d6a48 frag u_blade_cols 1020 float 1 0 U d48d6a48 frag u_blade_tex_on 1024 float 1 0 +U d48d6a48 frag u_gk_seed 1040 vec4 1 0 +U d48d6a48 frag u_gk_look 1056 vec4 1 0 +U d48d6a48 frag u_gk_mat 1072 vec4 1 0 T d48d6a48 u_arm 2 T d48d6a48 u_blade_tex 3 T d48d6a48 u_brdf 4 @@ -1015,7 +1019,7 @@ T d48d6a48 u_tp_nrm 15 T d48d6a48 u_tp_page 16 T d48d6a48 u_ts_height 17 P cb13f3c6 grass.vert model.frag #define FOLIAGE;#define BLADE;#define GBLADE; -B cb13f3c6 vert 0 356 +B cb13f3c6 vert 0 448 U cb13f3c6 vert u_view 0 mat4 1 0 U cb13f3c6 vert u_proj 64 mat4 1 0 U cb13f3c6 vert u_vp 128 mat4 1 0 @@ -1040,9 +1044,14 @@ U cb13f3c6 vert u_d0 340 float 1 0 U cb13f3c6 vert u_radius 344 float 1 0 U cb13f3c6 vert u_px 348 float 1 0 U cb13f3c6 vert u_dbg 352 int 1 0 +U cb13f3c6 vert u_gk_tall 368 vec4 1 0 +U cb13f3c6 vert u_gk_grow 384 vec4 1 0 +U cb13f3c6 vert u_gk_clump 400 vec4 1 0 +U cb13f3c6 vert u_gk_ground 416 vec4 1 0 +U cb13f3c6 vert u_gk_ortho 432 vec4 1 0 I cb13f3c6 a_pos 0 vec3 I cb13f3c6 a_uv 2 vec2 -B cb13f3c6 frag 1 1028 +B cb13f3c6 frag 1 1088 U cb13f3c6 frag u_cascade_vp 0 mat4 5 64 U cb13f3c6 frag u_cascade_split 320 float 5 16 U cb13f3c6 frag u_cascade_range 400 float 5 16 @@ -1091,6 +1100,9 @@ U cb13f3c6 frag u_blade_base 992 vec3 1 0 U cb13f3c6 frag u_blade_tip 1008 vec3 1 0 U cb13f3c6 frag u_blade_cols 1020 float 1 0 U cb13f3c6 frag u_blade_tex_on 1024 float 1 0 +U cb13f3c6 frag u_gk_seed 1040 vec4 1 0 +U cb13f3c6 frag u_gk_look 1056 vec4 1 0 +U cb13f3c6 frag u_gk_mat 1072 vec4 1 0 T cb13f3c6 u_arm 2 T cb13f3c6 u_blade_tex 3 T cb13f3c6 u_brdf 4 @@ -1108,7 +1120,7 @@ T cb13f3c6 u_tp_nrm 15 T cb13f3c6 u_tp_page 16 T cb13f3c6 u_ts_height 17 P b8cff226 grass.vert model.frag #define FOLIAGE;#define BLADE;#define GBLADE;#define TILES; -B b8cff226 vert 0 4452 +B b8cff226 vert 0 4544 U b8cff226 vert u_view 0 mat4 1 0 U b8cff226 vert u_proj 64 mat4 1 0 U b8cff226 vert u_vp 128 mat4 1 0 @@ -1134,9 +1146,14 @@ U b8cff226 vert u_d0 4436 float 1 0 U b8cff226 vert u_radius 4440 float 1 0 U b8cff226 vert u_px 4444 float 1 0 U b8cff226 vert u_dbg 4448 int 1 0 +U b8cff226 vert u_gk_tall 4464 vec4 1 0 +U b8cff226 vert u_gk_grow 4480 vec4 1 0 +U b8cff226 vert u_gk_clump 4496 vec4 1 0 +U b8cff226 vert u_gk_ground 4512 vec4 1 0 +U b8cff226 vert u_gk_ortho 4528 vec4 1 0 I b8cff226 a_pos 0 vec3 I b8cff226 a_uv 2 vec2 -B b8cff226 frag 1 1028 +B b8cff226 frag 1 1088 U b8cff226 frag u_cascade_vp 0 mat4 5 64 U b8cff226 frag u_cascade_split 320 float 5 16 U b8cff226 frag u_cascade_range 400 float 5 16 @@ -1185,6 +1202,9 @@ U b8cff226 frag u_blade_base 992 vec3 1 0 U b8cff226 frag u_blade_tip 1008 vec3 1 0 U b8cff226 frag u_blade_cols 1020 float 1 0 U b8cff226 frag u_blade_tex_on 1024 float 1 0 +U b8cff226 frag u_gk_seed 1040 vec4 1 0 +U b8cff226 frag u_gk_look 1056 vec4 1 0 +U b8cff226 frag u_gk_mat 1072 vec4 1 0 T b8cff226 u_arm 2 T b8cff226 u_blade_tex 3 T b8cff226 u_brdf 4 @@ -2015,7 +2035,7 @@ I f4a2b586 a_pos 0 vec3 I f4a2b586 i_pos 3 vec4 I f4a2b586 a_nrm 1 vec3 I f4a2b586 a_uv 2 vec2 -B f4a2b586 frag 1 1028 +B f4a2b586 frag 1 1088 U f4a2b586 frag u_cascade_vp 0 mat4 5 64 U f4a2b586 frag u_cascade_split 320 float 5 16 U f4a2b586 frag u_cascade_range 400 float 5 16 @@ -2064,6 +2084,9 @@ U f4a2b586 frag u_blade_base 992 vec3 1 0 U f4a2b586 frag u_blade_tip 1008 vec3 1 0 U f4a2b586 frag u_blade_cols 1020 float 1 0 U f4a2b586 frag u_blade_tex_on 1024 float 1 0 +U f4a2b586 frag u_gk_seed 1040 vec4 1 0 +U f4a2b586 frag u_gk_look 1056 vec4 1 0 +U f4a2b586 frag u_gk_mat 1072 vec4 1 0 T f4a2b586 u_arm 2 T f4a2b586 u_blade_tex 3 T f4a2b586 u_brdf 4 @@ -3909,7 +3932,7 @@ I b20fdcb5 i_ground 6 vec4 I b20fdcb5 a_pos 0 vec3 I b20fdcb5 i_tint 5 vec4 I b20fdcb5 a_uv 2 vec2 -B b20fdcb5 frag 1 1028 +B b20fdcb5 frag 1 1088 U b20fdcb5 frag u_cascade_vp 0 mat4 5 64 U b20fdcb5 frag u_cascade_split 320 float 5 16 U b20fdcb5 frag u_cascade_range 400 float 5 16 @@ -3958,6 +3981,9 @@ U b20fdcb5 frag u_blade_base 992 vec3 1 0 U b20fdcb5 frag u_blade_tip 1008 vec3 1 0 U b20fdcb5 frag u_blade_cols 1020 float 1 0 U b20fdcb5 frag u_blade_tex_on 1024 float 1 0 +U b20fdcb5 frag u_gk_seed 1040 vec4 1 0 +U b20fdcb5 frag u_gk_look 1056 vec4 1 0 +U b20fdcb5 frag u_gk_mat 1072 vec4 1 0 T b20fdcb5 u_arm 2 T b20fdcb5 u_blade_tex 3 T b20fdcb5 u_brdf 4