@woosh/meep-engine 3.39.0 → 3.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/engine/EngineHarness.d.ts.map +1 -1
  4. package/src/engine/EngineHarness.js +17 -4
  5. package/src/engine/asset/loaders/image/avif/threaded_image_encoder.js +1 -1
  6. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  7. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
  8. package/src/engine/graphics/ecs/water/Water.d.ts +14 -17
  9. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  10. package/src/engine/graphics/ecs/water/Water.js +100 -110
  11. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  12. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +36 -38
  13. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts +6 -0
  14. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts.map +1 -0
  15. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.js +10 -0
  16. package/src/engine/graphics/ecs/water/WaterWaves.d.ts +3 -3
  17. package/src/engine/graphics/ecs/water/WaterWaves.js +46 -46
  18. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -1
  19. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +8 -5
  20. package/src/engine/graphics3/WaterSystem.d.ts +21 -74
  21. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  22. package/src/engine/graphics3/WaterSystem.js +174 -367
  23. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  24. package/src/format/image/avif/api/convert_to_rgba.d.ts +2 -2
  25. package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
  26. package/src/format/image/avif/api/convert_to_rgba.js +10 -9
  27. package/src/format/image/avif/api/decode_avif.d.ts +2 -2
  28. package/src/format/image/avif/api/decode_avif.d.ts.map +1 -1
  29. package/src/format/image/avif/api/decode_avif.js +1 -1
  30. package/src/shade/playground/ssr_reprojection/README.md +111 -103
  31. package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -68
  32. package/src/shade/playground/ssr_reprojection/index.html +80 -79
  33. package/src/shade/playground/ssr_reprojection/main.js +256 -247
  34. package/src/shade/playground/ssr_variance/capture.js +96 -96
  35. package/src/shade/playground/ssr_variance/reference.js +78 -78
  36. package/src/shade/playground/vsm/README.md +96 -0
  37. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts +49 -0
  38. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -0
  39. package/src/shade/playground/vsm/VSMDebugOverlay.js +351 -0
  40. package/src/shade/playground/vsm/clipmap_panel.d.ts +8 -0
  41. package/src/shade/playground/vsm/clipmap_panel.d.ts.map +1 -0
  42. package/src/shade/playground/vsm/clipmap_panel.js +138 -0
  43. package/src/shade/playground/vsm/index.html +170 -0
  44. package/src/shade/playground/vsm/main.d.ts +2 -0
  45. package/src/shade/playground/vsm/main.d.ts.map +1 -0
  46. package/src/shade/playground/vsm/main.js +389 -0
  47. package/src/shade/playground/vsm/scenes.d.ts +52 -0
  48. package/src/shade/playground/vsm/scenes.d.ts.map +1 -0
  49. package/src/shade/playground/vsm/scenes.js +320 -0
  50. package/src/shade/playground/vsm/verify_vsm.d.ts +38 -0
  51. package/src/shade/playground/vsm/verify_vsm.d.ts.map +1 -0
  52. package/src/shade/playground/vsm/verify_vsm.js +305 -0
  53. package/src/shade/playground/water_refraction/README.md +57 -9
  54. package/src/shade/playground/water_refraction/main.js +12 -3
  55. package/src/shade/playground/water_refraction/world.d.ts +1 -0
  56. package/src/shade/playground/water_refraction/world.d.ts.map +1 -1
  57. package/src/shade/playground/water_refraction/world.js +15 -5
  58. package/src/shade/renderer/Renderer.d.ts +19 -0
  59. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  60. package/src/shade/renderer/Renderer.js +72 -1
  61. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +8 -0
  62. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  63. package/src/shade/renderer/animation/GPUAnimationManager.js +18 -0
  64. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +7 -0
  65. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  66. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -0
  67. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -1
  68. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  69. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +10 -1
  70. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.d.ts.map +1 -1
  71. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.js +28 -0
  72. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.d.ts.map +1 -1
  73. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.js +31 -1
  74. package/src/shade/renderer/geometry/MeshletGeometry.d.ts +3 -0
  75. package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
  76. package/src/shade/renderer/geometry/MeshletGeometry.js +1 -0
  77. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  78. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +62 -4
  79. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  80. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.js +2 -2
  81. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts +2 -2
  82. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts.map +1 -1
  83. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js +6 -14
  84. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts.map +1 -1
  85. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js +5 -1
  86. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  87. package/src/shade/renderer/medium/ParticipatingMedium.d.ts +3 -0
  88. package/src/shade/renderer/medium/ParticipatingMedium.d.ts.map +1 -1
  89. package/src/shade/renderer/medium/ParticipatingMedium.js +7 -0
  90. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.d.ts.map +1 -1
  91. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js +5 -35
  92. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  93. package/src/shade/renderer/postprocess/ssr/SSR.d.ts +12 -4
  94. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  95. package/src/shade/renderer/postprocess/ssr/SSR.js +36 -8
  96. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts +3 -0
  97. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts.map +1 -0
  98. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js +2 -0
  99. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts +8 -0
  100. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts.map +1 -0
  101. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js +40 -0
  102. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  103. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +150 -137
  104. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts +3 -0
  105. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts.map +1 -0
  106. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js +44 -0
  107. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts +5 -0
  108. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts.map +1 -0
  109. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js +35 -0
  110. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts +26 -0
  111. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts.map +1 -0
  112. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js +42 -0
  113. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +1 -0
  114. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
  115. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +113 -105
  116. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +2 -0
  117. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  118. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +177 -167
  119. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.d.ts.map +1 -1
  120. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js +10 -0
  121. package/src/shade/renderer/rasterize/RasterizationJob.d.ts +1 -2
  122. package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
  123. package/src/shade/renderer/rasterize/RasterizationJob.js +1 -2
  124. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +5 -6
  125. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  126. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +5 -6
  127. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +2 -2
  128. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  129. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +1 -1
  130. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
  131. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +11 -0
  132. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.d.ts.map +1 -1
  133. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.js +4 -5
  134. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.d.ts.map +1 -1
  135. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.js +1 -5
  136. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts +30 -0
  137. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts.map +1 -0
  138. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.js +54 -0
  139. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  140. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +3 -2
  141. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts +19 -0
  142. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts.map +1 -0
  143. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js +27 -0
  144. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +1 -0
  145. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  146. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -0
  147. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +54 -0
  148. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  149. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +502 -10
  150. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +3 -2
  151. package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
  152. package/src/shade/renderer/shadow/map/Shadowmap.js +3 -2
  153. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts +8 -0
  154. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map +1 -1
  155. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js +34 -3
  156. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +3 -2
  157. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
  158. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +17 -2
  159. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
  160. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +137 -133
  161. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts +15 -0
  162. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map +1 -0
  163. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js +14 -0
  164. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts +16 -0
  165. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts.map +1 -0
  166. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js +15 -0
  167. package/src/shade/renderer/shadow/vsm/PLAN.md +440 -0
  168. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +43 -0
  169. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +42 -0
  170. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +1 -0
  171. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +153 -0
  172. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +327 -0
  173. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -0
  174. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +1408 -0
  175. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts +14 -0
  176. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts.map +1 -0
  177. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.js +13 -0
  178. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts +63 -0
  179. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts.map +1 -0
  180. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.js +70 -0
  181. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts +11 -0
  182. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts.map +1 -0
  183. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.js +10 -0
  184. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +54 -0
  185. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +1 -0
  186. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +75 -0
  187. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts +23 -0
  188. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts.map +1 -0
  189. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.js +85 -0
  190. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts +16 -0
  191. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts.map +1 -0
  192. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.js +29 -0
  193. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +136 -25
  194. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
  195. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +282 -116
  196. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +39 -0
  197. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -0
  198. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +289 -0
  199. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts +18 -0
  200. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts.map +1 -0
  201. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.js +65 -0
  202. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts +17 -0
  203. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts.map +1 -0
  204. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.js +75 -0
  205. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +14 -0
  206. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +1 -0
  207. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +45 -0
  208. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts +17 -0
  209. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts.map +1 -0
  210. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.js +100 -0
  211. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts +15 -0
  212. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts.map +1 -0
  213. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.js +47 -0
  214. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts +26 -0
  215. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts.map +1 -0
  216. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.js +156 -0
  217. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts +13 -0
  218. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts.map +1 -0
  219. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.js +65 -0
  220. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +30 -0
  221. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +1 -0
  222. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +184 -0
  223. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +23 -0
  224. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +1 -0
  225. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +109 -0
  226. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts +56 -0
  227. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts.map +1 -0
  228. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +211 -0
  229. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts +1 -1
  230. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts.map +1 -1
  231. package/src/shade/renderer/texture/format/decode_typed_gpu_data.js +3 -13
  232. package/src/shade/renderer/texture/format/infer_format_from_parameters.d.ts.map +1 -1
  233. package/src/shade/renderer/texture/format/infer_format_from_parameters.js +2 -3
  234. package/src/shade/renderer/texture/texture_write_to_gpu.d.ts.map +1 -1
  235. package/src/shade/renderer/texture/texture_write_to_gpu.js +16 -16
  236. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts +4 -90
  237. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts.map +1 -1
  238. package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +6 -210
  239. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts +119 -0
  240. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts.map +1 -0
  241. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.js +245 -0
  242. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts +1 -1
  243. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts.map +1 -1
  244. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +3 -19
  245. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts +13 -0
  246. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts.map +1 -0
  247. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js +34 -0
  248. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +7 -2
  249. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  250. package/src/shade/renderer/water/GPUWaterRenderer.js +49 -49
  251. package/src/shade/renderer/water/chunk_water_transport.js +3 -3
  252. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +11 -25
  253. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  254. package/src/shade/renderer/water/medium/GPUWaterBodies.js +64 -116
  255. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts +1 -20
  256. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts.map +1 -1
  257. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.js +10 -42
  258. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts +3 -0
  259. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts.map +1 -0
  260. package/src/shade/renderer/water/medium/chunk_water_bodies.js +3 -0
  261. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +1 -5
  262. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +1 -1
  263. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +32 -30
  264. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +4 -0
  265. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -0
  266. package/src/shade/renderer/water/medium/shader_water_meshlets.js +69 -0
  267. package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts.map +1 -1
  268. package/src/shade/renderer/water/optics/chunk_water_inscatter.js +124 -123
  269. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  270. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +75 -74
  271. package/src/shade/renderer/water/shader_water.d.ts +1 -1
  272. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  273. package/src/shade/renderer/water/shader_water.js +490 -406
  274. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +12 -85
  275. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +1 -1
  276. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +128 -408
  277. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +6 -0
  278. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -0
  279. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +23 -0
  280. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +9 -0
  281. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +1 -0
  282. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +144 -0
  283. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +3 -5
  284. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +1 -1
  285. package/src/shade/renderer/water/surface/chunk_water_wave.js +40 -48
  286. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +14 -0
  287. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -0
  288. package/src/shade/renderer/water/surface/graph_water_tessellation.js +34 -0
  289. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +4 -0
  290. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +1 -0
  291. package/src/shade/renderer/water/surface/shader_water_tiles.js +123 -0
  292. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +6 -0
  293. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +1 -0
  294. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +85 -0
  295. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +6 -0
  296. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +1 -0
  297. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +83 -0
  298. package/src/shade/renderer/water/water_height_texture_from_sampler.d.ts.map +1 -1
  299. package/src/shade/renderer/water/water_height_texture_from_sampler.js +4 -3
  300. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts +0 -2
  301. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts.map +0 -1
  302. package/src/engine/graphics/ecs/water/WATER_SIZE.js +0 -1
  303. package/src/shade/renderer/light/GPUViewLightContext.d.ts +0 -22
  304. package/src/shade/renderer/light/GPUViewLightContext.d.ts.map +0 -1
  305. package/src/shade/renderer/light/GPUViewLightContext.js +0 -62
  306. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts +0 -14
  307. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts.map +0 -1
  308. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.js +0 -20
  309. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts +0 -27
  310. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +0 -1
  311. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +0 -147
  312. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts +0 -7
  313. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts.map +0 -1
  314. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.js +0 -10
  315. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts +0 -2
  316. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts.map +0 -1
  317. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.js +0 -1
  318. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts +0 -3
  319. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts.map +0 -1
  320. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.js +0 -8
  321. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts +0 -27
  322. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts.map +0 -1
  323. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.js +0 -102
  324. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts +0 -8
  325. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts.map +0 -1
  326. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.js +0 -34
  327. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts +0 -10
  328. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts.map +0 -1
  329. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.js +0 -64
  330. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts +0 -11
  331. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts.map +0 -1
  332. package/src/shade/renderer/shadow/vsm/decode_tile_address.js +0 -26
  333. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts +0 -2
  334. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts.map +0 -1
  335. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.js +0 -11
  336. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts +0 -20
  337. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts.map +0 -1
  338. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.js +0 -184
  339. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts +0 -25
  340. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts.map +0 -1
  341. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.js +0 -230
  342. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts +0 -19
  343. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts.map +0 -1
  344. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.js +0 -127
  345. package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +0 -462
  346. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts +0 -23
  347. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts.map +0 -1
  348. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts +0 -18
  349. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts.map +0 -1
  350. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts +0 -12
  351. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts.map +0 -1
  352. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.js +0 -27
  353. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts +0 -14
  354. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts.map +0 -1
  355. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.js +0 -49
  356. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts +0 -9
  357. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts.map +0 -1
  358. package/src/shade/renderer/water/surface/chunk_water_wave_grid.js +0 -47
  359. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts +0 -10
  360. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts.map +0 -1
  361. package/src/shade/renderer/water/surface/shader_water_surface_write.js +0 -51
  362. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts +0 -12
  363. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts.map +0 -1
  364. package/src/shade/renderer/water/surface/shader_water_wave_step.js +0 -54
  365. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts +0 -13
  366. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts.map +0 -1
  367. package/src/shade/renderer/water/surface/water_surface_grid_indices.js +0 -39
@@ -1,123 +1,124 @@
1
- import { PI_DECLARATION } from "../../shader/chunk/math/PI_DECLARATION.js";
2
- import {
3
- chunk_directional_lights_iteration_mask
4
- } from "../../shader/chunk/light/io/chunk_directional_lights_iteration_mask.js";
5
- import {
6
- chunk_get_directional_light_info_by_index
7
- } from "../../shader/chunk/light/io/chunk_get_directional_light_info_by_index.js";
8
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
- import { chunk_shadowmap_get_light_visibility } from "../../shadow/map/shader/chunk_shadowmap_get_light_visibility.js";
10
- import { WATER_BODY_STRUCT } from "../medium/WATER_BODIES_STRUCT.js";
11
- import { chunk_water_optics } from "./chunk_water_optics.js";
12
-
13
- /**
14
- * Light the water body sends back towards a viewer above it (WATER_OPTICS_PLAN_2026_10_02.md §4.4):
15
- * the column term of Lee et al.'s shallow-water model (1998), with the deep-water reflectance from
16
- * QAA (Lee et al. 2002, v6), integrated along the refracted view ray.
17
- *
18
- * Per channel, with κ = a + b_b and u = b_b / κ:
19
- *
20
- * - deep-water subsurface remote-sensing reflectance r_rs∞ = (0.089 + 0.1245 u) u, a fit to full
21
- * radiative transfer, so it carries every order of scattering, not one;
22
- * - the upwelling light attenuates along the view ray at κ_u = 1.03 √(1 + 2.4 u) κ, Lee's D_u^C κ:
23
- * light scattered forward stays in the upwelling stream, which beam attenuation would throw away;
24
- * - each source j — the refracted sun, shadowed by the cascaded shadow map per segment, and the sky the
25
- * active GI mode reports at the surface — feeds the ray r_rs∞ (K_j + κ_u) E_d,j(z) per metre, where
26
- * E_d,j(z) is its plane irradiance at depth decaying at Gordon's K_j. Deep water seen from straight
27
- * above then returns exactly r_rs∞ E_d(0−), and a column of depth H the factor 1 − e^−(K + κ_u) H;
28
- * - the upwelling light the surface reflects back down returns again: 1 / (1 − 1.7 r_rs∞).
29
- *
30
- * The medium's phase functions enter through b_b, which the bodies table integrates from them on the
31
- * GPU. The model is gated against the Monte Carlo slab oracle (`water_inscatter_oracle.spec.js`).
32
- *
33
- * Expects `light_data` and the shadow atlas bindings, and a `water_gi_irradiance` from one of the GI
34
- * modules. Returns radiance arriving at the surface from below; the caller takes it out of the water.
35
- *
36
- * @type {CodeChunk}
37
- */
38
- export const chunk_water_inscatter = CodeChunk.from(/* language=WGSL */ `
39
- // QAA's deep-water subsurface remote-sensing reflectance, per channel, sr^-1.
40
- fn water_deep_reflectance(absorption: vec3<f32>, backscattering: vec3<f32>) -> vec3<f32> {
41
- let u = backscattering / max(absorption + backscattering, vec3<f32>(1e-20));
42
- return (0.089 + 0.1245 * u) * u;
43
- }
44
-
45
- // Lee's attenuation of the upwelling light along a view ray, per metre of ray, RGB 1/m.
46
- fn water_upwelling_attenuation(absorption: vec3<f32>, backscattering: vec3<f32>) -> vec3<f32> {
47
- let kappa = absorption + backscattering;
48
- let u = backscattering / max(kappa, vec3<f32>(1e-20));
49
- return 1.03 * sqrt(1.0 + 2.4 * u) * kappa;
50
- }
51
-
52
- // Radiance the water column sends back up the refracted view ray, arriving at the surface from
53
- // below, for a ray leaving the surface point origin in direction (both world space, direction
54
- // pointing down into the water) over path metres, in segments steps.
55
- //
56
- // Segment boundaries are spaced evenly in the mean upwelling transmittance, so the near-surface water
57
- // that carries most of the light gets most of the steps; within a segment each source's decay with
58
- // depth is integrated in closed form and the sun's shadow taken at its middle.
59
- fn water_inscatter(body: WaterBody, origin: vec3<f32>, direction: vec3<f32>, path: f32, segments: u32) -> vec3<f32> {
60
- let absorption = body.medium.absorption;
61
- let backscattering = body.backscattering.xyz;
62
- let reflectance = water_deep_reflectance(absorption, backscattering);
63
- let upwelling = water_upwelling_attenuation(absorption, backscattering);
64
- let up = vec3<f32>(0.0, 1.0, 0.0);
65
- let toward_camera = -direction;
66
- // depth grows by mu metres per metre of ray
67
- let mu = max(-direction.y, 0.0);
68
-
69
- let sky = water_gi_irradiance(origin, up);
70
- let sky_decay = water_diffuse_attenuation(absorption, backscattering, WATER_SKY_DISTRIBUTION);
71
- let sky_source = reflectance * (sky_decay + upwelling) * sky;
72
-
73
- let mean_upwelling = (upwelling.x + upwelling.y + upwelling.z) / 3.0;
74
- let thin = mean_upwelling * path < 1e-4;
75
- let span = 1.0 - exp(-mean_upwelling * path);
76
-
77
- var result = vec3<f32>(0.0);
78
- var start = 0.0;
79
-
80
- for (var i = 0u; i < segments; i++) {
81
- let u = f32(i + 1u) / f32(segments);
82
- let end = select(-log(1.0 - u * span) / max(mean_upwelling, 1e-20), u * path, thin);
83
- let length = max(end - start, 0.0);
84
- let depth = mu * start;
85
- let transmittance = exp(-upwelling * start);
86
-
87
- result += transmittance * water_inscatter_segment(
88
- sky_source * water_sky_transmittance(depth, body.diffuse_transmittance, absorption, backscattering),
89
- upwelling, sky_decay, mu, length);
90
-
91
- let middle = origin + direction * (start + 0.5 * length);
92
-
93
- var directional_bits = directional_lights_iteration_mask(&light_data);
94
- while (directional_bits != 0u) {
95
- let index = countTrailingZeros(directional_bits);
96
- directional_bits &= ~(1u << index);
97
-
98
- let sun = get_directional_light_info_by_index(&light_data, index);
99
-
100
- // sun.direction points towards the light; below the horizon it does not reach the water
101
- if (sun.direction.y <= 0.0) { continue; }
102
-
103
- let cos_water = water_refracted_cosine(sun.direction.y, body.ior);
104
- let visibility = shadowmap_get_directional_light_visibility(&light_data, index, middle,
105
- toward_camera, sun.direction);
106
- let decay = water_diffuse_attenuation(absorption, backscattering, 1.0 / max(cos_water, 1e-4));
107
- // plane irradiance under the surface: the normal irradiance of the refracted beam times cos θ_w
108
- let irradiance = sun.color * water_sun_transmittance(depth, sun.direction.y, body.ior,
109
- absorption, backscattering) * cos_water;
110
-
111
- result += transmittance * water_inscatter_segment(
112
- reflectance * (decay + upwelling) * irradiance * visibility,
113
- upwelling, decay, mu, length);
114
- }
115
-
116
- start = end;
117
- }
118
-
119
- // what the surface reflects back down returns again
120
- return result / (1.0 - 1.7 * reflectance);
121
- }
122
- `, [WATER_BODY_STRUCT.declaration_chunk, chunk_water_optics, chunk_directional_lights_iteration_mask,
123
- chunk_get_directional_light_info_by_index, chunk_shadowmap_get_light_visibility, PI_DECLARATION]);
1
+ import { PI_DECLARATION } from "../../shader/chunk/math/PI_DECLARATION.js";
2
+ import {
3
+ chunk_directional_lights_iteration_mask
4
+ } from "../../shader/chunk/light/io/chunk_directional_lights_iteration_mask.js";
5
+ import {
6
+ chunk_get_directional_light_info_by_index
7
+ } from "../../shader/chunk/light/io/chunk_get_directional_light_info_by_index.js";
8
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
+ import { chunk_shadowmap_get_light_visibility } from "../../shadow/map/shader/chunk_shadowmap_get_light_visibility.js";
10
+ import { WATER_BODY_STRUCT } from "../medium/WATER_BODIES_STRUCT.js";
11
+ import { chunk_water_optics } from "./chunk_water_optics.js";
12
+
13
+ /**
14
+ * Light the water body sends back towards a viewer above it (WATER_OPTICS_PLAN_2026_10_02.md §4.4):
15
+ * the column term of Lee et al.'s shallow-water model (1998), with the deep-water reflectance from
16
+ * QAA (Lee et al. 2002, v6), integrated along the refracted view ray.
17
+ *
18
+ * Per channel, with κ = a + b_b and u = b_b / κ:
19
+ *
20
+ * - deep-water subsurface remote-sensing reflectance r_rs∞ = (0.089 + 0.1245 u) u, a fit to full
21
+ * radiative transfer, so it carries every order of scattering, not one;
22
+ * - the upwelling light attenuates along the view ray at κ_u = 1.03 √(1 + 2.4 u) κ, Lee's D_u^C κ:
23
+ * light scattered forward stays in the upwelling stream, which beam attenuation would throw away;
24
+ * - each source j — the refracted sun, shadowed by the cascaded shadow map per segment, and the sky the
25
+ * active GI mode reports at the surface — feeds the ray r_rs∞ (K_j + κ_u) E_d,j(z) per metre, where
26
+ * E_d,j(z) is its plane irradiance at depth decaying at Gordon's K_j. Deep water seen from straight
27
+ * above then returns exactly r_rs∞ E_d(0−), and a column of depth H the factor 1 − e^−(K + κ_u) H;
28
+ * - the upwelling light the surface reflects back down returns again: 1 / (1 − 1.7 r_rs∞).
29
+ *
30
+ * The medium's phase functions enter through b_b, which the bodies table integrates from them on the
31
+ * GPU. The model is gated against the Monte Carlo slab oracle (`water_inscatter_oracle.spec.js`).
32
+ *
33
+ * Expects `light_data` and the shadow atlas bindings, and a `water_gi_irradiance` from one of the GI
34
+ * modules. Returns radiance arriving at the surface from below; the caller takes it out of the water.
35
+ *
36
+ * @type {CodeChunk}
37
+ */
38
+ export const chunk_water_inscatter = CodeChunk.from(/* language=WGSL */ `
39
+ // QAA's deep-water subsurface remote-sensing reflectance, per channel, sr^-1.
40
+ fn water_deep_reflectance(absorption: vec3<f32>, backscattering: vec3<f32>) -> vec3<f32> {
41
+ let u = backscattering / max(absorption + backscattering, vec3<f32>(1e-20));
42
+ return (0.089 + 0.1245 * u) * u;
43
+ }
44
+
45
+ // Lee's attenuation of the upwelling light along a view ray, per metre of ray, RGB 1/m.
46
+ fn water_upwelling_attenuation(absorption: vec3<f32>, backscattering: vec3<f32>) -> vec3<f32> {
47
+ let kappa = absorption + backscattering;
48
+ let u = backscattering / max(kappa, vec3<f32>(1e-20));
49
+ return 1.03 * sqrt(1.0 + 2.4 * u) * kappa;
50
+ }
51
+
52
+ // Radiance the water column sends back up the refracted view ray, arriving at the surface from
53
+ // below, for a ray leaving the surface point origin in direction (both world space, direction
54
+ // pointing into the water) over path metres, in segments steps. up is the authored/displaced
55
+ // interface normal; the column model uses its local tangent plane along this ray.
56
+ //
57
+ // Segment boundaries are spaced evenly in the mean upwelling transmittance, so the near-surface water
58
+ // that carries most of the light gets most of the steps; within a segment each source's decay with
59
+ // depth is integrated in closed form and the sun's shadow taken at its middle.
60
+ fn water_inscatter(body: WaterBody, origin: vec3<f32>, direction: vec3<f32>, up: vec3<f32>, path: f32, segments: u32) -> vec3<f32> {
61
+ let absorption = body.medium.absorption;
62
+ let backscattering = body.backscattering.xyz;
63
+ let reflectance = water_deep_reflectance(absorption, backscattering);
64
+ let upwelling = water_upwelling_attenuation(absorption, backscattering);
65
+ let toward_camera = -direction;
66
+ // depth grows by mu metres per metre of ray
67
+ let mu = max(-dot(direction, up), 0.0);
68
+
69
+ let sky = water_gi_irradiance(origin, up);
70
+ let sky_decay = water_diffuse_attenuation(absorption, backscattering, WATER_SKY_DISTRIBUTION);
71
+ let sky_source = reflectance * (sky_decay + upwelling) * sky;
72
+
73
+ let mean_upwelling = (upwelling.x + upwelling.y + upwelling.z) / 3.0;
74
+ let thin = mean_upwelling * path < 1e-4;
75
+ let span = 1.0 - exp(-mean_upwelling * path);
76
+
77
+ var result = vec3<f32>(0.0);
78
+ var start = 0.0;
79
+
80
+ for (var i = 0u; i < segments; i++) {
81
+ let u = f32(i + 1u) / f32(segments);
82
+ let end = select(-log(1.0 - u * span) / max(mean_upwelling, 1e-20), u * path, thin);
83
+ let length = max(end - start, 0.0);
84
+ let depth = mu * start;
85
+ let transmittance = exp(-upwelling * start);
86
+
87
+ result += transmittance * water_inscatter_segment(
88
+ sky_source * water_sky_transmittance(depth, body.diffuse_transmittance, absorption, backscattering),
89
+ upwelling, sky_decay, mu, length);
90
+
91
+ let middle = origin + direction * (start + 0.5 * length);
92
+
93
+ var directional_bits = directional_lights_iteration_mask(&light_data);
94
+ while (directional_bits != 0u) {
95
+ let index = countTrailingZeros(directional_bits);
96
+ directional_bits &= ~(1u << index);
97
+
98
+ let sun = get_directional_light_info_by_index(&light_data, index);
99
+
100
+ // sun.direction points towards the light; below the horizon it does not reach the water
101
+ let cosine = dot(sun.direction, up);
102
+ if (cosine <= 0.0) { continue; }
103
+
104
+ let cos_water = water_refracted_cosine(cosine, body.ior);
105
+ let visibility = shadowmap_get_directional_light_visibility(&light_data, index, middle,
106
+ toward_camera, sun.direction);
107
+ let decay = water_diffuse_attenuation(absorption, backscattering, 1.0 / max(cos_water, 1e-4));
108
+ // plane irradiance under the surface: the normal irradiance of the refracted beam times cos θ_w
109
+ let irradiance = sun.color * water_sun_transmittance(depth, cosine, body.ior,
110
+ absorption, backscattering) * cos_water;
111
+
112
+ result += transmittance * water_inscatter_segment(
113
+ reflectance * (decay + upwelling) * irradiance * visibility,
114
+ upwelling, decay, mu, length);
115
+ }
116
+
117
+ start = end;
118
+ }
119
+
120
+ // what the surface reflects back down returns again
121
+ return result / (1.0 - 1.7 * reflectance);
122
+ }
123
+ `, [WATER_BODY_STRUCT.declaration_chunk, chunk_water_optics, chunk_directional_lights_iteration_mask,
124
+ chunk_get_directional_light_info_by_index, chunk_shadowmap_get_light_visibility, PI_DECLARATION]);
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_water_receiver_downwelling.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,+CAFU,SAAS,CAwCmE;0BAnE5D,oCAAoC"}
1
+ {"version":3,"file":"chunk_water_receiver_downwelling.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,+CAFU,SAAS,CAyCmE;0BApE5D,oCAAoC"}
@@ -1,74 +1,75 @@
1
- import {
2
- chunk_directional_lights_iteration_mask
3
- } from "../../shader/chunk/light/io/chunk_directional_lights_iteration_mask.js";
4
- import {
5
- chunk_get_directional_light_info_by_index
6
- } from "../../shader/chunk/light/io/chunk_get_directional_light_info_by_index.js";
7
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
8
- import { chunk_shadowmap_get_light_visibility } from "../../shadow/map/shader/chunk_shadowmap_get_light_visibility.js";
9
- import { WATER_BODY_STRUCT } from "../medium/WATER_BODIES_STRUCT.js";
10
- import { chunk_water_optics } from "./chunk_water_optics.js";
11
-
12
- /**
13
- * Light reaching a submerged receiver (WATER_OPTICS_PLAN_2026_10_02.md §4.3), applied by the water
14
- * optics pass to the receiver it sees through the surface. Surface shading stays unaware of water:
15
- * the opaque scene is shaded dry, and the water scales what it sees of a receiver by how much of the
16
- * light that receiver was shaded with survives the water above it.
17
- *
18
- * The ratio is of the receiver's irradiance under the water to its irradiance dry, from what the
19
- * water pass can rebuild at the receiver — its position, G-buffer normal and depth below the
20
- * surface, the shadow map and the GI mode:
21
- *
22
- * - dry: each directional light × its shadow × n·l, plus the GI mode's irradiance on n;
23
- * - wet: each light refracted at the surface, so steeper, with the Fresnel transmittance, the beam's
24
- * compression and Gordon's attenuation along its refracted path (water_sun_transmittance) × its
25
- * shadow × n·l_refracted, plus the GI irradiance through the diffuse transmittance and the overcast
26
- * attenuation (water_sky_transmittance).
27
- *
28
- * Stated limits: light the receiver had from lamps and its own emission is scaled by the same ratio,
29
- * and a highlight keeps its dry direction, scaled.
30
- *
31
- * Expects `light_data` and the shadow atlas bindings, and a `water_gi_irradiance` from one of the GI
32
- * modules.
33
- *
34
- * @type {CodeChunk}
35
- */
36
- export const chunk_water_receiver_downwelling = CodeChunk.from(/* language=WGSL */ `
37
- // What survives of a submerged receiver's light, per channel, in [0, 1]. receiver and normal are world
38
- // space, depth the metres of water above the receiver, toward_camera a unit vector from the receiver
39
- // towards the camera (the shadow lookup's cascade blend).
40
- fn water_receiver_downwelling(body: WaterBody, receiver: vec3<f32>, normal: vec3<f32>, depth: f32,
41
- toward_camera: vec3<f32>) -> vec3<f32> {
42
- let absorption = body.medium.absorption;
43
- let backscattering = body.backscattering.xyz;
44
- let up = vec3<f32>(0.0, 1.0, 0.0);
45
-
46
- let sky = water_gi_irradiance(receiver, normal);
47
- var dry = sky;
48
- var wet = sky * water_sky_transmittance(depth, body.diffuse_transmittance, absorption, backscattering);
49
-
50
- var directional_bits = directional_lights_iteration_mask(&light_data);
51
- while (directional_bits != 0u) {
52
- let index = countTrailingZeros(directional_bits);
53
- directional_bits &= ~(1u << index);
54
-
55
- let sun = get_directional_light_info_by_index(&light_data, index);
56
-
57
- // sun.direction points towards the light; below the horizon it lights neither
58
- if (sun.direction.y <= 0.0) { continue; }
59
-
60
- let visibility = shadowmap_get_directional_light_visibility(&light_data, index, receiver,
61
- toward_camera, normal);
62
- let refracted = -refract(-sun.direction, up, 1.0 / body.ior);
63
-
64
- dry += sun.color * visibility * max(dot(normal, sun.direction), 0.0);
65
- wet += sun.color * visibility * max(dot(normal, refracted), 0.0)
66
- * water_sun_transmittance(depth, sun.direction.y, body.ior, absorption, backscattering);
67
- }
68
-
69
- // a channel nothing lit dry has nothing for the water to take
70
- return select(clamp(wet / max(dry, vec3<f32>(1e-30)), vec3<f32>(0.0), vec3<f32>(1.0)), vec3<f32>(1.0),
71
- dry <= vec3<f32>(0.0));
72
- }
73
- `, [WATER_BODY_STRUCT.declaration_chunk, chunk_water_optics, chunk_directional_lights_iteration_mask,
74
- chunk_get_directional_light_info_by_index, chunk_shadowmap_get_light_visibility]);
1
+ import {
2
+ chunk_directional_lights_iteration_mask
3
+ } from "../../shader/chunk/light/io/chunk_directional_lights_iteration_mask.js";
4
+ import {
5
+ chunk_get_directional_light_info_by_index
6
+ } from "../../shader/chunk/light/io/chunk_get_directional_light_info_by_index.js";
7
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
8
+ import { chunk_shadowmap_get_light_visibility } from "../../shadow/map/shader/chunk_shadowmap_get_light_visibility.js";
9
+ import { WATER_BODY_STRUCT } from "../medium/WATER_BODIES_STRUCT.js";
10
+ import { chunk_water_optics } from "./chunk_water_optics.js";
11
+
12
+ /**
13
+ * Light reaching a submerged receiver (WATER_OPTICS_PLAN_2026_10_02.md §4.3), applied by the water
14
+ * optics pass to the receiver it sees through the surface. Surface shading stays unaware of water:
15
+ * the opaque scene is shaded dry, and the water scales what it sees of a receiver by how much of the
16
+ * light that receiver was shaded with survives the water above it.
17
+ *
18
+ * The ratio is of the receiver's irradiance under the water to its irradiance dry, from what the
19
+ * water pass can rebuild at the receiver — its position, G-buffer normal and depth below the
20
+ * surface, the shadow map and the GI mode:
21
+ *
22
+ * - dry: each directional light × its shadow × n·l, plus the GI mode's irradiance on n;
23
+ * - wet: each light refracted at the surface, so steeper, with the Fresnel transmittance, the beam's
24
+ * compression and Gordon's attenuation along its refracted path (water_sun_transmittance) × its
25
+ * shadow × n·l_refracted, plus the GI irradiance through the diffuse transmittance and the overcast
26
+ * attenuation (water_sky_transmittance).
27
+ *
28
+ * Stated limits: light the receiver had from lamps and its own emission is scaled by the same ratio,
29
+ * and a highlight keeps its dry direction, scaled.
30
+ *
31
+ * Expects `light_data` and the shadow atlas bindings, and a `water_gi_irradiance` from one of the GI
32
+ * modules.
33
+ *
34
+ * @type {CodeChunk}
35
+ */
36
+ export const chunk_water_receiver_downwelling = CodeChunk.from(/* language=WGSL */ `
37
+ // What survives of a submerged receiver's light, per channel, in [0, 1]. receiver and normal are world
38
+ // space, up the surface's outward normal, depth the normal distance below its tangent plane,
39
+ // toward_camera a unit vector from the receiver
40
+ // towards the camera (the shadow lookup's cascade blend).
41
+ fn water_receiver_downwelling(body: WaterBody, receiver: vec3<f32>, normal: vec3<f32>, up: vec3<f32>, depth: f32,
42
+ toward_camera: vec3<f32>) -> vec3<f32> {
43
+ let absorption = body.medium.absorption;
44
+ let backscattering = body.backscattering.xyz;
45
+
46
+ let sky = water_gi_irradiance(receiver, normal);
47
+ var dry = sky;
48
+ var wet = sky * water_sky_transmittance(depth, body.diffuse_transmittance, absorption, backscattering);
49
+
50
+ var directional_bits = directional_lights_iteration_mask(&light_data);
51
+ while (directional_bits != 0u) {
52
+ let index = countTrailingZeros(directional_bits);
53
+ directional_bits &= ~(1u << index);
54
+
55
+ let sun = get_directional_light_info_by_index(&light_data, index);
56
+
57
+ // sun.direction points towards the light; below the horizon it lights neither
58
+ let cosine = dot(sun.direction, up);
59
+ if (cosine <= 0.0) { continue; }
60
+
61
+ let visibility = shadowmap_get_directional_light_visibility(&light_data, index, receiver,
62
+ toward_camera, normal);
63
+ let refracted = -refract(-sun.direction, up, 1.0 / body.ior);
64
+
65
+ dry += sun.color * visibility * max(dot(normal, sun.direction), 0.0);
66
+ wet += sun.color * visibility * max(dot(normal, refracted), 0.0)
67
+ * water_sun_transmittance(depth, cosine, body.ior, absorption, backscattering);
68
+ }
69
+
70
+ // a channel nothing lit dry has nothing for the water to take
71
+ return select(clamp(wet / max(dry, vec3<f32>(1e-30)), vec3<f32>(0.0), vec3<f32>(1.0)), vec3<f32>(1.0),
72
+ dry <= vec3<f32>(0.0));
73
+ }
74
+ `, [WATER_BODY_STRUCT.declaration_chunk, chunk_water_optics, chunk_directional_lights_iteration_mask,
75
+ chunk_get_directional_light_info_by_index, chunk_shadowmap_get_light_visibility]);
@@ -1,7 +1,7 @@
1
1
  export function create_water_pipeline(): RenderPipelineDescriptor;
2
2
  export function create_water_finalize_pipeline_ibl(): RenderPipelineDescriptor;
3
3
  export function create_water_finalize_pipeline_brick4(): RenderPipelineDescriptor;
4
- export const WATER_DRAW_STRUCT: WebGPUStruct;
4
+ export const WATER_GRID_STRUCT: WebGPUStruct;
5
5
  export const WATER_TRACE_STRUCT: WebGPUStruct;
6
6
  /** Optics under IBL (and LPV, which has no transparent variant): the lights and the environment. */
7
7
  export const WATER_FINALIZE_RESOURCES_IBL: ShaderResourceSetDescriptor;
@@ -1 +1 @@
1
- {"version":3,"file":"shader_water.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/shader_water.js"],"names":[],"mappings":"AAmZA,kEAAuH;AACvH,+EAA+J;AAC/J,kFAAqK;AArXrK,6CAOuB;AAEvB,8CAKwB;AAsBxB,oGAAoG;AACpG,uEAAkE;AAGlE,gGAAgG;AAChG,0EAAqE;AAkDrE,+CA+EmB;AAoLnB,4CAAmG;AACnG,kFAAkF;AAClF,yDAC8G;AAC9G,oCAAoC;AACpC,4DACoH;AACpH,0DAAyC;yCAnYA,8DAA8D;6BAmB1E,gCAAgC;4CAJjB,mDAAmD;0BADrE,iCAAiC;iCAE1B,+BAA+B"}
1
+ {"version":3,"file":"shader_water.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/shader_water.js"],"names":[],"mappings":"AAueA,kEAAuH;AACvH,+EAA+J;AAC/J,kFAAqK;AAlcrK,6CAAqF;AAErF,8CAKwB;AA0BxB,oGAAoG;AACpG,uEAAkE;AAGlE,gGAAgG;AAChG,0EAAqE;AAkHrE,+CA+EmB;AA2LnB,4CAAmG;AACnG,kFAAkF;AAClF,yDAC8G;AAC9G,oCAAoC;AACpC,4DACoH;AACpH,0DAAyC;yCA9cA,8DAA8D;6BAmB1E,gCAAgC;4CAJjB,mDAAmD;0BADrE,iCAAiC;iCAE1B,+BAA+B"}