@woosh/meep-engine 3.39.0 → 3.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/engine/EngineHarness.d.ts.map +1 -1
  4. package/src/engine/EngineHarness.js +17 -4
  5. package/src/engine/asset/loaders/image/avif/threaded_image_encoder.js +1 -1
  6. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  7. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
  8. package/src/engine/graphics/ecs/water/Water.d.ts +14 -17
  9. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  10. package/src/engine/graphics/ecs/water/Water.js +100 -110
  11. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  12. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +36 -38
  13. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts +6 -0
  14. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts.map +1 -0
  15. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.js +10 -0
  16. package/src/engine/graphics/ecs/water/WaterWaves.d.ts +3 -3
  17. package/src/engine/graphics/ecs/water/WaterWaves.js +46 -46
  18. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -1
  19. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +8 -5
  20. package/src/engine/graphics3/WaterSystem.d.ts +21 -74
  21. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  22. package/src/engine/graphics3/WaterSystem.js +174 -367
  23. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  24. package/src/format/image/avif/api/convert_to_rgba.d.ts +2 -2
  25. package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
  26. package/src/format/image/avif/api/convert_to_rgba.js +10 -9
  27. package/src/format/image/avif/api/decode_avif.d.ts +2 -2
  28. package/src/format/image/avif/api/decode_avif.d.ts.map +1 -1
  29. package/src/format/image/avif/api/decode_avif.js +1 -1
  30. package/src/shade/playground/ssr_reprojection/README.md +111 -103
  31. package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -68
  32. package/src/shade/playground/ssr_reprojection/index.html +80 -79
  33. package/src/shade/playground/ssr_reprojection/main.js +256 -247
  34. package/src/shade/playground/ssr_variance/capture.js +96 -96
  35. package/src/shade/playground/ssr_variance/reference.js +78 -78
  36. package/src/shade/playground/vsm/README.md +96 -0
  37. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts +49 -0
  38. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -0
  39. package/src/shade/playground/vsm/VSMDebugOverlay.js +351 -0
  40. package/src/shade/playground/vsm/clipmap_panel.d.ts +8 -0
  41. package/src/shade/playground/vsm/clipmap_panel.d.ts.map +1 -0
  42. package/src/shade/playground/vsm/clipmap_panel.js +138 -0
  43. package/src/shade/playground/vsm/index.html +170 -0
  44. package/src/shade/playground/vsm/main.d.ts +2 -0
  45. package/src/shade/playground/vsm/main.d.ts.map +1 -0
  46. package/src/shade/playground/vsm/main.js +389 -0
  47. package/src/shade/playground/vsm/scenes.d.ts +52 -0
  48. package/src/shade/playground/vsm/scenes.d.ts.map +1 -0
  49. package/src/shade/playground/vsm/scenes.js +320 -0
  50. package/src/shade/playground/vsm/verify_vsm.d.ts +38 -0
  51. package/src/shade/playground/vsm/verify_vsm.d.ts.map +1 -0
  52. package/src/shade/playground/vsm/verify_vsm.js +305 -0
  53. package/src/shade/playground/water_refraction/README.md +57 -9
  54. package/src/shade/playground/water_refraction/main.js +12 -3
  55. package/src/shade/playground/water_refraction/world.d.ts +1 -0
  56. package/src/shade/playground/water_refraction/world.d.ts.map +1 -1
  57. package/src/shade/playground/water_refraction/world.js +15 -5
  58. package/src/shade/renderer/Renderer.d.ts +19 -0
  59. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  60. package/src/shade/renderer/Renderer.js +72 -1
  61. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +8 -0
  62. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  63. package/src/shade/renderer/animation/GPUAnimationManager.js +18 -0
  64. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +7 -0
  65. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  66. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -0
  67. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -1
  68. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  69. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +10 -1
  70. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.d.ts.map +1 -1
  71. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.js +28 -0
  72. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.d.ts.map +1 -1
  73. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.js +31 -1
  74. package/src/shade/renderer/geometry/MeshletGeometry.d.ts +3 -0
  75. package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
  76. package/src/shade/renderer/geometry/MeshletGeometry.js +1 -0
  77. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  78. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +62 -4
  79. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  80. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.js +2 -2
  81. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts +2 -2
  82. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts.map +1 -1
  83. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js +6 -14
  84. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts.map +1 -1
  85. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js +5 -1
  86. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  87. package/src/shade/renderer/medium/ParticipatingMedium.d.ts +3 -0
  88. package/src/shade/renderer/medium/ParticipatingMedium.d.ts.map +1 -1
  89. package/src/shade/renderer/medium/ParticipatingMedium.js +7 -0
  90. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.d.ts.map +1 -1
  91. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js +5 -35
  92. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  93. package/src/shade/renderer/postprocess/ssr/SSR.d.ts +12 -4
  94. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  95. package/src/shade/renderer/postprocess/ssr/SSR.js +36 -8
  96. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts +3 -0
  97. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts.map +1 -0
  98. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js +2 -0
  99. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts +8 -0
  100. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts.map +1 -0
  101. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js +40 -0
  102. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  103. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +150 -137
  104. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts +3 -0
  105. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts.map +1 -0
  106. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js +44 -0
  107. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts +5 -0
  108. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts.map +1 -0
  109. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js +35 -0
  110. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts +26 -0
  111. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts.map +1 -0
  112. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js +42 -0
  113. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +1 -0
  114. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
  115. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +113 -105
  116. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +2 -0
  117. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  118. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +177 -167
  119. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.d.ts.map +1 -1
  120. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js +10 -0
  121. package/src/shade/renderer/rasterize/RasterizationJob.d.ts +1 -2
  122. package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
  123. package/src/shade/renderer/rasterize/RasterizationJob.js +1 -2
  124. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +5 -6
  125. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  126. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +5 -6
  127. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +2 -2
  128. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  129. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +1 -1
  130. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
  131. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +11 -0
  132. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.d.ts.map +1 -1
  133. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.js +4 -5
  134. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.d.ts.map +1 -1
  135. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.js +1 -5
  136. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts +30 -0
  137. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts.map +1 -0
  138. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.js +54 -0
  139. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  140. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +3 -2
  141. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts +19 -0
  142. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts.map +1 -0
  143. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js +27 -0
  144. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +1 -0
  145. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  146. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -0
  147. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +54 -0
  148. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  149. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +502 -10
  150. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +3 -2
  151. package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
  152. package/src/shade/renderer/shadow/map/Shadowmap.js +3 -2
  153. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts +8 -0
  154. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map +1 -1
  155. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js +34 -3
  156. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +3 -2
  157. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
  158. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +17 -2
  159. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
  160. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +137 -133
  161. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts +15 -0
  162. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map +1 -0
  163. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js +14 -0
  164. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts +16 -0
  165. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts.map +1 -0
  166. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js +15 -0
  167. package/src/shade/renderer/shadow/vsm/PLAN.md +440 -0
  168. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +43 -0
  169. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +42 -0
  170. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +1 -0
  171. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +153 -0
  172. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +327 -0
  173. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -0
  174. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +1408 -0
  175. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts +14 -0
  176. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts.map +1 -0
  177. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.js +13 -0
  178. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts +63 -0
  179. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts.map +1 -0
  180. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.js +70 -0
  181. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts +11 -0
  182. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts.map +1 -0
  183. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.js +10 -0
  184. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +54 -0
  185. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +1 -0
  186. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +75 -0
  187. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts +23 -0
  188. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts.map +1 -0
  189. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.js +85 -0
  190. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts +16 -0
  191. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts.map +1 -0
  192. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.js +29 -0
  193. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +136 -25
  194. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
  195. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +282 -116
  196. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +39 -0
  197. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -0
  198. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +289 -0
  199. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts +18 -0
  200. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts.map +1 -0
  201. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.js +65 -0
  202. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts +17 -0
  203. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts.map +1 -0
  204. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.js +75 -0
  205. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +14 -0
  206. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +1 -0
  207. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +45 -0
  208. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts +17 -0
  209. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts.map +1 -0
  210. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.js +100 -0
  211. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts +15 -0
  212. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts.map +1 -0
  213. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.js +47 -0
  214. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts +26 -0
  215. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts.map +1 -0
  216. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.js +156 -0
  217. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts +13 -0
  218. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts.map +1 -0
  219. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.js +65 -0
  220. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +30 -0
  221. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +1 -0
  222. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +184 -0
  223. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +23 -0
  224. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +1 -0
  225. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +109 -0
  226. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts +56 -0
  227. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts.map +1 -0
  228. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +211 -0
  229. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts +1 -1
  230. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts.map +1 -1
  231. package/src/shade/renderer/texture/format/decode_typed_gpu_data.js +3 -13
  232. package/src/shade/renderer/texture/format/infer_format_from_parameters.d.ts.map +1 -1
  233. package/src/shade/renderer/texture/format/infer_format_from_parameters.js +2 -3
  234. package/src/shade/renderer/texture/texture_write_to_gpu.d.ts.map +1 -1
  235. package/src/shade/renderer/texture/texture_write_to_gpu.js +16 -16
  236. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts +4 -90
  237. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts.map +1 -1
  238. package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +6 -210
  239. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts +119 -0
  240. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts.map +1 -0
  241. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.js +245 -0
  242. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts +1 -1
  243. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts.map +1 -1
  244. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +3 -19
  245. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts +13 -0
  246. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts.map +1 -0
  247. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js +34 -0
  248. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +7 -2
  249. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  250. package/src/shade/renderer/water/GPUWaterRenderer.js +49 -49
  251. package/src/shade/renderer/water/chunk_water_transport.js +3 -3
  252. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +11 -25
  253. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  254. package/src/shade/renderer/water/medium/GPUWaterBodies.js +64 -116
  255. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts +1 -20
  256. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts.map +1 -1
  257. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.js +10 -42
  258. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts +3 -0
  259. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts.map +1 -0
  260. package/src/shade/renderer/water/medium/chunk_water_bodies.js +3 -0
  261. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +1 -5
  262. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +1 -1
  263. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +32 -30
  264. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +4 -0
  265. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -0
  266. package/src/shade/renderer/water/medium/shader_water_meshlets.js +69 -0
  267. package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts.map +1 -1
  268. package/src/shade/renderer/water/optics/chunk_water_inscatter.js +124 -123
  269. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  270. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +75 -74
  271. package/src/shade/renderer/water/shader_water.d.ts +1 -1
  272. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  273. package/src/shade/renderer/water/shader_water.js +490 -406
  274. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +12 -85
  275. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +1 -1
  276. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +128 -408
  277. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +6 -0
  278. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -0
  279. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +23 -0
  280. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +9 -0
  281. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +1 -0
  282. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +144 -0
  283. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +3 -5
  284. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +1 -1
  285. package/src/shade/renderer/water/surface/chunk_water_wave.js +40 -48
  286. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +14 -0
  287. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -0
  288. package/src/shade/renderer/water/surface/graph_water_tessellation.js +34 -0
  289. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +4 -0
  290. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +1 -0
  291. package/src/shade/renderer/water/surface/shader_water_tiles.js +123 -0
  292. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +6 -0
  293. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +1 -0
  294. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +85 -0
  295. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +6 -0
  296. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +1 -0
  297. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +83 -0
  298. package/src/shade/renderer/water/water_height_texture_from_sampler.d.ts.map +1 -1
  299. package/src/shade/renderer/water/water_height_texture_from_sampler.js +4 -3
  300. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts +0 -2
  301. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts.map +0 -1
  302. package/src/engine/graphics/ecs/water/WATER_SIZE.js +0 -1
  303. package/src/shade/renderer/light/GPUViewLightContext.d.ts +0 -22
  304. package/src/shade/renderer/light/GPUViewLightContext.d.ts.map +0 -1
  305. package/src/shade/renderer/light/GPUViewLightContext.js +0 -62
  306. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts +0 -14
  307. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts.map +0 -1
  308. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.js +0 -20
  309. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts +0 -27
  310. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +0 -1
  311. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +0 -147
  312. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts +0 -7
  313. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts.map +0 -1
  314. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.js +0 -10
  315. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts +0 -2
  316. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts.map +0 -1
  317. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.js +0 -1
  318. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts +0 -3
  319. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts.map +0 -1
  320. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.js +0 -8
  321. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts +0 -27
  322. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts.map +0 -1
  323. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.js +0 -102
  324. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts +0 -8
  325. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts.map +0 -1
  326. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.js +0 -34
  327. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts +0 -10
  328. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts.map +0 -1
  329. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.js +0 -64
  330. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts +0 -11
  331. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts.map +0 -1
  332. package/src/shade/renderer/shadow/vsm/decode_tile_address.js +0 -26
  333. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts +0 -2
  334. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts.map +0 -1
  335. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.js +0 -11
  336. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts +0 -20
  337. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts.map +0 -1
  338. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.js +0 -184
  339. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts +0 -25
  340. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts.map +0 -1
  341. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.js +0 -230
  342. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts +0 -19
  343. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts.map +0 -1
  344. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.js +0 -127
  345. package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +0 -462
  346. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts +0 -23
  347. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts.map +0 -1
  348. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts +0 -18
  349. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts.map +0 -1
  350. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts +0 -12
  351. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts.map +0 -1
  352. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.js +0 -27
  353. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts +0 -14
  354. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts.map +0 -1
  355. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.js +0 -49
  356. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts +0 -9
  357. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts.map +0 -1
  358. package/src/shade/renderer/water/surface/chunk_water_wave_grid.js +0 -47
  359. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts +0 -10
  360. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts.map +0 -1
  361. package/src/shade/renderer/water/surface/shader_water_surface_write.js +0 -51
  362. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts +0 -12
  363. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts.map +0 -1
  364. package/src/shade/renderer/water/surface/shader_water_wave_step.js +0 -54
  365. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts +0 -13
  366. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts.map +0 -1
  367. package/src/shade/renderer/water/surface/water_surface_grid_indices.js +0 -39
@@ -1,105 +1,113 @@
1
- import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
2
- import { chunk_screen_coordinate_to_world } from "../../shader/chunk/camera/chunk_screen_coordinate_to_world.js";
3
- import { chunk_get_view_space_depth } from "../../shader/chunk/depth/chunk_get_view_space_depth.js";
4
- import { chunk_decode_g_buffer_normal } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
5
- import { chunk_decode_g_buffer_roughness } from "../../shader/chunk/material/chunk_decode_g_buffer_roughness.js";
6
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
7
- import { ImageShader } from "../../shader/ImageShader.js";
8
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
9
- import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
10
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
11
- import { f32, u32, vec2f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
12
- import { chunk_taa_velocity_confidence } from "../taa/shader_taa.js";
13
- import { chunk_depth_clip_offset_codec } from "../taa/chunk_depth_clip_offset_codec.js";
14
- import { chunk_ssr_reprojection } from "./reproject/chunk_ssr_reprojection.js";
15
- import { chunk_ssr_sample_history } from "./reproject/chunk_ssr_sample_history.js";
16
- import { chunk_ssr_temporal_accumulate } from "./reproject/chunk_ssr_temporal_accumulate.js";
17
- import { chunk_rgb_to_luminance } from "../../shader/chunk/color/chunk_rgb_to_luminance.js";
18
-
19
- const settings = WebGPUStruct.from({ history_validity: f32, reprojection_mode: u32, jitter_delta: vec2f });
20
- const resources = new ShaderResourceSetDescriptor();
21
- resources.setImmediate("settings", settings);
22
- resources.createGroup()
23
- .addTexture("tInput")
24
- .addTexture("tMetadata", "unfilterable-float")
25
- .addTexture("tDepth")
26
- .addTexture("tNormal", "uint")
27
- .addTexture("tPBR")
28
- .addTexture("tVelocity")
29
- .addTexture("tOcclusion")
30
- .addTexture("tHistory")
31
- .addTexture("tHistoryMetadata", "unfilterable-float")
32
- .addTexture("tHistoryGeometry")
33
- .addTexture("tPreviousDepth")
34
- .addUniform("camera_current", CAMERA_UNIFORM_STRUCT)
35
- .addUniform("camera_previous", CAMERA_UNIFORM_STRUCT);
36
-
37
- const body = CodeChunk.from(/* language=WGSL */ `
38
- struct SSRTemporalOutput {
39
- @location(0) radiance: vec4f,
40
- @location(1) metadata: vec4f,
41
- @location(2) geometry: vec4f,
42
- }
43
-
44
- @fragment
45
- fn main(@builtin(position) coord: vec4f) -> SSRTemporalOutput {
46
- let st = vec2i(coord.xy);
47
- let current = textureLoad(tInput, st, 0);
48
- let metadata = textureLoad(tMetadata, st, 0).rg;
49
- let normal = decode_g_buffer_normal(textureLoad(tNormal, st, 0).xy);
50
- let roughness = decode_g_buffer_roughness(textureLoad(tPBR, st, 0));
51
- var output: SSRTemporalOutput;
52
- output.radiance = current;
53
- output.metadata = vec4f(metadata, 1.0, rgb_to_luminance(current.rgb));
54
- output.geometry = vec4f(normal, roughness);
55
- let depth = textureLoad(tDepth, st, 0).r;
56
- // A reset must never read history, even when stale textures contain non-finite values.
57
- if (settings.history_validity <= 0.0 || settings.reprojection_mode == 2u || is_background(depth)) { return output; }
58
-
59
- let position = screen_coordinate_to_world(vec2u(st), tDepth, camera_current);
60
- let camera_position = camera_current.view_matrix_inverse[3].xyz;
61
- let virtual_position = ssr_virtual_position(camera_position, position, metadata.x);
62
- let plane_tolerance = max(1e-4, 0.002 * get_view_space_depth(depth, camera_current));
63
- let size = vec2f(textureDimensions(tHistory));
64
- var history: SSRHistorySample;
65
- var confidence = 0.0;
66
- var motion_confidence = 1.0;
67
- var history_uv = vec2f(0.0);
68
- let virtual_eligible = settings.reprojection_mode != 1u && metadata.y >= 0.5 && metadata.x > 0.0 && is_finite(metadata.x) && roughness <= 0.2;
69
- if (virtual_eligible) {
70
- let uv = ssr_history_uv(virtual_position, camera_previous.view_projection_matrix);
71
- history_uv = uv;
72
- history = ssr_sample_history(uv, position, normal, roughness, metadata, virtual_position, true, plane_tolerance);
73
- confidence = history.confidence;
74
- }
75
- if (confidence < 0.5) {
76
- let velocity = depth_clip_validated_velocity(tOcclusion, tVelocity, st);
77
- motion_confidence = taa_velocity_confidence(velocity);
78
- let surface_confidence = textureLoad(tOcclusion, st, 0).r * motion_confidence;
79
- if (surface_confidence <= 0.001) { return output; }
80
- let uv = ssr_surface_history_uv(coord.xy, velocity, settings.jitter_delta, size);
81
- history_uv = uv;
82
- history = ssr_sample_history(uv, position, normal, roughness, metadata, virtual_position, false, plane_tolerance);
83
- confidence = history.confidence * surface_confidence;
84
- confidence *= ssr_surface_parallax_confidence(camera_position,position,metadata.x,camera_previous.view_projection_matrix,size);
85
- // Surface correspondence alone cannot justify a long history for a smooth finite reflection.
86
- if (virtual_eligible) { confidence *= 0.25; }
87
- }
88
- if (confidence <= 0.001) { return output; }
89
-
90
- let accumulated = ssr_temporal_accumulate(current, history.radiance, history.age,
91
- history.short_luma, confidence, motion_confidence, st, history_uv);
92
- output.radiance = accumulated.radiance;
93
- output.metadata.z = accumulated.age;
94
- output.metadata.w = accumulated.short_luma;
95
- return output;
96
- }
97
- `, [chunk_ssr_reprojection, chunk_ssr_sample_history, chunk_screen_coordinate_to_world,
98
- chunk_get_view_space_depth, chunk_decode_g_buffer_normal, chunk_decode_g_buffer_roughness,
99
- chunk_depth_clip_offset_codec, chunk_taa_velocity_confidence,
100
- chunk_ssr_temporal_accumulate, chunk_rgb_to_luminance]);
101
-
102
- export const ssr_reproject_shader = new ImageShader({
103
- descriptor: ShaderDescriptor.from({ label: "SSR Reproject", body, resources }),
104
- targets: [{ format: "rgba16float" }, { format: "rgba32float" }, { format: "rgba16float" }],
105
- });
1
+ import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
2
+ import { chunk_screen_coordinate_to_world } from "../../shader/chunk/camera/chunk_screen_coordinate_to_world.js";
3
+ import { chunk_get_view_space_depth } from "../../shader/chunk/depth/chunk_get_view_space_depth.js";
4
+ import { chunk_decode_g_buffer_normal } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
5
+ import { chunk_decode_g_buffer_roughness } from "../../shader/chunk/material/chunk_decode_g_buffer_roughness.js";
6
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
7
+ import { ImageShader } from "../../shader/ImageShader.js";
8
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
9
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
10
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
11
+ import { f32, u32, vec2f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
12
+ import { chunk_taa_velocity_confidence } from "../taa/shader_taa.js";
13
+ import { chunk_depth_clip_offset_codec } from "../taa/chunk_depth_clip_offset_codec.js";
14
+ import { chunk_ssr_reprojection } from "./reproject/chunk_ssr_reprojection.js";
15
+ import { chunk_ssr_sample_history } from "./reproject/chunk_ssr_sample_history.js";
16
+ import { chunk_ssr_temporal_accumulate } from "./reproject/chunk_ssr_temporal_accumulate.js";
17
+ import { chunk_rgb_to_luminance } from "../../shader/chunk/color/chunk_rgb_to_luminance.js";
18
+ import { SSR_DENOISE_TILE_SIZE } from "./SSR_DENOISE_TILE_SIZE.js";
19
+
20
+ const settings = WebGPUStruct.from({ history_validity: f32, reprojection_mode: u32, jitter_delta: vec2f });
21
+ function create_reproject_shader(tiled) {
22
+ const resources = new ShaderResourceSetDescriptor();
23
+ resources.setImmediate("settings", settings);
24
+ const group = resources.createGroup()
25
+ .addTexture("tInput")
26
+ .addTexture("tMetadata", "unfilterable-float")
27
+ .addTexture("tDepth")
28
+ .addTexture("tNormal", "uint")
29
+ .addTexture("tPBR")
30
+ .addTexture("tVelocity")
31
+ .addTexture("tOcclusion")
32
+ .addTexture("tHistory")
33
+ .addTexture("tHistoryMetadata", "unfilterable-float")
34
+ .addTexture("tHistoryGeometry")
35
+ .addTexture("tPreviousDepth")
36
+ .addUniform("camera_current", CAMERA_UNIFORM_STRUCT)
37
+ .addUniform("camera_previous", CAMERA_UNIFORM_STRUCT);
38
+ if (tiled) { group.addTexture("tDenoiseTiles", "uint"); }
39
+
40
+ const body = CodeChunk.from(/* language=WGSL */ `
41
+ struct SSRTemporalOutput {
42
+ @location(0) radiance: vec4f,
43
+ @location(1) metadata: vec4f,
44
+ @location(2) geometry: vec4f,
45
+ }
46
+
47
+ @fragment
48
+ fn main(@builtin(position) coord: vec4f) -> SSRTemporalOutput {
49
+ let st = vec2i(coord.xy);
50
+ let current = textureLoad(tInput, st, 0);
51
+ let metadata = textureLoad(tMetadata, st, 0).rg;
52
+ let normal = decode_g_buffer_normal(textureLoad(tNormal, st, 0).xy);
53
+ let roughness = decode_g_buffer_roughness(textureLoad(tPBR, st, 0));
54
+ var output: SSRTemporalOutput;
55
+ output.radiance = current;
56
+ output.metadata = vec4f(metadata, 1.0, rgb_to_luminance(current.rgb));
57
+ output.geometry = vec4f(normal, roughness);
58
+ let depth = textureLoad(tDepth, st, 0).r;
59
+ // A reset must never read history, even when stale textures contain non-finite values.
60
+ if (settings.history_validity <= 0.0 || settings.reprojection_mode == 2u || is_background(depth)) { return output; }
61
+
62
+ let position = screen_coordinate_to_world(vec2u(st), tDepth, camera_current);
63
+ let camera_position = camera_current.view_matrix_inverse[3].xyz;
64
+ let virtual_position = ssr_virtual_position(camera_position, position, metadata.x);
65
+ let plane_tolerance = max(1e-4, 0.002 * get_view_space_depth(depth, camera_current));
66
+ let size = vec2f(textureDimensions(tHistory));
67
+ var history: SSRHistorySample;
68
+ var confidence = 0.0;
69
+ var motion_confidence = 1.0;
70
+ var history_uv = vec2f(0.0);
71
+ let virtual_eligible = settings.reprojection_mode != 1u && metadata.y >= 0.5 && metadata.x > 0.0 && is_finite(metadata.x) && roughness <= 0.2;
72
+ if (virtual_eligible) {
73
+ let uv = ssr_history_uv(virtual_position, camera_previous.view_projection_matrix);
74
+ history_uv = uv;
75
+ history = ssr_sample_history(uv, position, normal, roughness, metadata, virtual_position, true, plane_tolerance);
76
+ confidence = history.confidence;
77
+ }
78
+ if (confidence < 0.5) {
79
+ let velocity = depth_clip_validated_velocity(tOcclusion, tVelocity, st);
80
+ motion_confidence = taa_velocity_confidence(velocity);
81
+ let surface_confidence = textureLoad(tOcclusion, st, 0).r * motion_confidence;
82
+ if (surface_confidence <= 0.001) { return output; }
83
+ let uv = ssr_surface_history_uv(coord.xy, velocity, settings.jitter_delta, size);
84
+ history_uv = uv;
85
+ history = ssr_sample_history(uv, position, normal, roughness, metadata, virtual_position, false, plane_tolerance);
86
+ confidence = history.confidence * surface_confidence;
87
+ confidence *= ssr_surface_parallax_confidence(camera_position,position,metadata.x,camera_previous.view_projection_matrix,size);
88
+ // Surface correspondence alone cannot justify a long history for a smooth finite reflection.
89
+ if (virtual_eligible) { confidence *= 0.25; }
90
+ }
91
+ if (confidence <= 0.001) { return output; }
92
+
93
+ let accumulated = ssr_temporal_accumulate(current, history.radiance, history.age,
94
+ history.short_luma, confidence, motion_confidence, st, history_uv,
95
+ ${tiled ? `textureLoad(tDenoiseTiles, st / ${SSR_DENOISE_TILE_SIZE}, 0).r == 0u` : "false"});
96
+ output.radiance = accumulated.radiance;
97
+ output.metadata.z = accumulated.age;
98
+ output.metadata.w = accumulated.short_luma;
99
+ return output;
100
+ }
101
+ `, [chunk_ssr_reprojection, chunk_ssr_sample_history, chunk_screen_coordinate_to_world,
102
+ chunk_get_view_space_depth, chunk_decode_g_buffer_normal, chunk_decode_g_buffer_roughness,
103
+ chunk_depth_clip_offset_codec, chunk_taa_velocity_confidence,
104
+ chunk_ssr_temporal_accumulate, chunk_rgb_to_luminance]);
105
+
106
+ return new ImageShader({
107
+ descriptor: ShaderDescriptor.from({ label: "SSR Reproject" + (tiled ? " / tiles" : ""), body, resources }),
108
+ targets: [{ format: "rgba16float" }, { format: "rgba32float" }, { format: "rgba16float" }],
109
+ });
110
+ }
111
+
112
+ export const ssr_reproject_shader = create_reproject_shader(false);
113
+ export const ssr_reproject_tile_shader = create_reproject_shader(true);
@@ -1,4 +1,6 @@
1
1
  export const ssr_spatial_denoise_shader: ImageShader;
2
2
  export const ssr_spatial_denoise_metadata_shader: ImageShader;
3
+ export const ssr_spatial_denoise_tile_shader: ImageShader;
4
+ export const ssr_spatial_denoise_metadata_tile_shader: ImageShader;
3
5
  import { ImageShader } from "../../shader/ImageShader.js";
4
6
  //# sourceMappingURL=ssr_spatial_denoise_shader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ssr_spatial_denoise_shader.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js"],"names":[],"mappings":"AAqKA,qDAAuE;AACvE,8DAA+E;4BA5JnD,6BAA6B"}
1
+ {"version":3,"file":"ssr_spatial_denoise_shader.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js"],"names":[],"mappings":"AA6KA,qDAAuE;AACvE,8DAA+E;AAC/E,0DAAkF;AAClF,mEAA0F;4BArK9D,6BAA6B"}
@@ -1,167 +1,177 @@
1
- import { chunk_ssr_spatial_variance } from "./chunk_ssr_spatial_variance.js";
2
- import { chunk_ssr_metadata } from "./chunk_ssr_metadata.js";
3
- import { chunk_rgb_to_luminance } from "../../shader/chunk/color/chunk_rgb_to_luminance.js";
4
- import { chunk_rgb_to_YCoCg } from "../../shader/chunk/color/YCoCg/chunk_rgb_to_YCoCg.js";
5
- import { chunk_decode_g_buffer_normal } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
6
- import { chunk_safe_sqrt } from "../../shader/chunk/math/chunk_safe_sqrt.js";
7
- import {
8
- chunk_texture_channel_gaussian_3x3
9
- } from "../../shader/chunk/texture/chunk_texture_channel_gaussian_3x3.js";
10
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
11
- import { ImageShader } from "../../shader/ImageShader.js";
12
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
13
- import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
14
- import { chunk_luma_edge_stopping_weight } from "../../shader/chunk/filter/chunk_compute_edge_stopping_weight.js";
15
- import { ATORUS_UNIFORMS_STRUCT } from "../denoise/fragment_shader_denoise_ao.js";
16
- import {
17
- chunk_ffx_dnsr_reflections_get_edge_stopping_depth_weight
18
- } from "./prefilter/chunk_ffx_dnsr_reflections_get_edge_stopping_depth_weight.js";
19
- import {
20
- chunk_ffx_dnsr_reflections_get_edge_stopping_normal_weight
21
- } from "./prefilter/chunk_ffx_dnsr_reflections_get_edge_stopping_normal_weight.js";
22
-
23
- function create_spatial_shader(with_metadata) {
24
- const resources = new ShaderResourceSetDescriptor();
25
-
26
- // per-pass, four bytes, read-only: immediate data rather than a uniform buffer
27
- resources.setImmediate("settings", ATORUS_UNIFORMS_STRUCT);
28
- const group = resources.createGroup()
29
- .addTexture("tInput")
30
- .addTexture("tDepth")
31
- .addTexture("tNormal", "uint");
32
- if (with_metadata) { group.addTexture("tMetadata", "unfilterable-float"); }
33
-
34
- const body = CodeChunk.from(
35
- //language=WGSL
36
- `
37
- const phi_visibility = 10.0;
38
- const phi_normal = 32.0;
39
- const sigma_depth = 1.0;
40
-
41
- @fragment
42
- fn main(
43
- @builtin(position) coord: vec4<f32>,
44
- ) -> ${with_metadata ? "SSRResolveOutput" : "@location(0) vec4f"}{
45
- let ipos = vec2<i32>(coord.xy);
46
- let screen_size = vec2<i32>(textureDimensions(tInput));
47
-
48
- const eps_variance = 1e-10;
49
- const kernel_weights = array<f32,3>( 1.0, 2.0 / 3.0, 1.0 / 6.0 );
50
-
51
- // constant samplers to prevent the compiler from generating code which
52
- // fetches the sampler descriptor from memory for each texture access
53
- let center_color = textureLoad(tInput, ipos, 0);
54
-
55
- let center_color_luma = rgb_to_luminance(center_color.rgb);
56
-
57
- // variance for direct and indirect, filtered using 3x3 gaussin blur
58
- let input_variance = max(0.0, texture_channel_gaussian_3x3(ipos, tInput, 3));
59
- ${with_metadata ? ` let bootstrap_variance = ssr_spatial_variance(tInput,tDepth,tNormal,ipos);
60
- let variance = max(input_variance,bootstrap_variance);
61
- var sum_squared_weights = 1.0;` : ` let variance = input_variance;`}
62
-
63
- // explicitly store/accumulate center pixel with weight 1 to prevent issues
64
- // with the edge-stopping functions
65
- var sum_weight = 1.0;
66
- var sum_color = center_color;
67
- ${with_metadata ? ` let center_metadata = textureLoad(tMetadata, ipos, 0).rg;
68
- var distance_moments = ssr_distance_moments(center_metadata.x, center_metadata.y, 1.0);` : ""}
69
-
70
-
71
- let current_normal = decode_g_buffer_normal( textureLoad(tNormal, ipos, 0).xy );
72
- let center_depth = textureLoad(tDepth, ipos, 0).r;
73
-
74
- const offsets = array< vec2<i32>,8>(
75
- vec2( -1, -1 ),
76
- vec2( 0, -1 ) ,
77
- vec2( 1, -1 ),
78
- vec2( -1, 0 ),
79
- vec2( 1, 0 ),
80
- vec2( -1, 1 ),
81
- vec2( 0, 1 ),
82
- vec2( 1, 1 ),
83
- );
84
-
85
- const num_samples = 8;
86
-
87
- let std_dev = safe_sqrt(variance);
88
-
89
- for(var i = 0; i < num_samples; i++){
90
- let offset: vec2i = offsets[i];
91
-
92
- let p = ipos + offset * settings.step_size;
93
- let inside = all(p >= vec2(0, 0)) && all(p < screen_size);
94
-
95
- if(!inside){
96
- // off-screen
97
- continue;
98
- }
99
-
100
- let kernel = kernel_weights[ abs(offset.x) ] * kernel_weights[ abs(offset.y) ];
101
-
102
- let sample_color = textureLoad(tInput, p, 0);
103
- let sample_color_luma = rgb_to_luminance(sample_color.rgb);
104
-
105
- let sample_normal = decode_g_buffer_normal(textureLoad(tNormal, p, 0).xy);
106
- let sample_depth = textureLoad(tDepth, p, 0).r;
107
-
108
- // compute the edge-stopping functions
109
- var weight = 1.0;
110
-
111
- let phi_luma = max(0.001,std_dev * phi_visibility);
112
-
113
- weight *= ffx_dnsr_reflections_get_edge_stopping_normal_weight(current_normal, sample_normal);
114
- weight *= ffx_dnsr_reflections_get_edge_stopping_depth_weight(center_depth, sample_depth);
115
- weight *= exp(-luma_edge_stopping_weight(center_color_luma,sample_color_luma,phi_luma));
116
-
117
- let w_visibility = weight * kernel;
118
- ${with_metadata ? ` let metadata = textureLoad(tMetadata, p, 0).rg;
119
- distance_moments += ssr_distance_moments(metadata.x, metadata.y, w_visibility);` : ""}
120
-
121
- // alpha channel contains the variance, therefore the weights need to be squared, see paper for the formula
122
- sum_weight += w_visibility;
123
- ${with_metadata ? ` sum_squared_weights += w_visibility*w_visibility;` : ""}
124
- sum_color += vec4(vec3(w_visibility), w_visibility * w_visibility) * sample_color;
125
- }
126
-
127
- var out_visibility = sum_color / vec4(vec3(sum_weight), sum_weight * sum_weight);
128
- ${with_metadata ? ` // Carry bootstrap uncertainty forward so the next passes do not freeze again.
129
- out_visibility.w = max(out_visibility.w,bootstrap_variance*sum_squared_weights/(sum_weight*sum_weight));` : ""}
130
-
131
- ${with_metadata ? ` var output: SSRResolveOutput;
132
- output.radiance = out_visibility;
133
- output.metadata = ssr_resolve_metadata(distance_moments, 1.0);
134
- return output;` : " return out_visibility;"}
135
- }
136
- `,
137
- [
138
- chunk_ssr_metadata,
139
- ...(with_metadata ? [chunk_ssr_spatial_variance] : []),
140
- ATORUS_UNIFORMS_STRUCT.declaration_chunk,
141
- chunk_texture_channel_gaussian_3x3,
142
- chunk_decode_g_buffer_normal,
143
- chunk_rgb_to_luminance,
144
- chunk_rgb_to_YCoCg,
145
- chunk_ffx_dnsr_reflections_get_edge_stopping_normal_weight,
146
- chunk_ffx_dnsr_reflections_get_edge_stopping_depth_weight,
147
- chunk_luma_edge_stopping_weight,
148
- chunk_safe_sqrt,
149
- ]);
150
-
151
- return new ImageShader({
152
- descriptor: ShaderDescriptor.from({
153
- label: with_metadata ? "SSR / spatial denoise with metadata" : "SSR / spatial denoise",
154
- body,
155
- resources
156
- }),
157
- targets: [
158
- {
159
- format: "rgba16float"
160
- },
161
- ...(with_metadata ? [{ format: "rg32float" }] : [])
162
- ]
163
- })
164
- }
165
-
166
- export const ssr_spatial_denoise_shader = create_spatial_shader(false);
167
- export const ssr_spatial_denoise_metadata_shader = create_spatial_shader(true);
1
+ import { chunk_ssr_spatial_variance } from "./chunk_ssr_spatial_variance.js";
2
+ import { chunk_ssr_metadata } from "./chunk_ssr_metadata.js";
3
+ import { SSR_DENOISE_TILE_SIZE } from "./SSR_DENOISE_TILE_SIZE.js";
4
+ import { chunk_rgb_to_luminance } from "../../shader/chunk/color/chunk_rgb_to_luminance.js";
5
+ import { chunk_rgb_to_YCoCg } from "../../shader/chunk/color/YCoCg/chunk_rgb_to_YCoCg.js";
6
+ import { chunk_decode_g_buffer_normal } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
7
+ import { chunk_safe_sqrt } from "../../shader/chunk/math/chunk_safe_sqrt.js";
8
+ import {
9
+ chunk_texture_channel_gaussian_3x3
10
+ } from "../../shader/chunk/texture/chunk_texture_channel_gaussian_3x3.js";
11
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
12
+ import { ImageShader } from "../../shader/ImageShader.js";
13
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
14
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
15
+ import { chunk_luma_edge_stopping_weight } from "../../shader/chunk/filter/chunk_compute_edge_stopping_weight.js";
16
+ import { ATORUS_UNIFORMS_STRUCT } from "../denoise/fragment_shader_denoise_ao.js";
17
+ import {
18
+ chunk_ffx_dnsr_reflections_get_edge_stopping_depth_weight
19
+ } from "./prefilter/chunk_ffx_dnsr_reflections_get_edge_stopping_depth_weight.js";
20
+ import {
21
+ chunk_ffx_dnsr_reflections_get_edge_stopping_normal_weight
22
+ } from "./prefilter/chunk_ffx_dnsr_reflections_get_edge_stopping_normal_weight.js";
23
+
24
+ function create_spatial_shader(with_metadata, tiled = false) {
25
+ const resources = new ShaderResourceSetDescriptor();
26
+
27
+ // per-pass, four bytes, read-only: immediate data rather than a uniform buffer
28
+ resources.setImmediate("settings", ATORUS_UNIFORMS_STRUCT);
29
+ const group = resources.createGroup()
30
+ .addTexture("tInput")
31
+ .addTexture("tDepth")
32
+ .addTexture("tNormal", "uint");
33
+ if (with_metadata) { group.addTexture("tMetadata", "unfilterable-float"); }
34
+ if (tiled) { group.addTexture("tDenoiseTiles", "uint"); }
35
+
36
+ const body = CodeChunk.from(
37
+ //language=WGSL
38
+ `
39
+ const phi_visibility = 10.0;
40
+ const phi_normal = 32.0;
41
+ const sigma_depth = 1.0;
42
+
43
+ @fragment
44
+ fn main(
45
+ @builtin(position) coord: vec4<f32>,
46
+ ) -> ${with_metadata ? "SSRResolveOutput" : "@location(0) vec4f"}{
47
+ let ipos = vec2<i32>(coord.xy);
48
+ let screen_size = vec2<i32>(textureDimensions(tInput));
49
+ ${tiled ? ` if (textureLoad(tDenoiseTiles, ipos / ${SSR_DENOISE_TILE_SIZE}, 0).r == 0u) {
50
+ ${with_metadata ? ` var output: SSRResolveOutput;
51
+ output.radiance = textureLoad(tInput, ipos, 0);
52
+ output.metadata = textureLoad(tMetadata, ipos, 0).rg;
53
+ return output;` : ` return textureLoad(tInput, ipos, 0);`}
54
+ }` : ""}
55
+
56
+ const eps_variance = 1e-10;
57
+ const kernel_weights = array<f32,3>( 1.0, 2.0 / 3.0, 1.0 / 6.0 );
58
+
59
+ // constant samplers to prevent the compiler from generating code which
60
+ // fetches the sampler descriptor from memory for each texture access
61
+ let center_color = textureLoad(tInput, ipos, 0);
62
+
63
+ let center_color_luma = rgb_to_luminance(center_color.rgb);
64
+
65
+ // variance for direct and indirect, filtered using 3x3 gaussin blur
66
+ let input_variance = max(0.0, texture_channel_gaussian_3x3(ipos, tInput, 3));
67
+ ${with_metadata ? ` let bootstrap_variance = ssr_spatial_variance(tInput,tDepth,tNormal,ipos);
68
+ let variance = max(input_variance,bootstrap_variance);
69
+ var sum_squared_weights = 1.0;` : ` let variance = input_variance;`}
70
+
71
+ // explicitly store/accumulate center pixel with weight 1 to prevent issues
72
+ // with the edge-stopping functions
73
+ var sum_weight = 1.0;
74
+ var sum_color = center_color;
75
+ ${with_metadata ? ` let center_metadata = textureLoad(tMetadata, ipos, 0).rg;
76
+ var distance_moments = ssr_distance_moments(center_metadata.x, center_metadata.y, 1.0);` : ""}
77
+
78
+
79
+ let current_normal = decode_g_buffer_normal( textureLoad(tNormal, ipos, 0).xy );
80
+ let center_depth = textureLoad(tDepth, ipos, 0).r;
81
+
82
+ const offsets = array< vec2<i32>,8>(
83
+ vec2( -1, -1 ),
84
+ vec2( 0, -1 ) ,
85
+ vec2( 1, -1 ),
86
+ vec2( -1, 0 ),
87
+ vec2( 1, 0 ),
88
+ vec2( -1, 1 ),
89
+ vec2( 0, 1 ),
90
+ vec2( 1, 1 ),
91
+ );
92
+
93
+ const num_samples = 8;
94
+
95
+ let std_dev = safe_sqrt(variance);
96
+
97
+ for(var i = 0; i < num_samples; i++){
98
+ let offset: vec2i = offsets[i];
99
+
100
+ let p = ipos + offset * settings.step_size;
101
+ let inside = all(p >= vec2(0, 0)) && all(p < screen_size);
102
+
103
+ if(!inside){
104
+ // off-screen
105
+ continue;
106
+ }
107
+
108
+ let kernel = kernel_weights[ abs(offset.x) ] * kernel_weights[ abs(offset.y) ];
109
+
110
+ let sample_color = textureLoad(tInput, p, 0);
111
+ let sample_color_luma = rgb_to_luminance(sample_color.rgb);
112
+
113
+ let sample_normal = decode_g_buffer_normal(textureLoad(tNormal, p, 0).xy);
114
+ let sample_depth = textureLoad(tDepth, p, 0).r;
115
+
116
+ // compute the edge-stopping functions
117
+ var weight = 1.0;
118
+
119
+ let phi_luma = max(0.001,std_dev * phi_visibility);
120
+
121
+ weight *= ffx_dnsr_reflections_get_edge_stopping_normal_weight(current_normal, sample_normal);
122
+ weight *= ffx_dnsr_reflections_get_edge_stopping_depth_weight(center_depth, sample_depth);
123
+ weight *= exp(-luma_edge_stopping_weight(center_color_luma,sample_color_luma,phi_luma));
124
+
125
+ let w_visibility = weight * kernel;
126
+ ${with_metadata ? ` let metadata = textureLoad(tMetadata, p, 0).rg;
127
+ distance_moments += ssr_distance_moments(metadata.x, metadata.y, w_visibility);` : ""}
128
+
129
+ // alpha channel contains the variance, therefore the weights need to be squared, see paper for the formula
130
+ sum_weight += w_visibility;
131
+ ${with_metadata ? ` sum_squared_weights += w_visibility*w_visibility;` : ""}
132
+ sum_color += vec4(vec3(w_visibility), w_visibility * w_visibility) * sample_color;
133
+ }
134
+
135
+ var out_visibility = sum_color / vec4(vec3(sum_weight), sum_weight * sum_weight);
136
+ ${with_metadata ? ` // Carry bootstrap uncertainty forward so the next passes do not freeze again.
137
+ out_visibility.w = max(out_visibility.w,bootstrap_variance*sum_squared_weights/(sum_weight*sum_weight));` : ""}
138
+
139
+ ${with_metadata ? ` var output: SSRResolveOutput;
140
+ output.radiance = out_visibility;
141
+ output.metadata = ssr_resolve_metadata(distance_moments, 1.0);
142
+ return output;` : " return out_visibility;"}
143
+ }
144
+ `,
145
+ [
146
+ chunk_ssr_metadata,
147
+ ...(with_metadata ? [chunk_ssr_spatial_variance] : []),
148
+ ATORUS_UNIFORMS_STRUCT.declaration_chunk,
149
+ chunk_texture_channel_gaussian_3x3,
150
+ chunk_decode_g_buffer_normal,
151
+ chunk_rgb_to_luminance,
152
+ chunk_rgb_to_YCoCg,
153
+ chunk_ffx_dnsr_reflections_get_edge_stopping_normal_weight,
154
+ chunk_ffx_dnsr_reflections_get_edge_stopping_depth_weight,
155
+ chunk_luma_edge_stopping_weight,
156
+ chunk_safe_sqrt,
157
+ ]);
158
+
159
+ return new ImageShader({
160
+ descriptor: ShaderDescriptor.from({
161
+ label: (with_metadata ? "SSR / spatial denoise with metadata" : "SSR / spatial denoise") + (tiled ? " / tiles" : ""),
162
+ body,
163
+ resources
164
+ }),
165
+ targets: [
166
+ {
167
+ format: "rgba16float"
168
+ },
169
+ ...(with_metadata ? [{ format: "rg32float" }] : [])
170
+ ]
171
+ })
172
+ }
173
+
174
+ export const ssr_spatial_denoise_shader = create_spatial_shader(false);
175
+ export const ssr_spatial_denoise_metadata_shader = create_spatial_shader(true);
176
+ export const ssr_spatial_denoise_tile_shader = create_spatial_shader(false, true);
177
+ export const ssr_spatial_denoise_metadata_tile_shader = create_spatial_shader(true, true);
@@ -1 +1 @@
1
- {"version":3,"file":"DEPTH_STENCIL_STATE_SHADOW.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,yCAFU,SAAS,iBAAiB,CAAC,CAiBjC;kCArB8B,uDAAuD"}
1
+ {"version":3,"file":"DEPTH_STENCIL_STATE_SHADOW.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,yCAFU,SAAS,iBAAiB,CAAC,CA2BjC;kCA/B8B,uDAAuD"}
@@ -17,6 +17,16 @@ export const DEPTH_STENCIL_STATE_SHADOW = Object.freeze(DepthStencilState.from({
17
17
  /**
18
18
  * Combat shadow acne.
19
19
  * negative, because of reversed Z.
20
+ *
21
+ * A point light's cube faces need all of it at concave corners. Where a wall stands farther from
22
+ * the light than the light is above the ground, the ground in front of it is steep to the side
23
+ * cube face that sees it, and this pushes that ground back far enough that the wall's base does not
24
+ * read it as an occluder; at -1, as at 0, the bottom centimetres of the wall shadow themselves in
25
+ * scallops. The same push leaves a point light's shadow a seam on the cone 45° from straight down,
26
+ * where the ground stops being square-on to the -Y face: an occluder a little above a receiver stops
27
+ * shadowing it as the receiver's direction crosses into a side face (at 128 texels, from about
28
+ * 14 cm above to 22 cm). Measured 2026-10-04 and kept: a `depthBiasClamp` limits it by distance,
29
+ * not by angle, and no bias tried closed the seam without opening the corners.
20
30
  */
21
31
  depthBiasSlopeScale: -2.0,
22
32
  }));