@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
@@ -0,0 +1,23 @@
1
+ export const VSM_SKINNED_MOVERS_WORKGROUP_SIZE: 64;
2
+ /**
3
+ * @type {WebGPUStruct}
4
+ */
5
+ export const VSM_SKINNED_MOVERS_SETTINGS_STRUCT: WebGPUStruct;
6
+ /**
7
+ * List every skinned mesh whose pose changed since last frame: a joint's skin matrix differs from
8
+ * the one the animation manager kept from the frame before. A pose can change inside bounds that
9
+ * stay put — an arm swinging inside the box its feet and head set — which neither the row's
10
+ * transform nor its box would show; a skin held still is no mover.
11
+ *
12
+ * The mesh's box is this frame's, after the bounds refresh: a pose that changed it is also caught by
13
+ * {@link shader_vsm_movers}, with where the mesh was.
14
+ *
15
+ * One workgroup per skinning binding, its lanes over the skin's joints, after
16
+ * {@link shader_vsm_movers} into the same list.
17
+ *
18
+ * @type {ComputeShader}
19
+ */
20
+ export const shader_vsm_skinned_movers: ComputeShader;
21
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
22
+ import { ComputeShader } from "../../../shader/ComputeShader.js";
23
+ //# sourceMappingURL=shader_vsm_skinned_movers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_vsm_skinned_movers.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js"],"names":[],"mappings":"AAYA,mDAAoD;AAEpD;;GAEG;AACH,iDAFU,YAAY,CAKS;AAsE/B;;;;;;;;;;;;;GAaG;AACH,wCAFU,aAAa,CAMpB;6BApG0B,sCAAsC;8BAJrC,kCAAkC"}
@@ -0,0 +1,109 @@
1
+ import { WebGPUExtensionType } from "../../../../descriptor/WebGPUExtensionType.js";
2
+ import { SKINNING_BINDING_STRUCT } from "../../../animation/skinning/SKINNING_BINDING_STRUCT.js";
3
+ import { chunk_scene_database_access } from "../../../scene/chunk_scene_database_access.js";
4
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
5
+ import { ComputeShader } from "../../../shader/ComputeShader.js";
6
+ import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
7
+ import { mat4x4f, u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
8
+ import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
9
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
10
+ import { VSM_MOVERS_STRUCT } from "../VSM_MOVER_LAYOUT.js";
11
+ import { chunk_vsm_append_mover } from "./chunk_vsm_append_mover.js";
12
+
13
+ export const VSM_SKINNED_MOVERS_WORKGROUP_SIZE = 64;
14
+
15
+ /**
16
+ * @type {WebGPUStruct}
17
+ */
18
+ export const VSM_SKINNED_MOVERS_SETTINGS_STRUCT = WebGPUStruct.from({
19
+ binding_count: u32,
20
+ capacity: u32,
21
+ }, "VSMSkinnedMoversSettings");
22
+
23
+ const resources = new ShaderResourceSetDescriptor();
24
+
25
+ resources.setImmediate('settings', VSM_SKINNED_MOVERS_SETTINGS_STRUCT);
26
+
27
+ resources.createGroup()
28
+ .addStorageBuffer('scene_database', WebGPUArray.from(u32), false)
29
+ .addStorageBuffer('bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
30
+ .addStorageBuffer('skin_matrices', WebGPUArray.from(mat4x4f), false)
31
+ .addStorageBuffer('prev_skin_matrices', WebGPUArray.from(mat4x4f), false)
32
+ .addStorageBuffer('movers', VSM_MOVERS_STRUCT, true);
33
+
34
+ const body = CodeChunk.from(
35
+ //language=WGSL
36
+ `
37
+ const LANES = ${VSM_SKINNED_MOVERS_WORKGROUP_SIZE}u;
38
+
39
+ // set by the first lane to find a joint that moved: that lane alone lists the mesh
40
+ var<workgroup> claimed: atomic<u32>;
41
+
42
+ fn vsm_matrix_differs(a: mat4x4f, b: mat4x4f) -> bool {
43
+ return any(a[0] != b[0]) || any(a[1] != b[1]) || any(a[2] != b[2]) || any(a[3] != b[3]);
44
+ }
45
+
46
+ @compute @workgroup_size(${VSM_SKINNED_MOVERS_WORKGROUP_SIZE},1,1)
47
+ fn main(
48
+ @builtin(workgroup_id) workgroup_id: vec3<u32>,
49
+ @builtin(local_invocation_index) lane: u32,
50
+ ) {
51
+ let index = workgroup_id.x;
52
+
53
+ // the whole workgroup's binding, so the whole workgroup leaves
54
+ if (index >= settings.binding_count) {
55
+ return;
56
+ }
57
+
58
+ let binding = bindings[index];
59
+
60
+ // a lane's joints, a workgroup's width apart: as many as the skin has, over the lanes
61
+ var moved = false;
62
+
63
+ for (var j = lane; j < binding.skin_matrix_count; j += LANES) {
64
+ let row = binding.skin_matrix_offset + j;
65
+
66
+ moved = moved || vsm_matrix_differs(skin_matrices[row], prev_skin_matrices[row]);
67
+ }
68
+
69
+ let first = moved && atomicExchange(&claimed, 1u) == 0u;
70
+
71
+ var box_min = vec3f(0.0);
72
+ var box_max = vec3f(0.0);
73
+
74
+ if (first) {
75
+ let mesh = scene_read_mesh(&scene_database, binding.mesh_instance_index);
76
+
77
+ box_min = vec3f(mesh.bounding_box[0], mesh.bounding_box[1], mesh.bounding_box[2]);
78
+ box_max = vec3f(mesh.bounding_box[3], mesh.bounding_box[4], mesh.bounding_box[5]);
79
+ }
80
+
81
+ vsm_append_mover(first && all(box_min <= box_max), box_min, box_max, settings.capacity);
82
+ }
83
+ `, [
84
+ SKINNING_BINDING_STRUCT.declaration_chunk,
85
+ chunk_scene_database_access,
86
+ chunk_vsm_append_mover,
87
+ ]);
88
+
89
+ body.addExtension(WebGPUExtensionType.Subgroups);
90
+
91
+ /**
92
+ * List every skinned mesh whose pose changed since last frame: a joint's skin matrix differs from
93
+ * the one the animation manager kept from the frame before. A pose can change inside bounds that
94
+ * stay put — an arm swinging inside the box its feet and head set — which neither the row's
95
+ * transform nor its box would show; a skin held still is no mover.
96
+ *
97
+ * The mesh's box is this frame's, after the bounds refresh: a pose that changed it is also caught by
98
+ * {@link shader_vsm_movers}, with where the mesh was.
99
+ *
100
+ * One workgroup per skinning binding, its lanes over the skin's joints, after
101
+ * {@link shader_vsm_movers} into the same list.
102
+ *
103
+ * @type {ComputeShader}
104
+ */
105
+ export const shader_vsm_skinned_movers = ComputeShader.from({
106
+ label: "VSM/SkinnedMovers",
107
+ body,
108
+ resources,
109
+ });
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Slots a stale-pass workgroup tests against its mover: one per lane.
3
+ * @type {number}
4
+ */
5
+ export const VSM_STALE_WORKGROUP_SIZE: number;
6
+ /**
7
+ * @type {WebGPUStruct}
8
+ */
9
+ export const VSM_STALE_ARGS_SETTINGS_STRUCT: WebGPUStruct;
10
+ /**
11
+ * Size the stale pass to this frame's movers: `(ceil(slots / 64), movers, 1)` workgroups, a row of
12
+ * workgroups per mover — or one row when the list overflowed, which marks every occupied slot. No
13
+ * movers, no workgroups.
14
+ *
15
+ * One thread.
16
+ *
17
+ * @type {ComputeShader}
18
+ */
19
+ export const shader_vsm_stale_args: ComputeShader;
20
+ /**
21
+ * @type {WebGPUStruct}
22
+ */
23
+ export const VSM_STALE_SETTINGS_STRUCT: WebGPUStruct;
24
+ /**
25
+ * Mark the pool slots a mover crossed: workgroup `(x, y)` tests mover `y` against slots
26
+ * `[64x, 64x + 64)`, one lane a slot, so no thread loops.
27
+ *
28
+ * A slot's page is a square of its level in light space, widened by its border — the slot's whole
29
+ * extent, filtering included. A mover's world box goes into light space as a box around its centre:
30
+ * the light view's rotation of the centre, and the absolute rotation of the half-extent. A hit sets
31
+ * the slot's flag, which stays set until {@link shader_vsm_stale_compact} lists it for a readback, so
32
+ * a frame whose readback was skipped loses nothing.
33
+ *
34
+ * When the mover list overflowed, the one row of workgroups marks every occupied slot.
35
+ *
36
+ * Dispatch indirect from {@link shader_vsm_stale_args}.
37
+ *
38
+ * @type {ComputeShader}
39
+ */
40
+ export const shader_vsm_stale: ComputeShader;
41
+ /**
42
+ * @type {WebGPUStruct}
43
+ */
44
+ export const VSM_STALE_COMPACT_SETTINGS_STRUCT: WebGPUStruct;
45
+ /**
46
+ * List the slots flagged stale into the feedback buffer, clearing their flags, and copy the frame's
47
+ * mover count into its header. Runs on the frames a readback is taken, after {@link shader_vsm_stale}.
48
+ *
49
+ * One thread per slot.
50
+ *
51
+ * @type {ComputeShader}
52
+ */
53
+ export const shader_vsm_stale_compact: ComputeShader;
54
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
55
+ import { ComputeShader } from "../../../shader/ComputeShader.js";
56
+ //# sourceMappingURL=shader_vsm_stale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_vsm_stale.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js"],"names":[],"mappings":"AAYA;;;GAGG;AACH,uCAFU,MAAM,CAE2B;AAM3C;;GAEG;AACH,6CAFU,YAAY,CAIK;AAU3B;;;;;;;;GAQG;AACH,oCAFU,aAAa,CAiBpB;AAEH;;GAEG;AACH,wCAFU,YAAY,CAIC;AAYvB;;;;;;;;;;;;;;;GAeG;AACH,+BAFU,aAAa,CA6DpB;AAEH;;GAEG;AACH,gDAFU,YAAY,CAKQ;AAW9B;;;;;;;GAOG;AACH,uCAFU,aAAa,CA8BpB;6BA5M0B,sCAAsC;8BAJrC,kCAAkC"}
@@ -0,0 +1,211 @@
1
+ import { LIGHT_DATABASE_SPEC } from "../../../light/LIGHT_DATABASE_SPEC.js";
2
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
3
+ import { ComputeShader } from "../../../shader/ComputeShader.js";
4
+ import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
5
+ import { atomic_u32, u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
6
+ import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
7
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
8
+ import { VSM_FEEDBACK_LAYOUT } from "../VSM_FEEDBACK_LAYOUT.js";
9
+ import { VSM_MOVER_CAPACITY, VSM_MOVERS_READ_STRUCT } from "../VSM_MOVER_LAYOUT.js";
10
+ import { VSM_SLOT_EMPTY } from "../VSM_SLOT_STRUCT.js";
11
+ import { chunk_vsm_addressing } from "./chunk_vsm_addressing.js";
12
+
13
+ /**
14
+ * Slots a stale-pass workgroup tests against its mover: one per lane.
15
+ * @type {number}
16
+ */
17
+ export const VSM_STALE_WORKGROUP_SIZE = 64;
18
+
19
+ const RECORD_TABLE = LIGHT_DATABASE_SPEC.get('shadow_virtual');
20
+ const SLOT_TABLE = LIGHT_DATABASE_SPEC.get('shadow_virtual_slot');
21
+ const L = VSM_FEEDBACK_LAYOUT;
22
+
23
+ /**
24
+ * @type {WebGPUStruct}
25
+ */
26
+ export const VSM_STALE_ARGS_SETTINGS_STRUCT = WebGPUStruct.from({
27
+ slot_count: u32,
28
+ }, "VSMStaleArgsSettings");
29
+
30
+ const args_resources = new ShaderResourceSetDescriptor();
31
+
32
+ args_resources.setImmediate('settings', VSM_STALE_ARGS_SETTINGS_STRUCT);
33
+
34
+ args_resources.createGroup()
35
+ .addStorageBuffer('movers', VSM_MOVERS_READ_STRUCT, false)
36
+ .addStorageBuffer('command', WebGPUArray.from(u32), true);
37
+
38
+ /**
39
+ * Size the stale pass to this frame's movers: `(ceil(slots / 64), movers, 1)` workgroups, a row of
40
+ * workgroups per mover — or one row when the list overflowed, which marks every occupied slot. No
41
+ * movers, no workgroups.
42
+ *
43
+ * One thread.
44
+ *
45
+ * @type {ComputeShader}
46
+ */
47
+ export const shader_vsm_stale_args = ComputeShader.from({
48
+ label: "VSM/StaleArgs",
49
+ body: CodeChunk.from(
50
+ //language=WGSL
51
+ `
52
+ @compute @workgroup_size(1, 1, 1)
53
+ fn main() {
54
+ let count = movers.count;
55
+
56
+ command[0] = (settings.slot_count + ${VSM_STALE_WORKGROUP_SIZE - 1}u) / ${VSM_STALE_WORKGROUP_SIZE}u;
57
+ command[1] = select(count, 1u, count > ${VSM_MOVER_CAPACITY}u);
58
+ command[2] = 1u;
59
+ }
60
+ `),
61
+ resources: args_resources,
62
+ });
63
+
64
+ /**
65
+ * @type {WebGPUStruct}
66
+ */
67
+ export const VSM_STALE_SETTINGS_STRUCT = WebGPUStruct.from({
68
+ record_row: u32,
69
+ }, "VSMStaleSettings");
70
+
71
+ const stale_resources = new ShaderResourceSetDescriptor();
72
+
73
+ stale_resources.setImmediate('settings', VSM_STALE_SETTINGS_STRUCT);
74
+
75
+ stale_resources.createGroup()
76
+ .addStorageBuffer('light_database', WebGPUArray.from(u32), false)
77
+ .addStorageBuffer('movers', VSM_MOVERS_READ_STRUCT, false)
78
+ // persistent, one word per slot: 1 when a mover crossed the slot since the flags were last read
79
+ .addStorageBuffer('stale_flags', WebGPUArray.from(atomic_u32), true);
80
+
81
+ /**
82
+ * Mark the pool slots a mover crossed: workgroup `(x, y)` tests mover `y` against slots
83
+ * `[64x, 64x + 64)`, one lane a slot, so no thread loops.
84
+ *
85
+ * A slot's page is a square of its level in light space, widened by its border — the slot's whole
86
+ * extent, filtering included. A mover's world box goes into light space as a box around its centre:
87
+ * the light view's rotation of the centre, and the absolute rotation of the half-extent. A hit sets
88
+ * the slot's flag, which stays set until {@link shader_vsm_stale_compact} lists it for a readback, so
89
+ * a frame whose readback was skipped loses nothing.
90
+ *
91
+ * When the mover list overflowed, the one row of workgroups marks every occupied slot.
92
+ *
93
+ * Dispatch indirect from {@link shader_vsm_stale_args}.
94
+ *
95
+ * @type {ComputeShader}
96
+ */
97
+ export const shader_vsm_stale = ComputeShader.from({
98
+ label: "VSM/Stale",
99
+ body: CodeChunk.from(
100
+ //language=WGSL
101
+ `
102
+ @compute @workgroup_size(${VSM_STALE_WORKGROUP_SIZE}, 1, 1)
103
+ fn main(
104
+ @builtin(workgroup_id) wg_id: vec3<u32>,
105
+ @builtin(local_invocation_index) lane: u32,
106
+ ) {
107
+ let record = ${RECORD_TABLE.marshalling_method_read}(&light_database, settings.record_row);
108
+
109
+ let slot = wg_id.x * ${VSM_STALE_WORKGROUP_SIZE}u + lane;
110
+
111
+ if (slot >= record.slot_count) {
112
+ return;
113
+ }
114
+
115
+ let held = ${SLOT_TABLE.marshalling_method_read}(&light_database, record.first_slot + slot);
116
+
117
+ if (held.level == ${VSM_SLOT_EMPTY}u) {
118
+ return;
119
+ }
120
+
121
+ var hit = false;
122
+
123
+ if (movers.count > ${VSM_MOVER_CAPACITY}u) {
124
+ // the list overflowed: every occupied slot may hold a stale shadow
125
+ hit = wg_id.y == 0u;
126
+ } else {
127
+ let low = movers.boxes[wg_id.y * 2u].xyz;
128
+ let high = movers.boxes[wg_id.y * 2u + 1u].xyz;
129
+
130
+ let centre = (low + high) * 0.5;
131
+ let half_extent = (high - low) * 0.5;
132
+
133
+ let view = record.view;
134
+ let centre_ls = (view * vec4f(centre, 1.0)).xy;
135
+ let reach = abs(view[0].xy) * half_extent.x + abs(view[1].xy) * half_extent.y + abs(view[2].xy) * half_extent.z;
136
+
137
+ let size = vsm_page_world_size(record, held.level);
138
+ let border = size * f32(record.border) / f32(record.page_size);
139
+
140
+ let slot_min = vec2f(f32(held.x), f32(held.y)) * size - border;
141
+ let slot_max = vec2f(f32(held.x + 1), f32(held.y + 1)) * size + border;
142
+
143
+ hit = all(centre_ls + reach >= slot_min) && all(centre_ls - reach <= slot_max);
144
+ }
145
+
146
+ if (hit) {
147
+ atomicStore(&stale_flags[slot], 1u);
148
+ }
149
+ }
150
+ `, [
151
+ RECORD_TABLE.chunk_read,
152
+ SLOT_TABLE.chunk_read,
153
+ chunk_vsm_addressing,
154
+ ]),
155
+ resources: stale_resources,
156
+ });
157
+
158
+ /**
159
+ * @type {WebGPUStruct}
160
+ */
161
+ export const VSM_STALE_COMPACT_SETTINGS_STRUCT = WebGPUStruct.from({
162
+ slot_count: u32,
163
+ request_capacity: u32,
164
+ }, "VSMStaleCompactSettings");
165
+
166
+ const compact_resources = new ShaderResourceSetDescriptor();
167
+
168
+ compact_resources.setImmediate('settings', VSM_STALE_COMPACT_SETTINGS_STRUCT);
169
+
170
+ compact_resources.createGroup()
171
+ .addStorageBuffer('movers', VSM_MOVERS_READ_STRUCT, false)
172
+ .addStorageBuffer('stale_flags', WebGPUArray.from(atomic_u32), true)
173
+ .addStorageBuffer('feedback', WebGPUArray.from(atomic_u32), true);
174
+
175
+ /**
176
+ * List the slots flagged stale into the feedback buffer, clearing their flags, and copy the frame's
177
+ * mover count into its header. Runs on the frames a readback is taken, after {@link shader_vsm_stale}.
178
+ *
179
+ * One thread per slot.
180
+ *
181
+ * @type {ComputeShader}
182
+ */
183
+ export const shader_vsm_stale_compact = ComputeShader.from({
184
+ label: "VSM/StaleCompact",
185
+ body: CodeChunk.from(
186
+ //language=WGSL
187
+ `
188
+ @compute @workgroup_size(64, 1, 1)
189
+ fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
190
+ let slot = global_id.x;
191
+
192
+ if (slot == 0u) {
193
+ atomicStore(&feedback[${L.MOVER_COUNT}u], movers.count);
194
+ }
195
+
196
+ if (slot >= settings.slot_count) {
197
+ return;
198
+ }
199
+
200
+ if (atomicExchange(&stale_flags[slot], 0u) == 0u) {
201
+ return;
202
+ }
203
+
204
+ let index = atomicAdd(&feedback[${L.STALE_COUNT}u], 1u);
205
+ let stale_offset = ${L.HEADER_WORDS}u + settings.request_capacity * ${L.REQUEST_WORDS}u;
206
+
207
+ atomicStore(&feedback[stale_offset + index], slot);
208
+ }
209
+ `),
210
+ resources: compact_resources,
211
+ });
@@ -2,7 +2,7 @@
2
2
  *
3
3
  * @param {BinaryDataType} type
4
4
  * @param {ArrayBuffer} buffer
5
- * @retuns {Uint8Array|Float32Array}
5
+ * @returns {Uint8Array|Float32Array}
6
6
  */
7
7
  export function decode_typed_gpu_data(type: BinaryDataType, buffer: ArrayBuffer): Uint8Array | Float32Array;
8
8
  import { BinaryDataType } from "../../../../core/binary/type/BinaryDataType.js";
@@ -1 +1 @@
1
- {"version":3,"file":"decode_typed_gpu_data.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/format/decode_typed_gpu_data.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,4CAJW,cAAc,UACd,WAAW,6BA0BrB;+BA/B8B,gDAAgD"}
1
+ {"version":3,"file":"decode_typed_gpu_data.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/format/decode_typed_gpu_data.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,4CAJW,cAAc,UACd,WAAW,GACT,UAAU,GAAC,YAAY,CAgBnC;+BAtB8B,gDAAgD"}
@@ -1,11 +1,10 @@
1
- import { half_to_float_uint16 } from "../../../../core/binary/half_to_float_uint16.js";
2
1
  import { BinaryDataType } from "../../../../core/binary/type/BinaryDataType.js";
3
2
 
4
3
  /**
5
4
  *
6
5
  * @param {BinaryDataType} type
7
6
  * @param {ArrayBuffer} buffer
8
- * @retuns {Uint8Array|Float32Array}
7
+ * @returns {Uint8Array|Float32Array}
9
8
  */
10
9
  export function decode_typed_gpu_data(type, buffer) {
11
10
 
@@ -13,16 +12,7 @@ export function decode_typed_gpu_data(type, buffer) {
13
12
  return new Float32Array(buffer).slice();
14
13
  } else if (type === BinaryDataType.Float16) {
15
14
 
16
- const u16 = new Uint16Array(buffer);
17
-
18
- const length = u16.length;
19
- const result = new Float32Array(length);
20
-
21
- for (let i = 0; i < length; i++) {
22
- result[i] = half_to_float_uint16(u16[i])
23
- }
24
-
25
- return result;
15
+ return new Float32Array(new Float16Array(buffer));
26
16
 
27
17
  } else if (type === BinaryDataType.Uint8) {
28
18
  return new Uint8Array(buffer).slice();
@@ -30,4 +20,4 @@ export function decode_typed_gpu_data(type, buffer) {
30
20
  throw new Error(`Unsupported type '${type}'`);
31
21
  }
32
22
 
33
- }
23
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"infer_format_from_parameters.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/format/infer_format_from_parameters.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,4DANW,MAAM,aACN,cAAc,cACd,OAAO,eACP,UAAU,oBA6EpB;+BArF8B,gDAAgD;2BAEpD,kBAAkB"}
1
+ {"version":3,"file":"infer_format_from_parameters.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/format/infer_format_from_parameters.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,4DANW,MAAM,aACN,cAAc,cACd,OAAO,eACP,UAAU,oBA4EpB;+BApF8B,gDAAgD;2BAEpD,kBAAkB"}
@@ -45,9 +45,8 @@ export function infer_format_from_parameters(
45
45
  } else if (data_type === BinaryDataType.Float32) {
46
46
  ending = "float";
47
47
  } else if (data_type === BinaryDataType.Float16 || data_type === BinaryDataType.Uint16) {
48
- // Half-float HDR data (e.g. octahedral environment maps). parse_rgbe stores f16 bit
49
- // patterns in a Uint16Array, so the same half-float payload can be classified as either
50
- // Float16 or Uint16 depending on the runtime — both map to the 16-bit float format.
48
+ // Native Float16Array data and legacy Uint16Array-packed half-float samplers
49
+ // both carry binary16 bytes for the GPU.
51
50
  ending = "float";
52
51
  } else {
53
52
  throw new Error(`Unsupported data type '${data_type}'`);
@@ -1 +1 @@
1
- {"version":3,"file":"texture_write_to_gpu.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/texture/texture_write_to_gpu.js"],"names":[],"mappings":"AAyKA;;;;;;;;;;;;GAYG;AACH,2GAFW,MAAM,QAqGhB"}
1
+ {"version":3,"file":"texture_write_to_gpu.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/texture/texture_write_to_gpu.js"],"names":[],"mappings":"AAsKA;;;;;;;;;;;;GAYG;AACH,2GAFW,MAAM,QAwGhB"}
@@ -1,6 +1,4 @@
1
1
  import { assert } from "../../../core/assert.js";
2
- import { half_to_float_uint16 } from "../../../core/binary/half_to_float_uint16.js";
3
- import { to_half_float_uint16 } from "../../../core/binary/to_half_float_uint16.js";
4
2
  import { BinaryDataType } from "../../../core/binary/type/BinaryDataType.js";
5
3
  import { dataTypeByteSize } from "../../../core/binary/type/DataTypeByteSizes.js";
6
4
  import { array_copy } from "../../../core/collection/array/array_copy.js";
@@ -23,9 +21,8 @@ function channel_one_bytes(data_type) {
23
21
  return new Uint8Array([0x7F]);
24
22
  case BinaryDataType.Uint16:
25
23
  case BinaryDataType.Float16:
26
- // Uint16Array-backed images carry raw binary16 by project convention (see
27
- // premultiply_rgba_in_place) — 1.0 is the bit pattern 0x3C00 for both
28
- return new Uint8Array(new Uint16Array([0x3C00]).buffer);
24
+ // Includes legacy samplers that store packed binary16 in Uint16Array.
25
+ return new Uint8Array(new Float16Array([1]).buffer);
29
26
  case BinaryDataType.Int16:
30
27
  return new Uint8Array(new Int16Array([0x7FFF]).buffer);
31
28
  case BinaryDataType.Float32:
@@ -59,13 +56,11 @@ function premultiply_rgba_in_place(data, data_type) {
59
56
  v[i + 2] *= a;
60
57
  }
61
58
  } else if (data_type === BinaryDataType.Float16 || data_type === BinaryDataType.Uint16) {
62
- // Uint16Array-backed images carry raw binary16 bit patterns by project convention
63
- // (parse_rgbe, decode_image_source_hdr — fromSampler2D classifies them as Uint16
64
- // because the bit width is all a typed array exposes). Integer math on the bit
65
- // patterns would destroy the texels; decode/encode through half-float instead.
66
- const v = new Uint16Array(data);
59
+ // Float16Array reads and writes numeric values over the same binary16 bytes,
60
+ // including payloads from legacy Uint16Array-backed half-float samplers.
61
+ const v = new Float16Array(data);
67
62
  for (let i = 0; i < v.length; i += 4) {
68
- const a = half_to_float_uint16(v[i + 3]);
63
+ const a = v[i + 3];
69
64
 
70
65
  if (a === 1) {
71
66
  // overwhelmingly common (HDR sources write alpha = 1): identity, and
@@ -73,9 +68,11 @@ function premultiply_rgba_in_place(data, data_type) {
73
68
  continue;
74
69
  }
75
70
 
76
- v[i] = to_half_float_uint16(half_to_float_uint16(v[i]) * a);
77
- v[i + 1] = to_half_float_uint16(half_to_float_uint16(v[i + 1]) * a);
78
- v[i + 2] = to_half_float_uint16(half_to_float_uint16(v[i + 2]) * a);
71
+ for (let c = 0; c < 3; c++) {
72
+ const value = v[i + c] * a;
73
+ // Retain saturation of finite overflow; preserve NaN and infinities.
74
+ v[i + c] = Number.isFinite(value) ? Math.min(Math.max(value, -65504), 65504) : value;
75
+ }
79
76
  }
80
77
  } else {
81
78
  throw new Error(`Unsupported data type for premultiplication: ${data_type}`);
@@ -244,10 +241,13 @@ export function texture_write_to_gpu(
244
241
  if (source.isSampler2D) {
245
242
 
246
243
  const source_data = source.data;
244
+ const source_buffer = source_data.byteOffset === 0 && source_data.byteLength === source_data.buffer.byteLength
245
+ ? source_data.buffer
246
+ : source_data.buffer.slice(source_data.byteOffset, source_data.byteOffset + source_data.byteLength);
247
247
 
248
248
  texture_write_raw(
249
249
  image,
250
- source_data.buffer,
250
+ source_buffer,
251
251
  queue,
252
252
  texture,
253
253
  premultiplyAlpha,
@@ -279,4 +279,4 @@ export function texture_write_to_gpu(
279
279
  );
280
280
 
281
281
  }
282
- }
282
+ }