@woosh/meep-engine 3.47.0 → 3.49.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 (619) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/editor/particles/effect/ParticleReferenceSimulation.d.ts +1 -2
  3. package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
  4. package/editor/particles/effect/ParticleReferenceSimulation.js +2 -4
  5. package/editor/view/particles/effect/ParticleGraphEditorView.js +1 -1
  6. package/package.json +1 -1
  7. package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +27 -11
  8. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  9. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +11 -0
  10. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +2 -2
  11. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -1
  12. package/src/engine/graphics/ecs/particles/ParticleEffect.js +7 -7
  13. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +8 -0
  14. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -1
  15. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +11 -3
  16. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts +26 -0
  17. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts.map +1 -0
  18. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.js +91 -0
  19. package/src/engine/graphics3/GPUParticleEmitterSystem.js +2 -2
  20. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  21. package/src/engine/graphics3/GraphicsEngine.js +8 -1
  22. package/src/engine/graphics3/ParticipatingMedia.d.ts +84 -1
  23. package/src/engine/graphics3/ParticipatingMedia.d.ts.map +1 -1
  24. package/src/engine/graphics3/ParticipatingMedia.js +139 -5
  25. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts +6 -2
  26. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts.map +1 -1
  27. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.js +29 -4
  28. package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.d.ts +10 -0
  29. package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.d.ts.map +1 -0
  30. package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.js +38 -0
  31. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -1
  32. package/src/engine/graphics3/ParticipatingMediaSystem.js +46 -3
  33. package/src/engine/network/NetworkSession.d.ts +16 -5
  34. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  35. package/src/engine/network/NetworkSession.js +104 -7
  36. package/src/engine/network/README.md +27 -1
  37. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +40 -18
  38. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
  39. package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +180 -190
  40. package/src/engine/network/replication/Replicator.d.ts +15 -4
  41. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  42. package/src/engine/network/replication/Replicator.js +50 -16
  43. package/src/engine/network/state/RecordArrivalRing.d.ts +57 -0
  44. package/src/engine/network/state/RecordArrivalRing.d.ts.map +1 -0
  45. package/src/engine/network/state/RecordArrivalRing.js +144 -0
  46. package/src/engine/physics/cloth/MEASUREMENTS.md +354 -0
  47. package/src/engine/physics/cloth/PLAN.md +85 -5
  48. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +0 -12
  49. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  50. package/src/engine/physics/cloth/ecs/ClothInstance.js +0 -13
  51. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +2 -1
  52. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  53. package/src/engine/physics/cloth/ecs/ClothSystem.js +7 -1
  54. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  55. package/src/engine/physics/cloth/ecs/ClothWorld.js +4 -15
  56. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +2 -1
  57. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
  58. package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +6 -1
  59. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  60. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +20 -10
  61. package/src/engine/physics/cloth/playground/collide.html +5 -3
  62. package/src/engine/physics/cloth/playground/collide_main.js +14 -13
  63. package/src/engine/physics/cloth/solver/ClothState.d.ts +30 -2
  64. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  65. package/src/engine/physics/cloth/solver/ClothState.js +62 -4
  66. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +11 -3
  67. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
  68. package/src/engine/physics/cloth/solver/cloth_self_find.js +52 -11
  69. package/src/engine/physics/cloth/solver/cloth_self_radius.d.ts +42 -0
  70. package/src/engine/physics/cloth/solver/cloth_self_radius.d.ts.map +1 -0
  71. package/src/engine/physics/cloth/solver/cloth_self_radius.js +64 -0
  72. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +99 -24
  73. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  74. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +102 -25
  75. package/src/engine/physics/cloth/solver/cloth_step.d.ts +5 -1
  76. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  77. package/src/engine/physics/cloth/solver/cloth_step.js +13 -3
  78. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +0 -1
  79. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
  80. package/src/engine/physics/cloth/solver/cloth_step_instance.js +12 -14
  81. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts +23 -4
  82. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
  83. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +36 -8
  84. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
  85. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +4 -2
  86. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  87. package/src/shade/device/mock/SoftwareGPUDevice.d.ts +15 -0
  88. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  89. package/src/shade/device/mock/SoftwareGPUDevice.js +21 -0
  90. package/src/shade/device/pipeline/ComputePipelineManager.d.ts +20 -0
  91. package/src/shade/device/pipeline/ComputePipelineManager.d.ts.map +1 -1
  92. package/src/shade/device/pipeline/ComputePipelineManager.js +80 -6
  93. package/src/shade/device/pipeline/PipelineEnquiry.d.ts +52 -0
  94. package/src/shade/device/pipeline/PipelineEnquiry.d.ts.map +1 -0
  95. package/src/shade/device/pipeline/PipelineEnquiry.js +63 -0
  96. package/src/shade/device/pipeline/RenderPipelineManager.d.ts +21 -0
  97. package/src/shade/device/pipeline/RenderPipelineManager.d.ts.map +1 -1
  98. package/src/shade/device/pipeline/RenderPipelineManager.js +84 -4
  99. package/src/shade/playground/contact_shadows/ContactShadowLab.d.ts +137 -0
  100. package/src/shade/playground/contact_shadows/ContactShadowLab.d.ts.map +1 -0
  101. package/src/shade/playground/contact_shadows/ContactShadowLab.js +654 -0
  102. package/src/shade/playground/contact_shadows/README.md +126 -0
  103. package/src/shade/playground/contact_shadows/index.html +191 -0
  104. package/src/shade/playground/contact_shadows/main.d.ts +2 -0
  105. package/src/shade/playground/contact_shadows/main.d.ts.map +1 -0
  106. package/src/shade/playground/contact_shadows/main.js +888 -0
  107. package/src/shade/playground/contact_shadows/scenes.d.ts +48 -0
  108. package/src/shade/playground/contact_shadows/scenes.d.ts.map +1 -0
  109. package/src/shade/playground/contact_shadows/scenes.js +620 -0
  110. package/src/shade/playground/contact_shadows/shader_contact_lab_composite.d.ts +36 -0
  111. package/src/shade/playground/contact_shadows/shader_contact_lab_composite.d.ts.map +1 -0
  112. package/src/shade/playground/contact_shadows/shader_contact_lab_composite.js +245 -0
  113. package/src/shade/playground/contact_shadows/shader_contact_lab_reference.d.ts +15 -0
  114. package/src/shade/playground/contact_shadows/shader_contact_lab_reference.d.ts.map +1 -0
  115. package/src/shade/playground/contact_shadows/shader_contact_lab_reference.js +120 -0
  116. package/src/shade/playground/contact_shadows/shader_contact_lab_stats.d.ts +55 -0
  117. package/src/shade/playground/contact_shadows/shader_contact_lab_stats.d.ts.map +1 -0
  118. package/src/shade/playground/contact_shadows/shader_contact_lab_stats.js +216 -0
  119. package/src/shade/playground/contact_shadows/shader_contact_lab_view.d.ts +20 -0
  120. package/src/shade/playground/contact_shadows/shader_contact_lab_view.d.ts.map +1 -0
  121. package/src/shade/playground/contact_shadows/shader_contact_lab_view.js +114 -0
  122. package/src/shade/playground/contact_shadows/shader_contact_shadow_march.d.ts +11 -0
  123. package/src/shade/playground/contact_shadows/shader_contact_shadow_march.d.ts.map +1 -0
  124. package/src/shade/playground/contact_shadows/shader_contact_shadow_march.js +90 -0
  125. package/src/shade/playground/contact_shadows/textures.d.ts +16 -0
  126. package/src/shade/playground/contact_shadows/textures.d.ts.map +1 -0
  127. package/src/shade/playground/contact_shadows/textures.js +123 -0
  128. package/src/shade/playground/particle_ecs/README.md +1 -1
  129. package/src/shade/playground/particle_ecs/effects/flame.json +1932 -1881
  130. package/src/shade/playground/particle_ecs/effects/smoke.json +99 -1
  131. package/src/shade/playground/particle_ecs/effects/soot.json +152 -145
  132. package/src/shade/playground/tonemap_sdr/README.md +90 -0
  133. package/src/shade/playground/tonemap_sdr/ToneMapCompare.d.ts +105 -0
  134. package/src/shade/playground/tonemap_sdr/ToneMapCompare.d.ts.map +1 -0
  135. package/src/shade/playground/tonemap_sdr/ToneMapCompare.js +380 -0
  136. package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.d.ts +32 -0
  137. package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.d.ts.map +1 -0
  138. package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.js +104 -0
  139. package/src/shade/playground/tonemap_sdr/index.html +90 -0
  140. package/src/shade/playground/tonemap_sdr/main.d.ts +2 -0
  141. package/src/shade/playground/tonemap_sdr/main.d.ts.map +1 -0
  142. package/src/shade/playground/tonemap_sdr/main.js +306 -0
  143. package/src/shade/playground/tonemap_sdr/scenes.d.ts +26 -0
  144. package/src/shade/playground/tonemap_sdr/scenes.d.ts.map +1 -0
  145. package/src/shade/playground/tonemap_sdr/scenes.js +404 -0
  146. package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
  147. package/src/shade/playground/volumetrics_froxel/main.js +85 -4
  148. package/src/shade/playground/water_refraction/README.md +26 -18
  149. package/src/shade/playground/water_refraction/index.html +1 -1
  150. package/src/shade/renderer/Renderer.d.ts +35 -3
  151. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  152. package/src/shade/renderer/Renderer.js +208 -12
  153. package/src/shade/renderer/ShadeToneMappingMode.d.ts +14 -0
  154. package/src/shade/renderer/ShadeToneMappingMode.d.ts.map +1 -0
  155. package/src/shade/renderer/ShadeToneMappingMode.js +30 -0
  156. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +9 -0
  157. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  158. package/src/shade/renderer/animation/GPUAnimationManager.js +14 -0
  159. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  160. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +5 -3
  161. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +7 -0
  162. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  163. package/src/shade/renderer/buffer/table/GPUDatabase.js +12 -0
  164. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts +8 -0
  165. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  166. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +12 -0
  167. package/src/shade/renderer/camera/GPUCameraContext.d.ts.map +1 -1
  168. package/src/shade/renderer/camera/GPUCameraContext.js +19 -8
  169. package/src/shade/renderer/deferred/chunk_read_gBuffer_material.d.ts.map +1 -1
  170. package/src/shade/renderer/deferred/chunk_read_gBuffer_material.js +4 -0
  171. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.d.ts.map +1 -1
  172. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.js +4 -0
  173. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.d.ts.map +1 -1
  174. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.js +4 -0
  175. package/src/shade/renderer/deferred/shader_deferred_main.d.ts.map +1 -1
  176. package/src/shade/renderer/deferred/shader_deferred_main.js +3 -0
  177. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts +6 -0
  178. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
  179. package/src/shade/renderer/deferred/shader_tonemap_HDR.js +13 -3
  180. package/src/shade/renderer/deferred/shader_tonemap_HDR_none.d.ts +9 -0
  181. package/src/shade/renderer/deferred/shader_tonemap_HDR_none.d.ts.map +1 -0
  182. package/src/shade/renderer/deferred/shader_tonemap_HDR_none.js +63 -0
  183. package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.d.ts +10 -0
  184. package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.d.ts.map +1 -0
  185. package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.js +87 -0
  186. package/src/shade/renderer/deferred/shader_tonemap_LDR.d.ts +6 -0
  187. package/src/shade/renderer/deferred/shader_tonemap_LDR.d.ts.map +1 -1
  188. package/src/shade/renderer/deferred/shader_tonemap_LDR.js +23 -5
  189. package/src/shade/renderer/deferred/shader_tonemap_LDR_none.d.ts +9 -0
  190. package/src/shade/renderer/deferred/shader_tonemap_LDR_none.d.ts.map +1 -0
  191. package/src/shade/renderer/deferred/shader_tonemap_LDR_none.js +68 -0
  192. package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.d.ts +10 -0
  193. package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.d.ts.map +1 -0
  194. package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.js +73 -0
  195. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
  196. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +58 -9
  197. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +35 -25
  198. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  199. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +97 -196
  200. package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts.map +1 -1
  201. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +121 -129
  202. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.d.ts.map +1 -1
  203. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +3 -0
  204. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  205. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -0
  206. package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_indirect_lighting.d.ts.map +1 -1
  207. package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_indirect_lighting.js +4 -0
  208. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
  209. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +3 -0
  210. package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.d.ts.map +1 -1
  211. package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.js +4 -0
  212. package/src/shade/renderer/global_illumination/probe/octahedral/graph_sample_light_probes.d.ts.map +1 -1
  213. package/src/shade/renderer/global_illumination/probe/octahedral/graph_sample_light_probes.js +4 -0
  214. package/src/shade/renderer/global_illumination/shader_resolve_indirect_lighting.d.ts.map +1 -1
  215. package/src/shade/renderer/global_illumination/shader_resolve_indirect_lighting.js +4 -0
  216. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +131 -1
  217. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.d.ts +7 -0
  218. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.d.ts.map +1 -1
  219. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.js +45 -38
  220. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.d.ts +2 -0
  221. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.d.ts.map +1 -1
  222. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.js +81 -79
  223. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.d.ts +2 -0
  224. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.d.ts.map +1 -1
  225. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.js +5 -3
  226. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.d.ts +21 -0
  227. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.d.ts.map +1 -0
  228. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.js +42 -0
  229. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.d.ts +19 -0
  230. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.d.ts.map +1 -0
  231. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.js +44 -0
  232. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts +23 -5
  233. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts.map +1 -1
  234. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +139 -23
  235. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.d.ts +25 -0
  236. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.d.ts.map +1 -0
  237. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.js +179 -0
  238. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts +2 -2
  239. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  240. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +7 -16
  241. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts +3 -4
  242. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  243. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +6 -23
  244. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +11 -0
  245. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
  246. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +14 -3
  247. package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.d.ts +10 -0
  248. package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.d.ts.map +1 -1
  249. package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.js +13 -3
  250. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +10 -0
  251. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
  252. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +14 -0
  253. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.d.ts +26 -0
  254. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.d.ts.map +1 -0
  255. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.js +52 -0
  256. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.d.ts +32 -0
  257. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.d.ts.map +1 -0
  258. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.js +89 -0
  259. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +10 -0
  260. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  261. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +20 -1
  262. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +10 -0
  263. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  264. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +294 -281
  265. package/src/shade/renderer/light/GPULightCollection.d.ts +8 -0
  266. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  267. package/src/shade/renderer/light/GPULightCollection.js +18 -1
  268. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts +8 -0
  269. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  270. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +234 -218
  271. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts +7 -0
  272. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  273. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +13 -0
  274. package/src/shade/renderer/light/cluster/graph_build_light_clusters.d.ts +7 -0
  275. package/src/shade/renderer/light/cluster/graph_build_light_clusters.d.ts.map +1 -1
  276. package/src/shade/renderer/light/cluster/graph_build_light_clusters.js +16 -2
  277. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts +10 -0
  278. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  279. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +13 -0
  280. package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
  281. package/src/shade/renderer/lightmap/GPULightMap.js +3 -0
  282. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.d.ts.map +1 -1
  283. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +4 -0
  284. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.d.ts.map +1 -1
  285. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +4 -0
  286. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  287. package/src/shade/renderer/material/GPUMaterialManager.d.ts +16 -4
  288. package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
  289. package/src/shade/renderer/material/GPUMaterialManager.js +38 -8
  290. package/src/shade/renderer/particles/DESIGN.md +49 -7
  291. package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +453 -0
  292. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +5 -1
  293. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
  294. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +13 -5
  295. package/src/shade/renderer/particles/data/particle_emitter_record.js +2 -2
  296. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -1
  297. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +12 -0
  298. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts +60 -0
  299. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -1
  300. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +156 -0
  301. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +2 -2
  302. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  303. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +8 -8
  304. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts.map +1 -1
  305. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +6 -4
  306. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts +7 -6
  307. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts.map +1 -1
  308. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +91 -58
  309. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  310. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +10 -0
  311. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  312. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +5 -1
  313. package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
  314. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +6 -0
  315. package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.d.ts +7 -0
  316. package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.d.ts.map +1 -1
  317. package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.js +18 -0
  318. package/src/shade/renderer/postprocess/denoise/LigmaDenoiser.d.ts.map +1 -1
  319. package/src/shade/renderer/postprocess/denoise/LigmaDenoiser.js +1 -0
  320. package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.d.ts.map +1 -1
  321. package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.js +6 -4
  322. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts +11 -0
  323. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  324. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +16 -0
  325. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +10 -0
  326. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  327. package/src/shade/renderer/postprocess/gtao/GTAO.js +16 -0
  328. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  329. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +32 -10
  330. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  331. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  332. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +3 -0
  333. package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.d.ts.map +1 -1
  334. package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.js +6 -3
  335. package/src/shade/renderer/postprocess/taa/TAA.d.ts +12 -0
  336. package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
  337. package/src/shade/renderer/postprocess/taa/TAA.js +15 -0
  338. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts +7 -0
  339. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
  340. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +13 -0
  341. package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts +31 -3
  342. package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts.map +1 -1
  343. package/src/shade/renderer/rasterize/TemplatePassDescriptor.js +79 -4
  344. package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.d.ts +17 -0
  345. package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.d.ts.map +1 -1
  346. package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.js +35 -4
  347. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts +7 -0
  348. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  349. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +182 -169
  350. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts +10 -0
  351. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
  352. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +20 -1
  353. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.d.ts +10 -0
  354. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.d.ts.map +1 -1
  355. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.js +18 -1
  356. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts +10 -0
  357. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts.map +1 -1
  358. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js +20 -1
  359. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts +7 -0
  360. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  361. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +187 -170
  362. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts +10 -0
  363. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts.map +1 -1
  364. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.js +19 -1
  365. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts +13 -0
  366. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts.map +1 -1
  367. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +25 -1
  368. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts +10 -0
  369. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  370. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +20 -0
  371. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
  372. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +6 -0
  373. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
  374. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +6 -0
  375. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +3 -2
  376. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  377. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +3 -2
  378. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +7 -2
  379. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  380. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +12 -4
  381. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -1
  382. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +4 -3
  383. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -1
  384. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +4 -3
  385. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts +2 -1
  386. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  387. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +11 -3
  388. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts.map +1 -1
  389. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +4 -3
  390. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.d.ts.map +1 -1
  391. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +4 -3
  392. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts +15 -0
  393. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  394. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +35 -2
  395. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts +14 -0
  396. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  397. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +32 -4
  398. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts +17 -0
  399. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  400. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +34 -4
  401. package/src/shade/renderer/restir/di/chunk_restir_resolve.d.ts +5 -3
  402. package/src/shade/renderer/restir/di/chunk_restir_resolve.d.ts.map +1 -1
  403. package/src/shade/renderer/restir/di/chunk_restir_resolve.js +8 -3
  404. package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
  405. package/src/shade/renderer/restir/di/graph_restir_di.js +1 -0
  406. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  407. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +5 -1
  408. package/src/shade/renderer/restir/reservoir/shader.d.ts.map +1 -1
  409. package/src/shade/renderer/restir/reservoir/shader.js +7 -4
  410. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +7 -0
  411. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  412. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +13 -1
  413. package/src/shade/renderer/scene/GPUSceneContext.d.ts +10 -0
  414. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  415. package/src/shade/renderer/scene/GPUSceneContext.js +19 -0
  416. package/src/shade/renderer/scene/SceneManager.d.ts +9 -0
  417. package/src/shade/renderer/scene/SceneManager.d.ts.map +1 -1
  418. package/src/shade/renderer/scene/SceneManager.js +11 -0
  419. package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.d.ts +11 -0
  420. package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.d.ts.map +1 -1
  421. package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.js +17 -0
  422. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +11 -0
  423. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
  424. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +18 -1
  425. package/src/shade/renderer/shader/ComputeShader.d.ts +12 -0
  426. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  427. package/src/shade/renderer/shader/ComputeShader.js +53 -0
  428. package/src/shade/renderer/shader/ImageShader.d.ts +27 -8
  429. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  430. package/src/shade/renderer/shader/ImageShader.js +70 -1
  431. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +21 -0
  432. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  433. package/src/shade/renderer/shader/ShaderDescriptor.js +71 -1
  434. package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.d.ts +17 -0
  435. package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.d.ts.map +1 -0
  436. package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.js +45 -0
  437. package/src/shade/renderer/shader/chunk/camera/chunk_screen_coordinate_to_view.js +3 -3
  438. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.d.ts +1 -1
  439. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.js +62 -62
  440. package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +318 -0
  441. package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +237 -0
  442. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts +17 -0
  443. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts.map +1 -0
  444. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js +22 -0
  445. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.d.ts +14 -1
  446. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.d.ts.map +1 -1
  447. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.js +28 -15
  448. package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts +12 -0
  449. package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts.map +1 -1
  450. package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js +128 -110
  451. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.d.ts +20 -0
  452. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.d.ts.map +1 -0
  453. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.js +33 -0
  454. package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.d.ts +4 -0
  455. package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.d.ts.map +1 -1
  456. package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.js +12 -1
  457. package/src/shade/renderer/shader/chunk/material/MATERIAL_SHADING_INFO_STRUCT.d.ts.map +1 -1
  458. package/src/shade/renderer/shader/chunk/material/MATERIAL_SHADING_INFO_STRUCT.js +7 -0
  459. package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +108 -0
  460. package/src/shade/renderer/shader/chunk/material/chunk_compute_indirect_specular.d.ts.map +1 -1
  461. package/src/shade/renderer/shader/chunk/material/chunk_compute_indirect_specular.js +23 -4
  462. package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.d.ts +18 -0
  463. package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.d.ts.map +1 -0
  464. package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.js +56 -0
  465. package/src/shade/renderer/shader/chunk/material/chunk_re_indirect_specular_physical.d.ts.map +1 -1
  466. package/src/shade/renderer/shader/chunk/material/chunk_re_indirect_specular_physical.js +2 -0
  467. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.d.ts +43 -0
  468. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.d.ts.map +1 -0
  469. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.js +319 -0
  470. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +33 -0
  471. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
  472. package/src/shade/renderer/shader/compiler/CodeChunk.js +140 -0
  473. package/src/shade/renderer/shader/compiler/CodeChunkChoice.d.ts +74 -0
  474. package/src/shade/renderer/shader/compiler/CodeChunkChoice.d.ts.map +1 -0
  475. package/src/shade/renderer/shader/compiler/CodeChunkChoice.js +166 -0
  476. package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +680 -0
  477. package/src/shade/renderer/shader/compiler/ShaderSwitch.d.ts +86 -0
  478. package/src/shade/renderer/shader/compiler/ShaderSwitch.d.ts.map +1 -0
  479. package/src/shade/renderer/shader/compiler/ShaderSwitch.js +178 -0
  480. package/src/shade/renderer/shader/compiler/ShaderSwitchSet.d.ts +67 -0
  481. package/src/shade/renderer/shader/compiler/ShaderSwitchSet.d.ts.map +1 -0
  482. package/src/shade/renderer/shader/compiler/ShaderSwitchSet.js +205 -0
  483. package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.d.ts +14 -0
  484. package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.d.ts.map +1 -0
  485. package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.js +13 -0
  486. package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.d.ts +65 -0
  487. package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.d.ts.map +1 -0
  488. package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.js +252 -0
  489. package/src/shade/renderer/shadow/contact/FINDINGS.md +413 -0
  490. package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.d.ts +29 -0
  491. package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.d.ts.map +1 -0
  492. package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.js +105 -0
  493. package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.d.ts +29 -0
  494. package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.d.ts.map +1 -0
  495. package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.js +39 -0
  496. package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.d.ts +29 -0
  497. package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.d.ts.map +1 -0
  498. package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.js +92 -0
  499. package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.d.ts +29 -0
  500. package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.d.ts.map +1 -0
  501. package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.js +128 -0
  502. package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.d.ts +52 -0
  503. package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.d.ts.map +1 -0
  504. package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.js +358 -0
  505. package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.d.ts +10 -0
  506. package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.d.ts.map +1 -0
  507. package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.js +12 -0
  508. package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.d.ts +13 -0
  509. package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.d.ts.map +1 -0
  510. package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.js +14 -0
  511. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +14 -8
  512. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
  513. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +20 -86
  514. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.d.ts +14 -0
  515. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.d.ts.map +1 -0
  516. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.js +79 -0
  517. package/src/shade/renderer/shadow/ray/shader_ray_shadow_code.d.ts.map +1 -1
  518. package/src/shade/renderer/shadow/ray/shader_ray_shadow_code.js +12 -12
  519. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  520. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +153 -151
  521. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.d.ts +13 -0
  522. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.d.ts.map +1 -0
  523. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.js +48 -0
  524. package/src/shade/renderer/texture/GPUTextureContext.d.ts +10 -0
  525. package/src/shade/renderer/texture/GPUTextureContext.d.ts.map +1 -1
  526. package/src/shade/renderer/texture/GPUTextureContext.js +24 -0
  527. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +219 -0
  528. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -0
  529. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +671 -0
  530. package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts +26 -2
  531. package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts.map +1 -1
  532. package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +108 -4
  533. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +5 -1
  534. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  535. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +6 -0
  536. package/src/shade/renderer/volumetrics/NOTES.md +50 -0
  537. package/src/shade/renderer/volumetrics/PARTICIPATING_MEDIA_VOLUME_STRUCT.d.ts.map +1 -1
  538. package/src/shade/renderer/volumetrics/PARTICIPATING_MEDIA_VOLUME_STRUCT.js +30 -1
  539. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +51 -13
  540. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
  541. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +98 -13
  542. package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts +9 -0
  543. package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts.map +1 -1
  544. package/src/shade/renderer/volumetrics/SceneVolumetrics.js +78 -68
  545. package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +326 -0
  546. package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts +7 -4
  547. package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts.map +1 -1
  548. package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.js +21 -9
  549. package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.d.ts +19 -0
  550. package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.d.ts.map +1 -0
  551. package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.js +53 -0
  552. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts +12 -3
  553. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts.map +1 -1
  554. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.js +85 -48
  555. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts +4 -1
  556. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts.map +1 -1
  557. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +4 -1
  558. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +4 -1
  559. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  560. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +21 -1
  561. package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.d.ts +98 -0
  562. package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.d.ts.map +1 -0
  563. package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.js +115 -0
  564. package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.d.ts +9 -0
  565. package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.d.ts.map +1 -0
  566. package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.js +24 -0
  567. package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.d.ts +27 -0
  568. package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.d.ts.map +1 -0
  569. package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.js +91 -0
  570. package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.d.ts +35 -0
  571. package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.d.ts.map +1 -0
  572. package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.js +92 -0
  573. package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.d.ts +10 -0
  574. package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.d.ts.map +1 -0
  575. package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.js +121 -0
  576. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
  577. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +38 -3
  578. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
  579. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +311 -290
  580. package/src/shade/renderer/volumetrics/volumetrics_position_world_to_froxel_uvw.d.ts.map +1 -1
  581. package/src/shade/renderer/volumetrics/volumetrics_position_world_to_froxel_uvw.js +28 -49
  582. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +3 -1
  583. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  584. package/src/shade/renderer/water/GPUWaterRenderer.js +24 -18
  585. package/src/shade/renderer/water/chunk_water_transport.d.ts +0 -1
  586. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
  587. package/src/shade/renderer/water/chunk_water_transport.js +0 -17
  588. package/src/shade/renderer/water/shader_water.d.ts +4 -2
  589. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  590. package/src/shade/renderer/water/shader_water.js +27 -16
  591. package/src/shade/renderer/water/shader_water_avboit.d.ts +0 -4
  592. package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
  593. package/src/shade/renderer/water/shader_water_avboit.js +0 -63
  594. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  595. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +43 -9
  596. package/src/engine/network/transport/Channel.d.ts +0 -85
  597. package/src/engine/network/transport/Channel.d.ts.map +0 -1
  598. package/src/engine/network/transport/ReliableCommandPipeline.d.ts +0 -155
  599. package/src/engine/network/transport/ReliableCommandPipeline.d.ts.map +0 -1
  600. package/src/engine/network/transport/fragments/FragmentAssembler.d.ts +0 -105
  601. package/src/engine/network/transport/fragments/FragmentAssembler.d.ts.map +0 -1
  602. package/src/engine/network/transport/fragments/FragmentRetention.d.ts +0 -103
  603. package/src/engine/network/transport/fragments/FragmentRetention.d.ts.map +0 -1
  604. package/src/engine/network/transport/fragments/fragment_send.d.ts +0 -61
  605. package/src/engine/network/transport/fragments/fragment_send.d.ts.map +0 -1
  606. package/src/engine/network/transport/fragments/packet_size.d.ts +0 -99
  607. package/src/engine/network/transport/fragments/packet_size.d.ts.map +0 -1
  608. package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.d.ts +0 -6
  609. package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.d.ts.map +0 -1
  610. package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.js +0 -16
  611. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.d.ts +0 -7
  612. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.d.ts.map +0 -1
  613. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.js +0 -46
  614. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.d.ts +0 -10
  615. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.d.ts.map +0 -1
  616. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.js +0 -127
  617. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.d.ts +0 -7
  618. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.d.ts.map +0 -1
  619. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.js +0 -39
@@ -0,0 +1,404 @@
1
+ import { Color } from "../../../core/color/Color.js";
2
+ import { kelvin_to_rgb } from "../../../core/color/kelvin/kelvin_to_rgb.js";
3
+ import Quaternion from "../../../core/geom/Quaternion.js";
4
+ import Vector3 from "../../../core/geom/Vector3.js";
5
+ import { EntityComponentDataset } from "../../../engine/ecs/EntityComponentDataset.js";
6
+ import { Transform64 } from "../../../engine/ecs/transform/Transform64.js";
7
+ import { BoxGeometry } from "../../renderer/geometry/BoxGeometry.js";
8
+ import { MeshoptClusterizer } from "../../renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js";
9
+ import { meshlet_geometry_build_from_geometry } from "../../renderer/geometry/meshlet_geometry_build_from_geometry.js";
10
+ import { MeshletGeometry } from "../../renderer/geometry/MeshletGeometry.js";
11
+ import { make_torus_knot_geometry } from "../../renderer/geometry/primitives/make_torus_knot_geometry.js";
12
+ import { make_uv_sphere_geometry } from "../../renderer/geometry/primitives/make_uv_sphere_geometry.js";
13
+ import { make_sunlight } from "../../renderer/light/make_sunlight.js";
14
+ import { PointLight } from "../../renderer/light/model/PointLight.js";
15
+ import { place_light } from "../../renderer/light/place_light.js";
16
+ import { StandardShadeMaterial } from "../../renderer/material/StandardShadeMaterial.js";
17
+ import { place_primitive } from "../../renderer/scene/rows/place_primitive.js";
18
+ import { Scene } from "../../renderer/scene/Scene.js";
19
+ import { load_default_environment } from "../load_default_environment.js";
20
+ import { make_flat_environment } from "../skinned_blas_refit/flat_environment.js";
21
+
22
+ /**
23
+ * @typedef {import("../../renderer/Renderer.js").Renderer} Renderer
24
+ */
25
+
26
+ /**
27
+ * @typedef {Object} ToneMapScene
28
+ * @property {string} name
29
+ * @property {Scene} scene
30
+ * @property {number[][]} view camera position and target
31
+ * @property {number} exposure_ev the fixed exposure the scene is authored for, in f-stops over a scene value of 1
32
+ * @property {string} note what the scene is there to show
33
+ */
34
+
35
+ /**
36
+ * An sRGB-encoded 8-bit triple as linear Rec.709, which is what a material's colour takes.
37
+ *
38
+ * @param {number} r
39
+ * @param {number} g
40
+ * @param {number} b
41
+ * @returns {number[]}
42
+ */
43
+ function from_srgb8(r, g, b) {
44
+ return [r, g, b].map(v => {
45
+ const c = v / 255;
46
+
47
+ return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
48
+ });
49
+ }
50
+
51
+ /**
52
+ * A black body's colour as linear Rec.709. `kelvin_to_rgb` answers sRGB-encoded, and a light's colour and an
53
+ * emissive factor both take linear.
54
+ *
55
+ * @param {number} temperature in kelvin
56
+ * @returns {number[]}
57
+ */
58
+ function kelvin_linear(temperature) {
59
+ const encoded = [];
60
+
61
+ kelvin_to_rgb(encoded, 0, temperature);
62
+
63
+ return encoded.map(c => c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));
64
+ }
65
+
66
+ /**
67
+ * What every scene starts from: a scene on its own dataset, and placers for boxes and spheres.
68
+ *
69
+ * @param {Renderer} renderer
70
+ */
71
+ function scene_base(renderer) {
72
+ const scene = new Scene();
73
+
74
+ scene.dataset = new EntityComponentDataset();
75
+
76
+ const scene_context = renderer.scenes.obtain(scene);
77
+
78
+ const cube = new BoxGeometry();
79
+
80
+ const sphere = new MeshletGeometry();
81
+ meshlet_geometry_build_from_geometry(make_uv_sphere_geometry(1, 48, 24), sphere);
82
+
83
+ const knot = new MeshletGeometry();
84
+ meshlet_geometry_build_from_geometry(make_torus_knot_geometry(0.6, 0.2, 160, 24), knot);
85
+
86
+ /**
87
+ * @param {number[]} rgb linear
88
+ * @param {number} roughness
89
+ * @param {number} metallic
90
+ * @returns {StandardShadeMaterial}
91
+ */
92
+ const surface = (rgb, roughness, metallic) => {
93
+ const material = new StandardShadeMaterial();
94
+
95
+ material.diffuse_color.copy(new Color(rgb[0], rgb[1], rgb[2]));
96
+ material.roughness_factor = roughness;
97
+ material.metallic_factor = metallic;
98
+
99
+ return material;
100
+ };
101
+
102
+ /**
103
+ * A black surface that only emits: `rgb` times `strength`, in scene units.
104
+ *
105
+ * @param {number[]} rgb
106
+ * @param {number} strength
107
+ * @returns {StandardShadeMaterial}
108
+ */
109
+ const glow = (rgb, strength) => {
110
+ const material = surface([0, 0, 0], 1, 0);
111
+
112
+ material.emissive_factor.copy(new Color(rgb[0] * strength, rgb[1] * strength, rgb[2] * strength));
113
+
114
+ return material;
115
+ };
116
+
117
+ /**
118
+ * @param {MeshletGeometry} geometry
119
+ * @param {StandardShadeMaterial} material
120
+ * @param {number[]} position
121
+ * @param {number[]} scale
122
+ * @param {number} [yaw] radians about +Y
123
+ */
124
+ const place = (geometry, material, position, scale, yaw = 0) => {
125
+ const transform = new Transform64();
126
+ const rotation = Quaternion.fromAxisAngle(Vector3.up, yaw);
127
+
128
+ transform.setTranslation(position[0], position[1], position[2]);
129
+ transform.setRotation(rotation.x, rotation.y, rotation.z, rotation.w);
130
+ transform.setScale(scale[0], scale[1], scale[2]);
131
+ transform.updateMatrix();
132
+
133
+ place_primitive(scene_context, geometry, material, transform);
134
+ };
135
+
136
+ /**
137
+ * @param {number[]} position
138
+ * @param {number[]} rgb chromaticity, linear
139
+ * @param {number} candela
140
+ */
141
+ const lamp = (position, rgb, candela) => {
142
+ const light = new PointLight();
143
+
144
+ light.color.copy(new Color(rgb[0], rgb[1], rgb[2]));
145
+ light.intensity = candela;
146
+ light.distance = 0;
147
+ light.radius = 0.05;
148
+ light.casts_shadow = false;
149
+ light.transform.setTranslation(position[0], position[1], position[2]);
150
+ light.transform.updateMatrix();
151
+
152
+ place_light(scene, light);
153
+ };
154
+
155
+ return { scene, cube, sphere, knot, surface, glow, place, lamp };
156
+ }
157
+
158
+ /**
159
+ * Night, lit only by what glows. A fire of stacked emitters lights a floor and three props, and a ladder of emitters
160
+ * steps four saturated colours up by two stops at a time, from below the shoulder of every operator to far past it.
161
+ *
162
+ * @param {Renderer} renderer
163
+ * @returns {ToneMapScene}
164
+ */
165
+ function create_fire(renderer) {
166
+ const { scene, cube, sphere, surface, glow, place, lamp } = scene_base(renderer);
167
+
168
+ scene.lights.environment = make_flat_environment([0.0015, 0.002, 0.004]);
169
+
170
+ place(cube, surface([0.18, 0.18, 0.18], 0.85, 0), [0, -0.05, 0], [30, 0.1, 30]);
171
+
172
+ // the fire: hot at the core, redder and dimmer outwards
173
+ const FIRE = [1, 0.35, 0.05];
174
+
175
+ place(sphere, glow([1, 0.62, 0.22], 48), [0, 0.28, 0], [0.22, 0.3, 0.22]);
176
+ place(sphere, glow(FIRE, 16), [0.18, 0.22, 0.1], [0.2, 0.24, 0.2]);
177
+ place(sphere, glow(FIRE, 16), [-0.16, 0.2, -0.08], [0.18, 0.26, 0.18]);
178
+ place(sphere, glow([1, 0.2, 0.03], 6), [0.05, 0.16, -0.22], [0.2, 0.16, 0.2]);
179
+ place(sphere, glow([1, 0.2, 0.03], 6), [-0.1, 0.14, 0.24], [0.22, 0.14, 0.22]);
180
+ place(sphere, glow([0.9, 0.12, 0.02], 2), [0, 0.06, 0], [0.5, 0.06, 0.5]);
181
+
182
+ // logs and stones around it
183
+ const char = surface([0.04, 0.03, 0.025], 0.9, 0);
184
+
185
+ for (let i = 0; i < 6; i++) {
186
+ const a = i / 6 * Math.PI * 2;
187
+
188
+ place(cube, char, [Math.cos(a) * 0.45, 0.06, Math.sin(a) * 0.45], [0.5, 0.1, 0.12], -a);
189
+ }
190
+
191
+ const fire_light = kelvin_linear(1900);
192
+
193
+ lamp([0, 0.6, 0], fire_light, 120);
194
+ lamp([0.2, 0.35, 0.15], fire_light, 40);
195
+
196
+ // props the fire lights: a white sphere, a grey column, a saturated blue box
197
+ place(sphere, surface([0.8, 0.8, 0.8], 0.4, 0), [-1.6, 0.5, 0.6], [0.5, 0.5, 0.5]);
198
+ place(cube, surface([0.45, 0.45, 0.45], 0.7, 0), [1.7, 1, 0.2], [0.5, 2, 0.5]);
199
+ place(cube, surface(from_srgb8(30, 80, 200), 0.5, 0), [1.2, 0.3, 1.2], [0.6, 0.6, 0.6], 0.4);
200
+
201
+ // the ladder: four colours, each two stops brighter than the last, left to right
202
+ const ladder = [
203
+ [1, 0.35, 0.05], // fire orange
204
+ [1, 0.03, 0.02], // brake-lamp red
205
+ [1, 0.55, 0.12], // sodium
206
+ [0.05, 0.2, 1], // neon blue
207
+ ];
208
+
209
+ for (let row = 0; row < ladder.length; row++) {
210
+ for (let step = 0; step < 6; step++) {
211
+ const strength = Math.pow(2, step * 2 - 2);
212
+
213
+ place(cube, glow(ladder[row], strength), [-2.75 + step * 1.1, 0.8 + row * 0.6, -4], [0.45, 0.45, 0.1]);
214
+ }
215
+ }
216
+
217
+ return {
218
+ name: 'Fire and emitters',
219
+ scene,
220
+ view: [[0, 1.7, 4.6], [0, 1.1, -1.5]],
221
+ exposure_ev: 0,
222
+ note: 'Night, lit by a fire. Back row: four colours from ¼ to 256, two stops a step.',
223
+ };
224
+ }
225
+
226
+ /**
227
+ * Midday. A photographed sky and a sun over a concrete yard, with a car-paint orange, primaries, foliage green, chrome
228
+ * and white — the case where the sky and the sunlit white sit near the top of the range.
229
+ *
230
+ * @param {Renderer} renderer
231
+ * @returns {ToneMapScene}
232
+ */
233
+ function create_exterior(renderer) {
234
+ const { scene, cube, sphere, knot, surface, place } = scene_base(renderer);
235
+
236
+ scene.lights.environment = make_flat_environment([0.35, 0.45, 0.6]);
237
+ load_default_environment(scene, '/test_assets/environments/octahedral/rustig_koppie_puresky_2k.hdr');
238
+
239
+ const sun = make_sunlight({ intensity: 8, temperature: 5800, direction: new Vector3(-0.45, -0.7, -0.55) });
240
+
241
+ place_light(scene, sun);
242
+
243
+ place(cube, surface([0.42, 0.4, 0.37], 0.9, 0), [0, -0.05, -10], [80, 0.1, 80]);
244
+
245
+ // a white wall and a dark doorway, for a sunlit white beside a shadow
246
+ place(cube, surface([0.82, 0.8, 0.76], 0.8, 0), [0, 1.5, -4.5], [9, 3, 0.3]);
247
+ place(cube, surface([0.05, 0.05, 0.05], 0.9, 0), [2.5, 1.1, -4.3], [1.1, 2.2, 0.1]);
248
+
249
+ // GT7's own test colour: a vivid orange paint, outside Rec.709 in their renders, at the edge of it here
250
+ place(sphere, surface(from_srgb8(255, 96, 0), 0.12, 0), [-1.8, 0.7, -1.5], [0.7, 0.7, 0.7]);
251
+ place(knot, surface(from_srgb8(255, 96, 0), 0.12, 0), [-3.5, 0.9, -2.8], [1, 1, 1], 0.6);
252
+
253
+ place(cube, surface(from_srgb8(200, 20, 30), 0.5, 0), [0.4, 0.5, -1.2], [1, 1, 1], 0.3);
254
+ place(cube, surface(from_srgb8(20, 60, 190), 0.5, 0), [1.7, 0.4, -0.6], [0.8, 0.8, 0.8], -0.2);
255
+ place(sphere, surface(from_srgb8(60, 120, 30), 0.8, 0), [3.2, 0.9, -2.4], [0.9, 0.9, 0.9]);
256
+ place(sphere, surface([0.95, 0.95, 0.95], 0.05, 1), [-0.2, 0.45, 0.6], [0.45, 0.45, 0.45]);
257
+ place(sphere, surface([0.85, 0.85, 0.85], 0.6, 0), [1.1, 0.35, 1.3], [0.35, 0.35, 0.35]);
258
+
259
+ return {
260
+ name: 'Sunlit exterior',
261
+ scene,
262
+ view: [[1.5, 1.7, 5.5], [-0.3, 0.9, -2.5]],
263
+ exposure_ev: -0.5,
264
+ note: 'Sky and sun. A white wall in sun beside a doorway in shade; car-paint orange, primaries, chrome.',
265
+ };
266
+ }
267
+
268
+ /**
269
+ * Evening indoors. A room lit by one warm lamp, with a window onto a bright panel and a low sun throwing a patch
270
+ * through it: exposed for the room, the window and the patch are far over.
271
+ *
272
+ * @param {Renderer} renderer
273
+ * @returns {ToneMapScene}
274
+ */
275
+ function create_interior(renderer) {
276
+ const { scene, cube, sphere, surface, glow, place, lamp } = scene_base(renderer);
277
+
278
+ scene.lights.environment = make_flat_environment([0.003, 0.003, 0.004]);
279
+
280
+ const sun = make_sunlight({ intensity: 60, temperature: 4200, direction: new Vector3(0.3, -0.8, 0.5) });
281
+
282
+ place_light(scene, sun);
283
+
284
+ const plaster = surface([0.7, 0.66, 0.6], 0.9, 0);
285
+ const wood = surface(from_srgb8(120, 72, 40), 0.6, 0);
286
+
287
+ // the room: 8 x 3 x 6 m, the window in the far wall
288
+ place(cube, wood, [0, -0.05, 0], [8, 0.1, 6]);
289
+ place(cube, plaster, [0, 3.05, 0], [8, 0.1, 6]);
290
+ place(cube, plaster, [-4.05, 1.5, 0], [0.1, 3, 6]);
291
+ place(cube, plaster, [4.05, 1.5, 0], [0.1, 3, 6]);
292
+ place(cube, plaster, [0, 1.5, 3.05], [8, 3, 0.1]);
293
+
294
+ // the far wall around a 2 x 1.4 m window, its sill at 0.9 m
295
+ place(cube, plaster, [-2.5, 1.5, -3.05], [3, 3, 0.1]);
296
+ place(cube, plaster, [2.5, 1.5, -3.05], [3, 3, 0.1]);
297
+ place(cube, plaster, [0, 0.45, -3.05], [2, 0.9, 0.1]);
298
+ place(cube, plaster, [0, 2.65, -3.05], [2, 0.7, 0.1]);
299
+
300
+ // outside: a bright overcast panel, the view through the window, low enough that the sun clears it
301
+ place(cube, glow([0.85, 0.9, 1], 12), [0, 1.6, -6], [12, 3, 0.1]);
302
+
303
+ // a lamp on a side table: an emitting shade and a 2700 K light under it
304
+ const warm = kelvin_linear(2700);
305
+
306
+ place(cube, wood, [-1.9, 0.3, -1.4], [0.6, 0.6, 0.6]);
307
+ place(sphere, glow(warm, 4), [-1.9, 0.95, -1.4], [0.22, 0.18, 0.22]);
308
+ lamp([-1.9, 0.95, -1.4], warm, 4);
309
+
310
+ // a teal sofa, a rug, and a shelf of books in saturated covers
311
+ const teal = surface(from_srgb8(0, 120, 120), 0.9, 0);
312
+
313
+ // the sofa sits under the window, where the sun patch falls on its seat
314
+ place(cube, teal, [0.4, 0.25, -2.45], [2.4, 0.5, 0.9]);
315
+ place(cube, teal, [0.4, 0.65, -2.9], [2.4, 0.5, 0.2]);
316
+ place(cube, surface(from_srgb8(150, 30, 40), 0.95, 0), [0.4, 0.01, -0.8], [3, 0.02, 2]);
317
+
318
+ const covers = [[200, 30, 30], [240, 190, 20], [30, 90, 200], [30, 140, 60], [230, 230, 220], [120, 40, 140]];
319
+
320
+ // the shelf stands against the left wall, beside the lamp
321
+ place(cube, wood, [-3.8, 1, -1.5], [0.4, 2, 1.8]);
322
+
323
+ for (let i = 0; i < 12; i++) {
324
+ const c = covers[i % covers.length];
325
+
326
+ place(cube, surface(from_srgb8(c[0], c[1], c[2]), 0.7, 0), [-3.55, 1.25, -2.25 + i * 0.13], [0.1, 0.35, 0.1]);
327
+ }
328
+
329
+ place(sphere, surface([0.8, 0.8, 0.8], 0.3, 0), [-1.2, 0.25, 0.8], [0.25, 0.25, 0.25]);
330
+
331
+ return {
332
+ name: 'Dim interior',
333
+ scene,
334
+ view: [[1.5, 1.5, 2.6], [-0.8, 0.9, -2.5]],
335
+ exposure_ev: 1,
336
+ note: 'One 2700 K lamp; a window onto a bright panel, and a low sun patch on the teal sofa under it.',
337
+ };
338
+ }
339
+
340
+ /**
341
+ * A studio. A photographed studio environment and a soft key light over a white sweep, with product colours given as
342
+ * sRGB values — what Khronos PBR Neutral promises to reproduce, and the shot e-commerce viewers default to it for.
343
+ *
344
+ * @param {Renderer} renderer
345
+ * @returns {ToneMapScene}
346
+ */
347
+ function create_product(renderer) {
348
+ const { scene, cube, sphere, knot, surface, place } = scene_base(renderer);
349
+
350
+ scene.lights.environment = make_flat_environment([0.5, 0.5, 0.5]);
351
+ load_default_environment(scene, '/test_assets/environments/octahedral/blue_photo_studio_2k.hdr');
352
+
353
+ const key = make_sunlight({ intensity: 1.5, temperature: 6500, direction: new Vector3(0.5, -0.7, -0.5) });
354
+
355
+ key.radius = 0.2;
356
+ place_light(scene, key);
357
+
358
+ const sweep = surface([0.8, 0.8, 0.8], 0.7, 0);
359
+
360
+ place(cube, sweep, [0, -0.05, 0], [12, 0.1, 8]);
361
+ place(cube, sweep, [0, 2, -3], [12, 4, 0.1]);
362
+
363
+ const products = [
364
+ [from_srgb8(231, 218, 63), 0.35, 0], // canary yellow
365
+ [from_srgb8(203, 63, 63), 0.35, 0], // a marketing red
366
+ [from_srgb8(149, 218, 188), 0.35, 0], // mint
367
+ [[0.8, 0.8, 0.8], 0.9, 0], // matte paper white
368
+ [[1, 0.77, 0.34], 0.25, 1], // gold
369
+ [[0.04, 0.04, 0.045], 0.15, 0], // gloss black
370
+ ];
371
+
372
+ for (let i = 0; i < products.length; i++) {
373
+ const [rgb, roughness, metallic] = products[i];
374
+
375
+ place(sphere, surface(rgb, roughness, metallic), [-2.5 + i, 0.4, 0], [0.4, 0.4, 0.4]);
376
+ }
377
+
378
+ place(knot, surface(from_srgb8(255, 110, 20), 0.3, 0), [0, 1.35, -1], [0.9, 0.9, 0.9]);
379
+
380
+ return {
381
+ name: 'Product shot',
382
+ scene,
383
+ view: [[0, 1.4, 4.2], [0, 0.6, -0.5]],
384
+ exposure_ev: 0,
385
+ note: 'Studio light on a white sweep. Base colours given in sRGB: yellow 231,218,63 · red 203,63,63 · mint 149,218,188.',
386
+ };
387
+ }
388
+
389
+ /**
390
+ * Every scene the page offers, in menu order.
391
+ *
392
+ * @param {Renderer} renderer
393
+ * @returns {Promise<ToneMapScene[]>}
394
+ */
395
+ export async function create_scenes(renderer) {
396
+ await MeshoptClusterizer.ready;
397
+
398
+ return [
399
+ create_fire(renderer),
400
+ create_exterior(renderer),
401
+ create_interior(renderer),
402
+ create_product(renderer),
403
+ ];
404
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/volumetrics_froxel/main.js"],"names":[],"mappings":"AA2aA,uCA8dC"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/volumetrics_froxel/main.js"],"names":[],"mappings":"AA0fA,uCAgeC"}
@@ -16,6 +16,7 @@ import { load_gltf } from "../../renderer/loader/gltf/load_gltf.js";
16
16
  import { Renderer } from "../../renderer/Renderer.js";
17
17
  import { Scene } from "../../renderer/scene/Scene.js";
18
18
  import {
19
+ participating_media_volume_advance_noise,
19
20
  ParticipatingMediaVolume,
20
21
  VolumetricsParticleSpec
21
22
  } from "../../renderer/volumetrics/ParticipatingMediaVolume.js";
@@ -211,7 +212,20 @@ function add_participating_media(scene) {
211
212
  * @param {number} spec.fade
212
213
  * @param {number} [spec.yaw_degrees]
213
214
  */
214
- function volume({ position, scale, particle, extinction, fade, yaw_degrees = 0 }) {
215
+ /**
216
+ * @param {object} spec
217
+ * @param {number[]} spec.position
218
+ * @param {number[]} spec.scale
219
+ * @param {object} spec.particle from MIE_PARTICLES_STANDARD_PRECOMPUTED
220
+ * @param {number} spec.extinction
221
+ * @param {number} spec.fade
222
+ * @param {number} [spec.yaw_degrees]
223
+ * @param {number} [spec.noise_strength] 0 is the uniform medium; 1 is the engine's noise tile as
224
+ * it is, sampled in world space every `noise_scale` metres, scrolled by `NOISE_WIND` each frame
225
+ * @param {number} [spec.noise_scale]
226
+ * @param {number} [spec.noise_warp]
227
+ */
228
+ function volume({ position, scale, particle, extinction, fade, yaw_degrees = 0, noise_strength = 0, noise_scale = 32, noise_warp = 0.1 }) {
215
229
  const v = new ParticipatingMediaVolume();
216
230
 
217
231
  v.transform.setTranslation(...position);
@@ -229,6 +243,14 @@ function add_participating_media(scene) {
229
243
  v.particle_spec = VolumetricsParticleSpec.fromMeep(particle);
230
244
  v.target_extinction = extinction;
231
245
 
246
+ v.noise_strength = noise_strength;
247
+ v.noise_scale = noise_scale;
248
+ v.noise_warp = noise_warp;
249
+
250
+ if (noise_strength > 0) {
251
+ noisy_volumes.add(v);
252
+ }
253
+
232
254
  scene.volumetrics.add(v);
233
255
 
234
256
  return v;
@@ -237,7 +259,8 @@ function add_participating_media(scene) {
237
259
  const P = MIE_PARTICLES_STANDARD_PRECOMPUTED;
238
260
 
239
261
  // the dense bank along the western edge — the thickest medium in the scene, and the one that
240
- // fills the frame corners from the `vol_0` view
262
+ // fills the frame corners from the `vol_0` view. Noisy: the bank is what the "Fog bank" and
263
+ // "Inside the fog" viewpoints look at, so it is where the noise is judged and measured
241
264
  volume({
242
265
  position: [-55, 4, -5.116],
243
266
  scale: [10, 3, 20],
@@ -245,24 +268,34 @@ function add_participating_media(scene) {
245
268
  particle: P.CLOUD_DROPLET_LARGE,
246
269
  extinction: 1,
247
270
  fade: 0.5,
271
+ noise_strength: 1,
272
+ noise_scale: 20,
273
+ noise_warp: 0.15,
248
274
  });
249
275
 
250
- // graveyard
276
+ // graveyard — noisy: wisps 4 m apart (the default tile's four features over 16 m), drifting
277
+ // with the wind and changing shape as the warp tap slides against the base
251
278
  volume({
252
279
  position: [-51.98019820725889, 7.899311905935347, -15.3228393616169],
253
280
  scale: [7, 5, 7],
254
281
  particle: P.FOG_DROPLET_SMALL,
255
282
  extinction: 0.4,
256
283
  fade: 1,
284
+ noise_strength: 1,
285
+ noise_scale: 16,
286
+ noise_warp: 0.15,
257
287
  });
258
288
 
259
- // mine
289
+ // mine — noisy: coarser clumps of dust, warped harder
260
290
  volume({
261
291
  position: [-50.846390607312934, 0.3159949821015605, 17.89429433940319],
262
292
  scale: [10, 7, 10],
263
293
  particle: P.COARSE_DUST_MEDIUM,
264
294
  extinction: 0.4,
265
295
  fade: 4,
296
+ noise_strength: 1,
297
+ noise_scale: 24,
298
+ noise_warp: 0.25,
266
299
  });
267
300
 
268
301
  // large crystal
@@ -294,6 +327,52 @@ function add_participating_media(scene) {
294
327
  });
295
328
  }
296
329
 
330
+ /**
331
+ * The wind every noisy volume drifts with, metres a second. Gentle on purpose: the froxel TAA
332
+ * blends about 39 frames, and a feature that moves far inside that window smears.
333
+ * @type {number[]}
334
+ */
335
+ const NOISE_WIND = [1.2, 0, 0.4];
336
+
337
+ /**
338
+ * One frame of the noise: what `ParticipatingMediaSystem` does for an ECS scene, done here by hand
339
+ * because this page builds its volumes directly. A debug global stands in for an A/B switch:
340
+ * `globalThis.__VOL_NOISE = 0` makes every noisy volume uniform (the branch the shader skips), `1`
341
+ * puts the noise back; `measure.js`'s `ab` flips it by frame blocks.
342
+ *
343
+ * @param {Scene} scene
344
+ * @param {number} dt seconds
345
+ */
346
+ function advance_noise(scene, dt) {
347
+ const strength = globalThis.__VOL_NOISE ?? 1;
348
+ let changed = false;
349
+
350
+ for (const v of scene.volumetrics.volumes) {
351
+ if (!noisy_volumes.has(v)) {
352
+ continue;
353
+ }
354
+
355
+ if (v.noise_strength !== strength) {
356
+ v.noise_strength = strength;
357
+ changed = true;
358
+ }
359
+
360
+ if (strength > 0 && participating_media_volume_advance_noise(v, NOISE_WIND, dt)) {
361
+ changed = true;
362
+ }
363
+ }
364
+
365
+ if (changed) {
366
+ scene.volumetrics.invalidate();
367
+ }
368
+ }
369
+
370
+ /**
371
+ * The volumes `add_participating_media` gave noise, so the A/B switch knows which to touch.
372
+ * @type {Set<ParticipatingMediaVolume>}
373
+ */
374
+ const noisy_volumes = new Set();
375
+
297
376
  /**
298
377
  * A rolling mean frame time, so the readout is legible rather than jittering.
299
378
  */
@@ -893,6 +972,8 @@ export async function start() {
893
972
  return;
894
973
  }
895
974
 
975
+ advance_noise(scene, time_delta_s);
976
+
896
977
  renderer.render(camera, scene, time_delta_s);
897
978
 
898
979
  frame_timer.add(raf_time_s);
@@ -49,16 +49,13 @@ wave/object checks. NSS uses the renderer's existing weight requirement and fall
49
49
  when weights have not been installed; this standalone page does not supply NSS weights.
50
50
 
51
51
  Inspection modes display prepared coverage, receiver UV, bounded path, classification/update count,
52
- surface radiance, residual, RGB throughput, shared front throughput, water's normalization term,
53
- and the confidence used to select the refraction lookup.
52
+ surface radiance, residual, RGB throughput, shared front throughput and water's normalization term.
54
53
  They replace presentation **after** shared resolve and temporal processing, so diagnostics show
55
54
  the current frame's measurements without TAA history. Internal-resolution measurements are
56
55
  displayed with nearest sampling at the output resolution.
57
56
  Shift-click requests one pixel from four prepared textures on the next frame; normal frames perform
58
57
  no readback. Arrays are `receiver=[u,v,path,status+updates/32]`,
59
58
  `transmission=[Tr,Tg,Tb,coverage]`, `radiance=[Wr,Wg,Wb,residual]`.
60
- The separate `confidence` field is the final weight after rejecting unsupported lookups; the
61
- confidence display reads this same weight rather than recomputing an approximation.
62
59
  Status 0 is a converged Newton hit; codes 8–13 are validated HZB hits, 16–21 undisplaced opaque fallbacks,
63
60
  24–29 bounded sky fallbacks, and 31 the below-interface control. The low three bits preserve the
64
61
  Newton miss reason: 0 none/not attempted, 1 bounds/clip, 2 sky, 3 parallel/invalid, 4 ray interval,
@@ -87,14 +84,12 @@ reflection and in-scattered radiance and its RGB transmittance; shared resolve a
87
84
  Rear transparent surfaces/particles are attenuated at their original screen positions. Their radiance
88
85
  is not sampled through the bent ray. Missing/off-screen receivers get bounded, explicit fallbacks.
89
86
  Missing receivers use the medium's extinction distance, bounded by the trace budget. Final shading
90
- fades the receiver UV toward the control UV around emergent silhouettes,
91
- shoreline visibility gaps and screen edges, then performs one geometry-aware color lookup. It derives
92
- water thickness from that lookup's local receiver plane and builds its complete optical event. It
93
- does not crossfade two displaced images. Three quarter-resolution passes form a conservative
94
- geometry/sky boundary mask and bounded Euclidean distance field. Isolated trace failures never seed
95
- that field, which would amplify them into large moving blotches. The raw receiver/residual displays
96
- still show classified misses; Refraction confidence shows the displacement fade actually used by
97
- the final image. Screen reflections also fade near the ray origin and frame
87
+ takes a validated receiver at its whole displacement, however near an object, the shore or the frame
88
+ edge it lies; a pixel without one shows its own undisplaced background. It then performs one
89
+ geometry-aware color lookup, derives water thickness from that lookup's local receiver plane and
90
+ builds its complete optical event. Nothing fades between the two lookups: any point between them is
91
+ one the ray never reached (see 2026-10-16 below). The raw receiver/residual displays show classified
92
+ misses. Screen reflections fade near the ray origin and frame
98
93
  edges to avoid self-hit speckles, reusing the existing SSR back-face/thickness/vignette validation.
99
94
  As in the paper, a converged Newton root is final: screen bounds plus the one-pixel and distance
100
95
  residuals accept it, with no further visibility proof. Like the paper's method it can converge past
@@ -105,6 +100,8 @@ mip dimensions, including odd viewport sizes; it does not assume a floating halv
105
100
  grid. It starts in the source pixel, since water is absent from opaque depth. HZB slab crossings
106
101
  are intersected once with the selected receiver plane and validated again before shading. A second
107
102
  Newton search here could jump past the first footprint to a root the traversal has ruled out.
103
+ Where that plane meets the ray past a floor's edge, over a texel that reads as sky, the texel the
104
+ traversal stopped on is validated on its own instead.
108
105
  An exhausted traversal uses the control event. Color filtering accepts only taps on the validated
109
106
  receiver's local plane, with geometric-normal and interface-side checks. Receiver selection retains
110
107
  full-precision UV/path/control-path data. Final shading reads the same selected interface and
@@ -113,6 +110,18 @@ AVBOIT still supplies the sole transparency resolve.
113
110
  Underwater transport, two-interface transport, transparent receivers and caustics remain the plan's
114
111
  follow-on stage, rather than being implied by the below-interface/overlap controls.
115
112
 
113
+ 2026-10-16: refraction has no fade. Three quarter-resolution passes used to slide the receiver UV
114
+ toward the pixel's own within 64 pixels of any dry pixel, emergent object or the sky, and near the
115
+ frame edge. On the Shore preset that faded 56 of 199 probed validated hits and removed 17 entirely,
116
+ and the slid lookup bent the floor into a ring around every post and the box. Seeding the fade from
117
+ pixels neither trace resolved instead pumped as the waves moved those failures: at the posts, 17.6
118
+ pixels a frame changed by more than 24 levels, against 0.8 with the old fade; seeding it in
119
+ proportion to the failures brought the rings back. Without any fade the floor stays straight and
120
+ the posts change 0.9 pixels a frame (16 stepped frames at 60 Hz, the default view, paired in one
121
+ page). What remains are the pixels whose rays pass behind a post: they show their own background,
122
+ in the post's outline displaced by the refraction offset. Filling them needs floor visible near the
123
+ post; the neighbours' offset lands on the post itself.
124
+
116
125
  The tangent-plane update follows the paper's Appendix A, but geometry reconstruction differs:
117
126
  Newton reads the unfiltered depth and geometric face normal at mip zero, rather than the paper's
118
127
  distance-dependent mip filtering for local smoothness. The conservative HZB is a visibility
@@ -131,10 +140,9 @@ the traversal for failed pixels and screen reflections.
131
140
  The main risks to check on target hardware are moving-wave temporal ghosts (water keeps the opaque
132
141
  depth/motion contract), coarse 8×8 volume attenuation near thin/partial edges, tangent-plane hits at
133
142
  depth discontinuities, and first activation of AVBOIT in otherwise opaque scenes. No paper performance
134
- claim is adopted; disocclusion fades and geometry-aware filtering add work to water rendering.
143
+ claim is adopted; geometry-aware filtering adds work to water rendering.
135
144
  Water transient targets cost approximately 68 bytes per internal pixel before allocator lifetime
136
- reuse, plus up to 0.375 bytes per pixel for the three quarter-resolution visibility fields:
137
- 32 bytes for receiver/trace metadata, 4 for interface depth, and 32 for final optics/background. The tiny-loss
145
+ reuse: 32 bytes for receiver/trace metadata, 4 for interface depth, and 32 for final optics/background. The tiny-loss
138
146
  throughput target is float32 and is read through unfilterable loads, so float32-filterable is unnecessary.
139
147
 
140
148
  The checker fixture uses 64 texels per square, preserving its world-space pattern while keeping
@@ -144,9 +152,9 @@ Numerical regressions execute production receiver/final-shading entries against
144
152
  transport, and water's volume splat through shared integration at full, partial and odd-edge coverage.
145
153
  They also cover the actual shared WGSL contribution/resolve, count conservation,
146
154
  normal-incidence acceptance, analytic plane/sphere intersections, invalid rays, bounded fallback thickness,
147
- geometry-only visibility seeds, single-lookup transport, subpixel receiver thickness,
148
- grazing visibility intervals, odd-dimension traversal crossings, receiver ownership at silhouettes,
149
- converged roots kept without a traversal budget, source/receiver frame-edge fades and old/new serialization.
155
+ subpixel receiver thickness, grazing visibility intervals, odd-dimension traversal crossings, a hit on the
156
+ floor texel before the sky, receiver ownership at silhouettes, converged roots kept without a traversal
157
+ budget and old/new serialization.
150
158
  Software-device orchestration verifies water precedes shared warp/integration/resolve without adding
151
159
  another one. Visual checks are complementary: inspect TAA/fog, mixed sources, below-interface fallback,
152
160
  overlap, no-water/MBOIT suppression, terrain replacement and device restart on a real GPU.
@@ -33,7 +33,7 @@ input[type=range]{width:135px}input[type=number]{width:84px}input,select,button,
33
33
  <label>Internal scale<select id="resolution"><option value="1">1×</option><option value=".75">0.75×</option><option value=".5">0.5×</option></select></label>
34
34
  <label>Opaque SSR<input id="ssr" type="checkbox"></label><label>Atmospheric fog<input id="fog" type="checkbox"></label>
35
35
  <label>Transparency<select id="transparency"><option value="avboit">AVBOIT</option><option value="mboit">MBOIT (water unavailable)</option></select></label>
36
- <h2>Inspect</h2><label>Display<select id="debug"><option value="0">Final composite</option><option value="1">Coverage</option><option value="2">Receiver UV</option><option value="3">Water path</option><option value="4">Trace status / updates</option><option value="5">Surface radiance</option><option value="6">Residual</option><option value="7">RGB throughput</option><option value="8">Shared front throughput</option><option value="9">Water normalization</option><option value="10">Refraction confidence</option></select></label>
36
+ <h2>Inspect</h2><label>Display<select id="debug"><option value="0">Final composite</option><option value="1">Coverage</option><option value="2">Receiver UV</option><option value="3">Water path</option><option value="4">Trace status / updates</option><option value="5">Surface radiance</option><option value="6">Residual</option><option value="7">RGB throughput</option><option value="8">Shared front throughput</option><option value="9">Water normalization</option></select></label>
37
37
  <div class="row"><button id="compile">Compile check</button><button id="profile">Profile (T)</button></div><pre id="probe">Shift-click water to read a pixel.</pre>
38
38
  <h2>Reproduce a view</h2><div class="row"><button id="copy">Copy state</button><button id="apply">Apply state</button></div><textarea id="state" aria-label="Saved camera and settings"></textarea>
39
39
  <p>Rear transparent radiance is attenuated on its original screen path. Initial optics select one water interface; underwater transport and caustics are follow-on work. <a href="./README.md">Review guide</a></p>