@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
@@ -35,5 +35,8 @@ export class MeshletGeometry {
35
35
  equals(other: MeshletGeometry): boolean;
36
36
  isMeshletGeometry: boolean;
37
37
  }
38
+ export namespace MeshletGeometry {
39
+ let typeName: string;
40
+ }
38
41
  import { MeshletBatch } from "./meshlet/MeshletBatch.js";
39
42
  //# sourceMappingURL=MeshletGeometry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MeshletGeometry.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/geometry/MeshletGeometry.js"],"names":[],"mappings":"AAIA;;;GAGG;AACH;IACI,WAAkB;IAElB;;;OAGG;IACH,MAFU,MAAM,CAEN;IAEV,2BAAmC;IACnC,8BAAsC;IAEtC;;;OAGG;IACH,iBAFU,MAAM,CAEI;IAEpB,wBAGC;IAED;;OAEG;IACH,UAFU,YAAY,CAEQ;IAE9B;;;;OAIG;IACH,KAFU,WAAW,CAEG;IAExB,eAEC;IAED;;;OAGG;IACH,cAFW,eAAe,WAMzB;IAGL,2BAA2C;CAF1C;6BAxD4B,2BAA2B"}
1
+ {"version":3,"file":"MeshletGeometry.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/geometry/MeshletGeometry.js"],"names":[],"mappings":"AAIA;;;GAGG;AACH;IACI,WAAkB;IAElB;;;OAGG;IACH,MAFU,MAAM,CAEN;IAEV,2BAAmC;IACnC,8BAAsC;IAEtC;;;OAGG;IACH,iBAFU,MAAM,CAEI;IAEpB,wBAGC;IAED;;OAEG;IACH,UAFU,YAAY,CAEQ;IAE9B;;;;OAIG;IACH,KAFU,WAAW,CAEG;IAExB,eAEC;IAED;;;OAGG;IACH,cAFW,eAAe,WAMzB;IAGL,2BAA2C;CAF1C;;;;6BAxD4B,2BAA2B"}
@@ -57,4 +57,5 @@ export class MeshletGeometry {
57
57
  }
58
58
 
59
59
  MeshletGeometry.prototype.isMeshletGeometry = true;
60
+ MeshletGeometry.typeName = "MeshletGeometry";
60
61
 
@@ -1 +1 @@
1
- {"version":3,"file":"LIGHT_DATABASE_SPEC.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/light/LIGHT_DATABASE_SPEC.js"],"names":[],"mappings":"AAUA,wDAiBG;sCA1BmC,0CAA0C"}
1
+ {"version":3,"file":"LIGHT_DATABASE_SPEC.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/light/LIGHT_DATABASE_SPEC.js"],"names":[],"mappings":"AAYA,wDAkCG;sCA7CmC,0CAA0C"}
@@ -1,12 +1,14 @@
1
- import { vec4f } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
1
+ import { u32, vec2i, vec4f } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
2
  import { GPUDatabaseDefinition } from "../buffer/table/GPUDatabaseDefinition.js";
3
3
  import { SCENE_DATABASE_SPEC } from "../scene/SCENE_DATABASE_SPEC.js";
4
4
  import { DIRECTIONAL_LIGHT_STRUCT } from "../shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.js";
5
5
  import { POINT_LIGHT_STRUCT } from "../shader/chunk/light/POINT_LIGHT_STRUCT.js";
6
6
  import { SPOT_LIGHT_STRUCT } from "../shader/chunk/light/SPOT_LIGHT_STRUCT.js";
7
7
  import { CSM_CASCADE_STRUCT } from "../shadow/map/csm/CSM_CASCADE_STRUCT.js";
8
- import { CSM_SHADOWMAP_STRUCT } from "../shadow/map/csm/CSM_SHADOWMAP_STRUCT.js";
8
+ import { DIRECTIONAL_SHADOWMAP_STRUCT } from "../shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js";
9
9
  import { SHADOWMAP_VIEW_METADATA_STRUCT } from "../shadow/map/shader/SHADOWMAP_VIEW_METADATA_STRUCT.js";
10
+ import { VSM_RECORD_STRUCT } from "../shadow/vsm/VSM_RECORD_STRUCT.js";
11
+ import { VSM_SLOT_STRUCT } from "../shadow/vsm/VSM_SLOT_STRUCT.js";
10
12
 
11
13
  export const LIGHT_DATABASE_SPEC = GPUDatabaseDefinition.from({
12
14
  light_point: POINT_LIGHT_STRUCT,
@@ -16,15 +18,71 @@ export const LIGHT_DATABASE_SPEC = GPUDatabaseDefinition.from({
16
18
  // shadow metadata, indexed by `light.shadow_id` from the matching light record.
17
19
  // Point lights store only the atlas rect — sampling is direction-based and uses no
18
20
  // projection. Spot lights store atlas + projection for their one view. Directional lights
19
- // store where their cascades are, as a range over `shadow_cascade`.
21
+ // store where their cascades are, as a range over `shadow_cascade`, or which virtual shadow map
22
+ // they have, as a link into `shadow_virtual`.
20
23
  shadow_point: vec4f,
21
24
  shadow_spot: SHADOWMAP_VIEW_METADATA_STRUCT,
22
- shadow_directional: CSM_SHADOWMAP_STRUCT,
25
+ shadow_directional: DIRECTIONAL_SHADOWMAP_STRUCT,
23
26
 
24
27
  // one row per cascade of a directional shadow map, a map's cascades a run of consecutive rows
25
28
  // claimed and released by the shadow context: atlas + projection from the CPU, and what the GPU
26
29
  // measured of the casters in front of the cascade, read back to fit the next frame's near plane
27
30
  shadow_cascade: CSM_CASCADE_STRUCT,
31
+
32
+ // one row per virtual shadow map: its light space, clipmap windows, pool, and the main view it
33
+ // selects levels for
34
+ shadow_virtual: VSM_RECORD_STRUCT,
35
+
36
+ // a virtual shadow map's clipmap windows, a run per map, one row per level: the corner of the
37
+ // level's window in its own pages — written by the CPU when the window scrolls
38
+ shadow_virtual_level: vec2i,
39
+
40
+ // a virtual shadow map's page table, a run per map, one page-table entry per cell of every
41
+ // level's window — written by the CPU as pages are installed, evicted and scrolled away
42
+ shadow_virtual_page: u32,
43
+
44
+ // what each slot of a virtual shadow map's pool holds, a run per map — written by the CPU with
45
+ // the page table, read by the pass that finds pages under moving casters
46
+ shadow_virtual_slot: VSM_SLOT_STRUCT,
47
+ });
48
+
49
+ // A directional light's virtual shadow map. Not owning, for the reason the cascade range is not.
50
+ LIGHT_DATABASE_SPEC.add_link({
51
+ table: 'shadow_directional',
52
+ field: 'virtual_map',
53
+ target_database: LIGHT_DATABASE_SPEC,
54
+ target_table: 'shadow_virtual',
55
+ nullable: true,
56
+ owning: false,
57
+ });
58
+
59
+ // A virtual shadow map's level, page table and slot rows. The shadow context claims the runs with the
60
+ // map and gives them back when it evicts it.
61
+ LIGHT_DATABASE_SPEC.add_range({
62
+ table: 'shadow_virtual',
63
+ first_field: 'first_level',
64
+ count_field: 'level_count',
65
+ target_database: LIGHT_DATABASE_SPEC,
66
+ target_table: 'shadow_virtual_level',
67
+ owning: false,
68
+ });
69
+
70
+ LIGHT_DATABASE_SPEC.add_range({
71
+ table: 'shadow_virtual',
72
+ first_field: 'first_page',
73
+ count_field: 'page_count',
74
+ target_database: LIGHT_DATABASE_SPEC,
75
+ target_table: 'shadow_virtual_page',
76
+ owning: false,
77
+ });
78
+
79
+ LIGHT_DATABASE_SPEC.add_range({
80
+ table: 'shadow_virtual',
81
+ first_field: 'first_slot',
82
+ count_field: 'slot_count',
83
+ target_database: LIGHT_DATABASE_SPEC,
84
+ target_table: 'shadow_virtual_slot',
85
+ owning: false,
28
86
  });
29
87
 
30
88
  // A directional shadow map's cascades. Not owning: the shadow context holds the run for the life of
@@ -8,7 +8,7 @@
8
8
  export function parse_rgbe(buffer: ArrayBuffer, type?: BinaryDataType.Float16 | BinaryDataType.Float32): {
9
9
  width: number;
10
10
  height: number;
11
- data: Float32Array | Uint16Array;
11
+ data: any;
12
12
  header: string;
13
13
  gamma: number;
14
14
  exposure: number;
@@ -48,7 +48,7 @@ export function parse_rgbe(
48
48
  case BinaryDataType.Float16:
49
49
 
50
50
  numElements = image_rgba_data.length / 4;
51
- const halfArray = new Uint16Array(numElements * 4);
51
+ const halfArray = new Float16Array(numElements * 4);
52
52
 
53
53
  for (let j = 0; j < numElements; j++) {
54
54
 
@@ -76,4 +76,4 @@ export function parse_rgbe(
76
76
  type: type
77
77
  };
78
78
 
79
- }
79
+ }
@@ -2,8 +2,8 @@
2
2
  *
3
3
  * @param {Uint8Array} sourceArray
4
4
  * @param {number} sourceOffset
5
- * @param {Uint16Array} destArray
5
+ * @param {Float16Array} destArray
6
6
  * @param {number} destOffset
7
7
  */
8
- export function rgbe_byte_to_rgb_half(sourceArray: Uint8Array, sourceOffset: number, destArray: Uint16Array, destOffset: number): void;
8
+ export function rgbe_byte_to_rgb_half(sourceArray: Uint8Array, sourceOffset: number, destArray: Float16Array, destOffset: number): void;
9
9
  //# sourceMappingURL=rgbe_byte_to_rgb_half.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rgbe_byte_to_rgb_half.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,mDALW,UAAU,gBACV,MAAM,aACN,WAAW,cACX,MAAM,QAchB"}
1
+ {"version":3,"file":"rgbe_byte_to_rgb_half.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,mDALW,UAAU,gBACV,MAAM,uCAEN,MAAM,QAchB"}
@@ -1,16 +1,8 @@
1
- import { to_half_float_uint16 } from "../../../../../core/binary/to_half_float_uint16.js";
2
-
3
- /**
4
- * Precomputed for simplicity
5
- * @type {number}
6
- */
7
- const F16_1 = to_half_float_uint16(1);
8
-
9
1
  /**
10
2
  *
11
3
  * @param {Uint8Array} sourceArray
12
4
  * @param {number} sourceOffset
13
- * @param {Uint16Array} destArray
5
+ * @param {Float16Array} destArray
14
6
  * @param {number} destOffset
15
7
  */
16
8
  export function rgbe_byte_to_rgb_half(sourceArray, sourceOffset, destArray, destOffset) {
@@ -19,10 +11,10 @@ export function rgbe_byte_to_rgb_half(sourceArray, sourceOffset, destArray, dest
19
11
  const scale = Math.pow(2.0, e - 128.0) / 255.0;
20
12
 
21
13
  // clamping to 65504, the maximum representable value in float16
22
- destArray[destOffset + 0] = to_half_float_uint16(Math.min(sourceArray[sourceOffset + 0] * scale, 65504));
23
- destArray[destOffset + 1] = to_half_float_uint16(Math.min(sourceArray[sourceOffset + 1] * scale, 65504));
24
- destArray[destOffset + 2] = to_half_float_uint16(Math.min(sourceArray[sourceOffset + 2] * scale, 65504));
14
+ destArray[destOffset + 0] = Math.min(sourceArray[sourceOffset + 0] * scale, 65504);
15
+ destArray[destOffset + 1] = Math.min(sourceArray[sourceOffset + 1] * scale, 65504);
16
+ destArray[destOffset + 2] = Math.min(sourceArray[sourceOffset + 2] * scale, 65504);
25
17
 
26
- destArray[destOffset + 3] = F16_1;
18
+ destArray[destOffset + 3] = 1;
27
19
 
28
- }
20
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_sh_exp_workgroup_sum.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,oCAFU,MAAM,CAEyB;AAEzC;;;;;;;;;GASG;AACH,yCAFU,SAAS,CA8BhB;0BAjDuB,uCAAuC"}
1
+ {"version":3,"file":"chunk_sh_exp_workgroup_sum.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,oCAFU,MAAM,CAEyB;AAMzC;;;;;;;;;GASG;AACH,yCAFU,SAAS,CA8BhB;0BArDuB,uCAAuC"}
@@ -10,6 +10,10 @@ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
10
10
  */
11
11
  export const SH_EXP_WORKGROUP_SIZE = 256;
12
12
 
13
+
14
+ const MIN_SUBGROUP_SIZE = 4;
15
+ const MAX_PARTIALS_SIZE = Math.ceil(SH_EXP_WORKGROUP_SIZE / MIN_SUBGROUP_SIZE);
16
+
13
17
  /**
14
18
  * Sum of a `vec4` over the workgroup, subgroup first: `subgroupAdd`, then one elected lane per
15
19
  * subgroup claims a slot — invocation indices need not map to subgroups in contiguous blocks — and
@@ -24,7 +28,7 @@ export const chunk_sh_exp_workgroup_sum = CodeChunk.from(
24
28
  //language=WGSL
25
29
  `
26
30
  var<workgroup> sh_exp_partial_count: atomic<u32>;
27
- var<workgroup> sh_exp_partials: array<vec4<f32>, ${SH_EXP_WORKGROUP_SIZE}>;
31
+ var<workgroup> sh_exp_partials: array<vec4<f32>, ${MAX_PARTIALS_SIZE}>;
28
32
 
29
33
  fn sh_exp_workgroup_sum(value: vec4<f32>, local_index: u32) -> vec4<f32> {
30
34
  let subgroup_sum = subgroupAdd(value);
@@ -13,7 +13,7 @@ export class TinyGltf {
13
13
  * @readonly
14
14
  * @type {TextureFormat}
15
15
  */
16
- static readonly "__#258@#UNCOMPRESSED_TARGET": TextureFormat;
16
+ static readonly "__#259@#UNCOMPRESSED_TARGET": TextureFormat;
17
17
  /**
18
18
  * @param {AssetManager} assetManager
19
19
  * @param {AssetRequestScope} [scope]
@@ -48,6 +48,8 @@ export class ParticipatingMedium {
48
48
  * @type {number}
49
49
  */
50
50
  priority: number;
51
+ /** Authored coefficients changed; resident consumers can queue a write without polling. */
52
+ onChanged: Signal;
51
53
  /**
52
54
  * Bumped whenever something that reaches the GPU changes, so the resident media table knows to
53
55
  * repack this medium — the contract {@link ShadeMaterial#version} has. {@link add_lobe} and
@@ -105,4 +107,5 @@ export class ParticipatingMedium {
105
107
  export type MediumPhaseFunction = import("./phase/MediumPhaseFunction.js").MediumPhaseFunction;
106
108
  export type MediumPhaseLobeRecord = import("./phase/MediumPhaseFunction.js").MediumPhaseLobeRecord;
107
109
  export type ShadeMaterial = import("../material/ShadeMaterial.js").ShadeMaterial;
110
+ import Signal from "../../../core/events/signal/Signal.js";
108
111
  //# sourceMappingURL=ParticipatingMedium.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ParticipatingMedium.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/medium/ParticipatingMedium.js"],"names":[],"mappings":"AAuBA;;GAEG;AACH;IACI;;;OAGG;IACH,wBAHW,MAAM,EAAE,SACR,mBAAmB,EAa7B;IAVG;;;OAGG;IACH,YAFU,MAAM,EAAE,CAEU;IAE5B;;OAEG;IACH,OAFU,mBAAmB,CAEX;CAEzB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH;IACI;;;OAGG;IACH,YAFU,MAAM,EAAE,CAEK;IAEvB;;;;;OAKG;IACH,UAFU,MAAM,CAEH;IAYb;;;;;;;OAOG;IACH,sBAEC;IAED;;;;OAIG;IACH,gCAIC;IAED;;;OAGG;IACH,gDAEC;IAED;;;OAGG;IACH,6BAQC;IAED;;;;;OAKG;IACH,qBAHW,MAAM,EAAE,SACR,mBAAmB,QAe7B;IAED;;OAEG;IACH,oBAIC;IAED;;;;OAIG;IACH,iBAFa;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,qBAAqB,EAAE,CAAA;KAAC,CA8BxG;IAGL;;;OAGG;IACH,gCAFU,OAAO,CAEkC;;CANlD;kCAjMY,OAAO,gCAAgC,EAAE,mBAAmB;oCAC5D,OAAO,gCAAgC,EAAE,qBAAqB;4BAC9D,OAAO,8BAA8B,EAAE,aAAa"}
1
+ {"version":3,"file":"ParticipatingMedium.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/medium/ParticipatingMedium.js"],"names":[],"mappings":"AAwBA;;GAEG;AACH;IACI;;;OAGG;IACH,wBAHW,MAAM,EAAE,SACR,mBAAmB,EAa7B;IAVG;;;OAGG;IACH,YAFU,MAAM,EAAE,CAEU;IAE5B;;OAEG;IACH,OAFU,mBAAmB,CAEX;CAEzB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH;IACI;;;OAGG;IACH,YAFU,MAAM,EAAE,CAEK;IAEvB;;;;;OAKG;IACH,UAFU,MAAM,CAEH;IAYb,2FAA2F;IAC3F,kBAAyB;IAEzB;;;;;;;OAOG;IACH,sBAEC;IAED;;;;OAIG;IACH,gCAKC;IAED;;;OAGG;IACH,gDAEC;IAED;;;OAGG;IACH,6BAQC;IAED;;;;;OAKG;IACH,qBAHW,MAAM,EAAE,SACR,mBAAmB,QAgB7B;IAED;;OAEG;IACH,oBAKC;IAED;;;;OAIG;IACH,iBAFa;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,qBAAqB,EAAE,CAAA;KAAC,CA8BxG;IAGL;;;OAGG;IACH,gCAFU,OAAO,CAEkC;;CANlD;kCAvMY,OAAO,gCAAgC,EAAE,mBAAmB;oCAC5D,OAAO,gCAAgC,EAAE,qBAAqB;4BAC9D,OAAO,8BAA8B,EAAE,aAAa;mBAN9C,uCAAuC"}
@@ -1,4 +1,5 @@
1
1
  import { assert } from "../../../core/assert.js";
2
+ import Signal from "../../../core/events/signal/Signal.js";
2
3
  import { MEDIUM_PHASE_LOBE_LIMIT } from "./MEDIUM_STRUCT.js";
3
4
 
4
5
  /**
@@ -86,6 +87,9 @@ export class ParticipatingMedium {
86
87
  */
87
88
  #version = 0;
88
89
 
90
+ /** Authored coefficients changed; resident consumers can queue a write without polling. */
91
+ onChanged = new Signal();
92
+
89
93
  /**
90
94
  * Bumped whenever something that reaches the GPU changes, so the resident media table knows to
91
95
  * repack this medium — the contract {@link ShadeMaterial#version} has. {@link add_lobe} and
@@ -106,6 +110,7 @@ export class ParticipatingMedium {
106
110
  set needsUpdate(value) {
107
111
  if (value) {
108
112
  this.#version++;
113
+ this.onChanged.dispatch();
109
114
  }
110
115
  }
111
116
 
@@ -150,6 +155,7 @@ export class ParticipatingMedium {
150
155
  this.#lobes.push(new ParticipatingMediumLobe(scattering.slice(), phase));
151
156
 
152
157
  this.#version++;
158
+ this.onChanged.dispatch();
153
159
  }
154
160
 
155
161
  /**
@@ -159,6 +165,7 @@ export class ParticipatingMedium {
159
165
  this.#lobes.length = 0;
160
166
 
161
167
  this.#version++;
168
+ this.onChanged.dispatch();
162
169
  }
163
170
 
164
171
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"shader_autoexposure_build_histogram.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js"],"names":[],"mappings":"AA4HA,gEAIE;8BA5H4B,+BAA+B"}
1
+ {"version":3,"file":"shader_autoexposure_build_histogram.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js"],"names":[],"mappings":"AA8FA,gEAIE;8BA7F4B,+BAA+B"}
@@ -1,5 +1,6 @@
1
1
  import { chunk_inverse_lerp } from "../../shader/chunk/math/chunk_inverse_lerp.js";
2
2
  import { chunk_rgb_to_luminance } from "../../shader/chunk/color/chunk_rgb_to_luminance.js";
3
+ import { chunk_screen_importance } from "../../shader/chunk/screen_space/chunk_screen_importance.js";
3
4
  import { chunk_texel_coordinate_to_uv } from "../../shader/chunk/texture/chunk_texel_coordinate_to_uv.js";
4
5
  import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
6
  import { ComputeShader } from "../../shader/ComputeShader.js";
@@ -18,36 +19,6 @@ const LUMINANCE_MIN = Math.pow(2, AUTOEXPOSURE_HISTOGRAM_LOG_MIN);
18
19
  const LUMINANCE_MAX = Math.pow(2, AUTOEXPOSURE_HISTOGRAM_LOG_MAX);
19
20
 
20
21
 
21
- /**
22
- * Exposure metering mask (see https://www.unrealengine.com/en-US/tech-blog/how-epic-games-is-handling-auto-exposure-in-4-25)
23
- * Prioritize pixels away from the edge of the screen
24
- * @type {CodeChunk}
25
- */
26
- const chunk_compute_vignette = CodeChunk.from(
27
- //language=WGSL
28
- `
29
- fn compute_vignette(
30
- uv: vec2<f32>,
31
- vertical_aspect: f32,
32
- border_fraction: f32
33
- ) -> f32{
34
-
35
- let fov = border_fraction * vec2(vertical_aspect, 1.0);
36
-
37
- let border = smoothstep(vec2(0.0, 0.0), fov, uv) * (1.0 - smoothstep(vec2(1.0, 1.0) - fov, vec2(1.0, 1.0), uv));
38
- let vignette = border.x * border.y;
39
-
40
- return vignette;
41
- }
42
- `
43
- )
44
-
45
- /**
46
- * How many distinct steps to use for quantization?
47
- * @type {number}
48
- */
49
- const MASKING_QUANTIZATION_STEPS = 64;
50
-
51
22
  /**
52
23
  * NOTE: we do not explicitly initialize groupshared memory, as spec guarantees it to be initialized to default value of 0 already.
53
24
  * @type {CodeChunk}
@@ -93,10 +64,9 @@ fn main(
93
64
  let bin_index = u32( t * ${ (SCENE_LUMINANCE_HISTOGRAM_BIN_COUNT - 1) });
94
65
 
95
66
  let uv = texel_coordinate_to_uv(vec2<f32>(global_id.xy), size);
96
-
97
- let vignette = compute_vignette(uv, f32(size.y) / f32(size.x), 0.13);
98
-
99
- let quantized = max(1u, u32(vignette * ${MASKING_QUANTIZATION_STEPS}));
67
+
68
+ // the metering mask: pixels away from the edge of the screen count for more
69
+ let quantized = screen_importance_weight(uv, f32(size.y) / f32(size.x));
100
70
 
101
71
  atomicAdd(&group_histogram.bins[bin_index], quantized);
102
72
 
@@ -118,7 +88,7 @@ fn main(
118
88
  chunk_rgb_to_luminance,
119
89
  chunk_inverse_lerp,
120
90
  chunk_texel_coordinate_to_uv,
121
- chunk_compute_vignette,
91
+ chunk_screen_importance,
122
92
  ]
123
93
  )
124
94
 
@@ -53,7 +53,7 @@ export class NSS {
53
53
  * @returns {number}
54
54
  */
55
55
  static recommended_jitter_sequence_size(upscale_ratio: number): number;
56
- static "__#187@#preprocess_tensor_descriptor"(render_w: any, render_h: any): TextureResourceDescriptor;
56
+ static "__#190@#preprocess_tensor_descriptor"(render_w: any, render_h: any): TextureResourceDescriptor;
57
57
  /**
58
58
  * @param {GraphicsContext} graphics
59
59
  */
@@ -5,9 +5,13 @@ export class SSR {
5
5
  */
6
6
  constructor(graphics: import("../../GraphicsContext.js").GraphicsContext);
7
7
  frame_index: number;
8
- set spatial_denoising_enabled(value: boolean);
9
- /** Toggle the three spatial passes independently of temporal reprojection. @returns {boolean} */
10
- get spatial_denoising_enabled(): boolean;
8
+ set tile_denoising_enabled(value: boolean);
9
+ /**
10
+ * Opt-in constant-neighborhood coverage tiles. Classification adds overhead;
11
+ * measure the scene/device before enabling it, particularly at low resolutions.
12
+ * @returns {boolean}
13
+ */
14
+ get tile_denoising_enabled(): boolean;
11
15
  set reset_history(value: boolean);
12
16
  /**
13
17
  * When set, will disregard history buffer
@@ -15,6 +19,9 @@ export class SSR {
15
19
  * @type {boolean}
16
20
  */
17
21
  get reset_history(): boolean;
22
+ set spatial_denoising_enabled(value: boolean);
23
+ /** Toggle the three spatial passes independently of temporal reprojection. @returns {boolean} */
24
+ get spatial_denoising_enabled(): boolean;
18
25
  set reprojection_mode(value: number);
19
26
  /** @returns {SSRReprojectionMode} */
20
27
  get reprojection_mode(): number;
@@ -47,7 +54,7 @@ export class SSR {
47
54
  * @param {import("../../view/GPUViewContext.js").GPUViewContext} [options.view_ctx]
48
55
  * @param {ArrayLike<number>} [options.jitter] Raster jitter in internal pixels
49
56
  * @param {number} [options.mip] Higher mip = lower resolution trace
50
- * @returns {{final:number, trace:number, reflections:number, denoised:number, denoised_1:number}}
57
+ * @returns {{final:number, trace:number, reflections:number, denoised:number, denoised_1:number, denoise_tiles:number}}
51
58
  */
52
59
  graph_pass({ graph, input_depth, input_depth_previous, view_ctx, jitter, input_hzb, input_scene_color, input_pbr, input_normal, input_velocity, input_occlusion, input_albedo, resolution, camera_current, camera_previous, input_environment, indirect_lighting_mode, lpv, brick4, mip, }: {
53
60
  graph: import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
@@ -76,6 +83,7 @@ export class SSR {
76
83
  reflections: number;
77
84
  denoised: number;
78
85
  denoised_1: number;
86
+ denoise_tiles: number;
79
87
  };
80
88
  #private;
81
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SSR.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/ssr/SSR.js"],"names":[],"mappings":"AAiBA;IAyDI;;;OAGG;IACH,sBAFW,OAAO,0BAA0B,EAAE,eAAe,EAkB5D;IA3DD,oBAAgB;IAMhB,8CAOC;IATD,iGAAiG;IACjG,yCAA2E;IA0B3E,kCAMC;IAZD;;;;OAIG;IACH,6BAAmD;IAbnD,qCAMC;IARD,qCAAqC;IACrC,gCAA2D;IA6C3D;;;;OAIG;IACH,UAHW,MAAM,KACN,MAAM,QAUhB;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH;QAtBsG,KAAK,EAAhG,OAAO,8DAA8D,EAAE,UAAU;QACjE,WAAW,EAA3B,MAAM;QACW,oBAAoB,GAArC,MAAM;QACU,SAAS,EAAzB,MAAM;QACU,iBAAiB,EAAjC,MAAM;QACU,YAAY,EAA5B,MAAM;QACU,SAAS,EAAzB,MAAM;QACU,YAAY,EAA5B,MAAM;QACU,cAAc,EAA9B,MAAM;QACU,eAAe,EAA/B,MAAM;QACW,iBAAiB,GAAlC,MAAM;QACqB,UAAU,EAArC,UAAU,MAAM,CAAC;QACD,cAAc,EAA9B,MAAM;QACU,eAAe,EAA/B,MAAM;QAC8B,sBAAsB,GAA1D,yBAAyB;QAC6D,MAAM,GAA5F,OAAO,oDAAoD,EAAE,cAAc;QACkB,GAAG,GAAhG,OAAO,sDAAsD,EAAE,mBAAmB;QAClB,QAAQ,GAAxE,OAAO,8BAA8B,EAAE,cAAc;QACzB,MAAM,GAAlC,UAAU,MAAM,CAAC;QACA,GAAG,GAApB,MAAM;QACJ;QAAC,KAAK,EAAC,MAAM,CAAC;QAAC,KAAK,EAAC,MAAM,CAAC;QAAC,WAAW,EAAC,MAAM,CAAC;QAAC,QAAQ,EAAC,MAAM,CAAC;QAAC,UAAU,EAAC,MAAM,CAAA;KAAC,CAoQhG;;CACJ;0CA3YyC,oCAAoC"}
1
+ {"version":3,"file":"SSR.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/ssr/SSR.js"],"names":[],"mappings":"AAmBA;IAwEI;;;OAGG;IACH,sBAFW,OAAO,0BAA0B,EAAE,eAAe,EAkB5D;IA1ED,oBAAgB;IAWhB,2CAMC;IAZD;;;;OAIG;IACH,sCAAqE;IAoCrE,kCAMC;IAZD;;;;OAIG;IACH,6BAAmD;IAxBnD,8CAOC;IATD,iGAAiG;IACjG,yCAA2E;IAY3E,qCAMC;IARD,qCAAqC;IACrC,gCAA2D;IA6C3D;;;;OAIG;IACH,UAHW,MAAM,KACN,MAAM,QAUhB;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH;QAtBsG,KAAK,EAAhG,OAAO,8DAA8D,EAAE,UAAU;QACjE,WAAW,EAA3B,MAAM;QACW,oBAAoB,GAArC,MAAM;QACU,SAAS,EAAzB,MAAM;QACU,iBAAiB,EAAjC,MAAM;QACU,YAAY,EAA5B,MAAM;QACU,SAAS,EAAzB,MAAM;QACU,YAAY,EAA5B,MAAM;QACU,cAAc,EAA9B,MAAM;QACU,eAAe,EAA/B,MAAM;QACW,iBAAiB,GAAlC,MAAM;QACqB,UAAU,EAArC,UAAU,MAAM,CAAC;QACD,cAAc,EAA9B,MAAM;QACU,eAAe,EAA/B,MAAM;QAC8B,sBAAsB,GAA1D,yBAAyB;QAC6D,MAAM,GAA5F,OAAO,oDAAoD,EAAE,cAAc;QACkB,GAAG,GAAhG,OAAO,sDAAsD,EAAE,mBAAmB;QAClB,QAAQ,GAAxE,OAAO,8BAA8B,EAAE,cAAc;QACzB,MAAM,GAAlC,UAAU,MAAM,CAAC;QACA,GAAG,GAApB,MAAM;QACJ;QAAC,KAAK,EAAC,MAAM,CAAC;QAAC,KAAK,EAAC,MAAM,CAAC;QAAC,WAAW,EAAC,MAAM,CAAC;QAAC,QAAQ,EAAC,MAAM,CAAC;QAAC,UAAU,EAAC,MAAM,CAAC;QAAC,aAAa,EAAC,MAAM,CAAA;KAAC,CA+QtH;;CACJ;0CAvayC,oCAAoC"}
@@ -11,9 +11,11 @@ import { ssr_resolve_shader_LPV } from "./resolve/ssr_resolve_shader_LPV.js";
11
11
  import { ssr_combine_shader } from "./ssr_combine_shader.js";
12
12
  import { ssr_graph_prefilter_color } from "./ssr_graph_prefilter_color.js";
13
13
  import { SSR_PREFILTER_MIP_COUNT } from "./SSR_PREFILTER_MIP_COUNT.js";
14
- import { ssr_reproject_shader } from "./ssr_reproject_shader.js";
15
- import { ssr_spatial_denoise_shader, ssr_spatial_denoise_metadata_shader } from "./ssr_spatial_denoise_shader.js";
14
+ import { ssr_reproject_shader, ssr_reproject_tile_shader } from "./ssr_reproject_shader.js";
15
+ import { ssr_spatial_denoise_shader, ssr_spatial_denoise_metadata_shader,
16
+ ssr_spatial_denoise_tile_shader, ssr_spatial_denoise_metadata_tile_shader } from "./ssr_spatial_denoise_shader.js";
16
17
  import { ssr_trace_shader } from "./ssr_trace_shader.js";
18
+ import { ssr_graph_denoise_tiles } from "./ssr_graph_denoise_tiles.js";
17
19
 
18
20
  export class SSR {
19
21
 
@@ -36,6 +38,21 @@ export class SSR {
36
38
  frame_index = 0;
37
39
  #reprojection_mode = SSRReprojectionMode.Parallax;
38
40
  #spatial_denoising_enabled = true;
41
+ #tile_denoising_enabled = false;
42
+
43
+ /**
44
+ * Opt-in constant-neighborhood coverage tiles. Classification adds overhead;
45
+ * measure the scene/device before enabling it, particularly at low resolutions.
46
+ * @returns {boolean}
47
+ */
48
+ get tile_denoising_enabled() { return this.#tile_denoising_enabled; }
49
+ set tile_denoising_enabled(value) {
50
+ assert.isBoolean(value, 'tile_denoising_enabled');
51
+ if (value !== this.#tile_denoising_enabled) {
52
+ this.#tile_denoising_enabled = value;
53
+ this.reset_history = true;
54
+ }
55
+ }
39
56
 
40
57
  /** Toggle the three spatial passes independently of temporal reprojection. @returns {boolean} */
41
58
  get spatial_denoising_enabled() { return this.#spatial_denoising_enabled; }
@@ -132,7 +149,7 @@ export class SSR {
132
149
  * @param {import("../../view/GPUViewContext.js").GPUViewContext} [options.view_ctx]
133
150
  * @param {ArrayLike<number>} [options.jitter] Raster jitter in internal pixels
134
151
  * @param {number} [options.mip] Higher mip = lower resolution trace
135
- * @returns {{final:number, trace:number, reflections:number, denoised:number, denoised_1:number}}
152
+ * @returns {{final:number, trace:number, reflections:number, denoised:number, denoised_1:number, denoise_tiles:number}}
136
153
  */
137
154
  graph_pass({
138
155
  graph,
@@ -282,7 +299,13 @@ export class SSR {
282
299
  },
283
300
  });
284
301
 
285
- // History validity is captured above and consumed by temporal reprojection.
302
+ const tile_denoising = this.#tile_denoising_enabled
303
+ && (this.#spatial_denoising_enabled || this.#reprojection_mode !== SSRReprojectionMode.CurrentFrame);
304
+ const denoise_tiles = tile_denoising ? ssr_graph_denoise_tiles({
305
+ graph, resolution, input: reflections, metadata: reflection_metadata,
306
+ history, history_metadata, velocity: input_velocity, history_valid: valid, jitter_delta,
307
+ }) : -1;
308
+ const tile_inputs = denoise_tiles >= 0 ? { tDenoiseTiles: denoise_tiles } : {};
286
309
 
287
310
  // denoise
288
311
 
@@ -295,9 +318,10 @@ export class SSR {
295
318
  if (this.#spatial_denoising_enabled) {
296
319
  [denoised, denoised_metadata] = graph_image_pass({
297
320
  graph,
298
- shader: ssr_spatial_denoise_metadata_shader,
321
+ shader: tile_denoising ? ssr_spatial_denoise_metadata_tile_shader : ssr_spatial_denoise_metadata_shader,
299
322
  output_resolution: resolution,
300
323
  inputs: {
324
+ ...tile_inputs,
301
325
  tInput: denoised,
302
326
  tMetadata: denoised_metadata,
303
327
  tDepth: input_depth,
@@ -313,9 +337,10 @@ export class SSR {
313
337
 
314
338
  [denoised, denoised_metadata] = graph_image_pass({
315
339
  graph,
316
- shader: ssr_reproject_shader,
340
+ shader: tile_denoising ? ssr_reproject_tile_shader : ssr_reproject_shader,
317
341
  output: [output, output_metadata, output_geometry],
318
342
  inputs: {
343
+ ...tile_inputs,
319
344
  tInput: denoised,
320
345
  tMetadata: denoised_metadata,
321
346
  tHistory: history,
@@ -337,9 +362,10 @@ export class SSR {
337
362
  // 2 more spatial denoise steps
338
363
  [denoised] = graph_image_pass({
339
364
  graph,
340
- shader: ssr_spatial_denoise_shader,
365
+ shader: tile_denoising ? ssr_spatial_denoise_tile_shader : ssr_spatial_denoise_shader,
341
366
  output_resolution: resolution,
342
367
  inputs: {
368
+ ...tile_inputs,
343
369
  tInput: denoised,
344
370
  tDepth: input_depth,
345
371
  tNormal: input_normal,
@@ -352,9 +378,10 @@ export class SSR {
352
378
 
353
379
  [denoised] = graph_image_pass({
354
380
  graph,
355
- shader: ssr_spatial_denoise_shader,
381
+ shader: tile_denoising ? ssr_spatial_denoise_tile_shader : ssr_spatial_denoise_shader,
356
382
  output_resolution: resolution,
357
383
  inputs: {
384
+ ...tile_inputs,
358
385
  tInput: denoised,
359
386
  tDepth: input_depth,
360
387
  tNormal: input_normal,
@@ -391,6 +418,7 @@ export class SSR {
391
418
  denoised,
392
419
  denoised_1,
393
420
  reflections,
421
+ denoise_tiles,
394
422
  };
395
423
  }
396
424
  }
@@ -0,0 +1,3 @@
1
+ /** Tile width in internal pixels; shared by classification and denoise shader variants. */
2
+ export const SSR_DENOISE_TILE_SIZE: 8;
3
+ //# sourceMappingURL=SSR_DENOISE_TILE_SIZE.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSR_DENOISE_TILE_SIZE.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,sCAAuC"}
@@ -0,0 +1,2 @@
1
+ /** Tile width in internal pixels; shared by classification and denoise shader variants. */
2
+ export const SSR_DENOISE_TILE_SIZE = 8;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * A miss can still contain varying GI radiance or useful history. Only a constant,
3
+ * stationary, zero-uncertainty neighborhood may take the denoiser's copy path.
4
+ * Texture names are supplied by shader_ssr_denoise_tile_classify.
5
+ */
6
+ export const chunk_ssr_denoise_tile_active: CodeChunk;
7
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
8
+ //# sourceMappingURL=chunk_ssr_denoise_tile_active.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_ssr_denoise_tile_active.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,sDA8B8C;0BAvCpB,oCAAoC"}
@@ -0,0 +1,40 @@
1
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
+ import { chunk_is_finite } from "../../shader/chunk/math/chunk_is_finite.js";
3
+ import { chunk_rgb_to_luminance } from "../../shader/chunk/color/chunk_rgb_to_luminance.js";
4
+
5
+ /**
6
+ * A miss can still contain varying GI radiance or useful history. Only a constant,
7
+ * stationary, zero-uncertainty neighborhood may take the denoiser's copy path.
8
+ * Texture names are supplied by shader_ssr_denoise_tile_classify.
9
+ */
10
+ export const chunk_ssr_denoise_tile_active = CodeChunk.from(/* language=WGSL */ `
11
+ fn ssr_denoise_tile_active(p: vec2i, history_valid: bool, jitter_delta: vec2f) -> u32 {
12
+ // The halo covers ordinary raster jitter, not an arbitrary jump in raster grids.
13
+ if (!is_finite(jitter_delta.x) || !is_finite(jitter_delta.y)
14
+ || any(abs(jitter_delta) > vec2f(1.0))) { return 1u; }
15
+ let current = textureLoad(tInput, p, 0);
16
+ let metadata = textureLoad(tMetadata, p, 0).rg;
17
+ let velocity = textureLoad(tVelocity, p, 0).rg;
18
+ if (!is_finite(current.x) || !is_finite(current.y) || !is_finite(current.z) || !is_finite(current.w)
19
+ || !is_finite(metadata.x) || !is_finite(metadata.y)
20
+ || !is_finite(velocity.x) || !is_finite(velocity.y)) { return 1u; }
21
+ // Velocity is already in INTERNAL PIXELS. Depth clipping can select a neighboring
22
+ // velocity; the dilated mask protects that neighbor's moving coverage too.
23
+ if (any(velocity != vec2f(0.0)) || current.w != 0.0 || any(metadata != vec2f(0.0))) { return 1u; }
24
+ if (any(current.rgb < vec3f(0.0))) { return 1u; }
25
+ let size = vec2i(textureDimensions(tInput));
26
+ // Every horizontal/vertical color boundary has an owner. The tile halo then
27
+ // covers both sides, including boundaries between tiles and isoluminant colors.
28
+ if (p.x + 1 < size.x && any(textureLoad(tInput, p + vec2i(1,0), 0).rgb != current.rgb)) { return 1u; }
29
+ if (p.y + 1 < size.y && any(textureLoad(tInput, p + vec2i(0,1), 0).rgb != current.rgb)) { return 1u; }
30
+ if (history_valid) {
31
+ let old = textureLoad(tHistory, p, 0);
32
+ let old_metadata = textureLoad(tHistoryMetadata, p, 0);
33
+ // Comparisons also keep invalid history active. A hard reset never loads it.
34
+ if (!all(old == current) || !all(old_metadata.rg == metadata)
35
+ || !is_finite(old_metadata.x) || !is_finite(old_metadata.z)
36
+ || !(old_metadata.w == rgb_to_luminance(current.rgb))) { return 1u; }
37
+ }
38
+ return 0u;
39
+ }
40
+ `, [chunk_is_finite, chunk_rgb_to_luminance]);
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_ssr_temporal_accumulate.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js"],"names":[],"mappings":"AAUA,gGAAgG;AAChG,sDA6HuH;0BAxI7F,uCAAuC"}
1
+ {"version":3,"file":"chunk_ssr_temporal_accumulate.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js"],"names":[],"mappings":"AAUA,gGAAgG;AAChG,sDA0IuH;0BArJ7F,uCAAuC"}