@woosh/meep-engine 3.43.0 → 3.45.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-terrain.js +1 -1
- package/editor/prototypeEditorShell.d.ts.map +1 -1
- package/editor/prototypeEditorShell.js +4 -2
- package/package.json +1 -1
- package/src/core/collection/array/array_sort_insertion_ascending.d.ts +19 -0
- package/src/core/collection/array/array_sort_insertion_ascending.d.ts.map +1 -0
- package/src/core/collection/array/array_sort_insertion_ascending.js +31 -0
- package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts +27 -0
- package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts.map +1 -0
- package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.js +39 -0
- package/src/core/geom/3d/aabb/aabb3_from_v3_array.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_from_v3_array.js +4 -1
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts +2 -2
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +1 -1
- package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts +21 -0
- package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts.map +1 -0
- package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.js +36 -0
- package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts +25 -0
- package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts.map +1 -0
- package/src/core/geom/3d/pose/pose3_apply_point_array.js +40 -0
- package/src/core/geom/3d/pose/pose3_compose_array.d.ts +28 -0
- package/src/core/geom/3d/pose/pose3_compose_array.d.ts.map +1 -0
- package/src/core/geom/3d/pose/pose3_compose_array.js +41 -0
- package/src/core/geom/3d/pose/pose3_to_local_array.d.ts +29 -0
- package/src/core/geom/3d/pose/pose3_to_local_array.d.ts.map +1 -0
- package/src/core/geom/3d/pose/pose3_to_local_array.js +42 -0
- package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts +28 -0
- package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.js +66 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts +22 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.js +30 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts +23 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.js +31 -0
- package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts +26 -0
- package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts.map +1 -0
- package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.js +46 -0
- package/src/core/geom/vec3/v3_distance_array.d.ts +11 -0
- package/src/core/geom/vec3/v3_distance_array.d.ts.map +1 -0
- package/src/core/geom/vec3/v3_distance_array.js +19 -0
- package/src/core/geom/vec3/v3_normalize_array_checked.d.ts +23 -0
- package/src/core/geom/vec3/v3_normalize_array_checked.d.ts.map +1 -0
- package/src/core/geom/vec3/v3_normalize_array_checked.js +49 -0
- package/src/core/geom/vec3/v3_reject_array.d.ts +15 -0
- package/src/core/geom/vec3/v3_reject_array.d.ts.map +1 -0
- package/src/core/geom/vec3/v3_reject_array.js +32 -0
- package/src/core/graph/csr/csr_build_incidence.d.ts +26 -0
- package/src/core/graph/csr/csr_build_incidence.d.ts.map +1 -0
- package/src/core/graph/csr/csr_build_incidence.js +71 -0
- package/src/core/graph/csr/csr_graph_color_greedy.d.ts +25 -0
- package/src/core/graph/csr/csr_graph_color_greedy.d.ts.map +1 -0
- package/src/core/graph/csr/csr_graph_color_greedy.js +83 -0
- package/src/core/graph/csr/csr_graph_validate_coloring.d.ts +15 -0
- package/src/core/graph/csr/csr_graph_validate_coloring.d.ts.map +1 -0
- package/src/core/graph/csr/csr_graph_validate_coloring.js +33 -0
- package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts +26 -0
- package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts.map +1 -0
- package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.js +71 -0
- package/src/core/math/max2_exact.d.ts +15 -0
- package/src/core/math/max2_exact.d.ts.map +1 -0
- package/src/core/math/max2_exact.js +30 -0
- package/src/core/math/min2_exact.d.ts +20 -0
- package/src/core/math/min2_exact.d.ts.map +1 -0
- package/src/core/math/min2_exact.js +35 -0
- package/src/engine/Clock.d.ts +15 -0
- package/src/engine/Clock.d.ts.map +1 -1
- package/src/engine/Clock.js +29 -5
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +11 -19
- package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
- package/src/engine/ecs/ik/IKGoalSystem.js +3 -19
- package/src/engine/ecs/parent/parent_entity_model_of.d.ts +17 -0
- package/src/engine/ecs/parent/parent_entity_model_of.d.ts.map +1 -0
- package/src/engine/ecs/parent/parent_entity_model_of.js +26 -0
- package/src/engine/ecs/transform/t64_read_pose_array.d.ts +15 -0
- package/src/engine/ecs/transform/t64_read_pose_array.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_read_pose_array.js +24 -0
- package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts +57 -0
- package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts.map +1 -0
- package/src/engine/graphics/ecs/mesh-v2/MeshSkin.js +84 -0
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts +2 -0
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts.map +1 -1
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.js +10 -21
- package/src/engine/graphics3/AnimationGraphSystem.d.ts +28 -13
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +107 -64
- package/src/engine/graphics3/AnimationSystem.d.ts +29 -15
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem.js +112 -61
- package/src/engine/graphics3/MeshSkinSystem.d.ts +56 -0
- package/src/engine/graphics3/MeshSkinSystem.d.ts.map +1 -0
- package/src/engine/graphics3/MeshSkinSystem.js +317 -0
- package/src/engine/graphics3/MeshSystem.d.ts +15 -35
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +21 -298
- package/src/engine/graphics3/RowChains.d.ts +76 -0
- package/src/engine/graphics3/RowChains.d.ts.map +1 -0
- package/src/engine/graphics3/RowChains.js +347 -0
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -0
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +329 -309
- package/src/engine/graphics3/animation/AnimationClips.d.ts +56 -0
- package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -0
- package/src/engine/graphics3/animation/AnimationClips.js +79 -0
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts +13 -14
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
- package/src/engine/graphics3/animation/ClipListPlayer.js +262 -263
- package/src/engine/graphics3/animation/write_clip_playback.d.ts +3 -3
- package/src/engine/graphics3/animation/write_clip_playback.js +4 -4
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +5 -0
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
- package/src/engine/graphics3/pose/query_entity_node_world_pose.js +80 -75
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts +4 -24
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/PrefabInstance.js +60 -80
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +16 -3
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_instantiate.js +49 -12
- package/src/engine/graphics3/prefab/prefab_place.d.ts +31 -17
- package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_place.js +175 -130
- package/src/engine/graphics3/register_clips.d.ts +93 -0
- package/src/engine/graphics3/register_clips.d.ts.map +1 -0
- package/src/engine/graphics3/register_clips.js +166 -0
- package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +9 -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 +3 -1
- package/src/engine/physics/cloth/MEASUREMENTS.md +795 -0
- package/src/engine/physics/cloth/PLAN.md +349 -17
- package/src/engine/physics/cloth/build/ClothProxy.d.ts +113 -61
- package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/ClothProxy.js +142 -77
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +44 -0
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -0
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +107 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +43 -30
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +371 -284
- package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts +62 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +275 -0
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +7 -0
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/ClothColliderIndex.js +85 -67
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +19 -101
- package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts +2 -5
- package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_pack.js +7 -15
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +17 -62
- package/src/engine/physics/cloth/ecs/Cloth.d.ts +17 -9
- package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/Cloth.js +220 -212
- package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts +0 -1
- package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +6 -19
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +1 -2
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +3 -12
- package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +6 -0
- package/src/engine/physics/cloth/ecs/ClothHold.d.ts +91 -0
- package/src/engine/physics/cloth/ecs/ClothHold.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothHold.js +103 -0
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +254 -48
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +277 -47
- package/src/engine/physics/cloth/ecs/ClothPin.d.ts +73 -0
- package/src/engine/physics/cloth/ecs/ClothPin.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothPin.js +92 -0
- package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts +36 -0
- package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.js +61 -0
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts +23 -17
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothRig.js +29 -27
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +12 -14
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +20 -15
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +57 -36
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +754 -207
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +12 -13
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +20 -14
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +63 -11
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.js +297 -101
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +9 -7
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +12 -10
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +3 -3
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +60 -120
- package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +37 -0
- package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_geodesic.js +135 -0
- package/src/engine/physics/cloth/ecs/cloth_holds.d.ts +97 -0
- package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_holds.js +583 -0
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +2 -2
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +168 -51
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +17 -22
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +55 -117
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -6
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +51 -42
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +5 -0
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back.js +62 -50
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +65 -58
- package/src/engine/physics/cloth/playground/cloth_playground_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/cloth_playground_build.js +2 -3
- package/src/engine/physics/cloth/playground/collide_main.js +3 -29
- package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/garment_build.js +17 -5
- package/src/engine/physics/cloth/playground/garment_main.js +5 -20
- package/src/engine/physics/cloth/playground/main.js +6 -48
- package/src/engine/physics/cloth/playground/rig_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/rig_build.js +302 -296
- package/src/engine/physics/cloth/playground/rig_main.js +947 -955
- package/src/engine/physics/cloth/playground/wind_main.js +8 -7
- package/src/engine/physics/cloth/solver/ClothState.d.ts +45 -7
- package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/ClothState.js +79 -83
- package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts +10 -8
- package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_color_particles.js +30 -102
- package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +6 -1
- package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_contact_find.js +9 -3
- package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts +114 -0
- package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_hold_line.js +350 -0
- package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts +21 -0
- package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_kinetic_energy.js +45 -0
- package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts +32 -0
- package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_particle_coupling.js +133 -0
- package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts +16 -0
- package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_particle_of_source.js +19 -0
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +6 -2
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_self_find.js +19 -68
- package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +30 -65
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +24 -12
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solver_constants.js +24 -12
- package/src/engine/physics/cloth/solver/cloth_step.d.ts +16 -0
- package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step.js +189 -48
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +1 -0
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step_instance.js +12 -6
- package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts +21 -0
- package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_stretch_residual.js +54 -0
- package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts +15 -0
- package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.js +28 -0
- package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts +30 -0
- package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.js +56 -0
- 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 +3 -17
- package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.js +353 -346
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +7 -5
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +7 -5
- package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +2 -1
- package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -25
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +12 -10
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/cloth_sample_air.js +60 -82
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/ContactProbeSystem.js +2 -18
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +9 -50
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts +24 -0
- package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts.map +1 -0
- package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.js +42 -0
- package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts +25 -0
- package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts.map +1 -0
- package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.js +40 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -1
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +40 -90
- package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/capsule_contacts.js +3 -5
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +2 -14
- package/src/engine/physics/narrowphase/hull_sphere_contact.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/hull_sphere_contact.js +2 -5
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/narrowphase_step.js +13 -32
- package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/sphere_box_contact.js +2 -5
- package/src/engine/simulation/Ticker.d.ts +13 -0
- package/src/engine/simulation/Ticker.d.ts.map +1 -1
- package/src/engine/simulation/Ticker.js +43 -8
- package/src/format/texture/basis/transcode/etc1s_to_astc.d.ts.map +1 -1
- package/src/format/texture/basis/transcode/etc1s_to_astc.js +2 -1
- package/src/shade/RENDERER_CONTRACT.md +8 -2
- package/src/shade/playground/image_decode_bench/main.js +2 -1
- package/src/shade/playground/mesh_row_ceiling/main.js +2 -1
- package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.js +2 -1
- package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/main.js +11 -19
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts +6 -3
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/place_character.js +90 -90
- package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/main.js +502 -509
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +2 -1
- package/src/shade/playground/ssr_variance/statistics.d.ts.map +1 -1
- package/src/shade/playground/ssr_variance/statistics.js +2 -1
- package/src/shade/playground/texture_encode/README.md +129 -109
- package/src/shade/playground/texture_encode/main.d.ts.map +1 -1
- package/src/shade/playground/texture_encode/main.js +1431 -1430
- package/src/shade/playground/volumetrics_froxel/measure.d.ts.map +1 -1
- package/src/shade/playground/volumetrics_froxel/measure.js +2 -1
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +45 -14
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +316 -64
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +5 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -1
- package/src/shade/renderer/buffer/table/gpu_database_check_links.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/gpu_database_check_links.js +2 -1
- package/src/shade/renderer/geometry/BoxGeometry.d.ts +1 -11
- package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/BoxGeometry.js +6 -13
- package/src/shade/renderer/geometry/CapsuleGeometry.d.ts +19 -0
- package/src/shade/renderer/geometry/CapsuleGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/CapsuleGeometry.js +24 -0
- package/src/shade/renderer/geometry/ConeGeometry.d.ts +20 -0
- package/src/shade/renderer/geometry/ConeGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/ConeGeometry.js +33 -0
- package/src/shade/renderer/geometry/CylinderGeometry.d.ts +21 -0
- package/src/shade/renderer/geometry/CylinderGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/CylinderGeometry.js +35 -0
- package/src/shade/renderer/geometry/PlaneGeometry.d.ts +17 -0
- package/src/shade/renderer/geometry/PlaneGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/PlaneGeometry.js +22 -0
- package/src/shade/renderer/geometry/TorusGeometry.d.ts +18 -0
- package/src/shade/renderer/geometry/TorusGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/TorusGeometry.js +23 -0
- package/src/shade/renderer/geometry/UVSphereGeometry.d.ts +21 -0
- package/src/shade/renderer/geometry/UVSphereGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/UVSphereGeometry.js +34 -0
- package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts +19 -0
- package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/primitives/make_capsule_geometry.js +205 -0
- package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts +21 -0
- package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/primitives/make_cone_geometry.js +36 -0
- package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts +1 -1
- package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +44 -9
- package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts +20 -0
- package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.js +190 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +3 -2
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +2 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +2 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +2 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +3 -2
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.js +2 -1
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +2 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +3 -2
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -2
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +26 -8
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +56 -39
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +7 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +46 -4
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js +4 -2
- package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +2 -2
- package/src/shade/renderer/gpu_primitive/sort/defs.js +79 -79
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +7 -3
- package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +4 -3
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +200 -194
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +6 -2
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +3 -2
- package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -1
- package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +334 -329
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +7 -2
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +16 -4
- package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +2444 -2345
- package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +312 -310
- package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +3 -3
- package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +383 -375
- package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +349 -346
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts +58 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts.map +1 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.js +536 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +21 -7
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +291 -327
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts +25 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts.map +1 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.js +99 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +5 -3
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +47 -71
- package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts +10 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts.map +1 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.js +50 -0
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +4 -5
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +7 -8
- package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
- package/src/shade/renderer/water/chunk_water_transport.js +7 -5
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +8 -2
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +3 -2
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +3 -2
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +3 -1
- package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/GPUWaterSurface.js +3 -1
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +11 -4
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +37 -20
- package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
- package/src/shade/wgsl/validate_wgsl_source.js +74 -3
- package/src/engine/graphics3/register_instance_animation.d.ts +0 -114
- package/src/engine/graphics3/register_instance_animation.d.ts.map +0 -1
- package/src/engine/graphics3/register_instance_animation.js +0 -201
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solve `M·x = b` for a symmetric positive definite 3×3 `M`, by LDLᵀ factorisation.
|
|
3
|
+
*
|
|
4
|
+
* `M` is read as its six distinct entries, diagonal first: `[m00, m11, m22, m01, m02, m12]`.
|
|
5
|
+
*
|
|
6
|
+
* LDLᵀ rather than a cofactor inverse. The two agree in exact arithmetic and do not agree in Float64: an SPD
|
|
7
|
+
* matrix with a condition number in the billions has a cofactor determinant — a sum of triple products that
|
|
8
|
+
* has to cancel down by that ratio squared — that can come out *negative* although every eigenvalue is
|
|
9
|
+
* positive. The factorisation never forms those products, so its pivots stay positive where the determinant
|
|
10
|
+
* does not, and their product is the determinant to full precision.
|
|
11
|
+
*
|
|
12
|
+
* The pivots of an SPD matrix are `M` restricted to nested subspaces, so all three positive *is* positive
|
|
13
|
+
* definiteness: the function checks exactly that, and returns `false` without writing `out` when a pivot is
|
|
14
|
+
* not positive and finite — an indefinite, singular or non-finite `M`. An infinite pivot needs refusing
|
|
15
|
+
* explicitly: it is positive, and dividing by it reads as a finite solution, zero along that axis.
|
|
16
|
+
*
|
|
17
|
+
* @param {Float64Array|Float32Array|number[]} out solution `x`, 3 entries at `out_offset`
|
|
18
|
+
* @param {number} out_offset
|
|
19
|
+
* @param {Float64Array|Float32Array|number[]} m `[m00, m11, m22, m01, m02, m12]` at `m_offset`
|
|
20
|
+
* @param {number} m_offset
|
|
21
|
+
* @param {Float64Array|Float32Array|number[]} b right-hand side, 3 entries at `b_offset`
|
|
22
|
+
* @param {number} b_offset
|
|
23
|
+
* @returns {boolean} true when `M` was positive definite and `out` holds the solution
|
|
24
|
+
*/
|
|
25
|
+
export function matrix_symmetric_3x3_solve_ldlt(
|
|
26
|
+
out, out_offset,
|
|
27
|
+
m, m_offset,
|
|
28
|
+
b, b_offset
|
|
29
|
+
) {
|
|
30
|
+
const m00 = m[m_offset];
|
|
31
|
+
const m11 = m[m_offset + 1];
|
|
32
|
+
const m22 = m[m_offset + 2];
|
|
33
|
+
const m01 = m[m_offset + 3];
|
|
34
|
+
const m02 = m[m_offset + 4];
|
|
35
|
+
const m12 = m[m_offset + 5];
|
|
36
|
+
|
|
37
|
+
const pivot_0 = m00;
|
|
38
|
+
const lower_10 = m01 / pivot_0;
|
|
39
|
+
const lower_20 = m02 / pivot_0;
|
|
40
|
+
|
|
41
|
+
const pivot_1 = m11 - lower_10 * m01;
|
|
42
|
+
const lower_21 = (m12 - lower_20 * m01) / pivot_1;
|
|
43
|
+
|
|
44
|
+
const pivot_2 = m22 - lower_20 * m02 - lower_21 * lower_21 * pivot_1;
|
|
45
|
+
|
|
46
|
+
if (!(
|
|
47
|
+
pivot_0 > 0 && pivot_0 < Infinity
|
|
48
|
+
&& pivot_1 > 0 && pivot_1 < Infinity
|
|
49
|
+
&& pivot_2 > 0 && pivot_2 < Infinity
|
|
50
|
+
)) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const b0 = b[b_offset];
|
|
55
|
+
const b1 = b[b_offset + 1];
|
|
56
|
+
const b2 = b[b_offset + 2];
|
|
57
|
+
|
|
58
|
+
// Forward substitution through L, scale by D, back substitution through Lᵀ.
|
|
59
|
+
const forward_1 = b1 - lower_10 * b0;
|
|
60
|
+
const forward_2 = b2 - lower_20 * b0 - lower_21 * forward_1;
|
|
61
|
+
|
|
62
|
+
const x2 = forward_2 / pivot_2;
|
|
63
|
+
const x1 = forward_1 / pivot_1 - lower_21 * x2;
|
|
64
|
+
const x0 = b0 / pivot_0 - lower_10 * x1 - lower_20 * x2;
|
|
65
|
+
|
|
66
|
+
out[out_offset] = x0;
|
|
67
|
+
out[out_offset + 1] = x1;
|
|
68
|
+
out[out_offset + 2] = x2;
|
|
69
|
+
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Math.max(a, b)` without the call, as {@link min2_exact}: the larger, NaN if either is, and `+0`
|
|
3
|
+
* above `-0`.
|
|
4
|
+
*
|
|
5
|
+
* {@link max2} drops a NaN in `b` and lets the first of two zeros win; this does neither.
|
|
6
|
+
*
|
|
7
|
+
* The same as `Math.max` under `Object.is` for every pair of numbers, except that a NaN answer is the
|
|
8
|
+
* canonical NaN.
|
|
9
|
+
*
|
|
10
|
+
* @param {number} a
|
|
11
|
+
* @param {number} b
|
|
12
|
+
* @returns {number}
|
|
13
|
+
*/
|
|
14
|
+
export function max2_exact(a: number, b: number): number;
|
|
15
|
+
//# sourceMappingURL=max2_exact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"max2_exact.d.ts","sourceRoot":"","sources":["../../../../src/core/math/max2_exact.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,8BAJW,MAAM,KACN,MAAM,GACJ,MAAM,CAkBlB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Math.max(a, b)` without the call, as {@link min2_exact}: the larger, NaN if either is, and `+0`
|
|
3
|
+
* above `-0`.
|
|
4
|
+
*
|
|
5
|
+
* {@link max2} drops a NaN in `b` and lets the first of two zeros win; this does neither.
|
|
6
|
+
*
|
|
7
|
+
* The same as `Math.max` under `Object.is` for every pair of numbers, except that a NaN answer is the
|
|
8
|
+
* canonical NaN.
|
|
9
|
+
*
|
|
10
|
+
* @param {number} a
|
|
11
|
+
* @param {number} b
|
|
12
|
+
* @returns {number}
|
|
13
|
+
*/
|
|
14
|
+
export function max2_exact(a, b) {
|
|
15
|
+
if (a > b) {
|
|
16
|
+
return a;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (b > a) {
|
|
20
|
+
return b;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (a === b) {
|
|
24
|
+
// equal, and of two zeros the positive one if either is
|
|
25
|
+
return a === 0 && 1 / a < 0 ? b : a;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// one of them is NaN
|
|
29
|
+
return NaN;
|
|
30
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Math.min(a, b)` without the call: the smaller, NaN if either is, and `-0` below `+0`.
|
|
3
|
+
*
|
|
4
|
+
* {@link min2} is `a < b ? a : b`, which answers `b` whenever the comparison is false — a NaN in `a`
|
|
5
|
+
* is dropped, and of two zeros the second one wins. That is right for a running minimum over values
|
|
6
|
+
* known to be numbers, and wrong for a bound that has to stay poisoned when its input was.
|
|
7
|
+
*
|
|
8
|
+
* Why not `Math.min` itself: in code V8 has not optimised yet (a function run a few times a step can
|
|
9
|
+
* stay unoptimised for thousands of steps), `Math.min` is a call into a builtin that hands its answer
|
|
10
|
+
* back boxed into a heap object. This is comparisons only.
|
|
11
|
+
*
|
|
12
|
+
* The same as `Math.min` under `Object.is` for every pair of numbers. A NaN answer is the canonical
|
|
13
|
+
* NaN; which NaN `Math.min` answers is the platform's (on x64, the one with the sign bit set).
|
|
14
|
+
*
|
|
15
|
+
* @param {number} a
|
|
16
|
+
* @param {number} b
|
|
17
|
+
* @returns {number}
|
|
18
|
+
*/
|
|
19
|
+
export function min2_exact(a: number, b: number): number;
|
|
20
|
+
//# sourceMappingURL=min2_exact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"min2_exact.d.ts","sourceRoot":"","sources":["../../../../src/core/math/min2_exact.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,8BAJW,MAAM,KACN,MAAM,GACJ,MAAM,CAkBlB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Math.min(a, b)` without the call: the smaller, NaN if either is, and `-0` below `+0`.
|
|
3
|
+
*
|
|
4
|
+
* {@link min2} is `a < b ? a : b`, which answers `b` whenever the comparison is false — a NaN in `a`
|
|
5
|
+
* is dropped, and of two zeros the second one wins. That is right for a running minimum over values
|
|
6
|
+
* known to be numbers, and wrong for a bound that has to stay poisoned when its input was.
|
|
7
|
+
*
|
|
8
|
+
* Why not `Math.min` itself: in code V8 has not optimised yet (a function run a few times a step can
|
|
9
|
+
* stay unoptimised for thousands of steps), `Math.min` is a call into a builtin that hands its answer
|
|
10
|
+
* back boxed into a heap object. This is comparisons only.
|
|
11
|
+
*
|
|
12
|
+
* The same as `Math.min` under `Object.is` for every pair of numbers. A NaN answer is the canonical
|
|
13
|
+
* NaN; which NaN `Math.min` answers is the platform's (on x64, the one with the sign bit set).
|
|
14
|
+
*
|
|
15
|
+
* @param {number} a
|
|
16
|
+
* @param {number} b
|
|
17
|
+
* @returns {number}
|
|
18
|
+
*/
|
|
19
|
+
export function min2_exact(a, b) {
|
|
20
|
+
if (a < b) {
|
|
21
|
+
return a;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (b < a) {
|
|
25
|
+
return b;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (a === b) {
|
|
29
|
+
// equal, and of two zeros the negative one if either is
|
|
30
|
+
return a === 0 && 1 / a > 0 ? b : a;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// one of them is NaN
|
|
34
|
+
return NaN;
|
|
35
|
+
}
|
package/src/engine/Clock.d.ts
CHANGED
|
@@ -52,6 +52,21 @@ declare class Clock {
|
|
|
52
52
|
* @returns {number} in seconds
|
|
53
53
|
*/
|
|
54
54
|
getDelta(): number;
|
|
55
|
+
/**
|
|
56
|
+
* {@link getDelta}, measured to a given moment instead of to now - an animation frame's
|
|
57
|
+
* timestamp, so that the simulation shown by a frame is the simulation at that frame's time and
|
|
58
|
+
* not at whenever the code reading the clock happened to run.
|
|
59
|
+
*
|
|
60
|
+
* Only a moment between the clock's last reading and now can be measured to; anything else is
|
|
61
|
+
* measured to now. A frame's timestamp is when the frame began, so it can sit behind a reading
|
|
62
|
+
* taken earlier in that frame (a resume() from an input handler). And it is only on this
|
|
63
|
+
* clock's timeline where the environment keeps its promise that it is - jsdom stamps frames
|
|
64
|
+
* 1.5 s behind `performance.now()`, a `Date.now()` polyfill decades ahead - and measured to
|
|
65
|
+
* those, the clock froze or leapt.
|
|
66
|
+
* @param {number} time in seconds, on the {@link current_time_in_seconds} timeline
|
|
67
|
+
* @returns {number} in seconds
|
|
68
|
+
*/
|
|
69
|
+
getDeltaAt(time: number): number;
|
|
55
70
|
/**
|
|
56
71
|
*
|
|
57
72
|
* @returns {number} in seconds
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Clock.d.ts","sourceRoot":"","sources":["../../../src/engine/Clock.js"],"names":[],"mappings":";AAcA;;GAEG;AACH;IAEI;;;;OAIG;IACH,0BAAsB;IAEtB;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,oBAAoB;IAGpB;;;;;;OAMG;IACH,gBAHU,IAAI,CAGM;IAMpB;;;OAGG;IACH,0BAEC;IAED;;;OAGG;IACH,yBAEC;IAED,cAIC;IAED,aAEC;IAED,cAeC;IAED;;;OAGG;IACH,YAFa,MAAM,
|
|
1
|
+
{"version":3,"file":"Clock.d.ts","sourceRoot":"","sources":["../../../src/engine/Clock.js"],"names":[],"mappings":";AAcA;;GAEG;AACH;IAEI;;;;OAIG;IACH,0BAAsB;IAEtB;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,oBAAoB;IAGpB;;;;;;OAMG;IACH,gBAHU,IAAI,CAGM;IAMpB;;;OAGG;IACH,0BAEC;IAED;;;OAGG;IACH,yBAEC;IAED,cAIC;IAED,aAEC;IAED,cAeC;IAED;;;OAGG;IACH,YAFa,MAAM,CAIlB;IAED;;;;;;;;;;;;;OAaG;IACH,iBAHW,MAAM,GACJ,MAAM,CAalB;IAED;;;OAGG;IACH,qBAFa,MAAM,CAOlB;IAED;;;;OAIG;IACH,kBAFY,MAAM,CAIjB;IAED,cAGC;CACJ;iBAlKgB,4BAA4B"}
|
package/src/engine/Clock.js
CHANGED
|
@@ -4,9 +4,9 @@ import { current_time_in_seconds } from "../core/time/current_time_in_seconds.js
|
|
|
4
4
|
/**
|
|
5
5
|
*
|
|
6
6
|
* @param {Clock} clock
|
|
7
|
+
* @param {number} now in seconds, on the {@link current_time_in_seconds} timeline
|
|
7
8
|
*/
|
|
8
|
-
function updateElapsedTime(clock) {
|
|
9
|
-
const now = current_time_in_seconds();
|
|
9
|
+
function updateElapsedTime(clock, now) {
|
|
10
10
|
const delta = (now - clock.__lastMeasurement) * clock.speed;
|
|
11
11
|
clock.__lastMeasurement = now;
|
|
12
12
|
clock.elapsedTime += delta;
|
|
@@ -98,7 +98,7 @@ class Clock {
|
|
|
98
98
|
|
|
99
99
|
this.__isRunning = false;
|
|
100
100
|
//update time
|
|
101
|
-
updateElapsedTime(this);
|
|
101
|
+
updateElapsedTime(this, current_time_in_seconds());
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
/**
|
|
@@ -106,7 +106,31 @@ class Clock {
|
|
|
106
106
|
* @returns {number} in seconds
|
|
107
107
|
*/
|
|
108
108
|
getDelta() {
|
|
109
|
-
|
|
109
|
+
return this.getDeltaAt(current_time_in_seconds());
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* {@link getDelta}, measured to a given moment instead of to now - an animation frame's
|
|
114
|
+
* timestamp, so that the simulation shown by a frame is the simulation at that frame's time and
|
|
115
|
+
* not at whenever the code reading the clock happened to run.
|
|
116
|
+
*
|
|
117
|
+
* Only a moment between the clock's last reading and now can be measured to; anything else is
|
|
118
|
+
* measured to now. A frame's timestamp is when the frame began, so it can sit behind a reading
|
|
119
|
+
* taken earlier in that frame (a resume() from an input handler). And it is only on this
|
|
120
|
+
* clock's timeline where the environment keeps its promise that it is - jsdom stamps frames
|
|
121
|
+
* 1.5 s behind `performance.now()`, a `Date.now()` polyfill decades ahead - and measured to
|
|
122
|
+
* those, the clock froze or leapt.
|
|
123
|
+
* @param {number} time in seconds, on the {@link current_time_in_seconds} timeline
|
|
124
|
+
* @returns {number} in seconds
|
|
125
|
+
*/
|
|
126
|
+
getDeltaAt(time) {
|
|
127
|
+
if (this.__isRunning) {
|
|
128
|
+
const now = current_time_in_seconds();
|
|
129
|
+
|
|
130
|
+
updateElapsedTime(this, time >= this.__lastMeasurement && time <= now ? time : now);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const elapsedTime = this.elapsedTime;
|
|
110
134
|
const delta = elapsedTime - this.timeAtDelta;
|
|
111
135
|
this.timeAtDelta = elapsedTime;
|
|
112
136
|
return delta;
|
|
@@ -118,7 +142,7 @@ class Clock {
|
|
|
118
142
|
*/
|
|
119
143
|
updateElapsedTime() {
|
|
120
144
|
if (this.__isRunning) {
|
|
121
|
-
updateElapsedTime(this);
|
|
145
|
+
updateElapsedTime(this, current_time_in_seconds());
|
|
122
146
|
}
|
|
123
147
|
return this.elapsedTime;
|
|
124
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../../../src/engine/Engine.js"],"names":[],"mappings":";6BAqCa,OAAO,8BAA8B,EAAE,cAAc;AAwClE;
|
|
1
|
+
{"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../../../src/engine/Engine.js"],"names":[],"mappings":";6BAqCa,OAAO,8BAA8B,EAAE,cAAc;AAwClE;IA4FI;;;;;;;;;OASG;IACH,sBARW,cAAc;QAEU,aAAa,GAArC,aAAa;QACK,cAAc,GAAhC,OAAO;QACW,WAAW,GAA7B,OAAO;QACW,KAAK,GAAvB,OAAO;OAiPjB;IAtSD;;;OAGG;IACH,UAFU,cAAc,GAAC,IAAI,CAEb;IAEhB;;;OAGG;IACH,OAFU,WAAW,GAAC,IAAI,CAEb;IAEb,qBAA4B;IAE5B;;;;;;;;;OASG;IACH,0BAFU,uBAAuB,CAEe;IAEhD;;;OAGG;IACH,kBAFU,mBAAmB,CAEO;IAEpC;;;;OAIG;IACH,iBAFU,MAAM,CAEM;IAEtB;;;;OAIG;IACH,mBAFU,kBAAkB,CAEa;IAoBrC;;;OAGG;IACH,UAFU,cAAc,CAEA;IAKxB;;;OAGG;IACH,aAFU,gBAAgB,CAEe;IAGzC,yCAAkE;IAK9D,6BAAkC;IAMtC;;;OAGG;IACH,cAFU,aAAa,MAAM,CAAC,CAK5B;IAEF,8CAiCE;IAgCF;;;OAGG;IACH,SAFU,WAAW,CAEoB;IAEzC;;;OAGG;IACH,oCAA0C;IAE1C;;;OAGG;IACH,sCAFU,2BAA2B,CAE+B;IAEpE,yBAAoC;IAGpC;;OAEG;IACH,aAAkB;IAElB;;;OAGG;IACH,SAFU,OAAO,CAEwB;IAGzC,2BAAsC;IAuCtC;;;OAGG;IACH,KAFU,SAAS,CAEO;IAE1B;;;OAGG;IACH,uBAFU,YAAY,CAEqD;IAI3E;;;;;MAKC;IA8BD;;;OAGG;IACH,kBAFU,OAAO,CAEW;IAwIhC,wBAgCC;IApBG,oBAAwB;IAsB5B,2BA8CC;IAED,oBAiBC;IAED;;;OAGG;IACH,+CAUC;IAED,eAkDC;IAED;;;OAGG;IACH,sBA0GC;IAoBD;;OAEG;IACH,sBA+DC;IAED,aAEC;IAED;;OAEG;IACH,4BAOC;IAIL;;;OAGG;IACH,mBAFU,OAAO,CAEQ;;CAPxB;+BA94B8B,+BAA+B;wBAWtC,wBAAwB;0BArBtB,0CAA0C;wCAeN,iDAAiD;oCAG3E,iCAAiC;mBAElD,wBAAwB;+BAtBZ,gDAAgD;iCAO9C,+CAA+C;8BAGlD,wBAAwB;6BALzB,yBAAyB;uCAIf,6DAA6D;4BAUxE,0BAA0B;+BArBvB,iCAAiC;4CAapB,qDAAqD;AAgBjG;;GAEG;AAGH;IACI,gDAA2D;IAC3D,0BAAkC;IAClC,iCAAyC;CAC5C;6BAvC4B,sCAAsC;sBA4B7C,mBAAmB;yBAJhB,yBAAyB;8BALpB,kCAAkC;2BADrC,mCAAmC;8BAFhC,kCAAkC;8BAClC,kCAAkC;sBAb1C,+BAA+B;+BAKtB,qCAAqC;4BAPxC,kCAAkC;oBAH1C,yBAAyB"}
|
package/src/engine/Engine.js
CHANGED
|
@@ -86,11 +86,6 @@ class Engine {
|
|
|
86
86
|
*/
|
|
87
87
|
#last_render_simulation_time = 0;
|
|
88
88
|
|
|
89
|
-
/**
|
|
90
|
-
* Handle of the pending render-loop frame, `-1` when the loop is not running
|
|
91
|
-
* @type {number}
|
|
92
|
-
*/
|
|
93
|
-
#animation_frame_handle = -1;
|
|
94
89
|
|
|
95
90
|
/**
|
|
96
91
|
* Handle of the pending "pause the simulation, this outage is taking a while" timer, `-1` when none
|
|
@@ -699,14 +694,14 @@ class Engine {
|
|
|
699
694
|
scene's speed modifiers (see SceneManager), so a paused game holds its particles still
|
|
700
695
|
and a slowed one slows them. A wall-clock measurement would do neither.
|
|
701
696
|
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
697
|
+
Read, not advanced: a frame draws right after the ticker advanced the clock to the
|
|
698
|
+
frame's timestamp (see Ticker#onFrame), so this is the simulation time of the frame.
|
|
699
|
+
Advancing it here would step the renderer by however long that tick took to run.
|
|
705
700
|
|
|
706
701
|
Moved only when a frame is actually drawn, so simulation time that passes while
|
|
707
702
|
rendering is off is caught up by the next frame rather than lost.
|
|
708
703
|
*/
|
|
709
|
-
const simulation_time = this.ticker.clock.
|
|
704
|
+
const simulation_time = this.ticker.clock.getElapsedTime();
|
|
710
705
|
const time_delta_seconds = simulation_time - this.#last_render_simulation_time;
|
|
711
706
|
|
|
712
707
|
this.#last_render_simulation_time = simulation_time;
|
|
@@ -781,10 +776,9 @@ class Engine {
|
|
|
781
776
|
|
|
782
777
|
this.#last_frame_timestamp = performance.now();
|
|
783
778
|
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
this.#animation_frame_handle = requestAnimationFrame(this.#animation_frame);
|
|
779
|
+
// Drawn from the ticker's frame, after that frame's tick. A render loop of its own drew
|
|
780
|
+
// each frame before the tick, i.e. the simulation as of whenever the previous tick ran.
|
|
781
|
+
this.ticker.onFrame.add(this.#animation_frame);
|
|
788
782
|
|
|
789
783
|
//start simulation
|
|
790
784
|
this.ticker.start({ maxTimeout: 200 });
|
|
@@ -835,13 +829,12 @@ class Engine {
|
|
|
835
829
|
}
|
|
836
830
|
|
|
837
831
|
/**
|
|
838
|
-
* Fired every animation frame via {@link
|
|
832
|
+
* Fired every animation frame via {@link Ticker#onFrame}
|
|
839
833
|
*/
|
|
840
834
|
#animation_frame = () => {
|
|
841
835
|
|
|
842
836
|
const t0 = this.#last_frame_timestamp;
|
|
843
837
|
const t1 = performance.now();
|
|
844
|
-
this.#animation_frame_handle = requestAnimationFrame(this.#animation_frame);
|
|
845
838
|
this.render();
|
|
846
839
|
|
|
847
840
|
const frame_delay = (t1 - t0) / 1000;
|
|
@@ -865,10 +858,9 @@ class Engine {
|
|
|
865
858
|
// running, which would abort the whole teardown below
|
|
866
859
|
this.ticker.stop();
|
|
867
860
|
|
|
868
|
-
//
|
|
869
|
-
//
|
|
870
|
-
|
|
871
|
-
this.#animation_frame_handle = -1;
|
|
861
|
+
// which also ends the render loop, as it draws from the ticker's frames. Unsubscribed too,
|
|
862
|
+
// so a restart does not draw twice per frame
|
|
863
|
+
this.ticker.onFrame.remove(this.#animation_frame);
|
|
872
864
|
|
|
873
865
|
// the input devices the constructor started. The gamepad one polls on its own animation
|
|
874
866
|
// frame loop, so left alone it outlives the engine the same way the render loop would;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IKGoalSystem.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/ik/IKGoalSystem.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"IKGoalSystem.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/ik/IKGoalSystem.js"],"names":[],"mappings":"AA0OA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH;;IAEI,6DAA6C;IAE7C,kbASE;IAEF;;;OAGG;IACH,gBAFU,MAAM,CAEI;IAEpB;;;OAGG;IACH,WAFU,MAAM,CAEC;IAkDjB;;;;OAIG;IACH,WAJW,MAAM,cACN,mBAAmB,UACnB,MAAM,QAgChB;IAED;;;;OAIG;IACH,aAJW,MAAM,cACN,mBAAmB,UACnB,MAAM,QAkBhB;IAED,sCA+BC;;CA6nBJ;uBA1hCsB,cAAc;oCAED,gDAAgD;uBAQ7D,aAAa;4BAD7B,6BAA6B;4CA3BQ,oDAAoD;yCAEvD,uDAAuD;0BAQtE,2BAA2B;kCAEnB,6BAA6B;6BAIlC,2BAA2B;sBAPlC,4BAA4B"}
|
|
@@ -19,6 +19,7 @@ import { GPUStateAuthorityFlags } from "../gpu/GPUStateAuthorityFlags.js";
|
|
|
19
19
|
import { gpu_authority_hold } from "../gpu/gpu_authority_hold.js";
|
|
20
20
|
import { gpu_authority_unhold } from "../gpu/gpu_authority_unhold.js";
|
|
21
21
|
import { ParentEntity } from "../parent/ParentEntity.js";
|
|
22
|
+
import { parent_entity_model_of } from "../parent/parent_entity_model_of.js";
|
|
22
23
|
import { System } from "../System.js";
|
|
23
24
|
import { TRANSFORM_ATTACHMENT_EVENT_CHANGE } from "../transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js";
|
|
24
25
|
import { TransformAttachment } from "../transform-attachment/TransformAttachment.js";
|
|
@@ -354,8 +355,8 @@ export class IKGoalSystem extends System {
|
|
|
354
355
|
record.entity = entity;
|
|
355
356
|
record.goal = goal;
|
|
356
357
|
record.system = this;
|
|
357
|
-
record.model =
|
|
358
|
-
record.target_model = dataset.entityExists(goal.target) ?
|
|
358
|
+
record.model = parent_entity_model_of(dataset, entity);
|
|
359
|
+
record.target_model = dataset.entityExists(goal.target) ? parent_entity_model_of(dataset, goal.target) : -1;
|
|
359
360
|
|
|
360
361
|
this.#records.set(entity, record);
|
|
361
362
|
|
|
@@ -1071,23 +1072,6 @@ export class IKGoalSystem extends System {
|
|
|
1071
1072
|
}
|
|
1072
1073
|
}
|
|
1073
1074
|
|
|
1074
|
-
/**
|
|
1075
|
-
* The entity whose clips drive `entity`: the model its lifetime belongs to, or itself.
|
|
1076
|
-
*
|
|
1077
|
-
* @param {EntityComponentDataset} dataset
|
|
1078
|
-
* @param {number} entity
|
|
1079
|
-
* @returns {number}
|
|
1080
|
-
*/
|
|
1081
|
-
function model_of(dataset, entity) {
|
|
1082
|
-
const owner = dataset.getComponent(entity, ParentEntity);
|
|
1083
|
-
|
|
1084
|
-
if (owner === undefined || owner === null) {
|
|
1085
|
-
return entity;
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
|
-
return owner.entity;
|
|
1089
|
-
}
|
|
1090
|
-
|
|
1091
1075
|
/**
|
|
1092
1076
|
* Goals grouped by connected paths: two goals whose paths share a bone are solved together.
|
|
1093
1077
|
*
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The entity whose clips drive `entity`: the model its lifetime belongs to, or itself.
|
|
3
|
+
*
|
|
4
|
+
* A placed model's bones each carry a {@link ParentEntity} naming the model's root, and the root is
|
|
5
|
+
* where the model's clips and animation drivers live. So the model of a bone is one step up the
|
|
6
|
+
* lifetime edge, and an entity without one — a root, a prop, a hand-made rig — is its own model.
|
|
7
|
+
*
|
|
8
|
+
* One step, not a walk to the top: a model placed under another model is still its own model, with
|
|
9
|
+
* its own clips.
|
|
10
|
+
*
|
|
11
|
+
* @param {EntityComponentDataset} dataset
|
|
12
|
+
* @param {number} entity
|
|
13
|
+
* @returns {number} the model entity; `entity` itself when it has no {@link ParentEntity}, or one
|
|
14
|
+
* naming no entity yet (`-1`)
|
|
15
|
+
*/
|
|
16
|
+
export function parent_entity_model_of(dataset: EntityComponentDataset, entity: number): number;
|
|
17
|
+
//# sourceMappingURL=parent_entity_model_of.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parent_entity_model_of.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/parent/parent_entity_model_of.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,gFAJW,MAAM,GACJ,MAAM,CAWlB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ParentEntity } from "./ParentEntity.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The entity whose clips drive `entity`: the model its lifetime belongs to, or itself.
|
|
5
|
+
*
|
|
6
|
+
* A placed model's bones each carry a {@link ParentEntity} naming the model's root, and the root is
|
|
7
|
+
* where the model's clips and animation drivers live. So the model of a bone is one step up the
|
|
8
|
+
* lifetime edge, and an entity without one — a root, a prop, a hand-made rig — is its own model.
|
|
9
|
+
*
|
|
10
|
+
* One step, not a walk to the top: a model placed under another model is still its own model, with
|
|
11
|
+
* its own clips.
|
|
12
|
+
*
|
|
13
|
+
* @param {EntityComponentDataset} dataset
|
|
14
|
+
* @param {number} entity
|
|
15
|
+
* @returns {number} the model entity; `entity` itself when it has no {@link ParentEntity}, or one
|
|
16
|
+
* naming no entity yet (`-1`)
|
|
17
|
+
*/
|
|
18
|
+
export function parent_entity_model_of(dataset, entity) {
|
|
19
|
+
const owner = dataset.getComponent(entity, ParentEntity);
|
|
20
|
+
|
|
21
|
+
if (owner === undefined || owner === null || owner.entity < 0) {
|
|
22
|
+
return entity;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return owner.entity;
|
|
26
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pack a transform's rigid pose, `[tx, ty, tz, qx, qy, qz, qw]`, into an array: the translation and
|
|
3
|
+
* the rotation, without the scale or the matrix.
|
|
4
|
+
*
|
|
5
|
+
* Seven floats is the shape a contact kernel, an oriented box transform or a cloth holder takes a
|
|
6
|
+
* pose in. Read off the transform's lanes (a {@link Transform64} is a `Float64Array`) rather than
|
|
7
|
+
* through `translation_x` and the rest: a hot caller that does not inline those accessor calls gets
|
|
8
|
+
* each number back boxed, and the vector getters allocate outright.
|
|
9
|
+
*
|
|
10
|
+
* @param {number[]|Float32Array|Float64Array} out
|
|
11
|
+
* @param {number} out_offset receives 7 floats
|
|
12
|
+
* @param {Transform64|Float64Array} transform a `Transform64`, or an array in its layout
|
|
13
|
+
*/
|
|
14
|
+
export function t64_read_pose_array(out: number[] | Float32Array | Float64Array, out_offset: number, transform: Transform64 | Float64Array): void;
|
|
15
|
+
//# sourceMappingURL=t64_read_pose_array.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"t64_read_pose_array.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/transform/t64_read_pose_array.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,yCAJW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,aACN,cAAY,YAAY,QAUlC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { TRANSFORM64_ROTATION_OFFSET, TRANSFORM64_TRANSLATION_OFFSET } from "./Transform64.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Pack a transform's rigid pose, `[tx, ty, tz, qx, qy, qz, qw]`, into an array: the translation and
|
|
5
|
+
* the rotation, without the scale or the matrix.
|
|
6
|
+
*
|
|
7
|
+
* Seven floats is the shape a contact kernel, an oriented box transform or a cloth holder takes a
|
|
8
|
+
* pose in. Read off the transform's lanes (a {@link Transform64} is a `Float64Array`) rather than
|
|
9
|
+
* through `translation_x` and the rest: a hot caller that does not inline those accessor calls gets
|
|
10
|
+
* each number back boxed, and the vector getters allocate outright.
|
|
11
|
+
*
|
|
12
|
+
* @param {number[]|Float32Array|Float64Array} out
|
|
13
|
+
* @param {number} out_offset receives 7 floats
|
|
14
|
+
* @param {Transform64|Float64Array} transform a `Transform64`, or an array in its layout
|
|
15
|
+
*/
|
|
16
|
+
export function t64_read_pose_array(out, out_offset, transform) {
|
|
17
|
+
out[out_offset] = transform[TRANSFORM64_TRANSLATION_OFFSET];
|
|
18
|
+
out[out_offset + 1] = transform[TRANSFORM64_TRANSLATION_OFFSET + 1];
|
|
19
|
+
out[out_offset + 2] = transform[TRANSFORM64_TRANSLATION_OFFSET + 2];
|
|
20
|
+
out[out_offset + 3] = transform[TRANSFORM64_ROTATION_OFFSET];
|
|
21
|
+
out[out_offset + 4] = transform[TRANSFORM64_ROTATION_OFFSET + 1];
|
|
22
|
+
out[out_offset + 5] = transform[TRANSFORM64_ROTATION_OFFSET + 2];
|
|
23
|
+
out[out_offset + 6] = transform[TRANSFORM64_ROTATION_OFFSET + 3];
|
|
24
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the geometry on this entity deforms: the joints its vertices are weighted to, as entities,
|
|
3
|
+
* and where each joint stood when the mesh was bound to it.
|
|
4
|
+
*
|
|
5
|
+
* **It describes the mesh, so it lives on the mesh entity.** The geometry's per-vertex joint indices
|
|
6
|
+
* index {@link joints}, and an inverse bind belongs to the pair (this mesh, that joint) — one joint
|
|
7
|
+
* can bind with different matrices in different skins. The joints are entities like any other: a
|
|
8
|
+
* clip, IK, a ragdoll or a cloth moves them, and the skin follows.
|
|
9
|
+
*
|
|
10
|
+
* The geometry beside it says it draws a deformed clone (`ShadedGeometryFlags.Skinned`); without
|
|
11
|
+
* that it draws the shared source and nothing would deform. `MeshSkinSystem` deforms it; a model
|
|
12
|
+
* loaded by `MeshSystem` carries one on each skinned primitive, and code builds one the same way.
|
|
13
|
+
*
|
|
14
|
+
* **Replaced, never edited.** A skin is registered once with the joints and matrices it has then;
|
|
15
|
+
* to change either, take the component off and put another on. Meshes of one model that share a
|
|
16
|
+
* skeleton and bind it the same way — a body and its hair — share one registration on the GPU,
|
|
17
|
+
* whether or not they share the arrays.
|
|
18
|
+
*
|
|
19
|
+
* **Not saved**, for the reason {@link ShadedGeometry} is not: the joint indices address the vertex
|
|
20
|
+
* attribute of a geometry no save holds, so whatever builds the geometry builds its skin.
|
|
21
|
+
*
|
|
22
|
+
* @author Alex Goldring
|
|
23
|
+
* @copyright Company Named Limited (c) 2026
|
|
24
|
+
*/
|
|
25
|
+
export class MeshSkin {
|
|
26
|
+
/**
|
|
27
|
+
* @param {Int32Array} joints entities
|
|
28
|
+
* @param {Float32Array} inverse_bind_matrices `joints.length` × 16
|
|
29
|
+
* @returns {MeshSkin}
|
|
30
|
+
*/
|
|
31
|
+
static from(joints: Int32Array, inverse_bind_matrices: Float32Array): MeshSkin;
|
|
32
|
+
/**
|
|
33
|
+
* The joints, as entities, in the order the geometry's per-vertex joint indices address them.
|
|
34
|
+
* Read-only once the component is on an entity.
|
|
35
|
+
*
|
|
36
|
+
* @type {Int32Array}
|
|
37
|
+
*/
|
|
38
|
+
joints: Int32Array;
|
|
39
|
+
/**
|
|
40
|
+
* `joints.length` × 16 column-major matrices, flat: joint `j`'s at `[j * 16, j * 16 + 16)`, taking
|
|
41
|
+
* a vertex from the mesh's frame into the joint's at bind. Read-only, and shared — a model's
|
|
42
|
+
* placements all hold the one array their prefab compiled.
|
|
43
|
+
*
|
|
44
|
+
* @type {Float32Array}
|
|
45
|
+
*/
|
|
46
|
+
inverse_bind_matrices: Float32Array;
|
|
47
|
+
/**
|
|
48
|
+
* @readonly
|
|
49
|
+
* @type {boolean}
|
|
50
|
+
*/
|
|
51
|
+
readonly isMeshSkin: boolean;
|
|
52
|
+
}
|
|
53
|
+
export namespace MeshSkin {
|
|
54
|
+
let typeName: string;
|
|
55
|
+
let serializable: boolean;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=MeshSkin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeshSkin.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/ecs/mesh-v2/MeshSkin.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;IAkBI;;;;OAIG;IACH,oBAJW,UAAU,yBACV,YAAY,GACV,QAAQ,CAiBpB;IArCD;;;;;OAKG;IACH,QAFU,UAAU,CAEO;IAE3B;;;;;;OAMG;IACH,uBAFU,YAAY,CAEsB;IAyBhD;;;OAGG;IACH,qBAFU,OAAO,CAEY;CAN5B;;kBAUS,MAAM;sBAMN,OAAO"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* How the geometry on this entity deforms: the joints its vertices are weighted to, as entities,
|
|
5
|
+
* and where each joint stood when the mesh was bound to it.
|
|
6
|
+
*
|
|
7
|
+
* **It describes the mesh, so it lives on the mesh entity.** The geometry's per-vertex joint indices
|
|
8
|
+
* index {@link joints}, and an inverse bind belongs to the pair (this mesh, that joint) — one joint
|
|
9
|
+
* can bind with different matrices in different skins. The joints are entities like any other: a
|
|
10
|
+
* clip, IK, a ragdoll or a cloth moves them, and the skin follows.
|
|
11
|
+
*
|
|
12
|
+
* The geometry beside it says it draws a deformed clone (`ShadedGeometryFlags.Skinned`); without
|
|
13
|
+
* that it draws the shared source and nothing would deform. `MeshSkinSystem` deforms it; a model
|
|
14
|
+
* loaded by `MeshSystem` carries one on each skinned primitive, and code builds one the same way.
|
|
15
|
+
*
|
|
16
|
+
* **Replaced, never edited.** A skin is registered once with the joints and matrices it has then;
|
|
17
|
+
* to change either, take the component off and put another on. Meshes of one model that share a
|
|
18
|
+
* skeleton and bind it the same way — a body and its hair — share one registration on the GPU,
|
|
19
|
+
* whether or not they share the arrays.
|
|
20
|
+
*
|
|
21
|
+
* **Not saved**, for the reason {@link ShadedGeometry} is not: the joint indices address the vertex
|
|
22
|
+
* attribute of a geometry no save holds, so whatever builds the geometry builds its skin.
|
|
23
|
+
*
|
|
24
|
+
* @author Alex Goldring
|
|
25
|
+
* @copyright Company Named Limited (c) 2026
|
|
26
|
+
*/
|
|
27
|
+
export class MeshSkin {
|
|
28
|
+
/**
|
|
29
|
+
* The joints, as entities, in the order the geometry's per-vertex joint indices address them.
|
|
30
|
+
* Read-only once the component is on an entity.
|
|
31
|
+
*
|
|
32
|
+
* @type {Int32Array}
|
|
33
|
+
*/
|
|
34
|
+
joints = new Int32Array(0);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* `joints.length` × 16 column-major matrices, flat: joint `j`'s at `[j * 16, j * 16 + 16)`, taking
|
|
38
|
+
* a vertex from the mesh's frame into the joint's at bind. Read-only, and shared — a model's
|
|
39
|
+
* placements all hold the one array their prefab compiled.
|
|
40
|
+
*
|
|
41
|
+
* @type {Float32Array}
|
|
42
|
+
*/
|
|
43
|
+
inverse_bind_matrices = new Float32Array(0);
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @param {Int32Array} joints entities
|
|
47
|
+
* @param {Float32Array} inverse_bind_matrices `joints.length` × 16
|
|
48
|
+
* @returns {MeshSkin}
|
|
49
|
+
*/
|
|
50
|
+
static from(joints, inverse_bind_matrices) {
|
|
51
|
+
assert.equal(joints instanceof Int32Array, true, 'joints must be an Int32Array of entities');
|
|
52
|
+
assert.greaterThanOrEqual(joints.length, 1, 'a skin has at least one joint');
|
|
53
|
+
assert.equal(inverse_bind_matrices instanceof Float32Array, true, 'inverse_bind_matrices must be a Float32Array');
|
|
54
|
+
assert.equal(
|
|
55
|
+
inverse_bind_matrices.length, joints.length * 16,
|
|
56
|
+
'inverse_bind_matrices.length !== joints.length * 16'
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const r = new MeshSkin();
|
|
60
|
+
|
|
61
|
+
r.joints = joints;
|
|
62
|
+
r.inverse_bind_matrices = inverse_bind_matrices;
|
|
63
|
+
|
|
64
|
+
return r;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @readonly
|
|
70
|
+
* @type {boolean}
|
|
71
|
+
*/
|
|
72
|
+
MeshSkin.prototype.isMeshSkin = true;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @readonly
|
|
76
|
+
* @type {string}
|
|
77
|
+
*/
|
|
78
|
+
MeshSkin.typeName = "MeshSkin";
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @readonly
|
|
82
|
+
* @type {boolean}
|
|
83
|
+
*/
|
|
84
|
+
MeshSkin.serializable = false;
|