@woosh/meep-engine 3.38.0 → 3.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1183) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/package.json +1 -1
  4. package/src/core/binary/BinaryBuffer.d.ts +11 -0
  5. package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
  6. package/src/core/binary/BinaryBuffer.js +30 -0
  7. package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_aabb.d.ts.map +1 -1
  8. package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_aabb.js +28 -7
  9. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts +15 -0
  10. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts.map +1 -1
  11. package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +41 -0
  12. package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.d.ts +12 -0
  13. package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.d.ts.map +1 -1
  14. package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.js +27 -0
  15. package/src/core/geom/3d/gjk/gjk.js +3 -3
  16. package/src/core/geom/3d/gjk/gjk_distance.d.ts +94 -0
  17. package/src/core/geom/3d/gjk/gjk_distance.d.ts.map +1 -0
  18. package/src/core/geom/3d/gjk/gjk_distance.js +782 -0
  19. package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts +5 -4
  20. package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -1
  21. package/src/core/geom/3d/gjk/gjk_epa_penetration.js +14 -9
  22. package/src/core/geom/3d/gjk/minkowski_support.d.ts +11 -7
  23. package/src/core/geom/3d/gjk/minkowski_support.d.ts.map +1 -1
  24. package/src/core/geom/3d/gjk/minkowski_support.js +33 -9
  25. package/src/core/geom/3d/gjk/mpr.d.ts.map +1 -1
  26. package/src/core/geom/3d/gjk/mpr.js +26 -5
  27. package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.d.ts +15 -0
  28. package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.d.ts.map +1 -1
  29. package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.js +106 -33
  30. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.d.ts +2 -1
  31. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.d.ts.map +1 -1
  32. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.js +4 -8
  33. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_array.d.ts +32 -0
  34. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_array.d.ts.map +1 -0
  35. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_array.js +85 -0
  36. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.d.ts +3 -3
  37. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.d.ts.map +1 -1
  38. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.js +24 -34
  39. package/src/core/geom/3d/quaternion/quat3_integrate.d.ts +17 -0
  40. package/src/core/geom/3d/quaternion/quat3_integrate.d.ts.map +1 -1
  41. package/src/core/geom/3d/quaternion/quat3_integrate.js +45 -4
  42. package/src/core/geom/3d/quaternion/quat3_multiply.d.ts +16 -0
  43. package/src/core/geom/3d/quaternion/quat3_multiply.d.ts.map +1 -1
  44. package/src/core/geom/3d/quaternion/quat3_multiply.js +25 -0
  45. package/src/core/geom/3d/quaternion/quat3_nlerp.d.ts +18 -0
  46. package/src/core/geom/3d/quaternion/quat3_nlerp.d.ts.map +1 -1
  47. package/src/core/geom/3d/quaternion/quat3_nlerp.js +45 -0
  48. package/src/core/geom/3d/quaternion/quat3_shortest_arc.d.ts +17 -0
  49. package/src/core/geom/3d/quaternion/quat3_shortest_arc.d.ts.map +1 -1
  50. package/src/core/geom/3d/quaternion/quat3_shortest_arc.js +155 -94
  51. package/src/core/geom/3d/quaternion/quat3_to_matrix3.d.ts +12 -0
  52. package/src/core/geom/3d/quaternion/quat3_to_matrix3.d.ts.map +1 -1
  53. package/src/core/geom/3d/quaternion/quat3_to_matrix3.js +31 -0
  54. package/src/core/geom/3d/shape/AbstractShape3D.d.ts +20 -6
  55. package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
  56. package/src/core/geom/3d/shape/AbstractShape3D.js +20 -6
  57. package/src/core/geom/3d/shape/BoxShape3D.d.ts +1 -1
  58. package/src/core/geom/3d/shape/BoxShape3D.d.ts.map +1 -1
  59. package/src/core/geom/3d/shape/BoxShape3D.js +5 -1
  60. package/src/core/geom/3d/shape/CapsuleShape3D.d.ts +1 -1
  61. package/src/core/geom/3d/shape/CapsuleShape3D.d.ts.map +1 -1
  62. package/src/core/geom/3d/shape/CapsuleShape3D.js +5 -1
  63. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts +25 -11
  64. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  65. package/src/core/geom/3d/shape/ConvexHullShape3D.js +392 -22
  66. package/src/core/geom/3d/shape/CylinderShape3D.d.ts +8 -7
  67. package/src/core/geom/3d/shape/CylinderShape3D.d.ts.map +1 -1
  68. package/src/core/geom/3d/shape/CylinderShape3D.js +12 -7
  69. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts +51 -8
  70. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
  71. package/src/core/geom/3d/shape/HeightMapShape3D.js +260 -14
  72. package/src/core/geom/3d/shape/MeshShape3D.d.ts +61 -7
  73. package/src/core/geom/3d/shape/MeshShape3D.d.ts.map +1 -1
  74. package/src/core/geom/3d/shape/MeshShape3D.js +111 -20
  75. package/src/core/geom/3d/shape/PointShape3D.d.ts +1 -1
  76. package/src/core/geom/3d/shape/PointShape3D.d.ts.map +1 -1
  77. package/src/core/geom/3d/shape/PointShape3D.js +1 -1
  78. package/src/core/geom/3d/shape/PosedShape3D.d.ts +9 -0
  79. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
  80. package/src/core/geom/3d/shape/PosedShape3D.js +36 -6
  81. package/src/core/geom/3d/shape/SphereShape3D.d.ts +1 -1
  82. package/src/core/geom/3d/shape/SphereShape3D.d.ts.map +1 -1
  83. package/src/core/geom/3d/shape/SphereShape3D.js +5 -1
  84. package/src/core/geom/3d/shape/TransformedShape3D.d.ts +12 -10
  85. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  86. package/src/core/geom/3d/shape/TransformedShape3D.js +53 -19
  87. package/src/core/geom/3d/shape/Triangle3D.d.ts +1 -1
  88. package/src/core/geom/3d/shape/Triangle3D.d.ts.map +1 -1
  89. package/src/core/geom/3d/shape/Triangle3D.js +5 -1
  90. package/src/core/geom/3d/shape/UnionShape3D.d.ts +1 -1
  91. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  92. package/src/core/geom/3d/shape/UnionShape3D.js +19 -2
  93. package/src/core/geom/3d/shape/sdf/sdf3_box.d.ts +14 -0
  94. package/src/core/geom/3d/shape/sdf/sdf3_box.d.ts.map +1 -1
  95. package/src/core/geom/3d/shape/sdf/sdf3_box.js +67 -5
  96. package/src/core/geom/3d/shape/sdf/sdf3_capsule.d.ts +14 -0
  97. package/src/core/geom/3d/shape/sdf/sdf3_capsule.d.ts.map +1 -1
  98. package/src/core/geom/3d/shape/sdf/sdf3_capsule.js +61 -3
  99. package/src/core/geom/3d/shape/sdf/sdf3_cylinder.d.ts +14 -0
  100. package/src/core/geom/3d/shape/sdf/sdf3_cylinder.d.ts.map +1 -1
  101. package/src/core/geom/3d/shape/sdf/sdf3_cylinder.js +63 -4
  102. package/src/core/geom/3d/shape/sdf/sdf3_plane.d.ts +15 -0
  103. package/src/core/geom/3d/shape/sdf/sdf3_plane.d.ts.map +1 -1
  104. package/src/core/geom/3d/shape/sdf/sdf3_plane.js +64 -2
  105. package/src/core/geom/3d/shape/sdf/sdf3_sphere.d.ts +21 -0
  106. package/src/core/geom/3d/shape/sdf/sdf3_sphere.d.ts.map +1 -1
  107. package/src/core/geom/3d/shape/sdf/sdf3_sphere.js +66 -3
  108. package/src/core/geom/3d/shape/shape3_mesh_from_geometry.d.ts +2 -0
  109. package/src/core/geom/3d/shape/shape3_mesh_from_geometry.d.ts.map +1 -1
  110. package/src/core/geom/3d/shape/shape3_mesh_from_geometry.js +7 -0
  111. package/src/core/geom/3d/shape/util/mesh_compute_triangle_edge_flags.d.ts +41 -0
  112. package/src/core/geom/3d/shape/util/mesh_compute_triangle_edge_flags.d.ts.map +1 -0
  113. package/src/core/geom/3d/shape/util/mesh_compute_triangle_edge_flags.js +538 -0
  114. package/src/core/geom/3d/sphere/harmonics/sh_basis_at.d.ts +31 -0
  115. package/src/core/geom/3d/sphere/harmonics/sh_basis_at.d.ts.map +1 -0
  116. package/src/core/geom/3d/sphere/harmonics/sh_basis_at.js +85 -0
  117. package/src/core/geom/3d/sphere/harmonics/sh_vmf_window.d.ts +18 -0
  118. package/src/core/geom/3d/sphere/harmonics/sh_vmf_window.d.ts.map +1 -0
  119. package/src/core/geom/3d/sphere/harmonics/sh_vmf_window.js +19 -0
  120. package/src/core/geom/3d/triangle/TriangleEdgeFlags.d.ts +49 -0
  121. package/src/core/geom/3d/triangle/TriangleEdgeFlags.d.ts.map +1 -0
  122. package/src/core/geom/3d/triangle/TriangleEdgeFlags.js +55 -0
  123. package/src/core/geom/3d/triangle/tri3_classify_shared_edge.d.ts +42 -0
  124. package/src/core/geom/3d/triangle/tri3_classify_shared_edge.d.ts.map +1 -0
  125. package/src/core/geom/3d/triangle/tri3_classify_shared_edge.js +85 -0
  126. package/src/core/geom/3d/triangle/tri3_closest_point.d.ts +13 -0
  127. package/src/core/geom/3d/triangle/tri3_closest_point.d.ts.map +1 -1
  128. package/src/core/geom/3d/triangle/tri3_closest_point.js +36 -1
  129. package/src/core/geom/3d/triangle/tri3_closest_point_barycentric.d.ts +14 -0
  130. package/src/core/geom/3d/triangle/tri3_closest_point_barycentric.d.ts.map +1 -1
  131. package/src/core/geom/3d/triangle/tri3_closest_point_barycentric.js +40 -0
  132. package/src/core/geom/vec3/v3_quaternion_apply.d.ts +19 -0
  133. package/src/core/geom/vec3/v3_quaternion_apply.d.ts.map +1 -1
  134. package/src/core/geom/vec3/v3_quaternion_apply.js +32 -0
  135. package/src/core/geom/vec3/v3_quaternion_apply_inverse.d.ts +19 -0
  136. package/src/core/geom/vec3/v3_quaternion_apply_inverse.d.ts.map +1 -1
  137. package/src/core/geom/vec3/v3_quaternion_apply_inverse.js +32 -0
  138. package/src/engine/EngineHarness.d.ts.map +1 -1
  139. package/src/engine/EngineHarness.js +17 -4
  140. package/src/engine/asset/loaders/image/avif/threaded_image_encoder.js +1 -1
  141. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +135 -10
  142. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  143. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +338 -105
  144. package/src/engine/control/first-person/abilities/Ability.d.ts +14 -5
  145. package/src/engine/control/first-person/abilities/Ability.d.ts.map +1 -1
  146. package/src/engine/control/first-person/abilities/Ability.js +14 -5
  147. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
  148. package/src/engine/control/first-person/abilities/LedgeGrab.js +16 -12
  149. package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -1
  150. package/src/engine/control/first-person/abilities/Mantle.js +5 -1
  151. package/src/engine/control/first-person/abilities/Slide.js +1 -1
  152. package/src/engine/control/first-person/collision/KinematicMover.d.ts +92 -14
  153. package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
  154. package/src/engine/control/first-person/collision/KinematicMover.js +218 -37
  155. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts +5 -0
  156. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
  157. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +17 -10
  158. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  159. package/src/engine/ecs/EntityComponentDataset.js +27 -13
  160. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  161. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +8 -0
  162. package/src/engine/ecs/transform/Transform64.d.ts +4 -2
  163. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  164. package/src/engine/ecs/transform/Transform64.js +10 -16
  165. package/src/engine/graphics/ecs/water/Water.d.ts +31 -72
  166. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  167. package/src/engine/graphics/ecs/water/Water.js +59 -84
  168. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  169. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +11 -49
  170. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.d.ts +1 -1
  171. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.d.ts.map +1 -1
  172. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.js +27 -18
  173. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_2_3.d.ts +12 -0
  174. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_2_3.d.ts.map +1 -0
  175. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_2_3.js +45 -0
  176. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts +6 -0
  177. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts.map +1 -0
  178. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.js +10 -0
  179. package/src/engine/graphics/ecs/water/WaterWaves.d.ts +33 -0
  180. package/src/engine/graphics/ecs/water/WaterWaves.d.ts.map +1 -0
  181. package/src/engine/graphics/ecs/water/WaterWaves.js +46 -0
  182. package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.d.ts +17 -0
  183. package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.d.ts.map +1 -0
  184. package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.js +26 -0
  185. package/src/engine/graphics/texture/3d/scs3d_sample_linear.d.ts +22 -0
  186. package/src/engine/graphics/texture/3d/scs3d_sample_linear.d.ts.map +1 -1
  187. package/src/engine/graphics/texture/3d/scs3d_sample_linear.js +43 -1
  188. package/src/engine/graphics/texture/sampler/Sampler2D.d.ts +29 -3
  189. package/src/engine/graphics/texture/sampler/Sampler2D.d.ts.map +1 -1
  190. package/src/engine/graphics/texture/sampler/Sampler2D.js +102 -14
  191. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -1
  192. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +8 -5
  193. package/src/engine/graphics3/WaterSystem.d.ts +31 -48
  194. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  195. package/src/engine/graphics3/WaterSystem.js +177 -261
  196. package/src/engine/interpolation/BinaryInterpolationAdapter.d.ts +10 -4
  197. package/src/engine/interpolation/BinaryInterpolationAdapter.d.ts.map +1 -1
  198. package/src/engine/interpolation/BinaryInterpolationAdapter.js +11 -5
  199. package/src/engine/interpolation/InterpolationLog.d.ts +11 -5
  200. package/src/engine/interpolation/InterpolationLog.d.ts.map +1 -1
  201. package/src/engine/interpolation/InterpolationLog.js +12 -6
  202. package/src/engine/interpolation/InterpolationSystem.d.ts.map +1 -1
  203. package/src/engine/interpolation/InterpolationSystem.js +39 -8
  204. package/src/engine/interpolation/PoseInterpolationAdapter.d.ts +1 -1
  205. package/src/engine/interpolation/PoseInterpolationAdapter.d.ts.map +1 -1
  206. package/src/engine/interpolation/PoseInterpolationAdapter.js +51 -22
  207. package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
  208. package/src/engine/interpolation/TransformPoseSerializationAdapter.js +18 -23
  209. package/src/engine/network/adapters/QuaternionInterpolationAdapter.d.ts +1 -1
  210. package/src/engine/network/adapters/QuaternionInterpolationAdapter.d.ts.map +1 -1
  211. package/src/engine/network/adapters/QuaternionInterpolationAdapter.js +3 -1
  212. package/src/engine/network/adapters/TransformInterpolationAdapter.d.ts +1 -1
  213. package/src/engine/network/adapters/TransformInterpolationAdapter.d.ts.map +1 -1
  214. package/src/engine/network/adapters/TransformInterpolationAdapter.js +3 -1
  215. package/src/engine/network/adapters/Vector3InterpolationAdapter.d.ts.map +1 -1
  216. package/src/engine/network/adapters/Vector3InterpolationAdapter.js +5 -2
  217. package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
  218. package/src/engine/physics/body/SolverBodyState.js +4 -5
  219. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +12 -0
  220. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
  221. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +28 -3
  222. package/src/engine/physics/ccd/linear_sweep.d.ts +42 -12
  223. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  224. package/src/engine/physics/ccd/linear_sweep.js +1131 -97
  225. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +13 -0
  226. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
  227. package/src/engine/physics/cloth/collider/ClothColliderIndex.js +90 -22
  228. package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +84 -24
  229. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +46 -3
  230. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -1
  231. package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +116 -68
  232. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  233. package/src/engine/physics/cloth/ecs/ClothWorld.js +59 -47
  234. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
  235. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +62 -55
  236. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
  237. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +46 -39
  238. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  239. package/src/engine/physics/cloth/ecs/cloth_write_back.js +41 -36
  240. package/src/engine/physics/cloth/playground/garment_build.js +6 -6
  241. package/src/engine/physics/cloth/playground/garment_main.js +18 -14
  242. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
  243. package/src/engine/physics/cloth/solver/cloth_contact_find.js +8 -5
  244. package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
  245. package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +8 -5
  246. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
  247. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +15 -15
  248. package/src/engine/physics/cloth/solver/find_non_finite_cloth_state.d.ts +5 -0
  249. package/src/engine/physics/cloth/solver/find_non_finite_cloth_state.d.ts.map +1 -1
  250. package/src/engine/physics/cloth/solver/find_non_finite_cloth_state.js +32 -9
  251. package/src/engine/physics/constraint/solve_constraints.d.ts +50 -8
  252. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  253. package/src/engine/physics/constraint/solve_constraints.js +703 -429
  254. package/src/engine/physics/contact/ManifoldStore.d.ts +12 -0
  255. package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -1
  256. package/src/engine/physics/contact/ManifoldStore.js +32 -0
  257. package/src/engine/physics/ecs/BodyKind.d.ts +16 -8
  258. package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -1
  259. package/src/engine/physics/ecs/BodyKind.js +16 -8
  260. package/src/engine/physics/ecs/Collider.d.ts +7 -2
  261. package/src/engine/physics/ecs/Collider.d.ts.map +1 -1
  262. package/src/engine/physics/ecs/Collider.js +7 -2
  263. package/src/engine/physics/ecs/PhysicsEvents.d.ts +13 -0
  264. package/src/engine/physics/ecs/PhysicsEvents.d.ts.map +1 -1
  265. package/src/engine/physics/ecs/PhysicsEvents.js +13 -0
  266. package/src/engine/physics/ecs/PhysicsSystem.d.ts +320 -36
  267. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  268. package/src/engine/physics/ecs/PhysicsSystem.js +779 -81
  269. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  270. package/src/engine/physics/fluid/FluidField.js +5 -1
  271. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +11 -9
  272. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
  273. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +7 -5
  274. package/src/engine/physics/fluid/ecs/fluid_reanchor_field.d.ts.map +1 -1
  275. package/src/engine/physics/fluid/ecs/fluid_reanchor_field.js +9 -7
  276. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -1
  277. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +3 -4
  278. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  279. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +9 -7
  280. package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.d.ts.map +1 -1
  281. package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.js +65 -43
  282. package/src/engine/physics/inertia/MASS_PROPERTIES_SIZE.d.ts +23 -0
  283. package/src/engine/physics/inertia/MASS_PROPERTIES_SIZE.d.ts.map +1 -0
  284. package/src/engine/physics/inertia/MASS_PROPERTIES_SIZE.js +22 -0
  285. package/src/engine/physics/inertia/convex_hull_mass_properties.d.ts +29 -0
  286. package/src/engine/physics/inertia/convex_hull_mass_properties.d.ts.map +1 -0
  287. package/src/engine/physics/inertia/convex_hull_mass_properties.js +117 -0
  288. package/src/engine/physics/inertia/mass_properties_accumulate.d.ts +24 -0
  289. package/src/engine/physics/inertia/mass_properties_accumulate.d.ts.map +1 -0
  290. package/src/engine/physics/inertia/mass_properties_accumulate.js +93 -0
  291. package/src/engine/physics/inertia/primitive_mass_properties.d.ts +46 -0
  292. package/src/engine/physics/inertia/primitive_mass_properties.d.ts.map +1 -0
  293. package/src/engine/physics/inertia/primitive_mass_properties.js +118 -0
  294. package/src/engine/physics/inertia/rigid_body_set_mass_properties.d.ts +27 -0
  295. package/src/engine/physics/inertia/rigid_body_set_mass_properties.d.ts.map +1 -0
  296. package/src/engine/physics/inertia/rigid_body_set_mass_properties.js +62 -0
  297. package/src/engine/physics/inertia/world_inverse_inertia.d.ts +67 -25
  298. package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -1
  299. package/src/engine/physics/inertia/world_inverse_inertia.js +149 -26
  300. package/src/engine/physics/integration/integrate_position.d.ts +18 -19
  301. package/src/engine/physics/integration/integrate_position.d.ts.map +1 -1
  302. package/src/engine/physics/integration/integrate_position.js +40 -37
  303. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
  304. package/src/engine/physics/integration/integrate_velocity.js +13 -4
  305. package/src/engine/physics/island/IslandBuilder.d.ts +124 -6
  306. package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -1
  307. package/src/engine/physics/island/IslandBuilder.js +322 -19
  308. package/src/engine/physics/narrowphase/box_box_manifold.d.ts +13 -0
  309. package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -1
  310. package/src/engine/physics/narrowphase/box_box_manifold.js +95 -39
  311. package/src/engine/physics/narrowphase/box_triangle_contact.d.ts +40 -0
  312. package/src/engine/physics/narrowphase/box_triangle_contact.d.ts.map +1 -1
  313. package/src/engine/physics/narrowphase/box_triangle_contact.js +415 -120
  314. package/src/engine/physics/narrowphase/capsule_contacts.d.ts +63 -0
  315. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
  316. package/src/engine/physics/narrowphase/capsule_contacts.js +234 -46
  317. package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts +13 -0
  318. package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts.map +1 -1
  319. package/src/engine/physics/narrowphase/capsule_triangle_contact.js +141 -93
  320. package/src/engine/physics/narrowphase/compute_penetration.d.ts +29 -11
  321. package/src/engine/physics/narrowphase/compute_penetration.d.ts.map +1 -1
  322. package/src/engine/physics/narrowphase/compute_penetration.js +157 -34
  323. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts +76 -0
  324. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
  325. package/src/engine/physics/narrowphase/convex_convex_manifold.js +243 -48
  326. package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.d.ts +13 -0
  327. package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.d.ts.map +1 -1
  328. package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.js +28 -12
  329. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts +13 -0
  330. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts.map +1 -1
  331. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.js +27 -0
  332. package/src/engine/physics/narrowphase/decomposition/heightmap_triangle_edge_flags.d.ts +42 -0
  333. package/src/engine/physics/narrowphase/decomposition/heightmap_triangle_edge_flags.d.ts.map +1 -0
  334. package/src/engine/physics/narrowphase/decomposition/heightmap_triangle_edge_flags.js +250 -0
  335. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts +27 -11
  336. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
  337. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +291 -12
  338. package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.d.ts +7 -1
  339. package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.d.ts.map +1 -1
  340. package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.js +7 -1
  341. package/src/engine/physics/narrowphase/decomposition/triangle_edge_flags.d.ts +35 -0
  342. package/src/engine/physics/narrowphase/decomposition/triangle_edge_flags.d.ts.map +1 -0
  343. package/src/engine/physics/narrowphase/decomposition/triangle_edge_flags.js +61 -0
  344. package/src/engine/physics/narrowphase/hull_sphere_contact.d.ts +54 -0
  345. package/src/engine/physics/narrowphase/hull_sphere_contact.d.ts.map +1 -0
  346. package/src/engine/physics/narrowphase/hull_sphere_contact.js +244 -0
  347. package/src/engine/physics/narrowphase/mesh_convex_hull.js +5 -1
  348. package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.d.ts +2 -0
  349. package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.d.ts.map +1 -1
  350. package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +56 -31
  351. package/src/engine/physics/narrowphase/narrowphase_step.d.ts +6 -5
  352. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  353. package/src/engine/physics/narrowphase/narrowphase_step.js +2185 -483
  354. package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts +56 -5
  355. package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts.map +1 -1
  356. package/src/engine/physics/narrowphase/reduce_manifold_contacts.js +546 -5
  357. package/src/engine/physics/narrowphase/refine_ray_concave.d.ts +29 -2
  358. package/src/engine/physics/narrowphase/refine_ray_concave.d.ts.map +1 -1
  359. package/src/engine/physics/narrowphase/refine_ray_concave.js +628 -75
  360. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts +3 -2
  361. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
  362. package/src/engine/physics/narrowphase/refine_ray_hit.js +3 -2
  363. package/src/engine/physics/narrowphase/rigid_subject_pose.d.ts +27 -0
  364. package/src/engine/physics/narrowphase/rigid_subject_pose.d.ts.map +1 -0
  365. package/src/engine/physics/narrowphase/rigid_subject_pose.js +96 -0
  366. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts +14 -0
  367. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -1
  368. package/src/engine/physics/narrowphase/sphere_box_contact.js +51 -5
  369. package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts +12 -0
  370. package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts.map +1 -1
  371. package/src/engine/physics/narrowphase/sphere_sphere_contact.js +30 -0
  372. package/src/engine/physics/narrowphase/sphere_triangle_contact.d.ts +12 -0
  373. package/src/engine/physics/narrowphase/sphere_triangle_contact.d.ts.map +1 -1
  374. package/src/engine/physics/narrowphase/sphere_triangle_contact.js +37 -8
  375. package/src/engine/physics/narrowphase/support_feature_manifold.d.ts +139 -0
  376. package/src/engine/physics/narrowphase/support_feature_manifold.d.ts.map +1 -0
  377. package/src/engine/physics/narrowphase/support_feature_manifold.js +949 -0
  378. package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts +32 -13
  379. package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts.map +1 -1
  380. package/src/engine/physics/queries/PhysicsSurfacePoint.js +36 -13
  381. package/src/engine/physics/queries/convex_overlaps_shape.d.ts +27 -0
  382. package/src/engine/physics/queries/convex_overlaps_shape.d.ts.map +1 -0
  383. package/src/engine/physics/queries/convex_overlaps_shape.js +169 -0
  384. package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
  385. package/src/engine/physics/queries/overlap_shape.js +57 -79
  386. package/src/engine/physics/queries/raycast.d.ts +10 -4
  387. package/src/engine/physics/queries/raycast.d.ts.map +1 -1
  388. package/src/engine/physics/queries/raycast.js +133 -9
  389. package/src/engine/physics/queries/shape_cast.d.ts +55 -24
  390. package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
  391. package/src/engine/physics/queries/shape_cast.js +2061 -245
  392. package/src/engine/physics/solver/apply_impulse_to_body.d.ts +32 -10
  393. package/src/engine/physics/solver/apply_impulse_to_body.d.ts.map +1 -1
  394. package/src/engine/physics/solver/apply_impulse_to_body.js +69 -28
  395. package/src/engine/physics/solver/solve_contacts.d.ts +65 -18
  396. package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -1
  397. package/src/engine/physics/solver/solve_contacts.js +458 -234
  398. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  399. package/src/engine/physics/vehicle/RaycastVehicle.js +5 -6
  400. package/src/format/image/avif/api/convert_to_rgba.d.ts +2 -2
  401. package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
  402. package/src/format/image/avif/api/convert_to_rgba.js +10 -9
  403. package/src/format/image/avif/api/decode_avif.d.ts +2 -2
  404. package/src/format/image/avif/api/decode_avif.d.ts.map +1 -1
  405. package/src/format/image/avif/api/decode_avif.js +1 -1
  406. package/src/shade/assets/textures/split_sum.bin +0 -0
  407. package/src/shade/device/mock/SoftwareGPUQueue.d.ts.map +1 -1
  408. package/src/shade/device/mock/SoftwareGPUQueue.js +2 -1
  409. package/src/shade/playground/path_traced_media/README.md +78 -0
  410. package/src/shade/playground/path_traced_media/capture_radiance.d.ts +33 -0
  411. package/src/shade/playground/path_traced_media/capture_radiance.d.ts.map +1 -0
  412. package/src/shade/playground/path_traced_media/capture_radiance.js +174 -0
  413. package/src/shade/playground/path_traced_media/checks.d.ts +160 -0
  414. package/src/shade/playground/path_traced_media/checks.d.ts.map +1 -0
  415. package/src/shade/playground/path_traced_media/checks.js +921 -0
  416. package/src/shade/playground/path_traced_media/index.html +71 -0
  417. package/src/shade/playground/path_traced_media/main.d.ts +2 -0
  418. package/src/shade/playground/path_traced_media/main.d.ts.map +1 -0
  419. package/src/shade/playground/path_traced_media/main.js +440 -0
  420. package/src/shade/playground/path_traced_media/make_wave_pool_geometry.d.ts +26 -0
  421. package/src/shade/playground/path_traced_media/make_wave_pool_geometry.d.ts.map +1 -0
  422. package/src/shade/playground/path_traced_media/make_wave_pool_geometry.js +117 -0
  423. package/src/shade/playground/path_traced_media/views.d.ts +21 -0
  424. package/src/shade/playground/path_traced_media/views.d.ts.map +1 -0
  425. package/src/shade/playground/path_traced_media/views.js +161 -0
  426. package/src/shade/playground/sh_exponential/README.md +43 -0
  427. package/src/shade/playground/sh_exponential/index.html +59 -0
  428. package/src/shade/playground/sh_exponential/main.d.ts +2 -0
  429. package/src/shade/playground/sh_exponential/main.d.ts.map +1 -0
  430. package/src/shade/playground/sh_exponential/main.js +571 -0
  431. package/src/shade/playground/sh_exponential/sh_exp_playground_shaders.d.ts +46 -0
  432. package/src/shade/playground/sh_exponential/sh_exp_playground_shaders.d.ts.map +1 -0
  433. package/src/shade/playground/sh_exponential/sh_exp_playground_shaders.js +270 -0
  434. package/src/shade/playground/ssr_reprojection/README.md +111 -103
  435. package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -68
  436. package/src/shade/playground/ssr_reprojection/index.html +80 -79
  437. package/src/shade/playground/ssr_reprojection/main.js +256 -247
  438. package/src/shade/playground/ssr_variance/capture.js +96 -96
  439. package/src/shade/playground/ssr_variance/reference.js +78 -78
  440. package/src/shade/playground/vsm/README.md +96 -0
  441. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts +49 -0
  442. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -0
  443. package/src/shade/playground/vsm/VSMDebugOverlay.js +351 -0
  444. package/src/shade/playground/vsm/clipmap_panel.d.ts +8 -0
  445. package/src/shade/playground/vsm/clipmap_panel.d.ts.map +1 -0
  446. package/src/shade/playground/vsm/clipmap_panel.js +138 -0
  447. package/src/shade/playground/vsm/index.html +170 -0
  448. package/src/shade/playground/vsm/main.d.ts +2 -0
  449. package/src/shade/playground/vsm/main.d.ts.map +1 -0
  450. package/src/shade/playground/vsm/main.js +389 -0
  451. package/src/shade/playground/vsm/scenes.d.ts +52 -0
  452. package/src/shade/playground/vsm/scenes.d.ts.map +1 -0
  453. package/src/shade/playground/vsm/scenes.js +320 -0
  454. package/src/shade/playground/vsm/verify_vsm.d.ts +38 -0
  455. package/src/shade/playground/vsm/verify_vsm.d.ts.map +1 -0
  456. package/src/shade/playground/vsm/verify_vsm.js +305 -0
  457. package/src/shade/playground/water_refraction/README.md +76 -19
  458. package/src/shade/playground/water_refraction/index.html +6 -8
  459. package/src/shade/playground/water_refraction/main.js +22 -12
  460. package/src/shade/playground/water_refraction/world.d.ts +3 -0
  461. package/src/shade/playground/water_refraction/world.d.ts.map +1 -1
  462. package/src/shade/playground/water_refraction/world.js +19 -5
  463. package/src/shade/renderer/Renderer.d.ts +21 -0
  464. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  465. package/src/shade/renderer/Renderer.js +95 -1
  466. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +8 -0
  467. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  468. package/src/shade/renderer/animation/GPUAnimationManager.js +18 -0
  469. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +7 -0
  470. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  471. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -0
  472. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -1
  473. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  474. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +10 -1
  475. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.d.ts.map +1 -1
  476. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.js +28 -0
  477. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.d.ts.map +1 -1
  478. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.js +31 -1
  479. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -1
  480. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +9 -1
  481. package/src/shade/renderer/geometry/MeshletGeometry.d.ts +3 -0
  482. package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
  483. package/src/shade/renderer/geometry/MeshletGeometry.js +1 -0
  484. package/src/shade/renderer/geometry/sdf/chunk_scene_point_query_volume_sign.d.ts.map +1 -1
  485. package/src/shade/renderer/geometry/sdf/chunk_scene_point_query_volume_sign.js +6 -4
  486. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.d.ts.map +1 -1
  487. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -0
  488. package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_rand1.d.ts +7 -0
  489. package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_rand1.d.ts.map +1 -1
  490. package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_rand1.js +12 -12
  491. package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_spherical.d.ts +4 -0
  492. package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_spherical.d.ts.map +1 -1
  493. package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_spherical.js +13 -9
  494. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  495. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +2 -0
  496. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
  497. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +3 -0
  498. package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.d.ts.map +1 -1
  499. package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.js +4 -9
  500. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  501. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +79 -11
  502. package/src/shade/renderer/light/environment/rgbe/load_environment_map.d.ts +2 -1
  503. package/src/shade/renderer/light/environment/rgbe/load_environment_map.d.ts.map +1 -1
  504. package/src/shade/renderer/light/environment/rgbe/load_environment_map.js +2 -1
  505. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  506. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.js +2 -2
  507. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts +2 -2
  508. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts.map +1 -1
  509. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js +6 -14
  510. package/src/shade/renderer/light/environment/sh_exponential/README.md +171 -0
  511. package/src/shade/renderer/light/environment/sh_exponential/SHExpEncoder.d.ts +170 -0
  512. package/src/shade/renderer/light/environment/sh_exponential/SHExpEncoder.d.ts.map +1 -0
  513. package/src/shade/renderer/light/environment/sh_exponential/SHExpEncoder.js +377 -0
  514. package/src/shade/renderer/light/environment/sh_exponential/SH_EXP_ENCODE_PARAMETERS_STRUCT.d.ts +16 -0
  515. package/src/shade/renderer/light/environment/sh_exponential/SH_EXP_ENCODE_PARAMETERS_STRUCT.d.ts.map +1 -0
  516. package/src/shade/renderer/light/environment/sh_exponential/SH_EXP_ENCODE_PARAMETERS_STRUCT.js +27 -0
  517. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts +21 -0
  518. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts.map +1 -0
  519. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js +57 -0
  520. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_design_row.d.ts +33 -0
  521. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_design_row.d.ts.map +1 -0
  522. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_design_row.js +90 -0
  523. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_fit_samples.d.ts +28 -0
  524. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_fit_samples.d.ts.map +1 -0
  525. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_fit_samples.js +92 -0
  526. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_layout.d.ts +39 -0
  527. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_layout.d.ts.map +1 -0
  528. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_layout.js +44 -0
  529. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_solve_matrix.d.ts +42 -0
  530. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_solve_matrix.d.ts.map +1 -0
  531. package/src/shade/renderer/light/environment/sh_exponential/sh_exp_solve_matrix.js +123 -0
  532. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_environment_cells.d.ts +30 -0
  533. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_environment_cells.d.ts.map +1 -0
  534. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_environment_cells.js +147 -0
  535. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_log_floor.d.ts +24 -0
  536. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_log_floor.d.ts.map +1 -0
  537. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_log_floor.js +79 -0
  538. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_project.d.ts +17 -0
  539. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_project.d.ts.map +1 -0
  540. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_project.js +99 -0
  541. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_reference_reflectance.d.ts +24 -0
  542. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_reference_reflectance.d.ts.map +1 -0
  543. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_reference_reflectance.js +104 -0
  544. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_solve.d.ts +12 -0
  545. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_solve.d.ts.map +1 -0
  546. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_solve.js +93 -0
  547. package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
  548. package/src/shade/renderer/lightmap/GPULightMap.js +1 -0
  549. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.d.ts.map +1 -1
  550. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +4 -0
  551. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.d.ts.map +1 -1
  552. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +4 -0
  553. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  554. package/src/shade/renderer/material/PIXEL_TEXTURE_ORM.d.ts +1 -1
  555. package/src/shade/renderer/material/PIXEL_TEXTURE_ORM.d.ts.map +1 -1
  556. package/src/shade/renderer/material/StandardShadeMaterial.d.ts +15 -0
  557. package/src/shade/renderer/material/StandardShadeMaterial.d.ts.map +1 -1
  558. package/src/shade/renderer/material/StandardShadeMaterial.js +17 -0
  559. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +36 -2
  560. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  561. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +218 -18
  562. package/src/shade/renderer/material/resident/INDIRECT_MATERIAL_STRUCT.d.ts.map +1 -1
  563. package/src/shade/renderer/material/resident/INDIRECT_MATERIAL_STRUCT.js +10 -0
  564. package/src/shade/renderer/medium/MEDIA_TABLE_STRUCT.d.ts +17 -0
  565. package/src/shade/renderer/medium/MEDIA_TABLE_STRUCT.d.ts.map +1 -0
  566. package/src/shade/renderer/medium/MEDIA_TABLE_STRUCT.js +24 -0
  567. package/src/shade/renderer/medium/MEDIUM_PHASE_LOBE_KIND.d.ts +24 -0
  568. package/src/shade/renderer/medium/MEDIUM_PHASE_LOBE_KIND.d.ts.map +1 -0
  569. package/src/shade/renderer/medium/MEDIUM_PHASE_LOBE_KIND.js +18 -0
  570. package/src/shade/renderer/medium/MEDIUM_STRUCT.d.ts +20 -0
  571. package/src/shade/renderer/medium/MEDIUM_STRUCT.d.ts.map +1 -0
  572. package/src/shade/renderer/medium/MEDIUM_STRUCT.js +43 -0
  573. package/src/shade/renderer/medium/ParticipatingMedium.d.ts +111 -0
  574. package/src/shade/renderer/medium/ParticipatingMedium.d.ts.map +1 -0
  575. package/src/shade/renderer/medium/ParticipatingMedium.js +211 -0
  576. package/src/shade/renderer/medium/chunk_medium_lobe_phase.d.ts +13 -0
  577. package/src/shade/renderer/medium/chunk_medium_lobe_phase.d.ts.map +1 -0
  578. package/src/shade/renderer/medium/chunk_medium_lobe_phase.js +33 -0
  579. package/src/shade/renderer/medium/participating_medium_serialization.d.ts +32 -0
  580. package/src/shade/renderer/medium/participating_medium_serialization.d.ts.map +1 -0
  581. package/src/shade/renderer/medium/participating_medium_serialization.js +181 -0
  582. package/src/shade/renderer/medium/phase/MediumPhaseFunction.d.ts +48 -0
  583. package/src/shade/renderer/medium/phase/MediumPhaseFunction.d.ts.map +1 -0
  584. package/src/shade/renderer/medium/phase/MediumPhaseFunction.js +42 -0
  585. package/src/shade/renderer/medium/phase/PhaseCornetteShanks.d.ts +23 -0
  586. package/src/shade/renderer/medium/phase/PhaseCornetteShanks.d.ts.map +1 -0
  587. package/src/shade/renderer/medium/phase/PhaseCornetteShanks.js +45 -0
  588. package/src/shade/renderer/medium/phase/PhaseDraine.d.ts +30 -0
  589. package/src/shade/renderer/medium/phase/PhaseDraine.d.ts.map +1 -0
  590. package/src/shade/renderer/medium/phase/PhaseDraine.js +58 -0
  591. package/src/shade/renderer/medium/phase/PhaseFournierForand.d.ts +24 -0
  592. package/src/shade/renderer/medium/phase/PhaseFournierForand.d.ts.map +1 -0
  593. package/src/shade/renderer/medium/phase/PhaseFournierForand.js +53 -0
  594. package/src/shade/renderer/medium/phase/PhaseHenyeyGreenstein.d.ts +21 -0
  595. package/src/shade/renderer/medium/phase/PhaseHenyeyGreenstein.d.ts.map +1 -0
  596. package/src/shade/renderer/medium/phase/PhaseHenyeyGreenstein.js +43 -0
  597. package/src/shade/renderer/medium/phase/PhaseJendersieDeon.d.ts +25 -0
  598. package/src/shade/renderer/medium/phase/PhaseJendersieDeon.d.ts.map +1 -0
  599. package/src/shade/renderer/medium/phase/PhaseJendersieDeon.js +66 -0
  600. package/src/shade/renderer/medium/phase/PhaseRayleigh.d.ts +9 -0
  601. package/src/shade/renderer/medium/phase/PhaseRayleigh.d.ts.map +1 -0
  602. package/src/shade/renderer/medium/phase/PhaseRayleigh.js +21 -0
  603. package/src/shade/renderer/medium/phase/PhaseWaterMolecular.d.ts +28 -0
  604. package/src/shade/renderer/medium/phase/PhaseWaterMolecular.d.ts.map +1 -0
  605. package/src/shade/renderer/medium/phase/PhaseWaterMolecular.js +49 -0
  606. package/src/shade/renderer/medium/water/WATER_DEFAULT_PATH_LENGTHS.d.ts +10 -0
  607. package/src/shade/renderer/medium/water/WATER_DEFAULT_PATH_LENGTHS.d.ts.map +1 -0
  608. package/src/shade/renderer/medium/water/WATER_DEFAULT_PATH_LENGTHS.js +25 -0
  609. package/src/shade/renderer/medium/water/water_iop_from_appearance.d.ts +47 -0
  610. package/src/shade/renderer/medium/water/water_iop_from_appearance.d.ts.map +1 -0
  611. package/src/shade/renderer/medium/water/water_iop_from_appearance.js +174 -0
  612. package/src/shade/renderer/medium/water/water_iop_from_constituents.d.ts +57 -0
  613. package/src/shade/renderer/medium/water/water_iop_from_constituents.d.ts.map +1 -0
  614. package/src/shade/renderer/medium/water/water_iop_from_constituents.js +242 -0
  615. package/src/shade/renderer/medium/water/water_iop_jerlov.d.ts +41 -0
  616. package/src/shade/renderer/medium/water/water_iop_jerlov.d.ts.map +1 -0
  617. package/src/shade/renderer/medium/water/water_iop_jerlov.js +231 -0
  618. package/src/shade/renderer/medium/water/water_iop_spectral_reference.d.ts +66 -0
  619. package/src/shade/renderer/medium/water/water_iop_spectral_reference.d.ts.map +1 -0
  620. package/src/shade/renderer/medium/water/water_iop_spectral_reference.js +223 -0
  621. package/src/shade/renderer/medium/water/water_medium_from_iop.d.ts +96 -0
  622. package/src/shade/renderer/medium/water/water_medium_from_iop.d.ts.map +1 -0
  623. package/src/shade/renderer/medium/water/water_medium_from_iop.js +145 -0
  624. package/src/shade/renderer/medium/water/water_presets.d.ts +69 -0
  625. package/src/shade/renderer/medium/water/water_presets.d.ts.map +1 -0
  626. package/src/shade/renderer/medium/water/water_presets.js +119 -0
  627. package/src/shade/renderer/medium/water/water_rgb_from_spectral.d.ts +69 -0
  628. package/src/shade/renderer/medium/water/water_rgb_from_spectral.d.ts.map +1 -0
  629. package/src/shade/renderer/medium/water/water_rgb_from_spectral.js +341 -0
  630. package/src/shade/renderer/particles/DESIGN.md +4 -2
  631. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_voxel_fade.d.ts +26 -0
  632. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_voxel_fade.d.ts.map +1 -0
  633. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_voxel_fade.js +71 -0
  634. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  635. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +16 -1
  636. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
  637. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +6 -13
  638. package/src/shade/renderer/path_tracer/PATH_TRACED_MEDIA_PLAN_2026_10_02.md +520 -0
  639. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  640. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -0
  641. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  642. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +2 -0
  643. package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
  644. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +188 -185
  645. package/src/shade/renderer/path_tracer/shader/STANDARD_MATERIAL_DATA_STRUCT.d.ts.map +1 -1
  646. package/src/shade/renderer/path_tracer/shader/STANDARD_MATERIAL_DATA_STRUCT.js +4 -1
  647. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts +13 -0
  648. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts.map +1 -0
  649. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.js +29 -0
  650. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.d.ts +79 -0
  651. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.d.ts.map +1 -1
  652. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +360 -70
  653. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
  654. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +4 -3
  655. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_beam.d.ts +24 -0
  656. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_beam.d.ts.map +1 -0
  657. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_beam.js +99 -0
  658. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_connect.d.ts +68 -0
  659. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_connect.d.ts.map +1 -0
  660. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_connect.js +263 -0
  661. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_constraint.d.ts +55 -0
  662. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_constraint.d.ts.map +1 -0
  663. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_constraint.js +148 -0
  664. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light.d.ts +17 -0
  665. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light.d.ts.map +1 -0
  666. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light.js +41 -0
  667. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light_sample.d.ts +20 -0
  668. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light_sample.d.ts.map +1 -0
  669. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light_sample.js +105 -0
  670. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle.d.ts +28 -0
  671. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle.d.ts.map +1 -0
  672. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle.js +97 -0
  673. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle_of_hit.d.ts +12 -0
  674. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle_of_hit.d.ts.map +1 -0
  675. package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle_of_hit.js +46 -0
  676. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_interface.d.ts +25 -0
  677. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_interface.d.ts.map +1 -0
  678. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_interface.js +75 -0
  679. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_path.d.ts +54 -0
  680. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_path.d.ts.map +1 -0
  681. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_path.js +245 -0
  682. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_phase.d.ts +42 -0
  683. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_phase.d.ts.map +1 -0
  684. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_phase.js +236 -0
  685. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_scatter_nee.d.ts +24 -0
  686. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_scatter_nee.d.ts.map +1 -0
  687. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_scatter_nee.js +97 -0
  688. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_stack.d.ts +57 -0
  689. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_stack.d.ts.map +1 -0
  690. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_stack.js +222 -0
  691. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_transport.d.ts +88 -0
  692. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_transport.d.ts.map +1 -0
  693. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_transport.js +304 -0
  694. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_volumes.d.ts +35 -0
  695. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_volumes.d.ts.map +1 -0
  696. package/src/shade/renderer/path_tracer/shader/media/chunk_medium_volumes.js +137 -0
  697. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.d.ts.map +1 -1
  698. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js +5 -35
  699. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  700. package/src/shade/renderer/postprocess/ssr/SSR.d.ts +12 -4
  701. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  702. package/src/shade/renderer/postprocess/ssr/SSR.js +36 -8
  703. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts +3 -0
  704. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts.map +1 -0
  705. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js +2 -0
  706. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts +8 -0
  707. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts.map +1 -0
  708. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js +40 -0
  709. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.d.ts.map +1 -1
  710. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.js +85 -84
  711. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  712. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +150 -137
  713. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts +3 -0
  714. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts.map +1 -0
  715. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js +44 -0
  716. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts +5 -0
  717. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts.map +1 -0
  718. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js +35 -0
  719. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts +26 -0
  720. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts.map +1 -0
  721. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js +42 -0
  722. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +1 -0
  723. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
  724. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +113 -105
  725. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +2 -0
  726. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  727. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +177 -167
  728. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.d.ts.map +1 -1
  729. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js +10 -0
  730. package/src/shade/renderer/rasterize/RasterizationJob.d.ts +1 -2
  731. package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
  732. package/src/shade/renderer/rasterize/RasterizationJob.js +1 -2
  733. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +5 -6
  734. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  735. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +5 -6
  736. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts +8 -0
  737. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts.map +1 -1
  738. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.js +9 -0
  739. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +14 -4
  740. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  741. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +13 -4
  742. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts +13 -7
  743. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts.map +1 -1
  744. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.js +13 -7
  745. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +309 -0
  746. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +54 -9
  747. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
  748. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +9 -1
  749. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_footprint_bias.d.ts +33 -0
  750. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_footprint_bias.d.ts.map +1 -0
  751. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_footprint_bias.js +45 -0
  752. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts +4 -0
  753. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts.map +1 -1
  754. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.js +6 -2
  755. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts +2 -1
  756. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts.map +1 -1
  757. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.js +4 -2
  758. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_level_word.d.ts +14 -0
  759. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_level_word.d.ts.map +1 -0
  760. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_level_word.js +28 -0
  761. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_lut_entry.d.ts +10 -0
  762. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_lut_entry.d.ts.map +1 -0
  763. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_lut_entry.js +18 -0
  764. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_marks.d.ts +19 -0
  765. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_marks.d.ts.map +1 -0
  766. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_marks.js +44 -0
  767. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_step_count.d.ts +10 -0
  768. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_step_count.d.ts.map +1 -0
  769. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_step_count.js +17 -0
  770. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  771. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +3 -1
  772. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts.map +1 -1
  773. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.js +163 -64
  774. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  775. package/src/shade/renderer/scene/GPUSceneContext.js +4 -1
  776. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
  777. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +16 -0
  778. package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.d.ts +12 -1
  779. package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.d.ts.map +1 -1
  780. package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.js +22 -3
  781. package/src/shade/renderer/shader/chunk/atmosphere/phase/chunk_sample_henyey_greenstein_cos.d.ts +18 -0
  782. package/src/shade/renderer/shader/chunk/atmosphere/phase/chunk_sample_henyey_greenstein_cos.d.ts.map +1 -0
  783. package/src/shade/renderer/shader/chunk/atmosphere/phase/chunk_sample_henyey_greenstein_cos.js +31 -0
  784. package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_phase_fournier_forand.d.ts +43 -0
  785. package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_phase_fournier_forand.d.ts.map +1 -0
  786. package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_phase_fournier_forand.js +153 -0
  787. package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_sample_fournier_forand.d.ts +13 -0
  788. package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_sample_fournier_forand.d.ts.map +1 -0
  789. package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_sample_fournier_forand.js +57 -0
  790. package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/fournier_forand_parameters_from_backscatter.d.ts +45 -0
  791. package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/fournier_forand_parameters_from_backscatter.d.ts.map +1 -0
  792. package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/fournier_forand_parameters_from_backscatter.js +109 -0
  793. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.d.ts.map +1 -1
  794. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.js +4 -5
  795. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_phase_draine.d.ts.map +1 -1
  796. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_phase_draine.js +6 -3
  797. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine.d.ts +24 -0
  798. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine.d.ts.map +1 -0
  799. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine.js +49 -0
  800. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine_cos.d.ts +18 -0
  801. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine_cos.d.ts.map +1 -1
  802. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine_cos.js +18 -0
  803. package/src/shade/renderer/shader/chunk/brdf/dfg/chunk_integrate_brdf.d.ts +3 -0
  804. package/src/shade/renderer/shader/chunk/brdf/dfg/chunk_integrate_brdf.d.ts.map +1 -1
  805. package/src/shade/renderer/shader/chunk/brdf/dfg/chunk_integrate_brdf.js +3 -0
  806. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.d.ts.map +1 -1
  807. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.js +1 -5
  808. package/src/shade/renderer/shader/chunk/brdf/dfg/shader_split_sum_dgf_lut.d.ts.map +1 -1
  809. package/src/shade/renderer/shader/chunk/brdf/dfg/shader_split_sum_dgf_lut.js +3 -1
  810. package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_dielectric.d.ts +24 -0
  811. package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_dielectric.d.ts.map +1 -0
  812. package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_dielectric.js +53 -0
  813. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_scene_point_query_is_inside_geometry.d.ts +7 -1
  814. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_scene_point_query_is_inside_geometry.d.ts.map +1 -1
  815. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_scene_point_query_is_inside_geometry.js +12 -60
  816. package/src/shade/renderer/shader/chunk/geometry/sphere/chunk_compute_spherical_excess.d.ts +26 -6
  817. package/src/shade/renderer/shader/chunk/geometry/sphere/chunk_compute_spherical_excess.d.ts.map +1 -1
  818. package/src/shade/renderer/shader/chunk/geometry/sphere/chunk_compute_spherical_excess.js +30 -20
  819. package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_directional.d.ts.map +1 -1
  820. package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_directional.js +3 -1
  821. package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_point.d.ts.map +1 -1
  822. package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_point.js +3 -1
  823. package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_spot.d.ts.map +1 -1
  824. package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_spot.js +3 -1
  825. package/src/shade/renderer/shader/chunk/light/sample/chunk_light_receiver_cosine.d.ts +14 -0
  826. package/src/shade/renderer/shader/chunk/light/sample/chunk_light_receiver_cosine.d.ts.map +1 -0
  827. package/src/shade/renderer/shader/chunk/light/sample/chunk_light_receiver_cosine.js +25 -0
  828. package/src/shade/renderer/shader/chunk/light/sample/chunk_select_light_importance.d.ts +9 -2
  829. package/src/shade/renderer/shader/chunk/light/sample/chunk_select_light_importance.d.ts.map +1 -1
  830. package/src/shade/renderer/shader/chunk/light/sample/chunk_select_light_importance.js +33 -10
  831. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts +30 -0
  832. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts.map +1 -0
  833. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.js +54 -0
  834. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.d.ts.map +1 -1
  835. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.js +71 -37
  836. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_band_of_index.d.ts +14 -0
  837. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_band_of_index.d.ts.map +1 -0
  838. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_band_of_index.js +30 -0
  839. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_basis_function.d.ts +19 -0
  840. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_basis_function.d.ts.map +1 -0
  841. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_basis_function.js +73 -0
  842. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_vmf_window.d.ts +19 -0
  843. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_vmf_window.d.ts.map +1 -0
  844. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_vmf_window.js +25 -0
  845. package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/SH_EXP_P4Q2_PROBE_STRUCT.d.ts +17 -0
  846. package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/SH_EXP_P4Q2_PROBE_STRUCT.d.ts.map +1 -0
  847. package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/SH_EXP_P4Q2_PROBE_STRUCT.js +23 -0
  848. package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_p4q2_base_reflectance.d.ts +26 -0
  849. package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_p4q2_base_reflectance.d.ts.map +1 -0
  850. package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_p4q2_base_reflectance.js +55 -0
  851. package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_split_sum.d.ts +52 -0
  852. package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_split_sum.d.ts.map +1 -0
  853. package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_split_sum.js +65 -0
  854. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_basis_at.d.ts +13 -0
  855. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_basis_at.d.ts.map +1 -0
  856. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_basis_at.js +229 -0
  857. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_color_evaluate_vmf.d.ts +23 -0
  858. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_color_evaluate_vmf.d.ts.map +1 -0
  859. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_color_evaluate_vmf.js +278 -0
  860. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh2_color_evaluate_vmf.d.ts +23 -0
  861. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh2_color_evaluate_vmf.d.ts.map +1 -0
  862. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh2_color_evaluate_vmf.js +58 -0
  863. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh3_color_evaluate_vmf.d.ts +23 -0
  864. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh3_color_evaluate_vmf.d.ts.map +1 -0
  865. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh3_color_evaluate_vmf.js +75 -0
  866. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_basis_at.d.ts +13 -0
  867. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_basis_at.d.ts.map +1 -0
  868. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_basis_at.js +70 -0
  869. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_color_evaluate_vmf.d.ts +23 -0
  870. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_color_evaluate_vmf.d.ts.map +1 -0
  871. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_color_evaluate_vmf.js +95 -0
  872. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_basis_at.d.ts +13 -0
  873. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_basis_at.d.ts.map +1 -0
  874. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_basis_at.js +89 -0
  875. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_color_evaluate_vmf.d.ts +23 -0
  876. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_color_evaluate_vmf.d.ts.map +1 -0
  877. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_color_evaluate_vmf.js +118 -0
  878. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_basis_at.d.ts +13 -0
  879. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_basis_at.d.ts.map +1 -0
  880. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_basis_at.js +111 -0
  881. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_color_evaluate_vmf.d.ts +23 -0
  882. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_color_evaluate_vmf.d.ts.map +1 -0
  883. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_color_evaluate_vmf.js +144 -0
  884. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_basis_at.d.ts +13 -0
  885. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_basis_at.d.ts.map +1 -0
  886. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_basis_at.js +136 -0
  887. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_color_evaluate_vmf.d.ts +23 -0
  888. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_color_evaluate_vmf.d.ts.map +1 -0
  889. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_color_evaluate_vmf.js +173 -0
  890. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_basis_at.d.ts +13 -0
  891. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_basis_at.d.ts.map +1 -0
  892. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_basis_at.js +164 -0
  893. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_color_evaluate_vmf.d.ts +23 -0
  894. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_color_evaluate_vmf.d.ts.map +1 -0
  895. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_color_evaluate_vmf.js +205 -0
  896. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_basis_at.d.ts +13 -0
  897. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_basis_at.d.ts.map +1 -0
  898. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_basis_at.js +195 -0
  899. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_color_evaluate_vmf.d.ts +23 -0
  900. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_color_evaluate_vmf.d.ts.map +1 -0
  901. package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_color_evaluate_vmf.js +240 -0
  902. package/src/shade/renderer/shader/resource/ShaderResourceGroupDescriptor.d.ts +0 -6
  903. package/src/shade/renderer/shader/resource/ShaderResourceGroupDescriptor.d.ts.map +1 -1
  904. package/src/shade/renderer/shader/resource/ShaderResourceGroupDescriptor.js +46 -1
  905. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  906. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +3 -2
  907. package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts +7 -7
  908. package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.js +7 -7
  909. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts +19 -0
  910. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts.map +1 -0
  911. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js +27 -0
  912. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +43 -10
  913. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  914. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +108 -48
  915. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +74 -4
  916. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  917. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +681 -77
  918. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +3 -1
  919. package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
  920. package/src/shade/renderer/shadow/map/Shadowmap.js +3 -1
  921. package/src/shade/renderer/shadow/map/csm/CSM_CASCADE_STRUCT.d.ts +30 -0
  922. package/src/shade/renderer/shadow/map/csm/CSM_CASCADE_STRUCT.d.ts.map +1 -0
  923. package/src/shade/renderer/shadow/map/csm/CSM_CASCADE_STRUCT.js +52 -0
  924. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_DEFAULT_CASCADE_COUNT.d.ts +8 -0
  925. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_DEFAULT_CASCADE_COUNT.d.ts.map +1 -0
  926. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_DEFAULT_CASCADE_COUNT.js +7 -0
  927. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +8 -6
  928. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -1
  929. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +28 -34
  930. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts +8 -0
  931. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map +1 -1
  932. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js +34 -3
  933. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_csm_compute_cascade_blended.d.ts +3 -2
  934. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_csm_compute_cascade_blended.d.ts.map +1 -1
  935. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_csm_compute_cascade_blended.js +19 -14
  936. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +5 -3
  937. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
  938. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +27 -7
  939. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
  940. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +137 -133
  941. package/src/shade/renderer/shadow/map/shadowmap_budget_carry_over.d.ts +4 -4
  942. package/src/shade/renderer/shadow/map/shadowmap_budget_carry_over.js +4 -4
  943. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts +15 -0
  944. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map +1 -0
  945. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js +14 -0
  946. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts +16 -0
  947. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts.map +1 -0
  948. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js +15 -0
  949. package/src/shade/renderer/shadow/vsm/PLAN.md +440 -0
  950. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +43 -0
  951. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +42 -0
  952. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +1 -0
  953. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +153 -0
  954. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +327 -0
  955. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -0
  956. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +1408 -0
  957. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts +14 -0
  958. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts.map +1 -0
  959. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.js +13 -0
  960. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts +63 -0
  961. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts.map +1 -0
  962. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.js +70 -0
  963. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts +11 -0
  964. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts.map +1 -0
  965. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.js +10 -0
  966. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +54 -0
  967. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +1 -0
  968. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +75 -0
  969. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts +23 -0
  970. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts.map +1 -0
  971. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.js +85 -0
  972. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts +16 -0
  973. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts.map +1 -0
  974. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.js +29 -0
  975. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +136 -25
  976. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
  977. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +280 -100
  978. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +39 -0
  979. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -0
  980. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +289 -0
  981. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts +18 -0
  982. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts.map +1 -0
  983. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.js +65 -0
  984. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts +17 -0
  985. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts.map +1 -0
  986. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.js +75 -0
  987. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +14 -0
  988. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +1 -0
  989. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +45 -0
  990. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts +17 -0
  991. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts.map +1 -0
  992. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.js +100 -0
  993. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts +15 -0
  994. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts.map +1 -0
  995. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.js +47 -0
  996. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts +26 -0
  997. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts.map +1 -0
  998. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.js +156 -0
  999. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts +13 -0
  1000. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts.map +1 -0
  1001. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.js +65 -0
  1002. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +30 -0
  1003. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +1 -0
  1004. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +184 -0
  1005. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +23 -0
  1006. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +1 -0
  1007. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +109 -0
  1008. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts +56 -0
  1009. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts.map +1 -0
  1010. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +211 -0
  1011. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts +1 -1
  1012. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts.map +1 -1
  1013. package/src/shade/renderer/texture/format/decode_typed_gpu_data.js +3 -13
  1014. package/src/shade/renderer/texture/format/infer_format_from_parameters.d.ts.map +1 -1
  1015. package/src/shade/renderer/texture/format/infer_format_from_parameters.js +2 -3
  1016. package/src/shade/renderer/texture/texture_write_to_gpu.d.ts.map +1 -1
  1017. package/src/shade/renderer/texture/texture_write_to_gpu.js +16 -16
  1018. package/src/shade/renderer/texture/util/BLACK_PIXEL_TEXTURE.d.ts +1 -1
  1019. package/src/shade/renderer/texture/util/BLACK_PIXEL_TEXTURE.d.ts.map +1 -1
  1020. package/src/shade/renderer/texture/util/PIXEL_TEXTURE_NORMAL.d.ts +18 -1
  1021. package/src/shade/renderer/texture/util/PIXEL_TEXTURE_NORMAL.d.ts.map +1 -1
  1022. package/src/shade/renderer/texture/util/PIXEL_TEXTURE_NORMAL.js +24 -3
  1023. package/src/shade/renderer/texture/util/WHITE_PIXEL_TEXTURE.d.ts +1 -1
  1024. package/src/shade/renderer/texture/util/WHITE_PIXEL_TEXTURE.d.ts.map +1 -1
  1025. package/src/shade/renderer/texture/util/get_single_pixel_texture.d.ts +0 -1
  1026. package/src/shade/renderer/texture/util/get_single_pixel_texture.d.ts.map +1 -1
  1027. package/src/shade/renderer/texture/util/get_single_pixel_texture.js +2 -23
  1028. package/src/shade/renderer/texture/util/single_pixel_texture_from_sampler.d.ts +11 -0
  1029. package/src/shade/renderer/texture/util/single_pixel_texture_from_sampler.d.ts.map +1 -0
  1030. package/src/shade/renderer/texture/util/single_pixel_texture_from_sampler.js +34 -0
  1031. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts +4 -90
  1032. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts.map +1 -1
  1033. package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +6 -210
  1034. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts +119 -0
  1035. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts.map +1 -0
  1036. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.js +245 -0
  1037. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts +1 -1
  1038. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts.map +1 -1
  1039. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +3 -19
  1040. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts +13 -0
  1041. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts.map +1 -0
  1042. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js +34 -0
  1043. package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts +17 -8
  1044. package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts.map +1 -1
  1045. package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +35 -64
  1046. package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts +21 -0
  1047. package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts.map +1 -0
  1048. package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.js +70 -0
  1049. package/src/shade/renderer/volumetrics/chunk_participating_media_volumes_iterate.d.ts +31 -0
  1050. package/src/shade/renderer/volumetrics/chunk_participating_media_volumes_iterate.d.ts.map +1 -0
  1051. package/src/shade/renderer/volumetrics/chunk_participating_media_volumes_iterate.js +86 -0
  1052. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  1053. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -4
  1054. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
  1055. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +6 -7
  1056. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +7 -7
  1057. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +20 -3
  1058. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  1059. package/src/shade/renderer/water/GPUWaterRenderer.js +84 -35
  1060. package/src/shade/renderer/water/chunk_water_gi.d.ts +14 -0
  1061. package/src/shade/renderer/water/chunk_water_gi.d.ts.map +1 -0
  1062. package/src/shade/renderer/water/chunk_water_gi.js +56 -0
  1063. package/src/shade/renderer/water/chunk_water_transport.d.ts +2 -0
  1064. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
  1065. package/src/shade/renderer/water/chunk_water_transport.js +52 -41
  1066. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +15 -0
  1067. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -0
  1068. package/src/shade/renderer/water/medium/GPUWaterBodies.js +64 -0
  1069. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts +4 -0
  1070. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts.map +1 -0
  1071. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.js +10 -0
  1072. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts +3 -0
  1073. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts.map +1 -0
  1074. package/src/shade/renderer/water/medium/chunk_water_bodies.js +3 -0
  1075. package/src/shade/renderer/water/medium/chunk_water_medium_derived.d.ts +9 -0
  1076. package/src/shade/renderer/water/medium/chunk_water_medium_derived.d.ts.map +1 -0
  1077. package/src/shade/renderer/water/medium/chunk_water_medium_derived.js +55 -0
  1078. package/src/shade/renderer/water/medium/chunk_water_medium_scattering.d.ts +8 -0
  1079. package/src/shade/renderer/water/medium/chunk_water_medium_scattering.d.ts.map +1 -0
  1080. package/src/shade/renderer/water/medium/chunk_water_medium_scattering.js +17 -0
  1081. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +4 -0
  1082. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +1 -0
  1083. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +32 -0
  1084. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +4 -0
  1085. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -0
  1086. package/src/shade/renderer/water/medium/shader_water_meshlets.js +69 -0
  1087. package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts +28 -0
  1088. package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts.map +1 -0
  1089. package/src/shade/renderer/water/optics/chunk_water_inscatter.js +124 -0
  1090. package/src/shade/renderer/water/optics/chunk_water_optics.d.ts +12 -0
  1091. package/src/shade/renderer/water/optics/chunk_water_optics.d.ts.map +1 -0
  1092. package/src/shade/renderer/water/optics/chunk_water_optics.js +75 -0
  1093. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +27 -0
  1094. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -0
  1095. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +75 -0
  1096. package/src/shade/renderer/water/shader_water.d.ts +11 -5
  1097. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  1098. package/src/shade/renderer/water/shader_water.js +262 -156
  1099. package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
  1100. package/src/shade/renderer/water/shader_water_avboit.js +19 -9
  1101. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +25 -0
  1102. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +1 -0
  1103. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +128 -0
  1104. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +6 -0
  1105. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -0
  1106. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +23 -0
  1107. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +9 -0
  1108. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +1 -0
  1109. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +144 -0
  1110. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +13 -0
  1111. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +1 -0
  1112. package/src/shade/renderer/water/surface/chunk_water_wave.js +40 -0
  1113. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +14 -0
  1114. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -0
  1115. package/src/shade/renderer/water/surface/graph_water_tessellation.js +34 -0
  1116. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +4 -0
  1117. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +1 -0
  1118. package/src/shade/renderer/water/surface/shader_water_tiles.js +123 -0
  1119. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +6 -0
  1120. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +1 -0
  1121. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +85 -0
  1122. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +6 -0
  1123. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +1 -0
  1124. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +83 -0
  1125. package/src/shade/renderer/water/water_height_texture_from_sampler.d.ts.map +1 -1
  1126. package/src/shade/renderer/water/water_height_texture_from_sampler.js +4 -3
  1127. package/src/shade/renderer/water/water_missing_receiver_path.d.ts +17 -0
  1128. package/src/shade/renderer/water/water_missing_receiver_path.d.ts.map +1 -0
  1129. package/src/shade/renderer/water/water_missing_receiver_path.js +40 -0
  1130. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  1131. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +247 -23
  1132. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts +18 -14
  1133. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  1134. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +48 -6
  1135. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts +0 -2
  1136. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts.map +0 -1
  1137. package/src/engine/graphics/ecs/water/WATER_SIZE.js +0 -1
  1138. package/src/shade/renderer/light/GPUViewLightContext.d.ts +0 -22
  1139. package/src/shade/renderer/light/GPUViewLightContext.d.ts.map +0 -1
  1140. package/src/shade/renderer/light/GPUViewLightContext.js +0 -62
  1141. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts +0 -29
  1142. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts.map +0 -1
  1143. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.js +0 -43
  1144. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASCADE_COUNT.d.ts +0 -7
  1145. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASCADE_COUNT.d.ts.map +0 -1
  1146. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASCADE_COUNT.js +0 -6
  1147. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts +0 -27
  1148. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +0 -1
  1149. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +0 -125
  1150. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts +0 -7
  1151. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts.map +0 -1
  1152. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.js +0 -41
  1153. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts +0 -2
  1154. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts.map +0 -1
  1155. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.js +0 -1
  1156. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts +0 -3
  1157. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts.map +0 -1
  1158. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.js +0 -7
  1159. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts +0 -24
  1160. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts.map +0 -1
  1161. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.js +0 -103
  1162. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts +0 -8
  1163. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts.map +0 -1
  1164. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.js +0 -34
  1165. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts +0 -10
  1166. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts.map +0 -1
  1167. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.js +0 -64
  1168. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts +0 -11
  1169. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts.map +0 -1
  1170. package/src/shade/renderer/shadow/vsm/decode_tile_address.js +0 -34
  1171. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts +0 -2
  1172. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts.map +0 -1
  1173. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.js +0 -11
  1174. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts +0 -20
  1175. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts.map +0 -1
  1176. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.js +0 -187
  1177. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts +0 -25
  1178. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts.map +0 -1
  1179. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.js +0 -220
  1180. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts +0 -19
  1181. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts.map +0 -1
  1182. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.js +0 -115
  1183. package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +0 -462
@@ -1,6 +1,6 @@
1
- import { apply_impulse_to_body } from "./apply_impulse_to_body.js";
1
+ import { apply_impulse_to_body_oriented } from "./apply_impulse_to_body.js";
2
2
  import { v3_quaternion_apply } from "../../../core/geom/vec3/v3_quaternion_apply.js";
3
- import { v3_quaternion_apply_inverse } from "../../../core/geom/vec3/v3_quaternion_apply_inverse.js";
3
+ import { v3_quaternion_apply_inverse_array } from "../../../core/geom/vec3/v3_quaternion_apply_inverse.js";
4
4
  import { body_id_index } from "../body/BodyStorage.js";
5
5
  import {
6
6
  SBS_AV_X,
@@ -22,7 +22,7 @@ import {
22
22
  import { CONTACT_FLAG_SENSOR, CONTACT_FLAGS_OFFSET, CONTACT_STRIDE } from "../contact/ManifoldStore.js";
23
23
  import { BodyKind } from "../ecs/BodyKind.js";
24
24
  import { body_is_wholly_sensor } from "../ecs/is_sensor.js";
25
- import { angular_effective_mass_raw, world_inverse_inertia_apply_raw } from "../inertia/world_inverse_inertia.js";
25
+ import { angular_effective_mass_array, world_inverse_inertia_apply_array } from "../inertia/world_inverse_inertia.js";
26
26
  import { redetect_pair_geometry } from "../narrowphase/narrowphase_step.js";
27
27
  import { friction_cone_clamp } from "./friction_cone.js";
28
28
 
@@ -43,7 +43,7 @@ import { friction_cone_clamp } from "./friction_cone.js";
43
43
  * solve_velocity(manifolds, system, iters) // non-penetration + friction
44
44
  * solve_position(manifolds, system, pos_iters)
45
45
  * (system integrates position by h, folding pseudo-velocity)
46
- * apply_restitution(manifolds, system) // once, after the loop
46
+ * apply_restitution(manifolds, system, passes) // after the loop
47
47
  *
48
48
  * The three concerns are fully decoupled (Phases 1–2) and substepping
49
49
  * (Phase 3) re-runs only the velocity + position solve per substep —
@@ -53,6 +53,23 @@ import { friction_cone_clamp } from "./friction_cone.js";
53
53
  * adapts as the stack settles (the mechanism behind TGS stack stability)
54
54
  * without paying for narrowphase N times.
55
55
  *
56
+ * Only the penetration moves. The rest of a row — its lever arms, and the
57
+ * orientation each body's world inverse inertia is evaluated at — is fixed
58
+ * at prepare for the whole outer step, because the row's effective mass is
59
+ * computed from exactly those once, at prepare. Every pass (warm start,
60
+ * biased solve, relax, restitution, position) applies its impulse through
61
+ * the same Jacobian and inertia the mass was built from. Let either drift
62
+ * under a fixed mass and each Gauss-Seidel update over-corrects by
63
+ * K_applied / K_prepared; past 2 the iteration diverges — a box knocked out
64
+ * from under a stack (levers following the contact metres past both bodies)
65
+ * or a long body spinning flat (world inertia turning over within the step)
66
+ * gained energy by factors of 1e11 and more. Box3D does the same: "fixed
67
+ * anchor points for applying impulses" (`cp->rA`, `cp->rB`) and the
68
+ * prepare-time `invInertiaWorld` (contact_solver.c). Concave pairs re-detect
69
+ * their levers every substep, and take the orientations at that same pose and
70
+ * recompute their masses from both: the row is re-prepared, whole, at the
71
+ * substep, and fixed from there to the next re-detect.
72
+ *
56
73
  * Why staged module functions sharing module scratch, rather than one call:
57
74
  * the substep loop interleaves solver stages with whole-body integration
58
75
  * that lives in the system. The stages communicate through module-scoped
@@ -114,7 +131,7 @@ const DEFAULT_POSITION_ITERATIONS = 2;
114
131
  * micro-jitter at near-zero overlap.
115
132
  * @type {number}
116
133
  */
117
- const PENETRATION_SLOP = 0.005;
134
+ export const PENETRATION_SLOP = 0.005;
118
135
 
119
136
  /**
120
137
  * SPOOK contact stiffness `k`. Effectively infinite for rigid-body
@@ -144,11 +161,12 @@ const CONTACT_RELAXATION = 4.75;
144
161
  const MAX_POSITION_BIAS = 3;
145
162
 
146
163
  /**
147
- * Velocity below which restitution is suppressed (no micro-bounce buzz on
148
- * resting stacks).
164
+ * Default approach speed, m/s, below which restitution is suppressed (no
165
+ * micro-bounce buzz on resting stacks) — the default of
166
+ * `PhysicsSystem.restitutionThreshold`, which is what the solver reads.
149
167
  * @type {number}
150
168
  */
151
- const RESTITUTION_VELOCITY_THRESHOLD = 1.0;
169
+ export const RESTITUTION_VELOCITY_THRESHOLD = 1.0;
152
170
 
153
171
  /**
154
172
  * Box2D-v3 soft-constraint scales (`b2MakeSoft`) for a damped spring of
@@ -196,11 +214,12 @@ const g_soft_dyn = new Float64Array([1, 0, 0]);
196
214
  const g_soft_static = new Float64Array([1, 0, 0]);
197
215
 
198
216
  /**
199
- * Per-contact pre-step scratch stride: 23 doubles.
217
+ * Per-contact pre-step scratch stride: 34 doubles.
200
218
  * 0..2 : localWA (A's contact witness, in A's LOCAL frame — constant)
201
219
  * 3..5 : localWB (B's contact witness, in B's LOCAL frame — constant)
202
- * 6..8 : rA (lever from A's COM to the contact midpoint — refreshed)
203
- * 9..11: rB (lever from B's COM to the contact midpoint — refreshed)
220
+ * 6..8 : rA (lever from A's COM to the contact midpoint — fixed at prepare;
221
+ * concave contacts re-detect it each substep)
222
+ * 9..11: rB (lever from B's COM to the contact midpoint — likewise)
204
223
  * 12..14: t1 (tangent 1, unit, world — constant)
205
224
  * 15..17: t2 (tangent 2, unit, world — constant)
206
225
  * 18 : m_eff_n
@@ -211,16 +230,29 @@ const g_soft_static = new Float64Array([1, 0, 0]);
211
230
  * 23 : soft_mass_scale (soft-contact velocity scale — 1 when hard)
212
231
  * 24 : soft_imp_scale (soft-contact impulse-decay scale — 0 when hard)
213
232
  * 25 : soft_bias_rate (penetration-bias rate — 0 when hard)
233
+ * 26..29: qA (A's orientation at prepare — what A's world inverse inertia
234
+ * is evaluated at for the whole step; concave contacts
235
+ * re-take it each substep with their levers)
236
+ * 30..33: qB (B's, likewise)
214
237
  *
215
238
  * `localWA` / `localWB` are the per-body contact witnesses expressed in body
216
239
  * local frames at prepare time. Each substep, `refresh_contacts` rotates
217
240
  * them back to world by the body's current pose to recover the moved contact
218
- * points, re-derives the current penetration depth (anchored on the trusted
219
- * prepare-time depth via a delta, so it's sign-robust), and rebuilds the
220
- * impulse lever arms `rA` / `rB` and the position bias.
241
+ * points and re-derives the current penetration depth (anchored on the trusted
242
+ * prepare-time depth via a delta, so it's sign-robust) and the position bias.
243
+ * The levers, the orientations and the effective masses built from them stay
244
+ * as prepared (see the file header).
221
245
  * @type {number}
222
246
  */
223
- const PRE_STRIDE = 26;
247
+ const PRE_STRIDE = 34;
248
+
249
+ /** Offset of `qA` within a contact's pre span; `qB` follows at +4. */
250
+ const PRE_QA = 26;
251
+ const PRE_QB = 30;
252
+
253
+ /** Offset of the lever `rA` within a contact's pre span; `rB` follows at +3. */
254
+ const PRE_RA = 6;
255
+ const PRE_RB = 9;
224
256
 
225
257
  /** Per-contact index list — 4 uint32 per contact: slot, idx, idxA, idxB. */
226
258
  const INDEX_STRIDE = 4;
@@ -239,21 +271,46 @@ let scratch_mu = new Float64Array(64);
239
271
  let scratch_pos_jn = new Float64Array(64);
240
272
 
241
273
  /**
242
- * Per-contact maximum normal impulse seen across the whole outer step's
243
- * velocity solving (all substeps, all iterations). Reset in
244
- * {@link prepare_contacts}, updated in {@link solve_velocity}, read by
245
- * {@link apply_restitution}.
274
+ * Per-contact total normal impulse over the outer step (Box3D
275
+ * `totalNormalImpulse`): the normal impulse the contact delivered, then grown
276
+ * by every restitution pass's impulse. Reset in {@link prepare_contacts},
277
+ * summed in {@link solve_velocity} and {@link apply_restitution}.
246
278
  *
247
- * Restitution must fire whenever a contact *was* compressive at some point
248
- * in the step, even if its accumulated impulse later relaxes back to ~0 — a
249
- * transient collision (ball bouncing, head-on hit) under per-substep
250
- * warm-start ends the loop with `j_n ≈ 0` because there's no sustained load
251
- * to hold the impulse up. Gating on this running max (Box2D-v3
252
- * `maxNormalImpulse`) rather than the end-of-loop `j_n` is what makes
253
- * bounces fire.
279
+ * A substep warm-starts the contact with its accumulated impulse and the
280
+ * velocity solve adjusts it, so the impulse the contact delivers in a substep
281
+ * is the accumulated value the substep ends on: {@link solve_velocity} adds
282
+ * that once per substep, at the end of the relax pass (soft contacts) or of
283
+ * the solve (hard). Box3D adds the value after its solve AND after its relax,
284
+ * about twice the delivered impulse, and a cap built on that rarely binds:
285
+ * counted that way here, it bound in 0 of 814 armed checks over ten
286
+ * restitution scenes at 2 passes, and a tumbling cube striking frictionless
287
+ * ground at e = 1 in zero gravity with one pass left with up to 7.0% more
288
+ * kinetic energy than it struck with (13 of 300 strikes gaining over 0.5%).
289
+ * Counted once per substep, it binds where a pass overshoots and the worst
290
+ * strike gains 0.2%. (Under gravity a landing's depth correction adds energy
291
+ * the cap does not see; see `PhysicsSystem.restitutionIterations`.)
292
+ *
293
+ * It is also the restitution gate: a contact bounces only if it *was*
294
+ * compressive at some point in the step, even if its accumulated impulse later
295
+ * relaxed back to ~0 — a transient collision (ball bouncing, head-on hit)
296
+ * under per-substep warm-start ends the loop with `j_n ≈ 0` because there's
297
+ * no sustained load to hold the impulse up. (The peak accumulated impulse, an
298
+ * earlier measure, understated the compression: capped on it, a cube dropped
299
+ * flat onto a cube resting on the floor at e = 0.8 rebounded at 3.32 m/s of
300
+ * the 3.53 m/s it is owed, however many passes ran.)
301
+ * @type {Float64Array}
302
+ */
303
+ let scratch_total_jn = new Float64Array(64);
304
+
305
+ /**
306
+ * Per-contact restitution impulse (Box3D `restitutionImpulse`): the part of
307
+ * {@link apply_restitution}'s impulse that went past stopping what was left of
308
+ * the approach, i.e. into sending the bodies apart. `total − restitution` is
309
+ * the compression impulse a bounce may return `e` times of, and no more.
310
+ * Reset at the start of {@link apply_restitution}.
254
311
  * @type {Float64Array}
255
312
  */
256
- let scratch_max_jn = new Float64Array(64);
313
+ let scratch_rest_jn = new Float64Array(64);
257
314
 
258
315
  /**
259
316
  * Per-contact flag: 1 if the contact's pair involves a concave body, else 0.
@@ -265,6 +322,22 @@ let scratch_max_jn = new Float64Array(64);
265
322
  */
266
323
  let scratch_concave = new Uint8Array(64);
267
324
 
325
+ /**
326
+ * Per-contact: which side of the pair the solver cannot move (zero inverse mass — static,
327
+ * kinematic, or a sleeping neighbour) while the other side it can: {@link IMMOVABLE_NONE},
328
+ * {@link IMMOVABLE_A} or {@link IMMOVABLE_B}. Filled by {@link prepare_contacts}; read by
329
+ * {@link refresh_contacts}, which lets that side's lever follow the movable side (see there).
330
+ * @type {Uint8Array}
331
+ */
332
+ let scratch_immovable = new Uint8Array(64);
333
+
334
+ /** Both sides move, or neither does. */
335
+ const IMMOVABLE_NONE = 0;
336
+ /** Body A has zero inverse mass, body B does not. */
337
+ const IMMOVABLE_A = 1;
338
+ /** Body B has zero inverse mass, body A does not. */
339
+ const IMMOVABLE_B = 2;
340
+
268
341
  /**
269
342
  * Distinct concave-involved manifold slots touched this step, with the body
270
343
  * indices needed to fetch their collider lists for re-detection. Parallel
@@ -288,6 +361,9 @@ let g_spook_eps = 0;
288
361
  /** Scratch for re-deriving contact world points in {@link refresh_contacts}. */
289
362
  const scratch_cp = new Float64Array(6);
290
363
 
364
+ /** A contact pair's two orientations, A's then B's, for the witness anchors in {@link prepare_contacts}. */
365
+ const scratch_orientations = new Float64Array(8);
366
+
291
367
  function ensure_capacity(n) {
292
368
  if (scratch_pre.length < n * PRE_STRIDE) {
293
369
  scratch_pre = new Float64Array(n * PRE_STRIDE * 2);
@@ -301,11 +377,13 @@ function ensure_capacity(n) {
301
377
  if (scratch_pos_jn.length < n) {
302
378
  scratch_pos_jn = new Float64Array(n * 2);
303
379
  }
304
- if (scratch_max_jn.length < n) {
305
- scratch_max_jn = new Float64Array(n * 2);
380
+ if (scratch_total_jn.length < n) {
381
+ scratch_total_jn = new Float64Array(n * 2);
382
+ scratch_rest_jn = new Float64Array(n * 2);
306
383
  }
307
384
  if (scratch_concave.length < n) {
308
385
  scratch_concave = new Uint8Array(n * 2);
386
+ scratch_immovable = new Uint8Array(n * 2);
309
387
  }
310
388
  }
311
389
 
@@ -334,13 +412,19 @@ function ensure_concave_slot_capacity(n) {
334
412
  /**
335
413
  * Build an orthonormal tangent basis perpendicular to a unit normal.
336
414
  *
415
+ * The normal is read from an array: this is not inlined into its callers, and
416
+ * a call that is not inlined boxes every number passed to it.
417
+ *
337
418
  * @param {Float64Array} out 6 floats: t1.xyz then t2.xyz
338
419
  * @param {number} off
339
- * @param {number} nx
340
- * @param {number} ny
341
- * @param {number} nz
420
+ * @param {Float64Array} normal
421
+ * @param {number} normal_offset where in `normal` its x is, y and z following
342
422
  */
343
- function build_tangents(out, off, nx, ny, nz) {
423
+ function build_tangents(out, off, normal, normal_offset) {
424
+ const nx = normal[normal_offset];
425
+ const ny = normal[normal_offset + 1];
426
+ const nz = normal[normal_offset + 2];
427
+
344
428
  const ax = nx < 0 ? -nx : nx;
345
429
  const ay = ny < 0 ? -ny : ny;
346
430
  const az = nz < 0 ? -nz : nz;
@@ -394,57 +478,73 @@ const scratch_clamp = new Float64Array(2);
394
478
  const scratch_inertia_a = new Float64Array(3);
395
479
  const scratch_inertia_b = new Float64Array(3);
396
480
 
481
+ /**
482
+ * The impulse a row applies to both of its bodies, handed to {@link apply_impulse_to_body_oriented} in
483
+ * an array: a call it is not inlined into would box three loose numbers per body.
484
+ */
485
+ const scratch_impulse = new Float64Array(3);
486
+
397
487
 
398
488
  /**
399
489
  * Apply a position-pass impulse `P` at body-relative offset `r` to the
400
490
  * body's pseudo-velocity (linear + angular) in the `pseudo_velocity` flat
401
- * buffer. Mirrors {@link apply_impulse_to_body} but the result is consumed
402
- * by `integrate_position` the same substep and never persists. Inverse
403
- * inertia / orientation are read from the body's {@link SolverBodyState} span.
491
+ * buffer. Mirrors {@link apply_impulse_to_body_oriented} but the result is
492
+ * consumed by `integrate_position` the same substep and never persists. The
493
+ * inverse mass and inverse-inertia diagonal are read from the body's
494
+ * {@link SolverBodyState} span, the orientation it is evaluated at is the
495
+ * contact's prepared one. Lever and impulse come in arrays, for the reason
496
+ * {@link apply_impulse_to_body_oriented} gives.
404
497
  *
405
498
  * @param {Float64Array} pseudo_velocity stride = {@link PSEUDO_STRIDE}
406
499
  * @param {number} pbase offset = `body_index * PSEUDO_STRIDE`
407
500
  * @param {Float64Array} ss solver-body-state data array
408
501
  * @param {number} sbase `body_index * SBS_STRIDE`
409
- * @param {number} invM
410
- * @param {number} rx
411
- * @param {number} ry
412
- * @param {number} rz
413
- * @param {number} Px
414
- * @param {number} Py
415
- * @param {number} Pz
502
+ * @param {Float64Array} rotation holds the orientation at prepare, a unit quaternion
503
+ * @param {number} rotation_offset
504
+ * @param {Float64Array} lever
505
+ * @param {number} lever_offset
506
+ * @param {Float64Array} impulse
507
+ * @param {number} impulse_offset
416
508
  * @param {number} sign +1 for body A, -1 for body B
417
509
  * @param {Float64Array} scratch_inertia
418
510
  */
419
511
  function apply_impulse_to_pseudo(
420
512
  pseudo_velocity, pbase,
421
- ss, sbase, invM,
422
- rx, ry, rz,
423
- Px, Py, Pz,
513
+ ss, sbase,
514
+ rotation, rotation_offset,
515
+ lever, lever_offset,
516
+ impulse, impulse_offset,
424
517
  sign,
425
518
  scratch_inertia
426
519
  ) {
520
+ const invM = ss[sbase + SBS_INV_MASS];
521
+
427
522
  if (invM === 0) {
428
523
  return;
429
524
  }
430
525
 
431
- const sPx = sign * Px;
432
- const sPy = sign * Py;
433
- const sPz = sign * Pz;
526
+ const sPx = sign * impulse[impulse_offset];
527
+ const sPy = sign * impulse[impulse_offset + 1];
528
+ const sPz = sign * impulse[impulse_offset + 2];
434
529
 
435
530
  pseudo_velocity[pbase] += sPx * invM;
436
531
  pseudo_velocity[pbase + 1] += sPy * invM;
437
532
  pseudo_velocity[pbase + 2] += sPz * invM;
438
533
 
439
- const tx = ry * sPz - rz * sPy;
440
- const ty = rz * sPx - rx * sPz;
441
- const tz = rx * sPy - ry * sPx;
534
+ const rx = lever[lever_offset];
535
+ const ry = lever[lever_offset + 1];
536
+ const rz = lever[lever_offset + 2];
537
+
538
+ // the torque r x P, transformed in place by the world inverse inertia
539
+ scratch_inertia[0] = ry * sPz - rz * sPy;
540
+ scratch_inertia[1] = rz * sPx - rx * sPz;
541
+ scratch_inertia[2] = rx * sPy - ry * sPx;
442
542
 
443
- world_inverse_inertia_apply_raw(
543
+ world_inverse_inertia_apply_array(
444
544
  scratch_inertia, 0,
445
- ss[sbase + SBS_INV_I_X], ss[sbase + SBS_INV_I_Y], ss[sbase + SBS_INV_I_Z],
446
- ss[sbase + SBS_QX], ss[sbase + SBS_QY], ss[sbase + SBS_QZ], ss[sbase + SBS_QW],
447
- tx, ty, tz
545
+ ss, sbase + SBS_INV_I_X,
546
+ rotation, rotation_offset,
547
+ scratch_inertia, 0
448
548
  );
449
549
 
450
550
  pseudo_velocity[pbase + 3] += scratch_inertia[0];
@@ -454,45 +554,94 @@ function apply_impulse_to_pseudo(
454
554
 
455
555
  /**
456
556
  * Quadratic-form contribution of one body to the constraint effective mass
457
- * along a unit axis: `(r × axis)^T · I⁻¹_world · (r × axis)`. Reads the body's
458
- * inverse-inertia diagonal + orientation from its {@link SolverBodyState} span.
459
- * Non-dynamic bodies carry a zero inverse-inertia diagonal there, so the
460
- * zero-guard returns 0 for them — matching the object path's `kind` guard.
557
+ * along a unit axis: `(r × axis)^T · I⁻¹_world · (r × axis)`, with `I⁻¹_world`
558
+ * evaluated at orientation `q` — the contact's prepared one, the same the
559
+ * row's impulses are applied through. Reads the body's inverse-inertia
560
+ * diagonal from its {@link SolverBodyState} span. Non-dynamic bodies carry a
561
+ * zero inverse-inertia diagonal there, so the zero-guard gives 0 for them —
562
+ * matching the object path's `kind` guard.
461
563
  *
564
+ * Inputs come in arrays and the contribution goes out through `result`: six
565
+ * of these run per contact, more than V8 will inline into one function, and a
566
+ * call that is not inlined boxes every number passed to it or returned.
567
+ *
568
+ * @param {Float64Array} result receives the contribution at `result_offset`
569
+ * @param {number} result_offset
462
570
  * @param {Float64Array} ss solver-body-state data array
463
571
  * @param {number} base `body_index * SBS_STRIDE`
464
- * @param {number} rx
465
- * @param {number} ry
466
- * @param {number} rz
467
- * @param {number} ax
468
- * @param {number} ay
469
- * @param {number} az
572
+ * @param {Float64Array} rotation holds the orientation at prepare, a unit quaternion
573
+ * @param {number} rotation_offset
574
+ * @param {Float64Array} lever
575
+ * @param {number} lever_offset
576
+ * @param {Float64Array} axis
577
+ * @param {number} axis_offset
470
578
  * @param {Float64Array} scratch_inertia
471
- * @returns {number}
472
579
  */
473
580
  function angular_jacobian_contribution(
581
+ result, result_offset,
474
582
  ss, base,
475
- rx, ry, rz,
476
- ax, ay, az,
583
+ rotation, rotation_offset,
584
+ lever, lever_offset,
585
+ axis, axis_offset,
477
586
  scratch_inertia
478
587
  ) {
479
- const iix = ss[base + SBS_INV_I_X];
480
- const iiy = ss[base + SBS_INV_I_Y];
481
- const iiz = ss[base + SBS_INV_I_Z];
482
-
483
- if (iix === 0 && iiy === 0 && iiz === 0) {
484
- return 0;
588
+ if (ss[base + SBS_INV_I_X] === 0 && ss[base + SBS_INV_I_Y] === 0 && ss[base + SBS_INV_I_Z] === 0) {
589
+ result[result_offset] = 0;
590
+ return;
485
591
  }
486
592
 
487
- return angular_effective_mass_raw(
488
- iix, iiy, iiz,
489
- ss[base + SBS_QX], ss[base + SBS_QY], ss[base + SBS_QZ], ss[base + SBS_QW],
490
- rx, ry, rz,
491
- ax, ay, az,
593
+ angular_effective_mass_array(
594
+ result, result_offset,
595
+ ss, base + SBS_INV_I_X,
596
+ rotation, rotation_offset,
597
+ lever, lever_offset,
598
+ axis, axis_offset,
492
599
  scratch_inertia
493
600
  );
494
601
  }
495
602
 
603
+ /**
604
+ * Effective-mass contributions of one contact's two bodies, written by
605
+ * {@link prepare_row_masses}: A·n, B·n, A·t1, B·t1, A·t2, B·t2.
606
+ */
607
+ const scratch_row_mass = new Float64Array(6);
608
+
609
+ /**
610
+ * The three effective masses of a contact's rows (normal, tangent 1, tangent 2)
611
+ * from its prepared levers, orientations and tangents and its normal, into the
612
+ * pre span (lanes 18..20). The normal row is softened by the SPOOK `eps`.
613
+ *
614
+ * @param {Float64Array} pre
615
+ * @param {number} pre_off
616
+ * @param {Float64Array} ss solver-body-state data array
617
+ * @param {number} baseA
618
+ * @param {number} baseB
619
+ * @param {Float64Array} data the manifold store's buffer, holding the normal
620
+ * @param {number} normal_offset where in `data` the contact normal's x is
621
+ */
622
+ function prepare_row_masses(pre, pre_off, ss, baseA, baseB, data, normal_offset) {
623
+ const mass = scratch_row_mass;
624
+
625
+ angular_jacobian_contribution(mass, 0, ss, baseA, pre, pre_off + PRE_QA, pre, pre_off + PRE_RA, data, normal_offset, scratch_inertia_a);
626
+ angular_jacobian_contribution(mass, 1, ss, baseB, pre, pre_off + PRE_QB, pre, pre_off + PRE_RB, data, normal_offset, scratch_inertia_b);
627
+ angular_jacobian_contribution(mass, 2, ss, baseA, pre, pre_off + PRE_QA, pre, pre_off + PRE_RA, pre, pre_off + 12, scratch_inertia_a);
628
+ angular_jacobian_contribution(mass, 3, ss, baseB, pre, pre_off + PRE_QB, pre, pre_off + PRE_RB, pre, pre_off + 12, scratch_inertia_b);
629
+ angular_jacobian_contribution(mass, 4, ss, baseA, pre, pre_off + PRE_QA, pre, pre_off + PRE_RA, pre, pre_off + 15, scratch_inertia_a);
630
+ angular_jacobian_contribution(mass, 5, ss, baseB, pre, pre_off + PRE_QB, pre, pre_off + PRE_RB, pre, pre_off + 15, scratch_inertia_b);
631
+
632
+ const invMA = ss[baseA + SBS_INV_MASS];
633
+ const invMB = ss[baseB + SBS_INV_MASS];
634
+
635
+ const k_n = invMA + invMB + mass[0] + mass[1];
636
+ const k_t1 = invMA + invMB + mass[2] + mass[3];
637
+ const k_t2 = invMA + invMB + mass[4] + mass[5];
638
+
639
+ const k_n_eff = k_n + g_spook_eps;
640
+ pre[pre_off + 18] = k_n_eff > 0 ? 1 / k_n_eff : 0;
641
+ pre[pre_off + 19] = k_t1 > 0 ? 1 / k_t1 : 0;
642
+ pre[pre_off + 20] = k_t2 > 0 ? 1 / k_t2 : 0;
643
+ }
644
+
496
645
  /**
497
646
  * Flat count of all touched contacts across every island, plus the slot
498
647
  * list to iterate. Islands are concatenated densely in `contact_data`;
@@ -642,7 +791,14 @@ export function prepare_contacts(manifolds, system, dt_sub) {
642
791
 
643
792
  const pAx = trA.translation_x, pAy = trA.translation_y, pAz = trA.translation_z;
644
793
  const pBx = trB.translation_x, pBy = trB.translation_y, pBz = trB.translation_z;
645
- const qA = trA.rotation, qB = trB.rotation;
794
+
795
+ // The two orientations the witnesses are taken into the bodies' frames by, in an array (see
796
+ // the witness anchors below).
797
+ const orientations = scratch_orientations;
798
+ orientations[0] = trA.rotation_x; orientations[1] = trA.rotation_y;
799
+ orientations[2] = trA.rotation_z; orientations[3] = trA.rotation_w;
800
+ orientations[4] = trB.rotation_x; orientations[5] = trB.rotation_y;
801
+ orientations[6] = trB.rotation_z; orientations[7] = trB.rotation_w;
646
802
 
647
803
  for (let k = 0; k < cc; k++) {
648
804
  const off = slot_off + k * CONTACT_STRIDE;
@@ -676,12 +832,18 @@ export function prepare_contacts(manifolds, system, dt_sub) {
676
832
  const pre_off = c * PRE_STRIDE;
677
833
 
678
834
  // Per-body witness anchors in LOCAL frame (constant across the
679
- // outer step). localW = R⁻¹ · (witness − COM).
680
- v3_quaternion_apply_inverse(pre, pre_off, wax - pAx, way - pAy, waz - pAz, qA[0], qA[1], qA[2], qA[3]);
681
- v3_quaternion_apply_inverse(pre, pre_off + 3, wbx - pBx, wby - pBy, wbz - pBz, qB[0], qB[1], qB[2], qB[3]);
682
-
683
- // Lever arms from COM to the contact midpoint (refreshed each
684
- // substep; seeded here from prepare-time pose).
835
+ // outer step). localW = R⁻¹ · (witness − COM). The offsets are
836
+ // staged in the pre span itself and rotated in place, through
837
+ // the array form: this function's inlining budget is spent, and
838
+ // the scalar form, not inlined, boxed its seven numbers twice
839
+ // per contact.
840
+ pre[pre_off] = wax - pAx; pre[pre_off + 1] = way - pAy; pre[pre_off + 2] = waz - pAz;
841
+ pre[pre_off + 3] = wbx - pBx; pre[pre_off + 4] = wby - pBy; pre[pre_off + 5] = wbz - pBz;
842
+ v3_quaternion_apply_inverse_array(pre, pre_off, pre, pre_off, orientations, 0);
843
+ v3_quaternion_apply_inverse_array(pre, pre_off + 3, pre, pre_off + 3, orientations, 4);
844
+
845
+ // Lever arms from COM to the contact midpoint, fixed for the step
846
+ // (concave contacts re-detect theirs each substep).
685
847
  pre[pre_off + 6] = rax;
686
848
  pre[pre_off + 7] = ray;
687
849
  pre[pre_off + 8] = raz;
@@ -689,24 +851,22 @@ export function prepare_contacts(manifolds, system, dt_sub) {
689
851
  pre[pre_off + 10] = rby;
690
852
  pre[pre_off + 11] = rbz;
691
853
 
692
- build_tangents(pre, pre_off + 12, nx, ny, nz);
693
- const t1x = pre[pre_off + 12], t1y = pre[pre_off + 13], t1z = pre[pre_off + 14];
694
- const t2x = pre[pre_off + 15], t2y = pre[pre_off + 16], t2z = pre[pre_off + 17];
695
-
696
- const k_n = invMA + invMB
697
- + angular_jacobian_contribution(ss, baseA, rax, ray, raz, nx, ny, nz, scratch_inertia_a)
698
- + angular_jacobian_contribution(ss, baseB, rbx, rby, rbz, nx, ny, nz, scratch_inertia_b);
699
- const k_t1 = invMA + invMB
700
- + angular_jacobian_contribution(ss, baseA, rax, ray, raz, t1x, t1y, t1z, scratch_inertia_a)
701
- + angular_jacobian_contribution(ss, baseB, rbx, rby, rbz, t1x, t1y, t1z, scratch_inertia_b);
702
- const k_t2 = invMA + invMB
703
- + angular_jacobian_contribution(ss, baseA, rax, ray, raz, t2x, t2y, t2z, scratch_inertia_a)
704
- + angular_jacobian_contribution(ss, baseB, rbx, rby, rbz, t2x, t2y, t2z, scratch_inertia_b);
705
-
706
- const k_n_eff = k_n + g_spook_eps;
707
- pre[pre_off + 18] = k_n_eff > 0 ? 1 / k_n_eff : 0;
708
- pre[pre_off + 19] = k_t1 > 0 ? 1 / k_t1 : 0;
709
- pre[pre_off + 20] = k_t2 > 0 ? 1 / k_t2 : 0;
854
+ // Orientations each body's world inverse inertia is evaluated at for
855
+ // the whole step: by the masses below and by every impulse this row
856
+ // applies, whatever the substeps do to the pose meanwhile.
857
+ const qAx = ss[baseA + SBS_QX], qAy = ss[baseA + SBS_QY], qAz = ss[baseA + SBS_QZ], qAw = ss[baseA + SBS_QW];
858
+ const qBx = ss[baseB + SBS_QX], qBy = ss[baseB + SBS_QY], qBz = ss[baseB + SBS_QZ], qBw = ss[baseB + SBS_QW];
859
+ pre[pre_off + PRE_QA] = qAx;
860
+ pre[pre_off + PRE_QA + 1] = qAy;
861
+ pre[pre_off + PRE_QA + 2] = qAz;
862
+ pre[pre_off + PRE_QA + 3] = qAw;
863
+ pre[pre_off + PRE_QB] = qBx;
864
+ pre[pre_off + PRE_QB + 1] = qBy;
865
+ pre[pre_off + PRE_QB + 2] = qBz;
866
+ pre[pre_off + PRE_QB + 3] = qBw;
867
+
868
+ build_tangents(pre, pre_off + 12, data, off + 6);
869
+ prepare_row_masses(pre, pre_off, ss, baseA, baseB, data, off + 6);
710
870
 
711
871
  // Restitution approach velocity (captured once, this is the
712
872
  // closing speed entering the step). n is B → A; vn < 0 closing.
@@ -721,7 +881,7 @@ export function prepare_contacts(manifolds, system, dt_sub) {
721
881
  const vn_pre = (vAx_at - vBx_at) * nx + (vAy_at - vBy_at) * ny + (vAz_at - vBz_at) * nz;
722
882
 
723
883
  let rest_bias = 0;
724
- if (vn_pre < -RESTITUTION_VELOCITY_THRESHOLD) {
884
+ if (vn_pre < -system.restitutionThreshold) {
725
885
  rest_bias = restitution_combined * vn_pre;
726
886
  }
727
887
  pre[pre_off + 21] = rest_bias;
@@ -738,8 +898,11 @@ export function prepare_contacts(manifolds, system, dt_sub) {
738
898
 
739
899
  mus[c] = friction_combined;
740
900
  pos_jn[c] = 0;
741
- scratch_max_jn[c] = 0;
901
+ scratch_total_jn[c] = 0;
742
902
  scratch_concave[c] = slot_concave ? 1 : 0;
903
+ scratch_immovable[c] = invMA === 0
904
+ ? (invMB === 0 ? IMMOVABLE_NONE : IMMOVABLE_A)
905
+ : (invMB === 0 ? IMMOVABLE_B : IMMOVABLE_NONE);
743
906
 
744
907
  idx[c * INDEX_STRIDE] = slot;
745
908
  idx[c * INDEX_STRIDE + 1] = k;
@@ -763,8 +926,8 @@ export function prepare_contacts(manifolds, system, dt_sub) {
763
926
 
764
927
  /**
765
928
  * Stage 1b (per substep) — warm-start: replay the cached accumulated
766
- * impulses `(j_n, j_t1, j_t2)` onto persistent velocity using the current
767
- * (refreshed) lever arms and tangents. Run once per substep, after
929
+ * impulses `(j_n, j_t1, j_t2)` onto persistent velocity through the row's
930
+ * lever arms, tangents and prepared orientations. Run once per substep, after
768
931
  * {@link refresh_contacts} and before {@link solve_velocity}.
769
932
  *
770
933
  * Per-substep warm-start is the crux of stable TGS: the stored impulse is a
@@ -785,6 +948,7 @@ export function warm_start_contacts(manifolds, system) {
785
948
  const pre = scratch_pre;
786
949
  const idx = scratch_idx;
787
950
  const ss = system.__solver_state.data;
951
+ const impulse = scratch_impulse;
788
952
 
789
953
  for (let ci = 0; ci < count; ci++) {
790
954
  const slot = idx[ci * INDEX_STRIDE];
@@ -793,14 +957,8 @@ export function warm_start_contacts(manifolds, system) {
793
957
  const baseA = idx[ci * INDEX_STRIDE + 2] * SBS_STRIDE;
794
958
  const baseB = idx[ci * INDEX_STRIDE + 3] * SBS_STRIDE;
795
959
 
796
- const invMA = ss[baseA + SBS_INV_MASS];
797
- const invMB = ss[baseB + SBS_INV_MASS];
798
-
799
960
  const pre_off = ci * PRE_STRIDE;
800
961
 
801
- const rax = pre[pre_off + 6], ray = pre[pre_off + 7], raz = pre[pre_off + 8];
802
- const rbx = pre[pre_off + 9], rby = pre[pre_off + 10], rbz = pre[pre_off + 11];
803
-
804
962
  const t1x = pre[pre_off + 12], t1y = pre[pre_off + 13], t1z = pre[pre_off + 14];
805
963
  const t2x = pre[pre_off + 15], t2y = pre[pre_off + 16], t2z = pre[pre_off + 17];
806
964
 
@@ -812,12 +970,12 @@ export function warm_start_contacts(manifolds, system) {
812
970
  const j_t1 = data[off + 11];
813
971
  const j_t2 = data[off + 12];
814
972
 
815
- const Px = nx * j_n + t1x * j_t1 + t2x * j_t2;
816
- const Py = ny * j_n + t1y * j_t1 + t2y * j_t2;
817
- const Pz = nz * j_n + t1z * j_t1 + t2z * j_t2;
973
+ impulse[0] = nx * j_n + t1x * j_t1 + t2x * j_t2;
974
+ impulse[1] = ny * j_n + t1y * j_t1 + t2y * j_t2;
975
+ impulse[2] = nz * j_n + t1z * j_t1 + t2z * j_t2;
818
976
 
819
- apply_impulse_to_body(ss, baseA, invMA, rax, ray, raz, Px, Py, Pz, +1, scratch_inertia_a);
820
- apply_impulse_to_body(ss, baseB, invMB, rbx, rby, rbz, Px, Py, Pz, -1, scratch_inertia_b);
977
+ apply_impulse_to_body_oriented(ss, baseA, pre, pre_off + PRE_QA, pre, pre_off + PRE_RA, impulse, 0, +1, scratch_inertia_a);
978
+ apply_impulse_to_body_oriented(ss, baseB, pre, pre_off + PRE_QB, pre, pre_off + PRE_RB, impulse, 0, -1, scratch_inertia_b);
821
979
  }
822
980
  }
823
981
 
@@ -832,11 +990,23 @@ export function warm_start_contacts(manifolds, system) {
832
990
  * `Δseparation = (cpA − wA − (cpB − wB)) · n` is the change since prepare.
833
991
  * Anchoring on the trusted prepare-time depth makes the sign convention
834
992
  * irrelevant — only the analytic delta uses the anchors;
835
- * - rebuild the impulse levers `rA`/`rB` from the moved midpoint;
836
993
  * - recompute the position-correction bias from `depth_now`.
837
994
  *
838
995
  * The contact normal and tangents are held fixed for the outer step (valid
839
- * for the small per-step rotation), so they are not recomputed here.
996
+ * for the small per-step rotation), so they are not recomputed here. Nor are
997
+ * the impulse levers `rA` / `rB`: the row's effective mass was built from the
998
+ * prepared ones, and the levers must stay inside the bodies — the midpoint of
999
+ * the moved witnesses travels at half the slip speed, so a box sliding out
1000
+ * from under another at 150 m/s carried it a metre past both within the step.
1001
+ *
1002
+ * Except a side with zero inverse mass (static, kinematic, asleep): its lever
1003
+ * enters no mass, so it is moved to where the other side's contact point now
1004
+ * is (that side's fixed lever from its current centre). Held at the prepared
1005
+ * point, a kinematic turntable's surface velocity was read along the tangent
1006
+ * of where the rider had been at the start of the step, for the whole step:
1007
+ * a box gripped at 3 m on a table at 1 rad/s crept outward 0.33 m in 10 s,
1008
+ * whatever the substep count. Two movable bodies keep both levers fixed, as
1009
+ * Box3D does for every pair; a box on a free spinning disc creeps as that did.
840
1010
  *
841
1011
  * @param {ManifoldStore} manifolds
842
1012
  * @param {Transform64[]} transforms
@@ -889,12 +1059,14 @@ export function refresh_contacts(manifolds, transforms) {
889
1059
  const pBy = trB.translation_y;
890
1060
  const pBz = trB.translation_z;
891
1061
 
892
- const qA = trA.rotation;
893
- const qB = trB.rotation;
1062
+ // Read as scalars: a Transform64's `rotation` getter makes a new view on every read, and
1063
+ // this runs for every contact every substep.
1064
+ const qAx = trA.rotation_x, qAy = trA.rotation_y, qAz = trA.rotation_z, qAw = trA.rotation_w;
1065
+ const qBx = trB.rotation_x, qBy = trB.rotation_y, qBz = trB.rotation_z, qBw = trB.rotation_w;
894
1066
 
895
1067
  // Current world contact points: COM + R · localWitness.
896
- v3_quaternion_apply(cp, 0, pre[pre_off], pre[pre_off + 1], pre[pre_off + 2], qA[0], qA[1], qA[2], qA[3]);
897
- v3_quaternion_apply(cp, 3, pre[pre_off + 3], pre[pre_off + 4], pre[pre_off + 5], qB[0], qB[1], qB[2], qB[3]);
1068
+ v3_quaternion_apply(cp, 0, pre[pre_off], pre[pre_off + 1], pre[pre_off + 2], qAx, qAy, qAz, qAw);
1069
+ v3_quaternion_apply(cp, 3, pre[pre_off + 3], pre[pre_off + 4], pre[pre_off + 5], qBx, qBy, qBz, qBw);
898
1070
 
899
1071
  const cpAx = pAx + cp[0], cpAy = pAy + cp[1], cpAz = pAz + cp[2];
900
1072
  const cpBx = pBx + cp[3], cpBy = pBy + cp[4], cpBz = pBz + cp[5];
@@ -907,17 +1079,19 @@ export function refresh_contacts(manifolds, transforms) {
907
1079
 
908
1080
  const depth_now = depth0 - dsep;
909
1081
 
910
- // Impulse levers from each COM to the current contact midpoint.
911
- const mx = (cpAx + cpBx) * 0.5;
912
- const my = (cpAy + cpBy) * 0.5;
913
- const mz = (cpAz + cpBz) * 0.5;
914
-
915
- pre[pre_off + 6] = mx - pAx;
916
- pre[pre_off + 7] = my - pAy;
917
- pre[pre_off + 8] = mz - pAz;
918
- pre[pre_off + 9] = mx - pBx;
919
- pre[pre_off + 10] = my - pBy;
920
- pre[pre_off + 11] = mz - pBz;
1082
+ // A side the solver cannot move adds nothing to the row's mass, so its lever is free: it
1083
+ // follows the movable side's contact point - that side's fixed lever from where its centre
1084
+ // is now - so a turning or moving kinematic surface is read at its velocity under the body.
1085
+ const immovable = scratch_immovable[ci];
1086
+ if (immovable === IMMOVABLE_B) {
1087
+ pre[pre_off + 9] = pAx + pre[pre_off + 6] - pBx;
1088
+ pre[pre_off + 10] = pAy + pre[pre_off + 7] - pBy;
1089
+ pre[pre_off + 11] = pAz + pre[pre_off + 8] - pBz;
1090
+ } else if (immovable === IMMOVABLE_A) {
1091
+ pre[pre_off + 6] = pBx + pre[pre_off + 9] - pAx;
1092
+ pre[pre_off + 7] = pBy + pre[pre_off + 10] - pAy;
1093
+ pre[pre_off + 8] = pBz + pre[pre_off + 11] - pAz;
1094
+ }
921
1095
 
922
1096
  let bias_position = 0;
923
1097
 
@@ -946,8 +1120,8 @@ export function refresh_contacts(manifolds, transforms) {
946
1120
  * For each concave-involved slot, re-runs the narrowphase geometry at the
947
1121
  * current substep pose ({@link redetect_pair_geometry}, which rewrites the
948
1122
  * manifold's witness / normal / depth in place), then re-derives the solver
949
- * scratch (lever arms, tangent basis, effective masses, position bias) for
950
- * that slot's contacts from the fresh geometry. This is the whole point of
1123
+ * scratch (lever arms, orientations, tangent basis, effective masses, position
1124
+ * bias) for that slot's contacts from the fresh geometry. This is the whole point of
951
1125
  * the concave path: a body rocking on a mesh changes which triangle (and
952
1126
  * normal) it rests on within a single outer step, and freezing that — as the
953
1127
  * convex analytic refresh does — pumps energy in. Re-detecting gives a
@@ -961,7 +1135,7 @@ export function refresh_contacts(manifolds, transforms) {
961
1135
  * with prepare.
962
1136
  *
963
1137
  * Must run before {@link refresh_contacts} / {@link warm_start_contacts} each
964
- * substep. `rest_bias` (captured at prepare) and the `scratch_max_jn`
1138
+ * substep. `rest_bias` (captured at prepare) and the `scratch_total_jn`
965
1139
  * restitution gate are preserved.
966
1140
  *
967
1141
  * @param {ManifoldStore} manifolds
@@ -993,7 +1167,6 @@ export function redetect_concave_contacts(manifolds, system) {
993
1167
  const pre = scratch_pre;
994
1168
  const idx = scratch_idx;
995
1169
  const spook_a = g_spook_a;
996
- const spook_eps = g_spook_eps;
997
1170
  const ss = system.__solver_state.data;
998
1171
 
999
1172
  for (let ci = 0; ci < count; ci++) {
@@ -1012,15 +1185,11 @@ export function redetect_concave_contacts(manifolds, system) {
1012
1185
  const trA = system.__transforms[idxA];
1013
1186
  const trB = system.__transforms[idxB];
1014
1187
 
1015
- const invMA = ss[baseA + SBS_INV_MASS];
1016
- const invMB = ss[baseB + SBS_INV_MASS];
1017
-
1018
1188
  const slot_off = manifolds.slot_data_offset(slot);
1019
1189
  const off = slot_off + cidx * CONTACT_STRIDE;
1020
1190
 
1021
1191
  const wax = data[off], way = data[off + 1], waz = data[off + 2];
1022
1192
  const wbx = data[off + 3], wby = data[off + 4], wbz = data[off + 5];
1023
- const nx = data[off + 6], ny = data[off + 7], nz = data[off + 8];
1024
1193
  const depth = data[off + 9];
1025
1194
 
1026
1195
  const px = (wax + wbx) * 0.5;
@@ -1038,24 +1207,26 @@ export function redetect_concave_contacts(manifolds, system) {
1038
1207
  pre[pre_off + 10] = rby;
1039
1208
  pre[pre_off + 11] = rbz;
1040
1209
 
1041
- build_tangents(pre, pre_off + 12, nx, ny, nz);
1042
- const t1x = pre[pre_off + 12], t1y = pre[pre_off + 13], t1z = pre[pre_off + 14];
1043
- const t2x = pre[pre_off + 15], t2y = pre[pre_off + 16], t2z = pre[pre_off + 17];
1044
-
1045
- const k_n = invMA + invMB
1046
- + angular_jacobian_contribution(ss, baseA, rax, ray, raz, nx, ny, nz, scratch_inertia_a)
1047
- + angular_jacobian_contribution(ss, baseB, rbx, rby, rbz, nx, ny, nz, scratch_inertia_b);
1048
- const k_t1 = invMA + invMB
1049
- + angular_jacobian_contribution(ss, baseA, rax, ray, raz, t1x, t1y, t1z, scratch_inertia_a)
1050
- + angular_jacobian_contribution(ss, baseB, rbx, rby, rbz, t1x, t1y, t1z, scratch_inertia_b);
1051
- const k_t2 = invMA + invMB
1052
- + angular_jacobian_contribution(ss, baseA, rax, ray, raz, t2x, t2y, t2z, scratch_inertia_a)
1053
- + angular_jacobian_contribution(ss, baseB, rbx, rby, rbz, t2x, t2y, t2z, scratch_inertia_b);
1054
-
1055
- const k_n_eff = k_n + spook_eps;
1056
- pre[pre_off + 18] = k_n_eff > 0 ? 1 / k_n_eff : 0;
1057
- pre[pre_off + 19] = k_t1 > 0 ? 1 / k_t1 : 0;
1058
- pre[pre_off + 20] = k_t2 > 0 ? 1 / k_t2 : 0;
1210
+ build_tangents(pre, pre_off + 12, data, off + 6);
1211
+
1212
+ // The levers were just detected at the substep's pose, so the row's
1213
+ // orientations are taken at that pose too: the mass and every impulse
1214
+ // until the next re-detect go through the configuration the levers
1215
+ // belong to. Fresh levers at the step's prepared orientation pair a
1216
+ // contact point with an inertia frame the body no longer has, and that
1217
+ // gained energy (a plank spinning flat on a mesh floor, 8 % at 60 rad/s).
1218
+ const qAx = ss[baseA + SBS_QX], qAy = ss[baseA + SBS_QY], qAz = ss[baseA + SBS_QZ], qAw = ss[baseA + SBS_QW];
1219
+ const qBx = ss[baseB + SBS_QX], qBy = ss[baseB + SBS_QY], qBz = ss[baseB + SBS_QZ], qBw = ss[baseB + SBS_QW];
1220
+ pre[pre_off + PRE_QA] = qAx;
1221
+ pre[pre_off + PRE_QA + 1] = qAy;
1222
+ pre[pre_off + PRE_QA + 2] = qAz;
1223
+ pre[pre_off + PRE_QA + 3] = qAw;
1224
+ pre[pre_off + PRE_QB] = qBx;
1225
+ pre[pre_off + PRE_QB + 1] = qBy;
1226
+ pre[pre_off + PRE_QB + 2] = qBz;
1227
+ pre[pre_off + PRE_QB + 3] = qBw;
1228
+
1229
+ prepare_row_masses(pre, pre_off, ss, baseA, baseB, data, off + 6);
1059
1230
 
1060
1231
  if (g_contacts_soft) {
1061
1232
  // Soft mode: lane 22 carries separation (see refresh_contacts).
@@ -1080,7 +1251,7 @@ export function redetect_concave_contacts(manifolds, system) {
1080
1251
  /**
1081
1252
  * Stage 3 (per substep) — velocity iterations enforcing pure
1082
1253
  * non-penetration (`vn → 0`) plus Coulomb-disk friction. No bias: depth
1083
- * correction is the position pass, restitution is the one-shot pass.
1254
+ * correction is the position pass, restitution is {@link apply_restitution}'s.
1084
1255
  *
1085
1256
  * @param {ManifoldStore} manifolds
1086
1257
  * @param {PhysicsSystem} system
@@ -1095,6 +1266,14 @@ export function solve_velocity(manifolds, system, iters, use_bias = true) {
1095
1266
  const idx = scratch_idx;
1096
1267
  const mus = scratch_mu;
1097
1268
  const ss = system.__solver_state.data;
1269
+ const impulse = scratch_impulse;
1270
+
1271
+ // The restitution compression measure takes the impulse each substep ends
1272
+ // on, once: at the last iteration of the call that closes the substep's
1273
+ // velocity work — the relax pass when contacts are soft, this solve when
1274
+ // they are hard (see scratch_total_jn).
1275
+ const counts_compression = !use_bias || !g_contacts_soft;
1276
+ const last_iter = iters - 1;
1098
1277
 
1099
1278
  for (let iter = 0; iter < iters; iter++) {
1100
1279
  for (let ci = 0; ci < contact_count; ci++) {
@@ -1105,9 +1284,6 @@ export function solve_velocity(manifolds, system, iters, use_bias = true) {
1105
1284
  const baseA = idx[ci * INDEX_STRIDE + 2] * SBS_STRIDE;
1106
1285
  const baseB = idx[ci * INDEX_STRIDE + 3] * SBS_STRIDE;
1107
1286
 
1108
- const invMA = ss[baseA + SBS_INV_MASS];
1109
- const invMB = ss[baseB + SBS_INV_MASS];
1110
-
1111
1287
  const pre_off = ci * PRE_STRIDE;
1112
1288
 
1113
1289
  const rax = pre[pre_off + 6], ray = pre[pre_off + 7], raz = pre[pre_off + 8];
@@ -1171,17 +1347,17 @@ export function solve_velocity(manifolds, system, iters, use_bias = true) {
1171
1347
  const delta_j_n = new_j_n - j_n_accum;
1172
1348
  data[off + 10] = new_j_n;
1173
1349
 
1174
- if (new_j_n > scratch_max_jn[ci]) {
1175
- scratch_max_jn[ci] = new_j_n;
1350
+ if (counts_compression && iter === last_iter) {
1351
+ scratch_total_jn[ci] += new_j_n;
1176
1352
  }
1177
1353
 
1178
1354
  if (delta_j_n !== 0) {
1179
- const Pnx = nx * delta_j_n;
1180
- const Pny = ny * delta_j_n;
1181
- const Pnz = nz * delta_j_n;
1355
+ impulse[0] = nx * delta_j_n;
1356
+ impulse[1] = ny * delta_j_n;
1357
+ impulse[2] = nz * delta_j_n;
1182
1358
 
1183
- apply_impulse_to_body(ss, baseA, invMA, rax, ray, raz, Pnx, Pny, Pnz, +1, scratch_inertia_a);
1184
- apply_impulse_to_body(ss, baseB, invMB, rbx, rby, rbz, Pnx, Pny, Pnz, -1, scratch_inertia_b);
1359
+ apply_impulse_to_body_oriented(ss, baseA, pre, pre_off + PRE_QA, pre, pre_off + PRE_RA, impulse, 0, +1, scratch_inertia_a);
1360
+ apply_impulse_to_body_oriented(ss, baseB, pre, pre_off + PRE_QB, pre, pre_off + PRE_RB, impulse, 0, -1, scratch_inertia_b);
1185
1361
  }
1186
1362
 
1187
1363
  // --- Friction impulse (Coulomb disk in tangent plane) ---
@@ -1226,12 +1402,12 @@ export function solve_velocity(manifolds, system, iters, use_bias = true) {
1226
1402
 
1227
1403
  if (delta_t1 !== 0 || delta_t2 !== 0) {
1228
1404
 
1229
- const Ptx = t1x * delta_t1 + t2x * delta_t2;
1230
- const Pty = t1y * delta_t1 + t2y * delta_t2;
1231
- const Ptz = t1z * delta_t1 + t2z * delta_t2;
1405
+ impulse[0] = t1x * delta_t1 + t2x * delta_t2;
1406
+ impulse[1] = t1y * delta_t1 + t2y * delta_t2;
1407
+ impulse[2] = t1z * delta_t1 + t2z * delta_t2;
1232
1408
 
1233
- apply_impulse_to_body(ss, baseA, invMA, rax, ray, raz, Ptx, Pty, Ptz, +1, scratch_inertia_a);
1234
- apply_impulse_to_body(ss, baseB, invMB, rbx, rby, rbz, Ptx, Pty, Ptz, -1, scratch_inertia_b);
1409
+ apply_impulse_to_body_oriented(ss, baseA, pre, pre_off + PRE_QA, pre, pre_off + PRE_RA, impulse, 0, +1, scratch_inertia_a);
1410
+ apply_impulse_to_body_oriented(ss, baseB, pre, pre_off + PRE_QB, pre, pre_off + PRE_RB, impulse, 0, -1, scratch_inertia_b);
1235
1411
 
1236
1412
  }
1237
1413
  }
@@ -1239,18 +1415,36 @@ export function solve_velocity(manifolds, system, iters, use_bias = true) {
1239
1415
  }
1240
1416
 
1241
1417
  /**
1242
- * Stage 4 (once, after the substep loop) — one-shot restitution
1243
- * (Box2D-v3 `b2ApplyRestitution`, Catto 2018). Drives `vn → -e · vn_approach`
1244
- * exactly once per closing contact, gated on (a) the contact having been
1245
- * closing faster than the threshold at prepare, and (b) a compressive
1246
- * normal impulse having formed during the velocity solve. The added impulse
1247
- * accumulates into the same normal-impulse slot so it composes with
1248
- * warm-start next frame.
1418
+ * Stage 4 (after the substep loop) — restitution (Box3D `b3ApplyRestitution`,
1419
+ * Catto). `iterations` Gauss-Seidel passes over every contact whose combined
1420
+ * restitution is non-zero, each driving an ARMED contact's normal velocity
1421
+ * toward `-e · vn_approach` and holding the rest of those contacts to plain
1422
+ * non-penetration, so a bounce at one point does not drive another into the
1423
+ * ground. A contact is armed when (a) it was closing faster than
1424
+ * `system.restitutionThreshold` at prepare and (b) it pressed with a compressive
1425
+ * normal impulse during the velocity solve. The impulses accumulate into the
1426
+ * same normal-impulse slot so they compose with warm-start next frame.
1427
+ *
1428
+ * Why passes: a body striking at several points at once — a cube landing flat
1429
+ * — is a coupled problem, and one sweep leaves it unconverged. The row solved
1430
+ * first takes more than its share of the bounce, through the body's rotation
1431
+ * as well as its translation, and the body leaves the ground spinning: a cube
1432
+ * dropped flat on frictionless ground at e = 0.8 left at 5.2 rad/s, rebounding
1433
+ * at 0.77 of its impact speed.
1434
+ *
1435
+ * Why the cap: a pass that has not converged overshoots — the row solved first
1436
+ * sends its contact apart faster than `e` times its approach, and the body
1437
+ * leaves with more energy than it struck with. So each contact may return at
1438
+ * most `e` times the impulse it pressed with (Poisson's kinetic restitution),
1439
+ * measured by {@link scratch_total_jn} as the impulse it delivered. Ported
1440
+ * from Box3D's contact_solver.c (MIT, Erin Catto), which counts that impulse
1441
+ * twice per substep; see there for why this counts it once.
1249
1442
  *
1250
1443
  * @param {ManifoldStore} manifolds
1251
1444
  * @param {PhysicsSystem} system
1445
+ * @param {number} iterations passes over the contacts; 0 applies no restitution
1252
1446
  */
1253
- export function apply_restitution(manifolds, system) {
1447
+ export function apply_restitution(manifolds, system, iterations) {
1254
1448
  const contact_count = g_contact_count;
1255
1449
  if (contact_count === 0) return;
1256
1450
 
@@ -1258,51 +1452,77 @@ export function apply_restitution(manifolds, system) {
1258
1452
  const pre = scratch_pre;
1259
1453
  const idx = scratch_idx;
1260
1454
  const ss = system.__solver_state.data;
1455
+ const total_jn = scratch_total_jn;
1456
+ const rest_jn = scratch_rest_jn;
1261
1457
 
1262
1458
  for (let ci = 0; ci < contact_count; ci++) {
1263
- const pre_off = ci * PRE_STRIDE;
1264
- const rest_bias = pre[pre_off + 21];
1265
- if (rest_bias === 0) continue;
1459
+ rest_jn[ci] = 0;
1460
+ }
1266
1461
 
1267
- const slot = idx[ci * INDEX_STRIDE];
1268
- const cidx = idx[ci * INDEX_STRIDE + 1];
1269
- // Gate on the running max normal impulse, not the end-of-loop value:
1270
- // a transient collision relaxes back to j_n ≈ 0 under per-substep
1271
- // warm-start, but it WAS compressive, so it should still bounce.
1272
- if (scratch_max_jn[ci] <= 0) continue;
1462
+ for (let pass = 0; pass < iterations; pass++) {
1463
+ for (let ci = 0; ci < contact_count; ci++) {
1464
+ const slot = idx[ci * INDEX_STRIDE];
1465
+ const cidx = idx[ci * INDEX_STRIDE + 1];
1273
1466
 
1274
- const slot_off = manifolds.slot_data_offset(slot);
1275
- const off = slot_off + cidx * CONTACT_STRIDE;
1467
+ const slot_off = manifolds.slot_data_offset(slot);
1468
+ const off = slot_off + cidx * CONTACT_STRIDE;
1276
1469
 
1277
- const j_n_accum = data[off + 10];
1470
+ const restitution = data[off + 15];
1471
+ if (restitution === 0) continue;
1278
1472
 
1279
- const baseA = idx[ci * INDEX_STRIDE + 2] * SBS_STRIDE;
1280
- const baseB = idx[ci * INDEX_STRIDE + 3] * SBS_STRIDE;
1281
- const invMA = ss[baseA + SBS_INV_MASS];
1282
- const invMB = ss[baseB + SBS_INV_MASS];
1473
+ const pre_off = ci * PRE_STRIDE;
1474
+ const rest_bias = pre[pre_off + 21];
1283
1475
 
1284
- const rax = pre[pre_off + 6], ray = pre[pre_off + 7], raz = pre[pre_off + 8];
1285
- const rbx = pre[pre_off + 9], rby = pre[pre_off + 10], rbz = pre[pre_off + 11];
1286
- const m_eff_n = pre[pre_off + 18];
1287
- const nx = data[off + 6], ny = data[off + 7], nz = data[off + 8];
1476
+ // Armed only if the contact pressed at some point in the step, not
1477
+ // by its end-of-loop impulse: a transient collision relaxes back to
1478
+ // j_n ≈ 0 under per-substep warm-start, but it WAS compressive.
1479
+ const compression = total_jn[ci] - rest_jn[ci];
1480
+ const armed = rest_bias !== 0 && compression > 0;
1481
+
1482
+ const baseA = idx[ci * INDEX_STRIDE + 2] * SBS_STRIDE;
1483
+ const baseB = idx[ci * INDEX_STRIDE + 3] * SBS_STRIDE;
1484
+
1485
+ const rax = pre[pre_off + 6], ray = pre[pre_off + 7], raz = pre[pre_off + 8];
1486
+ const rbx = pre[pre_off + 9], rby = pre[pre_off + 10], rbz = pre[pre_off + 11];
1487
+ const m_eff_n = pre[pre_off + 18];
1488
+ const nx = data[off + 6], ny = data[off + 7], nz = data[off + 8];
1288
1489
 
1289
- const vAx_at = ss[baseA + SBS_LV_X] + ss[baseA + SBS_AV_Y] * raz - ss[baseA + SBS_AV_Z] * ray;
1290
- const vAy_at = ss[baseA + SBS_LV_Y] + ss[baseA + SBS_AV_Z] * rax - ss[baseA + SBS_AV_X] * raz;
1291
- const vAz_at = ss[baseA + SBS_LV_Z] + ss[baseA + SBS_AV_X] * ray - ss[baseA + SBS_AV_Y] * rax;
1292
- const vBx_at = ss[baseB + SBS_LV_X] + ss[baseB + SBS_AV_Y] * rbz - ss[baseB + SBS_AV_Z] * rby;
1293
- const vBy_at = ss[baseB + SBS_LV_Y] + ss[baseB + SBS_AV_Z] * rbx - ss[baseB + SBS_AV_X] * rbz;
1294
- const vBz_at = ss[baseB + SBS_LV_Z] + ss[baseB + SBS_AV_X] * rby - ss[baseB + SBS_AV_Y] * rbx;
1295
- const vn = (vAx_at - vBx_at) * nx + (vAy_at - vBy_at) * ny + (vAz_at - vBz_at) * nz;
1296
-
1297
- const lambda = -m_eff_n * (vn + rest_bias);
1298
- const new_j_n = (j_n_accum + lambda) > 0 ? (j_n_accum + lambda) : 0;
1299
- const delta = new_j_n - j_n_accum;
1300
- data[off + 10] = new_j_n;
1301
-
1302
- if (delta !== 0) {
1303
- const Px = nx * delta, Py = ny * delta, Pz = nz * delta;
1304
- apply_impulse_to_body(ss, baseA, invMA, rax, ray, raz, Px, Py, Pz, +1, scratch_inertia_a);
1305
- apply_impulse_to_body(ss, baseB, invMB, rbx, rby, rbz, Px, Py, Pz, -1, scratch_inertia_b);
1490
+ const vAx_at = ss[baseA + SBS_LV_X] + ss[baseA + SBS_AV_Y] * raz - ss[baseA + SBS_AV_Z] * ray;
1491
+ const vAy_at = ss[baseA + SBS_LV_Y] + ss[baseA + SBS_AV_Z] * rax - ss[baseA + SBS_AV_X] * raz;
1492
+ const vAz_at = ss[baseA + SBS_LV_Z] + ss[baseA + SBS_AV_X] * ray - ss[baseA + SBS_AV_Y] * rax;
1493
+ const vBx_at = ss[baseB + SBS_LV_X] + ss[baseB + SBS_AV_Y] * rbz - ss[baseB + SBS_AV_Z] * rby;
1494
+ const vBy_at = ss[baseB + SBS_LV_Y] + ss[baseB + SBS_AV_Z] * rbx - ss[baseB + SBS_AV_X] * rbz;
1495
+ const vBz_at = ss[baseB + SBS_LV_Z] + ss[baseB + SBS_AV_X] * rby - ss[baseB + SBS_AV_Y] * rbx;
1496
+ const vn = (vAx_at - vBx_at) * nx + (vAy_at - vBy_at) * ny + (vAz_at - vBz_at) * nz;
1497
+
1498
+ const j_n_accum = data[off + 10];
1499
+ const lambda = -m_eff_n * (vn + (armed ? rest_bias : 0));
1500
+ const new_j_n = (j_n_accum + lambda) > 0 ? (j_n_accum + lambda) : 0;
1501
+ let delta = new_j_n - j_n_accum;
1502
+
1503
+ // The part of this impulse that only stops what is left of the approach.
1504
+ const stop = -m_eff_n * vn;
1505
+ const approach = Math.min(stop > 0 ? stop : 0, delta > 0 ? delta : 0);
1506
+
1507
+ if (armed) {
1508
+ // Poisson: what goes past stopping may total at most e times the compression.
1509
+ const allowance = restitution * (compression + approach) - rest_jn[ci];
1510
+ const cap = approach + (allowance > 0 ? allowance : 0);
1511
+ if (delta > cap) delta = cap;
1512
+ }
1513
+
1514
+ data[off + 10] = j_n_accum + delta;
1515
+ rest_jn[ci] += delta - approach;
1516
+ total_jn[ci] += delta;
1517
+
1518
+ if (delta !== 0) {
1519
+ const impulse = scratch_impulse;
1520
+ impulse[0] = nx * delta;
1521
+ impulse[1] = ny * delta;
1522
+ impulse[2] = nz * delta;
1523
+ apply_impulse_to_body_oriented(ss, baseA, pre, pre_off + PRE_QA, pre, pre_off + PRE_RA, impulse, 0, +1, scratch_inertia_a);
1524
+ apply_impulse_to_body_oriented(ss, baseB, pre, pre_off + PRE_QB, pre, pre_off + PRE_RB, impulse, 0, -1, scratch_inertia_b);
1525
+ }
1306
1526
  }
1307
1527
  }
1308
1528
  }
@@ -1348,8 +1568,6 @@ export function solve_position(manifolds, system, pos_iters) {
1348
1568
  const idxB = idx[ci * INDEX_STRIDE + 3];
1349
1569
  const sbaseA = idxA * SBS_STRIDE;
1350
1570
  const sbaseB = idxB * SBS_STRIDE;
1351
- const invMA = ss[sbaseA + SBS_INV_MASS];
1352
- const invMB = ss[sbaseB + SBS_INV_MASS];
1353
1571
 
1354
1572
  const rax = pre[pre_off + 6], ray = pre[pre_off + 7], raz = pre[pre_off + 8];
1355
1573
  const rbx = pre[pre_off + 9], rby = pre[pre_off + 10], rbz = pre[pre_off + 11];
@@ -1387,11 +1605,12 @@ export function solve_position(manifolds, system, pos_iters) {
1387
1605
  pos_jn[ci] = new_jn;
1388
1606
 
1389
1607
  if (delta !== 0) {
1390
- const Px = nx * delta;
1391
- const Py = ny * delta;
1392
- const Pz = nz * delta;
1393
- apply_impulse_to_pseudo(pseudoVel, baseA, ss, sbaseA, invMA, rax, ray, raz, Px, Py, Pz, +1, scratch_inertia_a);
1394
- apply_impulse_to_pseudo(pseudoVel, baseB, ss, sbaseB, invMB, rbx, rby, rbz, Px, Py, Pz, -1, scratch_inertia_b);
1608
+ const impulse = scratch_impulse;
1609
+ impulse[0] = nx * delta;
1610
+ impulse[1] = ny * delta;
1611
+ impulse[2] = nz * delta;
1612
+ apply_impulse_to_pseudo(pseudoVel, baseA, ss, sbaseA, pre, pre_off + PRE_QA, pre, pre_off + PRE_RA, impulse, 0, +1, scratch_inertia_a);
1613
+ apply_impulse_to_pseudo(pseudoVel, baseB, ss, sbaseB, pre, pre_off + PRE_QB, pre, pre_off + PRE_RB, impulse, 0, -1, scratch_inertia_b);
1395
1614
  }
1396
1615
  }
1397
1616
  }
@@ -1415,8 +1634,12 @@ export function solve_position(manifolds, system, pos_iters) {
1415
1634
  * pseudo-velocity, restitution writes real velocity — so the order is
1416
1635
  * consistency, not behaviour.)
1417
1636
  *
1418
- * The position pass writes `system.__pseudo_velocity`; the caller must zero
1419
- * that buffer before this call and fold it into the pose afterwards.
1637
+ * With hard contacts the position pass writes `system.__pseudo_velocity`, a
1638
+ * correction for the caller to fold into the pose or drop. It accumulates onto
1639
+ * the buffer, which must hold zeros where the pass writes: it does after a
1640
+ * soft-contact `fixedUpdate`, or after `system.__reset_pseudo_velocity()`.
1641
+ * The driver marks the buffer written, so the system's next step zeroes it
1642
+ * before it integrates rather than applying the correction again.
1420
1643
  *
1421
1644
  * @param {ManifoldStore} manifolds
1422
1645
  * @param {PhysicsSystem} system
@@ -1467,8 +1690,9 @@ export function solve_contacts(manifolds, system, dt,
1467
1690
  solve_velocity(manifolds, system, 1, false);
1468
1691
  } else {
1469
1692
  solve_position(manifolds, system, pos_iters);
1693
+ system.__pseudo_velocity_dirty = system.storage.high_water_mark * PSEUDO_STRIDE;
1470
1694
  }
1471
- apply_restitution(manifolds, system);
1695
+ apply_restitution(manifolds, system, system.restitutionIterations);
1472
1696
  }
1473
1697
 
1474
1698
  solver_state.scatter(bodies);