@woosh/meep-engine 3.43.0 → 3.44.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/editor/prototypeEditorShell.d.ts.map +1 -1
- package/editor/prototypeEditorShell.js +4 -2
- package/package.json +1 -1
- 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/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/graphics3/AnimationGraphSystem.d.ts +23 -13
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +61 -64
- package/src/engine/graphics3/AnimationSystem.d.ts +24 -15
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem.js +67 -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 +64 -0
- package/src/engine/graphics3/register_clips.d.ts.map +1 -0
- package/src/engine/graphics3/register_clips.js +114 -0
- package/src/engine/physics/cloth/MEASUREMENTS.md +795 -0
- package/src/engine/physics/cloth/PLAN.md +339 -9
- 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 +22 -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 +75 -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 +357 -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 +280 -0
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +1 -1
- 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/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 +816 -179
- 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 +321 -84
- 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 +9 -7
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +3 -3
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +30 -30
- 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 +142 -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 +608 -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 +160 -9
- 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 +44 -15
- 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 +60 -16
- 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/collide_main.js +1 -1
- 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 +1 -1
- 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/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 +63 -7
- 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 +7 -2
- 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 +362 -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 +13 -13
- 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 +183 -20
- 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 +10 -3
- 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/cloth_sample_air.d.ts +9 -9
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/cloth_sample_air.js +26 -26
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- 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/shade/RENDERER_CONTRACT.md +8 -2
- package/src/shade/playground/mesh_row_ceiling/main.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/texture_encode/README.md +129 -109
- package/src/shade/playground/texture_encode/main.js +1430 -1430
- 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/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/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/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,212 +1,220 @@
|
|
|
1
|
-
import { assert } from "../../../../core/assert.js";
|
|
2
|
-
import { combine_hash } from "../../../../core/collection/array/combine_hash.js";
|
|
3
|
-
import { computeHashFloat } from "../../../../core/primitives/numbers/computeHashFloat.js";
|
|
4
|
-
import { ClothDynamics } from "./ClothDynamics.js";
|
|
5
|
-
import { ClothFlags } from "./ClothFlags.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* # The thing that simulates
|
|
9
|
-
*
|
|
10
|
-
* Put it on an entity and that entity's transform subtree becomes a simulated
|
|
11
|
-
* chain: a rope, a chain, a hanging sign, a mooring line, a multi-strand rig.
|
|
12
|
-
*
|
|
13
|
-
* ```js
|
|
14
|
-
* rope_top.add(Cloth.from(ClothDynamics.ROPE));
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* The
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* the
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
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
|
-
|
|
83
|
-
*
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* @param {
|
|
103
|
-
*
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
this.
|
|
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
|
-
this.
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
Cloth.
|
|
211
|
-
|
|
212
|
-
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
import { combine_hash } from "../../../../core/collection/array/combine_hash.js";
|
|
3
|
+
import { computeHashFloat } from "../../../../core/primitives/numbers/computeHashFloat.js";
|
|
4
|
+
import { ClothDynamics } from "./ClothDynamics.js";
|
|
5
|
+
import { ClothFlags } from "./ClothFlags.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* # The thing that simulates
|
|
9
|
+
*
|
|
10
|
+
* Put it on an entity and that entity's transform subtree becomes a simulated
|
|
11
|
+
* chain: a rope, a chain, a hanging sign, a mooring line, a multi-strand rig.
|
|
12
|
+
*
|
|
13
|
+
* ```js
|
|
14
|
+
* rope_top.add(Cloth.from(ClothDynamics.ROPE));
|
|
15
|
+
* rope_top.add(ClothPin.from({ cloth: rope_top, particles: [0] }));
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* **The entity the component is on is the cloth's frame**, and nothing names
|
|
19
|
+
* anything. The particle set is that entity and its transform subtree, walked
|
|
20
|
+
* through `TransformAttachmentSystem#findChildrenOf` — the parent-to-children
|
|
21
|
+
* index the engine already maintains — with the entity itself as particle 0.
|
|
22
|
+
* Put `Cloth` on the top link of a rope and you get the rope; put it on a node
|
|
23
|
+
* with several chains under it and you get all of them in **one coupled
|
|
24
|
+
* solve**, which is what makes self-collision between them work.
|
|
25
|
+
*
|
|
26
|
+
* **What holds it is a separate question**, answered by {@link ClothPin}s: any
|
|
27
|
+
* number of them, on any entities, holding any particles, added and removed
|
|
28
|
+
* while it runs. The rope above is held at its top by its own entity; a rope
|
|
29
|
+
* bridge is that plus a post holding its last link; a rope nothing holds falls.
|
|
30
|
+
* The frame is only what the cloth is simulated in and what §7 P7's inertia is
|
|
31
|
+
* measured against — the entity the cloth rides, which cloth reads and never
|
|
32
|
+
* writes.
|
|
33
|
+
*
|
|
34
|
+
* Two rules keep the walk unambiguous:
|
|
35
|
+
*
|
|
36
|
+
* - **A nested `Cloth` claims its own subtree.** The walk stops when it meets
|
|
37
|
+
* another `Cloth`, so independent hanging parts of one prop partition
|
|
38
|
+
* naturally, each read one fixed step after the cloth above it wrote it.
|
|
39
|
+
* - **{@link ClothExclude}** prunes a subtree from the walk, for the rig with a
|
|
40
|
+
* non-simulated attachment point in the middle of a chain.
|
|
41
|
+
*
|
|
42
|
+
* From M3 a `ClothRig` alongside this component redirects the particle set to a
|
|
43
|
+
* skinned model instance's joints instead (§11.2). The solver is identical
|
|
44
|
+
* either way; only seeding and write-back differ, which is why there is no mode
|
|
45
|
+
* enum here — component presence does the job an enum would otherwise do badly.
|
|
46
|
+
*
|
|
47
|
+
* ## What has to be true of the subtree
|
|
48
|
+
*
|
|
49
|
+
* Every simulated entity needs a `TransformAttachment` naming its parent and a
|
|
50
|
+
* `Transform64`; that is what "is in the transform subtree" means, and it is
|
|
51
|
+
* the ordinary way anything is parented. The subtree is walked **once**, when
|
|
52
|
+
* the cloth first steps. Adding or removing links afterwards needs an explicit
|
|
53
|
+
* re-seed, which is the same contract `TransformAttachment#parent` already
|
|
54
|
+
* carries: remove the component and add it back.
|
|
55
|
+
*
|
|
56
|
+
* @author Alex Goldring
|
|
57
|
+
* @copyright Company Named Limited (c) 2026
|
|
58
|
+
*/
|
|
59
|
+
export class Cloth {
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* How it behaves. Assign a frozen library entry directly and it is shared,
|
|
63
|
+
* immutable and free; `.clone()` it and you own a copy to edit. Writing a
|
|
64
|
+
* field on an owned copy takes effect on the next step — the system
|
|
65
|
+
* compares what it last saw and re-parameterises the rows when it differs,
|
|
66
|
+
* so `cloth.dynamics.slack = 0.2` works live.
|
|
67
|
+
* @type {ClothDynamics}
|
|
68
|
+
*/
|
|
69
|
+
dynamics = new ClothDynamics();
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* `0` is the fully animated pose, `1` the fully simulated one.
|
|
73
|
+
*
|
|
74
|
+
* A lerp applied at write-back rather than a solver parameter, so it is
|
|
75
|
+
* free and always safe. It is the escape hatch for cinematics, for LOD, and
|
|
76
|
+
* for "turn it off for this one shot"; from M5 the culling pass drives it
|
|
77
|
+
* to blend a cloth back in without a pop.
|
|
78
|
+
* @type {number}
|
|
79
|
+
*/
|
|
80
|
+
blend = 1;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Collision layer this cloth belongs to, `RigidBody` semantics. Read from
|
|
84
|
+
* M2, when there is something to filter.
|
|
85
|
+
* @type {number}
|
|
86
|
+
*/
|
|
87
|
+
layer = 1;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Which `ClothCollider` layers this cloth collides against. Read from M2.
|
|
91
|
+
* @type {number}
|
|
92
|
+
*/
|
|
93
|
+
mask = 0xFFFFFFFF;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @see ClothFlags
|
|
97
|
+
* @type {number}
|
|
98
|
+
*/
|
|
99
|
+
flags = ClothFlags.None;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @param {number|ClothFlags} flag
|
|
103
|
+
* @returns {boolean}
|
|
104
|
+
*/
|
|
105
|
+
getFlag(flag) {
|
|
106
|
+
return (this.flags & flag) === flag;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @param {ClothDynamics} [dynamics] assigned by reference — pass a library
|
|
111
|
+
* entry to share it, `.clone()` first to own it
|
|
112
|
+
* @param {object} [spec]
|
|
113
|
+
* @param {number} [spec.blend]
|
|
114
|
+
* @param {number} [spec.layer]
|
|
115
|
+
* @param {number} [spec.mask]
|
|
116
|
+
* @param {number} [spec.flags]
|
|
117
|
+
* @returns {Cloth}
|
|
118
|
+
*/
|
|
119
|
+
static from(dynamics = undefined, spec = {}) {
|
|
120
|
+
const r = new Cloth();
|
|
121
|
+
|
|
122
|
+
if (dynamics !== undefined) {
|
|
123
|
+
assert.ok(dynamics.isClothDynamics === true, 'dynamics must be a ClothDynamics');
|
|
124
|
+
|
|
125
|
+
r.dynamics = dynamics;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const {
|
|
129
|
+
blend = r.blend,
|
|
130
|
+
layer = r.layer,
|
|
131
|
+
mask = r.mask,
|
|
132
|
+
flags = r.flags
|
|
133
|
+
} = spec;
|
|
134
|
+
|
|
135
|
+
assert.isNumber(blend, 'blend');
|
|
136
|
+
assert.isNonNegativeInteger(layer, 'layer');
|
|
137
|
+
assert.isNonNegativeInteger(mask, 'mask');
|
|
138
|
+
assert.isNonNegativeInteger(flags, 'flags');
|
|
139
|
+
|
|
140
|
+
r.blend = blend;
|
|
141
|
+
r.layer = layer;
|
|
142
|
+
r.mask = mask;
|
|
143
|
+
r.flags = flags;
|
|
144
|
+
|
|
145
|
+
return r;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* @param {Cloth} other
|
|
150
|
+
* @returns {boolean}
|
|
151
|
+
*/
|
|
152
|
+
equals(other) {
|
|
153
|
+
if (other === this) {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (other === null || other === undefined || other.isCloth !== true) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return this.dynamics.equals(other.dynamics)
|
|
162
|
+
&& this.blend === other.blend
|
|
163
|
+
&& this.layer === other.layer
|
|
164
|
+
&& this.mask === other.mask
|
|
165
|
+
&& this.flags === other.flags;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* @returns {number}
|
|
170
|
+
*/
|
|
171
|
+
hash() {
|
|
172
|
+
return combine_hash(
|
|
173
|
+
this.dynamics.hash(),
|
|
174
|
+
computeHashFloat(this.blend),
|
|
175
|
+
this.layer,
|
|
176
|
+
this.mask,
|
|
177
|
+
this.flags
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
toJSON() {
|
|
182
|
+
return {
|
|
183
|
+
dynamics: this.dynamics.toJSON(),
|
|
184
|
+
blend: this.blend,
|
|
185
|
+
layer: this.layer,
|
|
186
|
+
mask: this.mask,
|
|
187
|
+
flags: this.flags
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* @param {object} json
|
|
193
|
+
*/
|
|
194
|
+
fromJSON({ dynamics, blend = 1, layer = 1, mask = 0xFFFFFFFF, flags = ClothFlags.None }) {
|
|
195
|
+
// Deserialising into a shared frozen library entry would be a
|
|
196
|
+
// cross-instance write, so a loaded cloth always owns its dynamics.
|
|
197
|
+
this.dynamics = new ClothDynamics();
|
|
198
|
+
|
|
199
|
+
if (dynamics !== undefined) {
|
|
200
|
+
this.dynamics.fromJSON(dynamics);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
this.blend = blend;
|
|
204
|
+
this.layer = layer;
|
|
205
|
+
this.mask = mask;
|
|
206
|
+
this.flags = flags;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
toString() {
|
|
210
|
+
return `Cloth${JSON.stringify(this.toJSON())}`;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* @readonly
|
|
216
|
+
* @type {boolean}
|
|
217
|
+
*/
|
|
218
|
+
Cloth.prototype.isCloth = true;
|
|
219
|
+
|
|
220
|
+
Cloth.typeName = "Cloth";
|
|
@@ -29,6 +29,12 @@ export const ClothDynamicsFlags = {
|
|
|
29
29
|
* all and the row makes it marginally *worse*. `CLOTH_SILK`, `CLOTH_COTTON`
|
|
30
30
|
* and `CLOTH_HAIR` set it; nothing else does. `MEASUREMENTS.md` §33.
|
|
31
31
|
*
|
|
32
|
+
* Those figures are at the stiffness M4 shipped. At today's
|
|
33
|
+
* `CLOTH_SELF_RATIO`, the row removes 63% to 71% of the folding sheet's
|
|
34
|
+
* crossings, and in exchange a cloth resting on itself (a pile, a drape
|
|
35
|
+
* whose edges fold under, a skirt after a twirl) comes to rest instead of
|
|
36
|
+
* jittering for ever. `MEASUREMENTS.md` §65.
|
|
37
|
+
*
|
|
32
38
|
* What it buys is **fewer crossings while the cloth moves**, not a cleaner
|
|
33
39
|
* cloth at rest: a sheet that settles takes its tangles out with it either
|
|
34
40
|
* way. And it is one tier of two — `MEASUREMENTS.md` §32 measures the limit
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* # One {@link ClothPin}, as the cloth sees it
|
|
3
|
+
*
|
|
4
|
+
* The pin is the author's statement — this entity holds these particles of that
|
|
5
|
+
* cloth. This is what the statement turns into: where each held particle sits
|
|
6
|
+
* relative to its holder, and where the holder is this step. {@link ClothWorld}
|
|
7
|
+
* keeps one per pin for as long as the pin exists, **outside** the seeded
|
|
8
|
+
* instance, because the offsets are the hold's and not the `ClothState`'s: a
|
|
9
|
+
* re-seed builds a new state and must not move what is being held.
|
|
10
|
+
*
|
|
11
|
+
* A struct: {@link ClothWorld} and `cloth_holds.js` are its behaviour.
|
|
12
|
+
*
|
|
13
|
+
* @author Alex Goldring
|
|
14
|
+
* @copyright Company Named Limited (c) 2026
|
|
15
|
+
*/
|
|
16
|
+
export class ClothHold {
|
|
17
|
+
/**
|
|
18
|
+
* The entity carrying the {@link ClothPin}.
|
|
19
|
+
* @type {number}
|
|
20
|
+
*/
|
|
21
|
+
holder: number;
|
|
22
|
+
/**
|
|
23
|
+
* @type {ClothPin|null}
|
|
24
|
+
*/
|
|
25
|
+
pin: ClothPin | null;
|
|
26
|
+
/**
|
|
27
|
+
* Each held particle relative to the holder, in the holder's own frame, 3 per
|
|
28
|
+
* entry of the pin's particle list. Taken once, when the hold begins.
|
|
29
|
+
* @type {Float64Array}
|
|
30
|
+
*/
|
|
31
|
+
offset: Float64Array;
|
|
32
|
+
/**
|
|
33
|
+
* Whether {@link offset} has been taken. Until it has, the hold holds
|
|
34
|
+
* nothing: its holder has not been found yet, or its cloth has not seeded.
|
|
35
|
+
* @type {boolean}
|
|
36
|
+
*/
|
|
37
|
+
captured: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* The holder's rotation in the cloth's frame when the hold began, `[x, y, z, w]`
|
|
40
|
+
* — what the animated pose measures the holder's turn from.
|
|
41
|
+
* @type {Float64Array}
|
|
42
|
+
*/
|
|
43
|
+
rotation_at_hold: Float64Array;
|
|
44
|
+
/**
|
|
45
|
+
* The holder's pose in the cloth's frame this step, `[tx, ty, tz, qx, qy, qz, qw]`.
|
|
46
|
+
* @type {Float64Array}
|
|
47
|
+
*/
|
|
48
|
+
pose: Float64Array;
|
|
49
|
+
/**
|
|
50
|
+
* {@link pose} as of the previous step — what the teleport test measures a
|
|
51
|
+
* jump against.
|
|
52
|
+
* @type {Float64Array}
|
|
53
|
+
*/
|
|
54
|
+
pose_previous: Float64Array;
|
|
55
|
+
/**
|
|
56
|
+
* The holder's world pose this step, and the previous step's — what the
|
|
57
|
+
* wake test compares, because a holder that has not moved is a world that
|
|
58
|
+
* has not changed whatever the frame did.
|
|
59
|
+
* @type {Float64Array}
|
|
60
|
+
*/
|
|
61
|
+
world: Float64Array;
|
|
62
|
+
/**
|
|
63
|
+
* @type {Float64Array}
|
|
64
|
+
*/
|
|
65
|
+
world_previous: Float64Array;
|
|
66
|
+
/**
|
|
67
|
+
* Whether {@link pose} and {@link world} hold this step's answer. A holder
|
|
68
|
+
* whose hierarchy is not complete yet has none, and its particles stay where
|
|
69
|
+
* the last answer put them.
|
|
70
|
+
* @type {boolean}
|
|
71
|
+
*/
|
|
72
|
+
valid: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Whether {@link pose_previous} and {@link world_previous} mean anything.
|
|
75
|
+
* @type {boolean}
|
|
76
|
+
*/
|
|
77
|
+
has_previous: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Whether the cloth refused this hold — a holder that the cloth itself
|
|
80
|
+
* moves, or a particle it does not have — in which case it holds nothing.
|
|
81
|
+
* @type {boolean}
|
|
82
|
+
*/
|
|
83
|
+
refused: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Whether the refusal has been said. Once: a hold that does not fit will not
|
|
86
|
+
* start fitting, and a warning a step is a log nobody reads.
|
|
87
|
+
* @type {boolean}
|
|
88
|
+
*/
|
|
89
|
+
reported: boolean;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=ClothHold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClothHold.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/ecs/ClothHold.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH;IAEI;;;OAGG;IACH,QAFU,MAAM,CAEJ;IAEZ;;OAEG;IACH,KAFU,WAAS,IAAI,CAEZ;IAEX;;;;OAIG;IACH,QAFU,YAAY,CAEO;IAE7B;;;;OAIG;IACH,UAFU,OAAO,CAEA;IAEjB;;;;OAIG;IACH,kBAFU,YAAY,CAE4B;IAElD;;;OAGG;IACH,MAFU,YAAY,CAEyB;IAE/C;;;;OAIG;IACH,eAFU,YAAY,CAEkC;IAExD;;;;;OAKG;IACH,OAFU,YAAY,CAE0B;IAEhD;;OAEG;IACH,gBAFU,YAAY,CAEmC;IAEzD;;;;;OAKG;IACH,OAFU,OAAO,CAEH;IAEd;;;OAGG;IACH,cAFU,OAAO,CAEI;IAErB;;;;OAIG;IACH,SAFU,OAAO,CAED;IAEhB;;;;OAIG;IACH,UAFU,OAAO,CAEA;CACpB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* # One {@link ClothPin}, as the cloth sees it
|
|
3
|
+
*
|
|
4
|
+
* The pin is the author's statement — this entity holds these particles of that
|
|
5
|
+
* cloth. This is what the statement turns into: where each held particle sits
|
|
6
|
+
* relative to its holder, and where the holder is this step. {@link ClothWorld}
|
|
7
|
+
* keeps one per pin for as long as the pin exists, **outside** the seeded
|
|
8
|
+
* instance, because the offsets are the hold's and not the `ClothState`'s: a
|
|
9
|
+
* re-seed builds a new state and must not move what is being held.
|
|
10
|
+
*
|
|
11
|
+
* A struct: {@link ClothWorld} and `cloth_holds.js` are its behaviour.
|
|
12
|
+
*
|
|
13
|
+
* @author Alex Goldring
|
|
14
|
+
* @copyright Company Named Limited (c) 2026
|
|
15
|
+
*/
|
|
16
|
+
export class ClothHold {
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The entity carrying the {@link ClothPin}.
|
|
20
|
+
* @type {number}
|
|
21
|
+
*/
|
|
22
|
+
holder = -1;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @type {ClothPin|null}
|
|
26
|
+
*/
|
|
27
|
+
pin = null;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Each held particle relative to the holder, in the holder's own frame, 3 per
|
|
31
|
+
* entry of the pin's particle list. Taken once, when the hold begins.
|
|
32
|
+
* @type {Float64Array}
|
|
33
|
+
*/
|
|
34
|
+
offset = new Float64Array(0);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Whether {@link offset} has been taken. Until it has, the hold holds
|
|
38
|
+
* nothing: its holder has not been found yet, or its cloth has not seeded.
|
|
39
|
+
* @type {boolean}
|
|
40
|
+
*/
|
|
41
|
+
captured = false;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The holder's rotation in the cloth's frame when the hold began, `[x, y, z, w]`
|
|
45
|
+
* — what the animated pose measures the holder's turn from.
|
|
46
|
+
* @type {Float64Array}
|
|
47
|
+
*/
|
|
48
|
+
rotation_at_hold = new Float64Array([0, 0, 0, 1]);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The holder's pose in the cloth's frame this step, `[tx, ty, tz, qx, qy, qz, qw]`.
|
|
52
|
+
* @type {Float64Array}
|
|
53
|
+
*/
|
|
54
|
+
pose = new Float64Array([0, 0, 0, 0, 0, 0, 1]);
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* {@link pose} as of the previous step — what the teleport test measures a
|
|
58
|
+
* jump against.
|
|
59
|
+
* @type {Float64Array}
|
|
60
|
+
*/
|
|
61
|
+
pose_previous = new Float64Array([0, 0, 0, 0, 0, 0, 1]);
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* The holder's world pose this step, and the previous step's — what the
|
|
65
|
+
* wake test compares, because a holder that has not moved is a world that
|
|
66
|
+
* has not changed whatever the frame did.
|
|
67
|
+
* @type {Float64Array}
|
|
68
|
+
*/
|
|
69
|
+
world = new Float64Array([0, 0, 0, 0, 0, 0, 1]);
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @type {Float64Array}
|
|
73
|
+
*/
|
|
74
|
+
world_previous = new Float64Array([0, 0, 0, 0, 0, 0, 1]);
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Whether {@link pose} and {@link world} hold this step's answer. A holder
|
|
78
|
+
* whose hierarchy is not complete yet has none, and its particles stay where
|
|
79
|
+
* the last answer put them.
|
|
80
|
+
* @type {boolean}
|
|
81
|
+
*/
|
|
82
|
+
valid = false;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Whether {@link pose_previous} and {@link world_previous} mean anything.
|
|
86
|
+
* @type {boolean}
|
|
87
|
+
*/
|
|
88
|
+
has_previous = false;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Whether the cloth refused this hold — a holder that the cloth itself
|
|
92
|
+
* moves, or a particle it does not have — in which case it holds nothing.
|
|
93
|
+
* @type {boolean}
|
|
94
|
+
*/
|
|
95
|
+
refused = false;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Whether the refusal has been said. Once: a hold that does not fit will not
|
|
99
|
+
* start fitting, and a warning a step is a log nobody reads.
|
|
100
|
+
* @type {boolean}
|
|
101
|
+
*/
|
|
102
|
+
reported = false;
|
|
103
|
+
}
|