@woosh/meep-engine 3.39.0 → 3.41.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 (561) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts +24 -0
  4. package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts.map +1 -0
  5. package/src/core/geom/3d/quaternion/swing_twist_clamp.js +62 -0
  6. package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts +15 -0
  7. package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts.map +1 -0
  8. package/src/core/geom/3d/quaternion/swing_twist_compose.js +36 -0
  9. package/src/core/geom/3d/quaternion/swing_twist_error.d.ts +39 -0
  10. package/src/core/geom/3d/quaternion/swing_twist_error.d.ts.map +1 -0
  11. package/src/core/geom/3d/quaternion/swing_twist_error.js +85 -0
  12. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts +11 -6
  13. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts.map +1 -1
  14. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.js +27 -13
  15. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts +25 -0
  16. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts.map +1 -0
  17. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.js +166 -0
  18. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts +5 -3
  19. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts.map +1 -1
  20. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.js +5 -3
  21. package/src/engine/EngineHarness.d.ts.map +1 -1
  22. package/src/engine/EngineHarness.js +17 -4
  23. package/src/engine/animation/curve/AnimationCurve.d.ts +3 -0
  24. package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
  25. package/src/engine/animation/curve/AnimationCurve.js +6 -1
  26. package/src/engine/asset/loaders/image/avif/threaded_image_encoder.js +1 -1
  27. package/src/engine/ecs/EntityManager.d.ts +9 -1
  28. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  29. package/src/engine/ecs/EntityManager.js +26 -27
  30. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +20 -0
  31. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -1
  32. package/src/engine/ecs/gpu/GPUStateAuthority.js +21 -0
  33. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts +13 -0
  34. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts.map +1 -0
  35. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.js +12 -0
  36. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +6 -0
  37. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -1
  38. package/src/engine/ecs/gpu/gpu_authority_grant.js +7 -1
  39. package/src/engine/ecs/gpu/gpu_authority_held.d.ts +14 -0
  40. package/src/engine/ecs/gpu/gpu_authority_held.d.ts.map +1 -0
  41. package/src/engine/ecs/gpu/gpu_authority_held.js +23 -0
  42. package/src/engine/ecs/gpu/gpu_authority_hold.d.ts +23 -0
  43. package/src/engine/ecs/gpu/gpu_authority_hold.d.ts.map +1 -0
  44. package/src/engine/ecs/gpu/gpu_authority_hold.js +41 -0
  45. package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts +14 -0
  46. package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts.map +1 -0
  47. package/src/engine/ecs/gpu/gpu_authority_unhold.js +32 -0
  48. package/src/engine/ecs/ik/IKGoal.d.ts +59 -0
  49. package/src/engine/ecs/ik/IKGoal.d.ts.map +1 -0
  50. package/src/engine/ecs/ik/IKGoal.js +83 -0
  51. package/src/engine/ecs/ik/IKGoalSystem.d.ts +75 -0
  52. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -0
  53. package/src/engine/ecs/ik/IKGoalSystem.js +1456 -0
  54. package/src/engine/ecs/ik/PLAN.md +179 -0
  55. package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
  56. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  57. package/src/engine/ecs/storage/BinaryBufferSerializer.d.ts.map +1 -1
  58. package/src/engine/ecs/storage/BinaryBufferSerializer.js +4 -5
  59. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +7 -3
  60. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  61. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +5 -2
  62. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts +33 -0
  63. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts.map +1 -0
  64. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.js +282 -0
  65. package/src/engine/ecs/transform/T64WorldCache.js +139 -139
  66. package/src/engine/ecs/transform/t64_evaluate_local.d.ts +25 -0
  67. package/src/engine/ecs/transform/t64_evaluate_local.d.ts.map +1 -0
  68. package/src/engine/ecs/transform/t64_evaluate_local.js +35 -0
  69. package/src/engine/ecs/transform/t64_evaluate_world.d.ts +5 -3
  70. package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -1
  71. package/src/engine/ecs/transform/t64_evaluate_world.js +128 -126
  72. package/src/engine/graphics/ecs/water/Water.d.ts +14 -17
  73. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  74. package/src/engine/graphics/ecs/water/Water.js +100 -110
  75. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  76. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +36 -38
  77. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts +6 -0
  78. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts.map +1 -0
  79. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.js +10 -0
  80. package/src/engine/graphics/ecs/water/WaterWaves.d.ts +3 -3
  81. package/src/engine/graphics/ecs/water/WaterWaves.js +46 -46
  82. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -1
  83. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +8 -5
  84. package/src/engine/graphics3/AnimationGraphSystem.d.ts +2 -0
  85. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  86. package/src/engine/graphics3/AnimationGraphSystem.js +337 -329
  87. package/src/engine/graphics3/AnimationSystem.d.ts +2 -0
  88. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  89. package/src/engine/graphics3/AnimationSystem.js +360 -352
  90. package/src/engine/graphics3/WaterSystem.d.ts +21 -74
  91. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  92. package/src/engine/graphics3/WaterSystem.js +174 -367
  93. package/src/engine/physics/cloth/MEASUREMENTS.md +130 -0
  94. package/src/engine/physics/cloth/PLAN.md +16 -1
  95. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +5 -6
  96. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  97. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +5 -6
  98. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +4 -7
  99. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  100. package/src/engine/physics/cloth/ecs/ClothInstance.js +4 -7
  101. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +4 -3
  102. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  103. package/src/engine/physics/cloth/ecs/ClothSystem.js +4 -3
  104. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  105. package/src/engine/physics/cloth/ecs/ClothWorld.js +10 -0
  106. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +24 -24
  107. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  108. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +46 -43
  109. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +1 -1
  110. package/src/engine/physics/cloth/ecs/cloth_write_back.js +1 -1
  111. package/src/engine/physics/constraint/solve_constraints.d.ts +0 -35
  112. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  113. package/src/engine/physics/constraint/solve_constraints.js +1 -83
  114. package/src/engine/physics/ecs/ContactProbe.d.ts +73 -0
  115. package/src/engine/physics/ecs/ContactProbe.d.ts.map +1 -0
  116. package/src/engine/physics/ecs/ContactProbe.js +103 -0
  117. package/src/engine/physics/ecs/ContactProbeSystem.d.ts +44 -0
  118. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -0
  119. package/src/engine/physics/ecs/ContactProbeSystem.js +397 -0
  120. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +1 -1
  121. package/src/engine/physics/fluid/ecs/FluidComponent.js +1 -1
  122. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  123. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts +205 -0
  124. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts.map +1 -0
  125. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.js +245 -0
  126. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts +21 -0
  127. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts.map +1 -0
  128. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.js +63 -0
  129. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts +33 -0
  130. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -0
  131. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +874 -0
  132. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts +27 -0
  133. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts.map +1 -0
  134. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.js +77 -0
  135. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts +36 -0
  136. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts.map +1 -0
  137. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.js +97 -0
  138. package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts +33 -11
  139. package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts.map +1 -1
  140. package/src/engine/physics/inverse_kinematics/two_joint_ik.js +158 -67
  141. package/src/format/image/avif/api/convert_to_rgba.d.ts +2 -2
  142. package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
  143. package/src/format/image/avif/api/convert_to_rgba.js +10 -9
  144. package/src/format/image/avif/api/decode_avif.d.ts +2 -2
  145. package/src/format/image/avif/api/decode_avif.d.ts.map +1 -1
  146. package/src/format/image/avif/api/decode_avif.js +1 -1
  147. package/src/shade/playground/ssr_reprojection/README.md +111 -103
  148. package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -68
  149. package/src/shade/playground/ssr_reprojection/index.html +80 -79
  150. package/src/shade/playground/ssr_reprojection/main.js +256 -247
  151. package/src/shade/playground/ssr_variance/capture.js +96 -96
  152. package/src/shade/playground/ssr_variance/reference.js +78 -78
  153. package/src/shade/playground/vsm/README.md +96 -0
  154. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts +49 -0
  155. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -0
  156. package/src/shade/playground/vsm/VSMDebugOverlay.js +351 -0
  157. package/src/shade/playground/vsm/clipmap_panel.d.ts +8 -0
  158. package/src/shade/playground/vsm/clipmap_panel.d.ts.map +1 -0
  159. package/src/shade/playground/vsm/clipmap_panel.js +138 -0
  160. package/src/shade/playground/vsm/index.html +170 -0
  161. package/src/shade/playground/vsm/main.d.ts +2 -0
  162. package/src/shade/playground/vsm/main.d.ts.map +1 -0
  163. package/src/shade/playground/vsm/main.js +389 -0
  164. package/src/shade/playground/vsm/scenes.d.ts +52 -0
  165. package/src/shade/playground/vsm/scenes.d.ts.map +1 -0
  166. package/src/shade/playground/vsm/scenes.js +320 -0
  167. package/src/shade/playground/vsm/verify_vsm.d.ts +38 -0
  168. package/src/shade/playground/vsm/verify_vsm.d.ts.map +1 -0
  169. package/src/shade/playground/vsm/verify_vsm.js +305 -0
  170. package/src/shade/playground/water_refraction/README.md +57 -9
  171. package/src/shade/playground/water_refraction/main.js +12 -3
  172. package/src/shade/playground/water_refraction/world.d.ts +1 -0
  173. package/src/shade/playground/water_refraction/world.d.ts.map +1 -1
  174. package/src/shade/playground/water_refraction/world.js +15 -5
  175. package/src/shade/renderer/Renderer.d.ts +19 -0
  176. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  177. package/src/shade/renderer/Renderer.js +72 -1
  178. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.d.ts.map +1 -1
  179. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.js +10 -1
  180. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +18 -4
  181. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  182. package/src/shade/renderer/animation/GPUAnimationManager.js +269 -23
  183. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +12 -4
  184. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
  185. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +12 -4
  186. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  187. package/src/shade/renderer/animation/chunk_pose_accumulator.js +14 -1
  188. package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts +78 -0
  189. package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts.map +1 -0
  190. package/src/shade/renderer/animation/pose/PoseChannelIndex.js +274 -0
  191. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +40 -3
  192. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  193. package/src/shade/renderer/animation/pose/PosePlayback.js +77 -3
  194. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +21 -3
  195. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  196. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +79 -11
  197. package/src/shade/renderer/animation/shader_animation_apply.js +1 -1
  198. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts +3 -2
  199. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +187 -176
  201. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +7 -0
  202. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  203. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -0
  204. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -1
  205. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  206. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +10 -1
  207. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.d.ts.map +1 -1
  208. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.js +28 -0
  209. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.d.ts.map +1 -1
  210. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.js +31 -1
  211. package/src/shade/renderer/geometry/MeshletGeometry.d.ts +3 -0
  212. package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
  213. package/src/shade/renderer/geometry/MeshletGeometry.js +1 -0
  214. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  215. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +62 -4
  216. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  217. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.js +2 -2
  218. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts +2 -2
  219. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts.map +1 -1
  220. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js +6 -14
  221. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts.map +1 -1
  222. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js +5 -1
  223. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  224. package/src/shade/renderer/medium/ParticipatingMedium.d.ts +3 -0
  225. package/src/shade/renderer/medium/ParticipatingMedium.d.ts.map +1 -1
  226. package/src/shade/renderer/medium/ParticipatingMedium.js +7 -0
  227. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts +3 -1
  228. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts.map +1 -1
  229. package/src/shade/renderer/object_property/chunk_write_object_property.js +5 -2
  230. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +4 -0
  231. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  232. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +6 -1
  233. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.d.ts.map +1 -1
  234. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js +5 -35
  235. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  236. package/src/shade/renderer/postprocess/ssr/SSR.d.ts +12 -4
  237. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  238. package/src/shade/renderer/postprocess/ssr/SSR.js +36 -8
  239. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts +3 -0
  240. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts.map +1 -0
  241. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js +2 -0
  242. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts +8 -0
  243. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts.map +1 -0
  244. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js +40 -0
  245. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  246. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +150 -137
  247. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts +3 -0
  248. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts.map +1 -0
  249. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js +44 -0
  250. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts +5 -0
  251. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts.map +1 -0
  252. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js +35 -0
  253. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts +26 -0
  254. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts.map +1 -0
  255. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js +42 -0
  256. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +1 -0
  257. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
  258. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +113 -105
  259. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +2 -0
  260. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  261. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +177 -167
  262. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.d.ts.map +1 -1
  263. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js +10 -0
  264. package/src/shade/renderer/rasterize/RasterizationJob.d.ts +1 -2
  265. package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
  266. package/src/shade/renderer/rasterize/RasterizationJob.js +1 -2
  267. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +5 -6
  268. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  269. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +5 -6
  270. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +2 -2
  271. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  272. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +1 -1
  273. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
  274. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +11 -0
  275. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +1 -1
  276. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
  277. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +135 -73
  278. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +7 -0
  279. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
  280. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +29 -1
  281. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts +19 -0
  282. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts.map +1 -0
  283. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.js +167 -0
  284. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts +25 -0
  285. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts.map +1 -0
  286. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.js +124 -0
  287. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts +19 -0
  288. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts.map +1 -0
  289. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.js +48 -0
  290. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +17 -1
  291. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  292. package/src/shade/renderer/scene/rows/GPUSceneRows.js +29 -3
  293. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.d.ts.map +1 -1
  294. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.js +4 -5
  295. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.d.ts.map +1 -1
  296. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.js +1 -5
  297. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts +30 -0
  298. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts.map +1 -0
  299. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.js +54 -0
  300. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  301. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +3 -2
  302. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts +19 -0
  303. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts.map +1 -0
  304. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js +27 -0
  305. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +1 -0
  306. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  307. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -0
  308. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +54 -0
  309. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  310. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +502 -10
  311. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +3 -2
  312. package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
  313. package/src/shade/renderer/shadow/map/Shadowmap.js +3 -2
  314. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts +8 -0
  315. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map +1 -1
  316. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js +34 -3
  317. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +3 -2
  318. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
  319. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +17 -2
  320. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
  321. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +137 -133
  322. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts +15 -0
  323. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map +1 -0
  324. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js +14 -0
  325. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts +16 -0
  326. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts.map +1 -0
  327. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js +15 -0
  328. package/src/shade/renderer/shadow/vsm/PLAN.md +440 -0
  329. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +43 -0
  330. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +42 -0
  331. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +1 -0
  332. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +153 -0
  333. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +327 -0
  334. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -0
  335. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +1408 -0
  336. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts +14 -0
  337. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts.map +1 -0
  338. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.js +13 -0
  339. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts +63 -0
  340. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts.map +1 -0
  341. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.js +70 -0
  342. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts +11 -0
  343. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts.map +1 -0
  344. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.js +10 -0
  345. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +54 -0
  346. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +1 -0
  347. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +75 -0
  348. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts +23 -0
  349. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts.map +1 -0
  350. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.js +85 -0
  351. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts +16 -0
  352. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts.map +1 -0
  353. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.js +29 -0
  354. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +136 -25
  355. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
  356. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +282 -116
  357. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +39 -0
  358. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -0
  359. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +289 -0
  360. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts +18 -0
  361. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts.map +1 -0
  362. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.js +65 -0
  363. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts +17 -0
  364. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts.map +1 -0
  365. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.js +75 -0
  366. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +14 -0
  367. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +1 -0
  368. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +45 -0
  369. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts +17 -0
  370. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts.map +1 -0
  371. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.js +100 -0
  372. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts +15 -0
  373. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts.map +1 -0
  374. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.js +47 -0
  375. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts +26 -0
  376. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts.map +1 -0
  377. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.js +156 -0
  378. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts +13 -0
  379. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts.map +1 -0
  380. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.js +65 -0
  381. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +30 -0
  382. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +1 -0
  383. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +184 -0
  384. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +23 -0
  385. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +1 -0
  386. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +109 -0
  387. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts +56 -0
  388. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts.map +1 -0
  389. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +211 -0
  390. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts +1 -1
  391. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts.map +1 -1
  392. package/src/shade/renderer/texture/format/decode_typed_gpu_data.js +3 -13
  393. package/src/shade/renderer/texture/format/infer_format_from_parameters.d.ts.map +1 -1
  394. package/src/shade/renderer/texture/format/infer_format_from_parameters.js +2 -3
  395. package/src/shade/renderer/texture/texture_write_to_gpu.d.ts.map +1 -1
  396. package/src/shade/renderer/texture/texture_write_to_gpu.js +16 -16
  397. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts +4 -90
  398. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts.map +1 -1
  399. package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +6 -210
  400. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts +119 -0
  401. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts.map +1 -0
  402. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.js +245 -0
  403. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts +1 -1
  404. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts.map +1 -1
  405. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +3 -19
  406. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts +13 -0
  407. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts.map +1 -0
  408. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js +34 -0
  409. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +7 -2
  410. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  411. package/src/shade/renderer/water/GPUWaterRenderer.js +49 -49
  412. package/src/shade/renderer/water/chunk_water_transport.js +3 -3
  413. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +11 -25
  414. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  415. package/src/shade/renderer/water/medium/GPUWaterBodies.js +64 -116
  416. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts +1 -20
  417. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts.map +1 -1
  418. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.js +10 -42
  419. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts +3 -0
  420. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts.map +1 -0
  421. package/src/shade/renderer/water/medium/chunk_water_bodies.js +3 -0
  422. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +1 -5
  423. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +1 -1
  424. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +32 -30
  425. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +4 -0
  426. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -0
  427. package/src/shade/renderer/water/medium/shader_water_meshlets.js +69 -0
  428. package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts.map +1 -1
  429. package/src/shade/renderer/water/optics/chunk_water_inscatter.js +124 -123
  430. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  431. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +75 -74
  432. package/src/shade/renderer/water/shader_water.d.ts +1 -1
  433. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  434. package/src/shade/renderer/water/shader_water.js +490 -406
  435. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +12 -85
  436. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +1 -1
  437. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +128 -408
  438. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +6 -0
  439. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -0
  440. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +23 -0
  441. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +9 -0
  442. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +1 -0
  443. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +144 -0
  444. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +3 -5
  445. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +1 -1
  446. package/src/shade/renderer/water/surface/chunk_water_wave.js +40 -48
  447. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +14 -0
  448. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -0
  449. package/src/shade/renderer/water/surface/graph_water_tessellation.js +34 -0
  450. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +4 -0
  451. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +1 -0
  452. package/src/shade/renderer/water/surface/shader_water_tiles.js +123 -0
  453. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +6 -0
  454. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +1 -0
  455. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +85 -0
  456. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +6 -0
  457. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +1 -0
  458. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +83 -0
  459. package/src/shade/renderer/water/water_height_texture_from_sampler.d.ts.map +1 -1
  460. package/src/shade/renderer/water/water_height_texture_from_sampler.js +4 -3
  461. package/src/engine/ecs/ik/IKConstraint.d.ts +0 -52
  462. package/src/engine/ecs/ik/IKConstraint.d.ts.map +0 -1
  463. package/src/engine/ecs/ik/IKConstraint.js +0 -95
  464. package/src/engine/ecs/ik/IKProblem.d.ts +0 -45
  465. package/src/engine/ecs/ik/IKProblem.d.ts.map +0 -1
  466. package/src/engine/ecs/ik/IKProblem.js +0 -58
  467. package/src/engine/ecs/ik/IKSolver.d.ts +0 -8
  468. package/src/engine/ecs/ik/IKSolver.d.ts.map +0 -1
  469. package/src/engine/ecs/ik/IKSolver.js +0 -9
  470. package/src/engine/ecs/ik/InverseKinematics.d.ts +0 -48
  471. package/src/engine/ecs/ik/InverseKinematics.d.ts.map +0 -1
  472. package/src/engine/ecs/ik/InverseKinematics.js +0 -119
  473. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts +0 -19
  474. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts.map +0 -1
  475. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.js +0 -72
  476. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts +0 -54
  477. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +0 -1
  478. package/src/engine/ecs/ik/InverseKinematicsSystem.js +0 -212
  479. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts +0 -8
  480. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +0 -1
  481. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +0 -153
  482. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts +0 -5
  483. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +0 -1
  484. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +0 -120
  485. package/src/engine/ecs/ik/ik_bone_chain.d.ts +0 -64
  486. package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +0 -1
  487. package/src/engine/ecs/ik/ik_bone_chain.js +0 -142
  488. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +0 -42
  489. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +0 -1
  490. package/src/engine/ecs/ik/ik_probe_terrain_contact.js +0 -123
  491. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +0 -18
  492. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +0 -1
  493. package/src/engine/ecs/ik/ik_write_local_rotation.js +0 -32
  494. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts +0 -2
  495. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts.map +0 -1
  496. package/src/engine/graphics/ecs/water/WATER_SIZE.js +0 -1
  497. package/src/shade/renderer/light/GPUViewLightContext.d.ts +0 -22
  498. package/src/shade/renderer/light/GPUViewLightContext.d.ts.map +0 -1
  499. package/src/shade/renderer/light/GPUViewLightContext.js +0 -62
  500. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts +0 -14
  501. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts.map +0 -1
  502. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.js +0 -20
  503. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts +0 -27
  504. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +0 -1
  505. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +0 -147
  506. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts +0 -7
  507. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts.map +0 -1
  508. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.js +0 -10
  509. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts +0 -2
  510. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts.map +0 -1
  511. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.js +0 -1
  512. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts +0 -3
  513. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts.map +0 -1
  514. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.js +0 -8
  515. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts +0 -27
  516. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts.map +0 -1
  517. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.js +0 -102
  518. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts +0 -8
  519. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts.map +0 -1
  520. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.js +0 -34
  521. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts +0 -10
  522. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts.map +0 -1
  523. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.js +0 -64
  524. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts +0 -11
  525. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts.map +0 -1
  526. package/src/shade/renderer/shadow/vsm/decode_tile_address.js +0 -26
  527. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts +0 -2
  528. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts.map +0 -1
  529. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.js +0 -11
  530. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts +0 -20
  531. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts.map +0 -1
  532. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.js +0 -184
  533. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts +0 -25
  534. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts.map +0 -1
  535. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.js +0 -230
  536. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts +0 -19
  537. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts.map +0 -1
  538. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.js +0 -127
  539. package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +0 -462
  540. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts +0 -23
  541. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts.map +0 -1
  542. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts +0 -18
  543. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts.map +0 -1
  544. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts +0 -12
  545. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts.map +0 -1
  546. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.js +0 -27
  547. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts +0 -14
  548. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts.map +0 -1
  549. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.js +0 -49
  550. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts +0 -9
  551. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts.map +0 -1
  552. package/src/shade/renderer/water/surface/chunk_water_wave_grid.js +0 -47
  553. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts +0 -10
  554. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts.map +0 -1
  555. package/src/shade/renderer/water/surface/shader_water_surface_write.js +0 -51
  556. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts +0 -12
  557. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts.map +0 -1
  558. package/src/shade/renderer/water/surface/shader_water_wave_step.js +0 -54
  559. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts +0 -13
  560. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts.map +0 -1
  561. package/src/shade/renderer/water/surface/water_surface_grid_indices.js +0 -39
@@ -1,96 +1,96 @@
1
- import { RenderExtension } from "../../renderer/extension/RenderExtension.js";
2
- import { FramePhase } from "../../renderer/extension/FramePhase.js";
3
- import { SceneColor } from "../../renderer/extension/SceneColor.js";
4
- import { ImageShader } from "../../renderer/shader/ImageShader.js";
5
- import { CodeChunk } from "../../renderer/shader/compiler/CodeChunk.js";
6
- import { chunk_decode_g_buffer_normal } from "../../renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
7
- import { graph_image_pass } from "../../renderer/shader/graph/graph_image_pass.js";
8
- import { graph_import_texture } from "../../renderer/shader/graph/graph_import_texture.js";
9
- import { ShaderResourceSetDescriptor } from "../../renderer/shader/resource/ShaderResourceSetDescriptor.js";
10
- import { ShaderDescriptor } from "../../renderer/shader/ShaderDescriptor.js";
11
- import { GPUTextureContext } from "../../renderer/texture/GPUTextureContext.js";
12
- import { download_texture_data } from "../../renderer/texture/download_texture_data.js";
13
-
14
- const resources = new ShaderResourceSetDescriptor();
15
- resources.createGroup().addTexture('tSource', 'unfilterable-float').addTexture('tNormal', 'uint');
16
- const shader = new ImageShader({
17
- descriptor: ShaderDescriptor.from({ label: 'SSR variance / capture', resources,
18
- body: CodeChunk.from(/* language=WGSL */ `
19
- struct Capture { @location(0) radiance: vec4f, @location(1) mask: vec4f }
20
- @fragment fn main(@builtin(position) coord: vec4f) -> Capture {
21
- let p = vec2i(coord.xy);
22
- var output: Capture;
23
- output.radiance = textureLoad(tSource, p, 0);
24
- output.mask = vec4f(select(0.0, 1.0, decode_g_buffer_normal(textureLoad(tNormal, p, 0).xy).y > 0.99));
25
- return output;
26
- }`, [chunk_decode_g_buffer_normal]) }),
27
- targets: [{ format: 'rgba32float' }, { format: 'rgba32float' }],
28
- });
29
-
30
- /** TAA-off currently leaves raster jitter active. Freeze only this lab's view before rasterization. */
31
- export class FixedProjection extends RenderExtension {
32
- name = 'SSR variance / fixed projection';
33
- phase = FramePhase.FrameStart;
34
- record(frame) {
35
- frame.view.setJitter(0, 0);
36
- frame.view.camera.setViewportOffset(0, 0);
37
- frame.view.camera.update();
38
- frame.view.update_uniforms();
39
- }
40
- }
41
-
42
- /** Exact textureLoad copies of production SSR stages, only on requested frames. */
43
- export class CaptureSSR extends RenderExtension {
44
- name = 'SSR variance / capture';
45
- phase = FramePhase.BeforePresent;
46
- enabled = false;
47
- textures = new Map();
48
- constructor(device) { super(); this.device = device; }
49
- record(frame) {
50
- if (!this.enabled) { return; }
51
- this.jitter = Array.from(frame.view.jitter);
52
- const passes = frame.graph.__pass_nodes;
53
- const resolve = passes.find(p => p.name === 'SSR resolve / IBL');
54
- const spatial1 = passes.find(p => p.name === 'SSR / spatial denoise with metadata');
55
- const temporal = passes.find(p => p.name === 'SSR Reproject');
56
- const spatial = passes.filter(p => p.name === 'SSR / spatial denoise');
57
- const taa = passes.find(p => p.name === 'TAA');
58
- if (!resolve || !temporal) { throw new Error('SSR stages missing from the frame graph'); }
59
- const resolved = resolve.data['@output'][0];
60
- const reprojected = temporal.data['@output'][0];
61
- const stages = {
62
- resolve: resolved,
63
- spatial1: spatial1?.data['@output'][0] ?? resolved,
64
- temporal: reprojected,
65
- spatial2: spatial[0]?.data['@output'][0] ?? reprojected,
66
- spatial4: spatial[1]?.data['@output'][0] ?? reprojected,
67
- 'pre-taa': taa?.data.ColourTexture ?? frame.get(SceneColor).color,
68
- scene: frame.get(SceneColor).color,
69
- };
70
- const [width, height] = frame.resolution;
71
- const texture = name => {
72
- let t = this.textures.get(name);
73
- if (!t || t.width !== width || t.height !== height) {
74
- t?.destroy();
75
- t = GPUTextureContext.fromTexture(this.device.createTexture({
76
- label: `SSR variance / ${name}`, size: [width, height, 1], format: 'rgba32float',
77
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
78
- }), this.device);
79
- this.textures.set(name, t);
80
- }
81
- return graph_import_texture(frame.graph, t, `SSR variance / ${name}`);
82
- };
83
- let mask = texture('mask');
84
- for (const [name, handle] of Object.entries(stages)) {
85
- [, mask] = graph_image_pass({ graph: frame.graph, shader,
86
- inputs: { tSource: handle, tNormal: resolve.data.tNormal }, output: [texture(name), mask] });
87
- }
88
- }
89
- async read() {
90
- const result = {};
91
- for (const [name, texture] of this.textures) {
92
- result[name] = await download_texture_data({ device: this.device, source: texture.gpu_texture });
93
- }
94
- return result;
95
- }
96
- }
1
+ import { RenderExtension } from "../../renderer/extension/RenderExtension.js";
2
+ import { FramePhase } from "../../renderer/extension/FramePhase.js";
3
+ import { SceneColor } from "../../renderer/extension/SceneColor.js";
4
+ import { ImageShader } from "../../renderer/shader/ImageShader.js";
5
+ import { CodeChunk } from "../../renderer/shader/compiler/CodeChunk.js";
6
+ import { chunk_decode_g_buffer_normal } from "../../renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
7
+ import { graph_image_pass } from "../../renderer/shader/graph/graph_image_pass.js";
8
+ import { graph_import_texture } from "../../renderer/shader/graph/graph_import_texture.js";
9
+ import { ShaderResourceSetDescriptor } from "../../renderer/shader/resource/ShaderResourceSetDescriptor.js";
10
+ import { ShaderDescriptor } from "../../renderer/shader/ShaderDescriptor.js";
11
+ import { GPUTextureContext } from "../../renderer/texture/GPUTextureContext.js";
12
+ import { download_texture_data } from "../../renderer/texture/download_texture_data.js";
13
+
14
+ const resources = new ShaderResourceSetDescriptor();
15
+ resources.createGroup().addTexture('tSource', 'unfilterable-float').addTexture('tNormal', 'uint');
16
+ const shader = new ImageShader({
17
+ descriptor: ShaderDescriptor.from({ label: 'SSR variance / capture', resources,
18
+ body: CodeChunk.from(/* language=WGSL */ `
19
+ struct Capture { @location(0) radiance: vec4f, @location(1) mask: vec4f }
20
+ @fragment fn main(@builtin(position) coord: vec4f) -> Capture {
21
+ let p = vec2i(coord.xy);
22
+ var output: Capture;
23
+ output.radiance = textureLoad(tSource, p, 0);
24
+ output.mask = vec4f(select(0.0, 1.0, decode_g_buffer_normal(textureLoad(tNormal, p, 0).xy).y > 0.99));
25
+ return output;
26
+ }`, [chunk_decode_g_buffer_normal]) }),
27
+ targets: [{ format: 'rgba32float' }, { format: 'rgba32float' }],
28
+ });
29
+
30
+ /** TAA-off currently leaves raster jitter active. Freeze only this lab's view before rasterization. */
31
+ export class FixedProjection extends RenderExtension {
32
+ name = 'SSR variance / fixed projection';
33
+ phase = FramePhase.FrameStart;
34
+ record(frame) {
35
+ frame.view.setJitter(0, 0);
36
+ frame.view.camera.setViewportOffset(0, 0);
37
+ frame.view.camera.update();
38
+ frame.view.update_uniforms();
39
+ }
40
+ }
41
+
42
+ /** Exact textureLoad copies of production SSR stages, only on requested frames. */
43
+ export class CaptureSSR extends RenderExtension {
44
+ name = 'SSR variance / capture';
45
+ phase = FramePhase.BeforePresent;
46
+ enabled = false;
47
+ textures = new Map();
48
+ constructor(device) { super(); this.device = device; }
49
+ record(frame) {
50
+ if (!this.enabled) { return; }
51
+ this.jitter = Array.from(frame.view.jitter);
52
+ const passes = frame.graph.__pass_nodes;
53
+ const resolve = passes.find(p => p.name === 'SSR resolve / IBL');
54
+ const spatial1 = passes.find(p => p.name.startsWith('SSR / spatial denoise with metadata'));
55
+ const temporal = passes.find(p => p.name.startsWith('SSR Reproject'));
56
+ const spatial = passes.filter(p => p.name === 'SSR / spatial denoise' || p.name === 'SSR / spatial denoise / tiles');
57
+ const taa = passes.find(p => p.name === 'TAA');
58
+ if (!resolve || !temporal) { throw new Error('SSR stages missing from the frame graph'); }
59
+ const resolved = resolve.data['@output'][0];
60
+ const reprojected = temporal.data['@output'][0];
61
+ const stages = {
62
+ resolve: resolved,
63
+ spatial1: spatial1?.data['@output'][0] ?? resolved,
64
+ temporal: reprojected,
65
+ spatial2: spatial[0]?.data['@output'][0] ?? reprojected,
66
+ spatial4: spatial[1]?.data['@output'][0] ?? reprojected,
67
+ 'pre-taa': taa?.data.ColourTexture ?? frame.get(SceneColor).color,
68
+ scene: frame.get(SceneColor).color,
69
+ };
70
+ const [width, height] = frame.resolution;
71
+ const texture = name => {
72
+ let t = this.textures.get(name);
73
+ if (!t || t.width !== width || t.height !== height) {
74
+ t?.destroy();
75
+ t = GPUTextureContext.fromTexture(this.device.createTexture({
76
+ label: `SSR variance / ${name}`, size: [width, height, 1], format: 'rgba32float',
77
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
78
+ }), this.device);
79
+ this.textures.set(name, t);
80
+ }
81
+ return graph_import_texture(frame.graph, t, `SSR variance / ${name}`);
82
+ };
83
+ let mask = texture('mask');
84
+ for (const [name, handle] of Object.entries(stages)) {
85
+ [, mask] = graph_image_pass({ graph: frame.graph, shader,
86
+ inputs: { tSource: handle, tNormal: resolve.data.tNormal }, output: [texture(name), mask] });
87
+ }
88
+ }
89
+ async read() {
90
+ const result = {};
91
+ for (const [name, texture] of this.textures) {
92
+ result[name] = await download_texture_data({ device: this.device, source: texture.gpu_texture });
93
+ }
94
+ return result;
95
+ }
96
+ }
@@ -1,78 +1,78 @@
1
- import { RenderExtension } from "../../renderer/extension/RenderExtension.js";
2
- import { ImageShader } from "../../renderer/shader/ImageShader.js";
3
- import { CodeChunk } from "../../renderer/shader/compiler/CodeChunk.js";
4
- import { ShaderDescriptor } from "../../renderer/shader/ShaderDescriptor.js";
5
- import { ShaderResourceSetDescriptor } from "../../renderer/shader/resource/ShaderResourceSetDescriptor.js";
6
- import { WebGPUStruct } from "../../renderer/shader/type/WebGPUStruct.js";
7
- import { f32 } from "../../renderer/shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
8
- import { graph_image_pass } from "../../renderer/shader/graph/graph_image_pass.js";
9
- import { graph_import_texture } from "../../renderer/shader/graph/graph_import_texture.js";
10
- import { GPUTextureContext } from "../../renderer/texture/GPUTextureContext.js";
11
- import { download_texture_data } from "../../renderer/texture/download_texture_data.js";
12
-
13
- const settings = WebGPUStruct.from({ count: f32 });
14
- const resources = new ShaderResourceSetDescriptor();
15
- resources.setImmediate('settings', settings);
16
- resources.createGroup().addTexture('tInput', 'unfilterable-float').addTexture('tPrevious', 'unfilterable-float');
17
- const shader = new ImageShader({ descriptor: ShaderDescriptor.from({
18
- label: 'SSR lab / later-sample reference', resources,
19
- body: CodeChunk.from(/* language=WGSL */ `
20
- @fragment fn main(@builtin(position) coord: vec4f) -> @location(0) vec4f {
21
- let p = vec2i(coord.xy);
22
- let sample = textureLoad(tInput, p, 0);
23
- if (settings.count <= 1.0) { return sample; }
24
- let previous = textureLoad(tPrevious, p, 0);
25
- return previous + (sample - previous) / settings.count;
26
- }`, [settings.declaration_chunk]),
27
- }), targets: [{ format: 'rgba32float' }] });
28
-
29
- /** Unclipped float32 average of later pre-temporal samples, never fed into rendering. */
30
- export class ReflectionReference extends RenderExtension {
31
- name = 'SSR lab / later-sample reference';
32
- enabled = false;
33
- count = 0;
34
- textures = [];
35
- constructor(device) { super(); this.device = device; }
36
- record(frame) {
37
- if (!this.enabled) { return; }
38
- const temporal = frame.graph.__pass_nodes.find(p => p.name === 'SSR Reproject');
39
- if (!temporal) { throw new Error('SSR is required for a reflection reference'); }
40
- if (!this.textures.length) {
41
- for (let i = 0; i < 2; i++) {
42
- this.textures.push(GPUTextureContext.fromTexture(this.device.createTexture({
43
- size: [frame.resolution[0], frame.resolution[1], 1], format: 'rgba32float',
44
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
45
- }), this.device));
46
- }
47
- }
48
- const index = this.count % 2;
49
- const previous = graph_import_texture(frame.graph, this.textures[1 - index], 'SSR reference previous');
50
- const output = graph_import_texture(frame.graph, this.textures[index], 'SSR reference output');
51
- graph_image_pass({ graph: frame.graph, shader,
52
- inputs: { tInput: temporal.data.tInput, tPrevious: previous, settings: { count: this.count + 1 } },
53
- output: [output] });
54
- this.count++;
55
- }
56
- async read() {
57
- if (!this.count) { throw new Error('Reference has no samples'); }
58
- return download_texture_data({ device: this.device,
59
- source: this.textures[(this.count - 1) % 2].gpu_texture });
60
- }
61
- }
62
-
63
- export function reflection_error(sample, reference, mask, width, height) {
64
- let count = 0, squared_error = 0, bias = 0;
65
- for (let y = Math.floor(height * 0.5); y < Math.floor(height * 0.92); y++) {
66
- for (let x = Math.floor(width * 0.25); x < Math.floor(width * 0.75); x++) {
67
- const p = (y * width + x) * 4;
68
- if (mask[p] <= 0.5) { continue; }
69
- const error = (sample[p] - reference[p]) * 0.2126
70
- + (sample[p + 1] - reference[p + 1]) * 0.7152
71
- + (sample[p + 2] - reference[p + 2]) * 0.0722;
72
- if (!Number.isFinite(error)) { throw new Error('Non-finite convergence sample'); }
73
- squared_error += error * error; bias += error; count++;
74
- }
75
- }
76
- if (!count) { throw new Error('No reflection pixels in convergence sample'); }
77
- return { pixels: count, mse: squared_error / count, rmse: Math.sqrt(squared_error / count), bias: bias / count };
78
- }
1
+ import { RenderExtension } from "../../renderer/extension/RenderExtension.js";
2
+ import { ImageShader } from "../../renderer/shader/ImageShader.js";
3
+ import { CodeChunk } from "../../renderer/shader/compiler/CodeChunk.js";
4
+ import { ShaderDescriptor } from "../../renderer/shader/ShaderDescriptor.js";
5
+ import { ShaderResourceSetDescriptor } from "../../renderer/shader/resource/ShaderResourceSetDescriptor.js";
6
+ import { WebGPUStruct } from "../../renderer/shader/type/WebGPUStruct.js";
7
+ import { f32 } from "../../renderer/shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
8
+ import { graph_image_pass } from "../../renderer/shader/graph/graph_image_pass.js";
9
+ import { graph_import_texture } from "../../renderer/shader/graph/graph_import_texture.js";
10
+ import { GPUTextureContext } from "../../renderer/texture/GPUTextureContext.js";
11
+ import { download_texture_data } from "../../renderer/texture/download_texture_data.js";
12
+
13
+ const settings = WebGPUStruct.from({ count: f32 });
14
+ const resources = new ShaderResourceSetDescriptor();
15
+ resources.setImmediate('settings', settings);
16
+ resources.createGroup().addTexture('tInput', 'unfilterable-float').addTexture('tPrevious', 'unfilterable-float');
17
+ const shader = new ImageShader({ descriptor: ShaderDescriptor.from({
18
+ label: 'SSR lab / later-sample reference', resources,
19
+ body: CodeChunk.from(/* language=WGSL */ `
20
+ @fragment fn main(@builtin(position) coord: vec4f) -> @location(0) vec4f {
21
+ let p = vec2i(coord.xy);
22
+ let sample = textureLoad(tInput, p, 0);
23
+ if (settings.count <= 1.0) { return sample; }
24
+ let previous = textureLoad(tPrevious, p, 0);
25
+ return previous + (sample - previous) / settings.count;
26
+ }`, [settings.declaration_chunk]),
27
+ }), targets: [{ format: 'rgba32float' }] });
28
+
29
+ /** Unclipped float32 average of later pre-temporal samples, never fed into rendering. */
30
+ export class ReflectionReference extends RenderExtension {
31
+ name = 'SSR lab / later-sample reference';
32
+ enabled = false;
33
+ count = 0;
34
+ textures = [];
35
+ constructor(device) { super(); this.device = device; }
36
+ record(frame) {
37
+ if (!this.enabled) { return; }
38
+ const temporal = frame.graph.__pass_nodes.find(p => p.name.startsWith('SSR Reproject'));
39
+ if (!temporal) { throw new Error('SSR is required for a reflection reference'); }
40
+ if (!this.textures.length) {
41
+ for (let i = 0; i < 2; i++) {
42
+ this.textures.push(GPUTextureContext.fromTexture(this.device.createTexture({
43
+ size: [frame.resolution[0], frame.resolution[1], 1], format: 'rgba32float',
44
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
45
+ }), this.device));
46
+ }
47
+ }
48
+ const index = this.count % 2;
49
+ const previous = graph_import_texture(frame.graph, this.textures[1 - index], 'SSR reference previous');
50
+ const output = graph_import_texture(frame.graph, this.textures[index], 'SSR reference output');
51
+ graph_image_pass({ graph: frame.graph, shader,
52
+ inputs: { tInput: temporal.data.tInput, tPrevious: previous, settings: { count: this.count + 1 } },
53
+ output: [output] });
54
+ this.count++;
55
+ }
56
+ async read() {
57
+ if (!this.count) { throw new Error('Reference has no samples'); }
58
+ return download_texture_data({ device: this.device,
59
+ source: this.textures[(this.count - 1) % 2].gpu_texture });
60
+ }
61
+ }
62
+
63
+ export function reflection_error(sample, reference, mask, width, height) {
64
+ let count = 0, squared_error = 0, bias = 0;
65
+ for (let y = Math.floor(height * 0.5); y < Math.floor(height * 0.92); y++) {
66
+ for (let x = Math.floor(width * 0.25); x < Math.floor(width * 0.75); x++) {
67
+ const p = (y * width + x) * 4;
68
+ if (mask[p] <= 0.5) { continue; }
69
+ const error = (sample[p] - reference[p]) * 0.2126
70
+ + (sample[p + 1] - reference[p + 1]) * 0.7152
71
+ + (sample[p + 2] - reference[p + 2]) * 0.0722;
72
+ if (!Number.isFinite(error)) { throw new Error('Non-finite convergence sample'); }
73
+ squared_error += error * error; bias += error; count++;
74
+ }
75
+ }
76
+ if (!count) { throw new Error('No reflection pixels in convergence sample'); }
77
+ return { pixels: count, mse: squared_error / count, rmse: Math.sqrt(squared_error / count), bias: bias / count };
78
+ }
@@ -0,0 +1,96 @@
1
+ # Virtual shadow maps
2
+
3
+ `npm run dev`, then `/src/shade/playground/vsm/`.
4
+
5
+ A directional light's virtual shadow map — a clipmap of 128-texel pages around the camera, rendered
6
+ into a pool in the shadow atlas as the view asks for them and as moving casters make them stale,
7
+ under a budget of page updates per frame. The design is in
8
+ `src/shade/renderer/shadow/vsm/PLAN.md`.
9
+
10
+ ## Scenes
11
+
12
+ * **Courtyard.** Structure at every scale the clipmap covers: 5 cm fence slats by the camera, pillars
13
+ and walls, an overhang, thin poles twenty metres off, and an avenue reaching two hundred metres.
14
+ The movers each exercise a different case of the GPU mover pass:
15
+ - orbiting boxes (translation);
16
+ - a bobbing column;
17
+ - a turning bar (a rotation about its own centre);
18
+ - a block that blinks in and out of the scene (a row appearing and leaving).
19
+ * **Crowd.** N wandering boxes, adjustable from 50 to 6000, added to or taken from the same scene.
20
+ Past 4096 the mover list overflows and every occupied page is taken to be stale, which the stats
21
+ say.
22
+
23
+ ## Controls
24
+
25
+ * **Technique.** Virtual shadow map, or the engine's cascades for an A/B comparison in the same
26
+ scene.
27
+ * **Page updates per frame.** `Renderer.shadow_virtual_page_budget`. Pages wanted beyond it wait,
28
+ best first:
29
+ - covers for unshadowed pixels come first;
30
+ - then stale and missing pages, by the importance of the pixels asking × frames waited. A
31
+ pixel's importance is its weight under the automatic exposure's metering mask: full over most of
32
+ the screen, falling toward its edges, so the middle of the view resolves first.
33
+ * **LOD bias, finest texel.** `shadow_virtual_lod_bias`, `shadow_virtual_first_texel_size`. The texel
34
+ size rebuilds the map.
35
+ * **Pause page updates** sets the budget to 0: no page is drawn or installed, so a stale page stays
36
+ as it was last drawn and a missing one stays missing. Pages still leave when the camera scrolls
37
+ their window past them, and all of them when the sun turns.
38
+ * **Sweep the sun / Nudge the sun.** Any change of light direction invalidates every page; see
39
+ "Known limits" in the plan.
40
+
41
+ ## Debug views
42
+
43
+ * **Overlay** — what shadows each pixel. It runs the same lookup the lighting does:
44
+ - **Serving level**: the level of the page that shadows the pixel, red (finest) through to violet.
45
+ - **Resolution deficit**: how many levels coarser that page is than the level the pixel asked for.
46
+ Green means exactly the level asked for, yellow one coarser, orange two, red more. Magenta means
47
+ nothing resident covers the pixel at all.
48
+ - **Page IDs and edges**: a colour per page, its edges drawn at its own resolution.
49
+ * **Physical pool inset** (bottom left): every slot of the pool, its depth banded every 2 m along the
50
+ light. Slot edges are tinted by the page's level, and grey where the slot is empty. A slot the page
51
+ manager holds stale (a mover crossed it and it has not been drawn since) is washed red all over.
52
+ * **Clipmap panel**: the CPU's view of each level's window, one pixel per page, light-space y up.
53
+ - green: resident; white: drawn this frame; red: stale;
54
+ - amber: wanted by the latest reading and missing;
55
+ - cyan cross: the camera.
56
+
57
+ "Panel shows" picks one level, drawn large.
58
+ * **State**: what the page manager did. This frame: pages drawn and waiting. The latest reading:
59
+ wanted, uncovered, dropped. Also movers, stale marks, installs and evictions, invalidations, and
60
+ readbacks in flight.
61
+
62
+ `T` records a GPU profile (`.sgpt`).
63
+
64
+ ## Console
65
+
66
+ * `vsm_lab.map()` is the `VirtualShadowMap`; `vsm_lab.stats()` copies its page manager's stats.
67
+ * `await vsm_lab.configure({ id: value, … })` sets controls by element id; a `scene` or `crowd`
68
+ change is in place when it resolves.
69
+ * `vsm_lab.frame_preset('near' | 'overview' | 'avenue' | 'crowd')`.
70
+ * `await verify()` holds the movers and the sun still and waits for the pages to settle: a reading
71
+ recorded after the stop that asks for pages and leaves nothing uncovered or waiting. It then holds
72
+ page updates, reads the light database back from the GPU, and checks:
73
+ - every row the map claimed came back, and its record names its runs and depth range;
74
+ - every page-table entry, slot row and window corner equals the CPU's;
75
+ - on the GPU alone, every resident entry's slot holds a page of the entry's own cell;
76
+ - no page is held twice.
77
+
78
+ It returns `{ pass, checks, stats }`, and puts the controls back as they were.
79
+
80
+ ## Measured (RTX 4090, headless Chrome, 1600×900, 2026-10-04)
81
+
82
+ Courtyard, near camera, movers animating. GPU time per frame, paired arms in one launch:
83
+
84
+ | arm | frame p50 | pages drawn / frame |
85
+ |---|---|---|
86
+ | VSM, budget 0 (feedback only) | 734–758 µs | 0 |
87
+ | VSM, budget 1 | 779–795 µs | 1.0 |
88
+ | VSM, budget 8 | 1072–1076 µs | 7.1–7.5 |
89
+ | cascades (3) | 1273–1305 µs | — |
90
+
91
+ - The feedback passes (`VSM/*`) cost about 59 µs a frame, 46 µs of it the demand pass at 1600×900.
92
+ - A page costs about 40–45 µs of GPU time and about 85 µs of CPU in `render()`. CPU p50 per frame
93
+ is 1.3 ms at budget 0, 2.0 ms at budget 8, 2.0 ms with cascades, and 3.1–3.3 ms at budget 32 (17
94
+ pages drawn).
95
+ - `verify()` passes: settled four frames after the movers stopped; 49,152 page-table entries, 900
96
+ slots and 12 windows agree.
@@ -0,0 +1,49 @@
1
+ /**
2
+ * What the overlay shows over the picture.
3
+ */
4
+ export type VSMDebugView = number;
5
+ export namespace VSMDebugView {
6
+ let None: number;
7
+ let ServingLevel: number;
8
+ let Deficit: number;
9
+ let Pages: number;
10
+ }
11
+ /**
12
+ * The playground's view into a virtual shadow map, drawn over the frame before it is presented:
13
+ * a tint per pixel saying what shadows it ({@link VSMDebugView}), and an inset of the physical pool
14
+ * — every slot's depth, its edge tinted by its page's level, washed red where the page manager holds
15
+ * it stale (a mover crossed it and it has not been drawn since), its edge grey where it is empty.
16
+ *
17
+ * The tint runs the lighting's own page lookup on the frame's light database rows, so the page it
18
+ * names for a pixel is the page the lighting samples there. The stale state is the CPU's, uploaded
19
+ * each frame the inset is drawn.
20
+ */
21
+ export class VSMDebugOverlay extends RenderExtension {
22
+ /**
23
+ * @param {import("../../renderer/GraphicsContext.js").GraphicsContext} graphics
24
+ */
25
+ constructor(graphics: import("../../renderer/GraphicsContext.js").GraphicsContext);
26
+ /**
27
+ * @type {number} a {@link VSMDebugView}
28
+ */
29
+ mode: number;
30
+ /**
31
+ * Whether to draw the pool inset.
32
+ * @type {boolean}
33
+ */
34
+ inset: boolean;
35
+ /**
36
+ * The map to show; the overlay draws nothing without one.
37
+ * @type {import("../../renderer/shadow/vsm/VirtualShadowMap.js").VirtualShadowMap|null}
38
+ */
39
+ map: import("../../renderer/shadow/vsm/VirtualShadowMap.js").VirtualShadowMap | null;
40
+ /**
41
+ * The shadow context whose atlas the map's pool is in.
42
+ * @type {import("../../renderer/shadow/map/GPUSceneShadowmapContext.js").GPUSceneShadowmapContext|null}
43
+ */
44
+ shadows: import("../../renderer/shadow/map/GPUSceneShadowmapContext.js").GPUSceneShadowmapContext | null;
45
+ destroy(): void;
46
+ #private;
47
+ }
48
+ import { RenderExtension } from "../../renderer/extension/RenderExtension.js";
49
+ //# sourceMappingURL=VSMDebugOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VSMDebugOverlay.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/vsm/VSMDebugOverlay.js"],"names":[],"mappings":";;;2BAyBU,MAAM;;;;;;;AA2LhB;;;;;;;;;GASG;AACH;IAuCI;;OAEG;IACH,sBAFW,OAAO,mCAAmC,EAAE,eAAe,EAMrE;IAzCD;;OAEG;IACH,MAFU,MAAM,CAES;IAEzB;;;OAGG;IACH,OAFU,OAAO,CAEH;IAEd;;;OAGG;IACH,KAFU,OAAO,+CAA+C,EAAE,gBAAgB,GAAC,IAAI,CAE5E;IAEX;;;OAGG;IACH,SAFU,OAAO,uDAAuD,EAAE,wBAAwB,GAAC,IAAI,CAExF;IAiGf,gBAIC;;CACJ;gCA3V+B,6CAA6C"}