@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,137 +1,150 @@
1
- import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
2
- import { chunk_rgb_to_luminance } from "../../../shader/chunk/color/chunk_rgb_to_luminance.js";
3
- import { chunk_decode_g_buffer_normal } from "../../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
4
- import { chunk_is_finite } from "../../../shader/chunk/math/chunk_is_finite.js";
5
- import { chunk_decode_g_buffer_roughness } from "../../../shader/chunk/material/chunk_decode_g_buffer_roughness.js";
6
- import { chunk_project_position_from_depth } from "../../../shader/chunk/camera/chunk_project_position_from_depth.js";
7
- import { chunk_texel_coordinate_to_uv } from "../../../shader/chunk/texture/chunk_texel_coordinate_to_uv.js";
8
- import { chunk_get_view_space_depth } from "../../../shader/chunk/depth/chunk_get_view_space_depth.js";
9
- import { chunk_is_background } from "../../../shader/chunk/depth/chunk_is_background.js";
10
-
11
- /** Linear radiance accumulation. Spatial contrast and single stochastic hits are not motion. */
12
- export const chunk_ssr_temporal_accumulate = CodeChunk.from(/* language=WGSL */ `
13
- const SSR_SHORT_BLEND = 0.25;
14
- const SSR_SHORT_VARIANCE_SCALE = SSR_SHORT_BLEND / (2.0-SSR_SHORT_BLEND);
15
-
16
- struct SSRAccumulation {
17
- radiance: vec4f,
18
- age: f32,
19
- short_luma: f32,
20
- }
21
-
22
- fn ssr_temporal_accumulate(current: vec4f, previous: vec4f, previous_age: f32,
23
- previous_short_luma: f32, confidence: f32, motion_confidence: f32, st: vec2i, history_uv: vec2f) -> SSRAccumulation {
24
- let old_age = clamp(previous_age, 1.0, 128.0);
25
- let current_luma = rgb_to_luminance(current.rgb);
26
- let previous_luma = rgb_to_luminance(previous.rgb);
27
- // Alpha describes uncertainty in the accumulated mean. Recover the estimated
28
- // distribution variance before judging whether a new sample is surprising.
29
- let previous_variance = max(0.0, previous.w) * old_age;
30
- let short_luma = mix(previous_short_luma, current_luma, SSR_SHORT_BLEND);
31
- let short_delta = current_luma - previous_short_luma;
32
- // Noise statistics need a short window too: long-lived variance would hide a
33
- // real transition from a noisy bright reflection to a steady dark surface.
34
- let sample_variance = (1.0-SSR_SHORT_BLEND) * (previous_variance + SSR_SHORT_BLEND * short_delta * short_delta);
35
- // Compare two means at different time scales, normalized by sampling noise.
36
- // The previous implementation compared the mean with ONE noisy sample and
37
- // discarded useful history on almost every bright ray hit.
38
- let short_sigma = sqrt(max(1e-6, sample_variance * SSR_SHORT_VARIANCE_SCALE));
39
- let inconsistency = abs(short_luma - previous_luma) / short_sigma;
40
- var reactive = smoothstep(3.0, 6.0, inconsistency);
41
-
42
- // A 5x5 neighbourhood sees beyond the small prefilter. Persistent temporal
43
- // uncertainty keeps a chance cluster of misses from clipping a valid mean to
44
- // black. Real geometry and coherent lighting changes can still rectify it.
45
- let size = vec2i(textureDimensions(tInput));
46
- let center_normal = decode_g_buffer_normal(textureLoad(tNormal, st, 0).xy);
47
- let center_depth = textureLoad(tDepth, st, 0).r;
48
- let center_roughness = decode_g_buffer_roughness(textureLoad(tPBR, st, 0));
49
- var first = vec3f(0.0);
50
- var second = vec3f(0.0);
51
- var count = 0.0;
52
- var history_mean = 0.0;
53
- var short_mean = 0.0;
54
- var noise_sum = 0.0;
55
- var history_count = 0.0;
56
- let history_st = vec2i(history_uv * vec2f(size));
57
- for (var y = -2; y <= 2; y++) {
58
- for (var x = -2; x <= 2; x++) {
59
- let p = st + vec2i(x,y);
60
- if (any(p < vec2i(0)) || any(p >= size)) { continue; }
61
- let normal = decode_g_buffer_normal(textureLoad(tNormal, p, 0).xy);
62
- let depth = textureLoad(tDepth, p, 0).r;
63
- if (is_background(depth)) { continue; }
64
- let roughness = decode_g_buffer_roughness(textureLoad(tPBR, p, 0));
65
- if (!(abs(roughness-center_roughness) <= 0.08)) { continue; }
66
- if (dot(normal,center_normal) < 0.9 || abs(depth-center_depth) > max(1e-4, center_depth*0.02)) { continue; }
67
- let c = textureLoad(tInput, p, 0).rgb;
68
- first += c;
69
- second += c*c;
70
- count += 1.0;
71
- // Compare local short- and long-term means. A moving rough reflection
72
- // can change many individually low-SNR pixels coherently. One noisy
73
- // pixel cannot establish that, but a matched patch can.
74
- let h = history_st + vec2i(x,y);
75
- if (any(h < vec2i(0)) || any(h >= size)) { continue; }
76
- let old_geometry = textureLoad(tHistoryGeometry,h,0);
77
- if (!(dot(old_geometry.xyz,normal) >= 0.9)) { continue; }
78
- if (!(abs(old_geometry.w-roughness) <= 0.08)) { continue; }
79
- // Device depths belong to different cameras. Validate the old point
80
- // against the current surface in world space, as the history gather does.
81
- let old_depth = textureLoad(tPreviousDepth,h,0).r;
82
- if (is_background(old_depth)) { continue; }
83
- let position = project_position_from_depth(texel_coordinate_to_uv(vec2f(p),vec2u(size)),depth,camera_current.view_projection_matrix_inverse);
84
- let old_position = project_position_from_depth(texel_coordinate_to_uv(vec2f(h),vec2u(size)),old_depth,camera_previous.view_projection_matrix_inverse);
85
- let plane_distance = abs(dot(normal,old_position-position));
86
- let tolerance = max(1e-4,0.002*get_view_space_depth(depth,camera_current));
87
- if (!(plane_distance <= tolerance)) { continue; }
88
- let old = textureLoad(tHistory,h,0);
89
- let old_metadata = textureLoad(tHistoryMetadata,h,0);
90
- if (!is_finite(old.x) || !is_finite(old.y) || !is_finite(old.z) || !is_finite(old.w)
91
- || !is_finite(old_metadata.z) || !is_finite(old_metadata.w)) { continue; }
92
- let luma = rgb_to_luminance(c);
93
- let d = luma-old_metadata.w;
94
- history_mean += rgb_to_luminance(old.rgb);
95
- short_mean += mix(old_metadata.w,luma,SSR_SHORT_BLEND);
96
- noise_sum += (1.0-SSR_SHORT_BLEND) * (max(0.0,old.w)*clamp(old_metadata.z,1.0,128.0) + SSR_SHORT_BLEND*d*d);
97
- history_count += 1.0;
98
- }
99
- }
100
- if (history_count >= 9.0) {
101
- // The 3x3 prefilter correlates adjacent samples: use a conservative nine
102
- // taps per independent observation instead of claiming 25 independent rays.
103
- let sigma = sqrt(max(1e-6,noise_sum*SSR_SHORT_VARIANCE_SCALE*9.0));
104
- reactive = max(reactive,smoothstep(3.0,6.0,abs(short_mean-history_mean)/sigma));
105
- }
106
- // Blend update rates, not history lengths: halfway from 128 to two frames
107
- // would still retain ~98% history and barely respond to a detected change.
108
- let mature_age = min(128.0, old_age * confidence + 1.0);
109
- var age = 1.0 / mix(1.0/mature_age, 0.5, reactive);
110
- let mean = first / max(1.0,count);
111
- // The carried variance is in luminance units. Expand RGB bounds along the
112
- // history color, otherwise saturated blue gets only 7.22% of its RGB sigma
113
- // and a normal stochastic miss can erase an already converged reflection.
114
- let noise_color = select(vec3f(1.0),previous.rgb/max(previous_luma,1e-6),previous_luma > 1e-6);
115
- let deviation = sqrt(max(noise_color*noise_color*previous_variance, second / max(1.0,count) - mean*mean));
116
- let gamma = mix(1.5, 4.0, motion_confidence);
117
- let clipped = clamp(previous.rgb, max(vec3f(0.0),mean-gamma*deviation), mean+gamma*deviation);
118
- // Once history is outside even the noise-expanded box, it is no longer a
119
- // well-supported long-term estimate. Do not leave it pinned to a clipped edge.
120
- let rectified = any(abs(previous.rgb-clipped) > vec3f(1e-5));
121
- if (rectified) { age = min(age, 2.0); }
122
- // Confidence can force a much larger current contribution than 1/age.
123
- // Carry that actual update rate into the age/variance pair too; otherwise a
124
- // half-current blend can claim the uncertainty of a 65-frame accumulation.
125
- age = min(age, 1.0 / max(1e-6, 1.0-saturate(confidence)));
126
- let weight = min(saturate(confidence), 1.0 - 1.0/age);
127
- let color = mix(current.rgb, clipped, weight);
128
- var result: SSRAccumulation;
129
- // Post-spatial passes receive uncertainty of the mean, rather than the raw
130
- // sample distribution or the resolve pass's within-ray variance.
131
- result.radiance = vec4f(color, min(65504.0,sample_variance/age));
132
- result.age = age;
133
- result.short_luma = select(short_luma, rgb_to_luminance(color), rectified);
134
- return result;
135
- }
136
- `, [chunk_rgb_to_luminance, chunk_decode_g_buffer_normal, chunk_is_finite, chunk_decode_g_buffer_roughness,
137
- chunk_project_position_from_depth, chunk_texel_coordinate_to_uv, chunk_get_view_space_depth, chunk_is_background]);
1
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
2
+ import { chunk_rgb_to_luminance } from "../../../shader/chunk/color/chunk_rgb_to_luminance.js";
3
+ import { chunk_decode_g_buffer_normal } from "../../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
4
+ import { chunk_is_finite } from "../../../shader/chunk/math/chunk_is_finite.js";
5
+ import { chunk_decode_g_buffer_roughness } from "../../../shader/chunk/material/chunk_decode_g_buffer_roughness.js";
6
+ import { chunk_project_position_from_depth } from "../../../shader/chunk/camera/chunk_project_position_from_depth.js";
7
+ import { chunk_texel_coordinate_to_uv } from "../../../shader/chunk/texture/chunk_texel_coordinate_to_uv.js";
8
+ import { chunk_get_view_space_depth } from "../../../shader/chunk/depth/chunk_get_view_space_depth.js";
9
+ import { chunk_is_background } from "../../../shader/chunk/depth/chunk_is_background.js";
10
+
11
+ /** Linear radiance accumulation. Spatial contrast and single stochastic hits are not motion. */
12
+ export const chunk_ssr_temporal_accumulate = CodeChunk.from(/* language=WGSL */ `
13
+ const SSR_SHORT_BLEND = 0.25;
14
+ const SSR_SHORT_VARIANCE_SCALE = SSR_SHORT_BLEND / (2.0-SSR_SHORT_BLEND);
15
+
16
+ struct SSRAccumulation {
17
+ radiance: vec4f,
18
+ age: f32,
19
+ short_luma: f32,
20
+ }
21
+
22
+ fn ssr_temporal_accumulate(current: vec4f, previous: vec4f, previous_age: f32,
23
+ previous_short_luma: f32, confidence: f32, motion_confidence: f32, st: vec2i, history_uv: vec2f,
24
+ constant_neighborhood: bool) -> SSRAccumulation {
25
+ let old_age = clamp(previous_age, 1.0, 128.0);
26
+ let current_luma = rgb_to_luminance(current.rgb);
27
+ let previous_luma = rgb_to_luminance(previous.rgb);
28
+ // Alpha describes uncertainty in the accumulated mean. Recover the estimated
29
+ // distribution variance before judging whether a new sample is surprising.
30
+ let previous_variance = max(0.0, previous.w) * old_age;
31
+ let short_luma = mix(previous_short_luma, current_luma, SSR_SHORT_BLEND);
32
+ let short_delta = current_luma - previous_short_luma;
33
+ // Noise statistics need a short window too: long-lived variance would hide a
34
+ // real transition from a noisy bright reflection to a steady dark surface.
35
+ let sample_variance = (1.0-SSR_SHORT_BLEND) * (previous_variance + SSR_SHORT_BLEND * short_delta * short_delta);
36
+ // Compare two means at different time scales, normalized by sampling noise.
37
+ // The previous implementation compared the mean with ONE noisy sample and
38
+ // discarded useful history on almost every bright ray hit.
39
+ let short_sigma = sqrt(max(1e-6, sample_variance * SSR_SHORT_VARIANCE_SCALE));
40
+ let inconsistency = abs(short_luma - previous_luma) / short_sigma;
41
+ var reactive = smoothstep(3.0, 6.0, inconsistency);
42
+
43
+ // A 5x5 neighbourhood sees beyond the small prefilter. Persistent temporal
44
+ // uncertainty keeps a chance cluster of misses from clipping a valid mean to
45
+ // black. Real geometry and coherent lighting changes can still rectify it.
46
+ let size = vec2i(textureDimensions(tInput));
47
+ let center_normal = decode_g_buffer_normal(textureLoad(tNormal, st, 0).xy);
48
+ let center_depth = textureLoad(tDepth, st, 0).r;
49
+ let center_roughness = decode_g_buffer_roughness(textureLoad(tPBR, st, 0));
50
+ var first = vec3f(0.0);
51
+ var second = vec3f(0.0);
52
+ var count = 0.0;
53
+ var history_mean = 0.0;
54
+ var short_mean = 0.0;
55
+ var noise_sum = 0.0;
56
+ var history_count = 0.0;
57
+ let history_st = vec2i(history_uv * vec2f(size));
58
+ // The classifier covers the neighborhood; the ordinary history gather still
59
+ // validates geometry, depth, roughness, jitter and confidence. Keep the shared
60
+ // age/variance/blend calculation below so skipped tiles retain mature history.
61
+ // A changed or interpolated sample falls back to the full statistics path.
62
+ let constant = constant_neighborhood && current.w == 0.0 && all(current == previous)
63
+ && previous_short_luma == current_luma;
64
+ if (constant) {
65
+ first = current.rgb;
66
+ second = current.rgb * current.rgb;
67
+ count = 1.0;
68
+ } else {
69
+ for (var y = -2; y <= 2; y++) {
70
+ for (var x = -2; x <= 2; x++) {
71
+ let p = st + vec2i(x,y);
72
+ if (any(p < vec2i(0)) || any(p >= size)) { continue; }
73
+ let normal = decode_g_buffer_normal(textureLoad(tNormal, p, 0).xy);
74
+ let depth = textureLoad(tDepth, p, 0).r;
75
+ if (is_background(depth)) { continue; }
76
+ let roughness = decode_g_buffer_roughness(textureLoad(tPBR, p, 0));
77
+ if (!(abs(roughness-center_roughness) <= 0.08)) { continue; }
78
+ if (dot(normal,center_normal) < 0.9 || abs(depth-center_depth) > max(1e-4, center_depth*0.02)) { continue; }
79
+ let c = textureLoad(tInput, p, 0).rgb;
80
+ first += c;
81
+ second += c*c;
82
+ count += 1.0;
83
+ // Compare local short- and long-term means. A moving rough reflection
84
+ // can change many individually low-SNR pixels coherently. One noisy
85
+ // pixel cannot establish that, but a matched patch can.
86
+ let h = history_st + vec2i(x,y);
87
+ if (any(h < vec2i(0)) || any(h >= size)) { continue; }
88
+ let old_geometry = textureLoad(tHistoryGeometry,h,0);
89
+ if (!(dot(old_geometry.xyz,normal) >= 0.9)) { continue; }
90
+ if (!(abs(old_geometry.w-roughness) <= 0.08)) { continue; }
91
+ // Device depths belong to different cameras. Validate the old point
92
+ // against the current surface in world space, as the history gather does.
93
+ let old_depth = textureLoad(tPreviousDepth,h,0).r;
94
+ if (is_background(old_depth)) { continue; }
95
+ let position = project_position_from_depth(texel_coordinate_to_uv(vec2f(p),vec2u(size)),depth,camera_current.view_projection_matrix_inverse);
96
+ let old_position = project_position_from_depth(texel_coordinate_to_uv(vec2f(h),vec2u(size)),old_depth,camera_previous.view_projection_matrix_inverse);
97
+ let plane_distance = abs(dot(normal,old_position-position));
98
+ let tolerance = max(1e-4,0.002*get_view_space_depth(depth,camera_current));
99
+ if (!(plane_distance <= tolerance)) { continue; }
100
+ let old = textureLoad(tHistory,h,0);
101
+ let old_metadata = textureLoad(tHistoryMetadata,h,0);
102
+ if (!is_finite(old.x) || !is_finite(old.y) || !is_finite(old.z) || !is_finite(old.w)
103
+ || !is_finite(old_metadata.z) || !is_finite(old_metadata.w)) { continue; }
104
+ let luma = rgb_to_luminance(c);
105
+ let d = luma-old_metadata.w;
106
+ history_mean += rgb_to_luminance(old.rgb);
107
+ short_mean += mix(old_metadata.w,luma,SSR_SHORT_BLEND);
108
+ noise_sum += (1.0-SSR_SHORT_BLEND) * (max(0.0,old.w)*clamp(old_metadata.z,1.0,128.0) + SSR_SHORT_BLEND*d*d);
109
+ history_count += 1.0;
110
+ }
111
+ }
112
+ }
113
+ if (history_count >= 9.0) {
114
+ // The 3x3 prefilter correlates adjacent samples: use a conservative nine
115
+ // taps per independent observation instead of claiming 25 independent rays.
116
+ let sigma = sqrt(max(1e-6,noise_sum*SSR_SHORT_VARIANCE_SCALE*9.0));
117
+ reactive = max(reactive,smoothstep(3.0,6.0,abs(short_mean-history_mean)/sigma));
118
+ }
119
+ // Blend update rates, not history lengths: halfway from 128 to two frames
120
+ // would still retain ~98% history and barely respond to a detected change.
121
+ let mature_age = min(128.0, old_age * confidence + 1.0);
122
+ var age = 1.0 / mix(1.0/mature_age, 0.5, reactive);
123
+ let mean = first / max(1.0,count);
124
+ // The carried variance is in luminance units. Expand RGB bounds along the
125
+ // history color, otherwise saturated blue gets only 7.22% of its RGB sigma
126
+ // and a normal stochastic miss can erase an already converged reflection.
127
+ let noise_color = select(vec3f(1.0),previous.rgb/max(previous_luma,1e-6),previous_luma > 1e-6);
128
+ let deviation = sqrt(max(noise_color*noise_color*previous_variance, second / max(1.0,count) - mean*mean));
129
+ let gamma = mix(1.5, 4.0, motion_confidence);
130
+ let clipped = clamp(previous.rgb, max(vec3f(0.0),mean-gamma*deviation), mean+gamma*deviation);
131
+ // Once history is outside even the noise-expanded box, it is no longer a
132
+ // well-supported long-term estimate. Do not leave it pinned to a clipped edge.
133
+ let rectified = any(abs(previous.rgb-clipped) > vec3f(1e-5));
134
+ if (rectified) { age = min(age, 2.0); }
135
+ // Confidence can force a much larger current contribution than 1/age.
136
+ // Carry that actual update rate into the age/variance pair too; otherwise a
137
+ // half-current blend can claim the uncertainty of a 65-frame accumulation.
138
+ age = min(age, 1.0 / max(1e-6, 1.0-saturate(confidence)));
139
+ let weight = min(saturate(confidence), 1.0 - 1.0/age);
140
+ let color = mix(current.rgb, clipped, weight);
141
+ var result: SSRAccumulation;
142
+ // Post-spatial passes receive uncertainty of the mean, rather than the raw
143
+ // sample distribution or the resolve pass's within-ray variance.
144
+ result.radiance = vec4f(color, min(65504.0,sample_variance/age));
145
+ result.age = age;
146
+ result.short_luma = select(short_luma, rgb_to_luminance(color), rectified);
147
+ return result;
148
+ }
149
+ `, [chunk_rgb_to_luminance, chunk_decode_g_buffer_normal, chunk_is_finite, chunk_decode_g_buffer_roughness,
150
+ chunk_project_position_from_depth, chunk_texel_coordinate_to_uv, chunk_get_view_space_depth, chunk_is_background]);
@@ -0,0 +1,3 @@
1
+ export const shader_ssr_denoise_tile_classify: ComputeShader;
2
+ import { ComputeShader } from "../../shader/ComputeShader.js";
3
+ //# sourceMappingURL=shader_ssr_denoise_tile_classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_ssr_denoise_tile_classify.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js"],"names":[],"mappings":"AAoBA,6DAuBG;8BA1C2B,+BAA+B"}
@@ -0,0 +1,44 @@
1
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
+ import { ComputeShader } from "../../shader/ComputeShader.js";
3
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
4
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
5
+ import { u32, vec2f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
6
+ import { chunk_ssr_denoise_tile_active } from "./chunk_ssr_denoise_tile_active.js";
7
+ import { SSR_DENOISE_TILE_SIZE } from "./SSR_DENOISE_TILE_SIZE.js";
8
+
9
+ const settings = WebGPUStruct.from({ history_valid: u32, jitter_delta: vec2f });
10
+ const resources = new ShaderResourceSetDescriptor();
11
+ resources.setImmediate("settings", settings);
12
+ resources.createGroup()
13
+ .addTexture("tInput")
14
+ .addTexture("tMetadata", "unfilterable-float")
15
+ .addTexture("tHistory")
16
+ .addTexture("tHistoryMetadata", "unfilterable-float")
17
+ .addTexture("tVelocity")
18
+ .addStorageTexture("tTiles", "r32uint", "2d", "write-only");
19
+
20
+ const count = SSR_DENOISE_TILE_SIZE ** 2;
21
+ export const shader_ssr_denoise_tile_classify = ComputeShader.from({
22
+ label: "SSR / classify denoise tiles",
23
+ resources,
24
+ body: CodeChunk.from(/* language=WGSL */ `
25
+ var<workgroup> coverage: array<u32, ${count}>;
26
+
27
+ @compute @workgroup_size(${SSR_DENOISE_TILE_SIZE}, ${SSR_DENOISE_TILE_SIZE}, 1)
28
+ fn main(@builtin(global_invocation_id) id: vec3u,
29
+ @builtin(workgroup_id) tile: vec3u, @builtin(local_invocation_index) lane: u32) {
30
+ var flag = 0u;
31
+ if (all(id.xy < textureDimensions(tInput))) {
32
+ flag = ssr_denoise_tile_active(vec2i(id.xy), settings.history_valid != 0u, settings.jitter_delta);
33
+ }
34
+ // Tail lanes still participate in every barrier and contribute the identity.
35
+ coverage[lane] = flag;
36
+ workgroupBarrier();
37
+ for (var stride = ${count / 2}u; stride > 0u; stride >>= 1u) {
38
+ if (lane < stride) { coverage[lane] |= coverage[lane + stride]; }
39
+ workgroupBarrier();
40
+ }
41
+ if (lane == 0u) { textureStore(tTiles, vec2i(tile.xy), vec4u(coverage[0], 0u, 0u, 0u)); }
42
+ }
43
+ `, [settings.declaration_chunk, chunk_ssr_denoise_tile_active]),
44
+ });
@@ -0,0 +1,5 @@
1
+ export const SSR_DENOISE_TILE_HALO: number;
2
+ /** Expand integer coverage over the complete denoising footprint. */
3
+ export const shader_ssr_denoise_tile_dilate: ImageShader;
4
+ import { ImageShader } from "../../shader/ImageShader.js";
5
+ //# sourceMappingURL=shader_ssr_denoise_tile_dilate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_ssr_denoise_tile_dilate.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js"],"names":[],"mappings":"AASA,2CAA4F;AAI5F,qEAAqE;AACrE,yDAoBG;4BAjCyB,6BAA6B"}
@@ -0,0 +1,35 @@
1
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
+ import { ImageShader } from "../../shader/ImageShader.js";
3
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
4
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
5
+ import { chunk_is_on_screen_i32 } from "../../shader/chunk/texture/chunk_is_on_screen_i32.js";
6
+ import { SSR_DENOISE_TILE_SIZE } from "./SSR_DENOISE_TILE_SIZE.js";
7
+
8
+ // Pre-spatial (1), temporal statistics (2), post-spatial (2+4), and raster jitter
9
+ // (1) can influence an output ten internal pixels away. One 8-pixel tile is too small.
10
+ export const SSR_DENOISE_TILE_HALO = Math.ceil((1 + 2 + 2 + 4 + 1) / SSR_DENOISE_TILE_SIZE);
11
+ const resources = new ShaderResourceSetDescriptor();
12
+ resources.createGroup().addTexture("tTiles", "uint");
13
+
14
+ /** Expand integer coverage over the complete denoising footprint. */
15
+ export const shader_ssr_denoise_tile_dilate = new ImageShader({
16
+ descriptor: ShaderDescriptor.from({
17
+ label: "SSR / dilate denoise tiles",
18
+ resources,
19
+ body: CodeChunk.from(/* language=WGSL */ `
20
+ @fragment fn main(@builtin(position) coord: vec4f) -> @location(0) u32 {
21
+ let p = vec2i(coord.xy);
22
+ let size = vec2i(textureDimensions(tTiles));
23
+ var coverage = 0u;
24
+ for (var y = -${SSR_DENOISE_TILE_HALO}; y <= ${SSR_DENOISE_TILE_HALO}; y++) {
25
+ for (var x = -${SSR_DENOISE_TILE_HALO}; x <= ${SSR_DENOISE_TILE_HALO}; x++) {
26
+ let q = p + vec2i(x,y);
27
+ if (is_on_screen_i32(q,size)) { coverage |= textureLoad(tTiles,q,0).r; }
28
+ }
29
+ }
30
+ return coverage;
31
+ }
32
+ `, [chunk_is_on_screen_i32]),
33
+ }),
34
+ targets: [{ format: "r32uint" }],
35
+ });
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Frame-local coverage; allocation, lifetime, dependencies and timing belong to the graph.
3
+ * @param {object} options
4
+ * @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
5
+ * @param {ArrayLike<number>} options.resolution Internal SSR resolution
6
+ * @param {number} options.input
7
+ * @param {number} options.metadata
8
+ * @param {number} options.history
9
+ * @param {number} options.history_metadata
10
+ * @param {number} options.velocity
11
+ * @param {boolean} options.history_valid
12
+ * @param {ArrayLike<number>} options.jitter_delta
13
+ * @returns {number} Dilated tile mask
14
+ */
15
+ export function ssr_graph_denoise_tiles({ graph, resolution, input, metadata, history, history_metadata, velocity, history_valid, jitter_delta }: {
16
+ graph: import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
17
+ resolution: ArrayLike<number>;
18
+ input: number;
19
+ metadata: number;
20
+ history: number;
21
+ history_metadata: number;
22
+ velocity: number;
23
+ history_valid: boolean;
24
+ jitter_delta: ArrayLike<number>;
25
+ }): number;
26
+ //# sourceMappingURL=ssr_graph_denoise_tiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssr_graph_denoise_tiles.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;GAaG;AACH;IAXsG,KAAK,EAAhG,OAAO,8DAA8D,EAAE,UAAU;IACtD,UAAU,EAArC,UAAU,MAAM,CAAC;IACD,KAAK,EAArB,MAAM;IACU,QAAQ,EAAxB,MAAM;IACU,OAAO,EAAvB,MAAM;IACU,gBAAgB,EAAhC,MAAM;IACU,QAAQ,EAAxB,MAAM;IACW,aAAa,EAA9B,OAAO;IACoB,YAAY,EAAvC,UAAU,MAAM,CAAC;IACf,MAAM,CAsBlB"}
@@ -0,0 +1,42 @@
1
+ import { TextureResourceDescriptor } from "../../../device/graph/TextureResourceDescriptor.js";
2
+ import { graph_compute_pass } from "../../shader/graph/compute/graph_compute_pass.js";
3
+ import { graph_image_pass } from "../../shader/graph/graph_image_pass.js";
4
+ import { SSR_DENOISE_TILE_SIZE } from "./SSR_DENOISE_TILE_SIZE.js";
5
+ import { shader_ssr_denoise_tile_classify } from "./shader_ssr_denoise_tile_classify.js";
6
+ import { shader_ssr_denoise_tile_dilate } from "./shader_ssr_denoise_tile_dilate.js";
7
+
8
+ /**
9
+ * Frame-local coverage; allocation, lifetime, dependencies and timing belong to the graph.
10
+ * @param {object} options
11
+ * @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
12
+ * @param {ArrayLike<number>} options.resolution Internal SSR resolution
13
+ * @param {number} options.input
14
+ * @param {number} options.metadata
15
+ * @param {number} options.history
16
+ * @param {number} options.history_metadata
17
+ * @param {number} options.velocity
18
+ * @param {boolean} options.history_valid
19
+ * @param {ArrayLike<number>} options.jitter_delta
20
+ * @returns {number} Dilated tile mask
21
+ */
22
+ export function ssr_graph_denoise_tiles({ graph, resolution, input, metadata, history,
23
+ history_metadata, velocity, history_valid, jitter_delta }) {
24
+ const tile_resolution = [Math.ceil(resolution[0] / SSR_DENOISE_TILE_SIZE), Math.ceil(resolution[1] / SSR_DENOISE_TILE_SIZE)];
25
+ const { tTiles } = graph_compute_pass({
26
+ graph,
27
+ shader: shader_ssr_denoise_tile_classify,
28
+ group_count: [...tile_resolution, 1],
29
+ bindings: {
30
+ tInput: input, tMetadata: metadata, tHistory: history,
31
+ tHistoryMetadata: history_metadata, tVelocity: velocity,
32
+ settings: { history_valid: history_valid ? 1 : 0, jitter_delta },
33
+ tTiles: TextureResourceDescriptor.from({
34
+ resolution: tile_resolution, dimension: "2d", format: "r32uint",
35
+ usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING,
36
+ }),
37
+ },
38
+ });
39
+ const [tiles] = graph_image_pass({ graph, shader: shader_ssr_denoise_tile_dilate,
40
+ output_resolution: tile_resolution, inputs: { tTiles } });
41
+ return tiles;
42
+ }
@@ -1,3 +1,4 @@
1
1
  export const ssr_reproject_shader: ImageShader;
2
+ export const ssr_reproject_tile_shader: ImageShader;
2
3
  import { ImageShader } from "../../shader/ImageShader.js";
3
4
  //# sourceMappingURL=ssr_reproject_shader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ssr_reproject_shader.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js"],"names":[],"mappings":"AAqGA,+CAGG;4BAlGyB,6BAA6B"}
1
+ {"version":3,"file":"ssr_reproject_shader.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js"],"names":[],"mappings":"AA+GA,+CAAmE;AACnE,oDAAuE;4BA1G3C,6BAA6B"}