@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
|
@@ -1,509 +1,502 @@
|
|
|
1
|
-
import Vector3 from "../../../core/geom/Vector3.js";
|
|
2
|
-
import { DEG_TO_RAD } from "../../../core/math/DEG_TO_RAD.js";
|
|
3
|
-
import ConcurrentExecutor from "../../../core/process/executor/ConcurrentExecutor.js";
|
|
4
|
-
import { AssetManager } from "../../../engine/asset/AssetManager.js";
|
|
5
|
-
import { GameAssetType } from "../../../engine/asset/GameAssetType.js";
|
|
6
|
-
import { ArrayBufferLoader } from "../../../engine/asset/loaders/ArrayBufferLoader.js";
|
|
7
|
-
import {
|
|
8
|
-
GLTFSceneBundleAssetLoader
|
|
9
|
-
} from "../../../engine/asset/loaders/GLTFSceneBundleAssetLoader.js";
|
|
10
|
-
import { ImageBitmapAssetLoader } from "../../../engine/asset/loaders/image/ImageBitmapAssetLoader.js";
|
|
11
|
-
import { load_model_scene_bundle } from "../../../engine/asset/load_model_scene_bundle.js";
|
|
12
|
-
import { EntityComponentDataset } from "../../../engine/ecs/EntityComponentDataset.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* `
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* to
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
*
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
*
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
/** skin registered
|
|
117
|
-
|
|
118
|
-
/** skin registered, the
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
manager.
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
* @param {
|
|
161
|
-
* @
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
const
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
renderer
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
);
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
await
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
element('animation').
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
renderer.
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
renderer.render(camera, scene, animating ? time_delta_s : 0);
|
|
504
|
-
|
|
505
|
-
stats_element.textContent =
|
|
506
|
-
`${count} × skin=${skin_mode}`
|
|
507
|
-
+ `${renderer.feature_path_tracing_enabled ? ' · path traced' : ' · rasterized'}`;
|
|
508
|
-
}, FRAME_RATE_LIMIT);
|
|
509
|
-
}
|
|
1
|
+
import Vector3 from "../../../core/geom/Vector3.js";
|
|
2
|
+
import { DEG_TO_RAD } from "../../../core/math/DEG_TO_RAD.js";
|
|
3
|
+
import ConcurrentExecutor from "../../../core/process/executor/ConcurrentExecutor.js";
|
|
4
|
+
import { AssetManager } from "../../../engine/asset/AssetManager.js";
|
|
5
|
+
import { GameAssetType } from "../../../engine/asset/GameAssetType.js";
|
|
6
|
+
import { ArrayBufferLoader } from "../../../engine/asset/loaders/ArrayBufferLoader.js";
|
|
7
|
+
import {
|
|
8
|
+
GLTFSceneBundleAssetLoader
|
|
9
|
+
} from "../../../engine/asset/loaders/GLTFSceneBundleAssetLoader.js";
|
|
10
|
+
import { ImageBitmapAssetLoader } from "../../../engine/asset/loaders/image/ImageBitmapAssetLoader.js";
|
|
11
|
+
import { load_model_scene_bundle } from "../../../engine/asset/load_model_scene_bundle.js";
|
|
12
|
+
import { EntityComponentDataset } from "../../../engine/ecs/EntityComponentDataset.js";
|
|
13
|
+
import { MeshSkin } from "../../../engine/graphics/ecs/mesh-v2/MeshSkin.js";
|
|
14
|
+
import { AnimationClips } from "../../../engine/graphics3/animation/AnimationClips.js";
|
|
15
|
+
import { prefab_compile } from "../../../engine/graphics3/prefab/prefab_compile.js";
|
|
16
|
+
import { AnimationClipFlags } from "../../renderer/animation/AnimationClipFlags.js";
|
|
17
|
+
import { camera_frame_sphere } from "../../renderer/camera/camera_frame_sphere.js";
|
|
18
|
+
import { OrbitalCameraController } from "../../renderer/camera/OrbitalCameraController.js";
|
|
19
|
+
import { PerspectiveCamera } from "../../renderer/camera/PerspectiveCamera.js";
|
|
20
|
+
import { create_frame_loop } from "../../renderer/create_frame_loop.js";
|
|
21
|
+
import { make_sunlight } from "../../renderer/light/make_sunlight.js";
|
|
22
|
+
import { place_light } from "../../renderer/light/place_light.js";
|
|
23
|
+
import { Renderer } from "../../renderer/Renderer.js";
|
|
24
|
+
import { row_of_entity } from "../../renderer/scene/rows/GPUSceneRows.js";
|
|
25
|
+
import { Scene } from "../../renderer/scene/Scene.js";
|
|
26
|
+
import { load_default_environment } from "../load_default_environment.js";
|
|
27
|
+
import { grid_position, place_character } from "../skinned_blas_refit/place_character.js";
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A skinned character, loaded the way the game loads one, with the pieces that could be making soup
|
|
31
|
+
* put on switches.
|
|
32
|
+
*
|
|
33
|
+
* ## Why this page exists next to `skinned_blas_refit`
|
|
34
|
+
*
|
|
35
|
+
* That page renders the same character and answers a sharp question about the BLAS — does the tree
|
|
36
|
+
* follow the mesh — with `verify()`. It answers that question *numerically*, by holding the tree's
|
|
37
|
+
* root box against the bounds chain's box over the same deformed vertices, and both of those are
|
|
38
|
+
* derived from the clone's vertex region. **Vertices that are wrong in the same way agree with each
|
|
39
|
+
* other perfectly.** So a refit can be correct, `verify()` green, every internal node exactly its
|
|
40
|
+
* children's union — and the picture still soup, because the thing the tree faithfully bounds is
|
|
41
|
+
* itself wrong.
|
|
42
|
+
*
|
|
43
|
+
* This page is that other question, and it is built to bisect it rather than to look good:
|
|
44
|
+
*
|
|
45
|
+
* - **`?skin=off`** — no skin registered. A skinned mesh entity still gets a vertex clone (see
|
|
46
|
+
* {@link GPUMeshSkinningContext#obtain_clone}), but nothing ever deforms it, so what is drawn is
|
|
47
|
+
* the memcpy of the source: the rest pose, under the mesh entity's row — which the prefab put
|
|
48
|
+
* into the skin's own frame. Soup here is the geometry upload — the meshlet copy or its address
|
|
49
|
+
* patch — and has nothing to do with skinning.
|
|
50
|
+
* - **`?skin=bind`** — the skin registered, no clip. The skinning pass runs every frame over a pose
|
|
51
|
+
* that never changes, and the answer it should write is one the CPU knows exactly. `diagnose()`
|
|
52
|
+
* in the console reads the clone's vertices back and says which of them are wrong and in what
|
|
53
|
+
* pattern — see {@link verify_clone_vertices}. Soup here is the skinning machinery.
|
|
54
|
+
* - **`?skin=animated`** — the dance, as `skinned_blas_refit` runs it. Soup only here is the pose:
|
|
55
|
+
* the joint matrices, their range, or the order the skin's joints were resolved in.
|
|
56
|
+
*
|
|
57
|
+
* ## What the bisect found, and what was done
|
|
58
|
+
*
|
|
59
|
+
* `chunk_skin_blend_mesh_local` folds `inverse(mesh.transform_global)` into each joint matrix and
|
|
60
|
+
* converts the product to a dual quaternion, which can only carry a rigid motion. Michelle's
|
|
61
|
+
* positions and inverse-bind matrices are authored in the already-scaled space, so
|
|
62
|
+
* `joint.global × inverse_bind` is the *identity* and the fold was a bare 100×.
|
|
63
|
+
* `dual_quat_from_m4` reads `sqrt(max(0, 1 ± m00 ± m11 ± m22))` over terms of `1 + 100·(…)`, clamps
|
|
64
|
+
* whichever go negative and normalizes the rest, so the rotation it extracted was wrong — and wrong
|
|
65
|
+
* differently per joint, which is what tore the mesh apart. `?skin=bind` was the right character at
|
|
66
|
+
* 1/100 size (one shared matrix, one shared error) and `?skin=animated` was soup.
|
|
67
|
+
*
|
|
68
|
+
* The frame is now the engine's rather than the asset's: compiling a model puts each skinned mesh
|
|
69
|
+
* on its skin's own bind transform, so the fold is the identity at bind and a rigid displacement
|
|
70
|
+
* under a clip, for every shape a glTF file arrives in. See
|
|
71
|
+
* `renderer/animation/SKINNING_FRAME_PLAN.md`.
|
|
72
|
+
*
|
|
73
|
+
* All of which was established without a device — `__soup_blend_probe.spec.js` runs the shader's own
|
|
74
|
+
* blend over this character's own matrices, and the emulator tier in
|
|
75
|
+
* `chunk_skin_blend_mesh_local.spec.js` runs the real WGSL over both shapes. This page is where that
|
|
76
|
+
* is confirmed against pixels, which by then is a formality.
|
|
77
|
+
*
|
|
78
|
+
* ## Why through the asset framework
|
|
79
|
+
*
|
|
80
|
+
* `skinned_blas_refit` calls `load_gltf` directly and parses the file once per character.
|
|
81
|
+
* {@link GLTFSceneBundleAssetLoader} is what the game and the editor register, and it hands **the
|
|
82
|
+
* same bundle** to every caller — so a second character is not a second parse, it is
|
|
83
|
+
* `prefab_instantiate` over the prefab compiled from it once: its own entities, its own skins bound
|
|
84
|
+
* to those entities' joints, its own clips retargeted onto them, sharing the geometry and the
|
|
85
|
+
* inverse-bind matrices. That is a
|
|
86
|
+
* materially different path into the renderer, and running the repro on it means a fix found here
|
|
87
|
+
* is a fix for the engine rather than for one prototype page.
|
|
88
|
+
*
|
|
89
|
+
* Runs under the dev server (`npm run dev`), which serves `test_assets/`.
|
|
90
|
+
*
|
|
91
|
+
* @author Alex Goldring
|
|
92
|
+
* @copyright Company Named Limited (c) 2026
|
|
93
|
+
*/
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Served by the dev server out of `test_assets/`, which is gitignored and unpublished. See
|
|
97
|
+
* `test_assets/README.md`.
|
|
98
|
+
*
|
|
99
|
+
* @type {string}
|
|
100
|
+
*/
|
|
101
|
+
const CHARACTER_URL = '/test_assets/Michelle.glb';
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* How far apart characters stand, in character heights.
|
|
105
|
+
*
|
|
106
|
+
* @type {number}
|
|
107
|
+
*/
|
|
108
|
+
const SPACING = 1.1;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* How the skin is driven. The page's whole point is that these are three different questions.
|
|
112
|
+
*
|
|
113
|
+
* @enum {string}
|
|
114
|
+
*/
|
|
115
|
+
const SkinMode = {
|
|
116
|
+
/** no skin registered — the clone is never deformed */
|
|
117
|
+
Off: 'off',
|
|
118
|
+
/** skin registered, no clip — the pose the CPU can predict */
|
|
119
|
+
Bind: 'bind',
|
|
120
|
+
/** skin registered, the file's dance bound and playing */
|
|
121
|
+
Animated: 'animated',
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* The manager a model load needs, registered the way the game's graphics profile registers it.
|
|
126
|
+
*
|
|
127
|
+
* Not {@link make_playground_asset_manager}: that one is the two-loader subset `load_gltf` needs
|
|
128
|
+
* when a page calls it by hand. Going through {@link load_model_scene_bundle} means the *model* is
|
|
129
|
+
* an asset too, which is the thing this page wants to be on.
|
|
130
|
+
*
|
|
131
|
+
* @returns {Promise<AssetManager>}
|
|
132
|
+
*/
|
|
133
|
+
async function make_asset_manager() {
|
|
134
|
+
const manager = new AssetManager({
|
|
135
|
+
context: {},
|
|
136
|
+
executor: new ConcurrentExecutor(),
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// One instance for both glTF types, as `addModelLoaders` does — the loader holds no per-type
|
|
140
|
+
// state, and the two types are `.glb` and `.gltf` telling themselves apart.
|
|
141
|
+
const models = new GLTFSceneBundleAssetLoader();
|
|
142
|
+
|
|
143
|
+
await manager.registerLoader(GameAssetType.ModelGLTF, models);
|
|
144
|
+
await manager.registerLoader(GameAssetType.ModelGLTF_JSON, models);
|
|
145
|
+
|
|
146
|
+
// the container's `.bin` buffers, and its images — `load_gltf` asks for both back through the
|
|
147
|
+
// manager rather than fetching them itself
|
|
148
|
+
await manager.registerLoader(GameAssetType.ArrayBuffer, new ArrayBufferLoader());
|
|
149
|
+
await manager.registerLoader(GameAssetType.ImageBitmap, new ImageBitmapAssetLoader());
|
|
150
|
+
|
|
151
|
+
manager.startup();
|
|
152
|
+
|
|
153
|
+
return manager;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Every mesh entity of an instance that a skin deforms: the ones carrying a `MeshSkin`, which is
|
|
158
|
+
* exactly what gets registered and bound.
|
|
159
|
+
*
|
|
160
|
+
* @param {EntityComponentDataset} dataset
|
|
161
|
+
* @param {PrefabInstance} instance
|
|
162
|
+
* @returns {number[]}
|
|
163
|
+
*/
|
|
164
|
+
function skinned_meshes_of(dataset, instance) {
|
|
165
|
+
return Array.from(instance.mesh_entities).filter(entity => dataset.getComponent(entity, MeshSkin) !== undefined);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* The world-space box the renderer culls and traces this mesh by — the `meshes` table row, which
|
|
170
|
+
* the skinning pass's bounds-refresh chain rewrites every frame from the vertices it just moved.
|
|
171
|
+
*
|
|
172
|
+
* Not the source geometry's box under the mesh entity's transform: that is the rest pose, and
|
|
173
|
+
* the dance has moved on from it.
|
|
174
|
+
*
|
|
175
|
+
* @param {GPUSceneContext} scene_context
|
|
176
|
+
* @param {number} entity a mesh entity
|
|
177
|
+
* @returns {Promise<{low: Vector3, high: Vector3}>}
|
|
178
|
+
*/
|
|
179
|
+
async function world_bounds_of(scene_context, entity) {
|
|
180
|
+
const row = row_of_entity(entity);
|
|
181
|
+
|
|
182
|
+
const record = await scene_context.scene_database.debug_table_read_element('meshes', row);
|
|
183
|
+
|
|
184
|
+
const box = record.bounding_box;
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
low: new Vector3(box[0], box[1], box[2]),
|
|
188
|
+
high: new Vector3(box[3], box[4], box[5]),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Stand the page up.
|
|
194
|
+
*
|
|
195
|
+
* @returns {Promise<void>}
|
|
196
|
+
*/
|
|
197
|
+
export async function start() {
|
|
198
|
+
|
|
199
|
+
const element = id => document.getElementById(id);
|
|
200
|
+
|
|
201
|
+
const status_element = element('status');
|
|
202
|
+
const stats_element = element('stats');
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* @param {string} text
|
|
206
|
+
* @param {string} [kind]
|
|
207
|
+
*/
|
|
208
|
+
function set_status(text, kind = '') {
|
|
209
|
+
status_element.textContent = text;
|
|
210
|
+
status_element.className = kind;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const canvas = element('view');
|
|
214
|
+
|
|
215
|
+
const context = canvas.getContext('webgpu');
|
|
216
|
+
|
|
217
|
+
if (context === null) {
|
|
218
|
+
set_status(
|
|
219
|
+
'no WebGPU context — this browser has none, or the page is not a secure context',
|
|
220
|
+
'fail'
|
|
221
|
+
);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// ---- what the url asks for ------------------------------------------------------------------
|
|
226
|
+
|
|
227
|
+
const parameters = new URLSearchParams(location.search);
|
|
228
|
+
|
|
229
|
+
const count = Math.min(64, Math.max(1, Number.parseInt(parameters.get('count'), 10) || 1));
|
|
230
|
+
|
|
231
|
+
const skin_mode = Object.values(SkinMode).includes(parameters.get('skin'))
|
|
232
|
+
? parameters.get('skin')
|
|
233
|
+
: SkinMode.Animated;
|
|
234
|
+
|
|
235
|
+
const tracing = parameters.get('trace') === '1';
|
|
236
|
+
|
|
237
|
+
element('character_count').value = String(count);
|
|
238
|
+
element('skin_mode').value = skin_mode;
|
|
239
|
+
element('path_tracing').checked = tracing;
|
|
240
|
+
|
|
241
|
+
// A Scene has no teardown, so changing any of these reloads the page rather than emptying one
|
|
242
|
+
// in place. Every switch is in the url for the same reason a repro is a url: it can be sent.
|
|
243
|
+
function reload_with(changes) {
|
|
244
|
+
const next = new URLSearchParams(location.search);
|
|
245
|
+
|
|
246
|
+
for (const [key, value] of Object.entries(changes)) {
|
|
247
|
+
next.set(key, value);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
location.search = next.toString();
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
element('respawn').addEventListener('click', () => reload_with({
|
|
254
|
+
count: element('character_count').value,
|
|
255
|
+
skin: element('skin_mode').value,
|
|
256
|
+
}));
|
|
257
|
+
|
|
258
|
+
element('skin_mode').addEventListener('change', () => reload_with({
|
|
259
|
+
skin: element('skin_mode').value,
|
|
260
|
+
}));
|
|
261
|
+
|
|
262
|
+
// ---- the renderer ---------------------------------------------------------------------------
|
|
263
|
+
|
|
264
|
+
const renderer = new Renderer();
|
|
265
|
+
|
|
266
|
+
set_status('acquiring a device…');
|
|
267
|
+
|
|
268
|
+
await renderer.initialize({ context });
|
|
269
|
+
|
|
270
|
+
if (!renderer.graphics.device.features.has('subgroups')) {
|
|
271
|
+
set_status('device has no `subgroups`, which this engine takes as a baseline', 'warn');
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const camera = new PerspectiveCamera();
|
|
275
|
+
|
|
276
|
+
camera.near = 0.01;
|
|
277
|
+
camera.far = 200;
|
|
278
|
+
camera.fov = 50 * DEG_TO_RAD;
|
|
279
|
+
camera.aspect = renderer.aspect_ratio;
|
|
280
|
+
|
|
281
|
+
const scene = new Scene();
|
|
282
|
+
|
|
283
|
+
// the characters are entities, and the scene's rows are theirs
|
|
284
|
+
const dataset = new EntityComponentDataset();
|
|
285
|
+
|
|
286
|
+
scene.dataset = dataset;
|
|
287
|
+
|
|
288
|
+
// document.body rather than the canvas: the controller starts a keyboard device, and only a
|
|
289
|
+
// focusable element receives key events — body carries tabindex for exactly that.
|
|
290
|
+
const controller = new OrbitalCameraController(camera, document.body);
|
|
291
|
+
|
|
292
|
+
// Rasterized by default. It is the simpler of the two readings — it reads the deformed vertices
|
|
293
|
+
// directly, with no tree in the way — so it is the one to establish the answer on first.
|
|
294
|
+
renderer.feature_path_tracing_enabled = tracing;
|
|
295
|
+
renderer.feature_taa_enabled = false;
|
|
296
|
+
|
|
297
|
+
element('path_tracing').addEventListener('change', event => {
|
|
298
|
+
renderer.feature_path_tracing_enabled = event.target.checked;
|
|
299
|
+
renderer.indicate_view_change();
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
globalThis.renderer = renderer;
|
|
303
|
+
globalThis.scene = scene;
|
|
304
|
+
globalThis.camera = camera;
|
|
305
|
+
globalThis.controller = controller;
|
|
306
|
+
|
|
307
|
+
// ---- the cast -------------------------------------------------------------------------------
|
|
308
|
+
|
|
309
|
+
set_status(`loading ${CHARACTER_URL} …`);
|
|
310
|
+
|
|
311
|
+
const scene_context = renderer.scenes.obtain(scene);
|
|
312
|
+
|
|
313
|
+
/** @type {number[]} the skinned mesh entities */
|
|
314
|
+
const characters = [];
|
|
315
|
+
|
|
316
|
+
try {
|
|
317
|
+
const asset_manager = await make_asset_manager();
|
|
318
|
+
|
|
319
|
+
// One load and one compile, whatever the count: the asset hands out the model itself, and
|
|
320
|
+
// a placement is `prefab_instantiate` over the prefab compiled from it.
|
|
321
|
+
const bundle = await load_model_scene_bundle(asset_manager, CHARACTER_URL);
|
|
322
|
+
|
|
323
|
+
const prefab = prefab_compile(bundle);
|
|
324
|
+
|
|
325
|
+
const animations = scene_context.animation_manager;
|
|
326
|
+
|
|
327
|
+
for (let i = 0; i < count; i++) {
|
|
328
|
+
const { x, z } = grid_position(i, count, SPACING);
|
|
329
|
+
|
|
330
|
+
const { root, instance } = place_character(scene_context, dataset, prefab, x, z, {
|
|
331
|
+
register_animation: skin_mode !== SkinMode.Off,
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
const meshes = skinned_meshes_of(dataset, instance);
|
|
335
|
+
|
|
336
|
+
if (meshes.length === 0) {
|
|
337
|
+
throw new Error(`${CHARACTER_URL} has no skinned mesh`);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
if (skin_mode === SkinMode.Animated) {
|
|
341
|
+
// One clip, looping, at full weight. The pose accumulator sums every *bound* clip
|
|
342
|
+
// whatever its weight, so binding the T-pose alongside the dance would blend the
|
|
343
|
+
// two — only what should play is registered.
|
|
344
|
+
const clips = dataset.getComponent(root, AnimationClips).clips;
|
|
345
|
+
const clip = clips.find(candidate => /samba|dance/i.test(candidate.name ?? '')) ?? clips[0];
|
|
346
|
+
|
|
347
|
+
if (clip !== undefined) {
|
|
348
|
+
const clip_id = animations.register_clip(clip);
|
|
349
|
+
|
|
350
|
+
animations.set_playback_weight(clip_id, 1);
|
|
351
|
+
animations.set_flags(clip_id, AnimationClipFlags.Loop);
|
|
352
|
+
animations.start(clip_id);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
characters.push(...meshes);
|
|
357
|
+
}
|
|
358
|
+
} catch (error) {
|
|
359
|
+
set_status(
|
|
360
|
+
`could not load the character (${error.message}). Put it under test_assets/ — `
|
|
361
|
+
+ `see test_assets/README.md.`,
|
|
362
|
+
'fail'
|
|
363
|
+
);
|
|
364
|
+
console.error(error);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
if (!scene.lights.elements.some(light => light.isDirectionalLight)) {
|
|
369
|
+
// a glTF character carries no light of its own
|
|
370
|
+
place_light(scene, make_sunlight({ intensity: 6 }));
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// ---- frames enough for the box to be worth framing on ----------------------------------------
|
|
374
|
+
|
|
375
|
+
set_status('first frames — uploading clones and their trees …');
|
|
376
|
+
|
|
377
|
+
for (let i = 0; i < 8; i++) {
|
|
378
|
+
renderer.render(camera, scene, 1 / 60);
|
|
379
|
+
|
|
380
|
+
await renderer.graphics.device.queue.onSubmittedWorkDone();
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
let low = null;
|
|
384
|
+
let high = null;
|
|
385
|
+
|
|
386
|
+
for (const character of characters) {
|
|
387
|
+
const bounds = await world_bounds_of(scene_context, character);
|
|
388
|
+
|
|
389
|
+
low = low === null ? bounds.low : new Vector3(
|
|
390
|
+
Math.min(low.x, bounds.low.x), Math.min(low.y, bounds.low.y), Math.min(low.z, bounds.low.z)
|
|
391
|
+
);
|
|
392
|
+
|
|
393
|
+
high = high === null ? bounds.high : new Vector3(
|
|
394
|
+
Math.max(high.x, bounds.high.x), Math.max(high.y, bounds.high.y), Math.max(high.z, bounds.high.z)
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
const span = new Vector3(high.x - low.x, high.y - low.y, high.z - low.z);
|
|
399
|
+
|
|
400
|
+
const radius = Math.hypot(span.x, span.y, span.z) * 0.5;
|
|
401
|
+
|
|
402
|
+
camera_frame_sphere(
|
|
403
|
+
controller,
|
|
404
|
+
radius,
|
|
405
|
+
new Vector3((low.x + high.x) / 2, (low.y + high.y) / 2, (low.z + high.z) / 2)
|
|
406
|
+
);
|
|
407
|
+
|
|
408
|
+
controller.movement_speed_scale = radius * 0.2;
|
|
409
|
+
|
|
410
|
+
camera.near = radius * 0.01;
|
|
411
|
+
camera.far = radius * 400;
|
|
412
|
+
|
|
413
|
+
console.log(
|
|
414
|
+
`published box: low=(${low.x.toFixed(4)}, ${low.y.toFixed(4)}, ${low.z.toFixed(4)}) `
|
|
415
|
+
+ `high=(${high.x.toFixed(4)}, ${high.y.toFixed(4)}, ${high.z.toFixed(4)}) — `
|
|
416
|
+
+ `span ${span.x.toFixed(4)} × ${span.y.toFixed(4)} × ${span.z.toFixed(4)} m`
|
|
417
|
+
);
|
|
418
|
+
|
|
419
|
+
load_default_environment(scene).then(applied => {
|
|
420
|
+
if (applied) {
|
|
421
|
+
renderer.indicate_view_change();
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
// the controller's keyboard device listens on body, and only a focused element gets key events
|
|
426
|
+
document.body.focus();
|
|
427
|
+
|
|
428
|
+
globalThis.characters = characters;
|
|
429
|
+
|
|
430
|
+
// ---- the console half ------------------------------------------------------------------------
|
|
431
|
+
|
|
432
|
+
let animating = skin_mode === SkinMode.Animated;
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* The clone's deformed vertices, against the answer the CPU knows for the bind pose.
|
|
436
|
+
*
|
|
437
|
+
* Only meaningful under `?skin=bind`: with a clip playing there is no CPU-side answer to compare
|
|
438
|
+
* against, and with no skin registered there is nothing deforming the clone. It runs in the
|
|
439
|
+
* other two modes anyway rather than refusing — under `?skin=off` a pass says the clone's copy
|
|
440
|
+
* and address patch are right, which is worth knowing on its own.
|
|
441
|
+
*/
|
|
442
|
+
globalThis.diagnose = async () => {
|
|
443
|
+
const { verify_clone_vertices } = await import('./verify_clone_vertices.js');
|
|
444
|
+
|
|
445
|
+
const was_animating = animating;
|
|
446
|
+
|
|
447
|
+
animating = false;
|
|
448
|
+
|
|
449
|
+
try {
|
|
450
|
+
return await verify_clone_vertices({ renderer, scene, entity: characters[0] });
|
|
451
|
+
} finally {
|
|
452
|
+
animating = was_animating;
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
set_status(
|
|
457
|
+
`loaded — ${count} × ${CHARACTER_URL}, skin=${skin_mode}. `
|
|
458
|
+
+ `\`await diagnose()\` in the console.`,
|
|
459
|
+
'pass'
|
|
460
|
+
);
|
|
461
|
+
|
|
462
|
+
renderer.indicate_view_change();
|
|
463
|
+
|
|
464
|
+
// ---- frame loop --------------------------------------------------------------------------
|
|
465
|
+
|
|
466
|
+
element('animation').disabled = skin_mode !== SkinMode.Animated;
|
|
467
|
+
|
|
468
|
+
if (skin_mode !== SkinMode.Animated) {
|
|
469
|
+
// there is no clip to freeze; saying so beats a live-looking button that does nothing
|
|
470
|
+
element('animation').textContent = 'No clip playing';
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
element('animation').addEventListener('click', () => {
|
|
474
|
+
animating = !animating;
|
|
475
|
+
|
|
476
|
+
element('animation').textContent = animating ? 'Freeze pose' : 'Resume dance';
|
|
477
|
+
|
|
478
|
+
renderer.path_tracer.clear_history = true;
|
|
479
|
+
renderer.indicate_view_change();
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
const FRAME_RATE_LIMIT = 60;
|
|
483
|
+
|
|
484
|
+
create_frame_loop(time_delta_s => {
|
|
485
|
+
const width = window.innerWidth;
|
|
486
|
+
const height = window.innerHeight;
|
|
487
|
+
|
|
488
|
+
renderer.resize(width, height);
|
|
489
|
+
renderer.pixel_ratio = window.devicePixelRatio;
|
|
490
|
+
camera.aspect = width / height;
|
|
491
|
+
|
|
492
|
+
controller.update();
|
|
493
|
+
|
|
494
|
+
// A frozen pose is a still scene, which is the only condition under which the tracer's
|
|
495
|
+
// accumulator converges — so time stops rather than the frame loop stopping.
|
|
496
|
+
renderer.render(camera, scene, animating ? time_delta_s : 0);
|
|
497
|
+
|
|
498
|
+
stats_element.textContent =
|
|
499
|
+
`${count} × skin=${skin_mode}`
|
|
500
|
+
+ `${renderer.feature_path_tracing_enabled ? ' · path traced' : ' · rasterized'}`;
|
|
501
|
+
}, FRAME_RATE_LIMIT);
|
|
502
|
+
}
|