@woosh/meep-engine 3.23.0 → 3.25.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/entity_world_bounds.d.ts +9 -3
- package/editor/entity_world_bounds.d.ts.map +1 -1
- package/editor/entity_world_bounds.js +61 -4
- package/package.json +1 -1
- package/src/core/binary/allocator/OffsetAllocator.d.ts +40 -2
- package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
- package/src/core/binary/allocator/OffsetAllocator.js +124 -29
- package/src/core/collection/map/u32_index.d.ts +83 -0
- package/src/core/collection/map/u32_index.d.ts.map +1 -0
- package/src/core/collection/map/u32_index.js +247 -0
- package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.d.ts +2 -2
- package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.js +2 -2
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts +1 -2
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts.map +1 -1
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.js +4 -12
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +55 -0
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -0
- package/src/engine/ecs/gpu/GPUStateAuthority.js +72 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts +40 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts.map +1 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.js +79 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts +18 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.js +27 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.d.ts +23 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.js +39 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +15 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.js +38 -0
- package/src/engine/ecs/gpu/gpu_authority_has.d.ts +18 -0
- package/src/engine/ecs/gpu/gpu_authority_has.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_has.js +28 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts +24 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.js +49 -0
- package/src/engine/ecs/ik/IKProblem.d.ts +14 -0
- package/src/engine/ecs/ik/IKProblem.d.ts.map +1 -1
- package/src/engine/ecs/ik/IKProblem.js +16 -0
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +1 -1
- package/src/engine/ecs/ik/InverseKinematicsSystem.js +19 -0
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +2 -2
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +2 -2
- package/src/engine/ecs/ik/ik_bone_chain.d.ts +11 -2
- package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_bone_chain.js +47 -2
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.js +6 -0
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/speaker/VoiceSystem.js +6 -0
- package/src/engine/ecs/transform/T64WorldCache.d.ts +50 -0
- package/src/engine/ecs/transform/T64WorldCache.d.ts.map +1 -0
- package/src/engine/ecs/transform/T64WorldCache.js +139 -0
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts +31 -0
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_evaluate_world.js +126 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts +8 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +59 -30
- package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.js +4 -11
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts +14 -0
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts.map +1 -0
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.js +13 -0
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +2 -14
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +11 -21
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.d.ts +1 -0
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +7 -0
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts +5 -6
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.js +13 -11
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts +14 -0
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts.map +1 -0
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.js +21 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +1 -1
- package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.d.ts +1 -1
- package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +3 -3
- package/src/engine/graphics3/AnimationSystem.js +2 -2
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem.js +2 -4
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +34 -27
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +185 -85
- package/src/engine/graphics3/HighlightOutlineSystem.d.ts +4 -3
- package/src/engine/graphics3/HighlightOutlineSystem.d.ts.map +1 -1
- package/src/engine/graphics3/HighlightOutlineSystem.js +7 -9
- package/src/engine/graphics3/LightSystem.d.ts +7 -5
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +36 -22
- package/src/engine/graphics3/MeshSystem.d.ts +43 -39
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +324 -331
- package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -1
- package/src/engine/graphics3/PathDisplaySystem.js +2 -4
- package/src/engine/graphics3/PickingQuery.d.ts +15 -21
- package/src/engine/graphics3/PickingQuery.d.ts.map +1 -1
- package/src/engine/graphics3/PickingQuery.js +21 -25
- package/src/engine/graphics3/PickingSystem.d.ts +60 -31
- package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
- package/src/engine/graphics3/PickingSystem.js +413 -273
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +22 -12
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +309 -174
- package/src/engine/graphics3/TerrainSystem.d.ts +19 -11
- package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
- package/src/engine/graphics3/TerrainSystem.js +102 -53
- package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -1
- package/src/engine/graphics3/TooltipComponentSystem.js +2 -14
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem.js +2 -4
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts +4 -4
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
- package/src/engine/graphics3/animation/ClipListPlayer.js +2 -2
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +9 -11
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
- package/src/engine/graphics3/highlight/pack_highlight_table.js +11 -18
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +4 -3
- 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 +75 -74
- package/src/engine/graphics3/prefab/Prefab.d.ts +130 -0
- package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/Prefab.js +162 -0
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts +72 -0
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/PrefabInstance.js +80 -0
- package/src/engine/graphics3/prefab/prefab_compile.d.ts +23 -0
- package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_compile.js +334 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +46 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts +70 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.js +210 -0
- package/src/engine/graphics3/prefab/prefab_place.d.ts +60 -0
- package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_place.js +130 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts +60 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.js +128 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts +40 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.js +116 -0
- package/src/engine/graphics3/preview/make_model_preview_scene.d.ts +16 -14
- package/src/engine/graphics3/preview/make_model_preview_scene.d.ts.map +1 -1
- package/src/engine/graphics3/preview/make_model_preview_scene.js +126 -154
- package/src/engine/graphics3/preview/make_model_thumbnail.js +1 -1
- package/src/engine/graphics3/register_instance_animation.d.ts +6 -6
- package/src/engine/graphics3/register_instance_animation.d.ts.map +1 -1
- package/src/engine/graphics3/register_instance_animation.js +4 -4
- package/src/engine/graphics3/shade_bundle_bounds.d.ts +2 -6
- package/src/engine/graphics3/shade_bundle_bounds.d.ts.map +1 -1
- package/src/engine/graphics3/shade_bundle_bounds.js +47 -55
- package/src/engine/graphics3/shader_picking_gather.d.ts +40 -0
- package/src/engine/graphics3/shader_picking_gather.d.ts.map +1 -0
- package/src/engine/graphics3/shader_picking_gather.js +120 -0
- package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts +11 -18
- package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts.map +1 -1
- package/src/engine/graphics3/terrain/pack_terrain_row_table.js +48 -53
- package/src/engine/physics/cloth/MEASUREMENTS.md +1050 -0
- package/src/engine/physics/cloth/PLAN.md +411 -49
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +17 -2
- 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 +284 -256
- package/src/engine/physics/cloth/ecs/ClothColliderSerializationAdapter.d.ts +52 -0
- package/src/engine/physics/cloth/ecs/ClothColliderSerializationAdapter.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothColliderSerializationAdapter.js +70 -0
- package/src/engine/physics/cloth/ecs/ClothDynamics.d.ts +12 -3
- package/src/engine/physics/cloth/ecs/ClothDynamics.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothDynamics.js +340 -331
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +49 -37
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +50 -37
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts +7 -8
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothRig.js +7 -8
- package/src/engine/physics/cloth/ecs/ClothSerializationAdapter.d.ts +84 -0
- package/src/engine/physics/cloth/ecs/ClothSerializationAdapter.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothSerializationAdapter.js +141 -0
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +51 -81
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +81 -870
- package/src/engine/physics/cloth/ecs/ClothWorkerCore.d.ts +48 -0
- package/src/engine/physics/cloth/ecs/ClothWorkerCore.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothWorkerCore.js +107 -0
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +286 -0
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothWorld.js +1104 -0
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +182 -0
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +562 -0
- package/src/engine/physics/cloth/ecs/cloth.worker.d.ts +2 -0
- package/src/engine/physics/cloth/ecs/cloth.worker.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth.worker.js +12 -0
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.js +2 -1
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +58 -0
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +341 -271
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +20 -2
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +39 -15
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +19 -23
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +201 -199
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +8 -0
- package/src/engine/physics/cloth/ecs/cloth_worker_protocol.d.ts +29 -0
- package/src/engine/physics/cloth/ecs/cloth_worker_protocol.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_worker_protocol.js +78 -0
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts +18 -34
- 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 +58 -115
- package/src/engine/physics/cloth/ecs/makeClothWorker.d.ts +17 -0
- package/src/engine/physics/cloth/ecs/makeClothWorker.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/makeClothWorker.js +18 -0
- package/src/engine/physics/cloth/playground/README.md +84 -13
- package/src/engine/physics/cloth/playground/garment_build.d.ts +0 -1
- package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/garment_build.js +64 -58
- package/src/engine/physics/cloth/playground/garment_main.js +59 -33
- package/src/engine/physics/cloth/playground/wind.html +166 -0
- package/src/engine/physics/cloth/playground/wind_build.d.ts +81 -0
- package/src/engine/physics/cloth/playground/wind_build.d.ts.map +1 -0
- package/src/engine/physics/cloth/playground/wind_build.js +141 -0
- package/src/engine/physics/cloth/playground/wind_main.d.ts +2 -0
- package/src/engine/physics/cloth/playground/wind_main.d.ts.map +1 -0
- package/src/engine/physics/cloth/playground/wind_main.js +681 -0
- package/src/engine/physics/cloth/solver/ClothState.d.ts +134 -79
- package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/ClothState.js +273 -12
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +33 -0
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solver_constants.js +34 -0
- package/src/engine/physics/cloth/solver/cloth_step.d.ts +21 -2
- package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step.js +173 -4
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +40 -0
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_step_instance.js +284 -0
- package/src/engine/physics/cloth/solver/cloth_wind_accelerate.d.ts +107 -0
- package/src/engine/physics/cloth/solver/cloth_wind_accelerate.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_wind_accelerate.js +263 -0
- package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts +88 -0
- package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts.map +1 -0
- package/src/engine/physics/cloth/wind/AbstractClothWind.js +100 -0
- package/src/engine/physics/cloth/wind/ClothAmbientWind.d.ts +85 -0
- package/src/engine/physics/cloth/wind/ClothAmbientWind.d.ts.map +1 -0
- package/src/engine/physics/cloth/wind/ClothAmbientWind.js +182 -0
- package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +79 -0
- package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -0
- package/src/engine/physics/cloth/wind/ClothFluidWind.js +210 -0
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +101 -0
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -0
- package/src/engine/physics/cloth/wind/cloth_sample_air.js +290 -0
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/RENDERER_CONTRACT.md +85 -53
- package/src/shade/device/ShadeGPUCommandContext.d.ts +23 -0
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +36 -0
- package/src/shade/device/mock/texture_copy.d.ts.map +1 -1
- package/src/shade/device/mock/texture_copy.js +28 -0
- package/src/shade/playground/add_random_meshes.d.ts +4 -4
- package/src/shade/playground/add_random_meshes.d.ts.map +1 -1
- package/src/shade/playground/add_random_meshes.js +20 -16
- package/src/shade/playground/avboit/main.d.ts +1 -0
- package/src/shade/playground/avboit/main.d.ts.map +1 -1
- package/src/shade/playground/avboit/main.js +916 -875
- package/src/shade/playground/basis_textures/main.d.ts.map +1 -1
- package/src/shade/playground/basis_textures/main.js +22 -8
- package/src/shade/playground/basis_textures/texture_inventory.d.ts +2 -2
- package/src/shade/playground/basis_textures/texture_inventory.d.ts.map +1 -1
- package/src/shade/playground/basis_textures/texture_inventory.js +6 -7
- package/src/shade/playground/ground_seam/main.d.ts.map +1 -1
- package/src/shade/playground/ground_seam/main.js +13 -4
- package/src/shade/playground/ground_seam/make_ground.d.ts +13 -4
- package/src/shade/playground/ground_seam/make_ground.d.ts.map +1 -1
- package/src/shade/playground/ground_seam/make_ground.js +21 -16
- package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
- package/src/shade/playground/particle_system/main.js +11 -10
- package/src/shade/playground/particle_system/particle_prototype.d.ts +15 -10
- package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_prototype.js +56 -15
- package/src/shade/playground/particle_system/particle_scene.d.ts +68 -28
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +149 -53
- package/src/shade/playground/readback_crossover/index.html +41 -0
- package/src/shade/playground/readback_crossover/main.d.ts +2 -0
- package/src/shade/playground/readback_crossover/main.d.ts.map +1 -0
- package/src/shade/playground/readback_crossover/main.js +372 -0
- package/src/shade/playground/skinned_blas_refit/README.md +11 -7
- package/src/shade/playground/skinned_blas_refit/add_floor.d.ts +13 -44
- package/src/shade/playground/skinned_blas_refit/add_floor.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/add_floor.js +19 -59
- package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/main.js +67 -58
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts +40 -54
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/place_character.js +47 -74
- package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/sweep_views.js +4 -3
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +11 -4
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +38 -9
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +9 -6
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +3 -3
- package/src/shade/playground/skinned_mesh_soup/README.md +6 -6
- package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/main.js +44 -102
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +5 -5
- 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 +42 -33
- package/src/shade/playground/sponza_path_trace/main.d.ts +1 -0
- package/src/shade/playground/sponza_path_trace/main.d.ts.map +1 -1
- package/src/shade/playground/sponza_path_trace/main.js +393 -363
- package/src/shade/playground/ssr_reprojection/main.js +11 -9
- package/src/shade/playground/ssr_reprojection/scene.d.ts +15 -4
- package/src/shade/playground/ssr_reprojection/scene.d.ts.map +1 -1
- package/src/shade/playground/ssr_reprojection/scene.js +32 -11
- package/src/shade/playground/ssr_variance/main.js +1 -1
- package/src/shade/playground/ssr_variance/scene.d.ts +10 -4
- package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -1
- package/src/shade/playground/ssr_variance/scene.js +39 -15
- package/src/shade/playground/vgeo_runtime/README.md +94 -0
- package/src/shade/playground/vgeo_runtime/index.html +62 -0
- package/src/shade/playground/vgeo_runtime/main.d.ts +2 -0
- package/src/shade/playground/vgeo_runtime/main.d.ts.map +1 -0
- package/src/shade/playground/vgeo_runtime/main.js +399 -0
- package/src/shade/playground/vgeo_viewer/main.js +6 -2
- package/src/shade/playground/vgeo_viewer/sample_asset.js +1 -1
- package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +936 -922
- package/src/shade/renderer/GraphicsContext.d.ts +7 -0
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +11 -0
- package/src/shade/renderer/Renderer.d.ts +3 -2
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +3 -2
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +39 -47
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +319 -256
- package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts +26 -22
- package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts.map +1 -1
- package/src/shade/renderer/animation/ShadeAnimationChannel.js +28 -23
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +14 -6
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
- package/src/shade/renderer/animation/ShadeAnimationClip.js +20 -8
- package/src/shade/renderer/animation/Skin.d.ts +19 -19
- package/src/shade/renderer/animation/Skin.d.ts.map +1 -1
- package/src/shade/renderer/animation/Skin.js +15 -13
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +6 -5
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/pose_evaluate_local.js +9 -9
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +5 -59
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -1
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +8 -132
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +65 -62
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +148 -194
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +4 -7
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +2 -2
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +2 -2
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts +74 -0
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts.map +1 -0
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.js +240 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +14 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +64 -6
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts +190 -0
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.js +1323 -0
- package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts +10 -0
- package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUPageMetadata.js +12 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts +15 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.js +34 -0
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +75 -7
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +518 -135
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts +19 -0
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.js +18 -0
- package/src/shade/renderer/buffer/table/WordViews.d.ts +39 -0
- package/src/shade/renderer/buffer/table/WordViews.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/WordViews.js +62 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts +27 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.js +117 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts +121 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.js +395 -0
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +70 -20
- package/src/shade/renderer/camera/Camera.d.ts +14 -0
- package/src/shade/renderer/camera/Camera.d.ts.map +1 -1
- package/src/shade/renderer/camera/Camera.js +7 -1
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +1 -1
- package/src/shade/renderer/geometry/GEOMETRY_METADATA_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GEOMETRY_METADATA_STRUCT.js +16 -1
- package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GPUGeometryManager.js +29 -9
- package/src/shade/renderer/geometry/GPUGeometryMetadata.d.ts +10 -0
- package/src/shade/renderer/geometry/GPUGeometryMetadata.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GPUGeometryMetadata.js +13 -0
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +6 -5
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +3 -3
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +15 -11
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +46 -18
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +70 -22
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +97 -19
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +12 -2
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +14 -3
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts +2 -2
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.js +124 -6
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts +22 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.js +53 -0
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +8 -1
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +8 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES.js +15 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_DEFAULT_PAGE_SIZE.d.ts +54 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_DEFAULT_PAGE_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_DEFAULT_PAGE_SIZE.js +53 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts +13 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.js +14 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +100 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +113 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js +5 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +108 -0
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +23 -0
- 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 +40 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts +228 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.js +932 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +176 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +425 -0
- package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +241 -0
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +574 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +120 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +674 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts +287 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +976 -0
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts +42 -0
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.js +96 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_CULL.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_CULL.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_CULL.js +15 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js +83 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_WORKGROUP_SIZE.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_WORKGROUP_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_WORKGROUP_SIZE.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +160 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +255 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.js +80 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +144 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +530 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts +39 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js +54 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_if_enabled.d.ts +41 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_if_enabled.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_if_enabled.js +56 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts +49 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +328 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts +10 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.js +51 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js +12 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +99 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts +7 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.js +27 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_NONE.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_NONE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_NONE.js +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_OFFSET.d.ts +7 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_OFFSET.js +35 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_WORDS.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_WORDS.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_FLAG_SELECTABLE.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_FLAG_SELECTABLE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_FLAG_SELECTABLE.js +14 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts +7 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.js +36 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts +10 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_OFFSET.d.ts +11 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_OFFSET.js +54 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_WORDS.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_WORDS.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_LEAF_BIT.d.ts +11 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_LEAF_BIT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_LEAF_BIT.js +10 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_OFFSET.d.ts +7 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_OFFSET.js +30 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_WORDS.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_WORDS.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NO_CHILD_PAGE.d.ts +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NO_CHILD_PAGE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NO_CHILD_PAGE.js +12 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_NONE.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_NONE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_NONE.js +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts +11 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.js +61 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_ITEM_WORDS.d.ts +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_ITEM_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_ITEM_WORDS.js +12 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_GROUP_BIT.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_GROUP_BIT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_GROUP_BIT.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_WANT_WORDS.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_WANT_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_WANT_WORDS.js +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts +23 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +70 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js +25 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts +35 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js +41 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts +32 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +138 -0
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.d.ts +1 -1
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.js +4 -4
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts +1 -3
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.js +5 -4
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -4
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +8 -3
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +19 -14
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +9 -1
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts +3 -3
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.js +12 -5
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +1 -1
- package/src/shade/renderer/light/GPULightCollection.d.ts +29 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +444 -329
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +7 -1
- package/src/shade/renderer/light/LightCollection.d.ts +29 -1
- package/src/shade/renderer/light/LightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/LightCollection.js +50 -1
- package/src/shade/renderer/light/make_sunlight.js +2 -2
- package/src/shade/renderer/light/model/Light.d.ts +29 -2
- package/src/shade/renderer/light/model/Light.d.ts.map +1 -1
- package/src/shade/renderer/light/model/Light.js +30 -2
- package/src/shade/renderer/light/model/io/light_record_directional.d.ts +3 -1
- package/src/shade/renderer/light/model/io/light_record_directional.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_directional.js +8 -5
- package/src/shade/renderer/light/model/io/light_record_point.d.ts +3 -1
- package/src/shade/renderer/light/model/io/light_record_point.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_point.js +5 -2
- package/src/shade/renderer/light/model/io/light_record_spot.d.ts +4 -1
- package/src/shade/renderer/light/model/io/light_record_spot.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_spot.js +10 -6
- package/src/shade/renderer/light/place_light.d.ts +16 -0
- package/src/shade/renderer/light/place_light.d.ts.map +1 -0
- package/src/shade/renderer/light/place_light.js +36 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.d.ts +44 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.d.ts.map +1 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.js +154 -0
- package/src/shade/renderer/lightmap/GPULightMap.js +1 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +12 -14
- package/src/shade/renderer/loader/SceneBundle.d.ts +53 -28
- package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
- package/src/shade/renderer/loader/SceneBundle.js +111 -56
- package/src/shade/renderer/loader/SceneNode.d.ts +81 -0
- package/src/shade/renderer/loader/SceneNode.d.ts.map +1 -0
- package/src/shade/renderer/loader/SceneNode.js +114 -0
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts +3 -2
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/load_gltf.js +110 -142
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts +4 -4
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.js +2 -2
- package/src/shade/renderer/loader/usd/load_usd.d.ts +3 -2
- package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/load_usd.js +4 -5
- package/src/shade/renderer/loader/usd/usd_build_scene.d.ts +3 -3
- package/src/shade/renderer/loader/usd/usd_build_scene.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/usd_build_scene.js +47 -55
- package/src/shade/renderer/material/GPUMaterialManager.js +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +5 -4
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +8 -15
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts +15 -13
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +40 -21
- package/src/shade/renderer/particles/DESIGN.md +53 -50
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +31 -17
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +54 -91
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +12 -11
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +12 -11
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +13 -19
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +19 -25
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +34 -24
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +53 -40
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- 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 +9 -0
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +2 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.js +5 -2
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +13 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +12 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +10 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +1 -1
- package/src/shade/renderer/scene/DynamicMesh.d.ts +13 -4
- package/src/shade/renderer/scene/DynamicMesh.d.ts.map +1 -1
- package/src/shade/renderer/scene/DynamicMesh.js +14 -4
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +38 -18
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +112 -60
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +69 -44
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +244 -525
- package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +5 -5
- package/src/shade/renderer/scene/NODE3D_STRUCT.js +5 -5
- package/src/shade/renderer/scene/Scene.d.ts +18 -60
- package/src/shade/renderer/scene/Scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/Scene.js +53 -146
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts +24 -3
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts.map +1 -1
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.js +53 -13
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +5 -6
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +5 -6
- package/src/shade/renderer/scene/optimization/scene_optimize.d.ts +10 -2
- package/src/shade/renderer/scene/optimization/scene_optimize.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/scene_optimize.js +266 -230
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts +53 -0
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.js +144 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +227 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.js +1158 -0
- package/src/shade/renderer/scene/rows/place_primitive.d.ts +48 -0
- package/src/shade/renderer/scene/rows/place_primitive.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/place_primitive.js +98 -0
- package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts +10 -8
- package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/serialization/deserialize_scene.js +24 -27
- package/src/shade/renderer/scene/serialization/serialize_scene.d.ts +9 -2
- package/src/shade/renderer/scene/serialization/serialize_scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/serialization/serialize_scene.js +25 -4
- package/src/shade/renderer/scene/verify_gpu_tlas_build.js +2 -2
- package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.d.ts +35 -0
- package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.js +91 -0
- package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +39 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +112 -64
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +7 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1541 -1352
- package/src/shade/renderer/shadow/map/PointLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts +29 -0
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.js +43 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts +13 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.js +12 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +49 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +194 -0
- package/src/shade/renderer/shadow/map/csm_debug_draw_preview.js +1 -1
- package/src/shade/renderer/shadow/map/shadowmap_update_score.js +1 -1
- package/src/shade/renderer/shadow/ray/RTXShadows.js +1 -1
- package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +3 -1
- package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +8 -8
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +4 -3
- package/src/engine/graphics3/instantiate_scene_bundle.d.ts +0 -54
- package/src/engine/graphics3/instantiate_scene_bundle.d.ts.map +0 -1
- package/src/engine/graphics3/instantiate_scene_bundle.js +0 -164
- package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +0 -39
- package/src/engine/graphics3/shade_node_to_entity_composition.d.ts.map +0 -1
- package/src/engine/graphics3/shade_node_to_entity_composition.js +0 -88
- package/src/shade/renderer/animation/compute_skin_world_bounds.d.ts +0 -35
- package/src/shade/renderer/animation/compute_skin_world_bounds.d.ts.map +0 -1
- package/src/shade/renderer/animation/compute_skin_world_bounds.js +0 -146
- package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.d.ts +0 -96
- package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.d.ts.map +0 -1
- package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +0 -531
- package/src/shade/renderer/animation/pose/pose_evaluate_world.d.ts +0 -20
- package/src/shade/renderer/animation/pose/pose_evaluate_world.d.ts.map +0 -1
- package/src/shade/renderer/animation/pose/pose_evaluate_world.js +0 -76
- package/src/shade/renderer/animation/skin_bind_transform.d.ts +0 -25
- package/src/shade/renderer/animation/skin_bind_transform.d.ts.map +0 -1
- package/src/shade/renderer/animation/skin_bind_transform.js +0 -33
- package/src/shade/renderer/animation/skin_frame_defect.d.ts +0 -34
- package/src/shade/renderer/animation/skin_frame_defect.d.ts.map +0 -1
- package/src/shade/renderer/animation/skin_frame_defect.js +0 -132
- package/src/shade/renderer/animation/skin_joint_matrix.d.ts +0 -24
- package/src/shade/renderer/animation/skin_joint_matrix.d.ts.map +0 -1
- package/src/shade/renderer/animation/skin_joint_matrix.js +0 -46
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts +0 -70
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts.map +0 -1
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +0 -216
- package/src/shade/renderer/scene/InstanceBatch.d.ts +0 -92
- package/src/shade/renderer/scene/InstanceBatch.d.ts.map +0 -1
- package/src/shade/renderer/scene/InstanceBatch.js +0 -235
- package/src/shade/renderer/scene/Mesh.d.ts +0 -55
- package/src/shade/renderer/scene/Mesh.d.ts.map +0 -1
- package/src/shade/renderer/scene/Mesh.js +0 -168
- package/src/shade/renderer/scene/Node3D.d.ts +0 -140
- package/src/shade/renderer/scene/Node3D.d.ts.map +0 -1
- package/src/shade/renderer/scene/Node3D.js +0 -263
- package/src/shade/renderer/scene/SceneNodeBinding.d.ts +0 -52
- package/src/shade/renderer/scene/SceneNodeBinding.d.ts.map +0 -1
- package/src/shade/renderer/scene/SceneNodeBinding.js +0 -56
- package/src/shade/renderer/scene/SkinnedMesh.d.ts +0 -110
- package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +0 -1
- package/src/shade/renderer/scene/SkinnedMesh.js +0 -170
- package/src/shade/renderer/scene/TransformAuthority.d.ts +0 -19
- package/src/shade/renderer/scene/TransformAuthority.d.ts.map +0 -1
- package/src/shade/renderer/scene/TransformAuthority.js +0 -33
|
@@ -1,74 +1,30 @@
|
|
|
1
|
-
import { assert } from "../../../../core/assert.js";
|
|
2
|
-
import { quat3_multiply } from "../../../../core/geom/3d/quaternion/quat3_multiply.js";
|
|
3
|
-
import { quat3_nlerp } from "../../../../core/geom/3d/quaternion/quat3_nlerp.js";
|
|
4
|
-
import { v3_quaternion_apply } from "../../../../core/geom/vec3/v3_quaternion_apply.js";
|
|
5
|
-
import { v3_quaternion_apply_inverse } from "../../../../core/geom/vec3/v3_quaternion_apply_inverse.js";
|
|
6
1
|
import { ResourceAccessKind } from "../../../../core/model/ResourceAccessKind.js";
|
|
7
2
|
import { ResourceAccessSpecification } from "../../../../core/model/ResourceAccessSpecification.js";
|
|
8
3
|
import { System } from "../../../ecs/System.js";
|
|
9
4
|
import {
|
|
10
5
|
TransformAttachment
|
|
11
6
|
} from "../../../ecs/transform-attachment/TransformAttachment.js";
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
} from "../../../ecs/transform-attachment/TransformAttachmentSystem.js";
|
|
15
|
-
import {
|
|
16
|
-
TRANSFORM64_ROTATION_OFFSET,
|
|
17
|
-
TRANSFORM64_TRANSLATION_OFFSET,
|
|
18
|
-
Transform64
|
|
19
|
-
} from "../../../ecs/transform/Transform64.js";
|
|
20
|
-
import {
|
|
21
|
-
collect_entity_playbacks
|
|
22
|
-
} from "../../../graphics3/pose/collect_entity_playbacks.js";
|
|
23
|
-
import { MeshSystem } from "../../../graphics3/MeshSystem.js";
|
|
24
|
-
import {
|
|
25
|
-
pose_evaluate_world
|
|
26
|
-
} from "../../../../shade/renderer/animation/pose/pose_evaluate_world.js";
|
|
27
|
-
import { cloth_contact_find } from "../solver/cloth_contact_find.js";
|
|
28
|
-
import { cloth_self_find } from "../solver/cloth_self_find.js";
|
|
29
|
-
import { CLOTH_SELF_RADIUS_MAX_RATIO, CLOTH_SELF_RADIUS_MIN_RATIO } from "../solver/cloth_solver_constants.js";
|
|
30
|
-
import { cloth_step } from "../solver/cloth_step.js";
|
|
7
|
+
import { Transform64 } from "../../../ecs/transform/Transform64.js";
|
|
8
|
+
import { CLOTH_STEP_PARAM_STRIDE, cloth_step_instance } from "../solver/cloth_step_instance.js";
|
|
31
9
|
import { Cloth } from "./Cloth.js";
|
|
32
10
|
import { ClothCollider } from "./ClothCollider.js";
|
|
33
|
-
import { ClothColliderSystem } from "./ClothColliderSystem.js";
|
|
34
11
|
import { ClothExclude } from "./ClothExclude.js";
|
|
35
|
-
import { ClothDynamicsFlags } from "./ClothDynamicsFlags.js";
|
|
36
|
-
import { ClothFlags } from "./ClothFlags.js";
|
|
37
|
-
import { ClothInstance } from "./ClothInstance.js";
|
|
38
12
|
import { ClothRig } from "./ClothRig.js";
|
|
39
|
-
import {
|
|
40
|
-
CLOTH_ANCHOR_ROTATION_LIMIT,
|
|
41
|
-
CLOTH_ANCHOR_TRAVEL_REACH,
|
|
42
|
-
CLOTH_SLEEP_SPEED_RATIO,
|
|
43
|
-
CLOTH_SLEEP_STEPS,
|
|
44
|
-
CLOTH_STABILISE_STEPS,
|
|
45
|
-
CLOTH_TELEPORT_FLOOR,
|
|
46
|
-
CLOTH_TELEPORT_REACH,
|
|
47
|
-
cloth_velocity_limit,
|
|
48
|
-
cloth_velocity_retention
|
|
49
|
-
} from "./cloth_dynamics_map.js";
|
|
50
|
-
import {
|
|
51
|
-
cloth_colliders_moved,
|
|
52
|
-
cloth_gather_colliders
|
|
53
|
-
} from "./cloth_gather_colliders.js";
|
|
54
|
-
import {
|
|
55
|
-
cloth_dynamics_change_needs_reseed,
|
|
56
|
-
cloth_reparameterise
|
|
57
|
-
} from "./cloth_build_rows.js";
|
|
58
|
-
import { cloth_seed_subtree } from "./cloth_seed_subtree.js";
|
|
59
|
-
import { cloth_seed_rig } from "./cloth_seed_rig.js";
|
|
60
|
-
import { cloth_write_back } from "./cloth_write_back.js";
|
|
61
|
-
import { cloth_write_back_rig } from "./cloth_write_back_rig.js";
|
|
13
|
+
import { ClothWorld } from "./ClothWorld.js";
|
|
62
14
|
|
|
63
15
|
/**
|
|
64
|
-
* # The system — gather, step, write back
|
|
16
|
+
* # The system — gather, step, write back, all on this thread
|
|
17
|
+
*
|
|
18
|
+
* Every cloth in the scene stepped inline at the fixed rate. The work itself
|
|
19
|
+
* lives in {@link ClothWorld}, which this shares with {@link WorkerClothSystem}
|
|
20
|
+
* so that §12's "`ClothSystem` and `WorkerClothSystem` must produce bit-identical
|
|
21
|
+
* results" is a property of there being one copy rather than of two copies
|
|
22
|
+
* agreeing. What is left here is a `System`'s own surface — what it depends on,
|
|
23
|
+
* what it accesses, and the loop.
|
|
65
24
|
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* subtree. The animated pose the leashes are measured against is not recomposed
|
|
70
|
-
* per step — in the entity path it is constant in the anchor's own frame, and
|
|
71
|
-
* `cloth_seed_subtree.js` bakes it.
|
|
25
|
+
* This is the fallback where `SharedArrayBuffer` is unavailable, and it is **not
|
|
26
|
+
* a degraded mode**: it is the same solver over the same data in the same
|
|
27
|
+
* order, and the only thing the worker buys is which thread pays for it.
|
|
72
28
|
*
|
|
73
29
|
* ## Where in the frame this runs
|
|
74
30
|
*
|
|
@@ -99,29 +55,6 @@ import { cloth_write_back_rig } from "./cloth_write_back_rig.js";
|
|
|
99
55
|
* it before `TransformAttachmentSystem`, which is right: cloth writes the local
|
|
100
56
|
* transforms and the attachment system is their reader.
|
|
101
57
|
*
|
|
102
|
-
* ## The local frame and the inertia model — §7 P7
|
|
103
|
-
*
|
|
104
|
-
* Particles live in the anchor's own frame. When the anchor moves, the cloth is
|
|
105
|
-
* asked how much of that motion it would like to feel:
|
|
106
|
-
* `ClothDynamics#inertia = 1` keeps every particle's **world** position and
|
|
107
|
-
* velocity, so a cape trails a sprinting character; `0` keeps their **local**
|
|
108
|
-
* ones, so the cloth rides the anchor as though it were standing still. The
|
|
109
|
-
* blend between the two is a lerp in the local frame, which is all the frame
|
|
110
|
-
* change is.
|
|
111
|
-
*
|
|
112
|
-
* The felt motion is limited before the blend, which is what makes "character
|
|
113
|
-
* sprints, cape behaves" a default rather than a tuning exercise, and the limits
|
|
114
|
-
* are derived from the cloth's own reach rather than authored.
|
|
115
|
-
*
|
|
116
|
-
* ## Teleport — §7 P6
|
|
117
|
-
*
|
|
118
|
-
* Anchor motion past a threshold is not locomotion and is not treated as any
|
|
119
|
-
* amount of it. `ClothFlags.TeleportKeep` carries the shape across, which in a
|
|
120
|
-
* local frame is literally doing nothing; the default re-seeds at the animated
|
|
121
|
-
* pose with zero velocity and opens a stabilisation window in which the
|
|
122
|
-
* velocity limit ramps back from nothing, so the first steps after a reset
|
|
123
|
-
* cannot produce a whip.
|
|
124
|
-
*
|
|
125
58
|
* @author Alex Goldring
|
|
126
59
|
* @copyright Company Named Limited (c) 2026
|
|
127
60
|
*/
|
|
@@ -139,82 +72,83 @@ export class ClothSystem extends System {
|
|
|
139
72
|
];
|
|
140
73
|
|
|
141
74
|
/**
|
|
142
|
-
*
|
|
75
|
+
* @type {ClothWorld}
|
|
76
|
+
*/
|
|
77
|
+
world = new ClothWorld();
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* One cloth's step parameters, reused for every cloth in turn because the
|
|
81
|
+
* step follows immediately.
|
|
82
|
+
*
|
|
83
|
+
* The same block {@link WorkerClothSystem} writes into the shared command
|
|
84
|
+
* region — one layout, written by one function, so the inline path and the
|
|
85
|
+
* worker path cannot be handed different numbers.
|
|
143
86
|
* @type {Float64Array}
|
|
87
|
+
* @private
|
|
144
88
|
*/
|
|
145
|
-
|
|
89
|
+
__params = new Float64Array(CLOTH_STEP_PARAM_STRIDE);
|
|
146
90
|
|
|
147
91
|
/**
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
* @type {ClothInstance[]}
|
|
92
|
+
* World gravity, m/s². Rotated into each cloth's local frame per step.
|
|
93
|
+
* @returns {Float64Array}
|
|
151
94
|
*/
|
|
152
|
-
|
|
95
|
+
get gravity() {
|
|
96
|
+
return this.world.gravity;
|
|
97
|
+
}
|
|
153
98
|
|
|
154
99
|
/**
|
|
155
|
-
* @
|
|
156
|
-
* @private
|
|
100
|
+
* @param {Float64Array} value
|
|
157
101
|
*/
|
|
158
|
-
|
|
102
|
+
set gravity(value) {
|
|
103
|
+
this.world.gravity = value;
|
|
104
|
+
}
|
|
159
105
|
|
|
160
106
|
/**
|
|
161
|
-
* @
|
|
162
|
-
*
|
|
107
|
+
* Where the air comes from — see {@link ClothWorld#wind}. `null` by default,
|
|
108
|
+
* which is a scene with no wind in it.
|
|
109
|
+
* @returns {AbstractClothWind|null}
|
|
163
110
|
*/
|
|
164
|
-
|
|
111
|
+
get wind() {
|
|
112
|
+
return this.world.wind;
|
|
113
|
+
}
|
|
165
114
|
|
|
166
115
|
/**
|
|
167
|
-
*
|
|
168
|
-
* `instance_of(entity)` with a `SceneBundleInstance` will do, and
|
|
169
|
-
* {@link MeshSystem} is what does in a running engine.
|
|
170
|
-
*
|
|
171
|
-
* Public and assignable because a garment's joints are a *rendering*
|
|
172
|
-
* structure and `MeshSystem` needs a graphics engine, a scene and a loader
|
|
173
|
-
* to exist — so a spec that wants joints without a renderer sets this
|
|
174
|
-
* instead, and gets exactly the interface the system uses.
|
|
175
|
-
*
|
|
176
|
-
* `null` means no rig can seed, which is the same additive shape the
|
|
177
|
-
* collider index has: a scene without one gets M1's cloth rather than an
|
|
178
|
-
* error.
|
|
179
|
-
* @type {{instance_of: function(number): (SceneBundleInstance|null)}|null}
|
|
116
|
+
* @param {AbstractClothWind|null} value
|
|
180
117
|
*/
|
|
181
|
-
|
|
118
|
+
set wind(value) {
|
|
119
|
+
this.world.wind = value;
|
|
120
|
+
}
|
|
182
121
|
|
|
183
122
|
/**
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
* new requirement on every scene.
|
|
188
|
-
* @type {ClothColliderSystem|null}
|
|
189
|
-
* @private
|
|
123
|
+
* Live cloths, ordered so that an instance whose anchor sits inside another
|
|
124
|
+
* instance's subtree steps after it.
|
|
125
|
+
* @returns {ClothInstance[]}
|
|
190
126
|
*/
|
|
191
|
-
|
|
127
|
+
get instances() {
|
|
128
|
+
return this.world.instances;
|
|
129
|
+
}
|
|
192
130
|
|
|
193
131
|
/**
|
|
194
|
-
* @
|
|
195
|
-
* @
|
|
132
|
+
* Where a skinned model instance comes from — see {@link ClothWorld#models}.
|
|
133
|
+
* @returns {{instance_of: function(number): (PrefabInstance|null)}|null}
|
|
196
134
|
*/
|
|
197
|
-
|
|
135
|
+
get models() {
|
|
136
|
+
return this.world.models;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @param {{instance_of: function(number): (PrefabInstance|null)}|null} value
|
|
141
|
+
*/
|
|
142
|
+
set models(value) {
|
|
143
|
+
this.world.models = value;
|
|
144
|
+
}
|
|
198
145
|
|
|
199
146
|
/**
|
|
200
147
|
* @param {EntityManager} entityManager
|
|
201
148
|
* @returns {Promise<void>}
|
|
202
149
|
*/
|
|
203
150
|
async startup(entityManager) {
|
|
204
|
-
this.
|
|
205
|
-
|
|
206
|
-
assert.notNull(
|
|
207
|
-
this.__attachments,
|
|
208
|
-
'ClothSystem needs a TransformAttachmentSystem: the subtree walk is its parent-to-children index'
|
|
209
|
-
);
|
|
210
|
-
|
|
211
|
-
// Optional by design. A scene with no ClothColliderSystem gets cloth
|
|
212
|
-
// that does not collide, rather than cloth that throws.
|
|
213
|
-
this.__colliders = entityManager.getSystem(ClothColliderSystem) ?? null;
|
|
214
|
-
|
|
215
|
-
if (this.models === null) {
|
|
216
|
-
this.models = entityManager.getSystem(MeshSystem) ?? null;
|
|
217
|
-
}
|
|
151
|
+
this.world.attach(entityManager);
|
|
218
152
|
}
|
|
219
153
|
|
|
220
154
|
/**
|
|
@@ -223,16 +157,7 @@ export class ClothSystem extends System {
|
|
|
223
157
|
* @param {number} entity
|
|
224
158
|
*/
|
|
225
159
|
link(cloth, transform, entity) {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
instance.entity = entity;
|
|
229
|
-
instance.cloth = cloth;
|
|
230
|
-
instance.transform = transform;
|
|
231
|
-
|
|
232
|
-
this.instances.push(instance);
|
|
233
|
-
this.__by_entity.set(entity, instance);
|
|
234
|
-
|
|
235
|
-
this.__order_dirty = true;
|
|
160
|
+
this.world.link(cloth, transform, entity);
|
|
236
161
|
}
|
|
237
162
|
|
|
238
163
|
/**
|
|
@@ -241,61 +166,25 @@ export class ClothSystem extends System {
|
|
|
241
166
|
* @param {number} entity
|
|
242
167
|
*/
|
|
243
168
|
unlink(cloth, transform, entity) {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
if (instance === undefined) {
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
this.__by_entity.delete(entity);
|
|
251
|
-
|
|
252
|
-
const index = this.instances.indexOf(instance);
|
|
253
|
-
|
|
254
|
-
if (index >= 0) {
|
|
255
|
-
this.instances.splice(index, 1);
|
|
256
|
-
}
|
|
169
|
+
this.world.unlink(entity);
|
|
257
170
|
}
|
|
258
171
|
|
|
259
172
|
/**
|
|
260
173
|
* Throw away a cloth's binding so the next step walks its subtree again.
|
|
261
|
-
*
|
|
262
|
-
* The walk is done once, because a rope's links do not come and go. When
|
|
263
|
-
* they do — a chain gains a link, a rig is rebuilt — this is how you say so,
|
|
264
|
-
* and it is the same contract `TransformAttachment#parent` already carries:
|
|
265
|
-
* the structure is immutable while it is attached, and changing it is an
|
|
266
|
-
* explicit act rather than something the engine polls for.
|
|
267
|
-
*
|
|
268
174
|
* @param {number} entity
|
|
269
175
|
* @returns {void}
|
|
270
176
|
*/
|
|
271
177
|
reseed(entity) {
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
if (instance === undefined) {
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
instance.seeded = false;
|
|
279
|
-
instance.anchor_valid = false;
|
|
280
|
-
|
|
281
|
-
this.__order_dirty = true;
|
|
178
|
+
this.world.reseed(entity);
|
|
282
179
|
}
|
|
283
180
|
|
|
284
181
|
/**
|
|
285
|
-
* Wake a sleeping cloth.
|
|
286
|
-
* on their own; a caller that has changed the world in some way the cloth
|
|
287
|
-
* cannot see — M6's wind, for one — says so here.
|
|
288
|
-
*
|
|
182
|
+
* Wake a sleeping cloth.
|
|
289
183
|
* @param {number} entity
|
|
290
184
|
* @returns {void}
|
|
291
185
|
*/
|
|
292
186
|
wake(entity) {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
if (instance !== undefined) {
|
|
296
|
-
instance.asleep = false;
|
|
297
|
-
instance.still_steps = 0;
|
|
298
|
-
}
|
|
187
|
+
this.world.wake(entity);
|
|
299
188
|
}
|
|
300
189
|
|
|
301
190
|
/**
|
|
@@ -303,7 +192,7 @@ export class ClothSystem extends System {
|
|
|
303
192
|
* @returns {ClothInstance|undefined}
|
|
304
193
|
*/
|
|
305
194
|
instanceOf(entity) {
|
|
306
|
-
return this.
|
|
195
|
+
return this.world.instanceOf(entity);
|
|
307
196
|
}
|
|
308
197
|
|
|
309
198
|
/**
|
|
@@ -316,706 +205,28 @@ export class ClothSystem extends System {
|
|
|
316
205
|
return;
|
|
317
206
|
}
|
|
318
207
|
|
|
319
|
-
const
|
|
208
|
+
const world = this.world;
|
|
320
209
|
|
|
321
|
-
|
|
322
|
-
this.#reorder(ecd);
|
|
323
|
-
}
|
|
210
|
+
world.begin(ecd, dt);
|
|
324
211
|
|
|
325
|
-
|
|
326
|
-
// update, because the engine's ordering cannot put a reader after a
|
|
327
|
-
// writer of the same component and `ClothColliderSystem` reads strictly
|
|
328
|
-
// less than this system does. §4.1's conclusion, applied a second time:
|
|
329
|
-
// the answer is not a third mechanism, it is one call site.
|
|
330
|
-
if (this.__colliders !== null) {
|
|
331
|
-
this.__colliders.refresh();
|
|
332
|
-
}
|
|
212
|
+
const instances = world.instances;
|
|
333
213
|
|
|
334
|
-
|
|
335
|
-
const instance = instances[i];
|
|
336
|
-
|
|
337
|
-
if (instance.refused) {
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
if (!instance.seeded) {
|
|
342
|
-
this.#seed(instance, ecd, dt);
|
|
343
|
-
|
|
344
|
-
if (!instance.seeded) {
|
|
345
|
-
// A rig whose model has not finished loading. Nothing is
|
|
346
|
-
// wrong and nothing is retried-with-backoff: the next step
|
|
347
|
-
// asks again, and a model that never loads costs one map
|
|
348
|
-
// lookup a step.
|
|
349
|
-
continue;
|
|
350
|
-
}
|
|
351
|
-
} else if (!instance.cloth.dynamics.equals(instance.dynamics_seen)) {
|
|
352
|
-
if (cloth_dynamics_change_needs_reseed(instance.dynamics_seen, instance.cloth.dynamics)) {
|
|
353
|
-
this.#seed(instance, ecd, dt);
|
|
354
|
-
} else {
|
|
355
|
-
cloth_reparameterise(instance, dt);
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
instance.asleep = false;
|
|
359
|
-
instance.still_steps = 0;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
this.#advance(instance, ecd, dt);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
/**
|
|
367
|
-
* Walk whichever hierarchy this cloth is built on.
|
|
368
|
-
*
|
|
369
|
-
* **The discriminator is a component's presence** (§3.1): `Cloth` alone
|
|
370
|
-
* simulates the entity's own transform subtree, `Cloth` + {@link ClothRig}
|
|
371
|
-
* simulates the joints of the skinned model the entity is showing. There is
|
|
372
|
-
* no mode field anywhere, and the solver does not know which ran.
|
|
373
|
-
*
|
|
374
|
-
* A rig can fail to seed for reasons that are not errors — the model has
|
|
375
|
-
* not loaded, or nothing in the manager hands out model instances — and one
|
|
376
|
-
* that does is left unseeded for the next step to try again. A rig that
|
|
377
|
-
* fails for a reason that *is* an error says so once and then stops, because
|
|
378
|
-
* a proxy that does not fit its skin will not start fitting it.
|
|
379
|
-
*
|
|
380
|
-
* @param {ClothInstance} instance
|
|
381
|
-
* @param {EntityComponentDataset} ecd
|
|
382
|
-
* @param {number} dt
|
|
383
|
-
* @private
|
|
384
|
-
*/
|
|
385
|
-
#seed(instance, ecd, dt) {
|
|
386
|
-
const rig = ecd.getComponent(instance.entity, ClothRig);
|
|
387
|
-
|
|
388
|
-
if (rig === undefined || rig === null || rig.proxy === null) {
|
|
389
|
-
instance.rig = null;
|
|
390
|
-
|
|
391
|
-
cloth_seed_subtree(instance, ecd, this.__attachments, dt);
|
|
392
|
-
|
|
393
|
-
return;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
if (this.models === null) {
|
|
397
|
-
this.#refuse(instance, `entity ${instance.entity} has a ClothRig and nothing hands out model instances`);
|
|
398
|
-
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
const model = this.models.instance_of(instance.entity);
|
|
403
|
-
|
|
404
|
-
if (model === null || model === undefined) {
|
|
405
|
-
// Still loading. Not an error, and not worth a message.
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
const skin = model.skins[rig.skin];
|
|
410
|
-
|
|
411
|
-
const error = rig.proxy.checkAgainst(skin);
|
|
412
|
-
|
|
413
|
-
if (error !== "") {
|
|
414
|
-
this.#refuse(instance, `entity ${instance.entity}: ${error}`);
|
|
415
|
-
|
|
416
|
-
return;
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
instance.rig = rig;
|
|
420
|
-
|
|
421
|
-
cloth_seed_rig(instance, rig.proxy, skin.joints, dt);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* Say once why a rig will not seed, and stop asking.
|
|
426
|
-
*
|
|
427
|
-
* @param {ClothInstance} instance
|
|
428
|
-
* @param {string} message
|
|
429
|
-
* @private
|
|
430
|
-
*/
|
|
431
|
-
#refuse(instance, message) {
|
|
432
|
-
if (instance.refused) {
|
|
433
|
-
return;
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
instance.refused = true;
|
|
437
|
-
|
|
438
|
-
console.warn(`ClothSystem: ${message}`);
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* Depth-first order by hierarchy depth, so a nested cloth reads an anchor
|
|
443
|
-
* the cloth above it has already written.
|
|
444
|
-
*
|
|
445
|
-
* @param {EntityComponentDataset} ecd
|
|
446
|
-
* @private
|
|
447
|
-
*/
|
|
448
|
-
#reorder(ecd) {
|
|
449
|
-
const instances = this.instances;
|
|
214
|
+
const params = this.__params;
|
|
450
215
|
|
|
451
216
|
for (let i = 0; i < instances.length; i++) {
|
|
452
217
|
const instance = instances[i];
|
|
453
218
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
// Bounded by the number of entities; a cycle in the attachment
|
|
458
|
-
// graph is not this system's to diagnose, but it is this loop's to
|
|
459
|
-
// survive.
|
|
460
|
-
for (let guard = 0; guard < 4096; guard++) {
|
|
461
|
-
const attachment = ecd.getComponent(entity, TransformAttachment);
|
|
462
|
-
|
|
463
|
-
if (attachment === undefined) {
|
|
464
|
-
break;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
entity = attachment.parent;
|
|
468
|
-
depth++;
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
instance.depth = depth;
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
instances.sort((a, b) => a.depth - b.depth);
|
|
475
|
-
|
|
476
|
-
this.__order_dirty = false;
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
/**
|
|
480
|
-
* @param {ClothInstance} instance
|
|
481
|
-
* @param {EntityComponentDataset} ecd
|
|
482
|
-
* @param {number} dt
|
|
483
|
-
* @private
|
|
484
|
-
*/
|
|
485
|
-
#advance(instance, ecd, dt) {
|
|
486
|
-
const transform = instance.rig === null
|
|
487
|
-
? instance.transform
|
|
488
|
-
: this.#anchor_pose(instance);
|
|
489
|
-
|
|
490
|
-
const tx = transform[TRANSFORM64_TRANSLATION_OFFSET];
|
|
491
|
-
const ty = transform[TRANSFORM64_TRANSLATION_OFFSET + 1];
|
|
492
|
-
const tz = transform[TRANSFORM64_TRANSLATION_OFFSET + 2];
|
|
493
|
-
|
|
494
|
-
const qx = transform[TRANSFORM64_ROTATION_OFFSET];
|
|
495
|
-
const qy = transform[TRANSFORM64_ROTATION_OFFSET + 1];
|
|
496
|
-
const qz = transform[TRANSFORM64_ROTATION_OFFSET + 2];
|
|
497
|
-
const qw = transform[TRANSFORM64_ROTATION_OFFSET + 3];
|
|
498
|
-
|
|
499
|
-
const previous_translation = instance.anchor_translation;
|
|
500
|
-
const previous_rotation = instance.anchor_rotation;
|
|
501
|
-
|
|
502
|
-
if (instance.cloth.blend !== instance.blend_seen) {
|
|
503
|
-
instance.asleep = false;
|
|
504
|
-
instance.still_steps = 0;
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
const moved = instance.anchor_valid && (
|
|
508
|
-
previous_translation[0] !== tx
|
|
509
|
-
|| previous_translation[1] !== ty
|
|
510
|
-
|| previous_translation[2] !== tz
|
|
511
|
-
|| previous_rotation[0] !== qx
|
|
512
|
-
|| previous_rotation[1] !== qy
|
|
513
|
-
|| previous_rotation[2] !== qz
|
|
514
|
-
|| previous_rotation[3] !== qw
|
|
515
|
-
);
|
|
516
|
-
|
|
517
|
-
if (moved) {
|
|
518
|
-
instance.asleep = false;
|
|
519
|
-
instance.still_steps = 0;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
if (instance.asleep && this.__colliders !== null && instance.collider_count >= 0) {
|
|
523
|
-
// §7 P5's "wake on collider motion". A sleeping cloth is neither
|
|
524
|
-
// stepped nor written back, so something has to notice the world it
|
|
525
|
-
// was resting against moving out from under it, and a broadphase
|
|
526
|
-
// query plus a pose comparison is three orders of magnitude cheaper
|
|
527
|
-
// than the step it decides whether to skip.
|
|
528
|
-
if (cloth_colliders_moved(instance, this.__colliders.index)) {
|
|
529
|
-
instance.asleep = false;
|
|
530
|
-
instance.still_steps = 0;
|
|
219
|
+
if (!world.ensure_seeded(instance, ecd, dt)) {
|
|
220
|
+
continue;
|
|
531
221
|
}
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
if (instance.asleep) {
|
|
535
|
-
// Nothing is stepped and nothing is written: the pose on the
|
|
536
|
-
// subtree is already the pose, and rewriting it is what would make
|
|
537
|
-
// §7 P5's "bit-identical across the following 300 steps" an
|
|
538
|
-
// aspiration rather than a fact.
|
|
539
|
-
return;
|
|
540
|
-
}
|
|
541
222
|
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
const teleport = displacement > Math.max(
|
|
546
|
-
CLOTH_TELEPORT_REACH * instance.reach,
|
|
547
|
-
CLOTH_TELEPORT_FLOOR
|
|
548
|
-
);
|
|
549
|
-
|
|
550
|
-
if (teleport) {
|
|
551
|
-
this.#teleport(instance);
|
|
552
|
-
} else {
|
|
553
|
-
move_local_frame(
|
|
554
|
-
instance,
|
|
555
|
-
tx, ty, tz, qx, qy, qz, qw,
|
|
556
|
-
previous_translation, previous_rotation
|
|
557
|
-
);
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
previous_translation[0] = tx;
|
|
562
|
-
previous_translation[1] = ty;
|
|
563
|
-
previous_translation[2] = tz;
|
|
564
|
-
|
|
565
|
-
previous_rotation[0] = qx;
|
|
566
|
-
previous_rotation[1] = qy;
|
|
567
|
-
previous_rotation[2] = qz;
|
|
568
|
-
previous_rotation[3] = qw;
|
|
569
|
-
|
|
570
|
-
instance.anchor_valid = true;
|
|
571
|
-
|
|
572
|
-
refresh_leash_targets(instance);
|
|
573
|
-
|
|
574
|
-
const dynamics = instance.cloth.dynamics;
|
|
575
|
-
|
|
576
|
-
damp(instance, cloth_velocity_retention(dynamics.damping, dt));
|
|
577
|
-
|
|
578
|
-
// Gravity is a world vector and the solve is in the anchor's frame.
|
|
579
|
-
const gravity = this.gravity;
|
|
580
|
-
|
|
581
|
-
v3_quaternion_apply_inverse(LOCAL_GRAVITY, 0, gravity[0], gravity[1], gravity[2], qx, qy, qz, qw);
|
|
582
|
-
|
|
583
|
-
const state = instance.state;
|
|
584
|
-
|
|
585
|
-
let limit = cloth_velocity_limit(
|
|
586
|
-
instance.shortest_row, dynamics.substeps, dynamics.iterations, dt
|
|
587
|
-
);
|
|
588
|
-
|
|
589
|
-
state.contact_radius = dynamics.thickness;
|
|
590
|
-
|
|
591
|
-
if (this.__colliders !== null) {
|
|
592
|
-
// The gather's margin is how far a particle may travel this step,
|
|
593
|
-
// which is the velocity clamp read as a distance — the quantity it
|
|
594
|
-
// was built out of (`cloth_dynamics_map.js`).
|
|
595
|
-
cloth_gather_colliders(instance, this.__colliders.index, limit * dt);
|
|
596
|
-
|
|
597
|
-
instance.contact_count = cloth_contact_find(
|
|
598
|
-
state, instance.collider_table, instance.collider_key, instance.collider_count
|
|
599
|
-
);
|
|
600
|
-
} else {
|
|
601
|
-
instance.collider_count = 0;
|
|
602
|
-
instance.contact_count = 0;
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
if ((dynamics.flags & ClothDynamicsFlags.SelfCollision) !== 0) {
|
|
606
|
-
// Half the shortest row, so the row's diameter is one particle
|
|
607
|
-
// spacing. `ClothState#self_radius` carries why the fabric's own
|
|
608
|
-
// thickness is the wrong length here and `MEASUREMENTS.md` §31 is the
|
|
609
|
-
// sweep that settled it. A fabric thicker than its proxy is coarse
|
|
610
|
-
// keeps its thickness — and is then clamped under the closest pair
|
|
611
|
-
// the proxy has with no row between them, because a diameter that
|
|
612
|
-
// reaches that pair puts a cloth which is not folded at all in
|
|
613
|
-
// permanent contact with itself (§36, §37).
|
|
614
|
-
state.self_radius = Math.min(
|
|
615
|
-
Math.max(dynamics.thickness, instance.shortest_row * CLOTH_SELF_RADIUS_MIN_RATIO),
|
|
616
|
-
instance.closest_free_pair * CLOTH_SELF_RADIUS_MAX_RATIO
|
|
617
|
-
);
|
|
618
|
-
|
|
619
|
-
instance.self_pairs = cloth_self_find(state, instance.self_exclusions);
|
|
620
|
-
} else {
|
|
621
|
-
state.self_count = 0;
|
|
622
|
-
instance.self_pairs = 0;
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
cloth_step(
|
|
626
|
-
state, dt,
|
|
627
|
-
LOCAL_GRAVITY[0], LOCAL_GRAVITY[1], LOCAL_GRAVITY[2],
|
|
628
|
-
dynamics.substeps, dynamics.iterations,
|
|
629
|
-
instance.collider_table, instance.collider_count
|
|
630
|
-
);
|
|
631
|
-
|
|
632
|
-
if (instance.stabilise_remaining > 0) {
|
|
633
|
-
// Ramp back from nothing over the window. The first step after a
|
|
634
|
-
// reset is allowed no velocity at all, which is what stops a
|
|
635
|
-
// re-seeded cloth from snapping taut and whipping.
|
|
636
|
-
limit *= (CLOTH_STABILISE_STEPS - instance.stabilise_remaining) / CLOTH_STABILISE_STEPS;
|
|
637
|
-
|
|
638
|
-
instance.stabilise_remaining--;
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
const speed = clamp_velocity(instance, limit);
|
|
642
|
-
|
|
643
|
-
if ((instance.cloth.flags & ClothFlags.NeverSleep) === 0) {
|
|
644
|
-
if (speed < CLOTH_SLEEP_SPEED_RATIO * instance.reach) {
|
|
645
|
-
instance.still_steps++;
|
|
646
|
-
|
|
647
|
-
if (instance.still_steps >= CLOTH_SLEEP_STEPS) {
|
|
648
|
-
instance.asleep = true;
|
|
649
|
-
}
|
|
650
|
-
} else {
|
|
651
|
-
instance.still_steps = 0;
|
|
223
|
+
if (!world.advance(instance, dt, params, 0)) {
|
|
224
|
+
continue;
|
|
652
225
|
}
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
instance.blend_seen = instance.cloth.blend;
|
|
656
|
-
|
|
657
|
-
if (instance.rig === null) {
|
|
658
|
-
cloth_write_back(instance, ecd);
|
|
659
|
-
} else {
|
|
660
|
-
cloth_write_back_rig(instance, transform);
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
/**
|
|
665
|
-
* The anchor joint's world pose, computed on the CPU from the clips the
|
|
666
|
-
* entity is playing.
|
|
667
|
-
*
|
|
668
|
-
* **Computed, never read back**, for two reasons that are both the engine's
|
|
669
|
-
* own. A joint of an animated skeleton is under `TransformAuthority.GPU`,
|
|
670
|
-
* so nothing maintains its CPU-side `transform_global` and reading it gives
|
|
671
|
-
* whatever the node was last posed at by hand. And GPU readback is a frame
|
|
672
|
-
* late and asynchronous, so anything depending on it would depend on frame
|
|
673
|
-
* pacing — which is why `query_entity_node_world_pose` exists and is
|
|
674
|
-
* documented as the only sanctioned way to ask this question. A cape and a
|
|
675
|
-
* scabbard on the same shoulder get their answer from the same evaluator,
|
|
676
|
-
* off the same clock, which is what keeps them on the same shoulder.
|
|
677
|
-
*
|
|
678
|
-
* @param {ClothInstance} instance
|
|
679
|
-
* @returns {Transform64}
|
|
680
|
-
* @private
|
|
681
|
-
*/
|
|
682
|
-
#anchor_pose(instance) {
|
|
683
|
-
const playbacks = PLAYBACKS;
|
|
684
|
-
|
|
685
|
-
playbacks.length = 0;
|
|
686
|
-
|
|
687
|
-
collect_entity_playbacks(playbacks, this.entityManager, instance.entity);
|
|
688
|
-
|
|
689
|
-
pose_evaluate_world(instance.anchor_pose, instance.node_joint[0], playbacks);
|
|
690
|
-
|
|
691
|
-
playbacks.length = 0;
|
|
692
|
-
|
|
693
|
-
return instance.anchor_pose;
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
/**
|
|
697
|
-
* @param {ClothInstance} instance
|
|
698
|
-
* @private
|
|
699
|
-
*/
|
|
700
|
-
#teleport(instance) {
|
|
701
|
-
instance.teleport_count++;
|
|
702
|
-
|
|
703
|
-
if ((instance.cloth.flags & ClothFlags.TeleportKeep) !== 0) {
|
|
704
|
-
// `Keep` carries the cloth's shape across the jump. Particles are
|
|
705
|
-
// stored relative to the anchor, so that is exactly what happens if
|
|
706
|
-
// this function does nothing to them — the frame moved and they did
|
|
707
|
-
// not, which is MagicaCloth2's rigid delta expressed in the frame
|
|
708
|
-
// that makes it free.
|
|
709
|
-
return;
|
|
710
|
-
}
|
|
711
|
-
|
|
712
|
-
const state = instance.state;
|
|
713
|
-
|
|
714
|
-
const node_count = instance.node_count;
|
|
715
|
-
const animated = instance.animated_position;
|
|
716
|
-
const particle_of_node = instance.particle_of_node;
|
|
717
|
-
|
|
718
|
-
for (let node = 0; node < node_count; node++) {
|
|
719
|
-
const p = particle_of_node[node] * 3;
|
|
720
|
-
const n = node * 3;
|
|
721
|
-
|
|
722
|
-
state.position[p] = animated[n];
|
|
723
|
-
state.position[p + 1] = animated[n + 1];
|
|
724
|
-
state.position[p + 2] = animated[n + 2];
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
state.position_previous.set(state.position);
|
|
728
|
-
state.velocity.fill(0);
|
|
729
|
-
state.inertia_blend.fill(0);
|
|
730
|
-
|
|
731
|
-
// The multipliers describe forces in a configuration that no longer
|
|
732
|
-
// exists. Carrying them across would apply the old pose's tension to
|
|
733
|
-
// the new one on the first iteration, which is a whip with extra steps.
|
|
734
|
-
state.stretch_lambda.fill(0);
|
|
735
|
-
state.bend_lambda.fill(0);
|
|
736
|
-
state.leash_lambda.fill(0);
|
|
737
|
-
|
|
738
|
-
instance.stabilise_remaining = CLOTH_STABILISE_STEPS;
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
/**
|
|
743
|
-
* The clip set handed to the pose evaluator, rebuilt per call from the
|
|
744
|
-
* animation systems' own entries. Nothing in here outlives the call.
|
|
745
|
-
* @type {PosePlayback[]}
|
|
746
|
-
* @private
|
|
747
|
-
*/
|
|
748
|
-
const PLAYBACKS = [];
|
|
749
|
-
|
|
750
|
-
/**
|
|
751
|
-
* @type {Float64Array}
|
|
752
|
-
* @private
|
|
753
|
-
*/
|
|
754
|
-
const LOCAL_GRAVITY = new Float64Array(3);
|
|
755
|
-
|
|
756
|
-
/**
|
|
757
|
-
* @type {Float64Array}
|
|
758
|
-
* @private
|
|
759
|
-
*/
|
|
760
|
-
const FRAME = new Float64Array(8);
|
|
761
|
-
|
|
762
|
-
/**
|
|
763
|
-
* Carry the particles across a change of anchor pose, by however much of it the
|
|
764
|
-
* fabric is willing to feel. §7 P7.
|
|
765
|
-
*
|
|
766
|
-
* A particle at local `p` was at world `t_prev + q_prev·p`. Holding that world
|
|
767
|
-
* position fixed, its local coordinates become `D + Q·p` with
|
|
768
|
-
* `D = q_now⁻¹·(t_prev − t_now)` and `Q = q_now⁻¹ ⊗ q_prev`. Feeling *all* of
|
|
769
|
-
* the anchor's motion is taking that; feeling *none* is leaving `p` alone; and
|
|
770
|
-
* `inertia` is the lerp between them. Velocity is carried the same way, minus
|
|
771
|
-
* the translation, since a translation of the frame does not rotate a vector.
|
|
772
|
-
*
|
|
773
|
-
* `D` and `Q` are limited before the lerp. The limits are the cloth's own reach
|
|
774
|
-
* per step and a fixed angle per step, which is what makes an anchor that
|
|
775
|
-
* teleports a metre — or spins — something a cape *lags behind* rather than
|
|
776
|
-
* something it is fired out of.
|
|
777
|
-
*
|
|
778
|
-
* @param {ClothInstance} instance
|
|
779
|
-
* @param {number} tx
|
|
780
|
-
* @param {number} ty
|
|
781
|
-
* @param {number} tz
|
|
782
|
-
* @param {number} qx
|
|
783
|
-
* @param {number} qy
|
|
784
|
-
* @param {number} qz
|
|
785
|
-
* @param {number} qw
|
|
786
|
-
* @param {Float64Array} previous_translation
|
|
787
|
-
* @param {Float64Array} previous_rotation
|
|
788
|
-
* @private
|
|
789
|
-
*/
|
|
790
|
-
function move_local_frame(
|
|
791
|
-
instance,
|
|
792
|
-
tx, ty, tz, qx, qy, qz, qw,
|
|
793
|
-
previous_translation, previous_rotation
|
|
794
|
-
) {
|
|
795
|
-
let inertia = instance.cloth.dynamics.inertia;
|
|
796
|
-
|
|
797
|
-
if (inertia <= 0) {
|
|
798
|
-
return;
|
|
799
|
-
}
|
|
800
226
|
|
|
801
|
-
|
|
802
|
-
inertia = 1;
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
v3_quaternion_apply_inverse(
|
|
806
|
-
FRAME, 0,
|
|
807
|
-
previous_translation[0] - tx,
|
|
808
|
-
previous_translation[1] - ty,
|
|
809
|
-
previous_translation[2] - tz,
|
|
810
|
-
qx, qy, qz, qw
|
|
811
|
-
);
|
|
812
|
-
|
|
813
|
-
const travel_limit = CLOTH_ANCHOR_TRAVEL_REACH * instance.reach;
|
|
814
|
-
|
|
815
|
-
const travel = Math.hypot(FRAME[0], FRAME[1], FRAME[2]);
|
|
816
|
-
|
|
817
|
-
if (travel > travel_limit && travel > 0) {
|
|
818
|
-
const scale = travel_limit / travel;
|
|
819
|
-
|
|
820
|
-
FRAME[0] *= scale;
|
|
821
|
-
FRAME[1] *= scale;
|
|
822
|
-
FRAME[2] *= scale;
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
quat3_multiply(
|
|
826
|
-
FRAME, 4,
|
|
827
|
-
-qx, -qy, -qz, qw,
|
|
828
|
-
previous_rotation[0], previous_rotation[1], previous_rotation[2], previous_rotation[3]
|
|
829
|
-
);
|
|
830
|
-
|
|
831
|
-
// `|w|` is `cos(θ/2)`, so this is the angle test without an `acos`.
|
|
832
|
-
const half_angle_cos = FRAME[7] < 0 ? -FRAME[7] : FRAME[7];
|
|
833
|
-
|
|
834
|
-
if (half_angle_cos < Math.cos(CLOTH_ANCHOR_ROTATION_LIMIT * 0.5)) {
|
|
835
|
-
const angle = 2 * Math.acos(half_angle_cos > 1 ? 1 : half_angle_cos);
|
|
836
|
-
|
|
837
|
-
quat3_nlerp(
|
|
838
|
-
FRAME, 4,
|
|
839
|
-
0, 0, 0, 1,
|
|
840
|
-
FRAME[4], FRAME[5], FRAME[6], FRAME[7],
|
|
841
|
-
CLOTH_ANCHOR_ROTATION_LIMIT / angle
|
|
842
|
-
);
|
|
843
|
-
}
|
|
844
|
-
|
|
845
|
-
const state = instance.state;
|
|
846
|
-
|
|
847
|
-
const particle_count = state.particle_count;
|
|
848
|
-
|
|
849
|
-
const position = state.position;
|
|
850
|
-
const velocity = state.velocity;
|
|
851
|
-
|
|
852
|
-
const dx = FRAME[0];
|
|
853
|
-
const dy = FRAME[1];
|
|
854
|
-
const dz = FRAME[2];
|
|
855
|
-
|
|
856
|
-
const rx = FRAME[4];
|
|
857
|
-
const ry = FRAME[5];
|
|
858
|
-
const rz = FRAME[6];
|
|
859
|
-
const rw = FRAME[7];
|
|
860
|
-
|
|
861
|
-
for (let i = 0; i < particle_count; i++) {
|
|
862
|
-
const p = i * 3;
|
|
863
|
-
|
|
864
|
-
v3_quaternion_apply(CARRIED, 0, position[p], position[p + 1], position[p + 2], rx, ry, rz, rw);
|
|
865
|
-
|
|
866
|
-
position[p] += inertia * (CARRIED[0] + dx - position[p]);
|
|
867
|
-
position[p + 1] += inertia * (CARRIED[1] + dy - position[p + 1]);
|
|
868
|
-
position[p + 2] += inertia * (CARRIED[2] + dz - position[p + 2]);
|
|
869
|
-
|
|
870
|
-
v3_quaternion_apply(CARRIED, 0, velocity[p], velocity[p + 1], velocity[p + 2], rx, ry, rz, rw);
|
|
871
|
-
|
|
872
|
-
velocity[p] += inertia * (CARRIED[0] - velocity[p]);
|
|
873
|
-
velocity[p + 1] += inertia * (CARRIED[1] - velocity[p + 1]);
|
|
874
|
-
velocity[p + 2] += inertia * (CARRIED[2] - velocity[p + 2]);
|
|
875
|
-
}
|
|
876
|
-
|
|
877
|
-
// The anchor is pinned and is the origin of the frame it anchors, so it is
|
|
878
|
-
// the one particle that must not be carried anywhere.
|
|
879
|
-
const anchor = instance.particle_of_node[0] * 3;
|
|
880
|
-
|
|
881
|
-
position[anchor] = 0;
|
|
882
|
-
position[anchor + 1] = 0;
|
|
883
|
-
position[anchor + 2] = 0;
|
|
884
|
-
|
|
885
|
-
velocity[anchor] = 0;
|
|
886
|
-
velocity[anchor + 1] = 0;
|
|
887
|
-
velocity[anchor + 2] = 0;
|
|
888
|
-
}
|
|
889
|
-
|
|
890
|
-
/**
|
|
891
|
-
* @type {Float64Array}
|
|
892
|
-
* @private
|
|
893
|
-
*/
|
|
894
|
-
const CARRIED = new Float64Array(3);
|
|
895
|
-
|
|
896
|
-
/**
|
|
897
|
-
* Point every leash row at where it measures from: a slack row at the
|
|
898
|
-
* particle's animated position, a tether at the anchor.
|
|
899
|
-
*
|
|
900
|
-
* @param {ClothInstance} instance
|
|
901
|
-
* @private
|
|
902
|
-
*/
|
|
903
|
-
function refresh_leash_targets(instance) {
|
|
904
|
-
const state = instance.state;
|
|
905
|
-
|
|
906
|
-
const target = state.leash_target;
|
|
907
|
-
|
|
908
|
-
const animated = instance.animated_position;
|
|
909
|
-
|
|
910
|
-
const anchor = instance.particle_of_node[0] * 3;
|
|
911
|
-
|
|
912
|
-
const anchor_x = state.position[anchor];
|
|
913
|
-
const anchor_y = state.position[anchor + 1];
|
|
914
|
-
const anchor_z = state.position[anchor + 2];
|
|
227
|
+
cloth_step_instance(instance.state, instance.self_exclusions, params, 0);
|
|
915
228
|
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
const slack_row = instance.slack_row;
|
|
919
|
-
const tether_row = instance.tether_row;
|
|
920
|
-
|
|
921
|
-
for (let node = 1; node < node_count; node++) {
|
|
922
|
-
const tether = tether_row[node];
|
|
923
|
-
|
|
924
|
-
if (tether >= 0) {
|
|
925
|
-
target[tether * 3] = anchor_x;
|
|
926
|
-
target[tether * 3 + 1] = anchor_y;
|
|
927
|
-
target[tether * 3 + 2] = anchor_z;
|
|
928
|
-
}
|
|
929
|
-
|
|
930
|
-
const slack = slack_row[node];
|
|
931
|
-
|
|
932
|
-
if (slack >= 0) {
|
|
933
|
-
target[slack * 3] = animated[node * 3];
|
|
934
|
-
target[slack * 3 + 1] = animated[node * 3 + 1];
|
|
935
|
-
target[slack * 3 + 2] = animated[node * 3 + 2];
|
|
936
|
-
}
|
|
937
|
-
}
|
|
938
|
-
}
|
|
939
|
-
|
|
940
|
-
/**
|
|
941
|
-
* Scale every particle's velocity, which is §7 P5's other half.
|
|
942
|
-
*
|
|
943
|
-
* The multiplier decay `α·γ` bleeds accumulated force out of a **hard** row,
|
|
944
|
-
* and a soft row has no multiplier to decay — M0 measured a soft cloth landing
|
|
945
|
-
* in a bounded limit cycle that 2,000 further steps do not move. This is what
|
|
946
|
-
* reaches it, and it is why `ClothDynamics#damping` is part of the correctness
|
|
947
|
-
* argument rather than a taste control. `MEASUREMENTS.md` §6.
|
|
948
|
-
*
|
|
949
|
-
* @param {ClothInstance} instance
|
|
950
|
-
* @param {number} retention `[0, 1]`
|
|
951
|
-
* @private
|
|
952
|
-
*/
|
|
953
|
-
function damp(instance, retention) {
|
|
954
|
-
if (retention >= 1) {
|
|
955
|
-
return;
|
|
956
|
-
}
|
|
957
|
-
|
|
958
|
-
const velocity = instance.state.velocity;
|
|
959
|
-
|
|
960
|
-
for (let i = 0; i < velocity.length; i++) {
|
|
961
|
-
velocity[i] *= retention;
|
|
962
|
-
}
|
|
963
|
-
}
|
|
964
|
-
|
|
965
|
-
/**
|
|
966
|
-
* Hold every particle's speed under the limit derived from
|
|
967
|
-
* `ClothDynamics#thickness`, and report the largest speed left afterwards so
|
|
968
|
-
* the sleep test has something to read.
|
|
969
|
-
*
|
|
970
|
-
* §7 P1 names this clamp and M0 deliberately left it out, because a clamp would
|
|
971
|
-
* have masked the property M0 existed to measure. It is here rather than inside
|
|
972
|
-
* `cloth_step` for the same reason: the solver's stability is still its own.
|
|
973
|
-
*
|
|
974
|
-
* Speed rather than displacement is what the sleep test reads, because
|
|
975
|
-
* `position_previous` after a multi-substep step holds the start of the *last*
|
|
976
|
-
* substep rather than the start of the step, and a motion measure that quietly
|
|
977
|
-
* divides by the substep count is a sleep threshold that means something
|
|
978
|
-
* different for every fabric.
|
|
979
|
-
*
|
|
980
|
-
* @param {ClothInstance} instance
|
|
981
|
-
* @param {number} limit m/s
|
|
982
|
-
* @returns {number} largest particle speed after clamping, m/s
|
|
983
|
-
* @private
|
|
984
|
-
*/
|
|
985
|
-
function clamp_velocity(instance, limit) {
|
|
986
|
-
const state = instance.state;
|
|
987
|
-
|
|
988
|
-
const particle_count = state.particle_count;
|
|
989
|
-
|
|
990
|
-
const velocity = state.velocity;
|
|
991
|
-
|
|
992
|
-
const limit_squared = limit * limit;
|
|
993
|
-
|
|
994
|
-
let worst_squared = 0;
|
|
995
|
-
|
|
996
|
-
for (let i = 0; i < particle_count; i++) {
|
|
997
|
-
const p = i * 3;
|
|
998
|
-
|
|
999
|
-
const vx = velocity[p];
|
|
1000
|
-
const vy = velocity[p + 1];
|
|
1001
|
-
const vz = velocity[p + 2];
|
|
1002
|
-
|
|
1003
|
-
let speed_squared = vx * vx + vy * vy + vz * vz;
|
|
1004
|
-
|
|
1005
|
-
if (speed_squared > limit_squared) {
|
|
1006
|
-
const scale = limit / Math.sqrt(speed_squared);
|
|
1007
|
-
|
|
1008
|
-
velocity[p] = vx * scale;
|
|
1009
|
-
velocity[p + 1] = vy * scale;
|
|
1010
|
-
velocity[p + 2] = vz * scale;
|
|
1011
|
-
|
|
1012
|
-
speed_squared = limit_squared;
|
|
1013
|
-
}
|
|
1014
|
-
|
|
1015
|
-
if (speed_squared > worst_squared) {
|
|
1016
|
-
worst_squared = speed_squared;
|
|
229
|
+
world.finish(instance, ecd);
|
|
1017
230
|
}
|
|
1018
231
|
}
|
|
1019
|
-
|
|
1020
|
-
return Math.sqrt(worst_squared);
|
|
1021
232
|
}
|