From cc384efee095ec2949c582a95874eb7b422ca48b Mon Sep 17 00:00:00 2001 From: Orkuncakilkaya Date: Sun, 27 Sep 2026 15:38:43 +0300 Subject: [PATCH] feat(render3d): the meadow's blades are culled on the GPU - under 1.5 ms of a MoltenVK frame for all the grass - grass_cull.comp decides each candidate blade once a frame (place, ground, density, water, slope, frustum, colour field) and writes survivors into three bands by distance, one indirect draw each; grass_inst.vert only bends and places the vertices. OpenGL keeps grass.vert's per-vertex path; R3D_GRASS_GPU=0 compares - compute programs take sampled textures after their buffers (gpu_compute_tex / gpu_dispatch_tex), and every dispatch now records a compute-to-draw memory barrier - the blades as a sward: 4 m cells, bands with five, three and one-quad blades, spacing doubling every 18 m to 70 m, never narrower than a pixel; lit facing the sun and leaning to the sky, shadow looked up above the ground (it read the terrain as its caster), a colour ramp that leaves only the sheath dark, clumps, dry patches and a tussock shade worked out per blade - scatter layers flagged grass are skipped while the blades draw (and under R3D_NOGRASS); R3D_BLADES, R3D_NOBLADES win over the game's setting; R3D_GRASS_S0/D0 for measuring Co-Authored-By: Claude Opus 5.5 --- packages/ludic.render3d/env.ludic | 18 +- packages/ludic.render3d/gpu.ludic | 8 + packages/ludic.render3d/gpu_vk_draw.ludic | 54 ++- packages/ludic.render3d/grass.ludic | 72 +++- packages/ludic.render3d/grass_gpu.ludic | 154 +++++++ packages/ludic.render3d/programs.ludic | 2 + packages/ludic.render3d/r3d.ludic | 1 + packages/ludic.render3d/render.ludic | 2 + packages/ludic.render3d/scatter.ludic | 10 +- packages/ludic.render3d/shaders/compute.list | 2 + packages/ludic.render3d/shaders/grass.mesh | 4 +- packages/ludic.render3d/shaders/grass.vert | 31 +- .../ludic.render3d/shaders/grass_cull.comp | 123 ++++++ .../ludic.render3d/shaders/grass_inst.vert | 71 ++++ .../ludic.render3d/shaders/grass_reset.comp | 8 + packages/ludic.render3d/shaders/model.frag | 35 +- .../shaders/spv/7ed7de52.frag.spv | Bin 50184 -> 0 bytes .../shaders/spv/7ed7de52.vert.spv | Bin 27316 -> 0 bytes .../shaders/spv/7f096322.frag.spv | Bin 50184 -> 0 bytes .../shaders/spv/7f096322.vert.spv | Bin 27648 -> 0 bytes .../shaders/spv/b20fdcb5.frag.spv | Bin 0 -> 48492 bytes .../shaders/spv/b20fdcb5.vert.spv | Bin 0 -> 11708 bytes .../shaders/spv/b8cff226.frag.spv | Bin 0 -> 48492 bytes .../shaders/spv/b8cff226.vert.spv | Bin 0 -> 33844 bytes .../shaders/spv/cb13f3c6.frag.spv | Bin 0 -> 48492 bytes .../shaders/spv/cb13f3c6.vert.spv | Bin 0 -> 33512 bytes .../shaders/spv/d48d6a48.frag.spv | Bin 50184 -> 53292 bytes .../shaders/spv/d48d6a48.vert.spv | Bin 27528 -> 27720 bytes .../shaders/spv/f4a2b586.frag.spv | Bin 50184 -> 53292 bytes .../shaders/spv/grass_cull.comp.spv | Bin 0 -> 24092 bytes .../shaders/spv/grass_reset.comp.spv | Bin 0 -> 1112 bytes .../ludic.render3d/shaders/spv/manifest.txt | 402 +++++++++++------- packages/ludic.render3d/shaders/variants.list | 5 +- tools/ludic-cli/shaders.ludic | 8 +- 34 files changed, 798 insertions(+), 212 deletions(-) create mode 100644 packages/ludic.render3d/grass_gpu.ludic create mode 100644 packages/ludic.render3d/shaders/grass_cull.comp create mode 100644 packages/ludic.render3d/shaders/grass_inst.vert create mode 100644 packages/ludic.render3d/shaders/grass_reset.comp delete mode 100644 packages/ludic.render3d/shaders/spv/7ed7de52.frag.spv delete mode 100644 packages/ludic.render3d/shaders/spv/7ed7de52.vert.spv delete mode 100644 packages/ludic.render3d/shaders/spv/7f096322.frag.spv delete mode 100644 packages/ludic.render3d/shaders/spv/7f096322.vert.spv create mode 100644 packages/ludic.render3d/shaders/spv/b20fdcb5.frag.spv create mode 100644 packages/ludic.render3d/shaders/spv/b20fdcb5.vert.spv create mode 100644 packages/ludic.render3d/shaders/spv/b8cff226.frag.spv create mode 100644 packages/ludic.render3d/shaders/spv/b8cff226.vert.spv create mode 100644 packages/ludic.render3d/shaders/spv/cb13f3c6.frag.spv create mode 100644 packages/ludic.render3d/shaders/spv/cb13f3c6.vert.spv create mode 100644 packages/ludic.render3d/shaders/spv/grass_cull.comp.spv create mode 100644 packages/ludic.render3d/shaders/spv/grass_reset.comp.spv diff --git a/packages/ludic.render3d/env.ludic b/packages/ludic.render3d/env.ludic index 1f8a9559..fc07c7f6 100644 --- a/packages/ludic.render3d/env.ludic +++ b/packages/ludic.render3d/env.ludic @@ -214,6 +214,7 @@ export state Render3dState { gvk_cp_layout: []long = null gvk_cp_dsl: []long = null gvk_cp_nbuf: []int = null + gvk_cp_ntex: []int = null gvk_pipe_keys: []string = null gvk_pipe: []long = null gvk_zero_vbuf: int = 0 @@ -363,8 +364,22 @@ export state Render3dState { grass_n: int = 0 grass_cmds: int = 0 grass_band_start: words = null # per band: its first record - grass_band_cells: words = null # ... and its 16 m cells per tile side + grass_band_cells: words = null # ... and its cells per tile side grass_band_n: int = 0 + gg_on: bool = false # the blades are culled on the GPU (grass_gpu.ludic) + gg_reset: int = 0 + gg_cull: int = 0 + gg_prog: int = 0 + gg_tiles_buf: []int = null + gg_tv: floats = null + gg_out: int = 0 + gg_cmds: int = 0 + gg_mesh: []Mesh = null + gg_n: int = 0 + gg_max: int = 0 + grass_band_mesh: []Mesh = null # per band: the blade it draws (rows fall with distance) + grass_mesh3: Mesh = null # three rows: the middle distance + grass_mesh2: Mesh = null # two rows, one quad: far enough that the arch is under a pixel grass_mesh_on: bool = false grass_mesh_prog: int = 0 r3d_draw_cb: fn() = null @@ -590,6 +605,7 @@ export state Render3dState { sc_skip_blade: bool = false sc_skip_grass: bool = false grass_force: bool = false # R3D_BLADES: the blades on whatever the game set + grass_env_off: bool = false # R3D_NOBLADES: the blades off whatever the game set sc_skip_card: bool = false cb_state: int = 12345 shadow_res: int = 2048 diff --git a/packages/ludic.render3d/gpu.ludic b/packages/ludic.render3d/gpu.ludic index 90489d07..49fea526 100644 --- a/packages/ludic.render3d/gpu.ludic +++ b/packages/ludic.render3d/gpu.ludic @@ -513,6 +513,14 @@ function gpu_compute(render3d_st: mut Render3dState, name: string, n_bufs: int) function gpu_dispatch(render3d_st: mut Render3dState, c: int, params: pointer, n_params: int, bufs: words, groups: int) -> void { if render3d_st.gpu_kind == GPU_VK and c > 0 { gvk_dispatch(render3d_st, c, params, n_params, bufs, groups, 1, 1) } } +# a compute program that also samples n_tex textures (bound after its buffers), and its 2-D dispatch +function gpu_compute_tex(render3d_st: mut Render3dState, name: string, n_bufs: int, n_tex: int) -> int { + if render3d_st.gpu_kind != GPU_VK { return 0 } + return gvk_compute_new_tex(render3d_st, name, n_bufs, n_tex) +} +function gpu_dispatch_tex(render3d_st: mut Render3dState, c: int, params: pointer, n_params: int, bufs: words, texs: words, gx: int, gy: int) -> void { + if render3d_st.gpu_kind == GPU_VK and c > 0 { gvk_dispatch_tex(render3d_st, c, params, n_params, bufs, texs, gx, gy, 1) } +} # a buffer a compute pass writes (never reallocated under a draw that reads it) function gpu_buffer_gpu_owned(render3d_st: mut Render3dState, buf: int) -> void { if render3d_st.gpu_kind == GPU_VK { gvk_buf_gpu_owned(render3d_st, buf) } } # the host-visible contents of a buffer, for a readback after gpu_finish; null on OpenGL diff --git a/packages/ludic.render3d/gpu_vk_draw.ludic b/packages/ludic.render3d/gpu_vk_draw.ludic index 967ee298..b5bb3acb 100644 --- a/packages/ludic.render3d/gpu_vk_draw.ludic +++ b/packages/ludic.render3d/gpu_vk_draw.ludic @@ -120,24 +120,28 @@ function gvk_program(render3d_st: mut Render3dState, p: int, key: string, spv_di # ---- compute ------------------------------------------------------------------------------ # A compute program is .comp.spv beside the manifest, with bindings fixed by convention: -# 0 the parameter block (a uniform buffer, copied into the frame's ring at the dispatch) and -# 1 .. n storage buffers. Handles start at 1. +# 0 the parameter block (a uniform buffer, copied into the frame's ring at the dispatch), +# 1 .. n storage buffers, then n+1 .. n+m sampled textures (linear, clamped). Handles start at 1. -function gvk_compute_new(render3d_st: mut Render3dState, name: string, n_bufs: int) -> int { +function gvk_compute_new(render3d_st: mut Render3dState, name: string, n_bufs: int) -> int { return gvk_compute_new_tex(render3d_st, name, n_bufs, 0) } + +function gvk_compute_new_tex(render3d_st: mut Render3dState, name: string, n_bufs: int, n_tex: int) -> int { let zero: long = 0 if render3d_st.gvk_cp_pipe == null { render3d_st.gvk_cp_pipe = new []long; render3d_st.gvk_cp_layout = new []long; render3d_st.gvk_cp_dsl = new []long; render3d_st.gvk_cp_nbuf = new []int - push(render3d_st.gvk_cp_pipe, zero); push(render3d_st.gvk_cp_layout, zero); push(render3d_st.gvk_cp_dsl, zero); push(render3d_st.gvk_cp_nbuf, 0) + render3d_st.gvk_cp_ntex = new []int + push(render3d_st.gvk_cp_pipe, zero); push(render3d_st.gvk_cp_layout, zero); push(render3d_st.gvk_cp_dsl, zero); push(render3d_st.gvk_cp_nbuf, 0); push(render3d_st.gvk_cp_ntex, 0) } let module = gvk_module(render3d_st, `{render3d_st.gvk_spv_dir}/{name}.comp.spv`) if module == 0 { return 0 } - let nb = n_bufs + 1 + let nb = n_bufs + 1 + n_tex let bw = VkDescriptorSetLayoutBinding_sizeof let binds = bytes(bw * nb) Vk.zero(binds, bw * nb) for k in 0 .. nb { var kind = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER if k == 0 { kind = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER } + if k > n_bufs { kind = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER } Vk.put_i32(binds, k * bw + VkDescriptorSetLayoutBinding_binding, k) Vk.put_i32(binds, k * bw + VkDescriptorSetLayoutBinding_descriptorType, kind) Vk.put_i32(binds, k * bw + VkDescriptorSetLayoutBinding_descriptorCount, 1) @@ -172,17 +176,25 @@ function gvk_compute_new(render3d_st: mut Render3dState, name: string, n_bufs: i r = Vk.create_compute_pipelines(render3d_st.gvk_dev, zero, 1, cpci, null, out) if r != VK_SUCCESS { gvk_fail(render3d_st, `vkCreateComputePipelines {name}`, r); return 0 } push(render3d_st.gvk_cp_pipe, gvk_handle(out)); push(render3d_st.gvk_cp_layout, layout); push(render3d_st.gvk_cp_dsl, Vk.get_i64(dsl, 0)); push(render3d_st.gvk_cp_nbuf, n_bufs) + push(render3d_st.gvk_cp_ntex, n_tex) return len(render3d_st.gvk_cp_pipe) - 1 } # Record a dispatch of compute program c into the frame, between passes: params (n_params # bytes, std140) as binding 0 and bufs[0 .. n) as bindings 1 .. n. -function gvk_dispatch(render3d_st: mut Render3dState, c: int, params: pointer, n_params: int, bufs: words, gx: int, gy: int, gz: int) -> void { +function gvk_dispatch(render3d_st: mut Render3dState, c: int, params: pointer, n_params: int, bufs: words, gx: int, gy: int, gz: int) -> void { gvk_dispatch_tex(render3d_st, c, params, n_params, bufs, null, gx, gy, gz) } + +# ... and texs[0 .. m) as the sampled textures after the buffers. What it writes is made visible to +# the indirect draws, vertex attributes and shaders that follow (Metal's own hazard tracking was all +# that ordered the tree culling's output before this) +function gvk_dispatch_tex(render3d_st: mut Render3dState, c: int, params: pointer, n_params: int, bufs: words, texs: words, gx: int, gy: int, gz: int) -> void { let zero: long = 0 if render3d_st.gvk_cp_pipe == null or c <= 0 or c >= len(render3d_st.gvk_cp_pipe) { return } gvk_pass_end(render3d_st) let cb = gvk_frame_cb(render3d_st) let nb = render3d_st.gvk_cp_nbuf[c] + var nt = 0 + if render3d_st.gvk_cp_ntex != null and c < len(render3d_st.gvk_cp_ntex) { nt = render3d_st.gvk_cp_ntex[c] } let dsai = bytes(VkDescriptorSetAllocateInfo_sizeof) Vk.zero(dsai, VkDescriptorSetAllocateInfo_sizeof) Vk.put_i32(dsai, VkDescriptorSetAllocateInfo_sType, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO) @@ -199,10 +211,13 @@ function gvk_dispatch(render3d_st: mut Render3dState, c: int, params: pointer, n if at < 0 { print("r3d: vulkan: the frame's uniform ring is full"); return } let ww = VkWriteDescriptorSet_sizeof let bw = VkDescriptorBufferInfo_sizeof - let writes = bytes(ww * (nb + 1)) - Vk.zero(writes, ww * (nb + 1)) + let iw = VkDescriptorImageInfo_sizeof + let writes = bytes(ww * (nb + 1 + nt)) + Vk.zero(writes, ww * (nb + 1 + nt)) let infos = bytes(bw * (nb + 1)) Vk.zero(infos, bw * (nb + 1)) + let iis = bytes(iw * (nt + 1)) + Vk.zero(iis, iw * (nt + 1)) for k in 0 .. nb + 1 { var buf = render3d_st.gvk_ring_buf var off: long = 0 @@ -220,10 +235,31 @@ function gvk_dispatch(render3d_st: mut Render3dState, c: int, params: pointer, n Vk.put_i32(writes, k * ww + VkWriteDescriptorSet_descriptorType, kind) Vk.put_ptr(writes, k * ww + VkWriteDescriptorSet_pBufferInfo, mem_off(infos, k * bw)) } - Vk.update_descriptor_sets(render3d_st.gvk_dev, nb + 1, writes, 0, null) + let smp = gvk_sampler(render3d_st, GL_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, 0, 0) + for t in 0 .. nt { + var tex = render3d_st.gvk_white + if texs != null and t < len(texs) and texs[t] > 0 { tex = texs[t] } + Vk.put_i64(iis, t * iw + VkDescriptorImageInfo_sampler, smp) + Vk.put_i64(iis, t * iw + VkDescriptorImageInfo_imageView, render3d_st.gvk_tex_view[tex]) + Vk.put_i32(iis, t * iw + VkDescriptorImageInfo_imageLayout, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) + let k = nb + 1 + t + Vk.put_i32(writes, k * ww + VkWriteDescriptorSet_sType, VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET) + Vk.put_i64(writes, k * ww + VkWriteDescriptorSet_dstSet, set) + Vk.put_i32(writes, k * ww + VkWriteDescriptorSet_dstBinding, k) + Vk.put_i32(writes, k * ww + VkWriteDescriptorSet_descriptorCount, 1) + Vk.put_i32(writes, k * ww + VkWriteDescriptorSet_descriptorType, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) + Vk.put_ptr(writes, k * ww + VkWriteDescriptorSet_pImageInfo, mem_off(iis, t * iw)) + } + Vk.update_descriptor_sets(render3d_st.gvk_dev, nb + 1 + nt, writes, 0, null) Vk.cmd_bind_pipeline(cb, VK_PIPELINE_BIND_POINT_COMPUTE, render3d_st.gvk_cp_pipe[c]) Vk.cmd_bind_descriptor_sets(cb, VK_PIPELINE_BIND_POINT_COMPUTE, render3d_st.gvk_cp_layout[c], 0, 1, sets, 0, null) Vk.cmd_dispatch(cb, gx, gy, gz) + let mb = bytes(VkMemoryBarrier_sizeof) + Vk.zero(mb, VkMemoryBarrier_sizeof) + Vk.put_i32(mb, VkMemoryBarrier_sType, VK_STRUCTURE_TYPE_MEMORY_BARRIER) + Vk.put_i32(mb, VkMemoryBarrier_srcAccessMask, VK_ACCESS_SHADER_WRITE_BIT) + Vk.put_i32(mb, VkMemoryBarrier_dstAccessMask, VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT) + Vk.cmd_pipeline_barrier(cb, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 1, mb, 0, null, 0, null) } # R3D_VK_PROBE=1: one dispatch over a GPU-owned buffer, read back - the compute path end to end diff --git a/packages/ludic.render3d/grass.ludic b/packages/ludic.render3d/grass.ludic index 88152c55..27641155 100644 --- a/packages/ludic.render3d/grass.ludic +++ b/packages/ludic.render3d/grass.ludic @@ -1,7 +1,7 @@ # ============================================================================ # grass.ludic — procedural GPU ground cover with continuous density (no rings). # -# The world is cut into 16 m cells; blade j of a cell always stands in the same place +# The world is cut into 4 m cells; blade j of a cell always stands in the same place # (shaders/grass.vert). Draws are per tile: the CPU walks tiles around the camera, # frustum-culls them, and feeds each visible tile as many blade indices per cell as its # NEAREST point could need; the vertex stage then keeps only the indices that exist at @@ -10,7 +10,7 @@ # draw count down — the cells and their hashes are the same in every tile size. # ============================================================================ -const GRASS_CELL: int = 16 +const GRASS_CELL: int = 4 # 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 @@ -89,11 +89,13 @@ function grass_blade_mesh(render3d_st: mut Render3dState, rows: int) -> Mesh { function grass_init(render3d_st: mut Render3dState) -> void { render3d_st.grass_merge = gpu_has_mdi(render3d_st) and not r3d_env_has(render3d_st, "R3D_GRASS_TILES") - var defs = "#define FOLIAGE\n#define BLADE\n" + var defs = "#define FOLIAGE\n#define BLADE\n#define GBLADE\n" if render3d_st.grass_merge { defs = defs + "#define TILES\n" render3d_st.grass_rec = words(GRASS_RECS * 5); render3d_st.grass_tv = floats(GRASS_RECS * 4); render3d_st.grass_chunk_tv = floats(GRASS_CHUNK * 4) render3d_st.grass_band_start = words(4); render3d_st.grass_band_cells = words(4) + render3d_st.grass_band_mesh = new []Mesh + for b in 0 .. 4 { push(render3d_st.grass_band_mesh, null) } render3d_st.grass_cmds = gpu_buffer_new(render3d_st) } render3d_st.grass_prog = r3d_program(render3d_st, "grass.vert", "model.frag", defs) @@ -101,6 +103,8 @@ function grass_init(render3d_st: mut Render3dState) -> void { # 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 # 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 @@ -108,14 +112,17 @@ function grass_init(render3d_st: mut Render3dState) -> void { # gets there, so the two have to agree or a shot shows something no player will see. # That is exactly how the last change measured as "no effect": the render was identical # 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 = 45.0 - render3d_st.grass_radius = 1600.0 + render3d_st.grass_d0 = 18.0 + render3d_st.grass_radius = 70.0 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) } # indices per 16 m cell that could exist at distance d (the count the shader computes) @@ -126,11 +133,13 @@ function grass_count_at(render3d_st: Render3dState, d: float) -> int { } # one tile size over one distance band -function grass_tiles(render3d_st: mut Render3dState, size: int, d_min: float, d_max: float) -> void { +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 + if d_min >= render3d_st.grass_radius { 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; render3d_st.grass_band_n += 1 + 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 + render3d_st.grass_band_mesh[render3d_st.grass_band_n] = blade; render3d_st.grass_band_n += 1 } else { u_i(render3d_st, gpu_uniform(render3d_st, p, "u_tile_cells"), cells) } @@ -161,7 +170,7 @@ function grass_tiles(render3d_st: mut Render3dState, size: int, d_min: float, d_ var inst = per * cells * cells if inst > 65535 { inst = 65535 } let r = render3d_st.grass_n * 5 - render3d_st.grass_rec[r] = render3d_st.grass_mesh.count; render3d_st.grass_rec[r + 1] = inst; render3d_st.grass_rec[r + 2] = 0; render3d_st.grass_rec[r + 3] = 0 + render3d_st.grass_rec[r] = blade.count; render3d_st.grass_rec[r + 1] = inst; render3d_st.grass_rec[r + 2] = 0; render3d_st.grass_rec[r + 3] = 0 render3d_st.grass_rec[r + 4] = ((render3d_st.grass_n - render3d_st.grass_band_start[render3d_st.grass_band_n - 1]) % GRASS_CHUNK) * 65536 let t = render3d_st.grass_n * 4 render3d_st.grass_tv[t] = ox; render3d_st.grass_tv[t + 1] = oz; render3d_st.grass_tv[t + 2] = float(per); render3d_st.grass_tv[t + 3] = 0.0 @@ -170,7 +179,7 @@ function grass_tiles(render3d_st: mut Render3dState, size: int, d_min: float, d_ } else if per > 0 { u_f2(render3d_st, gpu_uniform(render3d_st, p, "u_tile"), ox, oz) u_i(render3d_st, gpu_uniform(render3d_st, p, "u_per_cell"), per) - mesh_draw_instanced(render3d_st, render3d_st.grass_mesh, per * cells * cells) + mesh_draw_instanced(render3d_st, blade, per * cells * cells) render3d_st.grass_draws += 1 } } @@ -180,11 +189,27 @@ function grass_tiles(render3d_st: mut Render3dState, size: int, d_min: float, d_ } } +function grass_live(render3d_st: Render3dState) -> bool { return not render3d_st.grass_env_off and (render3d_st.grass_on or render3d_st.grass_force) and render3d_st.grass_prog != 0 } + function grass_draw(render3d_st: mut Render3dState) -> void { - if not (render3d_st.grass_on or render3d_st.grass_force) or render3d_st.ter_reflect or render3d_st.grass_prog == 0 { return } + if not grass_live(render3d_st) or render3d_st.ter_reflect { return } + if render3d_st.gg_on { gg_draw(render3d_st); return } var p = render3d_st.grass_prog if grass_mesh_live(render3d_st) { p = render3d_st.grass_mesh_prog } gpu_use_program(render3d_st, p) + grass_bind(render3d_st, p) + gpu_cull(render3d_st, false) + render3d_st.grass_draws = 0 + render3d_st.grass_n = 0 + render3d_st.grass_band_n = 0 + gpu_mesh_bind(render3d_st, render3d_st.grass_mesh) + grass_bands(render3d_st) + if render3d_st.grass_merge { grass_flush(render3d_st) } + gpu_cull(render3d_st, true) +} + +# the blades' uniforms, shared by the per-vertex path and the culled one (grass_gpu.ludic) +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) @@ -207,6 +232,9 @@ function grass_draw(render3d_st: mut Render3dState) -> void { u_f(render3d_st, gpu_uniform(render3d_st, p, "u_s0"), render3d_st.grass_s0) u_f(render3d_st, gpu_uniform(render3d_st, p, "u_d0"), render3d_st.grass_d0) u_f(render3d_st, gpu_uniform(render3d_st, p, "u_radius"), render3d_st.grass_radius) + var ph = render3d_st.post_h + if ph <= 0 { ph = gl_height() } + u_f(render3d_st, gpu_uniform(render3d_st, p, "u_px"), 2.0 * Math.tan(render3d_st.cam_fov * 0.5) / float(ph)) u_i(render3d_st, gpu_uniform(render3d_st, p, "u_dbg"), render3d_st.grass_dbg) var orthotex = render3d_st.ter_ortho_tex var oon = 1.0 @@ -230,16 +258,16 @@ function grass_draw(render3d_st: mut Render3dState) -> void { # 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) - gpu_cull(render3d_st, false) - render3d_st.grass_draws = 0 - render3d_st.grass_n = 0 - render3d_st.grass_band_n = 0 - gpu_mesh_bind(render3d_st, render3d_st.grass_mesh) - grass_tiles(render3d_st, 16, 0.0, 300.0) - grass_tiles(render3d_st, 64, 300.0, 1200.0) - grass_tiles(render3d_st, 256, 1200.0, render3d_st.grass_radius) - if render3d_st.grass_merge { grass_flush(render3d_st) } - gpu_cull(render3d_st, true) +} + +# 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) + grass_tiles(render3d_st, 16, 40.0, render3d_st.grass_radius, render3d_st.grass_mesh2) } # the records gathered this frame: uploaded once, then each band GRASS_CHUNK records a draw @@ -253,6 +281,8 @@ function grass_flush(render3d_st: mut Render3dState) -> void { var e = render3d_st.grass_n if b + 1 < render3d_st.grass_band_n { e = render3d_st.grass_band_start[b + 1] } if e > s { u_i(render3d_st, gpu_uniform(render3d_st, p, "u_tile_cells"), render3d_st.grass_band_cells[b]) } + let blade = render3d_st.grass_band_mesh[b] + if e > s and not mesh { gpu_mesh_bind(render3d_st, blade) } var k = s while k < e { var m = e - k @@ -275,7 +305,7 @@ function grass_flush(render3d_st: mut Render3dState) -> void { } } else { u_f4v(render3d_st, gpu_uniform(render3d_st, p, "u_tiles"), m, render3d_st.grass_chunk_tv) - gpu_draw_mesh_indirect(render3d_st, render3d_st.grass_mesh, render3d_st.grass_cmds, k * 20, m, 0, 0) + gpu_draw_mesh_indirect(render3d_st, blade, render3d_st.grass_cmds, k * 20, m, 0, 0) } if not mesh { render3d_st.grass_draws += 1 } k += m diff --git a/packages/ludic.render3d/grass_gpu.ludic b/packages/ludic.render3d/grass_gpu.ludic new file mode 100644 index 00000000..845ea613 --- /dev/null +++ b/packages/ludic.render3d/grass_gpu.ludic @@ -0,0 +1,154 @@ +# ============================================================================ +# grass_gpu.ludic — the meadow's blades culled on the GPU (Vulkan), drawn from what survived. +# +# grass.vert decided every blade per VERTEX: its hashes, the ground under it, whether anything +# grows there, its colour field - ten times for a five-row blade, and in full for every index a +# tile asked for and threw away. That was 3.5 ms of a MoltenVK frame. Here the CPU still walks the +# visible tiles (as grass_tiles does), but grass_cull.comp decides each candidate once and writes +# the survivors into three bands by distance, one indirect draw each; grass_inst.vert only bends +# and places the vertices. OpenGL keeps the per-vertex path. R3D_GRASS_GPU=0 does too, to compare. +# ============================================================================ + +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 + +function gg_cap(b: int) -> int { + if b == 0 { return 16384 } + if b == 1 { return 49152 } + return 163840 +} +function gg_base(b: int) -> int { + if b == 0 { return 0 } + if b == 1 { return 16384 } + return 65536 +} + +# once, after grass_init: the programs, the buffers and the three instanced blades +function gg_init(render3d_st: mut Render3dState) -> void { + if not gpu_has_compute(render3d_st) or render3d_st.grass_prog == 0 { return } + if r3d_env_has(render3d_st, "R3D_GRASS_GPU") and r3d_env(render3d_st, "R3D_GRASS_GPU") == "0" { return } + render3d_st.gg_reset = gpu_compute(render3d_st, "grass_reset", 1) + render3d_st.gg_cull = gpu_compute_tex(render3d_st, "grass_cull", 3, 2) + render3d_st.gg_prog = r3d_program(render3d_st, "grass_inst.vert", "model.frag", "#define FOLIAGE\n#define BLADE\n#define GBLADE\n#define GINST\n") + if render3d_st.gg_reset == 0 or render3d_st.gg_cull == 0 or render3d_st.gg_prog == 0 { return } + render3d_st.gg_tiles_buf = new []int + for k in 0 .. 2 { push(render3d_st.gg_tiles_buf, gpu_buffer_new(render3d_st)) } + render3d_st.gg_tv = floats(GG_TILES * 4) + render3d_st.gg_out = gpu_buffer_new(render3d_st) + 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)) + 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) + } + render3d_st.gg_cmds = gpu_buffer_new(render3d_st) + gpu_buffer_upload(render3d_st, render3d_st.gg_cmds, GG_BANDS * 20, data_of(rec), GPU_DYNAMIC) + gpu_buffer_gpu_owned(render3d_st, render3d_st.gg_cmds) + render3d_st.gg_on = true + print("r3d: grass: blades are culled on the GPU") +} + +# 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) + gpu_mesh_bind_instances(render3d_st, m, render3d_st.gg_out) + for k in 0 .. 4 { gpu_mesh_attr_inst(render3d_st, m, 3 + k, 4, GPU_F32, 64, k * 16) } + gpu_mesh_done(render3d_st, m) + return m +} + +# 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 >= render3d_st.grass_radius { return } + let cells = size / GRASS_CELL + let sz = float(size) + let half = sz * 0.5 + let reach = d_max + half * 1.5 + let corner_r = half * 1.42 + let tx0 = int(Math.floor((render3d_st.cam_pos[0] - reach) / sz)) + let tx1 = int(Math.floor((render3d_st.cam_pos[0] + reach) / sz)) + let tz0 = int(Math.floor((render3d_st.cam_pos[2] - reach) / sz)) + let tz1 = int(Math.floor((render3d_st.cam_pos[2] + reach) / sz)) + for tz in tz0 .. tz1 + 1 { + for tx in tx0 .. tx1 + 1 { + let ox = float(tx) * sz; let oz = float(tz) * sz + let dx = ox + half - render3d_st.cam_pos[0]; let dz = oz + half - render3d_st.cam_pos[2] + let dc = Math.sqrt(dx * dx + dz * dz) + let dnear = Math.max(dc - corner_r, 0.0) + if dc < d_min or not (dnear < d_max) or render3d_st.gg_n >= GG_TILES { continue } + if not cam_sphere_visible(render3d_st, ox + half, terrain_height(render3d_st, ox + half, oz + half), oz + half, corner_r + 6.0) { continue } + let per = grass_count_at(render3d_st, dnear) + var total = per * cells * cells + if total > 65535 { total = 65535 } + let t = render3d_st.gg_n * 4 + render3d_st.gg_tv[t] = ox; render3d_st.gg_tv[t + 1] = oz; render3d_st.gg_tv[t + 2] = float(total / (cells * cells)); render3d_st.gg_tv[t + 3] = float(cells) + if total > render3d_st.gg_max { render3d_st.gg_max = total } + render3d_st.gg_n += 1 + } + } +} + +# before the frame's first pass: the tiles, then the reset and the cull +function gg_cull_frame(render3d_st: mut Render3dState) -> void { + if not render3d_st.gg_on or not grass_live(render3d_st) { return } + render3d_st.gg_n = 0 + render3d_st.gg_max = 0 + gg_tiles(render3d_st, 4, 0.0, 16.0) + gg_tiles(render3d_st, 8, 16.0, 40.0) + gg_tiles(render3d_st, 16, 40.0, render3d_st.grass_radius) + let rb = words(4) + rb[0] = GG_BANDS; rb[1] = 0; rb[2] = 0; rb[3] = 0 + let cb = words(1) + cb[0] = render3d_st.gg_cmds + gpu_dispatch(render3d_st, render3d_st.gg_reset, data_of(rb), 16, 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] + gpu_buffer_upload(render3d_st, tb, render3d_st.gg_n * 16, data_of(render3d_st.gg_tv), GPU_DYNAMIC) + let pr = gg_params(render3d_st) + let bufs = words(3) + bufs[0] = tb; bufs[1] = render3d_st.gg_out; bufs[2] = render3d_st.gg_cmds + let texs = words(2) + texs[0] = render3d_st.ter_height_tex; texs[1] = render3d_st.ter_ortho_tex + gpu_dispatch_tex(render3d_st, render3d_st.gg_cull, data_of(pr), 192, bufs, texs, (render3d_st.gg_max + 63) / 64, render3d_st.gg_n) +} + +# grass_cull.comp's Params, std140: 12 vec4s +function gg_params(render3d_st: Render3dState) -> words { + let pr = words(48) + for i in 0 .. 48 { 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(render3d_st.grass_radius) + var ph = render3d_st.post_h + if ph <= 0 { ph = gl_height() } + pr[20] = float_bits(render3d_st.grass_s0); pr[21] = float_bits(render3d_st.grass_d0); pr[22] = float_bits(2.0 * Math.tan(render3d_st.cam_fov * 0.5) / float(ph)); pr[23] = float_bits(render3d_st.ter_snow_line) + pr[24] = float_bits(render3d_st.ter_lake_cx); pr[25] = float_bits(render3d_st.ter_lake_cz); pr[26] = float_bits(render3d_st.ter_lake_ex); pr[27] = float_bits(render3d_st.ter_lake_ez) + var lake = -100000.0 + if render3d_st.ter_lake_ex != 0.0 { lake = render3d_st.ter_lake_level } + var sea = lake + if render3d_st.ter_sea_set { sea = render3d_st.ter_sea_level } + var oon = 0.0 + 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) + for b in 0 .. GG_BANDS { pr[40 + b] = gg_base(b); pr[44 + b] = gg_cap(b) } + return pr +} + +# the survivors: one indirect draw per band, from the records grass_cull.comp counted into +function gg_draw(render3d_st: mut Render3dState) -> void { + let p = render3d_st.gg_prog + gpu_use_program(render3d_st, p) + grass_bind(render3d_st, p) + u_f(render3d_st, gpu_uniform(render3d_st, p, "u_time"), render3d_st.r3d_time) + gpu_cull(render3d_st, false) + for b in 0 .. GG_BANDS { gpu_draw_mesh_indirect(render3d_st, render3d_st.gg_mesh[b], render3d_st.gg_cmds, b * 20, 1, 0, 0) } + gpu_cull(render3d_st, true) +} diff --git a/packages/ludic.render3d/programs.ludic b/packages/ludic.render3d/programs.ludic index c3140758..ac82e165 100644 --- a/packages/ludic.render3d/programs.ludic +++ b/packages/ludic.render3d/programs.ludic @@ -51,6 +51,8 @@ function r3d_shader_src(render3d_st: mut Render3dState, name: string, defines: s if render3d_st.r3d_wind_src == null { render3d_st.r3d_wind_src = r3d_shader_file(render3d_st, "wind.glsl") } var s = "#version 410 core\n" + render3d_st.r3d_global_defs + defines + render3d_st.r3d_wind_src if is_frag { s = s + render3d_st.r3d_noise_src + render3d_st.r3d_lighting_src } + # a blade's colour field is worked out once per vertex, not once per pixel (grass.vert) + else if Text.contains(defines, "#define GBLADE") { s = s + render3d_st.r3d_noise_src } return s + r3d_shader_file(render3d_st, name) } diff --git a/packages/ludic.render3d/r3d.ludic b/packages/ludic.render3d/r3d.ludic index 135ce808..55fa9d89 100644 --- a/packages/ludic.render3d/r3d.ludic +++ b/packages/ludic.render3d/r3d.ludic @@ -31,6 +31,7 @@ import "scatter.ludic" import "actor.ludic" import "stream.ludic" import "grass.ludic" +import "grass_gpu.ludic" import "water.ludic" import "streamline.ludic" import "render.ludic" diff --git a/packages/ludic.render3d/render.ludic b/packages/ludic.render3d/render.ludic index 0fcd601e..fb98638f 100644 --- a/packages/ludic.render3d/render.ludic +++ b/packages/ludic.render3d/render.ludic @@ -58,6 +58,7 @@ function r3d_env_flags(render3d_st: mut Render3dState) -> void { render3d_st.sc_skip_blade = r3d_env_has(render3d_st, "R3D_NOBLADES") render3d_st.sc_skip_grass = r3d_env_has(render3d_st, "R3D_NOGRASS") render3d_st.grass_force = r3d_env_has(render3d_st, "R3D_BLADES") + render3d_st.grass_env_off = r3d_env_has(render3d_st, "R3D_NOBLADES") render3d_st.sc_skip_card = r3d_env_has(render3d_st, "R3D_NOCARDS") render3d_st.sc_dbg_lod = r3d_env_has(render3d_st, "R3D_LODDBG") if r3d_env_has(render3d_st, "R3D_ANISO") { @@ -208,6 +209,7 @@ function r3d_frame(render3d_st: mut Render3dState, time: float) -> void { prof_cpu_mark(render3d_st, "shadow rebake") stream_update_all(render3d_st) prof_cpu_mark(render3d_st, "streaming") + gg_cull_frame(render3d_st) # before any pass: a dispatch inside one would split it if not render3d_st.r3d_no_shadow { prof_begin(render3d_st, "shadow"); shadow_pass(render3d_st); prof_end(render3d_st) } prof_cpu_mark(render3d_st, "shadow pass") if render3d_st.water_on and not render3d_st.r3d_no_refl and water_reflect_visible(render3d_st) { prof_begin(render3d_st, "water reflection"); water_reflection_pass(render3d_st); prof_end(render3d_st) } diff --git a/packages/ludic.render3d/scatter.ludic b/packages/ludic.render3d/scatter.ludic index 005549b3..2f24fe8d 100644 --- a/packages/ludic.render3d/scatter.ludic +++ b/packages/ludic.render3d/scatter.ludic @@ -36,7 +36,7 @@ property Layer { last_cam: floats, rough: float = 0.0, blade: bool = false, - grass: bool = false, # ground-cover grass the game may hand to the GPU blades (R3D_NOGRASS skips it) + grass: bool = false, # ground cover the GPU blades replace: skipped while they draw (and under R3D_NOGRASS) flower: bool = false, card: bool = false, cheap: bool = false, # distant cover: no shadows, no wind, flat lighting @@ -1135,7 +1135,7 @@ function scatter_draw_depth(render3d_st: mut Render3dState) -> void { for i in 0 .. len(render3d_st.sc_layers) { let l = render3d_st.sc_layers[i] if not l.foliage or l.blade or l.flower { continue } - if render3d_st.sc_skip_grass and l.grass { continue } + if l.grass and sc_grass_replaced(render3d_st) { continue } if render3d_st.r3d_no_trees and l.imp != null { continue } layer_update(render3d_st, l) if l.n_lods > 1 and l.g_on { @@ -1151,13 +1151,15 @@ function scatter_draw_depth(render3d_st: mut Render3dState) -> void { } gpu_cull(render3d_st, true) } +# a layer the game flagged `grass` is ground cover the GPU blades stand in for: off while they draw +function sc_grass_replaced(render3d_st: Render3dState) -> bool { return render3d_st.sc_skip_grass or ((render3d_st.grass_on or render3d_st.grass_force) and not render3d_st.grass_env_off and render3d_st.grass_prog != 0) } function scatter_draw(render3d_st: mut Render3dState) -> void { for i in 0 .. len(render3d_st.sc_layers) { let l = render3d_st.sc_layers[i] if render3d_st.sc_skip_blade and l.blade { continue } if render3d_st.sc_skip_flower and l.flower { continue } if render3d_st.sc_skip_card and l.card { continue } - if render3d_st.sc_skip_grass and l.grass { continue } + if l.grass and sc_grass_replaced(render3d_st) { continue } if render3d_st.r3d_no_trees and l.imp != null and not l.card { continue } layer_update(render3d_st, l) layer_draw_near(render3d_st, l, false, null, false) @@ -1175,7 +1177,7 @@ function scatter_draw_casters(render3d_st: mut Render3dState, light_vp: floats) let l = render3d_st.sc_layers[i] if render3d_st.sc_skip_blade and l.blade { continue } if render3d_st.sc_skip_card and l.card { continue } - if render3d_st.sc_skip_grass and l.grass { continue } + if l.grass and sc_grass_replaced(render3d_st) { continue } if render3d_st.r3d_no_trees and l.imp != null and not l.card { continue } layer_update(render3d_st, l) if l.imp != null { diff --git a/packages/ludic.render3d/shaders/compute.list b/packages/ludic.render3d/shaders/compute.list index 10bd7bd4..fafa1bcb 100644 --- a/packages/ludic.render3d/shaders/compute.list +++ b/packages/ludic.render3d/shaders/compute.list @@ -2,3 +2,5 @@ # spv/.comp.spv. Binding 0 is the uniform block of parameters, 1.. storage buffers. probe|probe.comp scatter_cull|scatter_cull.comp +grass_reset|grass_reset.comp +grass_cull|grass_cull.comp diff --git a/packages/ludic.render3d/shaders/grass.mesh b/packages/ludic.render3d/shaders/grass.mesh index 60f50ce0..b172254d 100644 --- a/packages/ludic.render3d/shaders/grass.mesh +++ b/packages/ludic.render3d/shaders/grass.mesh @@ -31,6 +31,7 @@ uniform vec4 u_tiles[256]; // per tile of the dispatch: corner x, corner z, in uniform float u_s0; uniform float u_d0; uniform float u_radius; +uniform float u_px; // one pixel in radians (grass.vert) uniform int u_dbg; out vec3 v_wpos[]; out vec3 v_nrm[]; @@ -40,7 +41,7 @@ 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 = 16.0; +const float CELL = 4.0; // grass.ludic GRASS_CELL: 4 m, so a near tile asks for what its blades need 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) { @@ -115,6 +116,7 @@ void main() { float tall = mix(0.18, 0.42, h3) * mix(0.8, 1.2, hash1(cid * 0.1)) * (1.0 + 0.35 * smoothstep(1.0, 12.0, grow)) * life; float bw = 0.028 * mix(1.0, 0.45 * grow, smoothstep(1.0, 4.0, grow)); if (far) { bw = max(bw, spacing * 0.35); tall = min(tall, spacing * 0.3); } + bw = max(bw, dist * u_px * 1.1); float gust = sin(xz.x * 0.09 + u_time * 1.1) * 0.5 + sin(xz.y * 0.13 - u_time * 0.8 + xz.x * 0.05) * 0.5; float ph = u_time * 1.7 + seed * 6.2831 + xz.x * 0.05 + xz.y * 0.07; float sway = (sin(ph) * 0.6 + sin(ph * 2.3 + 1.0) * 0.4 + gust) * u_wind; diff --git a/packages/ludic.render3d/shaders/grass.vert b/packages/ludic.render3d/shaders/grass.vert index 03475942..32f75c16 100644 --- a/packages/ludic.render3d/shaders/grass.vert +++ b/packages/ludic.render3d/shaders/grass.vert @@ -34,6 +34,7 @@ uniform vec4 u_tiles[256]; // per tile of the draw: corner x, corner z, indice uniform float u_s0; // blade spacing at the camera (m) 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 out vec3 v_wpos; out vec3 v_nrm; @@ -42,9 +43,10 @@ out float v_seed; out vec2 v_rot; 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 = 16.0; -float hash1(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123); } +const float CELL = 4.0; // grass.ludic GRASS_CELL: 4 m, 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 // streaks across the meadow with an edge wherever they thinned out. @@ -68,7 +70,22 @@ float heightSmooth(sampler2D tex, vec2 uv) { return (texture(tex, vec2(o0.x, o0.y)).r * s0.x + texture(tex, vec2(o1.x, o0.y)).r * s1.x) * s0.y + (texture(tex, vec2(o0.x, o1.y)).r * s0.x + texture(tex, vec2(o1.x, o1.y)).r * s1.x) * s1.y; } -void cull() { gl_Position = vec4(0.0, 0.0, 2.0, 1.0); v_wpos = vec3(0.0); v_nrm = vec3(0.0, 1.0, 0.0); v_uv = vec2(0.0); v_seed = 0.0; v_rot = vec2(0.0, 1.0); v_hull = 1.0; v_quake = 0.0; } +void cull() { gl_Position = vec4(0.0, 0.0, 2.0, 1.0); v_wpos = vec3(0.0); v_nrm = vec3(0.0, 1.0, 0.0); v_uv = vec2(0.0); v_seed = 0.0; v_rot = vec2(0.0, 1.0); v_hull = 1.0; v_quake = 0.0; v_tint = vec3(1.0); } +// lighting.glsl's regionTint(wpos, 0.35) times model.frag's patchiness, at the root: three fbm +// fields a blade pixel used to pay for, when the whole blade stands on one spot +vec3 bladeField(vec2 xz, float y) { + float n = fbm(xz * 0.0018 + 4.0, 3) * 0.5 + 0.5; + float aspen = smoothstep(0.52, 0.7, n) * smoothstep(520.0, 250.0, y); + float dry = smoothstep(0.35, 0.15, fbm(xz * 0.004 + 9.0, 3) * 0.5 + 0.5); + vec3 t = mix(vec3(1.0), vec3(1.25, 1.3, 0.85), aspen * 0.35); + t = mix(t, vec3(1.15, 1.05, 0.7), dry * 0.35 * 0.6); + float patchy = fbm(xz * 0.045, 3) * 0.5 + 0.5; + t *= mix(vec3(0.7, 0.8, 0.55), vec3(1.1, 1.05, 0.85), patchy); + // dry and green patches a few metres across, and the tussocks' own shade of the same green + float dryp = smoothstep(0.2, 0.8, gnoise(xz * 0.33 + 17.0) * 0.5 + 0.5); + t *= mix(vec3(0.92, 1.0, 0.95), vec3(1.30, 1.10, 0.62), dryp); + return t * (0.72 + 0.56 * (gnoise(xz * 1.9 + 41.0) * 0.5 + 0.5)); +} void main() { #ifdef TILES @@ -158,6 +175,10 @@ void main() { // 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; + // 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)); // 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 @@ -165,6 +186,9 @@ void main() { // and too flat" note in this stage. float bw = 0.010 * mix(1.0, 0.45 * 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 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 @@ -217,6 +241,7 @@ void main() { v_seed = seed; v_rot = vec2(s, c_); v_quake = 0.0; + v_tint = bladeField(xz, h); v_hull = (dist > 2.0 || far || (u_dbg & 2) != 0) ? -1.0 : 1.0; // no back-face flip, no rounding past arm's reach gl_Position = u_proj * u_view * vec4(w, 1.0); } diff --git a/packages/ludic.render3d/shaders/grass_cull.comp b/packages/ludic.render3d/shaders/grass_cull.comp new file mode 100644 index 00000000..4f4567ad --- /dev/null +++ b/packages/ludic.render3d/shaders/grass_cull.comp @@ -0,0 +1,123 @@ +// grass_cull.comp - the meadow's blades, decided once a frame on the GPU (Vulkan). +// +// grass.vert used to do all of this per VERTEX: every blade's hashes, its place, the ground under +// it (a four-tap bicubic height), the photograph's say on whether anything grows there, the water, +// the slope, the snow line and its colour field - ten times over for a five-row blade, and in full +// for every index a tile asked for and then threw away. Here each candidate is one invocation: a +// workgroup row per visible tile (grass.ludic walks them as before), a thread per candidate blade. +// A blade that survives is written once, as four vec4s, into its band's region, and the band's +// indirect draw count goes up by one; grass_inst.vert only bends and places the vertices. +// The rules are grass.vert's, kept in step with it: the same hashes give the same meadow. +layout(local_size_x = 64) in; + +layout(set = 0, binding = 0) uniform Params { + vec4 planes[4]; // the side frustum planes: xyz in, w distance + vec4 cam; // xyz the camera, w no blades past this (u_radius) + vec4 dens; // x s0, y d0, z one pixel in radians, w the snow line + vec4 lake; // the carved lake: centre x/z, half extents (z = 0: none) + vec4 lev; // x the lake's level, y the sea's, z the photograph on (1), w unused + vec4 ts; // the height texture: origin x/z, half extent, unused + vec4 bands; // outer distance of bands 0 and 1 (x, y); band 2 is the rest + uvec4 base; // each band's first record in Out + uvec4 cap; // ... and how many it holds +} pr; + +layout(set = 0, binding = 1) readonly buffer Tiles { vec4 tiles[]; }; // corner x/z, indices per cell, cells per side +layout(set = 0, binding = 2) buffer Out { vec4 outv[]; }; // 4 per blade +layout(set = 0, binding = 3) buffer Cmds { uint cmds[]; }; // VkDrawIndexedIndirectCommand per band +layout(set = 0, binding = 4) uniform sampler2D u_height; // height, normal (terrain's u_ts_height) +layout(set = 0, binding = 5) uniform sampler2D u_ortho; // the photograph + +const float CELL = 4.0; // grass.ludic GRASS_CELL + +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) { + uint h = pcg(uint(cell.x + 32768) * 73856093u ^ uint(cell.y + 32768) * 19349663u ^ uint(j) * 83492791u ^ uint(k) * 2654435761u); + return float(h) * (1.0 / 4294967295.0); +} +float heightSmooth(vec2 uv) { + vec2 res = vec2(textureSize(u_height, 0)); + vec2 t = uv * res - 0.5; + vec2 f = fract(t); + vec2 i = floor(t); + vec2 w0 = (1.0 - f) * (1.0 - f) * (1.0 - f) / 6.0; + vec2 w1 = (4.0 - 6.0 * f * f + 3.0 * f * f * f) / 6.0; + vec2 w3 = f * f * f / 6.0; + vec2 w2 = 1.0 - w0 - w1 - w3; + vec2 s0 = w0 + w1, s1 = w2 + w3; + vec2 o0 = (i - 1.0 + w1 / s0 + 0.5) / res; + vec2 o1 = (i + 1.0 + w3 / s1 + 0.5) / res; + return (textureLod(u_height, vec2(o0.x, o0.y), 0.0).r * s0.x + textureLod(u_height, vec2(o1.x, o0.y), 0.0).r * s1.x) * s0.y + + (textureLod(u_height, vec2(o0.x, o1.y), 0.0).r * s0.x + textureLod(u_height, vec2(o1.x, o1.y), 0.0).r * s1.x) * s1.y; +} +// grass.vert's bladeField: the region, the patchiness, the dry patches and the tussocks' shade +vec3 bladeField(vec2 xz, float y) { + float n = fbm(xz * 0.0018 + 4.0, 3) * 0.5 + 0.5; + float aspen = smoothstep(0.52, 0.7, n) * smoothstep(520.0, 250.0, y); + float dry = smoothstep(0.35, 0.15, fbm(xz * 0.004 + 9.0, 3) * 0.5 + 0.5); + vec3 t = mix(vec3(1.0), vec3(1.25, 1.3, 0.85), aspen * 0.35); + t = mix(t, vec3(1.15, 1.05, 0.7), dry * 0.35 * 0.6); + float patchy = fbm(xz * 0.045, 3) * 0.5 + 0.5; + t *= mix(vec3(0.7, 0.8, 0.55), vec3(1.1, 1.05, 0.85), patchy); + float dryp = smoothstep(0.2, 0.8, gnoise(xz * 0.33 + 17.0) * 0.5 + 0.5); + t *= mix(vec3(0.92, 1.0, 0.95), vec3(1.30, 1.10, 0.62), dryp); + return t * (0.72 + 0.56 * (gnoise(xz * 1.9 + 41.0) * 0.5 + 0.5)); +} + +void main() { + vec4 tile = tiles[gl_WorkGroupID.y]; + int per_cell = int(tile.z + 0.5); + int cells = int(tile.w + 0.5); + int i = int(gl_GlobalInvocationID.x); + if (per_cell <= 0 || i >= per_cell * cells * cells) return; + int c = i / per_cell; + int j = i - c * per_cell; + vec2 cell = tile.xy + vec2(float(c % cells), float(c / cells)) * CELL; + vec2 cid = floor(cell / CELL + 0.5); + ivec2 ci = ivec2(cid); + vec2 hv = vec2(bladeHash(ci, j, 0), bladeHash(ci, j, 1)); + vec2 xz = cell + hv * CELL; + float dist = length(xz - pr.cam.xz); + float radius = pr.cam.w; + if (dist >= radius) return; + float spacing = pr.dens.x * (1.0 + dist / pr.dens.y); + float count = CELL * CELL / (spacing * spacing) * (1.0 - smoothstep(radius * 0.7, radius, dist)); + float keep = count / float(max(per_cell, 1)); + float r = bladeHash(ci, j, 5); + if (r > keep) return; + float life = 1.0 - smoothstep(keep * 0.75, keep, r); + vec2 huv = (xz - pr.ts.xy) / (2.0 * pr.ts.z) + 0.5; + if (huv.x < 0.0 || huv.x > 1.0 || huv.y < 0.0 || huv.y > 1.0) return; + vec4 ht = textureLod(u_height, huv, 0.0); + // the frustum, on a sphere round the blade (it stands at most 0.9 m tall) + vec3 root = vec3(xz.x, ht.r, xz.y); + for (int k = 0; k < 4; k++) { if (dot(pr.planes[k].xyz, root) + pr.planes[k].w < -1.0) return; } + vec3 gn = normalize(ht.gba); + 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); + if (pr.lev.z > 0.5) { + vec3 oc = textureLod(u_ortho, huv, 1.5).rgb; + ok *= 0.40 + 0.60 * smoothstep(0.0, 0.025, oc.g - oc.b); + } + if (h4 > ok) return; + float h = heightSmooth(huv); + float seed = hv.x * 0.7 + hv.y * 0.3; + 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)); + 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); + if (slot >= pr.cap[b]) { atomicAdd(cmds[b * 5u + 1u], 0xFFFFFFFFu); return; } + 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 + 3u] = vec4(gn, dist); +} diff --git a/packages/ludic.render3d/shaders/grass_inst.vert b/packages/ludic.render3d/shaders/grass_inst.vert new file mode 100644 index 00000000..c501ed90 --- /dev/null +++ b/packages/ludic.render3d/shaders/grass_inst.vert @@ -0,0 +1,71 @@ +// grass_inst.vert - a blade grass_cull.comp has already decided on (Vulkan). Everything about the +// blade - where it stands, its facing, height, width, colour field and the ground under it - is its +// instance record; this only bends, sways, pushes and stands the vertices, as grass.vert's second +// half does, so the two draw the same meadow. +layout(location = 0) in vec3 a_pos; // x: -0.5..0.5 across, y: 0..1 along the blade, z: bend +layout(location = 2) in vec2 a_uv; +layout(location = 3) in vec4 i_root; // xyz the root, w the seed +layout(location = 4) in vec4 i_shape; // sin and cos of the yaw, height, width +layout(location = 5) in vec4 i_tint; // the colour field, and how far the tip arches +layout(location = 6) in vec4 i_ground; // the ground's normal, and the distance it was decided at +uniform mat4 u_view; +uniform mat4 u_proj; +uniform float u_time; +uniform float u_wind; +uniform vec3 u_push; // x, z, radius: a body standing in the grass +uniform int u_dbg; // R3D_GRASS_DBG (2: light as ground everywhere) +out vec3 v_wpos; +out vec3 v_nrm; +out vec2 v_uv; +out float v_seed; +out vec2 v_rot; +out float v_hull; +out float v_quake; +out vec3 v_tint; + +void main() { + vec2 xz = i_root.xz; + float seed = i_root.w; + float s = i_shape.x, c_ = i_shape.y, tall = i_shape.z, bw = i_shape.w; + vec3 gn = i_ground.xyz; + float dist = i_ground.w; + vec3 p = vec3(a_pos.x * bw, a_pos.y * tall, a_pos.z * tall * i_tint.w); + vec3 n = vec3(0.0, 0.3, 1.0); + float ph = u_time * 1.7 + seed * 6.2831 + xz.x * 0.05 + xz.y * 0.07; + float sway = windSway(xz, u_time, ph, 0.0) * u_wind; + float hgt = max(p.y, 0.0); + p.x += sway * hgt * hgt * 0.35; + p.z += sway * hgt * hgt * 0.15 * cos(ph * 0.7); + p = vec3(c_ * p.x + s * p.z, p.y, -s * p.x + c_ * p.z); + if (u_push.z > 0.0) { + vec2 away = xz - u_push.xy; + float pd = length(away); + float push = smoothstep(u_push.z, u_push.z * 0.2, pd); + if (push > 0.0) { + vec2 pdir = (pd > 1e-3) ? away / pd : vec2(1.0, 0.0); + float bh = max(p.y, 0.0); + p.x += pdir.x * push * bh * 1.05; + p.z += pdir.y * push * bh * 1.05; + p.y -= push * bh * 0.40; + } + } + n = normalize(vec3(c_ * n.x + s * n.z, n.y, -s * n.x + c_ * n.z)); + vec3 k = cross(vec3(0.0, 1.0, 0.0), gn); + float sk = length(k), ck = gn.y; + if (sk > 1e-4) { + k /= sk; + p = p * ck + cross(k, p) * sk + k * dot(k, p) * (1.0 - ck); + n = normalize(n * ck + cross(k, n) * sk + k * dot(k, n) * (1.0 - ck)); + } + n = normalize(mix(n, gn, smoothstep(2.0, 12.0, dist))); + vec3 w = i_root.xyz + p; + v_wpos = w; + v_nrm = n; + v_uv = a_uv; + v_seed = seed; + v_rot = vec2(s, c_); + v_quake = 0.0; + v_tint = i_tint.rgb; + v_hull = (dist > 2.0 || (u_dbg & 2) != 0) ? -1.0 : 1.0; + gl_Position = u_proj * u_view * vec4(w, 1.0); +} diff --git a/packages/ludic.render3d/shaders/grass_reset.comp b/packages/ludic.render3d/shaders/grass_reset.comp new file mode 100644 index 00000000..f810b0bc --- /dev/null +++ b/packages/ludic.render3d/shaders/grass_reset.comp @@ -0,0 +1,8 @@ +// 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. +layout(local_size_x = 1) in; +layout(set = 0, binding = 0) uniform Params { uvec4 n; } 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; } +} diff --git a/packages/ludic.render3d/shaders/model.frag b/packages/ludic.render3d/shaders/model.frag index 41257a24..d6356ab3 100644 --- a/packages/ludic.render3d/shaders/model.frag +++ b/packages/ludic.render3d/shaders/model.frag @@ -15,6 +15,9 @@ uniform mat4 u_view; uniform vec3 u_tint; uniform float u_rough_scale; uniform float u_emissive; // self-lit (a flame): albedo added back after shading +#ifdef GBLADE +in vec3 v_tint; // grass.vert's colour field (the mesh-shader and scatter blades work it out here) +#endif #ifdef BLADE uniform vec3 u_blade_base; uniform vec3 u_blade_tip; @@ -49,6 +52,11 @@ void main() { #endif vec3 N = normalize(v_nrm); if (!gl_FrontFacing && v_hull >= 0.0) N = -N; +#ifdef BLADE + // A blade is thin and two-sided: the sun lights whichever face it reaches (the other glows + // through, below). Faced away from the sun, half the meadow was lit by the sky alone. + if (dot(N, u_sun_dir) < 0.0) N = -N; +#endif #ifdef CARD // a baked card: albedo with coverage (premultiplied mips), normal in the card's own frame vec4 ca = texture(u_diff, v_uv); @@ -80,7 +88,16 @@ void main() { #ifdef BLADE // a procedural blade: dark at the root, lighter at the tip; some blades gone to seed float t = clamp(v_uv.y, 0.0, 1.0); - alb = mix(u_blade_base, u_blade_tip, t * t) * regionTint(v_wpos, 0.35); + // most of a blade is its own green, only the sheath darker: t*t held the lower two thirds at the + // root colour (0.14, darker than the ground), and a meadow of those reads as dark wire +#ifndef GBLADE + vec3 field = regionTint(v_wpos, 0.35); + float patchy = fbm(v_wpos.xz * 0.045, 3) * 0.5 + 0.5; + field *= mix(vec3(0.7, 0.8, 0.55), vec3(1.1, 1.05, 0.85), patchy); +#else + 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); // A REAL BLADE, if the game gave us one. Each blade picks a column of the atlas from @@ -110,13 +127,13 @@ void main() { vec3 g = photo * (1.0 / 0.3736); alb *= mix(vec3(1.0), min(g, vec3(1.15)), 0.85); } - float patchy = fbm(v_wpos.xz * 0.045, 3) * 0.5 + 0.5; - alb *= mix(vec3(0.7, 0.8, 0.55), vec3(1.1, 1.05, 0.85), patchy); // 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) * regionTint(v_wpos, 0.35) * mix(vec3(0.7, 0.8, 0.55), vec3(1.1, 1.05, 0.85), patchy) * 0.72; + if (v_hull < 0.0) alb = mix(u_blade_base, u_blade_tip, 0.45) * field * 0.72; // 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); + // and a sward is lit as a mass leaning to the sky: a level normal took the light at a graze + n = normalize(n + vec3(0.0, 0.45, 0.0)); // A blade's own ambient occlusion. This was mix(0.2, 1.0, t*t): 80% occluded at the // sheath and still 60% at half height, because t*t holds the curve down. Measured in a // walking-distance shot the blades came out at 24-31 of 255 against a ground of 143 - @@ -227,6 +244,13 @@ void main() { #else float shadow = mix(1.0, sunShadow(v_wpos + N * 0.1 + vec3(0.0, 0.2, 0.0), N, viewDepth), 0.55); #endif +#elif defined(BLADE) + // A blade stands within a shadow texel of the ground under it, and biased along its own + // (level) normal it read the terrain as its caster: the whole meadow in shadow, dark wire. + // Looked up a hand's width up, along the ground's up, trees and rocks still shade it. + // past arm's length a blade is a pixel or two wide: one tap is what a soft filter averages to + float shadow = (dist < 8.0) ? sunShadow(v_wpos + vec3(0.0, 0.25, 0.0), vec3(0.0, 1.0, 0.0), viewDepth) + : sunShadowCheap(v_wpos + vec3(0.0, 0.25, 0.0), vec3(0.0, 1.0, 0.0), viewDepth); #else float shadow = sunShadow(v_wpos, N, viewDepth); #endif @@ -271,6 +295,9 @@ void main() { float NoV = max(dot(n, vv), 0.0); float sheen = pow(NoH, 26.0) * 0.55 + pow(1.0 - NoV, 4.0) * 0.05; sheen *= smoothstep(0.10, 0.42, NoV); +#ifdef BLADE + sheen *= 0.2; // a sward seen from above is tips edge-on to the sun: the leaf's glint frosted them white +#endif col += u_sun_color * sheen * shadow * cloudShadow(v_wpos) * 0.4 * (0.45 + 0.55 * arm.r); } #endif diff --git a/packages/ludic.render3d/shaders/spv/7ed7de52.frag.spv b/packages/ludic.render3d/shaders/spv/7ed7de52.frag.spv deleted file mode 100644 index b54d682d4860e41661e5142488d5bbe0bb0dbf33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50184 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 F{eSF6mYVigKf{mtt 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 literal 0 HcmV?d00001 diff --git a/packages/ludic.render3d/shaders/spv/b20fdcb5.vert.spv b/packages/ludic.render3d/shaders/spv/b20fdcb5.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..3744bcf96b1f502ba7ce566778acccb002a72224 GIT binary patch literal 11708 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 literal 0 HcmV?d00001 diff --git a/packages/ludic.render3d/shaders/spv/b8cff226.frag.spv b/packages/ludic.render3d/shaders/spv/b8cff226.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..a7862f95f0c31c2c3b60650ed2683a3c2e3f43aa GIT binary patch literal 48492 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 literal 0 HcmV?d00001 diff --git a/packages/ludic.render3d/shaders/spv/cb13f3c6.frag.spv b/packages/ludic.render3d/shaders/spv/cb13f3c6.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..a7862f95f0c31c2c3b60650ed2683a3c2e3f43aa GIT binary patch literal 48492 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 XEhT+^f@ZGvX-wnj>oblvpK<;lp!8OT literal 50184 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 YntE~#0UN8HTuXu73)*}Zm-{UKe@#});Q#;t literal 27528 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 L=CiomXYv07eLl54 diff --git a/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv b/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv index 071188aa1fa1626e84b4ece6dcd1c535b11ee902..21e807a8ee5e8a123e5b65821ca5c924df884b2f 100644 GIT binary patch literal 53292 zcmZ{t2b^71^|mj}B!u33aY7AMdM^niG?CuhWRgshkx3y95R`-_D7{ISB1Ms2M7jhJ zl#Ytn1;m1&f)o+qd!BR8d$V)@e)q?Azwf)&UVH6w_Br?55jy5wZN5fhp2mWWL5&v% zHLB0zjd@WT4eO1m7iiCU^%ow}z zHu`il7C@U!(Y`44xQUbcruH@+v@cTFmjRC*HK8*0ZM03*eyNtdqp>u2(&%aEgBmM? zr;hI#GwGQ9dnTvFSQ_y$?h4e?XEgDO;L)|d67`hcvG@#VtOlOiGtq1|v7zl&rEdBT zY^(+DJ$icIl-|+P4mhysrO%q^V=DiFjdiKVO_?-(;+SFmqlQfzVhZ}KgMM7)GpMlv z_0*$|+il8}o-utr6G!*%+jC6W=la-Pm;uc4M(w_}qcL6Frr-RH&6|FEGnT&oX}wc= z$0TTT67=5`pD7gAYBTYq>Ep&%d{ARs>amP$kG^r^r&WD83C)Sne=F?AOrA8Asv6JM z)Xly-8_rcv|ES(Ele7(L41 zX}GvGrh$#!;lsOk+2vqYp*amz?z^JzIce7l?*{InIM;hqAK1O$guZFx>lSn7?u%8M z1FJTBR(OvJ?*&f#1He0X?>BmUf8Xe%j8N>O{jeQa_qjiKEQ>dwF@NK*vdz9GpN4b# zJ{X@pCpG&%q}8^waVU7scn36&g!he`$OL({HP`6~>gM$}Ut<(_bkEe$J!9B$6UX%q z@uI5z97A)T&)4XkhzGxOvU(*E3;qe-+Omo4IS_-fH@GHu}JG z)_g$YOYl*BJyQ>wG^M|J?aW`TV;!%5(&SdSgsft^=Mt0cR>bV6#+f~NG`49y6P;?> z&DY@4Z*W;m;mF&sIwo4zQDx zft!0n+knRT@VVz?P~%elCr|D_Zs$qk+NQXQcQN+SllsA(jc5A5M;fB&Lx z&RIv}LvZta>u7umZsye4SYV#AZ|+_2>D`$j;|yvXjyA5pdwB2Ip6UJ54w%?CcG8py zJN8c+&4oLVYeKu9>D~3I&^^PWqGi)O$2N6xf8Vs0&HMfw+Z2zJmaSth+cb|5Yy+$Q zIx8DjSNE7c#}$1*OJ{{9O=;-^>sS-In>U|<^|*ZgnBF}(x4Z8C-Wk39Okl<}sIrfp zG_HG0@5HHn)4W~>a^5=T`CGQ}z25G+$M*F1Pa5kIxBB%tWqP;mNA*nQKun$sR{H4v zzRBH&Z1uNLrB9vQJGz?#w%;SP)n?(Q?Wp6rr%ZB#CC5c7z4^4z&4mGN*%ocHb&v0B z*%m8p>U07v{`PBt=bfcwfr1?^rVS%_E+^R*Io57rMG9aM{KMA6{|MW zrgl%7(l?IB+r;uYZ+bWS_?~_jdLUPbd%@?%N}r@}^O{(t(zsYg_vXrI**;g+YM##+b%EsFjn?md!mjrgv(O*H&|#R;%<0lg9M+cRRSm zU%k>j_2y`6RN6Gob+u-nYgSryvbHv3V*3m`y}Nfp-_)snGm1QiRQjlXPWgJr8?Twq z+J$Xe-{e+5KGRO`Znj}jJ-%ADbqgCOKsVD{ooz>YsPGwp=W*ca-F>ac;HKW$I39h@ zx!Tb3cxqNo{k^nJUg7(3;OI9gRPMr)=De^ENp5u6Mz#cICeihh_Yi0LOn>aQs&S$N%%- z(bXJvH1-B(?1zBo(3RVqp>l3G(DKdX5gvyKHC!PX{$a=y=vdl*ipS_Or`G&&OQDxu(tr8 zEvBna9MgMjAkcPuBPmARkN#!s7zcQnp}Pdm1m^Z9exIvW?k{g&1oQ%B=!_%ZeV zzN^jmo;Lpdxp+t8F?hb$z71}Ub3o%A^=?j^`jNnScn{6{fp|dYoIN%WoOxItoV-^6 z&lz(^V`X^Oc|C1)tj)pAemfh7%+;o|abz3sY2%~Y_}IC4N24D;y6$Hhc-pZWl0VPv zbNO{PPHN+)w(-;E;vJ1M;2HB3;5{e#eXg@{EqKoNhK|N<@Qm$t@SOSRY~0z#?{4Gw zw(%dpd&lsgRFCH&c=H+}zKdjf30T9oohZZ{yu?JtgB!*3>*1MxITVC6qZrXO@Ybh~18!y4jd3d>v{|wHz zr&g>t;mvD^i<~b-GrF7KYRzv!_?~q?zT2JAJ#k9&yXwH|J#Te?oiuUU&OM|1CX%fE z`|fu}_xS1kbv|pt=X@_7&{$9VT<Q&8a~*Dlmih2q@{DfpQq4Yg zfRF9#t>61}Hip8>G4I&MhgW>s=<$5xGRIxp?7PjyI~oVV{W|3wj0WeN@_qJI1$csYvp$acoZob|03|@@sp;p-QWWn7sKvK?dOUZ7r}m9ur|RF) zcmSSr@+EK&vu<49rO)U-dV0@MUROLj!jG=oyamoWb_^n3^^&SN-i6@h{4CtY7ir^5 zweh9f_%dyL1$gysVdrN4E5e)e!ZTc(?<#G)tBtSP##e9SYqaqpZG4@%ct>M>c=LYI z+1La;s>in%&3V}de$12}A4977-3dNzeDgOA=eq}9&fEC8ct_)C_>B75_89Q^@y+pn z1)TT8Cso*Yubqvrfv1k|t?z-IjjP~g{CnH@eQo^yHtz2#le(E{-gg-Pk-6*x8b5|N zzq3}aDJma-hnZ2oN3e~*$#7lw_SE-_XR9`z?9DlOuHw1wI~&he+#T6y>_U6r8x01} zU+`7IezYHqog=0(wC0D@e6gAz+Qtu?i+5DtvH42S*p*m$-^6VO-u(Uz^w{EerMb1$ zH1LTZVXNO~h617)SHE)$t)td{Uuc|+mEVRmNLzET?a)GVoN9jOil4cu9bRZmVWo{M zH0MvhF@@$kBsITxC7$n()cOl;p<0_<17TQv^_GqE`4#;>f6xuSi_WMHfy^ntXC^X;qsBr|g=EZkCY6}&b z?|IY~D>UEls4Z7$zS~jjDm35gsI6XTzSmJ3QfR)qb+nYmp+1@i=|BTNwUY_~&jJJLAm6z>3^R=gcd1?0^ zpnYD7{mWxt5>Vx5)g<^HNXPN%;rQyzd7iFHR z?reAt>90PRQF#W%Uz>e+W~AT2SUoRFAMNJm^{j60w(Fv{ow~UUu5nk*y~ebMdyVL8 zJagHk=3OmqU}MWdQ@7~53$=aQw%LAQV~;j1arZ?}KV4wQbWoet^zCenL^rN;q2IWI zcY&LJ^EJGu$4}jo7(R<@Q!~b~1y^hOE!g-v*u2zIw6zywT!dcw>a#9$Y(G~}HreFU z9mB7LU-s(dJFUk&Ip0^+KI-wg2Hbe`w4K7Qg+9B-7Oghd!Szv(&rRSn-&tpu@SEX$ zhKAo#(V07hKiD+4?6WJ*`CsStI9$yV?HRCf)ZD)>Q+HAP7+3z&ip^>BDqMftCC(pe zu9kLhf#<2Y^Y$)<&koBG_kDnKmFw(-nyY6#AAy&B^|{vg{tbU|)ysECpC7~ZQBRxy zG<_b4&nIv-{nU*AUy5zD+0JY8Gm4+3$Y?&2j=ntDF)YuO-vw|S@)Tf&tykpA9E_pM zLfln#;-j`r&3z{IHfj?uPrU zs{hE^W-RAX`)D-p_2FaTKC|jSuJ*Uj*!$6J=l+@j)%oo2%!k8ofIs`p9#tIY;dZ#|>3qxvm-A6I#g^LncpRdi^YKJ& zP;)-yK9BjaKjXg!_nANazXf05mDRQjf3NZ%IV}8N6~B6D_(yQ&uR4>A_ZfWYBL2c` z7QZX#ul;jypY_vzRrsVOPTo3vEjL%=>Q=n9;okq#eq(rf@7WrD&SURa`5J#GxZgt( zZvve8Y|Zae@RQ!zuXV3_8otxfXSBxqEd1ONk8G3vUV-yZtN-6XJdd2;*TJrhXNUaF z+ShB#_MS`c*8ZMnYtYaf(|%n5u2p;2NAB~nTKXRW&$;B&jRylU2E4@ylZIecfc2T<+^Rs5Wk{$sS2 z&~i4u1NW2o|E>7U*4Zz*`&qys{H3|^}lz;zubBzJ+Sh>tF_k-fpb<>XM_D8R{1YBEN6T# z+~>WN*Mb>}F4li-_dazQJ<$yK}4TJ4U8>!a>iZ0CBM05+e* zIUCLyUhNb0tKom!XUpx<|BZ0Z`INMK6rEYE*3Y<)!+l?seqMp=lKta%aX)FlD*V}J z7HZ``w6f3qVeF?i`H19k8eA)mbm`}uS#6^`)6RLsM@cNSMJ56rhT3oE2n)Yn&0!|@4JZj zFIr=tXSK_HH=$i_Jl{>o6K{R^>Tvtpy0%eO{&L@4#NRx=2tZ6@Hu`BxoJruZW8ZAGn+|86R_kk?$5p;_{Aa;Wed{k(9@X6_n9#z`t!BF8Z~!)ehL3z$Qwg5&#%GDdHxi>_TlHW=4}CP_{Q`6PF&**_d%dBx%I3wqT(l2 z=bQcR249Uj<2wL;&STSC^L#Lzep=`I8CCliTIc(D@a-0OrSdo4&G5CT-LDUUNvHK} zBlq2yTKfAD{DUEfx31Ht;D?_xFZ0{HPd^RUM?Guj`!qjtuL0kmIX9Ur-=BrM*1j+E zllHzJE4lB({A^C2-ruTQ6191Lgu*tc+ICU<8!P`*+-FdKFD?0cZQS2VOS`|5h8xe{ zMoT`l;KtvvjSnxlY5UtK|5W+-oyOlr!@J-I7TkFLJ{r5+-$cWW=kKE7U2uOJExEsg zmfYV$OYU!>C4ab$`}=6@_U~_^CHHsHlKb0e$p;qP{QRvncKN~uH~u08*Y0nnrN6(G zhU@Qdr6u>b(s0}RTWQJty|m=3wDGQj8-LX{?(d~(uif8EOYZNbC10oD=CgjmZSQZU zrN6(KmfYV=!)@0U2mfkBO;m5Jk=NK>P_Oj9AT>KGQA?_I|%meJ@)COz6gl+O|D$JwMcKW50`oeFnIx z=1YLp%wZ{NKjxsmBt^}B#Tm;oV4oWvuE(-0SZy|K|BY|jSijF?+3#{-W17GI#{Fbvt_XH4C*tSWR|2bLjB@))&&G291^ zYYVu#0ZYv_X7CXUDr`AWCKHh`X6Ke$6SbOn5!kzgawMvIO-m@8pwq5ui?N`%> zv33QkiFc#+U6Fk|p55WT2h&H}sl-tK0$7{B1cqU#`3<_KP_hU*F7?cGuba z>X*Uph2yBx_wiu$`|N;poUZ;Z1>lEt5I}NO!Ir$pc_UeguI@owTVl=cn<`b#a6X)w-HT#-}`WuvODE=N8 zpEGMc`{FFPaXrVh=j_O?BT1xYFAS9znoev{@((tEkyRVzXojlH7MGyret4V3-fHn|b3mS>aifc?1d zwcSKfbKi?y_mK?hyWsZo^=35n__)*zmMW| zsdhhD{}Hv_KJP|T&-_0KF6aLtxLW4_QLrE9U)v*;$0*LfIJy21Y_9h4Ftyxq*l|PZhURgehgOsh{?(P z{RD1a+A@F7fHQyEGdA^dY>qKwc^2&W^?iU^9@}$Zwe^4=Hk6YdwhQbz6yhO$L~0P3pOWhS)1R1?N?j!_&vBhWBveF)7PFmzL&iXR`Y$j{%?WR;{Og<|M0&T+zj4>7g!&EXUTlL4|iON{Q+1lC9yw5OKitsEPb<9+P!{U2j|?mPappV zJLkC{d<<60+I<4{7tcxLmu>;A)>zvj2Qw@mkTAd7cN&dCxq|3s=)O z`Ky_K`n4{{f5HL>sV?k#dy6uur@oA34HTh;q_G4L!x+unBC_49q9HpgX-=3`#TX9;kb&ysMp zk8Lp6ePO#UusnUQ2DTq7&wgm?_Tk>&A8b4IU!3R^+XVuRuhk2VWr>>7<83oQ+)dQAqRp&Aqd)2si)mUux-_o&m?e}|75tD zzR6!Ldt?gOJyM=uQ_<8Da~iljzox_WQP24`15B9e{L*e;M^mdO&aq&%^nDz-{fziB zntJB{c(Co%)7J^$^rhXtj-gghUta}#ZwfyVu20UMnP7d?bEeD!8+Qmrd(M=vfVCyo z$>1{fDR9S?*r$T^QBUmCz=^Fru}=bPGq%sEr-SV;?Y<7So#(H%Gbp*{z5&+mcbK$4 z6K>3$XJ>&u&(st1Y;a;~-;whnG0%Z(_wTJ-19LhTZeQA*>#tF(rO)%h_L(#G0GLA6n(Y!_E&dmSOaE`e)%^R__^V}KT>@@D_bx?KPt41}#>};J zIanX{_*?<*pv31&uzu?Lc#VGxoHOStusmnZ)nLyY^~AUaY#eRTt_7Kz{*7S!(3ZS!0EVD1gl*J_r333U^VZv z_fY%sKC6B=Ma}!HIPv|ve(#~NS*O46gY8e>d#UBI{Q#V`z7H(d=GY$q`&F9;2wd*K(mwY|gw%W|g_a$nHaRXS*dxZVoNO8;yQ?$7!)xSg0 zb`vGO-v#Syd+qW49$1^tamnLWu;;18GuD{5QS{aJDdU%CuG|~`e-iwdOXg}3uyf`A zKf%8ja{lh57%%*uHhy0lf3l4~*T#R<#$T^_=Ik!Gd1M~$20IVtqRn|WC-tV9TnlZBXe+;&* zwzT^Rxa|8`xY{!m`*uy$()aUV`&Lhk7rl$G&N|Ew zHh;O}SrG1AIxfd3cVD??3xPf3)$?q&FxVK{5_1u-^WZsSyG7w@`Wjc8TKpFSCkOo( zhdXy^zXV)OKig|lOZz3kwogt=!PT-R+SK%aAG|c!^^iN}W#EqaJm-&kS-3vx_NPtF z^>A&RLu=bFj%_)x>oJq|@)h7}%TsKxO|4vS*CP3^2zE}wSAsjn{4TvRTpx9>2YGot ztcsViJN`AmwwF7eHQ~mX1b2Pbf~zIp zAzncjH!J_7e2jUb$!NBkEa-CEG6^aSL^Zl(*N)|3Qave6KbD+>cp7{R-Z** z&eJ5Y?bPEl8SMBn*GI$or+PPH9=6dZzY$IW>yu(T=WQw)|5VRm&V%FB*E!Z!&auyG zeg;#rZ`TJq$DgP6-rq%iJnh`)=6VeH%M|}V%yRoY0c<q9+%uk%%~ zF|_6Hbxs7UTl`qfOL1OZ=UEijXC@{6o>c4Jx6I>YxN+1Sue==ZM)>#{Ov!jR1Uuf1 zsWaZwXy-rmD{;AFoZ9WU7 z{h4t47*3r%bQV}Wd*p1e{TfG`>*H9|T_5M{T(J8+sASNntFULs(s2_ zE=E&NF5d*(?m~*TS#|%HfwlSnY4;p4r^~_oQ@tbBZeGr@dh)&!Y~Jcw|7*eO*HCQZ zI;my9TnAPQ|2Ek1W*j$y9c#HJH=(KLy8I59f2!;9dcX}7eKOAPg7rzsb$K%y|5Q1f zhkfhoKGjz4)6Mbovk4{pbkiEUzc!<|XSblv^ZBjB$ez{bo;H48!F~RIq~KlfM{AzF zbQ|1$oSSjrJ1Aa%w^QPCXRYTQ@?CH>?+JO9yc=#TZLW!VswKv~V71&sz7OV~>fM4i z+c*~WwD|#8%{}CKdOujrev|J5@b-KkL{m?`4}sNemuv1}IR8}la^vb_4$hx8b8wIT z5bT<0bME9h^Bx0x=BaCUuGMV&IQ5SxPuAQudkU;i#`iSX@#R_W$6$T@MEgmtDQE9J z1JPHTF>>BM3${<~Id7i>t6Th7dEO?+=Ml;rUx1f6z6f_tlFv(Eef&gwxz?1E<4+;_ zYBNT1{2ACjwI|1)gVim5tdgVa{tAM7C-e3Tu=AGneHE;adiwt*SUn}z=daNCr@B6! z8~fJR{WOyL*A(~DOp5)v2YyrQIe&f&H;%g3wYOeiHNG8n z?n8edUU`lGso-7sy`@L{GRYn zMB8dNuJfX1T;seCF5`Rv=bvi4+H%%^SnEDFya)alMc>5vH`q8ihdu^>L{ZPP?|;C? z(Pl2LiCV_^3D~vH{`@a|pQ0GYb@&ubU+q~>F9z51GfLvk;{`&=o}3qKTlM&KfZc21 zop9$UYc>F`k9yW@AQ+cw&9wV0lKGwwZa?}M(>WdlcC7K4AFiLe*M_{jHips0PkC)@ z56^Y7LxG2ay*75F&b8rxmb}~!~fnv$^CC0$TPQ#z@1zFT``%b zMZxOfi-FBC*UI8>eVRIdI|f#Z|B_&}@TF>=d0!f?Poy;)mgtO-sG?e4?ahSWCSz3At^&%!ae*4mQm zI$(44-{X^9*9EKRZ*$fItL=&3hs4+b?8kQ&+SaG2xevuzhYi8bVgB}NBd}Wb)h1y3 z-k3UVHU+C^A8ZD;ox1tEH`S8==HT}Hw?I>m&zAqgXDc-IS*)3ByA4>)zbDB&Yzwx( zoPpbcoo~-T`>>5Z@!uZo{N{OY2e6v$GWTk}qse?(XY514Ly4X9Zy5Z4oqs#(N70_S z91eCKcA`$a5n%P4e>;P1s~(?Sz@8`JyTVQm+eblqJb_Y8T?p^KW`S%65{pe#% z=XMXU^OEcAi(viKJ^$q8`8R?#e#&S5o#38-o>#*u?zNq%bLQ<$jGSRz=!X>CHis5m z`w?w?T*37pUvuYIz7O0S%I~rJqN&GczuKq#&a^+8dgkr`aOO^%bC>o9!tG-?4w<`y z(A2Xh4hGw=akROw9IJZT90qodv^j2h{y&z7gZ)lr8*TbHck0RGNO1dDyV2C+GqUz6 zbL~M>Pp+fDw!4t=Xq#2vzej_$U5cLXxntnYi)*hvW9bDumdxMS+RweG&1Ve9;QARu z?Aqy&5G9cZ#1~D7i*mo1LWpDEFvj-*X^2Gx0S>V0EuF*c!S)((ESFX`nZT!-jC+DxjjT8QjnrED6!u3&i zo{X;+|Fgm76n+lee8bPJdE%W1*GD}*=Yx%#HM{`qx~Qk!g<#uiOS_A}w#%Ac4AxIQ z&u!lXdrf$4YEQgNz~-*qaXC+FiG3Nk9LMGGa-3JxJn^oC>!Y3+SAolMeGBfm)YI;2 zux+)a-8JBHT-U<&Q_r}r17}>?6Ytw#bJy;;TyM3+z8>sY!*2lVlR3N*tdDxm&zr#Z z<@u@o5=i#*ci{dGqL2Gop8f2cA3*W5FD3hVzZ!Q@?@w_LA4r`&{5@j0hm+$iaNA^m z+zNLd)sy3GU~}}@RlDCc9lx=(8OwZb2is@(9W~F{dMCV!jgPf`+U_oNZTcs#yTQiK zGs-<+{nVXL+uaMcPi@YRyqurI@bPmHCG&G|jk~B1DfC0Z&eh@6$^Qq$(mf8_Ij83SFg)vS8}0FZr1s7HJPOxeJ-Pf4>{yb^V{mg(&$`V9 zXWg{BZkf-=;l|Y`^Z5kWF>7-^<(W^<^&=^M7N$6#gQ$<7IB(t5!&n#ZT|cIsdiiYj z6EyW)OV5Cxrl_agb70$*_wVP?)YI+-@Us+k^ER&+!N${;YxpIwV_%@Qr~S+5Pf@hT z_os!gcE_$(j(rqy{EVbH_9du$D2{zJwd=At^)G0rK8(!#?)fU*?*Xq+Ys>om60FU> z#ARQ-wD&WTlD@`(?Q1M``uZ*H)YI4R;P&+!YHjK3_h4=IB`*6qiuQiSQPS7=8h26m z)!23Y62%<)sXb3#C)OL3+!MRd|6Xw0_}@8<-8u8Wa~Q6D)i%CP!QEf$7hHe;n}%h3 z|GS3aA7J;tHxaJ?ur|J98{ehi=I4L+FzxN%|Mp?H{|-|B`-kD$PcFFaPbs+lpH}m% z*&mr7=hroR6Z|KNYxWtMHvJBS|GBowJum(OcP;Y%`mb;`KhfT*HJZ1yztx(q`P+=Q zA-30FyXVGvTuW=y@Ey2)>*E>k`l^|S_J4rY@*e!3U^R;$`xfS!eh;GmyA)%1z5WZV zo-^}(uv$vqD}I1xeC;{6J_M`3OPsX-sOD-G&jsh~-{|^lcP#ErwdD3OSgky#{sULf z|9A5fu-a_m6LI>&_5buW51M-3>&y#Qb3J?~kvP`* zyO9p;_U$#OzkMXHPPlgS8c6NOywnF!)XYnqyygQt2j!VN2u(e6Fh5vrHu20WajcWq z0$}?#SN-iHc`XRmZe9yh`!O%|g(zy~B~D(8fZOw06iq$zwHR0}^OZQ($!l@2eVeQP z_L01n0Bbj|rKppa`jQki^AaborNQPkoQ&+Gmb?80ZQ?%K}dz5_|{;3!ndh;{-(>b**hz$`>f^Q?dQ+LcKf1Gem!F`lOFN!1nRox{oiy)qI}uZ{FOyd%@Lj z2JcCoxawtG<7X^;gY7%}U>~sKQ@8z&)N0~=solfI+7E1w*8ctO0n`Ul{AfR@wp(Wm z2ZN1qM?Ho^!D@$4oE!Q66k{1%Y+KjoaIkBVSX05qGOy{>Qz)K8gYcaJR?|m+pGl4Z zt9vh(9}707x<1a|abU;m{ZyYXgY{FlAD?&B^!FZmJlOLt*WU?nHH#njdiwtgn(b%R zvA+t|Up?pNiQxA0b0(U4a-0QTiIVR&CxP`*H^-Byjjg|X^Hgxox>LY%{Z6B{ZT>w2 zUjwg0b_ zN9;V)8t43i+vcJ+eo4W*uwPwp+uv1i?e`Sic;Byi=I#QxxjRqxEzdcAA=vLj>e|g! zEp0Cb+cxLYH{ohImo5YQ@!HdNDdlpCb09XR2X`*=T>NdYKI-wg0qlC`+`AF( znW>(AeiQh5inhf14%m3w^fRCDg3U>r`Cd(}mcDKVn@{-nz>X>W7I2x%t#EzRlgn*# z`qGx1ZwDJ&Tm0?>tKUH}zGuMQ;OrsypIn={-wQTh^L8)F#qL96<$Smg?Dt{Y>!;mo zPrbbMX5iyz8pUg`i+Vc6eRB-8*Oh1VW3C`=yMhPdeiwXzI`j4r zSUu0;4};a-rM>svN5OvF-`XCbsF{nnd|p(~oXiHBbI$e0;c6B?9QoCm{UrQH6!Ut5 z+V+m=sap4pmOl+QhI+>H6R_=mOr7yO16I%aJ`47mQO~o>b6|Cg=b`bR2iu3X_`Lvj z9xUz+{a!@VSDS0>8mO6*bN&)ot^CgSGF&}#{8O;nZ2a?G;b(Al=lm6FKhC-O&naro zxj23O0^Hu$t7z)^uJB8+n)}{!B5|zqUExY0N-fYoN>V_u14oxENH+qb#uZy(9)b+C5x`XjX;^HP6ottCWzkdh6 zQ*-y&KfvahzYqK;SReIVPw#@&Eq(}7?MKf5Z5i{wz-r}Mybo8;HSz)Y4vP9L_OZ_= zAAHfTauz?|Kjww zG}!(!CvwM`Tx}zF4s2_kw#$NTn`iUoz-oCm*QQp^t8vqQMX>8&-|h{0o=;Z-`+Tad z-MyriwyS_`oAZN8^5)>>e7KhcKN8mYCkwQJ31gS<;#2hH~SYxi9C`={@2)`dGR zeViMwBQ?jMeSNT6-X(7URvWioqQf$|MFe(hH&+~3*HEg1u%z7#d{5GRlQ!R>h*fTo_j4g`C4>?sJFjynh@DA3$->A3`n9Id~X&6h7*ChjBRAINI_oa0J+Vv>DfHvm0#A zd3G8JRIBGVs}x0wZJFV*z0a4 z#Wg>PI?prx#LM%IKGO>B^TzZxep11^u%B9R+n-i&+n-Tz?N_w%Yuos31-Jd}1@D62 z*~afKxbg38<3DKQ4;9?_&lTMG&$sax3vT?E3$FjGHFsT|OP`0lo+g4PQM_MIpw7OV zTgM9Q$+O3f1^cX_uHAK3%l|dPzE&^48@Y2}TkEvF z3~bw(>;dQDa-w4PfuZ+S1>R;Pj{6{_=a^O|{MO z>6gB~1GewPxViQlf}ghUQgToH9@seg#Q#>XeR`kJehbAhdai1-AJ^axaDQ#Pom#HV zeC`5!?c457uspVVz^;Y1yTS70{(Z3hXuFqMz7=mTozwfkQ>g9Bn6}kN-`l9QC%5~- z=9azv062SFTl#wttj!pn>+;wh2CHSw9tEpCLW$20!TN+h2A)Zdd9N@V?p$s}vAzEK z*xy6c+SB%Nuv*?NJpop8&Gm84pM*QET>n1;tGSPFWN-Vt{S@4`+Ppr0Ozp?(Q`^%N zHLo#o`u_>oc}!o=fbA>S+_PY{TyxKX)%17GUjS##p9jlhdkLI1e-SKCzdr?M&0hw~ zv*teoyXN*~Oxx;{wm%0uXPNI;z|Qvu6vtzGeX>Widq!mZ)`|5CaK`U=ehJTbUIoi@ z@B0}NSaCP^}AF2JgS6&CdK~Xa|ar$}_Y+nzs z@6y+w(A0CE_%m4TUE(?CiDRAb7k>fUx8v5|KFs4SYCq3B#{WKA`+ejCH1)Lq z5UggI)4uulm>;2~eVOyW(Y0l7{Rd2U)qO|X$CUi;@CjJECBIMn7i_=UvOb@J9jnh) z?yJwh`l-*VHL8Z=)#lu|=hU+9^McKH9_qyH0ITPm>;$VlNYk_%0B>(M5KTSp27%S) zqhxIJgN>)n{>*y;uz4lt1>tJ?CTF$yFAUb-T%KgVE&?}~C+fXx%tg`Ey%)61y;*D zg~YMWH9r_^-(Ju9+eh+R6|CL7R;Ny0>Z?)I%uAfS)&QGVdHt*jSI-=*1y*woJc|;? zI(ZEN+qb#uZy(8PZLoIpT9-O`sjov(GcR%SS`XZw*ZOGcnXe7NYMHOZu})r}2iv!~ z>Te(Bu@QCh&}T!6nt6!JGg95WyiaTbb|07biA~Yey=MH4X)|#78`I`+$CBTewgBs+ zo_Dlcg4I1Ab3JSYH@3Ds=WY#lyxPoBp8KQc@97STPx=4vJPp1DV|LGfjp7*3pw7K= zJ7Rd<%Dq>PDEJcaoeOS^-P`y91-Jc?1-E^7!MosNYVLfQ^Y(Ca%$dIfT+QOgImx*@ z3{Cq`O0NB#z&qAu7VG3#hQsyM=C$vb)WnX*zxT+0pK=%YGPKc0TjqaPu(q5jK1c5c zS64HZbEoE5w0}`d$urfSV75f{4EqJ}9u$4D&-Vd4_VW7M7fn4e_5&xzUf{hc`XtZ& z!S zzxrrP-aTM#<@}C!A}-I83mBW9uTwlfx~RWV;4=$+R*gL$ z&Mxpd1wOaH=N0&TuxHYR)Sf|I)W?%c&LsIsZT!@N+vnHY__=NTqBee68^5;T_IE=Y z|6alE@0Nn=e_I>Bv*7yQ)yD5>AGGmL+W0&imgV}+TX6gDEV%cS`3i16i?;EV3vT;W3a&D6Z=ANVr%z#*VvvV+7kO>a2flXaL1O|mw@$APwY#wI}AS zV8^V@^I4w$ZwKqI&9hpbe}}~#-~)(n8*Tb{-m53}-C);Bn`gN^wtK;jSDWX$JkOTj z2k%a7+h|LhAAsGnw(;zj$Myi&J*Un4fIPN`!0GEjuspw`JPh{Vi(ow4Y0vsR0yY4F(6#BGzMcWQhw|O%S-9=g)Bkf|+iJ7_r>ND^{|jKX@E5`E zQ|HZjcnPkLdUAXj{J;L)K|e*;Uwh*H4D6V5R{k8UpL)*YUx1y*SE$qORj_*U_$Ao3 z>iT#+{|f9r$yk34)=xb?zXAKK6`$Y2^;1t@zXy9?aejUWmgimVAHb(zQ%{W7z{b&L zo9C(3(&rz++1qb`<>~8B;9Q4qg5_!V7qI7!G5-vfySH73zk>aD02t49+Vy*#T3h1( z4Xl>6dK;X*WS#x=4!Sn|)BoSW<$n4H+&1bN`#-_9)n@;1QLCl@e}TO>XnPMVcP<^n z`(S^|P}lx0wOZPK2sU2$N8oZV{u{23dVD?x8z=kZKVbdT?c)P#wfO%Rd^{!p-mp)> zYO#L?Hh<3ub9SS7M(je-SG#dPq1Kjm9bh$WKFi6qQ8fneKUr6w>*P6m2ZBf7V;gO@ z_t{Y0_P$S*GE0?Towi!M_b-AECN=y_;H-}@3W@1 zjBPQnIfX9{c8_`e`YgEw+&1NV#3kYC**8mpZKs}gOM`9q7BMoGW#H=BzsrKvQgV(g zhh|LeS^MR|=Bmv;Jfl|tx1Z4~qNyjhmB6-Dcl0>pp`l=M$_`I%`Ib8!>?)^34<=$Tlu8(@!3;`P_<6j%BpSrn^Wc=%Z+t1c@ z(bV(%=6bb{&%@;y*GJcu`{f2;_lVD)+I-H+_&yIeu0C124Z;8GKCuzH{@OE^jlo{W zS>H|I`l)Apn}Qvqwye!&V6WFQ@6FNFZAaDEg8%V-ihAyqTh^MkJP&RKc6_d#cE{)W zmoaXQW)AvA+Xk#|eAm_QS!&tO+kwk#b$ht)0URf=v4g%8^|ToV_IghKJHm%j)RX^C zV0H7$Z~DXG=I`H!Y0tWisPz@l?N7hN*%_?eIO%^Ec$wp_aQ)OXSG$2TSK2dI&Vk=8 zwP$U=0QMdkz6acMIsJVRZhx86J>mMOr_EkqugkRA8*D#mvkzDw_3WX2!N$@SZ9lO2 zXiMz4efPrE*_^QFx(?oO?ie7*#Bf8@V$aui(cGWwX0P1X-q%kL=@z-s=E zF^Srbzdxx@q^S8mO`JX^gWYrK<7l{A`j`S%^Y@*!x6bbJ34)hoqVQ&wVTfj zYCq&QTPL3{gYDBC^)+_#IUcOte7-`ReAG{% zsF{yA>-bghwiNSm&QAoZ*?;`4)BjAceVCKJ#c({b)#85zSS|O&E5YW?&&3UG`R(*7 zur~i4b?)11z<#`LwOvj5F2(&IPW)@Z?vwm~(XNB5#r|!u{U_h+!TP8tryIcLv?4`& z?!`BPy$@?oyqmzr%ir962dtmE<9C0ld7U~2^EL0ZzZq=4;oqxy^1B7@vx|CsZUvWP zxDBqKdUCy8jdt1+>khE}X-jTuWp3t}e(nUDzrJ2K^6aI%!S1C)I_CJ_gQlM6)_ZFo z_j0+1zK^agv3^kd-AA3i?+2@AJP&|vr=GQa5Uidy4}r_Q_%K`_^{nk9;H<6o%*~@< z^VgnuKLk7O_&f&IPu)53tWb;p<6yPq_XJoieLo3K-`X;^AAwyf?RkECs`gzMU3>Zb z=9#2D*XfVJUZ>^vyPv?-=jbJBb+KoozYpfS^-tlRSNdqv$MaR)KKy?FbFlq7j*+x|1?;{ne;fD( zntI-EzY4aUddBukFwLs5X?H$j`&Di8`CGrU*wg0nGqASw{cEs&m+!%TgQl*JXYB84 zpWjkvo_-Hj&$I9!z_wG5&ud`&i_hy|{nRrTZ-AYjS@h-H{1L3CZ{|)d{(k~{FU`FC z4X*YUMgKRc)#Cp)SpVeo4qTtC@87{{De?OUntL*H@GjVS`X_aK-UF-WTKX5*cIw&l z?}J?<_q_J(`Skw*nm#GEa~?jd+id`L4Cbk?V{|;)Gscg=8KZ6g4R=nH=f_~jl0N?f YR!d2rpP-qmeHzm^`udEc&1and2iQ|qf&c&j literal 50184 zcmZ|22b^6+`Tu{&ZbIn27ndG-?=7K&q4&CMl1;LbMjBNiAVoxqfYQ_mieNzy1w^DP zqJW?XqS6#2C>^P`-}`;;`P@wI|NFnMOy=|XJkLDy%$zxM%H3?b2CXrFRn1o|R1K|0 z4z23X64fA-sQ4?$9z^2>R?U!!byQ*ctlSfZS zA6l&fo;JR3%;b{}>6?-kV`;?4xGPf6nAyTBfk!v`%G6W)$Ko@%S_3?-Z<5(;ZbRFx zPTleyQmq5-KXJyu)c(=a4?V2qrO(>vV`~2))%w)qrcRzQY0QWTqee_0W(xYOhki=! zGql=>dfEx6>^*gA-N~0Ib3^PNn8D2Qrk%cxqcJ_WEx!e-ty+EuFqVM{ z)BC6Pk4ezhB-?W%J zcl*|D4y)VjSL2a2-XEOyhl2O$J$Ur^2?L`~Fha484#sv^)8`@Ju^ha?)dJPgWt)Rc zJ`LygeFQ%HO>XslWV>y5brg8+cn4RF>el%-e>Dm`x^LR(zA>!0 zN#pv5c~Uigj-j>A=db$b`W@1La{q+V&voAN8(N(JZk=-n_f4EKp^oQ}&D>+-+G_cB zR|DX=$9!=0Dfp;?zG;U~o;sm*?krFr$0pu{$y3_l60(lznoCTUTM@IX9%t6%iP)z1 zO>(MfH-E*cUvXMYWy?Fb-X_}TQFk>1+uYoSR;RK9A@6cU7n2-|Ba8 zbsBi)K>ta*^-r1JI=AMp&OjSIVe*VI^Ym<9-PLEX&5bpGbvArz|G0t4lMWe})H)IC zg`n@Od3*;~XThgUpV~iZT-_D%7OE~%V}Pwq%)Fc2iPHXqkMYi(Ctg=|9z64RK6vhV z*j;@NK6kBkR~Nu1_D}DdK<%;qy#Dq1-(6h@ZXHK$gR3vV=be+G)#dt6nKI#&JtmK9 zZ#VTwTk$T%K6>(mI?peH=gv`gbs2ojz_jU9b>H8kc72)0E!1Nhd>ggL*0J7CJ*97I z-^7ML(!rnZ;Lp#)yQjx=bvW9%3B9}ZkL{Z=Vfvwy2F6aFI&qf?lSgxs4PpIi_cNonIfHv=dRn(_ zn&;Z4O_?w-y>0UvJ=ZqXQ@?HNn#VTX(;eH8y1(w)#+lGNX25YpAKcbCLX)Sqb#52x zekS&|E)+wWae1#WqjyR!O}!KPXZBBE0yD0mwSDa5alK>uCrule?sakqd!u7spluu9 z@1?1CY~O?llgE09+x;%s_8HYTjm;~0E>!EICk#yKHDtTLg=>AX7ZY=#ru?%Hh@ zY1vLVrFZIN7g%y!wANc!_Fhg5Xxp|}hpl(~K-;!>X&XOKCz6;;bl6U+W47jg$=WtB zYC@A@#|9{#nKi5_- zio{xBu0DG5q`B*>zVGU-`M(O9-DxtHS271 zu)D4L4(fILu4+g1zA?4FFSvC*?Wzs~dkOH~Vv72tG5sg^jjA_t$MPApGWRn&_^f$& zS9KwL`pK=Fzc7!jySfDK6IE+WUDY-4lbZE?bBFIO9sCFL@UH5o@H~UQ0&b0SaP_Ks zFS|{1OW-`bf#&r<%#hk^Y$$m8$(x{eR||m4aW31zSLom?&cnN^Rp6P^O~Ct2_L-); z+6p}P-kE1Ccq`ZLYBzA%=N=t=uMWOX2j3UoKZYBSW^4z-TWhns8r9)Dx`X$3@Npe{ z;yj$a2=1Qj9G(jv-Qd~a9ET^tt^2p`>RE6(wm)?6=izXzBOyydfr^O#;s@9jlg-P+zQ;+#M}U1h|J44v?U&|h+g)AR!LNajnmWd%T>D=OpV8Y=9K-c+ z=hlwgw{C^E-xD=$et=dUpF82Bc$GA|zm?k)@M-lkR#){rxV4_UtJlC~yEi)cTOIt} z4*p&T|Dc1fJfw`@RrSEV`E$P329Iad;`P9-HQrrq4CY3se_YlQoICsx6YJyMRUIyG zY{#~2yYje4obGBYyd2NC4n6?qsiYn2RCwzg>aO2o&g^YHEt=EUu zGvJW=U1xpWnmlRx9(|(+CXuZD`~Gug@Aw%LntX1B&wbt;T-~94o@e~Q)q`jg`=^Z` zF=5L1oQDsgWj=hLIp_e@}zU@&0}u-c|h(o_)r5vNL<9_4n835&H_9 z`?-4l2l1daiY|<~D0s^F$%rc28+Y#3oa|HcoY&peCu{Bs<9iF* z`@Us0u&Ts2bkzLmIw#!w>D?ht0#;%i!EfS9=jl?1wEB-g<78Gu?c5 zGOxCV20rn#soHQrG~=pWQfOU`_F|!Ndr|vsLW8t5hdN%NIZm|$3eDWqjwv*zu-1+* zH0MvhF@@&47q#()=6e^l35B+Bqxl?@{CwA<-^qoxXrrB3Xue<3?~+1uF4e9rG~cJF z%`UVh8|{`tTdL9SF0`c^?Y=_u-HGv@D70l8?Zra#eTjZ=6`Jo!)Hv1J^I0uxeoeG;&C5I2yqax?7qQlAv@;8B?MCytEMr)w(R?0@HmuQR7uvdw=CfG* zeD|>iu~&3ZSL6pX!rexcF&*i((bzl?VdN<<)z(cWX}uNvUZ>O z^!NM;Fa5oL)b4q$U0&M#zSd*yN4xhna=NX#-{ab!=Y)3eX|#Kc%qxN@?w|(-Jm+js2wWoi1 zY4;kSeNYom9{WZ>t2$0uGEWZylM<;cpoa&0|un%A28YH;^LvAW#7On><@aOb^; zGGASHSMEdltFOkW+=Jq;%|6^S((h_m-7iWX?dInBtZweM>!G%ty1A^@;GTxBMXf#D zb3|X`nak!4?`dm8s%;8Q-JV?XHeTH?DJ` z-?)PJfLng^S6OE$!xj=WDq0_Bw^n&dU?`Er4^C^X%=0t7km#f|q;t@%H%s34e0+Yj#eb@4@v^ zPn-8!KKI7w1Gt)gYR3PNVq0yt^W6NH;%8|x8bs33mj*kA6*%)(0yqwN3b4l3D{*G7 zj6pxo&sB8dqqcp+y(jhK`Mf6Bcy6`6(Cg zg^gi5eYHE56!ZPRitC}%N3L)5vQ7-!1$!)m%i8fImU`mE$K!PbKF+E6d%Wb{A7q}5 zeH7e#RsD}{Y{qgPwI7G(wLZKLzIfw5s`0na*vFyS&h>R7SR2(mpK#aLREU1|KdmvS znXlaY6+el88r;2AZtRQUS6{WlPT`lqm%HQ1ZL;1jhpT1H#qX-R-Bs;&SHn+R`sOyj z2EOhwi|v#+*TU;I)Y=kfHn^(JyeItY@W&nbY3lSp2fpAlYwQ^QM(uz6i10USK6`lhyKv^O-jj^?G2G_` z?ed{47M~TuSA=`7pZ2T3Cog&ScHyhLxT@Lhcx%GF{-^zh@bcQTCH&$C-mCMqzn$RA zHU7?(&tuGIdww5;pY_JU?Q7LT@Lf;*TzkB~fM2rvz1ye1-@y6P?*I3Y+;2P&_Sm?0 zINvWdzMfmQcVBwF@pnJ#p`kgZ{n`Lr>-HWWx%bCv>3=vp`;z0?9X@vK+QYTW_l8&1 zeeL-=1U?ic{U6bA_pKwr=Bt+WM}cQ`Z`s}#k8bhyHRTw%KI&<6ESS%k;m6hd`1UoX z7p{+be2xd-bN~G9xP5RnOMFIwnaOsX(Qq|m#b*q7v4wurKF|7F{GMFj#=`YcPn&UI z=7@8#bw4s5ZcO#~41gC~Xv=n-Pr=nJ@i_s^ryXYkT+O{<1Mcvh--#6G%sFt3j=`Ml z)0nn#txTr&SlA}<&j<5qpKG&g-ZMP*@4^>+=K3AvuA|%GKKq8>2ltuT`1gZZdUYSM z{|wFN=j@HI!u=%vhc!R5z4y$=!dn%)@dkm7XTR~^35|2BeeR5Kp;kTZ{11j-ebtfe zwK)x*YlCa|tlIzkyCvR5@W&o~w0$mL0q?;t_G{o*Uv*U-&-PEjKYslm?Y-k^cvYP_ zJpM1h?_70o+y6!Q=9_Qc=6|XE2etcux#p*~?@9k&``^}HYp=uEtLnYM{@<+q7ax&5 z{v){ednw7|U+81U-oV;#-NXDF?mnmP9L2AT8;;F4zpR~KH+<~abKC6(!}U>jEVlD_ zEDkrH#91BA9$v2#^)2A99k|Vo>3@5;`+Q2;9fDp}!|UT`+#}$=uS!2Bz;(&`@mbtY z+TRX;?9qkW`9D?L&%8hO6-=f&bNA%2B3vyc{j7uLb7lBQxbFwTr@~ijIIudMzn-}5 z$o6siH2lcrwr=O~8TggYUDh7|8F1U^r!8^M0k2Lx*ZXB)rl?-8j#uux1~u(hG?=R0 z{z{0?`SG7!_+Q^(?`O5keK%n|x$%5AAx}Pc!qQDT|`MPuZ^Ib>UYkz^i_Ihcb;qiaD_J6cJuYZNVcHo_DJ_pYE#eUdY*MEcC zMn7$d^9p$E*g5TXZ@^h+_3?3?y;J+n_5T=t&OctQ^U(euxbLpa+j~0S$@oe9W#MD? zTYq@+SOM;Nk`jFw`iq=5&Vy?;?bk(r?9mI`=h=F2HP5s1{M;3d^Qi5&C)~Z?^SyNq zXwAdk=-xA?*pK5FjlNcq_c-|b!(JYqx99BvINw6F?_D0O`C0XT zW&DTXYZUQ+3%~e*8SVB@!-?14uje0XyeHcG^lKH){+Q>7C>+wdZ4b5Ii83WM_ny-4H%spKnH@@FphTDFPg8R(lcbBpE!2Rwr z-1dHV8Lr*$E=%rrmnGl7gZq7E?8fsu%#!;(X3707Gu;0CF0pJ-L9o+9T`O{uMexDg`K7OAWZhXJfEV`N4{nRC!~ifJzluER$T`sbhUe9+ljdD2kN%5-*1AwM&H=*8^CJj za3i%Jb5Q>lMa_Q28Oyi9Uf1tw#_}Don%9eu@J$=*_n1BV{Vv#;=C8l;?DJ-7KlZ85 z_b6)iDb85G4|XhP;OE$H0jp($Lp=*kk7L@qNy1V2_XYnDO}`n)=!J82?9L z+o?OhRMqYLMYC#`#%|y4ujRb}`UQWfFU*N3e}uoxdHu$gdkN!tZPA|N@F>{1@*Xd9^B7n?KEG~! z9xr^J0IMg5C&9)J|4qZsY3BF0aDCJdAWM($Q(*NJ^H={Jn)z=;F&F#NH~BpS_SiX| zr>W&)uY*2YZQI0u7JfD{^wDN6#{UD@KD67;>#JIFe;)iCCAq%{R(pYxb@&q49DRP! zp1J>Xqi?F-+!N|+KYygwo^kvIY~ShkRj_lIe*X^keo}o_GmrlOze3S=Q8S*`z<;A? zORU$y_Lo?1g4N!jWd7d*tEXiC-$u*)o1^jd&0J}BZH&U{U9jut9qRP`Pq6x3_zc4K z9$3xqCERa50Q+&j(e^$?&HYB4I3Iz_RA^%%@)g{#@loV2NVjmvtqPWv8g?o0cVBd}VHztk*#oD0V*U7f$Q`wqp}-czfIy`T1d zu=^O{su4Rgx|*@PcULn$R!hlTZHVUlI#)j5 z`s}K2#<~%>oU4uDYPQQ#kJ=7u@6|g?b~IT1T_z{pPNKu8m<;$Ai5VxQ66?aN~Pkdv9Uh`sBPA1=h#C)8k>xUbuSBuQ6cH!O_&op&zWC ze#e5#Yxj7#+BizCwF6*t@!G9D^ZY6BRT#88SLS^J*qpRwPA7ovS6lL!2rl=fNpLlN z9g8-#ktDo|iXcKNYTaM&o}nSS|jif%OkRz2L~zr{T8AG5!o#EhYLHXxR^~ zv+taVZr-jLW7}Te9EVw8ef-`b^Klm3aV7TIV6~LQ{w!KzI}T&%n`5Qjb?J_EoT4n>l_RY(Ls&Q_IEI zQG2}HTYUHP4R|l5yqEqaTwVX`spX0LEwE$Jb_2CMwwu72mm9(IZCTY`r@jroh}!Wv z4)ZlH^RW+O*~Yk6QR|=m@4I04zw+J1_t4Zc7dL~Q!@SG*K3pI5?De;RUHe`uwcFQs zsMQna2Vk|lbGZ$ymRx=aHkaY-Gimc9H1+Hsw}Wk`p1tS}uze4sX!jVzc4uSr=PC5_ z=iSWhR<~sns0UC_4NF*l|5fojx7`tLM7$ zOR(Av#PNRiQLrEP9&Nv(sJZuu6X!9o{bep52dlaNCKomLjI_7TG59sub1ui=3AnlX zooalZL{qm9*Zyz7wo^|YPk}wY$>Vq6-%`}$^9!)Dz>+VB=^@ zjK6@dqBsU)z6@5=*JGefE&hK6XP=t`-jiaVw*4E}b*7&Aeg$kBZOP+Ru)05IeNemmpt1i2)|S}w4V^dkAh_d7>@K)I>WSU0*2LDH*uGrS zW^B)yAz=GUyPB{eJ&2R&+M^FfQ|3k_vdZ=&R3uKF9|kA`dkXEX1l~!%Q{&a z+_{e}gQlLC%Yu!Wb7MKMKI-vV9$fArE5P+r*T-{qC2;l-zpIjG4_O)P9-^LpRskDF zTeMZd>Mu8YvFGzA;GO4l51M-BVKuPFQay9OI@tYRTjH+)whwK|drfe8-me8$)7LrG zrWXIT!MRq9;$RJfJI8(>pZQuBte$??1KUnLan=Wy{cZqP(>ML9#eYMv{?{_!{_OQe zaJ8%9gWwy3)x2(QO6|w%rurrnHLsiE#P{d5y(Y$Ho&Gil+n>IE*C>x|OK^_0-#f~+ zx#qV9d*5I?zk`%}AMG0127EcS@oc9(xoAuL9l+_^?=9uIHtYyqgBa@Rb0@Ih@#MRq zowZT?L>t~{47sh1Xf)p`=6k4J&}^^2c4M2PKTo0UKb)c4Q2ZGNrlu z__OAI%q4TRDA>93=g$4P5$ErF6yt^8(!p=*;P-d%M>_b^9sK!*XU=Yhn@8s1`(Wq6 zT(mjQ=A@oBw}Q(yKY(ZMwAseI)zjvOV72fcHQas7@!n3+M?F4wf^Cyy@nf)Bc`WXN z`+Q-^vG@sCUH`^HdSW~X zHs9p&5LnF^S^GZ&+g4lJ{Ty8O{R_C-!xa1Wn5w1kUxMvhJu!X-F8h8Iu4at%{TSG` z+PqGBjd_CNT$J~WPd0k4&A)+rd^e()zj5?Q-@gTy`Tq{C_7uhZU4v@L{~56Pt0%_q z!Dar>!qtqC{Qm&9t+urLBe?AQIk?)NDE94oS4-b7fbCm7F-k0AdylCg~?&T;6*X8v-=GX(BjIxfd3cU^hR<_9lEt)6?cp1$kVYVltPoE-FD81CGq{UUHR{cNvIE$tTt+derh23N~5(Wa*VTj0gP9uK)= zUIOlzFC}03l5l<0?N6JU$HQae99rAnjxpa~FAvv8-Sa_So)4?w>t_W@&W9Bn?Al$a!JY>zQ_O!=YWwrw1AceVTZc};3_)^7vaskiU9;cD&sZSY2v{QTJ_ z;EgFC5OXtXKb~9an^M&5L!3S~2iwP2@bjL23yNC$*s{@F7in*upGDgWY@g<>Zy9?V zxUv22z}VYT^iR17-EnT$*nAeSjdP}!IrDh0L-Df~C3Chm*zpXb&OW{)?bLrw$+6!F zO+7xt8=sxkoAojRte&6a+6AnZ=k8s>{HfQk@w8{{?+(_!8zuX}9$lLVE)uUU!rYq%8hXE3x`mDva!47^-T`@g0+pLDXDpg}e8x9EY222otx`a@C=IoHdSt) zCxLC}UahY@_fjW=JwMd*b3LbkjiD_+*K;aZ-Qve;5XE`*IG;}O_?$*bzn^Y&uUqEv z8MtxO9k09`@22?pS&fqMZUT0^n^9-HvuNjd!!PLI7k2P3H{4uZr)R;9Tb}1!v_B7SALTxAKAL*g$mhWJYaDGJAIGBZ@o~;R4|W}> zYj^Bw>E{dJ&aqsCrXHV58lN(kOVQMm%NN16yO^SFR@46#U~T?eW%m(t`VyEw^*dkf z=H(o#C+{o4=B=LN{}r&h|6bWP9w)V|m#>1=!oLP~ycx%JV8>b>lk3scb6$P}%%A$a zoDKLoMW2lGn_zuXa$eqm#-BQ8^RRDyU8ma0b-ERPem19Moo>-!*VmR5*X-8Rxj(;& z7+JIW+|t2sE4cUHcNM$`{*#6~H||m2hTD&GGYb4&is#>VDDnATqx&pto15WkUK4UJ z`F*&tw0TU-Q!O!W1*_#6@&hn`>URs;Y~xte)8>a@HP?{+{s^pQzsdJ@cxS$Mps6R{ zJHcwLYgp^&Cw>g)Pkk*nu0H1A{An`>*XZ3~kBK(tPM$sQr(pLyb?wfznr-i;et>d+ z!#!pXg7wMx9s)bQ+{^t8tdE~)KW{YUti6XJ`f4*q_S;{8?NfX9+eg6a7C%<*x5@FB z2xX4Hf|ofy3U^MD&tqVH{6u@a(UggEr_uORpP$Z+ee3IbI-2?!itFh#iv76;e&6WXf1ZUK zN8R&UUY^%G(8kX;l$_Vw7I?b?Zx8ky-;p}kp+6C?JjefB@E-hLDY$#U>kZEso`*Yz z=O`J&3t;u|7s2M_96H9A;QFY$md!ye{(k|hg}>bJyc78=Tp#sZ*Zv0PPkmj}K8Ip# z$D=K=UIiz%$NTSaeX>{l1I(YQr?KVxgx3<KGQHi<)tb^A@;_^ERA6^?0>quYae} zy>EB}{3b=;#Q7)KIN68Z1HVgA&%N*aVB=^r7mtZr#`po)W1aQ+A$(*}jN@_m2u)w@ zIiCLldptj;B;LQl>RFTj0oztRKK})~*24b>caCz*JjwJ?&oP@14O$;F?cR%Iz6ZhW zM;~K4$6a8@8lP^se(IhZ^77mmK^s5ixv>*G=gH0m9uD^0*o8XhhQIT@JU9Hk@8Lc8 z`Mcl4JvaRQ?RQz|NPyBPDHD2CHW*tAcGijH1oopOW+B6JTTOll{8~?6p~2 zVyp&E4DGJN*w$!lzI)Mcb&6y1SZhnJYk|#mP3q*jHdsABYqJhmZEyTOAjZ02Kfbfj zHjJX?Iuz$PtPge$^RrYNfYq|DHUiuChSX`ZF<3q8U=y(I)Xm?ush0dV1$XAZ8Jc>0 zHvd0-wm?&##WC~PZUt8J=R-0NTZ8Q{d*C);=i5EdK5U~;{I>-=zq#Mr4yD=xKc3yIx?FH6P-ThBq?ti<}#!q?AzboAR z&;4pQife5T>g;)+Bu4hI9`r*BZkt03uKkD(KC0mQk8Zg0D<26rhw?dgUo`dj?AQ3r z!7pRqA5A@TcK|qZr_H%b`vc+ju`>>7e-N5_*2KYJ`!$X>*Og;cPn*NQ&XG39EziHv zI~?pYm2I@?>c?XAH5&PQQ$K4A?R2qb=t{KUmwfO$^tBnti*c zj|HoRj{`ebnS%ka^Hd)1Pob%2&o}|>xZE?wgPjX~GDj1@`lRF@d?K3de6BYS`_|X< zMO)4n&#!$be)go~9NDYDdxJe+K1rQtc9=&gk$t6Rw|nuG6!?#@6O>k(bBi0P^uOl9J=HZ-MtK@cv+r(Sg)C zMxP~Kd5q5Q;FmW%IiCYJPWZVE&p6M6>!a>G8DA~_p97my_yutD4gY+@6YoN}KI-xL z0@%1Yh8KZ7F6wD_G1#`+((V$l?Q%>n1?#7t`?fEFJtsUjwI|+XU~|{*xSS`o#J&Pt zj^j)4a-3goc;a0N*GD}ut^$|ix*G1d)YI-7ux+)a-L>FyTwj6fr=D?r6`XNtPrR>z z&0V|W@_4Hy_H3|Y4gWe=pUmNPV13lHe_ju^uVEDJmqD_gzX5+8T_4x8JnPvxKa}F< zAWGKr!42-AK7`^LK8!kR_*=wq4JXGN;kL>8xC!n&swc;9gU!)-q7yT>i_c`w|!`eZ)u13PAI&Zj){ z>Arp(#m^!X=W{6au@vX6mwE)p#cS8kXs2G@oBbS3J?GNH;D;#cY4-@&cIEZ^muTu~ z_bc!(DC*{IUXOx}r!D93V_?U=U}I1F$I&08Xpir&3t#PyU9BAZDB}1zp5oa3?!AxV z*hf=)T$Z5zE$!4tkl82_cna=wz;CFv<@o&$tj)f}WncZY_j5cYeT@Oz*I4TG^(^hw z)7Ky1_Vs&eZRzWeU~Tp#F8exx_I}1u(%1L~_fQWs*yH*siaAW6c0YNZST9g=P3%Gc zd%5qW|j@V|c#430BXZ`4(6$CGQpAMl-(l>|5`E z)x9pJ{ksiUv$!ufXa7XkU%O**ZK@@=_rPl9KJ`9aJ^!Zi1F)LUh531r58>(`5c6Yd zKfZfW|A?aIc_L0<{{naR^=~xwyw~{;Sk2?%JBh@x&d-hf7i{02gZkS?^7Y0OXu$psVUdA?#b@Cbvwr_LQ-#(Jp5U_UVYp6Cp z=A}MAMa_8Pi!iDR9-76#k5x$18p$!ig?cJo?{I(extN>MW} zaq?OmY+mJa_7Z67$!kflTJlO9>*Tc**uKqGfBP_xWvG*fK1);7%tP!RZd|!~&Z*_W z?$2_sLo33^Q@ifnbLD;q==rx2coemI?lo5i8$+9I+_%+?w=yU7s^C?r$G}&j{)C(| zj+i~vt5MY4$J~$1Vf97_wtv2C4K(%iyC&H2sN1jC12y|~zgZW&4kf=+WIeE&#SboZ zyJ2u`8RPn3?^o1w?cV^bz8j6~%WI8V=5QmhTJ8%r1{;4-iZ~jsO3Ral*F*>l40J!}Bv$Tf^02-v(^^{Jhe(U}G95+IC>u>8th@`D_o? zSDSfxtyB|xo%H-pA3MQ47IKf}&S2Nm_lY%#0giyH4X3znccb>>d97_%${rNgsn|Yt zq28V19-_ZCebUFCVEg!X)5l(LHScHqnK#$&K5+FLz$A_|bk)W4F#24h9?J)@BTcg4GV8I5+bBDaJCk z*tQ;@!@(Yt#F_*)mN`zLo=9;Y8jA0UU^RX8_nu=aSlw&6d>Yu8>iRf;)5R38r~1qQ z>!)r%-tVaC?=^HL*!?c&-$`&aiyzl|`ac=X_OqJUr-1cW&;EHTxO4wJ4NW~co(^7) zl4qMwgY{82$Inn3TYuN)nPAtAwllzT@hocF=63;{1zrU|+v}%2eVz^W958q1>9b%p z+Zaomn#bKW;IXq#4(EV9R{1&MbHQp$GeNf3rdF;i*FgF|4{RUV7e5D9JD=j7FE8)g zr;?+eiIlC0@4e@w2KP`;F7T8Fdp~+2#oVV+=bgZX#LhjdalTM++g#GYFDrNt_G=1m z`gB#9m;#%jJUk%pB9Gqjh zHqX0j!5+i#ufRQyY5P^UbCLVvuYvVZkI&b^9`EdX*TLO0)w9m82hXNxORR5zji*gN z^Z6#&oV1y*$6PIa-2gV9@Na<~Q}~VGGMAg+`lu(DZ_DXRTXOym*x1_Q_dT%scPYkq z5BNSfYsmE{*Jkdwg3Z^wU5j$D>(E%)A8rHtJZyXYw0rKUm*?J0eEdwOc<%L3&!D(& zPNMd_a*zHg?Q&kpUn#if!5a-9!5oibpST0=v*7L2nYTN^>bV#Hv6$j>j_dm;U_Y*J zZFf=B%tc(@FREuw?g5)~_Vs(=Y8F3i`SqTCKl}lTdEG~Cd&l%(qq|4TAA%c0J>&T~ z*mggo&UhXMtLOOs0_-`Xo_m)^!0HzFL*xGvY#-X<_bagTU~z5e_b8ga+C0V{12uDU z&L0D-mCt;S!__m#zXq$7&wNk7)t&R-Q2TMt)t{uOIp^Z^^;>XfUr(W_=UL%*U^Umh z`$Xbc=UL%tuzh>{^tX>Z!#o4lZeGt)`!O%|-&54gOPsv^05-2V_~y9$5w4y&_!C$y z&wPnvoxGj{+qb#uZy(9)d9Zf#dXd_Xd8xlZQ8O=b@_Gr}nb)7u)H7dy0jp)c6304u zy$rT*bJgEI%wrC9^3dn66gBe@m*I%b4E;tCh#%Ex3Blk+;F$rKrzh9S5>iXNZ4- z)nb3Iu_urB;qC`z9v`5or_YbTY9CV4?qjg|m*>;J;Oe=5`#0FO>iHh_KVau%Q;NBn zkA5BlZRLJ@IzE0*rfkhvd#Fz-@Tm><{63B1@%%Kk`>^*TRQ2AF`<q z*jFgHeXLk;+pkh^?VEJ)tvdLw1-Jcf1@D3H(ZTmBxbgSt;QMy)0}F2aQ3W^t=nmdr zaO00Fxc(Cx?mBZWhf{g{2Z6gN?(y?cySBU*cQ<9Jk|Y>Yhb zt_fBf&X_#D@=s8VWxwLg(OO{7*Th;IZmfKtu@2a|@EJ;5+6@D1%e875 z=o9~4!1lQoMf(VfV{~8DWedYWcR@-8-iv!BeU2%b2#+N8eqkwI{dzz~+{TU+`&0Ibaz?(6c{4g#y? zm>mLEJD3umL&5rl9|rau%XRl~xO3@s*Y^7BV}A!yYfsxFz-qboIufkrG1tdAKML-+ za{eC;RvXSb{+8DWIy(k#TWy}7$5H$7{M2?VMa^?eoc?>k&SUyI9&BGZ=lZ~EIp;=! z)%5q6j{)bHj|R(Q8w<`c?+44%?|5*I`8cpV$9w?nF}E*c+E$;m{S??a%Y2^zcD^^F zI3C;UlQp8b+4-K>q7U^UlNo*hnt ztGiZCq4wiiQ9qfYW^Us2bt>4tZg2Ka&(G7))N`FU9jxZ_qH~@&)_HdLG}yk+#7BSo zFpo2+{g{V7pP{Ikhq!!pP&Y5{rOpOBmvbnYgU_O=XP-R>d=^FBb>Td#>F;qr4{VG) zTbvJ9v-rugy4R7

hUkbKgZJCEJf*q^(R<5hd!1~pCqg@VnyxN=_*PL38`>@wo|X zAKK#gZE)xNmG7YGtIe^^rdBg2*ZX(DYUT6b_u%R|4{rvmmFN8T;p(1iw^IA@TvNY= zqUO0KPG3I&clLD~ntHBTKLo4geL><_=bZl$*uFh)^|z1gMYn^so7bJx$xHnXikf+e zlh=>I=2f0Qcfr*&2R{L;IS1}ViDR9-?grbpx$18p$?Kg1u%Lliah5SM$Tx_OOa{XPtK9Z#dq zIs6N-y4-g#kATZ}Fu#O5mb`=c6<8nj1Bp9?L>>jJyFcc9cnofAZP|Yx2RmME<|xng z(f#*qil6e|Kg@z}&6r*DXHgvEXQ^|oe3BUDwes15`%M0af*a%c4*qJvhhl%H;I@Ca z;63mU8}59W^Kanhm_7fua5ak`=Op{?@6fbAMajAU4EX7$%wj$r%kSa(YV+K8Olo4s z@H)BZXo z^ZOR~&8B32--hd}%|1QmYGRLfIlupeJHPs9OWyB+wUzVxK3rWbi(1V6_~Z|A3vF@c)86ACk}i;QFZN=e1Z)m3oRfxn}1>Hz)6v?dRVV zeUpdwl?@^Q6f^hYel>fl=y-2S%f;KK`Ue^wa>0#vYQeRiUU2PabntUK_<0@tf)0L32fw0&f2rX1 ze`UeFrd(5S^SQo*-&%0n|DfRd-&t_&PZV7H^Bw%P4*o_5f2)JP+ri)K;2(7GmARO> zzP%3kEVKl6?<*Fk&bhfHSUr3xu;-um0`5Ue!}U@3y_VWCV8Yb@7EZh8yyud7`dSWb zU&EVwc-t+Hrmnx|nmqlk2sTFeN??7w7T9)Wus-U^V-;}n&~9AMS@p#E1lT)hWjI{MVLPYk|wyYs1YsvDX3Xqn_Bqz=^Hh`(0zZmuO4u z^}uE9_2G^!u{Qwgqn_9sf)iVNV!JPCOYDuoz9FJo^C*GE0EHv=cO_QZCN(`Iaz zTeUgZy*by_E#bCXzp?rMo81U@%=&3h+pU|n;oCGk*Qaga`l#D}D{8fjYX`8`h_v4k z?zJJ;vYqrTO0H!)qnV@ES^v*^{!Pyf4t_1Cs5wLJgEb9b=+ zKFK!P^chaAp4fYVJyzP>%jL1{19rUH+}Gu~xBR4>*tXG@Hv58Iv$k>Xm&dk0*fpok z>wrAA1HtL*0I)pYqZ|Z2fWC}pJMB3>2ZPN;pRAih!Orbk6zzvl?8kHZFtBrw?~)D& ztJ%hVWE2gL1iOzML7n`LQlq5Z(O}!EJ07o#YU$@#u>E8m90zs{rev?{Mc1Z(`Z^x$ z8p^X#AKZ58>3w1beR)pQ&*D z)YI2=u-6smXBt?ZceOLXXJAuLjG18LXtT{|YPIxv3OH-~WUxGaod(W%cq&+)cAo~j z?-=uRu-vunarg|_eC$P>!Y4FcY}?S@&6R8pSrobx84Kp+*|KOQ_uIC_ccDlxgRdact5(fTrVF0yGDjl zw0WPE@jVDPu0A<-4}t%$>%`B{_1B)U{2c6goa6g2SU>fQ?-yXls4d6l5wPcLnfEWz z)NMBe+poaBPf^dc^3g`qmixiSz>d#jr`_?n|7DDiqnU$#(S8k9H@?U9POw_m^ONB6 zT>TB)_W+L5+x~*ZeDwi+p~?nBD($Q zmpFd_Yd22%|0BH2@lSC5)H7GlfiqXyGgr>R6L9T0wl9E37yL!=1r2u&UIN=+=Jd~S zebf`BD!1CDM2A|)wdkZYjb^jf(zwgg@w$q+={{*MMcfs=5 z-Up|@_rUVlJ_M(~55V&D_Yrsm{Ta`8+B4>l!RDinu{;j{0+)03Z@7NyY4;zn^QFzX zd7fG=`TQ5``pEA9{~uWGYWf)DBBLX`!k>c9%y^*$D zYgYlUfseYe<>fov%T0#QC6ujc-$Q+Afxp;b?_(~bnAa85c@Nt|y!jih&)OY)y$-%{ z2j9Gd@7ci*FL)2}kL}=N3vU18I`}{bKegeR*VW*TaRk>J?*~?gdq1!^a~+>G(A4v6 zuqN1c>Up2F7TDvlJ4L(4!nsj5_9%?Qz{XyOI_qj(u)6-vom_v%vOd@tbHMT60InXs zA=q}g7H$OAN8Omtzgqk^0juSjxGC7Y{dz)MzB}Cvtj*uy;=0`u?8oy~+ZL3aD6R)_ z;%^0Zo#bb=w}z|5z75#^lkc`*ebkfFc3^W_iK0E%;_bm+hqWi(4q)TuXYO_c>!uz9k)s|ShgY8dSa#JgF zGspC^2iW}e^}La1E$sz%EgjOlqlH#`^Ot(=TlZ;vT+4HcF@6$VTVn0o_>H7a-}`~p zGoJmywo}isJpinpHV1;swRjL*AN3sDgTXnr+A}wYfX!cf;vEWh-0?XKte?7bvM04# z{Eq;uCBGxVYU%qZaQfDku^kQeSZUAw+cAyr`smur`#1L_?Kw}61ACs9&v(6W_4pj$ z_{=GeLm!%Y?n6g`&2Jb*TYi?>y{TfG`b2OG(T|AE3?+5d2 zJs$3UrH?j!++Wq5Q=jiY1-4(u;r@66*mXC&_-zxbR4 z)=xciaWdHXnMGgD%_(3teKU7z@jnghwKVf`CS2_divFiktHpm7SpVd77F?ek-?PDL zDe?O(nrkw1a4y(+I)^$w=YiF8E}ajyoqE>%=fEB#*Sz+u`SgDQnm#GEa~?k5wDTRj zV=zyB9i!vXo-tks&KPa`1-NsXJTC$}mh^csSS=-eUV>(>_GwJx=<7X>Ht%u%AAI)q AH~;_u diff --git a/packages/ludic.render3d/shaders/spv/grass_cull.comp.spv b/packages/ludic.render3d/shaders/spv/grass_cull.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..4b9c926000f26850a2e1d63b9e66b526f51582a5 GIT binary patch literal 24092 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 literal 0 HcmV?d00001 diff --git a/packages/ludic.render3d/shaders/spv/grass_reset.comp.spv b/packages/ludic.render3d/shaders/spv/grass_reset.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..0d6a330234f111f0231975dba7375cea307f4fcb GIT binary patch literal 1112 zcmZ9KNlF7j6o$*hIM4HJCvjH9g^C~w;vz0w2%aFCjf;pR9>9eM@*ti^R1o~WPM0)R z^YiBay?WKfLbW%9t}qz-!cOR%@le1M@b#p!c71!j-+pfFA08c;F%pVtqB*0X#1}$0 zXx1Md4UAEzJr2x?C{kCze#cQFBVSV@)<^6P7_;`K-l{j-A!XC{*udOL;VgDQJ7{GoSe@9apHK%jFzb7d&}n@ zYE)_G`L?kK!918`GG{BpD5v@~HTFw@C&A{?Qt02!;{66Wv)E(EIO7UT-cz5o6G(aW zoo2TCjJ>AN6VL_Z)}96)>t~SW%0GqX+{^Tcd$FH;&^CV=X}&)DX}be`arOk=|0voO z^nCw~%=T_u==OF$duZD3(3*&2*yQ((Jm!Alv4=CbKmRx7IZ<`@_eIVC(p=>SxkJcd z;4waeG_E`&?kuA~jteaJGYj0Qdy_Zj&7m86V-oka0Ib#j4VSk6f<5h_9&1<8?eR*j zJ int { let depth_remap = "\n#undef main\nvoid main() {\n ludic_gl_main();\n gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n}\n" # invariant: the foliage's depth prepass and its lit pass (depth EQUAL) are different variants, # and without it the compiler may compute their positions a hair apart and fail the test - var vsrc = "#version 460\n" + defines + shd_wind + "invariant gl_Position;\n#define main ludic_gl_main\n" + shd_file(parts[0]) + depth_remap + # as programs.ludic: a blade's vertex stage gets the noise its colour field needs + var vnoise = "" + if Text.contains(defines, "#define GBLADE") { vnoise = shd_noise } + var vsrc = "#version 460\n" + defines + shd_wind + vnoise + "invariant gl_Position;\n#define main ludic_gl_main\n" + shd_file(parts[0]) + depth_remap # A mesh shader stands in for the vertex stage (a variant whose first file is *.mesh): it writes an # array of positions, so it cannot be wrapped for the depth remap or take invariant gl_Position - # it remaps depth itself. Its SPIR-V keeps the .vert name, so the manifest and loader are unchanged. @@ -304,7 +307,8 @@ function cmd_shaders() -> int { let cp = Text.split(cl, "|") if len(cp) < 2 { err(`shaders: bad compute line: {cl}\n`); return 1 } let glsl = `{tmp}/{cp[0]}.comp.glsl` - if not write_file(glsl, "#version 460\n" + shd_file(cp[1])) { err(`shaders: cannot write {glsl}\n`); return 1 } + # the noise functions come first, as in a fragment stage (grass_cull uses them; the rest ignore them) + if not write_file(glsl, "#version 460\n" + shd_noise + shd_file(cp[1])) { err(`shaders: cannot write {glsl}\n`); return 1 } let spv = `{outdir}/{cp[0]}.comp.spv` let logf = `{tmp}/{cp[0]}.comp.log` if not shq(`{shd_q(shd_bin + "/glslangValidator")} -V -S comp {shd_q(glsl)} -o {shd_q(spv)} > {shd_q(logf)} 2>&1`) {