@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.
- package/build/bundle-worker-image-decoder.js +1 -1
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/core/binary/BinaryBuffer.d.ts +11 -0
- package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
- package/src/core/binary/BinaryBuffer.js +30 -0
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_aabb.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_aabb.js +28 -7
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts +15 -0
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +41 -0
- package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.d.ts +12 -0
- package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.js +27 -0
- package/src/core/geom/3d/gjk/gjk.js +3 -3
- package/src/core/geom/3d/gjk/gjk_distance.d.ts +94 -0
- package/src/core/geom/3d/gjk/gjk_distance.d.ts.map +1 -0
- package/src/core/geom/3d/gjk/gjk_distance.js +782 -0
- package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts +5 -4
- package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -1
- package/src/core/geom/3d/gjk/gjk_epa_penetration.js +14 -9
- package/src/core/geom/3d/gjk/minkowski_support.d.ts +11 -7
- package/src/core/geom/3d/gjk/minkowski_support.d.ts.map +1 -1
- package/src/core/geom/3d/gjk/minkowski_support.js +33 -9
- package/src/core/geom/3d/gjk/mpr.d.ts.map +1 -1
- package/src/core/geom/3d/gjk/mpr.js +26 -5
- package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.d.ts +15 -0
- package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.d.ts.map +1 -1
- package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.js +106 -33
- package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.d.ts +2 -1
- package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.d.ts.map +1 -1
- package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.js +4 -8
- package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_array.d.ts +32 -0
- package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_array.d.ts.map +1 -0
- package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_array.js +85 -0
- package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.d.ts +3 -3
- package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.d.ts.map +1 -1
- package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.js +24 -34
- package/src/core/geom/3d/quaternion/quat3_integrate.d.ts +17 -0
- package/src/core/geom/3d/quaternion/quat3_integrate.d.ts.map +1 -1
- package/src/core/geom/3d/quaternion/quat3_integrate.js +45 -4
- package/src/core/geom/3d/quaternion/quat3_multiply.d.ts +16 -0
- package/src/core/geom/3d/quaternion/quat3_multiply.d.ts.map +1 -1
- package/src/core/geom/3d/quaternion/quat3_multiply.js +25 -0
- package/src/core/geom/3d/quaternion/quat3_nlerp.d.ts +18 -0
- package/src/core/geom/3d/quaternion/quat3_nlerp.d.ts.map +1 -1
- package/src/core/geom/3d/quaternion/quat3_nlerp.js +45 -0
- package/src/core/geom/3d/quaternion/quat3_shortest_arc.d.ts +17 -0
- package/src/core/geom/3d/quaternion/quat3_shortest_arc.d.ts.map +1 -1
- package/src/core/geom/3d/quaternion/quat3_shortest_arc.js +155 -94
- package/src/core/geom/3d/quaternion/quat3_to_matrix3.d.ts +12 -0
- package/src/core/geom/3d/quaternion/quat3_to_matrix3.d.ts.map +1 -1
- package/src/core/geom/3d/quaternion/quat3_to_matrix3.js +31 -0
- package/src/core/geom/3d/shape/AbstractShape3D.d.ts +20 -6
- package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/AbstractShape3D.js +20 -6
- package/src/core/geom/3d/shape/BoxShape3D.d.ts +1 -1
- package/src/core/geom/3d/shape/BoxShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/BoxShape3D.js +5 -1
- package/src/core/geom/3d/shape/CapsuleShape3D.d.ts +1 -1
- package/src/core/geom/3d/shape/CapsuleShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/CapsuleShape3D.js +5 -1
- package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts +25 -11
- package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/ConvexHullShape3D.js +392 -22
- package/src/core/geom/3d/shape/CylinderShape3D.d.ts +8 -7
- package/src/core/geom/3d/shape/CylinderShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/CylinderShape3D.js +12 -7
- package/src/core/geom/3d/shape/HeightMapShape3D.d.ts +51 -8
- package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/HeightMapShape3D.js +260 -14
- package/src/core/geom/3d/shape/MeshShape3D.d.ts +61 -7
- package/src/core/geom/3d/shape/MeshShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/MeshShape3D.js +111 -20
- package/src/core/geom/3d/shape/PointShape3D.d.ts +1 -1
- package/src/core/geom/3d/shape/PointShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/PointShape3D.js +1 -1
- package/src/core/geom/3d/shape/PosedShape3D.d.ts +9 -0
- package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/PosedShape3D.js +36 -6
- package/src/core/geom/3d/shape/SphereShape3D.d.ts +1 -1
- package/src/core/geom/3d/shape/SphereShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/SphereShape3D.js +5 -1
- package/src/core/geom/3d/shape/TransformedShape3D.d.ts +12 -10
- package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/TransformedShape3D.js +53 -19
- package/src/core/geom/3d/shape/Triangle3D.d.ts +1 -1
- package/src/core/geom/3d/shape/Triangle3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/Triangle3D.js +5 -1
- package/src/core/geom/3d/shape/UnionShape3D.d.ts +1 -1
- package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/UnionShape3D.js +19 -2
- package/src/core/geom/3d/shape/sdf/sdf3_box.d.ts +14 -0
- package/src/core/geom/3d/shape/sdf/sdf3_box.d.ts.map +1 -1
- package/src/core/geom/3d/shape/sdf/sdf3_box.js +67 -5
- package/src/core/geom/3d/shape/sdf/sdf3_capsule.d.ts +14 -0
- package/src/core/geom/3d/shape/sdf/sdf3_capsule.d.ts.map +1 -1
- package/src/core/geom/3d/shape/sdf/sdf3_capsule.js +61 -3
- package/src/core/geom/3d/shape/sdf/sdf3_cylinder.d.ts +14 -0
- package/src/core/geom/3d/shape/sdf/sdf3_cylinder.d.ts.map +1 -1
- package/src/core/geom/3d/shape/sdf/sdf3_cylinder.js +63 -4
- package/src/core/geom/3d/shape/sdf/sdf3_plane.d.ts +15 -0
- package/src/core/geom/3d/shape/sdf/sdf3_plane.d.ts.map +1 -1
- package/src/core/geom/3d/shape/sdf/sdf3_plane.js +64 -2
- package/src/core/geom/3d/shape/sdf/sdf3_sphere.d.ts +21 -0
- package/src/core/geom/3d/shape/sdf/sdf3_sphere.d.ts.map +1 -1
- package/src/core/geom/3d/shape/sdf/sdf3_sphere.js +66 -3
- package/src/core/geom/3d/shape/shape3_mesh_from_geometry.d.ts +2 -0
- package/src/core/geom/3d/shape/shape3_mesh_from_geometry.d.ts.map +1 -1
- package/src/core/geom/3d/shape/shape3_mesh_from_geometry.js +7 -0
- package/src/core/geom/3d/shape/util/mesh_compute_triangle_edge_flags.d.ts +41 -0
- package/src/core/geom/3d/shape/util/mesh_compute_triangle_edge_flags.d.ts.map +1 -0
- package/src/core/geom/3d/shape/util/mesh_compute_triangle_edge_flags.js +538 -0
- package/src/core/geom/3d/sphere/harmonics/sh_basis_at.d.ts +31 -0
- package/src/core/geom/3d/sphere/harmonics/sh_basis_at.d.ts.map +1 -0
- package/src/core/geom/3d/sphere/harmonics/sh_basis_at.js +85 -0
- package/src/core/geom/3d/sphere/harmonics/sh_vmf_window.d.ts +18 -0
- package/src/core/geom/3d/sphere/harmonics/sh_vmf_window.d.ts.map +1 -0
- package/src/core/geom/3d/sphere/harmonics/sh_vmf_window.js +19 -0
- package/src/core/geom/3d/triangle/TriangleEdgeFlags.d.ts +49 -0
- package/src/core/geom/3d/triangle/TriangleEdgeFlags.d.ts.map +1 -0
- package/src/core/geom/3d/triangle/TriangleEdgeFlags.js +55 -0
- package/src/core/geom/3d/triangle/tri3_classify_shared_edge.d.ts +42 -0
- package/src/core/geom/3d/triangle/tri3_classify_shared_edge.d.ts.map +1 -0
- package/src/core/geom/3d/triangle/tri3_classify_shared_edge.js +85 -0
- package/src/core/geom/3d/triangle/tri3_closest_point.d.ts +13 -0
- package/src/core/geom/3d/triangle/tri3_closest_point.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/tri3_closest_point.js +36 -1
- package/src/core/geom/3d/triangle/tri3_closest_point_barycentric.d.ts +14 -0
- package/src/core/geom/3d/triangle/tri3_closest_point_barycentric.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/tri3_closest_point_barycentric.js +40 -0
- package/src/core/geom/vec3/v3_quaternion_apply.d.ts +19 -0
- package/src/core/geom/vec3/v3_quaternion_apply.d.ts.map +1 -1
- package/src/core/geom/vec3/v3_quaternion_apply.js +32 -0
- package/src/core/geom/vec3/v3_quaternion_apply_inverse.d.ts +19 -0
- package/src/core/geom/vec3/v3_quaternion_apply_inverse.d.ts.map +1 -1
- package/src/core/geom/vec3/v3_quaternion_apply_inverse.js +32 -0
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +17 -4
- package/src/engine/asset/loaders/image/avif/threaded_image_encoder.js +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +135 -10
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +338 -105
- package/src/engine/control/first-person/abilities/Ability.d.ts +14 -5
- package/src/engine/control/first-person/abilities/Ability.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/Ability.js +14 -5
- package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/LedgeGrab.js +16 -12
- package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/Mantle.js +5 -1
- package/src/engine/control/first-person/abilities/Slide.js +1 -1
- package/src/engine/control/first-person/collision/KinematicMover.d.ts +92 -14
- package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
- package/src/engine/control/first-person/collision/KinematicMover.js +218 -37
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts +5 -0
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +17 -10
- package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
- package/src/engine/ecs/EntityComponentDataset.js +27 -13
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +8 -0
- package/src/engine/ecs/transform/Transform64.d.ts +4 -2
- package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
- package/src/engine/ecs/transform/Transform64.js +10 -16
- package/src/engine/graphics/ecs/water/Water.d.ts +31 -72
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +59 -84
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +11 -49
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.d.ts +1 -1
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.js +27 -18
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_2_3.d.ts +12 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_2_3.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_2_3.js +45 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts +6 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.js +10 -0
- package/src/engine/graphics/ecs/water/WaterWaves.d.ts +33 -0
- package/src/engine/graphics/ecs/water/WaterWaves.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterWaves.js +46 -0
- package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.d.ts +17 -0
- package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.js +26 -0
- package/src/engine/graphics/texture/3d/scs3d_sample_linear.d.ts +22 -0
- package/src/engine/graphics/texture/3d/scs3d_sample_linear.d.ts.map +1 -1
- package/src/engine/graphics/texture/3d/scs3d_sample_linear.js +43 -1
- package/src/engine/graphics/texture/sampler/Sampler2D.d.ts +29 -3
- package/src/engine/graphics/texture/sampler/Sampler2D.d.ts.map +1 -1
- package/src/engine/graphics/texture/sampler/Sampler2D.js +102 -14
- package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -1
- package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +8 -5
- package/src/engine/graphics3/WaterSystem.d.ts +31 -48
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +177 -261
- package/src/engine/interpolation/BinaryInterpolationAdapter.d.ts +10 -4
- package/src/engine/interpolation/BinaryInterpolationAdapter.d.ts.map +1 -1
- package/src/engine/interpolation/BinaryInterpolationAdapter.js +11 -5
- package/src/engine/interpolation/InterpolationLog.d.ts +11 -5
- package/src/engine/interpolation/InterpolationLog.d.ts.map +1 -1
- package/src/engine/interpolation/InterpolationLog.js +12 -6
- package/src/engine/interpolation/InterpolationSystem.d.ts.map +1 -1
- package/src/engine/interpolation/InterpolationSystem.js +39 -8
- package/src/engine/interpolation/PoseInterpolationAdapter.d.ts +1 -1
- package/src/engine/interpolation/PoseInterpolationAdapter.d.ts.map +1 -1
- package/src/engine/interpolation/PoseInterpolationAdapter.js +51 -22
- package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
- package/src/engine/interpolation/TransformPoseSerializationAdapter.js +18 -23
- package/src/engine/network/adapters/QuaternionInterpolationAdapter.d.ts +1 -1
- package/src/engine/network/adapters/QuaternionInterpolationAdapter.d.ts.map +1 -1
- package/src/engine/network/adapters/QuaternionInterpolationAdapter.js +3 -1
- package/src/engine/network/adapters/TransformInterpolationAdapter.d.ts +1 -1
- package/src/engine/network/adapters/TransformInterpolationAdapter.d.ts.map +1 -1
- package/src/engine/network/adapters/TransformInterpolationAdapter.js +3 -1
- package/src/engine/network/adapters/Vector3InterpolationAdapter.d.ts.map +1 -1
- package/src/engine/network/adapters/Vector3InterpolationAdapter.js +5 -2
- package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
- package/src/engine/physics/body/SolverBodyState.js +4 -5
- package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +12 -0
- package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
- package/src/engine/physics/broadphase/compute_fat_world_aabb.js +28 -3
- package/src/engine/physics/ccd/linear_sweep.d.ts +42 -12
- package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
- package/src/engine/physics/ccd/linear_sweep.js +1131 -97
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +13 -0
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/ClothColliderIndex.js +90 -22
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +84 -24
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +46 -3
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +116 -68
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +59 -47
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +62 -55
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +46 -39
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back.js +41 -36
- package/src/engine/physics/cloth/playground/garment_build.js +6 -6
- package/src/engine/physics/cloth/playground/garment_main.js +18 -14
- package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_contact_find.js +8 -5
- package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +8 -5
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +15 -15
- package/src/engine/physics/cloth/solver/find_non_finite_cloth_state.d.ts +5 -0
- package/src/engine/physics/cloth/solver/find_non_finite_cloth_state.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/find_non_finite_cloth_state.js +32 -9
- package/src/engine/physics/constraint/solve_constraints.d.ts +50 -8
- package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
- package/src/engine/physics/constraint/solve_constraints.js +703 -429
- package/src/engine/physics/contact/ManifoldStore.d.ts +12 -0
- package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -1
- package/src/engine/physics/contact/ManifoldStore.js +32 -0
- package/src/engine/physics/ecs/BodyKind.d.ts +16 -8
- package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -1
- package/src/engine/physics/ecs/BodyKind.js +16 -8
- package/src/engine/physics/ecs/Collider.d.ts +7 -2
- package/src/engine/physics/ecs/Collider.d.ts.map +1 -1
- package/src/engine/physics/ecs/Collider.js +7 -2
- package/src/engine/physics/ecs/PhysicsEvents.d.ts +13 -0
- package/src/engine/physics/ecs/PhysicsEvents.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsEvents.js +13 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +320 -36
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +779 -81
- package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
- package/src/engine/physics/fluid/FluidField.js +5 -1
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +11 -9
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +7 -5
- package/src/engine/physics/fluid/ecs/fluid_reanchor_field.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/fluid_reanchor_field.js +9 -7
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +3 -4
- package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/WakeFluidEffector.js +9 -7
- package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.js +65 -43
- package/src/engine/physics/inertia/MASS_PROPERTIES_SIZE.d.ts +23 -0
- package/src/engine/physics/inertia/MASS_PROPERTIES_SIZE.d.ts.map +1 -0
- package/src/engine/physics/inertia/MASS_PROPERTIES_SIZE.js +22 -0
- package/src/engine/physics/inertia/convex_hull_mass_properties.d.ts +29 -0
- package/src/engine/physics/inertia/convex_hull_mass_properties.d.ts.map +1 -0
- package/src/engine/physics/inertia/convex_hull_mass_properties.js +117 -0
- package/src/engine/physics/inertia/mass_properties_accumulate.d.ts +24 -0
- package/src/engine/physics/inertia/mass_properties_accumulate.d.ts.map +1 -0
- package/src/engine/physics/inertia/mass_properties_accumulate.js +93 -0
- package/src/engine/physics/inertia/primitive_mass_properties.d.ts +46 -0
- package/src/engine/physics/inertia/primitive_mass_properties.d.ts.map +1 -0
- package/src/engine/physics/inertia/primitive_mass_properties.js +118 -0
- package/src/engine/physics/inertia/rigid_body_set_mass_properties.d.ts +27 -0
- package/src/engine/physics/inertia/rigid_body_set_mass_properties.d.ts.map +1 -0
- package/src/engine/physics/inertia/rigid_body_set_mass_properties.js +62 -0
- package/src/engine/physics/inertia/world_inverse_inertia.d.ts +67 -25
- package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -1
- package/src/engine/physics/inertia/world_inverse_inertia.js +149 -26
- package/src/engine/physics/integration/integrate_position.d.ts +18 -19
- package/src/engine/physics/integration/integrate_position.d.ts.map +1 -1
- package/src/engine/physics/integration/integrate_position.js +40 -37
- package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
- package/src/engine/physics/integration/integrate_velocity.js +13 -4
- package/src/engine/physics/island/IslandBuilder.d.ts +124 -6
- package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -1
- package/src/engine/physics/island/IslandBuilder.js +322 -19
- package/src/engine/physics/narrowphase/box_box_manifold.d.ts +13 -0
- package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/box_box_manifold.js +95 -39
- package/src/engine/physics/narrowphase/box_triangle_contact.d.ts +40 -0
- package/src/engine/physics/narrowphase/box_triangle_contact.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/box_triangle_contact.js +415 -120
- package/src/engine/physics/narrowphase/capsule_contacts.d.ts +63 -0
- package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/capsule_contacts.js +234 -46
- package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts +13 -0
- package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/capsule_triangle_contact.js +141 -93
- package/src/engine/physics/narrowphase/compute_penetration.d.ts +29 -11
- package/src/engine/physics/narrowphase/compute_penetration.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/compute_penetration.js +157 -34
- package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts +76 -0
- package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/convex_convex_manifold.js +243 -48
- package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.d.ts +13 -0
- package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.js +28 -12
- package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts +13 -0
- package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.js +27 -0
- package/src/engine/physics/narrowphase/decomposition/heightmap_triangle_edge_flags.d.ts +42 -0
- package/src/engine/physics/narrowphase/decomposition/heightmap_triangle_edge_flags.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/decomposition/heightmap_triangle_edge_flags.js +250 -0
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts +27 -11
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +291 -12
- package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.d.ts +7 -1
- package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.js +7 -1
- package/src/engine/physics/narrowphase/decomposition/triangle_edge_flags.d.ts +35 -0
- package/src/engine/physics/narrowphase/decomposition/triangle_edge_flags.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/decomposition/triangle_edge_flags.js +61 -0
- package/src/engine/physics/narrowphase/hull_sphere_contact.d.ts +54 -0
- package/src/engine/physics/narrowphase/hull_sphere_contact.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/hull_sphere_contact.js +244 -0
- package/src/engine/physics/narrowphase/mesh_convex_hull.js +5 -1
- package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.d.ts +2 -0
- package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +56 -31
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts +6 -5
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/narrowphase_step.js +2185 -483
- package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts +56 -5
- package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/reduce_manifold_contacts.js +546 -5
- package/src/engine/physics/narrowphase/refine_ray_concave.d.ts +29 -2
- package/src/engine/physics/narrowphase/refine_ray_concave.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/refine_ray_concave.js +628 -75
- package/src/engine/physics/narrowphase/refine_ray_hit.d.ts +3 -2
- package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/refine_ray_hit.js +3 -2
- package/src/engine/physics/narrowphase/rigid_subject_pose.d.ts +27 -0
- package/src/engine/physics/narrowphase/rigid_subject_pose.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/rigid_subject_pose.js +96 -0
- package/src/engine/physics/narrowphase/sphere_box_contact.d.ts +14 -0
- package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/sphere_box_contact.js +51 -5
- package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts +12 -0
- package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/sphere_sphere_contact.js +30 -0
- package/src/engine/physics/narrowphase/sphere_triangle_contact.d.ts +12 -0
- package/src/engine/physics/narrowphase/sphere_triangle_contact.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/sphere_triangle_contact.js +37 -8
- package/src/engine/physics/narrowphase/support_feature_manifold.d.ts +139 -0
- package/src/engine/physics/narrowphase/support_feature_manifold.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/support_feature_manifold.js +949 -0
- package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts +32 -13
- package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts.map +1 -1
- package/src/engine/physics/queries/PhysicsSurfacePoint.js +36 -13
- package/src/engine/physics/queries/convex_overlaps_shape.d.ts +27 -0
- package/src/engine/physics/queries/convex_overlaps_shape.d.ts.map +1 -0
- package/src/engine/physics/queries/convex_overlaps_shape.js +169 -0
- package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
- package/src/engine/physics/queries/overlap_shape.js +57 -79
- package/src/engine/physics/queries/raycast.d.ts +10 -4
- package/src/engine/physics/queries/raycast.d.ts.map +1 -1
- package/src/engine/physics/queries/raycast.js +133 -9
- package/src/engine/physics/queries/shape_cast.d.ts +55 -24
- package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
- package/src/engine/physics/queries/shape_cast.js +2061 -245
- package/src/engine/physics/solver/apply_impulse_to_body.d.ts +32 -10
- package/src/engine/physics/solver/apply_impulse_to_body.d.ts.map +1 -1
- package/src/engine/physics/solver/apply_impulse_to_body.js +69 -28
- package/src/engine/physics/solver/solve_contacts.d.ts +65 -18
- package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -1
- package/src/engine/physics/solver/solve_contacts.js +458 -234
- package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
- package/src/engine/physics/vehicle/RaycastVehicle.js +5 -6
- package/src/format/image/avif/api/convert_to_rgba.d.ts +2 -2
- package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
- package/src/format/image/avif/api/convert_to_rgba.js +10 -9
- package/src/format/image/avif/api/decode_avif.d.ts +2 -2
- package/src/format/image/avif/api/decode_avif.d.ts.map +1 -1
- package/src/format/image/avif/api/decode_avif.js +1 -1
- package/src/shade/assets/textures/split_sum.bin +0 -0
- package/src/shade/device/mock/SoftwareGPUQueue.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUQueue.js +2 -1
- package/src/shade/playground/path_traced_media/README.md +78 -0
- package/src/shade/playground/path_traced_media/capture_radiance.d.ts +33 -0
- package/src/shade/playground/path_traced_media/capture_radiance.d.ts.map +1 -0
- package/src/shade/playground/path_traced_media/capture_radiance.js +174 -0
- package/src/shade/playground/path_traced_media/checks.d.ts +160 -0
- package/src/shade/playground/path_traced_media/checks.d.ts.map +1 -0
- package/src/shade/playground/path_traced_media/checks.js +921 -0
- package/src/shade/playground/path_traced_media/index.html +71 -0
- package/src/shade/playground/path_traced_media/main.d.ts +2 -0
- package/src/shade/playground/path_traced_media/main.d.ts.map +1 -0
- package/src/shade/playground/path_traced_media/main.js +440 -0
- package/src/shade/playground/path_traced_media/make_wave_pool_geometry.d.ts +26 -0
- package/src/shade/playground/path_traced_media/make_wave_pool_geometry.d.ts.map +1 -0
- package/src/shade/playground/path_traced_media/make_wave_pool_geometry.js +117 -0
- package/src/shade/playground/path_traced_media/views.d.ts +21 -0
- package/src/shade/playground/path_traced_media/views.d.ts.map +1 -0
- package/src/shade/playground/path_traced_media/views.js +161 -0
- package/src/shade/playground/sh_exponential/README.md +43 -0
- package/src/shade/playground/sh_exponential/index.html +59 -0
- package/src/shade/playground/sh_exponential/main.d.ts +2 -0
- package/src/shade/playground/sh_exponential/main.d.ts.map +1 -0
- package/src/shade/playground/sh_exponential/main.js +571 -0
- package/src/shade/playground/sh_exponential/sh_exp_playground_shaders.d.ts +46 -0
- package/src/shade/playground/sh_exponential/sh_exp_playground_shaders.d.ts.map +1 -0
- package/src/shade/playground/sh_exponential/sh_exp_playground_shaders.js +270 -0
- package/src/shade/playground/ssr_reprojection/README.md +111 -103
- package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -68
- package/src/shade/playground/ssr_reprojection/index.html +80 -79
- package/src/shade/playground/ssr_reprojection/main.js +256 -247
- package/src/shade/playground/ssr_variance/capture.js +96 -96
- package/src/shade/playground/ssr_variance/reference.js +78 -78
- package/src/shade/playground/vsm/README.md +96 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.d.ts +49 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.js +351 -0
- package/src/shade/playground/vsm/clipmap_panel.d.ts +8 -0
- package/src/shade/playground/vsm/clipmap_panel.d.ts.map +1 -0
- package/src/shade/playground/vsm/clipmap_panel.js +138 -0
- package/src/shade/playground/vsm/index.html +170 -0
- package/src/shade/playground/vsm/main.d.ts +2 -0
- package/src/shade/playground/vsm/main.d.ts.map +1 -0
- package/src/shade/playground/vsm/main.js +389 -0
- package/src/shade/playground/vsm/scenes.d.ts +52 -0
- package/src/shade/playground/vsm/scenes.d.ts.map +1 -0
- package/src/shade/playground/vsm/scenes.js +320 -0
- package/src/shade/playground/vsm/verify_vsm.d.ts +38 -0
- package/src/shade/playground/vsm/verify_vsm.d.ts.map +1 -0
- package/src/shade/playground/vsm/verify_vsm.js +305 -0
- package/src/shade/playground/water_refraction/README.md +76 -19
- package/src/shade/playground/water_refraction/index.html +6 -8
- package/src/shade/playground/water_refraction/main.js +22 -12
- package/src/shade/playground/water_refraction/world.d.ts +3 -0
- package/src/shade/playground/water_refraction/world.d.ts.map +1 -1
- package/src/shade/playground/water_refraction/world.js +19 -5
- package/src/shade/renderer/Renderer.d.ts +21 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +95 -1
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +8 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +18 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +7 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -0
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +10 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.js +28 -0
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.js +31 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +9 -1
- package/src/shade/renderer/geometry/MeshletGeometry.d.ts +3 -0
- package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/MeshletGeometry.js +1 -0
- package/src/shade/renderer/geometry/sdf/chunk_scene_point_query_volume_sign.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/chunk_scene_point_query_volume_sign.js +6 -4
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_rand1.d.ts +7 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_rand1.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_rand1.js +12 -12
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_spherical.d.ts +4 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_spherical.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/sampling/chunk_direction_by_index_spherical.js +13 -9
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +2 -0
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +3 -0
- package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.js +4 -9
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +79 -11
- package/src/shade/renderer/light/environment/rgbe/load_environment_map.d.ts +2 -1
- package/src/shade/renderer/light/environment/rgbe/load_environment_map.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/rgbe/load_environment_map.js +2 -1
- package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
- package/src/shade/renderer/light/environment/rgbe/parse_rgbe.js +2 -2
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts +2 -2
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js +6 -14
- package/src/shade/renderer/light/environment/sh_exponential/README.md +171 -0
- package/src/shade/renderer/light/environment/sh_exponential/SHExpEncoder.d.ts +170 -0
- package/src/shade/renderer/light/environment/sh_exponential/SHExpEncoder.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/SHExpEncoder.js +377 -0
- package/src/shade/renderer/light/environment/sh_exponential/SH_EXP_ENCODE_PARAMETERS_STRUCT.d.ts +16 -0
- package/src/shade/renderer/light/environment/sh_exponential/SH_EXP_ENCODE_PARAMETERS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/SH_EXP_ENCODE_PARAMETERS_STRUCT.js +27 -0
- package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts +21 -0
- package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js +57 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_design_row.d.ts +33 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_design_row.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_design_row.js +90 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_fit_samples.d.ts +28 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_fit_samples.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_fit_samples.js +92 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_layout.d.ts +39 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_layout.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_layout.js +44 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_solve_matrix.d.ts +42 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_solve_matrix.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/sh_exp_solve_matrix.js +123 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_environment_cells.d.ts +30 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_environment_cells.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_environment_cells.js +147 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_log_floor.d.ts +24 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_log_floor.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_log_floor.js +79 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_project.d.ts +17 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_project.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_project.js +99 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_reference_reflectance.d.ts +24 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_reference_reflectance.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_reference_reflectance.js +104 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_solve.d.ts +12 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_solve.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_solve.js +93 -0
- package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/GPULightMap.js +1 -0
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +4 -0
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +4 -0
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/PIXEL_TEXTURE_ORM.d.ts +1 -1
- package/src/shade/renderer/material/PIXEL_TEXTURE_ORM.d.ts.map +1 -1
- package/src/shade/renderer/material/StandardShadeMaterial.d.ts +15 -0
- package/src/shade/renderer/material/StandardShadeMaterial.d.ts.map +1 -1
- package/src/shade/renderer/material/StandardShadeMaterial.js +17 -0
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +36 -2
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +218 -18
- package/src/shade/renderer/material/resident/INDIRECT_MATERIAL_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/INDIRECT_MATERIAL_STRUCT.js +10 -0
- package/src/shade/renderer/medium/MEDIA_TABLE_STRUCT.d.ts +17 -0
- package/src/shade/renderer/medium/MEDIA_TABLE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/medium/MEDIA_TABLE_STRUCT.js +24 -0
- package/src/shade/renderer/medium/MEDIUM_PHASE_LOBE_KIND.d.ts +24 -0
- package/src/shade/renderer/medium/MEDIUM_PHASE_LOBE_KIND.d.ts.map +1 -0
- package/src/shade/renderer/medium/MEDIUM_PHASE_LOBE_KIND.js +18 -0
- package/src/shade/renderer/medium/MEDIUM_STRUCT.d.ts +20 -0
- package/src/shade/renderer/medium/MEDIUM_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/medium/MEDIUM_STRUCT.js +43 -0
- package/src/shade/renderer/medium/ParticipatingMedium.d.ts +111 -0
- package/src/shade/renderer/medium/ParticipatingMedium.d.ts.map +1 -0
- package/src/shade/renderer/medium/ParticipatingMedium.js +211 -0
- package/src/shade/renderer/medium/chunk_medium_lobe_phase.d.ts +13 -0
- package/src/shade/renderer/medium/chunk_medium_lobe_phase.d.ts.map +1 -0
- package/src/shade/renderer/medium/chunk_medium_lobe_phase.js +33 -0
- package/src/shade/renderer/medium/participating_medium_serialization.d.ts +32 -0
- package/src/shade/renderer/medium/participating_medium_serialization.d.ts.map +1 -0
- package/src/shade/renderer/medium/participating_medium_serialization.js +181 -0
- package/src/shade/renderer/medium/phase/MediumPhaseFunction.d.ts +48 -0
- package/src/shade/renderer/medium/phase/MediumPhaseFunction.d.ts.map +1 -0
- package/src/shade/renderer/medium/phase/MediumPhaseFunction.js +42 -0
- package/src/shade/renderer/medium/phase/PhaseCornetteShanks.d.ts +23 -0
- package/src/shade/renderer/medium/phase/PhaseCornetteShanks.d.ts.map +1 -0
- package/src/shade/renderer/medium/phase/PhaseCornetteShanks.js +45 -0
- package/src/shade/renderer/medium/phase/PhaseDraine.d.ts +30 -0
- package/src/shade/renderer/medium/phase/PhaseDraine.d.ts.map +1 -0
- package/src/shade/renderer/medium/phase/PhaseDraine.js +58 -0
- package/src/shade/renderer/medium/phase/PhaseFournierForand.d.ts +24 -0
- package/src/shade/renderer/medium/phase/PhaseFournierForand.d.ts.map +1 -0
- package/src/shade/renderer/medium/phase/PhaseFournierForand.js +53 -0
- package/src/shade/renderer/medium/phase/PhaseHenyeyGreenstein.d.ts +21 -0
- package/src/shade/renderer/medium/phase/PhaseHenyeyGreenstein.d.ts.map +1 -0
- package/src/shade/renderer/medium/phase/PhaseHenyeyGreenstein.js +43 -0
- package/src/shade/renderer/medium/phase/PhaseJendersieDeon.d.ts +25 -0
- package/src/shade/renderer/medium/phase/PhaseJendersieDeon.d.ts.map +1 -0
- package/src/shade/renderer/medium/phase/PhaseJendersieDeon.js +66 -0
- package/src/shade/renderer/medium/phase/PhaseRayleigh.d.ts +9 -0
- package/src/shade/renderer/medium/phase/PhaseRayleigh.d.ts.map +1 -0
- package/src/shade/renderer/medium/phase/PhaseRayleigh.js +21 -0
- package/src/shade/renderer/medium/phase/PhaseWaterMolecular.d.ts +28 -0
- package/src/shade/renderer/medium/phase/PhaseWaterMolecular.d.ts.map +1 -0
- package/src/shade/renderer/medium/phase/PhaseWaterMolecular.js +49 -0
- package/src/shade/renderer/medium/water/WATER_DEFAULT_PATH_LENGTHS.d.ts +10 -0
- package/src/shade/renderer/medium/water/WATER_DEFAULT_PATH_LENGTHS.d.ts.map +1 -0
- package/src/shade/renderer/medium/water/WATER_DEFAULT_PATH_LENGTHS.js +25 -0
- package/src/shade/renderer/medium/water/water_iop_from_appearance.d.ts +47 -0
- package/src/shade/renderer/medium/water/water_iop_from_appearance.d.ts.map +1 -0
- package/src/shade/renderer/medium/water/water_iop_from_appearance.js +174 -0
- package/src/shade/renderer/medium/water/water_iop_from_constituents.d.ts +57 -0
- package/src/shade/renderer/medium/water/water_iop_from_constituents.d.ts.map +1 -0
- package/src/shade/renderer/medium/water/water_iop_from_constituents.js +242 -0
- package/src/shade/renderer/medium/water/water_iop_jerlov.d.ts +41 -0
- package/src/shade/renderer/medium/water/water_iop_jerlov.d.ts.map +1 -0
- package/src/shade/renderer/medium/water/water_iop_jerlov.js +231 -0
- package/src/shade/renderer/medium/water/water_iop_spectral_reference.d.ts +66 -0
- package/src/shade/renderer/medium/water/water_iop_spectral_reference.d.ts.map +1 -0
- package/src/shade/renderer/medium/water/water_iop_spectral_reference.js +223 -0
- package/src/shade/renderer/medium/water/water_medium_from_iop.d.ts +96 -0
- package/src/shade/renderer/medium/water/water_medium_from_iop.d.ts.map +1 -0
- package/src/shade/renderer/medium/water/water_medium_from_iop.js +145 -0
- package/src/shade/renderer/medium/water/water_presets.d.ts +69 -0
- package/src/shade/renderer/medium/water/water_presets.d.ts.map +1 -0
- package/src/shade/renderer/medium/water/water_presets.js +119 -0
- package/src/shade/renderer/medium/water/water_rgb_from_spectral.d.ts +69 -0
- package/src/shade/renderer/medium/water/water_rgb_from_spectral.d.ts.map +1 -0
- package/src/shade/renderer/medium/water/water_rgb_from_spectral.js +341 -0
- package/src/shade/renderer/particles/DESIGN.md +4 -2
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_voxel_fade.d.ts +26 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_voxel_fade.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_voxel_fade.js +71 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +16 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +6 -13
- package/src/shade/renderer/path_tracer/PATH_TRACED_MEDIA_PLAN_2026_10_02.md +520 -0
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -0
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +2 -0
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +188 -185
- package/src/shade/renderer/path_tracer/shader/STANDARD_MATERIAL_DATA_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/STANDARD_MATERIAL_DATA_STRUCT.js +4 -1
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts +13 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.js +29 -0
- package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.d.ts +79 -0
- package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +360 -70
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +4 -3
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_beam.d.ts +24 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_beam.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_beam.js +99 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_connect.d.ts +68 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_connect.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_connect.js +263 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_constraint.d.ts +55 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_constraint.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_constraint.js +148 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light.d.ts +17 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light.js +41 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light_sample.d.ts +20 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light_sample.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_light_sample.js +105 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle.d.ts +28 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle.js +97 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle_of_hit.d.ts +12 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle_of_hit.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/manifold/chunk_manifold_triangle_of_hit.js +46 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_interface.d.ts +25 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_interface.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_interface.js +75 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_path.d.ts +54 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_path.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_path.js +245 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_phase.d.ts +42 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_phase.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_phase.js +236 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_scatter_nee.d.ts +24 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_scatter_nee.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_scatter_nee.js +97 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_stack.d.ts +57 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_stack.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_stack.js +222 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_transport.d.ts +88 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_transport.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_transport.js +304 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_volumes.d.ts +35 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_volumes.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/media/chunk_medium_volumes.js +137 -0
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js +5 -35
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts +12 -4
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.js +36 -8
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts +3 -0
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js +2 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts +8 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js +40 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.js +85 -84
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +150 -137
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts +3 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js +44 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts +5 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js +35 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts +26 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js +42 -0
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +1 -0
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +113 -105
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +2 -0
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +177 -167
- package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js +10 -0
- package/src/shade/renderer/rasterize/RasterizationJob.d.ts +1 -2
- package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/RasterizationJob.js +1 -2
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +5 -6
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +5 -6
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts +8 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.js +9 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +14 -4
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +13 -4
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts +13 -7
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.js +13 -7
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +309 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +54 -9
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +9 -1
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_footprint_bias.d.ts +33 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_footprint_bias.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_footprint_bias.js +45 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts +4 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.js +6 -2
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts +2 -1
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.js +4 -2
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_level_word.d.ts +14 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_level_word.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_level_word.js +28 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_lut_entry.d.ts +10 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_lut_entry.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_lut_entry.js +18 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_marks.d.ts +19 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_marks.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_marks.js +44 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_step_count.d.ts +10 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_step_count.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp_step_count.js +17 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +3 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.js +163 -64
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +4 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +16 -0
- package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.d.ts +12 -1
- package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.js +22 -3
- package/src/shade/renderer/shader/chunk/atmosphere/phase/chunk_sample_henyey_greenstein_cos.d.ts +18 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/chunk_sample_henyey_greenstein_cos.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/chunk_sample_henyey_greenstein_cos.js +31 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_phase_fournier_forand.d.ts +43 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_phase_fournier_forand.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_phase_fournier_forand.js +153 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_sample_fournier_forand.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_sample_fournier_forand.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/chunk_sample_fournier_forand.js +57 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/fournier_forand_parameters_from_backscatter.d.ts +45 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/fournier_forand_parameters_from_backscatter.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/ff/fournier_forand_parameters_from_backscatter.js +109 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.js +4 -5
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_phase_draine.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_phase_draine.js +6 -3
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine.d.ts +24 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine.js +49 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine_cos.d.ts +18 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine_cos.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/chunk_sample_draine_cos.js +18 -0
- package/src/shade/renderer/shader/chunk/brdf/dfg/chunk_integrate_brdf.d.ts +3 -0
- package/src/shade/renderer/shader/chunk/brdf/dfg/chunk_integrate_brdf.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/brdf/dfg/chunk_integrate_brdf.js +3 -0
- package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.js +1 -5
- package/src/shade/renderer/shader/chunk/brdf/dfg/shader_split_sum_dgf_lut.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/brdf/dfg/shader_split_sum_dgf_lut.js +3 -1
- package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_dielectric.d.ts +24 -0
- package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_dielectric.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_dielectric.js +53 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_scene_point_query_is_inside_geometry.d.ts +7 -1
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_scene_point_query_is_inside_geometry.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_scene_point_query_is_inside_geometry.js +12 -60
- package/src/shade/renderer/shader/chunk/geometry/sphere/chunk_compute_spherical_excess.d.ts +26 -6
- package/src/shade/renderer/shader/chunk/geometry/sphere/chunk_compute_spherical_excess.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/sphere/chunk_compute_spherical_excess.js +30 -20
- package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_directional.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_directional.js +3 -1
- package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_point.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_point.js +3 -1
- package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_spot.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/sample/chunk_light_importance_spot.js +3 -1
- package/src/shade/renderer/shader/chunk/light/sample/chunk_light_receiver_cosine.d.ts +14 -0
- package/src/shade/renderer/shader/chunk/light/sample/chunk_light_receiver_cosine.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/light/sample/chunk_light_receiver_cosine.js +25 -0
- package/src/shade/renderer/shader/chunk/light/sample/chunk_select_light_importance.d.ts +9 -2
- package/src/shade/renderer/shader/chunk/light/sample/chunk_select_light_importance.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/sample/chunk_select_light_importance.js +33 -10
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts +30 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.js +54 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.js +71 -37
- package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_band_of_index.d.ts +14 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_band_of_index.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_band_of_index.js +30 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_basis_function.d.ts +19 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_basis_function.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_basis_function.js +73 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_vmf_window.d.ts +19 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_vmf_window.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh_vmf_window.js +25 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/SH_EXP_P4Q2_PROBE_STRUCT.d.ts +17 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/SH_EXP_P4Q2_PROBE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/SH_EXP_P4Q2_PROBE_STRUCT.js +23 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_p4q2_base_reflectance.d.ts +26 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_p4q2_base_reflectance.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_p4q2_base_reflectance.js +55 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_split_sum.d.ts +52 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_split_sum.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/exponential/chunk_sh_exp_split_sum.js +65 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_basis_at.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_basis_at.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_basis_at.js +229 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_color_evaluate_vmf.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_color_evaluate_vmf.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh10_color_evaluate_vmf.js +278 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh2_color_evaluate_vmf.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh2_color_evaluate_vmf.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh2_color_evaluate_vmf.js +58 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh3_color_evaluate_vmf.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh3_color_evaluate_vmf.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh3_color_evaluate_vmf.js +75 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_basis_at.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_basis_at.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_basis_at.js +70 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_color_evaluate_vmf.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_color_evaluate_vmf.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh4_color_evaluate_vmf.js +95 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_basis_at.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_basis_at.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_basis_at.js +89 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_color_evaluate_vmf.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_color_evaluate_vmf.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh5_color_evaluate_vmf.js +118 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_basis_at.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_basis_at.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_basis_at.js +111 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_color_evaluate_vmf.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_color_evaluate_vmf.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh6_color_evaluate_vmf.js +144 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_basis_at.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_basis_at.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_basis_at.js +136 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_color_evaluate_vmf.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_color_evaluate_vmf.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh7_color_evaluate_vmf.js +173 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_basis_at.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_basis_at.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_basis_at.js +164 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_color_evaluate_vmf.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_color_evaluate_vmf.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh8_color_evaluate_vmf.js +205 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_basis_at.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_basis_at.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_basis_at.js +195 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_color_evaluate_vmf.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_color_evaluate_vmf.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/generated/chunk_sh9_color_evaluate_vmf.js +240 -0
- package/src/shade/renderer/shader/resource/ShaderResourceGroupDescriptor.d.ts +0 -6
- package/src/shade/renderer/shader/resource/ShaderResourceGroupDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceGroupDescriptor.js +46 -1
- package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +3 -2
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts +7 -7
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.js +7 -7
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts +19 -0
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js +27 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +43 -10
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +108 -48
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +74 -4
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +681 -77
- package/src/shade/renderer/shadow/map/Shadowmap.d.ts +3 -1
- package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/Shadowmap.js +3 -1
- package/src/shade/renderer/shadow/map/csm/CSM_CASCADE_STRUCT.d.ts +30 -0
- package/src/shade/renderer/shadow/map/csm/CSM_CASCADE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/CSM_CASCADE_STRUCT.js +52 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_DEFAULT_CASCADE_COUNT.d.ts +8 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_DEFAULT_CASCADE_COUNT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_DEFAULT_CASCADE_COUNT.js +7 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +8 -6
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +28 -34
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts +8 -0
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js +34 -3
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_csm_compute_cascade_blended.d.ts +3 -2
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_csm_compute_cascade_blended.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_csm_compute_cascade_blended.js +19 -14
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +5 -3
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +27 -7
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +137 -133
- package/src/shade/renderer/shadow/map/shadowmap_budget_carry_over.d.ts +4 -4
- package/src/shade/renderer/shadow/map/shadowmap_budget_carry_over.js +4 -4
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts +15 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js +14 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts +16 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js +15 -0
- package/src/shade/renderer/shadow/vsm/PLAN.md +440 -0
- package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +43 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +42 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +153 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +327 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.js +1408 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts +14 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.js +13 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts +63 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.js +70 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts +11 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.js +10 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +54 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +75 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts +23 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.js +85 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts +16 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.js +29 -0
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +136 -25
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +280 -100
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +39 -0
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +289 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts +18 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.js +65 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts +17 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.js +75 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +14 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +45 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts +17 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.js +100 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts +15 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.js +47 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts +26 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.js +156 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts +13 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.js +65 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +30 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +184 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +23 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +109 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts +56 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +211 -0
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts +1 -1
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts.map +1 -1
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.js +3 -13
- package/src/shade/renderer/texture/format/infer_format_from_parameters.d.ts.map +1 -1
- package/src/shade/renderer/texture/format/infer_format_from_parameters.js +2 -3
- package/src/shade/renderer/texture/texture_write_to_gpu.d.ts.map +1 -1
- package/src/shade/renderer/texture/texture_write_to_gpu.js +16 -16
- package/src/shade/renderer/texture/util/BLACK_PIXEL_TEXTURE.d.ts +1 -1
- package/src/shade/renderer/texture/util/BLACK_PIXEL_TEXTURE.d.ts.map +1 -1
- package/src/shade/renderer/texture/util/PIXEL_TEXTURE_NORMAL.d.ts +18 -1
- package/src/shade/renderer/texture/util/PIXEL_TEXTURE_NORMAL.d.ts.map +1 -1
- package/src/shade/renderer/texture/util/PIXEL_TEXTURE_NORMAL.js +24 -3
- package/src/shade/renderer/texture/util/WHITE_PIXEL_TEXTURE.d.ts +1 -1
- package/src/shade/renderer/texture/util/WHITE_PIXEL_TEXTURE.d.ts.map +1 -1
- package/src/shade/renderer/texture/util/get_single_pixel_texture.d.ts +0 -1
- package/src/shade/renderer/texture/util/get_single_pixel_texture.d.ts.map +1 -1
- package/src/shade/renderer/texture/util/get_single_pixel_texture.js +2 -23
- package/src/shade/renderer/texture/util/single_pixel_texture_from_sampler.d.ts +11 -0
- package/src/shade/renderer/texture/util/single_pixel_texture_from_sampler.d.ts.map +1 -0
- package/src/shade/renderer/texture/util/single_pixel_texture_from_sampler.js +34 -0
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts +4 -90
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +6 -210
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts +119 -0
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts.map +1 -0
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.js +245 -0
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts +1 -1
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +3 -19
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts +13 -0
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts.map +1 -0
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js +34 -0
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts +17 -8
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +35 -64
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts +21 -0
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.js +70 -0
- package/src/shade/renderer/volumetrics/chunk_participating_media_volumes_iterate.d.ts +31 -0
- package/src/shade/renderer/volumetrics/chunk_participating_media_volumes_iterate.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/chunk_participating_media_volumes_iterate.js +86 -0
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -4
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +6 -7
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +7 -7
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +20 -3
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +84 -35
- package/src/shade/renderer/water/chunk_water_gi.d.ts +14 -0
- package/src/shade/renderer/water/chunk_water_gi.d.ts.map +1 -0
- package/src/shade/renderer/water/chunk_water_gi.js +56 -0
- package/src/shade/renderer/water/chunk_water_transport.d.ts +2 -0
- package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
- package/src/shade/renderer/water/chunk_water_transport.js +52 -41
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +15 -0
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +64 -0
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts +4 -0
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.js +10 -0
- package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts +3 -0
- package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/chunk_water_bodies.js +3 -0
- package/src/shade/renderer/water/medium/chunk_water_medium_derived.d.ts +9 -0
- package/src/shade/renderer/water/medium/chunk_water_medium_derived.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/chunk_water_medium_derived.js +55 -0
- package/src/shade/renderer/water/medium/chunk_water_medium_scattering.d.ts +8 -0
- package/src/shade/renderer/water/medium/chunk_water_medium_scattering.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/chunk_water_medium_scattering.js +17 -0
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +4 -0
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +32 -0
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +4 -0
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/shader_water_meshlets.js +69 -0
- package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts +28 -0
- package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts.map +1 -0
- package/src/shade/renderer/water/optics/chunk_water_inscatter.js +124 -0
- package/src/shade/renderer/water/optics/chunk_water_optics.d.ts +12 -0
- package/src/shade/renderer/water/optics/chunk_water_optics.d.ts.map +1 -0
- package/src/shade/renderer/water/optics/chunk_water_optics.js +75 -0
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +27 -0
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -0
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +75 -0
- package/src/shade/renderer/water/shader_water.d.ts +11 -5
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +262 -156
- package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water_avboit.js +19 -9
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +25 -0
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +128 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +6 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +23 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +9 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.js +144 -0
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +13 -0
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/chunk_water_wave.js +40 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +14 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +34 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +4 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.js +123 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +6 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.js +85 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +6 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.js +83 -0
- package/src/shade/renderer/water/water_height_texture_from_sampler.d.ts.map +1 -1
- package/src/shade/renderer/water/water_height_texture_from_sampler.js +4 -3
- package/src/shade/renderer/water/water_missing_receiver_path.d.ts +17 -0
- package/src/shade/renderer/water/water_missing_receiver_path.d.ts.map +1 -0
- package/src/shade/renderer/water/water_missing_receiver_path.js +40 -0
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +247 -23
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts +18 -14
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +48 -6
- package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts +0 -2
- package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts.map +0 -1
- package/src/engine/graphics/ecs/water/WATER_SIZE.js +0 -1
- package/src/shade/renderer/light/GPUViewLightContext.d.ts +0 -22
- package/src/shade/renderer/light/GPUViewLightContext.d.ts.map +0 -1
- package/src/shade/renderer/light/GPUViewLightContext.js +0 -62
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts +0 -29
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.js +0 -43
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASCADE_COUNT.d.ts +0 -7
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASCADE_COUNT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASCADE_COUNT.js +0 -6
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts +0 -27
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +0 -125
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts +0 -7
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.js +0 -41
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts +0 -2
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.js +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts +0 -3
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.js +0 -7
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts +0 -24
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.js +0 -103
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts +0 -8
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.js +0 -34
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts +0 -10
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.js +0 -64
- package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts +0 -11
- package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/decode_tile_address.js +0 -34
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts +0 -2
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.js +0 -11
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts +0 -20
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.js +0 -187
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts +0 -25
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.js +0 -220
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts +0 -19
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.js +0 -115
- 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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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 {
|
|
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
|
|
32
|
-
* substep
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
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
|
|
62
|
-
* per-DOF `(active, effMass, bias, clampLo, clampHi)`
|
|
63
|
-
* setup. Geometry (anchors / lever arms / position error)
|
|
64
|
-
* the current pose every substep, so the joint tracks the
|
|
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
|
-
|
|
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
|
|
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-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const
|
|
115
|
-
const
|
|
116
|
-
const
|
|
117
|
-
const
|
|
118
|
-
const
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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 {
|
|
143
|
-
* @param {number}
|
|
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,
|
|
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)
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
|
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 {
|
|
160
|
-
* @param {number}
|
|
161
|
-
* @param {number}
|
|
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,
|
|
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
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
ss
|
|
173
|
-
ss[base +
|
|
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)
|
|
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 {
|
|
184
|
-
* @param {number}
|
|
185
|
-
* @param {
|
|
186
|
-
* @param {number}
|
|
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(
|
|
193
|
-
|
|
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
|
-
|
|
299
|
+
out[out_offset] = invM;
|
|
300
|
+
return;
|
|
198
301
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
ss
|
|
202
|
-
|
|
203
|
-
|
|
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 {
|
|
220
|
-
* @param {number}
|
|
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 {
|
|
224
|
-
* @param {number}
|
|
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,
|
|
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 {
|
|
259
|
-
* @param {number}
|
|
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,
|
|
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
|
|
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
|
-
|
|
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`.
|
|
285
|
-
*
|
|
286
|
-
*
|
|
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 {
|
|
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
|
|
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
|
|
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 `
|
|
367
|
-
*
|
|
368
|
-
*
|
|
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
|
-
*
|
|
389
|
-
*
|
|
390
|
-
*
|
|
391
|
-
* a DOF that starts OUTSIDE its range coasts
|
|
392
|
-
*
|
|
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 {
|
|
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 {
|
|
443
|
-
* @param {
|
|
444
|
-
* @
|
|
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,
|
|
450
|
-
|
|
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)
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
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;
|
|
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;
|
|
498
|
-
|
|
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
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
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;
|
|
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;
|
|
642
|
+
if (denom <= 0) { imp[dofIndex] = 0; return false; } // inert (no k, no c)
|
|
513
643
|
const gamma = 1 / (dt_sub * denom);
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
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
|
-
|
|
654
|
+
return false;
|
|
525
655
|
}
|
|
526
656
|
|
|
527
657
|
/**
|
|
528
|
-
*
|
|
529
|
-
*
|
|
530
|
-
*
|
|
531
|
-
*
|
|
532
|
-
*
|
|
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 {
|
|
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 {
|
|
538
|
-
*
|
|
539
|
-
* @param {number}
|
|
540
|
-
* @param {
|
|
541
|
-
*
|
|
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
|
-
|
|
545
|
-
|
|
546
|
-
if (
|
|
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
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
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
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
if (
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
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
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
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
|
|
670
|
-
|
|
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
|
-
|
|
718
|
-
|
|
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
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
//
|
|
726
|
-
|
|
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
|
-
|
|
729
|
-
|
|
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
|
-
|
|
739
|
-
|
|
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
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
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
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
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
|
-
|
|
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
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
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
|
}
|