@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,7 +1,9 @@
1
+ import { assert } from "../../../core/assert.js";
1
2
  import { apply_impulse_to_body } from "../solver/apply_impulse_to_body.js";
2
- import { quat3_multiply } from "../../../core/geom/3d/quaternion/quat3_multiply.js";
3
- import { quat3_to_matrix3 } from "../../../core/geom/3d/quaternion/quat3_to_matrix3.js";
4
- import { v3_quaternion_apply } from "../../../core/geom/vec3/v3_quaternion_apply.js";
3
+ import { quat3_multiply_array } from "../../../core/geom/3d/quaternion/quat3_multiply.js";
4
+ import { quat3_to_matrix3_array } from "../../../core/geom/3d/quaternion/quat3_to_matrix3.js";
5
+ import { v3_quaternion_apply_array } from "../../../core/geom/vec3/v3_quaternion_apply.js";
6
+ import { TRANSFORM64_ROTATION_OFFSET } from "../../ecs/transform/Transform64.js";
5
7
  import { body_id_index } from "../body/BodyStorage.js";
6
8
  import {
7
9
  SBS_AV_X,
@@ -22,17 +24,48 @@ import {
22
24
  } from "../body/SolverBodyState.js";
23
25
  import { JOINT_WORLD } from "../ecs/Joint.js";
24
26
  import { SleepState } from "../ecs/SleepState.js";
25
- import { angular_effective_mass_raw, world_inverse_inertia_apply_raw } from "../inertia/world_inverse_inertia.js";
27
+ import { angular_effective_mass_array, world_inverse_inertia_apply_array } from "../inertia/world_inverse_inertia.js";
26
28
  import { DofMode } from "./DofMode.js";
27
29
 
28
30
  /**
29
31
  * # 6-DOF constraint (joint) solver
30
32
  *
31
- * Runs alongside the contact solver inside the same TGS substep loop: each
32
- * substep the joints are warm-started and their velocity rows solved, sharing
33
- * the contact solver's per-substep / warm-start / SPOOK-bias model so the two
34
- * constraint families converge together (a body touched by both a contact and
35
- * a joint sees a single coupled Gauss-Seidel sweep across the substep loop).
33
+ * Runs alongside the contact solver inside the same TGS substep loop, sharing
34
+ * its per-substep / warm-start / SPOOK-bias model so the two constraint
35
+ * families converge together (a body touched by both a contact and a joint
36
+ * sees a single coupled Gauss-Seidel sweep across the substep loop). Each
37
+ * substep, after the contact velocity solve, {@link solve_joints} prepares
38
+ * every joint's rows at the current poses, warm-starts them and runs
39
+ * `iters` passes over ALL the joints; after the position integrate,
40
+ * {@link relax_joints} re-solves the one-sided and driven rows without their
41
+ * position-correction bias (Box3D's substep order: solve → integrate → relax).
42
+ *
43
+ * ## An iteration is a pass over every joint
44
+ *
45
+ * The joints of a chain load each other: each one carries the links below it,
46
+ * so a joint's impulse is only right once its neighbours have answered it.
47
+ * Gauss-Seidel converges that only when an iteration sweeps the whole joint
48
+ * set and the sweep repeats. Iterating one joint to completion before moving
49
+ * to the next buys nothing (a fully locked point is solved exactly in one
50
+ * step) and leaves every joint blind to the load the later ones put on it — a
51
+ * heavy-tipped chain tears open by metres. The rows' constant parts are
52
+ * prepared once per substep into retained typed arrays, so a pass is row
53
+ * arithmetic only.
54
+ *
55
+ * ## The relax pass
56
+ *
57
+ * The position-correction bias of the biased passes is a velocity. A one-sided
58
+ * LIMITED row that pushed its DOF out of violation can never take that push
59
+ * back — its clamp forbids the opposite impulse — so the DOF coasts across its
60
+ * range onto the far stop. After the pose has taken the correction, the relax
61
+ * pass re-solves the LIMITED rows against their velocity target alone (the
62
+ * speculative, in-range term), which removes the push. Motors and springs are
63
+ * drives, not corrections, and solve the same in both. LOCKED rows are not
64
+ * relaxed: they are bilateral, so the next substep's biased solve re-targets
65
+ * their velocity outright and their correction never accumulates — and
66
+ * relaxing them, unlike Box3D (whose rows are soft), widened the settle tail of
67
+ * a jointed assembly (see {@link relax_joints}). The relax reuses the
68
+ * substep's prepared rows.
36
69
  *
37
70
  * A joint is a configurable 6-DOF constraint ({@link Joint}); each relative
38
71
  * degree of freedom is independently locked / free / limited / springy /
@@ -58,10 +91,11 @@ import { DofMode } from "./DofMode.js";
58
91
  * it a unilateral push-out-of-violation constraint, exactly like a contact
59
92
  * normal — the limit can only resist crossing the stop, never pull the DOF
60
93
  * back into range.
61
- * The warm-start and the iteration loop are mode-agnostic; they read the
62
- * per-DOF `(active, effMass, bias, clampLo, clampHi)` filled by the mode-aware
63
- * setup. Geometry (anchors / lever arms / position error) is recomputed from
64
- * the current pose every substep, so the joint tracks the bodies as they move.
94
+ * The warm-start, the passes and the relax are mode-agnostic; they read the
95
+ * per-DOF `(active, relaxes, effMass, bias, relaxBias, clampLo, clampHi, γ)`
96
+ * the mode-aware setup prepared. Geometry (anchors / lever arms / position error)
97
+ * is recomputed from the current pose every substep, so the joint tracks the
98
+ * bodies as they move.
65
99
  *
66
100
  * The "position" along a DOF is `C · axis` for linear (signed anchor offset in
67
101
  * metres) and `e · axis` for angular, where `e = 2·sign(qD.w)·qD.xyz` is the
@@ -100,29 +134,87 @@ const MAX_JOINT_BIAS = 4;
100
134
  const JOINT_BAUMGARTE = 0.2;
101
135
 
102
136
  const scratch_inertia = new Float64Array(3);
103
- const scratch_anchor = new Float64Array(3);
137
+ /**
138
+ * The impulse a row applies, for {@link apply_impulse_to_body} and {@link apply_angular_impulse}, which
139
+ * take it in an array.
140
+ */
141
+ const scratch_impulse = new Float64Array(3);
104
142
  /** Frame-A world basis (rows = A's frame axes in world), from quat3_to_matrix3. */
105
143
  const scratch_frame_a = new Float64Array(9);
106
- /** Scratch quaternion for frame composition / relative rotation. */
144
+ /** Scratch quaternion: frame A's world rotation, then the relative rotation `qD`. */
107
145
  const scratch_q = new Float64Array(4);
146
+ /** The operands of `qD = conj(qA) ⊗ qB`: `conj(qA)` at 0, `qB` at 4. */
147
+ const scratch_rel = new Float64Array(8);
108
148
  /** Angular position error `e` per frame axis (frame-A-local small-angle vector). */
109
149
  const scratch_ang_err = new Float64Array(3);
150
+ /** One row's effective-mass denominator, body A's part at 0 and body B's at 1. */
151
+ const scratch_keff = new Float64Array(2);
152
+
153
+ // The numbers {@link fill_row} is given for one DOF, at these offsets in `scratch_dof`. They are computed
154
+ // per row, and a computed number handed to a call that is not inlined (fill_row is past V8's inlining
155
+ // limit) is boxed into a new heap object; read from an array, it is not.
156
+ const DOF_KEFF = 0; // raw effective-mass denominator K
157
+ const DOF_POS = 1; // signed DOF position
158
+ const DOF_VEL = 2; // signed DOF velocity
159
+ const scratch_dof = new Float64Array(3);
160
+
161
+ // ── Prepared rows ────────────────────────────────────────────────────────────
162
+ // solve_joints prepares each joint once per substep — geometry at the
163
+ // substep's start pose plus the mode-derived row parameters — into a slot
164
+ // (the joint's index in the solve-order array); every pass after that, and
165
+ // relax_joints, reads the slot back. Retained and grown geometrically, so a
166
+ // steady joint count allocates nothing per step.
167
+
168
+ // Per-slot doubles.
169
+ const PREP_R_A = 0; // lever arm rA = R_A·localAnchorA (3)
170
+ const PREP_R_B = 3; // lever arm rB (3; zero for a world anchor)
171
+ const PREP_FRAME = 6; // frame-A world basis, rows = axes (9)
172
+ const PREP_K_INV = 15; // inverse point block [00,01,02,11,12,22] (6)
173
+ const PREP_ROWS = 21; // 6 rows × ROW_STRIDE: linear axes 0..2, angular axes 3..5
174
+
175
+ // Per-row doubles, at PREP_ROWS + row·ROW_STRIDE. The linear rows drive
176
+ // dofImpulse[0..2], the angular rows dofImpulse[3..5].
177
+ const ROW_EFF = 0; // effective mass 1/K (1/(K+γ) for a spring)
178
+ const ROW_BIAS = 1; // velocity bias of the biased passes
179
+ const ROW_RELAX_BIAS = 2; // velocity bias of the relax pass
180
+ const ROW_CLAMP_LO = 3; // accumulated-impulse clamp
181
+ const ROW_CLAMP_HI = 4;
182
+ const ROW_GAMMA = 5; // spring regularisation γ (0 for every other mode)
183
+ const ROW_STRIDE = 6;
184
+
185
+ const PREP_STRIDE = PREP_ROWS + 6 * ROW_STRIDE;
110
186
 
111
- // Per-DOF row parameters, filled per joint by the mode-aware setup and consumed
112
- // by the mode-agnostic warm-start + iteration. Indexed 0..2 (the three frame
113
- // axes); the linear set drives imp[0..2], the angular set drives imp[3..5].
114
- const lin_active = new Uint8Array(3);
115
- const lin_eff = new Float64Array(3);
116
- const lin_bias = new Float64Array(3);
117
- const lin_clo = new Float64Array(3);
118
- const lin_chi = new Float64Array(3);
119
- const lin_gamma = new Float64Array(3);
120
- const ang_active = new Uint8Array(3);
121
- const ang_eff = new Float64Array(3);
122
- const ang_bias = new Float64Array(3);
123
- const ang_clo = new Float64Array(3);
124
- const ang_chi = new Float64Array(3);
125
- const ang_gamma = new Float64Array(3);
187
+ // Per-slot flags.
188
+ const PREP_LIVE = 1; // prepared, with at least one active row
189
+ const PREP_TO_WORLD = 2; // B is a fixed world anchor
190
+ const PREP_POINT_BLOCK = 4; // linear triple solved as one 3×3 block (A2)
191
+ const PREP_ROW_ACTIVE = 8; // row r is active: PREP_ROW_ACTIVE << r
192
+ const PREP_LINEAR_ROWS = PREP_ROW_ACTIVE | (PREP_ROW_ACTIVE << 1) | (PREP_ROW_ACTIVE << 2);
193
+ const PREP_ANY_ROW = PREP_LINEAR_ROWS | (PREP_LINEAR_ROWS << 3);
194
+ const PREP_ROW_RELAX = PREP_ROW_ACTIVE << 6; // active row r takes part in the relax: PREP_ROW_RELAX << r
195
+ const PREP_ANY_RELAX = PREP_ANY_ROW << 6;
196
+
197
+ let prep_capacity = 0;
198
+ let prep_data = new Float64Array(0);
199
+ /** Per slot `[idxA, idxB]`: the bodies' indices (idxB −1 for a world anchor). */
200
+ let prep_body = new Int32Array(0);
201
+ let prep_flags = new Uint16Array(0);
202
+ /** Slots prepared by the last {@link solve_joints}; {@link relax_joints} sweeps them. */
203
+ let prep_count = 0;
204
+
205
+ /**
206
+ * Make room for `n` prepared slots. Contents are not kept: every slot is
207
+ * re-prepared at the start of the substep that needs it.
208
+ * @param {number} n
209
+ */
210
+ function ensure_prep_capacity(n) {
211
+ if (n <= prep_capacity) return;
212
+ const capacity = Math.max(n, prep_capacity * 2, 16);
213
+ prep_data = new Float64Array(capacity * PREP_STRIDE);
214
+ prep_body = new Int32Array(capacity * 2);
215
+ prep_flags = new Uint16Array(capacity);
216
+ prep_capacity = capacity;
217
+ }
126
218
 
127
219
  // A2 (block solve) scratch: the coupled 3×3 effective-mass of a fully-LOCKED
128
220
  // linear point constraint and its inverse, stored as the 6 symmetric entries
@@ -133,76 +225,89 @@ const lin_Kinv = new Float64Array(6);
133
225
  const block_c = new Float64Array(9);
134
226
  const block_w = new Float64Array(9);
135
227
 
228
+ // The helpers below take the axis, lever and impulse vectors in arrays and write any number they
229
+ // produce into one: none of them is inlined everywhere it is called, and a number that crosses a call
230
+ // that is not inlined, in or out, is boxed into a new heap object.
231
+
136
232
  /**
137
233
  * Angular effective-mass contribution of one body about a unit world axis:
138
- * `a · Iw⁻¹ · a`. Zero for non-dynamic / rotation-locked bodies (whose
234
+ * `a · Iw⁻¹ · a`, written to `out[out_offset]`. Zero for non-dynamic / rotation-locked bodies (whose
139
235
  * {@link SolverBodyState} inverse-inertia diagonal is zero).
236
+ * @param {Float64Array} out
237
+ * @param {number} out_offset
140
238
  * @param {Float64Array} ss solver-body-state data array
141
239
  * @param {number} base `body_index * SBS_STRIDE`
142
- * @param {number} ax unit world axis x
143
- * @param {number} ay unit world axis y
144
- * @param {number} az unit world axis z
145
- * @returns {number}
240
+ * @param {Float64Array} axis unit world axis
241
+ * @param {number} axis_offset
146
242
  */
147
- function angular_axis_effective_mass(ss, base, ax, ay, az) {
243
+ function angular_axis_effective_mass(out, out_offset, ss, base, axis, axis_offset) {
148
244
  const iix = ss[base + SBS_INV_I_X], iiy = ss[base + SBS_INV_I_Y], iiz = ss[base + SBS_INV_I_Z];
149
- if (iix === 0 && iiy === 0 && iiz === 0) return 0;
150
- world_inverse_inertia_apply_raw(scratch_inertia, 0, iix, iiy, iiz,
151
- ss[base + SBS_QX], ss[base + SBS_QY], ss[base + SBS_QZ], ss[base + SBS_QW], ax, ay, az);
152
- return ax * scratch_inertia[0] + ay * scratch_inertia[1] + az * scratch_inertia[2];
245
+ if (iix === 0 && iiy === 0 && iiz === 0) {
246
+ out[out_offset] = 0;
247
+ return;
248
+ }
249
+ world_inverse_inertia_apply_array(scratch_inertia, 0, ss, base + SBS_INV_I_X, ss, base + SBS_QX, axis, axis_offset);
250
+ out[out_offset] = axis[axis_offset] * scratch_inertia[0]
251
+ + axis[axis_offset + 1] * scratch_inertia[1]
252
+ + axis[axis_offset + 2] * scratch_inertia[2];
153
253
  }
154
254
 
155
255
  /**
156
- * Apply a pure angular impulse `sign·λ·axis`: Δω = Iw⁻¹·(sign·λ·axis).
256
+ * Apply a pure angular impulse `sign·L`: Δω = Iw⁻¹·(sign·L).
157
257
  * @param {Float64Array} ss solver-body-state data array
158
258
  * @param {number} base `body_index * SBS_STRIDE`
159
- * @param {number} ax
160
- * @param {number} ay
161
- * @param {number} az
162
- * @param {number} lambda
163
- * @param {number} sign
259
+ * @param {Float64Array} impulse the angular impulse `L`
260
+ * @param {number} impulse_offset
261
+ * @param {number} sign +1 or −1
164
262
  */
165
- function apply_angular_impulse(ss, base, ax, ay, az, lambda, sign) {
263
+ function apply_angular_impulse(ss, base, impulse, impulse_offset, sign) {
166
264
  const iix = ss[base + SBS_INV_I_X], iiy = ss[base + SBS_INV_I_Y], iiz = ss[base + SBS_INV_I_Z];
167
265
  if (iix === 0 && iiy === 0 && iiz === 0) return;
168
- const L = sign * lambda;
169
- world_inverse_inertia_apply_raw(scratch_inertia, 0, iix, iiy, iiz,
170
- ss[base + SBS_QX], ss[base + SBS_QY], ss[base + SBS_QZ], ss[base + SBS_QW], ax * L, ay * L, az * L);
171
- ss[base + SBS_AV_X] += scratch_inertia[0];
172
- ss[base + SBS_AV_Y] += scratch_inertia[1];
173
- ss[base + SBS_AV_Z] += scratch_inertia[2];
266
+ const w = scratch_inertia;
267
+ w[0] = sign * impulse[impulse_offset];
268
+ w[1] = sign * impulse[impulse_offset + 1];
269
+ w[2] = sign * impulse[impulse_offset + 2];
270
+ world_inverse_inertia_apply_array(w, 0, ss, base + SBS_INV_I_X, ss, base + SBS_QX, w, 0);
271
+ ss[base + SBS_AV_X] += w[0];
272
+ ss[base + SBS_AV_Y] += w[1];
273
+ ss[base + SBS_AV_Z] += w[2];
174
274
  }
175
275
 
176
276
  /**
177
277
  * Effective-mass denominator contribution of one body along a unit axis:
178
- * `invM + (r×d)·Iw⁻¹·(r×d)`. Static / kinematic bodies (invM === 0) contribute
179
- * nothing.
278
+ * `invM + (r×d)·Iw⁻¹·(r×d)`, written to `out[out_offset]`. Static / kinematic bodies (invM === 0)
279
+ * contribute nothing.
180
280
  *
281
+ * @param {Float64Array} out
282
+ * @param {number} out_offset
181
283
  * @param {Float64Array} ss solver-body-state data array
182
284
  * @param {number} base `body_index * SBS_STRIDE`
183
- * @param {number} invM
184
- * @param {number} rx
185
- * @param {number} ry
186
- * @param {number} rz
187
- * @param {number} dx
188
- * @param {number} dy
189
- * @param {number} dz
190
- * @returns {number}
285
+ * @param {Float64Array} lever the lever arm `r`
286
+ * @param {number} lever_offset
287
+ * @param {Float64Array} axis the unit axis `d`
288
+ * @param {number} axis_offset
191
289
  */
192
- function axis_effective_mass(ss, base, invM, rx, ry, rz, dx, dy, dz) {
193
- if (invM === 0) return 0;
290
+ function axis_effective_mass(out, out_offset, ss, base, lever, lever_offset, axis, axis_offset) {
291
+ const invM = ss[base + SBS_INV_MASS];
292
+ if (invM === 0) {
293
+ out[out_offset] = 0;
294
+ return;
295
+ }
194
296
  const iix = ss[base + SBS_INV_I_X], iiy = ss[base + SBS_INV_I_Y], iiz = ss[base + SBS_INV_I_Z];
195
297
  if (iix === 0 && iiy === 0 && iiz === 0) {
196
298
  // no rotational response, so the lever arm contributes nothing
197
- return invM;
299
+ out[out_offset] = invM;
300
+ return;
198
301
  }
199
- return invM + angular_effective_mass_raw(
200
- iix, iiy, iiz,
201
- ss[base + SBS_QX], ss[base + SBS_QY], ss[base + SBS_QZ], ss[base + SBS_QW],
202
- rx, ry, rz,
203
- dx, dy, dz,
302
+ angular_effective_mass_array(
303
+ out, out_offset,
304
+ ss, base + SBS_INV_I_X,
305
+ ss, base + SBS_QX,
306
+ lever, lever_offset,
307
+ axis, axis_offset,
204
308
  scratch_inertia
205
309
  );
310
+ out[out_offset] = invM + out[out_offset];
206
311
  }
207
312
 
208
313
  /**
@@ -216,16 +321,16 @@ function axis_effective_mass(ss, base, invM, rx, ry, rz, dx, dy, dz) {
216
321
  * @param {Float64Array} out length >= 3
217
322
  * @param {Float64Array} ss solver-body-state data
218
323
  * @param {number} baseA
219
- * @param {number} rAx
220
- * @param {number} rAy
221
- * @param {number} rAz anchor lever on A
324
+ * @param {Float64Array} lever_a anchor lever on A
325
+ * @param {number} lever_a_offset
222
326
  * @param {number} baseB
223
- * @param {number} rBx
224
- * @param {number} rBy
225
- * @param {number} rBz anchor lever on B
327
+ * @param {Float64Array} lever_b anchor lever on B, read even for a world anchor
328
+ * @param {number} lever_b_offset
226
329
  * @param {boolean} to_world B is a fixed world anchor (no B term)
227
330
  */
228
- function relative_anchor_velocity(out, ss, baseA, rAx, rAy, rAz, baseB, rBx, rBy, rBz, to_world) {
331
+ function relative_anchor_velocity(out, ss, baseA, lever_a, lever_a_offset, baseB, lever_b, lever_b_offset, to_world) {
332
+ const rAx = lever_a[lever_a_offset], rAy = lever_a[lever_a_offset + 1], rAz = lever_a[lever_a_offset + 2];
333
+ const rBx = lever_b[lever_b_offset], rBy = lever_b[lever_b_offset + 1], rBz = lever_b[lever_b_offset + 2];
229
334
  out[0] = (ss[baseA + SBS_LV_X] + ss[baseA + SBS_AV_Y] * rAz - ss[baseA + SBS_AV_Z] * rAy) - (to_world ? 0 : (ss[baseB + SBS_LV_X] + ss[baseB + SBS_AV_Y] * rBz - ss[baseB + SBS_AV_Z] * rBy));
230
335
  out[1] = (ss[baseA + SBS_LV_Y] + ss[baseA + SBS_AV_Z] * rAx - ss[baseA + SBS_AV_X] * rAz) - (to_world ? 0 : (ss[baseB + SBS_LV_Y] + ss[baseB + SBS_AV_Z] * rBx - ss[baseB + SBS_AV_X] * rBz));
231
336
  out[2] = (ss[baseA + SBS_LV_Z] + ss[baseA + SBS_AV_X] * rAy - ss[baseA + SBS_AV_Y] * rAx) - (to_world ? 0 : (ss[baseB + SBS_LV_Z] + ss[baseB + SBS_AV_X] * rBy - ss[baseB + SBS_AV_Y] * rBx));
@@ -255,21 +360,20 @@ function clamp_bias(b) {
255
360
  *
256
361
  * @param {Float64Array} ss
257
362
  * @param {number} base
258
- * @param {number} rx lever arm x
259
- * @param {number} ry lever arm y
260
- * @param {number} rz lever arm z
363
+ * @param {Float64Array} lever lever arm `r`
364
+ * @param {number} lever_offset
261
365
  * @param {Float64Array} fa frame-A world basis (rows = axes)
262
366
  * @param {Float64Array} K length-6 symmetric accumulator [00,01,02,11,12,22]
263
367
  */
264
- function accumulate_point_block(ss, base, rx, ry, rz, fa, K) {
368
+ function accumulate_point_block(ss, base, lever, lever_offset, fa, K) {
265
369
  const iix = ss[base + SBS_INV_I_X], iiy = ss[base + SBS_INV_I_Y], iiz = ss[base + SBS_INV_I_Z];
266
370
  if (iix === 0 && iiy === 0 && iiz === 0) return;
267
- const qx = ss[base + SBS_QX], qy = ss[base + SBS_QY], qz = ss[base + SBS_QZ], qw = ss[base + SBS_QW];
371
+ const rx = lever[lever_offset], ry = lever[lever_offset + 1], rz = lever[lever_offset + 2];
268
372
  for (let k = 0; k < 3; k++) {
269
373
  const ax = fa[3 * k], ay = fa[3 * k + 1], az = fa[3 * k + 2];
270
374
  const cx = ry * az - rz * ay, cy = rz * ax - rx * az, cz = rx * ay - ry * ax;
271
375
  block_c[3 * k] = cx; block_c[3 * k + 1] = cy; block_c[3 * k + 2] = cz;
272
- world_inverse_inertia_apply_raw(block_w, 3 * k, iix, iiy, iiz, qx, qy, qz, qw, cx, cy, cz);
376
+ world_inverse_inertia_apply_array(block_w, 3 * k, ss, base + SBS_INV_I_X, ss, base + SBS_QX, block_c, 3 * k);
273
377
  }
274
378
  K[0] += block_c[0] * block_w[0] + block_c[1] * block_w[1] + block_c[2] * block_w[2];
275
379
  K[1] += block_c[0] * block_w[3] + block_c[1] * block_w[4] + block_c[2] * block_w[5];
@@ -281,24 +385,25 @@ function accumulate_point_block(ss, base, rx, ry, rz, fa, K) {
281
385
 
282
386
  /**
283
387
  * Invert a symmetric positive-definite 3×3 (6-entry form) in closed form,
284
- * writing the inverse (same 6-entry form) to `out`. Returns the determinant; a
285
- * near-singular block (|det| < 1e-12) returns 0 and leaves `out` untouched so
286
- * the caller falls back to the per-axis solve.
388
+ * writing the inverse (same 6-entry form) to `out`. A near-singular block
389
+ * (|det| < 1e-12) returns false and leaves `out` untouched so the caller falls
390
+ * back to the per-axis solve. (It returns no determinant: the caller has no use
391
+ * for it, and a number returned from a call that is not inlined is boxed.)
287
392
  *
288
393
  * @param {Float64Array} K [00,01,02,11,12,22]
289
394
  * @param {Float64Array} out
290
- * @returns {number} determinant
395
+ * @returns {boolean} whether `out` holds the inverse
291
396
  */
292
397
  function invert_sym3(K, out) {
293
398
  const a = K[0], b = K[1], c = K[2], d = K[3], e = K[4], f = K[5];
294
399
  const A00 = d * f - e * e, A01 = c * e - b * f, A02 = b * e - c * d;
295
400
  const A11 = a * f - c * c, A12 = b * c - a * e, A22 = a * d - b * b;
296
401
  const det = a * A00 + b * A01 + c * A02;
297
- if (det < 1e-12 && det > -1e-12) return 0;
402
+ if (det < 1e-12 && det > -1e-12) return false;
298
403
  const inv = 1 / det;
299
404
  out[0] = A00 * inv; out[1] = A01 * inv; out[2] = A02 * inv;
300
405
  out[3] = A11 * inv; out[4] = A12 * inv; out[5] = A22 * inv;
301
- return det;
406
+ return true;
302
407
  }
303
408
 
304
409
  /**
@@ -326,6 +431,31 @@ function invert_sym3(K, out) {
326
431
  * @param {Float64Array} out length-3 destination (frame-axis positions)
327
432
  */
328
433
  export function swing_twist_error(dx, dy, dz, dw, out) {
434
+ const q = swing_twist_inputs;
435
+
436
+ q[0] = dx;
437
+ q[1] = dy;
438
+ q[2] = dz;
439
+ q[3] = dw;
440
+
441
+ swing_twist_error_array(q, 0, out);
442
+ }
443
+
444
+ /** Where {@link swing_twist_error} packs its quaternion. */
445
+ const swing_twist_inputs = new Float64Array(4);
446
+
447
+ /**
448
+ * {@link swing_twist_error} with `qD` read from `q[q_offset ..+3]`, `[x, y, z, w]`: the one place the
449
+ * arithmetic lives. For a caller whose inlining budget is spent, where a call taking the four numbers
450
+ * would box each into a new heap object.
451
+ *
452
+ * @param {Float64Array} q
453
+ * @param {number} q_offset
454
+ * @param {Float64Array} out length-3 destination (frame-axis positions)
455
+ */
456
+ export function swing_twist_error_array(q, q_offset, out) {
457
+ let dx = q[q_offset], dy = q[q_offset + 1], dz = q[q_offset + 2], dw = q[q_offset + 3];
458
+
329
459
  // Shortest arc: work with the hemisphere where dw ≥ 0.
330
460
  if (dw < 0) { dx = -dx; dy = -dy; dz = -dz; dw = -dw; }
331
461
 
@@ -363,9 +493,11 @@ export function swing_twist_error(dx, dy, dz, dw, out) {
363
493
  * Fill the row parameters for one DOF given its mode, signed position and
364
494
  * signed velocity.
365
495
  *
366
- * Writes `active / eff / bias / clampLo / clampHi` at index `k` of the supplied
367
- * arrays and, for LIMITED, resets the warm-start impulse when the active bound
368
- * flipped (a stale opposite-side impulse must not warm-start).
496
+ * Writes `eff / bias / clampLo / clampHi / γ` — and `relaxBias`, for every mode
497
+ * but LOCKED — into the prepared row at `out[o …]`, returns whether the row is
498
+ * active and, for LIMITED,
499
+ * resets the warm-start impulse when the active bound flipped (a stale
500
+ * opposite-side impulse must not warm-start).
369
501
  *
370
502
  * ## LIMITED is a speculative (β = 1) one-sided velocity constraint
371
503
  *
@@ -385,15 +517,11 @@ export function swing_twist_error(dx, dy, dz, dw, out) {
385
517
  * so a body teleported deep past a stop is eased out rather than yanked; the
386
518
  * gating side is left unbounded.
387
519
  *
388
- * KNOWN BUG (deferred — see Joint.spec.js "linear limit recovery", test.skip): the
389
- * push-out clamp caps the recovery bias to a CONSTANT velocity, which a one-sided
390
- * row cannot later remove (warm-start re-injects it, the clamp blocks removal), so
391
- * a DOF that starts OUTSIDE its range coasts across the whole travel and pins on the
392
- * OPPOSITE stop rather than easing onto the near one (the classic ragdoll-kicks-itself-
393
- * on-spawn). A scalar bias cannot fix this — the trace shows the injected velocity is
394
- * constant regardless of magnitude. The correct fix routes limit-penetration recovery
395
- * through a split-impulse / pseudo-velocity channel (as the contact solver's
396
- * solve_position does), which the joint solver does not yet have.
520
+ * The push-out velocity is the one part of the row the relax pass drops (its
521
+ * relax bias keeps only the speculative, in-range side): a one-sided row can
522
+ * never remove the velocity it pushed with — its clamp forbids the opposite
523
+ * impulse — so without the relax a DOF that starts OUTSIDE its range coasts
524
+ * across the whole travel and pins itself on the OPPOSITE stop.
397
525
  *
398
526
  * The active bound is the violated one, else — within range — the one the DOF
399
527
  * is moving toward (`vel` sign). LOCKED is unchanged: a bilateral row with a
@@ -427,42 +555,44 @@ export function swing_twist_error(dx, dy, dz, dw, out) {
427
555
  * element, and the soft basis for cone-twist later. The angular position uses
428
556
  * the same small-angle measure as LIMITED (good for modest ranges).
429
557
  *
558
+ * A motor or a spring is a drive, not a position correction, so its relax
559
+ * bias is its bias. A LOCKED row has none: it does not take part in the relax
560
+ * (see the module doc).
561
+ *
562
+ * The DOF's own numbers come in `dof`, at:
563
+ * - `DOF_KEFF`, the raw effective-mass denominator `K` (0 ⇒ no row); the
564
+ * row's effective mass is `1/K`, or `1/(K+γ)` softened for a spring;
565
+ * - `DOF_POS`, the signed DOF position (`C·axis` linear / `e·axis` angular);
566
+ * - `DOF_VEL`, the signed DOF velocity along the same axis (selects the
567
+ * approached bound for an in-range LIMITED DOF).
568
+ *
430
569
  * @param {Joint} joint the joint (per-DOF config + warm-start impulse read here)
431
570
  * @param {number} dofIndex DOF 0..5 (selects mode / limits / motor / imp slot)
432
- * @param {number} k axis index 0..2 (output-array slot for this DOF group)
433
- * @param {number} keff raw effective-mass denominator `K` (0 ⇒ no row); the
434
- * row's effective mass is `1/K`, or `1/(K+γ)` softened for a spring.
435
- * @param {number} pos signed DOF position (`C·axis` linear / `e·axis` angular)
436
- * @param {number} vel signed DOF velocity along the same axis (selects the
437
- * approached bound for an in-range LIMITED DOF)
571
+ * @param {Float64Array} dof the DOF's `K`, position and velocity
438
572
  * @param {number} spook_locked Baumgarte gain `β / dt_sub` (LOCKED)
439
573
  * @param {number} spook_spec speculative gain `1 / dt_sub` (LIMITED)
440
574
  * @param {number} dt_sub substep size (MOTOR impulse cap = `maxForce·dt_sub`;
441
575
  * SPRING compliance derives from it)
442
- * @param {Uint8Array} active
443
- * @param {Float64Array} effOut
444
- * @param {Float64Array} biasOut
445
- * @param {Float64Array} cloOut
446
- * @param {Float64Array} chiOut
447
- * @param {Float64Array} gammaOut per-row regularisation (0 for non-spring rows)
576
+ * @param {Float64Array} out prepared-row storage
577
+ * @param {number} o offset of this DOF's row in `out` (ROW_* fields follow it)
578
+ * @returns {boolean} whether the row is active this substep
448
579
  */
449
- function fill_row(joint, dofIndex, k, keff, pos, vel, spook_locked, spook_spec, dt_sub,
450
- active, effOut, biasOut, cloOut, chiOut, gammaOut) {
580
+ function fill_row(joint, dofIndex, dof, spook_locked, spook_spec, dt_sub, out, o) {
581
+ const keff = dof[DOF_KEFF], pos = dof[DOF_POS], vel = dof[DOF_VEL];
451
582
  const mode = joint.dofMode[dofIndex];
452
583
  const imp = joint.dofImpulse;
453
584
 
454
585
  if (mode === DofMode.LOCKED) {
455
- if (keff === 0) { active[k] = 0; return; }
456
- effOut[k] = 1 / keff;
457
- biasOut[k] = clamp_bias(spook_locked * pos);
458
- cloOut[k] = -Infinity;
459
- chiOut[k] = Infinity;
460
- gammaOut[k] = 0;
461
- active[k] = 1;
462
- return;
586
+ if (keff === 0) return false;
587
+ out[o + ROW_EFF] = 1 / keff;
588
+ out[o + ROW_BIAS] = clamp_bias(spook_locked * pos);
589
+ out[o + ROW_CLAMP_LO] = -Infinity;
590
+ out[o + ROW_CLAMP_HI] = Infinity;
591
+ out[o + ROW_GAMMA] = 0;
592
+ return true;
463
593
  }
464
594
  if (mode === DofMode.LIMITED) {
465
- if (keff === 0) { imp[dofIndex] = 0; active[k] = 0; return; }
595
+ if (keff === 0) { imp[dofIndex] = 0; return false; }
466
596
  const lower = joint.dofLowerLimit[dofIndex];
467
597
  const upper = joint.dofUpperLimit[dofIndex];
468
598
  // Select the bound: the violated one, else the one being approached.
@@ -475,361 +605,505 @@ function fill_row(joint, dofIndex, k, keff, pos, vel, spook_locked, spook_spec,
475
605
  if (lower_side) {
476
606
  // Lower stop: impulse pushes the DOF up (+), clamp [0, +∞). The
477
607
  // push-out side of the bias is the negative one — bound it.
478
- cloOut[k] = 0; chiOut[k] = Infinity;
608
+ out[o + ROW_CLAMP_LO] = 0; out[o + ROW_CLAMP_HI] = Infinity;
479
609
  if (imp[dofIndex] < 0) imp[dofIndex] = 0; // drop stale upper-side impulse
480
610
  if (b < -MAX_JOINT_BIAS) b = -MAX_JOINT_BIAS;
611
+ out[o + ROW_RELAX_BIAS] = b > 0 ? b : 0; // relax keeps the speculative side only
481
612
  } else {
482
613
  // Upper stop: impulse pushes the DOF down (−), clamp (−∞, 0]. The
483
614
  // push-out side of the bias is the positive one — bound it.
484
- cloOut[k] = -Infinity; chiOut[k] = 0;
615
+ out[o + ROW_CLAMP_LO] = -Infinity; out[o + ROW_CLAMP_HI] = 0;
485
616
  if (imp[dofIndex] > 0) imp[dofIndex] = 0; // drop stale lower-side impulse
486
617
  if (b > MAX_JOINT_BIAS) b = MAX_JOINT_BIAS;
618
+ out[o + ROW_RELAX_BIAS] = b < 0 ? b : 0;
487
619
  }
488
- effOut[k] = 1 / keff;
489
- biasOut[k] = b;
490
- gammaOut[k] = 0;
491
- active[k] = 1;
492
- return;
620
+ out[o + ROW_EFF] = 1 / keff;
621
+ out[o + ROW_BIAS] = b;
622
+ out[o + ROW_GAMMA] = 0;
623
+ return true;
493
624
  }
494
625
  if (mode === DofMode.MOTOR) {
495
- if (keff === 0) { imp[dofIndex] = 0; active[k] = 0; return; }
626
+ if (keff === 0) { imp[dofIndex] = 0; return false; }
496
627
  const maxImpulse = joint.dofMotorMaxForce[dofIndex] * dt_sub;
497
- if (maxImpulse <= 0) { imp[dofIndex] = 0; active[k] = 0; return; }
498
- effOut[k] = 1 / keff;
628
+ if (maxImpulse <= 0) { imp[dofIndex] = 0; return false; }
629
+ out[o + ROW_EFF] = 1 / keff;
499
630
  // Drive the relative velocity to the target: λ = −eff·(vrel − target).
500
- biasOut[k] = -joint.dofMotorTargetVelocity[dofIndex];
501
- cloOut[k] = -maxImpulse;
502
- chiOut[k] = maxImpulse;
503
- gammaOut[k] = 0;
504
- active[k] = 1;
505
- return;
631
+ out[o + ROW_BIAS] = out[o + ROW_RELAX_BIAS] = -joint.dofMotorTargetVelocity[dofIndex];
632
+ out[o + ROW_CLAMP_LO] = -maxImpulse;
633
+ out[o + ROW_CLAMP_HI] = maxImpulse;
634
+ out[o + ROW_GAMMA] = 0;
635
+ return true;
506
636
  }
507
637
  if (mode === DofMode.SPRING) {
508
- if (keff === 0) { imp[dofIndex] = 0; active[k] = 0; return; }
638
+ if (keff === 0) { imp[dofIndex] = 0; return false; }
509
639
  const ks = joint.dofStiffness[dofIndex];
510
640
  const cs = joint.dofDamping[dofIndex];
511
641
  const denom = cs + dt_sub * ks;
512
- if (denom <= 0) { imp[dofIndex] = 0; active[k] = 0; return; } // inert (no k, no c)
642
+ if (denom <= 0) { imp[dofIndex] = 0; return false; } // inert (no k, no c)
513
643
  const gamma = 1 / (dt_sub * denom);
514
- effOut[k] = 1 / (keff + gamma);
515
- biasOut[k] = (ks / denom) * pos; // restoring velocity toward pos = 0
516
- cloOut[k] = -Infinity;
517
- chiOut[k] = Infinity;
518
- gammaOut[k] = gamma;
519
- active[k] = 1;
520
- return;
644
+ out[o + ROW_EFF] = 1 / (keff + gamma);
645
+ // restoring velocity toward pos = 0
646
+ out[o + ROW_BIAS] = out[o + ROW_RELAX_BIAS] = (ks / denom) * pos;
647
+ out[o + ROW_CLAMP_LO] = -Infinity;
648
+ out[o + ROW_CLAMP_HI] = Infinity;
649
+ out[o + ROW_GAMMA] = gamma;
650
+ return true;
521
651
  }
522
652
  // FREE: no row this substep.
523
653
  imp[dofIndex] = 0;
524
- active[k] = 0;
654
+ return false;
525
655
  }
526
656
 
527
657
  /**
528
- * Solve every joint for one substep: recompute geometry at the current poses,
529
- * derive each DOF's row parameters from its mode, replay the per-substep
530
- * warm-start, and run `iters` velocity iterations.
531
- *
532
- * Called once per substep from `PhysicsSystem.fixedUpdate`, after the contact
533
- * solve so the two share the substep / warm-start cadence.
658
+ * Prepare one joint into slot `slot` for this substep: resolve its bodies,
659
+ * recompute anchors / lever arms / frame / position error at the current
660
+ * poses, and derive every DOF's row from its mode. The slot stays dead (the
661
+ * joint does nothing this substep) when a body is gone or asleep, neither
662
+ * body can move, or no row is active.
534
663
  *
535
- * @param {Joint[]} joints live joints (sparse array; holes skipped)
664
+ * @param {number} slot the joint's index in the solve-order array
665
+ * @param {Joint|undefined} joint
536
666
  * @param {PhysicsSystem} system reads `__bodies` / `__transforms` / index map
537
- * @param {number} dt_sub substep size in seconds (the SPOOK gain is derived
538
- * from it, matching the contact solver's per-substep position stiffness)
539
- * @param {number} iters velocity iterations
540
- * @param {boolean} [reverse] A2: traverse the joint array tip→root this call
541
- * (the caller alternates it per substep for a symmetric Gauss-Seidel sweep, so
542
- * chain impulses propagate both ways). Default false ⇒ original root→tip order.
667
+ * @param {Float64Array} ss solver-body-state data
668
+ * @param {number} dt_sub substep size in seconds
669
+ * @param {number} spook_locked Baumgarte gain `β / dt_sub` (LOCKED)
670
+ * @param {number} spook_spec speculative gain `1 / dt_sub` (LIMITED)
671
+ * @returns {boolean} whether the slot is live
543
672
  */
544
- export function solve_joints(joints, system, dt_sub, iters, reverse) {
545
- const n = joints.length;
546
- if (n === 0 || dt_sub <= 0) return;
547
-
548
- const spook_locked = JOINT_BAUMGARTE / dt_sub;
549
- const spook_spec = 1 / dt_sub;
673
+ function prepare_joint(slot, joint, system, ss, dt_sub, spook_locked, spook_spec) {
674
+ prep_flags[slot] = 0;
675
+ if (joint === undefined || joint === null) return false;
550
676
 
551
677
  const storage = system.storage;
552
- const ss = system.__solver_state.data;
553
678
 
554
- for (let jj = 0; jj < n; jj++) {
555
- const ji = reverse ? (n - 1 - jj) : jj;
556
- const joint = joints[ji];
557
- if (joint === undefined || joint === null) continue;
558
-
559
- // Generation-checked validity: if A's body was unlinked (and its slot
560
- // possibly reused by a different body), the stored packed id no longer
561
- // validates — skip the stale joint rather than attach to the wrong body.
562
- if (!storage.is_valid(joint._bodyIdA)) continue;
563
- const idxA = body_id_index(joint._bodyIdA);
564
- const baseA = idxA * SBS_STRIDE;
565
- const rbA = system.__bodies[idxA];
566
- if (rbA === undefined) continue;
567
- const trA = system.__transforms[idxA];
568
-
569
- const to_world = joint._bodyIdB === JOINT_WORLD;
570
- let rbB = null, trB = null, idxB = -1, baseB = -1;
571
- if (!to_world) {
572
- if (!storage.is_valid(joint._bodyIdB)) continue;
573
- idxB = body_id_index(joint._bodyIdB);
574
- baseB = idxB * SBS_STRIDE;
575
- rbB = system.__bodies[idxB];
576
- if (rbB === undefined) continue;
577
- trB = system.__transforms[idxB];
578
- }
679
+ // Generation-checked validity: if A's body was unlinked (and its slot
680
+ // possibly reused by a different body), the stored packed id no longer
681
+ // validates — skip the stale joint rather than attach to the wrong body.
682
+ if (!storage.is_valid(joint._bodyIdA)) return false;
683
+ const idxA = body_id_index(joint._bodyIdA);
684
+ const baseA = idxA * SBS_STRIDE;
685
+ const rbA = system.__bodies[idxA];
686
+ if (rbA === undefined) return false;
687
+ const trA = system.__transforms[idxA];
579
688
 
580
- // Skip while a participating dynamic body sleeps — its velocity must
581
- // stay zero until woken. (Island-aware joint sleep is a follow-up; for
582
- // now jointed bodies that should stay coupled use DisableSleep.)
583
- if (rbA.sleepState === SleepState.Sleeping) continue;
584
- if (!to_world && rbB.sleepState === SleepState.Sleeping) continue;
585
-
586
- // Both bodies static/kinematic → nothing to solve.
587
- const invMA = ss[baseA + SBS_INV_MASS];
588
- const invMB = to_world ? 0 : ss[baseB + SBS_INV_MASS];
589
- if (invMA === 0 && invMB === 0) continue;
590
-
591
- const mode = joint.dofMode;
592
- const linConstrained = mode[0] !== DofMode.FREE || mode[1] !== DofMode.FREE || mode[2] !== DofMode.FREE;
593
- const angConstrained = mode[3] !== DofMode.FREE || mode[4] !== DofMode.FREE || mode[5] !== DofMode.FREE;
594
- if (!linConstrained && !angConstrained) continue;
595
-
596
- // World anchor A and its lever arm rA = R_A · localAnchorA.
597
- const la = joint.localAnchorA;
598
- v3_quaternion_apply(scratch_anchor, 0, la[0], la[1], la[2],
599
- trA.rotation_x, trA.rotation_y, trA.rotation_z, trA.rotation_w);
600
- const rAx = scratch_anchor[0], rAy = scratch_anchor[1], rAz = scratch_anchor[2];
601
- const anchorAx = trA.translation_x + rAx;
602
- const anchorAy = trA.translation_y + rAy;
603
- const anchorAz = trA.translation_z + rAz;
604
-
605
- // World anchor B + lever arm rB. For a world anchor, localAnchorB is a
606
- // fixed world point and there is no body B lever.
607
- let rBx = 0, rBy = 0, rBz = 0;
608
- let anchorBx, anchorBy, anchorBz;
609
- const lb = joint.localAnchorB;
610
- if (to_world) {
611
- anchorBx = lb[0]; anchorBy = lb[1]; anchorBz = lb[2];
612
- } else {
613
- v3_quaternion_apply(scratch_anchor, 0, lb[0], lb[1], lb[2],
614
- trB.rotation_x, trB.rotation_y, trB.rotation_z, trB.rotation_w);
615
- rBx = scratch_anchor[0]; rBy = scratch_anchor[1]; rBz = scratch_anchor[2];
616
- anchorBx = trB.translation_x + rBx;
617
- anchorBy = trB.translation_y + rBy;
618
- anchorBz = trB.translation_z + rBz;
619
- }
689
+ const to_world = joint._bodyIdB === JOINT_WORLD;
690
+ let rbB = null, trB = null, idxB = -1, baseB = -1;
691
+ if (!to_world) {
692
+ if (!storage.is_valid(joint._bodyIdB)) return false;
693
+ idxB = body_id_index(joint._bodyIdB);
694
+ baseB = idxB * SBS_STRIDE;
695
+ rbB = system.__bodies[idxB];
696
+ if (rbB === undefined) return false;
697
+ trB = system.__transforms[idxB];
698
+ }
620
699
 
621
- // Position error C = anchorA − anchorB (its projection on a frame axis
622
- // is the signed DOF offset; locked axes drive it to zero, limited axes
623
- // bound it).
624
- const Cx = anchorAx - anchorBx;
625
- const Cy = anchorAy - anchorBy;
626
- const Cz = anchorAz - anchorBz;
627
-
628
- const imp = joint.dofImpulse;
629
-
630
- // === Frame A world axes — shared by the linear AND angular rows ===
631
- // Every DOF is expressed in the joint's frame on body A. Frame A =
632
- // body-A rotation ⊗ localBasisA; the rows of its matrix are the frame
633
- // axes in world (see quat3_to_matrix3).
634
- const lba = joint.localBasisA;
635
- quat3_multiply(scratch_q, 0, trA.rotation_x, trA.rotation_y, trA.rotation_z, trA.rotation_w, lba[0], lba[1], lba[2], lba[3]);
636
- const qAx = scratch_q[0], qAy = scratch_q[1], qAz = scratch_q[2], qAw = scratch_q[3];
637
- quat3_to_matrix3(scratch_frame_a, 0, qAx, qAy, qAz, qAw);
638
- const fa = scratch_frame_a;
639
-
640
- // --- Linear DOF row setup (frame axes). Position along axis k is
641
- // `C · axis_k`; convention is A−B (impulse +to A / −to B). ---
642
- let useLinBlock = false;
643
- if (linConstrained) {
644
- // A2: a fully-LOCKED linear triple is a ball-socket point — solve it
645
- // as one coupled 3×3 block (frame axes) instead of axis-by-axis,
646
- // removing the intra-joint coupling error the sequential per-axis
647
- // Gauss-Seidel leaves behind. Falls back to per-axis if the block is
648
- // near-singular.
649
- if (mode[0] === DofMode.LOCKED && mode[1] === DofMode.LOCKED && mode[2] === DofMode.LOCKED) {
650
- lin_K[0] = lin_K[3] = lin_K[5] = invMA + invMB;
651
- lin_K[1] = lin_K[2] = lin_K[4] = 0;
652
- accumulate_point_block(ss, baseA, rAx, rAy, rAz, fa, lin_K);
653
- if (!to_world) accumulate_point_block(ss, baseB, rBx, rBy, rBz, fa, lin_K);
654
- if (invert_sym3(lin_K, lin_Kinv) !== 0) {
655
- for (let k = 0; k < 3; k++) {
656
- const ax = fa[3 * k], ay = fa[3 * k + 1], az = fa[3 * k + 2];
657
- lin_bias[k] = clamp_bias(spook_locked * (Cx * ax + Cy * ay + Cz * az));
658
- lin_active[k] = 1;
659
- }
660
- useLinBlock = true;
661
- }
662
- }
663
- if (!useLinBlock) {
700
+ // Skip while a participating dynamic body sleeps — its velocity must
701
+ // stay zero until woken. (Island-aware joint sleep is a follow-up; for
702
+ // now jointed bodies that should stay coupled use DisableSleep.)
703
+ if (rbA.sleepState === SleepState.Sleeping) return false;
704
+ if (!to_world && rbB.sleepState === SleepState.Sleeping) return false;
705
+
706
+ // Both bodies static/kinematic → nothing to solve.
707
+ const invMA = ss[baseA + SBS_INV_MASS];
708
+ const invMB = to_world ? 0 : ss[baseB + SBS_INV_MASS];
709
+ if (invMA === 0 && invMB === 0) return false;
710
+
711
+ const mode = joint.dofMode;
712
+ const linConstrained = mode[0] !== DofMode.FREE || mode[1] !== DofMode.FREE || mode[2] !== DofMode.FREE;
713
+ const angConstrained = mode[3] !== DofMode.FREE || mode[4] !== DofMode.FREE || mode[5] !== DofMode.FREE;
714
+ if (!linConstrained && !angConstrained) return false;
715
+
716
+ const p = slot * PREP_STRIDE;
717
+ const pd = prep_data;
718
+ let flags = to_world ? PREP_TO_WORLD : 0;
719
+
720
+ // World anchor A and its lever arm rA = R_A · localAnchorA, written straight
721
+ // into the slot, where the rows read it (a slot left dead is never read).
722
+ const rA = p + PREP_R_A;
723
+ v3_quaternion_apply_array(pd, rA, joint.localAnchorA, 0, trA, TRANSFORM64_ROTATION_OFFSET);
724
+ const anchorAx = trA.translation_x + pd[rA];
725
+ const anchorAy = trA.translation_y + pd[rA + 1];
726
+ const anchorAz = trA.translation_z + pd[rA + 2];
727
+
728
+ // World anchor B + lever arm rB. For a world anchor, localAnchorB is a
729
+ // fixed world point and there is no body B lever.
730
+ const rB = p + PREP_R_B;
731
+ let anchorBx, anchorBy, anchorBz;
732
+ const lb = joint.localAnchorB;
733
+ if (to_world) {
734
+ pd[rB] = 0; pd[rB + 1] = 0; pd[rB + 2] = 0;
735
+ anchorBx = lb[0]; anchorBy = lb[1]; anchorBz = lb[2];
736
+ } else {
737
+ v3_quaternion_apply_array(pd, rB, lb, 0, trB, TRANSFORM64_ROTATION_OFFSET);
738
+ anchorBx = trB.translation_x + pd[rB];
739
+ anchorBy = trB.translation_y + pd[rB + 1];
740
+ anchorBz = trB.translation_z + pd[rB + 2];
741
+ }
742
+
743
+ // Position error C = anchorA − anchorB (its projection on a frame axis
744
+ // is the signed DOF offset; locked axes drive it to zero, limited axes
745
+ // bound it).
746
+ const Cx = anchorAx - anchorBx;
747
+ const Cy = anchorAy - anchorBy;
748
+ const Cz = anchorAz - anchorBz;
749
+
750
+ const imp = joint.dofImpulse;
751
+
752
+ // === Frame A world axes — shared by the linear AND angular rows ===
753
+ // Every DOF is expressed in the joint's frame on body A. Frame A =
754
+ // body-A rotation ⊗ localBasisA; the rows of its matrix are the frame
755
+ // axes in world (see quat3_to_matrix3).
756
+ quat3_multiply_array(scratch_q, 0, trA, TRANSFORM64_ROTATION_OFFSET, joint.localBasisA, 0);
757
+ quat3_to_matrix3_array(scratch_frame_a, 0, scratch_q, 0);
758
+ const fa = scratch_frame_a;
759
+ const dof = scratch_dof;
760
+ const keff = scratch_keff;
761
+
762
+ // --- Linear DOF row setup (frame axes). Position along axis k is
763
+ // `C · axis_k`; convention is A−B (impulse +to A / −to B). ---
764
+ if (linConstrained) {
765
+ // A2: a fully-LOCKED linear triple is a ball-socket point — solve it
766
+ // as one coupled 3×3 block (frame axes) instead of axis-by-axis,
767
+ // removing the intra-joint coupling error the sequential per-axis
768
+ // Gauss-Seidel leaves behind. Falls back to per-axis if the block is
769
+ // near-singular.
770
+ if (mode[0] === DofMode.LOCKED && mode[1] === DofMode.LOCKED && mode[2] === DofMode.LOCKED) {
771
+ lin_K[0] = lin_K[3] = lin_K[5] = invMA + invMB;
772
+ lin_K[1] = lin_K[2] = lin_K[4] = 0;
773
+ accumulate_point_block(ss, baseA, pd, rA, fa, lin_K);
774
+ if (!to_world) accumulate_point_block(ss, baseB, pd, rB, fa, lin_K);
775
+ if (invert_sym3(lin_K, lin_Kinv)) {
664
776
  for (let k = 0; k < 3; k++) {
665
- lin_active[k] = 0;
666
- const m = mode[k];
667
- if (m === DofMode.FREE) { imp[k] = 0; continue; }
668
777
  const ax = fa[3 * k], ay = fa[3 * k + 1], az = fa[3 * k + 2];
669
- const keff = axis_effective_mass(ss, baseA, invMA, rAx, rAy, rAz, ax, ay, az)
670
- + (to_world ? 0 : axis_effective_mass(ss, baseB, invMB, rBx, rBy, rBz, ax, ay, az));
671
- const pos = Cx * ax + Cy * ay + Cz * az;
672
- // Relative anchor velocity along the axis (A−B), for LIMITED
673
- // bound selection. Cheap; only the projection is used.
674
- let vel = 0;
675
- if (m === DofMode.LIMITED) {
676
- relative_anchor_velocity(scratch_rv, ss, baseA, rAx, rAy, rAz, baseB, rBx, rBy, rBz, to_world);
677
- vel = scratch_rv[0] * ax + scratch_rv[1] * ay + scratch_rv[2] * az;
678
- }
679
- fill_row(joint, k, k, keff, pos, vel, spook_locked, spook_spec, dt_sub,
680
- lin_active, lin_eff, lin_bias, lin_clo, lin_chi, lin_gamma);
778
+ const o = p + PREP_ROWS + k * ROW_STRIDE;
779
+ pd[o + ROW_BIAS] = clamp_bias(spook_locked * (Cx * ax + Cy * ay + Cz * az));
681
780
  }
781
+ for (let i = 0; i < 6; i++) pd[p + PREP_K_INV + i] = lin_Kinv[i];
782
+ flags |= PREP_POINT_BLOCK | PREP_LINEAR_ROWS;
682
783
  }
683
- } else {
684
- lin_active[0] = lin_active[1] = lin_active[2] = 0;
685
784
  }
686
-
687
- // --- Angular DOF row setup (frame axes). Position along axis k is the
688
- // k-th component of the frame-local small-angle error vector `e`;
689
- // convention is B−A (impulse +to B / −to A). ---
690
- if (angConstrained) {
691
- // Frame B world rotation (identity for a world anchor → locks A's
692
- // frame to world axes).
693
- let qBx = 0, qBy = 0, qBz = 0, qBw = 1;
694
- if (!to_world) {
695
- const lbb = joint.localBasisB;
696
- quat3_multiply(scratch_q, 0, trB.rotation_x, trB.rotation_y, trB.rotation_z, trB.rotation_w, lbb[0], lbb[1], lbb[2], lbb[3]);
697
- qBx = scratch_q[0]; qBy = scratch_q[1]; qBz = scratch_q[2]; qBw = scratch_q[3];
698
- }
699
- // qD = conj(qA) ⊗ qB → the per-axis angular position in frame-A
700
- // coords. Two measures: the cheap small-angle rotation vector
701
- // (default — exact at the origin, fine for welds / hinges / modest
702
- // limits) or, when the joint opts into `swingTwist`, the swing-twist
703
- // decomposition (X = twist, Y/Z = swing) with *exact* angles, for
704
- // wide cone-twist range-of-motion (ragdoll shoulders) where the
705
- // small-angle measure under-reports.
706
- quat3_multiply(scratch_q, 0, -qAx, -qAy, -qAz, qAw, qBx, qBy, qBz, qBw);
707
- if (joint.swingTwist) {
708
- swing_twist_error(scratch_q[0], scratch_q[1], scratch_q[2], scratch_q[3], scratch_ang_err);
709
- } else {
710
- const es = scratch_q[3] < 0 ? -2 : 2;
711
- scratch_ang_err[0] = es * scratch_q[0];
712
- scratch_ang_err[1] = es * scratch_q[1];
713
- scratch_ang_err[2] = es * scratch_q[2];
714
- }
715
-
785
+ if ((flags & PREP_POINT_BLOCK) === 0) {
716
786
  for (let k = 0; k < 3; k++) {
717
- ang_active[k] = 0;
718
- const m = mode[3 + k];
719
- if (m === DofMode.FREE) { imp[3 + k] = 0; continue; }
787
+ const m = mode[k];
788
+ if (m === DofMode.FREE) { imp[k] = 0; continue; }
720
789
  const ax = fa[3 * k], ay = fa[3 * k + 1], az = fa[3 * k + 2];
721
- const keff = angular_axis_effective_mass(ss, baseA, ax, ay, az)
722
- + (to_world ? 0 : angular_axis_effective_mass(ss, baseB, ax, ay, az));
723
- const pos = scratch_ang_err[k];
724
- // Relative angular velocity about the axis (B−A), for LIMITED
725
- // bound selection.
726
- let vel = 0;
790
+ axis_effective_mass(keff, 0, ss, baseA, pd, rA, fa, 3 * k);
791
+ if (!to_world) axis_effective_mass(keff, 1, ss, baseB, pd, rB, fa, 3 * k);
792
+ dof[DOF_KEFF] = keff[0] + (to_world ? 0 : keff[1]);
793
+ dof[DOF_POS] = Cx * ax + Cy * ay + Cz * az;
794
+ // Relative anchor velocity along the axis (A−B), for LIMITED
795
+ // bound selection. Cheap; only the projection is used.
796
+ dof[DOF_VEL] = 0;
727
797
  if (m === DofMode.LIMITED) {
728
- vel = -(ss[baseA + SBS_AV_X] * ax + ss[baseA + SBS_AV_Y] * ay + ss[baseA + SBS_AV_Z] * az);
729
- if (!to_world) vel += ss[baseB + SBS_AV_X] * ax + ss[baseB + SBS_AV_Y] * ay + ss[baseB + SBS_AV_Z] * az;
798
+ relative_anchor_velocity(scratch_rv, ss, baseA, pd, rA, baseB, pd, rB, to_world);
799
+ dof[DOF_VEL] = scratch_rv[0] * ax + scratch_rv[1] * ay + scratch_rv[2] * az;
800
+ }
801
+ if (fill_row(joint, k, dof, spook_locked, spook_spec, dt_sub,
802
+ pd, p + PREP_ROWS + k * ROW_STRIDE)) {
803
+ flags |= PREP_ROW_ACTIVE << k;
804
+ if (m !== DofMode.LOCKED) flags |= PREP_ROW_RELAX << k;
730
805
  }
731
- fill_row(joint, 3 + k, k, keff, pos, vel, spook_locked, spook_spec, dt_sub,
732
- ang_active, ang_eff, ang_bias, ang_clo, ang_chi, ang_gamma);
733
806
  }
734
- } else {
735
- ang_active[0] = ang_active[1] = ang_active[2] = 0;
736
807
  }
808
+ }
737
809
 
738
- if (!lin_active[0] && !lin_active[1] && !lin_active[2]
739
- && !ang_active[0] && !ang_active[1] && !ang_active[2]) continue;
810
+ // --- Angular DOF row setup (frame axes). Position along axis k is the
811
+ // k-th component of the frame-local small-angle error vector `e`;
812
+ // convention is B−A (impulse +to B / −to A). ---
813
+ if (angConstrained) {
814
+ // Frame B world rotation (identity for a world anchor → locks A's
815
+ // frame to world axes), beside conj(qA).
816
+ const rel = scratch_rel;
817
+ rel[0] = -scratch_q[0]; rel[1] = -scratch_q[1]; rel[2] = -scratch_q[2]; rel[3] = scratch_q[3];
818
+ if (to_world) {
819
+ rel[4] = 0; rel[5] = 0; rel[6] = 0; rel[7] = 1;
820
+ } else {
821
+ quat3_multiply_array(rel, 4, trB, TRANSFORM64_ROTATION_OFFSET, joint.localBasisB, 0);
822
+ }
823
+ // qD = conj(qA) ⊗ qB → the per-axis angular position in frame-A
824
+ // coords. Two measures: the cheap small-angle rotation vector
825
+ // (default — exact at the origin, fine for welds / hinges / modest
826
+ // limits) or, when the joint opts into `swingTwist`, the swing-twist
827
+ // decomposition (X = twist, Y/Z = swing) with *exact* angles, for
828
+ // wide cone-twist range-of-motion (ragdoll shoulders) where the
829
+ // small-angle measure under-reports.
830
+ quat3_multiply_array(scratch_q, 0, rel, 0, rel, 4);
831
+ if (joint.swingTwist) {
832
+ swing_twist_error_array(scratch_q, 0, scratch_ang_err);
833
+ } else {
834
+ const es = scratch_q[3] < 0 ? -2 : 2;
835
+ scratch_ang_err[0] = es * scratch_q[0];
836
+ scratch_ang_err[1] = es * scratch_q[1];
837
+ scratch_ang_err[2] = es * scratch_q[2];
838
+ }
740
839
 
741
- // --- Per-substep warm-start (frame axes): linear impulse `Σ imp[k]·aₖ`
742
- // applied at the anchors, angular impulse `Σ imp[3+k]·aₖ` about the
743
- // frame axes (+to B / −to A). ---
744
- {
745
- let Px = 0, Py = 0, Pz = 0;
746
- for (let k = 0; k < 3; k++) {
747
- if (!lin_active[k]) continue;
748
- const w = imp[k];
749
- Px += w * fa[3 * k]; Py += w * fa[3 * k + 1]; Pz += w * fa[3 * k + 2];
750
- }
751
- if (Px !== 0 || Py !== 0 || Pz !== 0) {
752
- apply_impulse_to_body(ss, baseA, invMA, rAx, rAy, rAz, Px, Py, Pz, +1, scratch_inertia);
753
- if (!to_world) apply_impulse_to_body(ss, baseB, invMB, rBx, rBy, rBz, Px, Py, Pz, -1, scratch_inertia);
840
+ for (let k = 0; k < 3; k++) {
841
+ const m = mode[3 + k];
842
+ if (m === DofMode.FREE) { imp[3 + k] = 0; continue; }
843
+ const ax = fa[3 * k], ay = fa[3 * k + 1], az = fa[3 * k + 2];
844
+ angular_axis_effective_mass(keff, 0, ss, baseA, fa, 3 * k);
845
+ if (!to_world) angular_axis_effective_mass(keff, 1, ss, baseB, fa, 3 * k);
846
+ dof[DOF_KEFF] = keff[0] + (to_world ? 0 : keff[1]);
847
+ dof[DOF_POS] = scratch_ang_err[k];
848
+ // Relative angular velocity about the axis (B−A), for LIMITED
849
+ // bound selection.
850
+ let vel = 0;
851
+ if (m === DofMode.LIMITED) {
852
+ vel = -(ss[baseA + SBS_AV_X] * ax + ss[baseA + SBS_AV_Y] * ay + ss[baseA + SBS_AV_Z] * az);
853
+ if (!to_world) vel += ss[baseB + SBS_AV_X] * ax + ss[baseB + SBS_AV_Y] * ay + ss[baseB + SBS_AV_Z] * az;
754
854
  }
755
- let Lx = 0, Ly = 0, Lz = 0;
756
- for (let k = 0; k < 3; k++) {
757
- if (!ang_active[k]) continue;
758
- const w = imp[3 + k];
759
- Lx += w * fa[3 * k]; Ly += w * fa[3 * k + 1]; Lz += w * fa[3 * k + 2];
760
- }
761
- if (Lx !== 0 || Ly !== 0 || Lz !== 0) {
762
- if (!to_world) apply_angular_impulse(ss, baseB, Lx, Ly, Lz, 1, +1);
763
- apply_angular_impulse(ss, baseA, Lx, Ly, Lz, 1, -1);
855
+ dof[DOF_VEL] = vel;
856
+ if (fill_row(joint, 3 + k, dof, spook_locked, spook_spec, dt_sub,
857
+ pd, p + PREP_ROWS + (3 + k) * ROW_STRIDE)) {
858
+ flags |= PREP_ROW_ACTIVE << (3 + k);
859
+ if (m !== DofMode.LOCKED) flags |= PREP_ROW_RELAX << (3 + k);
764
860
  }
765
861
  }
862
+ }
766
863
 
767
- for (let it = 0; it < iters; it++) {
768
- // Linear rows (frame axes). The relative anchor velocity is
769
- // recomputed before each row so successive rows see the prior
770
- // impulses (Gauss-Seidel coupling).
771
- if (useLinBlock) {
772
- // A2: coupled 3×3 point solve — one relative anchor velocity,
773
- // projected onto the frame axes, solved against Kⁱⁿᵛ in a single
774
- // Newton step (bilateral, no clamp). The point constraint is
775
- // satisfied exactly each iteration; only its coupling with the
776
- // angular rows remains to iterate.
777
- relative_anchor_velocity(scratch_rv, ss, baseA, rAx, rAy, rAz, baseB, rBx, rBy, rBz, to_world);
778
- const rvx = scratch_rv[0], rvy = scratch_rv[1], rvz = scratch_rv[2];
779
- const a0x = fa[0], a0y = fa[1], a0z = fa[2];
780
- const a1x = fa[3], a1y = fa[4], a1z = fa[5];
781
- const a2x = fa[6], a2y = fa[7], a2z = fa[8];
782
- const b0 = rvx * a0x + rvy * a0y + rvz * a0z + lin_bias[0];
783
- const b1 = rvx * a1x + rvy * a1y + rvz * a1z + lin_bias[1];
784
- const b2 = rvx * a2x + rvy * a2y + rvz * a2z + lin_bias[2];
785
- const d0 = -(lin_Kinv[0] * b0 + lin_Kinv[1] * b1 + lin_Kinv[2] * b2);
786
- const d1 = -(lin_Kinv[1] * b0 + lin_Kinv[3] * b1 + lin_Kinv[4] * b2);
787
- const d2 = -(lin_Kinv[2] * b0 + lin_Kinv[4] * b1 + lin_Kinv[5] * b2);
788
- imp[0] += d0; imp[1] += d1; imp[2] += d2;
789
- const Px = d0 * a0x + d1 * a1x + d2 * a2x;
790
- const Py = d0 * a0y + d1 * a1y + d2 * a2y;
791
- const Pz = d0 * a0z + d1 * a1z + d2 * a2z;
792
- if (Px !== 0 || Py !== 0 || Pz !== 0) {
793
- apply_impulse_to_body(ss, baseA, invMA, rAx, rAy, rAz, Px, Py, Pz, +1, scratch_inertia);
794
- if (!to_world) apply_impulse_to_body(ss, baseB, invMB, rBx, rBy, rBz, Px, Py, Pz, -1, scratch_inertia);
795
- }
796
- } else {
797
- for (let k = 0; k < 3; k++) {
798
- if (!lin_active[k]) continue;
799
- const ax = fa[3 * k], ay = fa[3 * k + 1], az = fa[3 * k + 2];
800
- relative_anchor_velocity(scratch_rv, ss, baseA, rAx, rAy, rAz, baseB, rBx, rBy, rBz, to_world);
801
- const rvx = scratch_rv[0], rvy = scratch_rv[1], rvz = scratch_rv[2];
802
- const vrel = rvx * ax + rvy * ay + rvz * az;
803
- const old = imp[k];
804
- // `+ γ·old` regularises a spring row (γ = 0 otherwise → exact).
805
- let nv = old - lin_eff[k] * (vrel + lin_bias[k] + lin_gamma[k] * old);
806
- if (nv < lin_clo[k]) nv = lin_clo[k]; else if (nv > lin_chi[k]) nv = lin_chi[k];
807
- imp[k] = nv;
808
- const d = nv - old;
809
- if (d !== 0) {
810
- apply_impulse_to_body(ss, baseA, invMA, rAx, rAy, rAz, d * ax, d * ay, d * az, +1, scratch_inertia);
811
- if (!to_world) apply_impulse_to_body(ss, baseB, invMB, rBx, rBy, rBz, d * ax, d * ay, d * az, -1, scratch_inertia);
812
- }
813
- }
814
- }
864
+ if ((flags & PREP_ANY_ROW) === 0) return false;
815
865
 
816
- // Angular rows (frame axes): drive ωB−ωA about each axis toward the
817
- // bias target, clamped per the row's bound.
818
- for (let k = 0; k < 3; k++) {
819
- if (!ang_active[k]) continue;
820
- const ax = fa[3 * k], ay = fa[3 * k + 1], az = fa[3 * k + 2];
821
- let wrel = -(ss[baseA + SBS_AV_X] * ax + ss[baseA + SBS_AV_Y] * ay + ss[baseA + SBS_AV_Z] * az);
822
- if (!to_world) wrel += ss[baseB + SBS_AV_X] * ax + ss[baseB + SBS_AV_Y] * ay + ss[baseB + SBS_AV_Z] * az;
823
- const old = imp[3 + k];
824
- let nv = old - ang_eff[k] * (wrel + ang_bias[k] + ang_gamma[k] * old);
825
- if (nv < ang_clo[k]) nv = ang_clo[k]; else if (nv > ang_chi[k]) nv = ang_chi[k];
826
- imp[3 + k] = nv;
827
- const d = nv - old;
828
- if (d !== 0) {
829
- if (!to_world) apply_angular_impulse(ss, baseB, ax, ay, az, d, +1);
830
- apply_angular_impulse(ss, baseA, ax, ay, az, d, -1);
831
- }
866
+ for (let i = 0; i < 9; i++) pd[p + PREP_FRAME + i] = fa[i];
867
+ prep_body[2 * slot] = idxA;
868
+ prep_body[2 * slot + 1] = idxB;
869
+ prep_flags[slot] = flags | PREP_LIVE;
870
+ return true;
871
+ }
872
+
873
+ /**
874
+ * Per-substep warm-start of a prepared joint (frame axes): linear impulse
875
+ * `Σ imp[k]·aₖ` applied at the anchors, angular impulse `Σ imp[3+k]·aₖ` about
876
+ * the frame axes (+to B / −to A), over the active rows.
877
+ *
878
+ * @param {Float64Array} ss solver-body-state data
879
+ * @param {number} slot a live prepared slot
880
+ * @param {Float64Array} imp the joint's `dofImpulse`
881
+ */
882
+ function warm_start_joint(ss, slot, imp) {
883
+ const flags = prep_flags[slot];
884
+ const pd = prep_data;
885
+ const p = slot * PREP_STRIDE;
886
+ const f = p + PREP_FRAME;
887
+ const baseA = prep_body[2 * slot] * SBS_STRIDE, baseB = prep_body[2 * slot + 1] * SBS_STRIDE;
888
+ const to_world = (flags & PREP_TO_WORLD) !== 0;
889
+
890
+ let Px = 0, Py = 0, Pz = 0;
891
+ for (let k = 0; k < 3; k++) {
892
+ if ((flags & (PREP_ROW_ACTIVE << k)) === 0) continue;
893
+ const w = imp[k];
894
+ Px += w * pd[f + 3 * k]; Py += w * pd[f + 3 * k + 1]; Pz += w * pd[f + 3 * k + 2];
895
+ }
896
+ if (Px !== 0 || Py !== 0 || Pz !== 0) {
897
+ const impulse = scratch_impulse;
898
+ impulse[0] = Px; impulse[1] = Py; impulse[2] = Pz;
899
+ apply_impulse_to_body(ss, baseA, pd, p + PREP_R_A, impulse, 0, +1, scratch_inertia);
900
+ if (!to_world) apply_impulse_to_body(ss, baseB, pd, p + PREP_R_B, impulse, 0, -1, scratch_inertia);
901
+ }
902
+
903
+ let Lx = 0, Ly = 0, Lz = 0;
904
+ for (let k = 0; k < 3; k++) {
905
+ if ((flags & (PREP_ROW_ACTIVE << (3 + k))) === 0) continue;
906
+ const w = imp[3 + k];
907
+ Lx += w * pd[f + 3 * k]; Ly += w * pd[f + 3 * k + 1]; Lz += w * pd[f + 3 * k + 2];
908
+ }
909
+ if (Lx !== 0 || Ly !== 0 || Lz !== 0) {
910
+ const impulse = scratch_impulse;
911
+ impulse[0] = Lx; impulse[1] = Ly; impulse[2] = Lz;
912
+ if (!to_world) apply_angular_impulse(ss, baseB, impulse, 0, +1);
913
+ apply_angular_impulse(ss, baseA, impulse, 0, -1);
914
+ }
915
+ }
916
+
917
+ /**
918
+ * One Gauss-Seidel iteration of a prepared joint's rows against the current
919
+ * body velocities, accumulating into `imp`.
920
+ *
921
+ * @param {Float64Array} ss solver-body-state data
922
+ * @param {number} slot a live prepared slot
923
+ * @param {Float64Array} imp the joint's `dofImpulse`
924
+ * @param {boolean} relax false: every active row, against its bias (the
925
+ * biased passes); true: only the rows that relax, against their relax bias
926
+ * (never a LOCKED row, so never the point block)
927
+ */
928
+ function solve_joint_rows(ss, slot, imp, relax) {
929
+ const flags = prep_flags[slot];
930
+ const row_bit = relax ? PREP_ROW_RELAX : PREP_ROW_ACTIVE;
931
+ const bias_field = relax ? ROW_RELAX_BIAS : ROW_BIAS;
932
+ const pd = prep_data;
933
+ const p = slot * PREP_STRIDE;
934
+ const f = p + PREP_FRAME;
935
+ const rows = p + PREP_ROWS;
936
+ const baseA = prep_body[2 * slot] * SBS_STRIDE, baseB = prep_body[2 * slot + 1] * SBS_STRIDE;
937
+ const to_world = (flags & PREP_TO_WORLD) !== 0;
938
+ const rA = p + PREP_R_A, rB = p + PREP_R_B;
939
+
940
+ // Linear rows (frame axes). The relative anchor velocity is recomputed
941
+ // before each row so successive rows see the prior impulses (Gauss-Seidel
942
+ // coupling).
943
+ const block = (flags & PREP_POINT_BLOCK) !== 0;
944
+ if (block && !relax) {
945
+ // A2: coupled 3×3 point solve — one relative anchor velocity,
946
+ // projected onto the frame axes, solved against Kⁱⁿᵛ in a single
947
+ // Newton step (bilateral, no clamp). The point constraint is
948
+ // satisfied exactly each iteration; only its coupling with the
949
+ // angular rows (and the other joints) remains to iterate. LOCKED, so
950
+ // it sits out the relax.
951
+ relative_anchor_velocity(scratch_rv, ss, baseA, pd, rA, baseB, pd, rB, to_world);
952
+ const rvx = scratch_rv[0], rvy = scratch_rv[1], rvz = scratch_rv[2];
953
+ const a0x = pd[f], a0y = pd[f + 1], a0z = pd[f + 2];
954
+ const a1x = pd[f + 3], a1y = pd[f + 4], a1z = pd[f + 5];
955
+ const a2x = pd[f + 6], a2y = pd[f + 7], a2z = pd[f + 8];
956
+ const b0 = rvx * a0x + rvy * a0y + rvz * a0z + pd[rows + ROW_BIAS];
957
+ const b1 = rvx * a1x + rvy * a1y + rvz * a1z + pd[rows + ROW_STRIDE + ROW_BIAS];
958
+ const b2 = rvx * a2x + rvy * a2y + rvz * a2z + pd[rows + 2 * ROW_STRIDE + ROW_BIAS];
959
+ const ki = p + PREP_K_INV;
960
+ const d0 = -(pd[ki] * b0 + pd[ki + 1] * b1 + pd[ki + 2] * b2);
961
+ const d1 = -(pd[ki + 1] * b0 + pd[ki + 3] * b1 + pd[ki + 4] * b2);
962
+ const d2 = -(pd[ki + 2] * b0 + pd[ki + 4] * b1 + pd[ki + 5] * b2);
963
+ imp[0] += d0; imp[1] += d1; imp[2] += d2;
964
+ const Px = d0 * a0x + d1 * a1x + d2 * a2x;
965
+ const Py = d0 * a0y + d1 * a1y + d2 * a2y;
966
+ const Pz = d0 * a0z + d1 * a1z + d2 * a2z;
967
+ if (Px !== 0 || Py !== 0 || Pz !== 0) {
968
+ const impulse = scratch_impulse;
969
+ impulse[0] = Px; impulse[1] = Py; impulse[2] = Pz;
970
+ apply_impulse_to_body(ss, baseA, pd, rA, impulse, 0, +1, scratch_inertia);
971
+ if (!to_world) apply_impulse_to_body(ss, baseB, pd, rB, impulse, 0, -1, scratch_inertia);
972
+ }
973
+ } else if (!block) {
974
+ for (let k = 0; k < 3; k++) {
975
+ if ((flags & (row_bit << k)) === 0) continue;
976
+ const o = rows + k * ROW_STRIDE;
977
+ const ax = pd[f + 3 * k], ay = pd[f + 3 * k + 1], az = pd[f + 3 * k + 2];
978
+ relative_anchor_velocity(scratch_rv, ss, baseA, pd, rA, baseB, pd, rB, to_world);
979
+ const vrel = scratch_rv[0] * ax + scratch_rv[1] * ay + scratch_rv[2] * az;
980
+ const old = imp[k];
981
+ // `+ γ·old` regularises a spring row (γ = 0 otherwise → exact).
982
+ let nv = old - pd[o + ROW_EFF] * (vrel + pd[o + bias_field] + pd[o + ROW_GAMMA] * old);
983
+ if (nv < pd[o + ROW_CLAMP_LO]) nv = pd[o + ROW_CLAMP_LO]; else if (nv > pd[o + ROW_CLAMP_HI]) nv = pd[o + ROW_CLAMP_HI];
984
+ imp[k] = nv;
985
+ const d = nv - old;
986
+ if (d !== 0) {
987
+ const impulse = scratch_impulse;
988
+ impulse[0] = d * ax; impulse[1] = d * ay; impulse[2] = d * az;
989
+ apply_impulse_to_body(ss, baseA, pd, rA, impulse, 0, +1, scratch_inertia);
990
+ if (!to_world) apply_impulse_to_body(ss, baseB, pd, rB, impulse, 0, -1, scratch_inertia);
832
991
  }
833
992
  }
834
993
  }
994
+
995
+ // Angular rows (frame axes): drive ωB−ωA about each axis toward the bias
996
+ // target, clamped per the row's bound.
997
+ for (let k = 0; k < 3; k++) {
998
+ if ((flags & (row_bit << (3 + k))) === 0) continue;
999
+ const o = rows + (3 + k) * ROW_STRIDE;
1000
+ const ax = pd[f + 3 * k], ay = pd[f + 3 * k + 1], az = pd[f + 3 * k + 2];
1001
+ let wrel = -(ss[baseA + SBS_AV_X] * ax + ss[baseA + SBS_AV_Y] * ay + ss[baseA + SBS_AV_Z] * az);
1002
+ if (!to_world) wrel += ss[baseB + SBS_AV_X] * ax + ss[baseB + SBS_AV_Y] * ay + ss[baseB + SBS_AV_Z] * az;
1003
+ const old = imp[3 + k];
1004
+ let nv = old - pd[o + ROW_EFF] * (wrel + pd[o + bias_field] + pd[o + ROW_GAMMA] * old);
1005
+ if (nv < pd[o + ROW_CLAMP_LO]) nv = pd[o + ROW_CLAMP_LO]; else if (nv > pd[o + ROW_CLAMP_HI]) nv = pd[o + ROW_CLAMP_HI];
1006
+ imp[3 + k] = nv;
1007
+ const d = nv - old;
1008
+ if (d !== 0) {
1009
+ const impulse = scratch_impulse;
1010
+ impulse[0] = d * ax; impulse[1] = d * ay; impulse[2] = d * az;
1011
+ if (!to_world) apply_angular_impulse(ss, baseB, impulse, 0, +1);
1012
+ apply_angular_impulse(ss, baseA, impulse, 0, -1);
1013
+ }
1014
+ }
1015
+ }
1016
+
1017
+ /**
1018
+ * Solve every joint for one substep: prepare each joint's rows at the current
1019
+ * poses, then run `iters` Gauss-Seidel passes over all of them. The first pass
1020
+ * prepares, warm-starts and solves each joint in turn; passes 2..iters
1021
+ * re-solve every live joint from its prepared rows, in the same order. The
1022
+ * prepared rows stay for this substep's {@link relax_joints}.
1023
+ *
1024
+ * The warm start stays inside the first pass, interleaved with the solve, on
1025
+ * purpose: replaying every joint's impulse before solving any (Box3D's order)
1026
+ * is unstable on these hard Baumgarte rows — measured, a hanging 10-link
1027
+ * chain at one pass opens by ~99 m, and a hanging 20-link chain at eight
1028
+ * passes diverges from rest. Box3D gets away with it on soft rows.
1029
+ *
1030
+ * Called once per substep from `PhysicsSystem.fixedUpdate`, after the contact
1031
+ * solve so the two share the substep / warm-start cadence.
1032
+ *
1033
+ * @param {Joint[]} joints live joints in solve order (holes skipped)
1034
+ * @param {PhysicsSystem} system reads `__bodies` / `__transforms` / index map
1035
+ * @param {number} dt_sub substep size in seconds (the SPOOK gain is derived
1036
+ * from it, matching the contact solver's per-substep position stiffness)
1037
+ * @param {number} iters passes over the joint set. 0 turns the joints off for
1038
+ * the substep: nothing is prepared, warm-started or solved, and so nothing
1039
+ * is relaxed either — the solver leaves the jointed bodies' velocities alone.
1040
+ * @param {boolean} [reverse] A2: sweep the joint array tip→root this substep
1041
+ * (the caller alternates it per substep for a symmetric Gauss-Seidel sweep,
1042
+ * so chain impulses propagate both ways). Default false ⇒ root→tip.
1043
+ */
1044
+ export function solve_joints(joints, system, dt_sub, iters, reverse) {
1045
+ const n = joints.length;
1046
+ prep_count = 0;
1047
+ if (n === 0 || dt_sub <= 0 || iters <= 0) return;
1048
+
1049
+ ensure_prep_capacity(n);
1050
+ prep_count = n;
1051
+
1052
+ const spook_locked = JOINT_BAUMGARTE / dt_sub;
1053
+ const spook_spec = 1 / dt_sub;
1054
+
1055
+ const ss = system.__solver_state.data;
1056
+
1057
+ for (let jj = 0; jj < n; jj++) {
1058
+ const slot = reverse ? (n - 1 - jj) : jj;
1059
+ const joint = joints[slot];
1060
+ if (!prepare_joint(slot, joint, system, ss, dt_sub, spook_locked, spook_spec)) continue;
1061
+ warm_start_joint(ss, slot, joint.dofImpulse);
1062
+ solve_joint_rows(ss, slot, joint.dofImpulse, false);
1063
+ }
1064
+
1065
+ for (let it = 1; it < iters; it++) {
1066
+ for (let jj = 0; jj < n; jj++) {
1067
+ const slot = reverse ? (n - 1 - jj) : jj;
1068
+ if ((prep_flags[slot] & PREP_LIVE) === 0) continue;
1069
+ solve_joint_rows(ss, slot, joints[slot].dofImpulse, false);
1070
+ }
1071
+ }
1072
+ }
1073
+
1074
+ /**
1075
+ * The relax pass: one more sweep over the joints the last
1076
+ * {@link solve_joints} prepared, re-solving their LIMITED, MOTOR and SPRING
1077
+ * rows against the relax bias — the velocity target without the position
1078
+ * correction (see the module doc) — from the prepared rows. Called once per
1079
+ * substep from `PhysicsSystem.fixedUpdate`, after the position integrate,
1080
+ * with the joints and sweep direction of that substep's solve.
1081
+ *
1082
+ * LOCKED rows sit it out, where Box3D relaxes every row. Its rows are soft;
1083
+ * on these hard Baumgarte rows relaxing the LOCKED ones as well widened the
1084
+ * ragdoll drop's settle tail. Per-twin settled limb speed, median / 94th
1085
+ * percentile over 401 twins: 0.31 / 1.65 m/s with this relax, 0.27 / 3.55
1086
+ * with none, 0.49 / 5.6 relaxing every row. Re-deriving the lever arms at the
1087
+ * integrated pose while keeping the prepared K⁻¹ and frame made the full relax
1088
+ * worse still, 4.2 / 7.9 (101 twins). LOCKED rows need no relax: the next
1089
+ * substep's biased solve sets their velocity outright.
1090
+ *
1091
+ * @param {Joint[]} joints the array the last solve_joints was given
1092
+ * @param {PhysicsSystem} system reads `__solver_state`
1093
+ * @param {boolean} [reverse] the sweep direction of that solve
1094
+ */
1095
+ export function relax_joints(joints, system, reverse) {
1096
+ const n = prep_count;
1097
+ if (n === 0) return;
1098
+
1099
+ assert.equal(joints.length, n, 'relax_joints: not the joints the last solve_joints prepared');
1100
+
1101
+ const ss = system.__solver_state.data;
1102
+
1103
+ for (let jj = 0; jj < n; jj++) {
1104
+ const slot = reverse ? (n - 1 - jj) : jj;
1105
+ const flags = prep_flags[slot];
1106
+ if ((flags & PREP_LIVE) === 0 || (flags & PREP_ANY_RELAX) === 0) continue;
1107
+ solve_joint_rows(ss, slot, joints[slot].dofImpulse, true);
1108
+ }
835
1109
  }