@woosh/meep-engine 3.23.0 → 3.24.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 +416 -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/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/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/ClothInstance.d.ts +13 -15
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +12 -14
- 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/ClothSystem.d.ts +5 -4
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +11 -12
- 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_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/playground/README.md +11 -11
- 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/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/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_viewer/main.js +6 -2
- 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/GPUReadbackStagingRing.d.ts +96 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStagingRing.d.ts.map +1 -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/dynamic/GPUDynamicMeshResidency.js +1 -1
- 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/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/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.js +1 -1
- 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_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 +55 -48
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +594 -928
- 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/Node3D.d.ts +27 -8
- package/src/shade/renderer/scene/Node3D.d.ts.map +1 -1
- package/src/shade/renderer/scene/Node3DDirtyList.d.ts +59 -0
- package/src/shade/renderer/scene/Node3DDirtyList.d.ts.map +1 -0
- 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/SkinnedMesh.d.ts +10 -93
- package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +1 -1
- 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 +1136 -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/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.js +0 -164
- package/src/engine/graphics3/shade_node_to_entity_composition.js +0 -88
- package/src/shade/renderer/animation/compute_skin_world_bounds.js +0 -146
- package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +0 -531
- package/src/shade/renderer/animation/pose/pose_evaluate_world.js +0 -76
- package/src/shade/renderer/animation/skin_bind_transform.js +0 -33
- package/src/shade/renderer/animation/skin_frame_defect.js +0 -132
- package/src/shade/renderer/animation/skin_joint_matrix.js +0 -46
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +0 -216
- package/src/shade/renderer/scene/InstanceBatch.js +0 -235
- package/src/shade/renderer/scene/Mesh.js +0 -168
- package/src/shade/renderer/scene/Node3D.js +0 -263
- package/src/shade/renderer/scene/SceneNodeBinding.js +0 -56
- package/src/shade/renderer/scene/SkinnedMesh.js +0 -170
- package/src/shade/renderer/scene/TransformAuthority.js +0 -33
|
@@ -1,115 +1,58 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
cloth_reconstruct_pose(instance);
|
|
60
|
-
|
|
61
|
-
const node_count = instance.node_count;
|
|
62
|
-
|
|
63
|
-
const blended = instance.blended_position;
|
|
64
|
-
const reconstructed = instance.blended_rotation;
|
|
65
|
-
|
|
66
|
-
const ax = anchor[TRANSFORM64_TRANSLATION_OFFSET];
|
|
67
|
-
const ay = anchor[TRANSFORM64_TRANSLATION_OFFSET + 1];
|
|
68
|
-
const az = anchor[TRANSFORM64_TRANSLATION_OFFSET + 2];
|
|
69
|
-
|
|
70
|
-
const aqx = anchor[TRANSFORM64_ROTATION_OFFSET];
|
|
71
|
-
const aqy = anchor[TRANSFORM64_ROTATION_OFFSET + 1];
|
|
72
|
-
const aqz = anchor[TRANSFORM64_ROTATION_OFFSET + 2];
|
|
73
|
-
const aqw = anchor[TRANSFORM64_ROTATION_OFFSET + 3];
|
|
74
|
-
|
|
75
|
-
const parent = instance.node_parent;
|
|
76
|
-
const node_joint = instance.node_joint;
|
|
77
|
-
|
|
78
|
-
for (let node = 1; node < node_count; node++) {
|
|
79
|
-
const joint = node_joint[node];
|
|
80
|
-
|
|
81
|
-
if (joint === undefined || joint === null) {
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
cloth_write_local_pose(joint.transform_local, instance, node, parent[node]);
|
|
86
|
-
|
|
87
|
-
const global = joint.transform_global;
|
|
88
|
-
|
|
89
|
-
const n = node * 3;
|
|
90
|
-
|
|
91
|
-
v3_quaternion_apply(
|
|
92
|
-
global, TRANSFORM64_TRANSLATION_OFFSET,
|
|
93
|
-
blended[n], blended[n + 1], blended[n + 2],
|
|
94
|
-
aqx, aqy, aqz, aqw
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
global[TRANSFORM64_TRANSLATION_OFFSET] += ax;
|
|
98
|
-
global[TRANSFORM64_TRANSLATION_OFFSET + 1] += ay;
|
|
99
|
-
global[TRANSFORM64_TRANSLATION_OFFSET + 2] += az;
|
|
100
|
-
|
|
101
|
-
quat3_multiply(
|
|
102
|
-
global, TRANSFORM64_ROTATION_OFFSET,
|
|
103
|
-
aqx, aqy, aqz, aqw,
|
|
104
|
-
reconstructed[node * 4], reconstructed[node * 4 + 1],
|
|
105
|
-
reconstructed[node * 4 + 2], reconstructed[node * 4 + 3]
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
global.updateMatrix();
|
|
109
|
-
|
|
110
|
-
// The version is what the renderer compares against to decide whether
|
|
111
|
-
// to upload the row, so a joint whose transform changed and whose
|
|
112
|
-
// version did not is a joint that moved nowhere.
|
|
113
|
-
joint.needsUpdate = true;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
1
|
+
import { TRANSFORM_ATTACHMENT_EVENT_CHANGE } from "../../../ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js";
|
|
2
|
+
import { cloth_reconstruct_pose } from "./cloth_reconstruct_pose.js";
|
|
3
|
+
import { cloth_write_local_pose } from "./cloth_write_back.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* # Putting the answer back onto a skinned model's joints — §11.2
|
|
7
|
+
*
|
|
8
|
+
* The same reconstruction the entity path uses, written onto the joint entities' offsets.
|
|
9
|
+
* **Cloth moves joints; it does not produce vertices** — the mapping from a simulated joint to a
|
|
10
|
+
* render vertex already exists in this engine and it is the skin, so the existing skinning pass
|
|
11
|
+
* does the rest, including bounds refresh and BLAS refit that a bespoke vertex-deformation path
|
|
12
|
+
* would have to reimplement.
|
|
13
|
+
*
|
|
14
|
+
* ## The offset is the output
|
|
15
|
+
*
|
|
16
|
+
* A joint's `TransformAttachment` offset is its own truth and the handle §11.2 names: it is what
|
|
17
|
+
* the joint's row holds, and the GPU composes the world from it under the anchor's animated
|
|
18
|
+
* row. Writing it is announced on the joint, which is what carries it to the row — the model
|
|
19
|
+
* marks the row on that announcement — and what lets the attachment system recompose the CPU's
|
|
20
|
+
* copy of the world below it. That copy is composed under the anchor as the CPU knows it, which
|
|
21
|
+
* for a GPU-driven anchor is its rest pose: what the simulation may read about a cape joint is
|
|
22
|
+
* its offset, or an exact evaluation, never that composed world.
|
|
23
|
+
*
|
|
24
|
+
* Nothing above the anchor is touched: the anchor is the character's, animated by its clips,
|
|
25
|
+
* and this pass hangs a cape from it.
|
|
26
|
+
*
|
|
27
|
+
* @author Alex Goldring
|
|
28
|
+
* @copyright Company Named Limited (c) 2026
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Write the reconstructed pose onto the rig's joints.
|
|
33
|
+
*
|
|
34
|
+
* @param {ClothInstance} instance
|
|
35
|
+
* @param {EntityComponentDataset} ecd
|
|
36
|
+
*/
|
|
37
|
+
export function cloth_write_back_rig(instance, ecd) {
|
|
38
|
+
cloth_reconstruct_pose(instance);
|
|
39
|
+
|
|
40
|
+
const node_count = instance.node_count;
|
|
41
|
+
|
|
42
|
+
const parent = instance.node_parent;
|
|
43
|
+
const node_joint = instance.node_joint;
|
|
44
|
+
const node_attachment = instance.node_attachment;
|
|
45
|
+
|
|
46
|
+
for (let node = 1; node < node_count; node++) {
|
|
47
|
+
const joint = node_joint[node];
|
|
48
|
+
const attachment = node_attachment[node];
|
|
49
|
+
|
|
50
|
+
if (attachment === undefined || attachment === null || !ecd.entityExists(joint)) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
cloth_write_local_pose(attachment.transform, instance, node, parent[node]);
|
|
55
|
+
|
|
56
|
+
ecd.sendEvent(joint, TRANSFORM_ATTACHMENT_EVENT_CHANGE);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -12,7 +12,7 @@ free port if 5173 is busy — the terminal says which.)
|
|
|
12
12
|
| [`index.html`](./index.html) | **the solver, M0.** `cloth_step` over a `ClothState`, no ECS at all. |
|
|
13
13
|
| [`rig.html`](./rig.html) | **the entity subtree, M1.** A real `EntityManager`, real entities, `ClothSystem` walking and writing back. |
|
|
14
14
|
| [`collide.html`](./collide.html) | **collision, M2.** The solver again, with a packed collider table in the argument list. |
|
|
15
|
-
| [`garment.html`](./garment.html) | **skinned garments, M3, and self-collision, M4.** A
|
|
15
|
+
| [`garment.html`](./garment.html) | **skinned garments, M3, and self-collision, M4.** A skeleton of entities, a `Skin`, and a `Cloth` + `ClothRig` driving some of its joints. |
|
|
16
16
|
|
|
17
17
|
Both are at
|
|
18
18
|
`http://localhost:5173/src/engine/physics/cloth/playground/<page>`.
|
|
@@ -260,14 +260,14 @@ does not fire in a hidden pane, so a driver calls `step_once` itself.
|
|
|
260
260
|
## What it is
|
|
261
261
|
|
|
262
262
|
`rig.html` is a `Cloth` over an entity subtree; this is a `Cloth` + a `ClothRig`
|
|
263
|
-
over a skinned model's **joints**. Every point on screen is a
|
|
264
|
-
`
|
|
265
|
-
it is because the solver wrote its
|
|
266
|
-
chain.
|
|
263
|
+
over a skinned model's **joints**. Every point on screen is a joint's
|
|
264
|
+
`Transform64` — an entity of the skeleton's prefab instance, named by a `Skin` —
|
|
265
|
+
and it is where it is because the solver wrote its attachment's local transform
|
|
266
|
+
and the attachment system composed the chain.
|
|
267
267
|
|
|
268
268
|
`ClothSystem#models` takes a stub rather than a `MeshSystem` for the reason the
|
|
269
269
|
field exists: a `MeshSystem` needs a graphics engine, a scene and a loader, and a
|
|
270
|
-
garment's joints are a
|
|
270
|
+
garment's joints are a prefab instance that needs none of the three. The stub
|
|
271
271
|
answers exactly the one method the system calls.
|
|
272
272
|
|
|
273
273
|
## The garments
|
|
@@ -279,7 +279,7 @@ answers exactly the one method the system calls.
|
|
|
279
279
|
- **coat tails** — three strips of nine in denim, which is the library entry that
|
|
280
280
|
spends its two levers on particles rather than iterations.
|
|
281
281
|
- **ponytail** — one chain of twelve off the neck. The rig path is the entity
|
|
282
|
-
path
|
|
282
|
+
path over a skin's joints, and a single chain is where that is most obviously
|
|
283
283
|
true.
|
|
284
284
|
- **loincloth** — seven strips of five off the pelvis, and the one preset that
|
|
285
285
|
spends most of its time against the leg colliders.
|
|
@@ -287,10 +287,10 @@ answers exactly the one method the system calls.
|
|
|
287
287
|
## The motion drives the character, and only the character
|
|
288
288
|
|
|
289
289
|
The buttons write the **character's own bones**. The garment's joints are
|
|
290
|
-
cloth's, and the seed says so: it
|
|
291
|
-
them, because a joint a clip drives is
|
|
292
|
-
|
|
293
|
-
authority
|
|
290
|
+
cloth's, and the seed says so: it revokes the GPU's authority over the attachment
|
|
291
|
+
of every one of them, because a joint a clip drives is the GPU's and its local
|
|
292
|
+
transform is not read by anything. Two writers of one row is the race the
|
|
293
|
+
authority flags exist to prevent, and the claim is where a garment whose joints
|
|
294
294
|
are *also* keyed shows up as an authoring error.
|
|
295
295
|
|
|
296
296
|
**sprint** is §7 P7's own profile: a square wave in velocity, integrated. Written
|
|
@@ -74,5 +74,4 @@ export type GarmentScene = {
|
|
|
74
74
|
import { EntityComponentDataset } from "../../../ecs/EntityComponentDataset.js";
|
|
75
75
|
import { ClothSystem } from "../ecs/ClothSystem.js";
|
|
76
76
|
import { ClothColliderSystem } from "../ecs/ClothColliderSystem.js";
|
|
77
|
-
import { Node3D } from "../../../../shade/renderer/scene/Node3D.js";
|
|
78
77
|
//# sourceMappingURL=garment_build.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"garment_build.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/playground/garment_build.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"garment_build.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/playground/garment_build.js"],"names":[],"mappings":"AA8FA;;;GAGG;AACH,6FAHW,MAAM,GACJ,QAAQ,YAAY,CAAC,CA6EjC;AAiKD;;;;;;GAMG;AACH,8CAHW,MAAM,GACJ,IAAI,CAyBhB;AAnVD;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;GAYG;AAEH;;;;;;;IAqCE;;SAjDY,sBAAsB;WACtB,WAAW;eACX,mBAAmB;YACnB,MAAM;;;;;;;;;UAGN,QAAQ;;;;WACR,QAAQ;;;;;UAER,MAAM,EAAE,EAAE;;uCA7Ce,wCAAwC;4BAcnD,uBAAuB;oCAHf,+BAA+B"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { CapsuleShape3D } from "../../../../core/geom/3d/shape/CapsuleShape3D.js";
|
|
2
2
|
import { SphereShape3D } from "../../../../core/geom/3d/shape/SphereShape3D.js";
|
|
3
3
|
import { Skin } from "../../../../shade/renderer/animation/Skin.js";
|
|
4
|
-
import {
|
|
4
|
+
import { SceneBundle } from "../../../../shade/renderer/loader/SceneBundle.js";
|
|
5
|
+
import { SceneNode } from "../../../../shade/renderer/loader/SceneNode.js";
|
|
6
|
+
import { prefab_compile } from "../../../graphics3/prefab/prefab_compile.js";
|
|
7
|
+
import { prefab_instantiate } from "../../../graphics3/prefab/prefab_instantiate.js";
|
|
5
8
|
import { EntityComponentDataset } from "../../../ecs/EntityComponentDataset.js";
|
|
6
9
|
import { EntityManager } from "../../../ecs/EntityManager.js";
|
|
7
10
|
import { TransformAttachment } from "../../../ecs/transform-attachment/TransformAttachment.js";
|
|
@@ -72,8 +75,8 @@ export const GARMENT_PRESETS = [
|
|
|
72
75
|
{
|
|
73
76
|
id: 'ponytail',
|
|
74
77
|
label: 'ponytail — 1 × 12',
|
|
75
|
-
blurb: 'One chain, deep. The rig path is the entity path
|
|
76
|
-
+ '
|
|
78
|
+
blurb: 'One chain, deep. The rig path is the entity path, and a single chain is where that '
|
|
79
|
+
+ 'is most obviously true.',
|
|
77
80
|
strips: 1,
|
|
78
81
|
links: 12,
|
|
79
82
|
dynamics: 'HAIR'
|
|
@@ -114,9 +117,8 @@ export async function build_garment({ preset, dynamics, links, spacing, collide,
|
|
|
114
117
|
|
|
115
118
|
const entry = GARMENT_PRESETS.find(p => p.id === preset) ?? GARMENT_PRESETS[0];
|
|
116
119
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const { proxy, error } = cloth_proxy_from_joints(skeleton.skin, skeleton.garment_names, {
|
|
120
|
+
const skeleton = build_skeleton(ecd, entry, links, spacing);
|
|
121
|
+
const { proxy, error } = cloth_proxy_from_joints(skeleton.prefab, skeleton.skin, skeleton.garment_names, {
|
|
120
122
|
name: entry.label
|
|
121
123
|
});
|
|
122
124
|
|
|
@@ -143,7 +145,9 @@ export async function build_garment({ preset, dynamics, links, spacing, collide,
|
|
|
143
145
|
|
|
144
146
|
ecd.addComponentToEntity(entity, Cloth.from(fabric, { flags: ClothFlags.NeverSleep }));
|
|
145
147
|
|
|
146
|
-
|
|
148
|
+
// the one method `ClothSystem` calls on a model provider: the instance whose skins address the
|
|
149
|
+
// joints as entities
|
|
150
|
+
cloth.models = { instance_of: () => skeleton.instance };
|
|
147
151
|
|
|
148
152
|
if (collide) {
|
|
149
153
|
add_body_colliders(ecd, skeleton);
|
|
@@ -152,11 +156,11 @@ export async function build_garment({ preset, dynamics, links, spacing, collide,
|
|
|
152
156
|
// One step so the seed runs and the bind pose is on the joints.
|
|
153
157
|
cloth.fixedUpdate(1 / 60);
|
|
154
158
|
|
|
155
|
-
const bind = skeleton.joint.map(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
159
|
+
const bind = skeleton.joint.map(entity => {
|
|
160
|
+
const t = ecd.getComponent(entity, Transform64).translation;
|
|
161
|
+
|
|
162
|
+
return [t[0], t[1], t[2]];
|
|
163
|
+
});
|
|
160
164
|
|
|
161
165
|
return {
|
|
162
166
|
ecd,
|
|
@@ -173,38 +177,26 @@ export async function build_garment({ preset, dynamics, links, spacing, collide,
|
|
|
173
177
|
* A character: pelvis, spine, shoulders, two legs, and the garment's own strips
|
|
174
178
|
* hanging from whichever bone the preset says.
|
|
175
179
|
*
|
|
180
|
+
* @param {EntityComponentDataset} ecd the page's dataset, which the character becomes entities of
|
|
176
181
|
* @param {object} entry
|
|
177
182
|
* @param {number} links
|
|
178
183
|
* @param {number} spacing
|
|
179
|
-
* @returns {object}
|
|
184
|
+
* @returns {object} the bones and the garment's joints as entities, the prefab and its instance
|
|
180
185
|
* @private
|
|
181
186
|
*/
|
|
182
|
-
function build_skeleton(entry, links, spacing) {
|
|
183
|
-
|
|
184
|
-
const
|
|
187
|
+
function build_skeleton(ecd, entry, links, spacing) {
|
|
188
|
+
// the character as a loader would describe it: nodes in pre-order, every one a joint of the skin
|
|
189
|
+
const bundle = new SceneBundle();
|
|
185
190
|
|
|
186
191
|
/**
|
|
187
192
|
* @param {string} name
|
|
188
|
-
* @param {
|
|
193
|
+
* @param {number} parent
|
|
189
194
|
* @param {number[]} offset
|
|
190
|
-
* @returns {
|
|
195
|
+
* @returns {number} the node's index
|
|
191
196
|
*/
|
|
192
|
-
const bone = (name, parent, offset) => {
|
|
193
|
-
const node = new Node3D();
|
|
194
|
-
|
|
195
|
-
node.name = name;
|
|
196
|
-
node.transform_local.setTranslation(offset[0], offset[1], offset[2]);
|
|
197
|
-
|
|
198
|
-
if (parent !== null) {
|
|
199
|
-
parent.addChild(node);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
joints.push(node);
|
|
197
|
+
const bone = (name, parent, offset) => bundle.add_node(SceneNode.from({ name, parent, translation: offset }));
|
|
203
198
|
|
|
204
|
-
|
|
205
|
-
};
|
|
206
|
-
|
|
207
|
-
const root = bone('root', null, [0, 0, 0]);
|
|
199
|
+
const root = bone('root', -1, [0, 0, 0]);
|
|
208
200
|
const pelvis = bone('pelvis', root, [0, 0.95, 0]);
|
|
209
201
|
const spine = bone('spine', pelvis, [0, 0.22, 0]);
|
|
210
202
|
const chest = bone('chest', spine, [0, 0.2, 0]);
|
|
@@ -218,15 +210,13 @@ function build_skeleton(entry, links, spacing) {
|
|
|
218
210
|
bone('knee_l', left_leg, [0, -0.42, 0]);
|
|
219
211
|
bone('knee_r', right_leg, [0, -0.42, 0]);
|
|
220
212
|
|
|
221
|
-
const
|
|
213
|
+
const character_count = bundle.nodes.length;
|
|
222
214
|
|
|
223
215
|
// The garment hangs from the chest for a cape and from the pelvis for a
|
|
224
216
|
// loincloth, which is the difference between the two presets.
|
|
225
217
|
const from = entry.id === 'loincloth' ? pelvis : (entry.id === 'ponytail' ? neck : chest);
|
|
226
218
|
|
|
227
219
|
const garment_names = [];
|
|
228
|
-
const garment = [];
|
|
229
|
-
|
|
230
220
|
const strips = entry.strips;
|
|
231
221
|
|
|
232
222
|
for (let s = 0; s < strips; s++) {
|
|
@@ -235,8 +225,10 @@ function build_skeleton(entry, links, spacing) {
|
|
|
235
225
|
let parent = from;
|
|
236
226
|
|
|
237
227
|
for (let i = 0; i < links; i++) {
|
|
238
|
-
const
|
|
239
|
-
|
|
228
|
+
const name = `garment_${s}_${i}`;
|
|
229
|
+
|
|
230
|
+
parent = bone(
|
|
231
|
+
name,
|
|
240
232
|
parent,
|
|
241
233
|
i === 0
|
|
242
234
|
// The first link carries the strip sideways and behind, so
|
|
@@ -252,25 +244,40 @@ function build_skeleton(entry, links, spacing) {
|
|
|
252
244
|
: [0, -spacing, -spacing * 0.05]
|
|
253
245
|
);
|
|
254
246
|
|
|
255
|
-
garment_names.push(
|
|
256
|
-
garment.push(node);
|
|
257
|
-
|
|
258
|
-
parent = node;
|
|
247
|
+
garment_names.push(name);
|
|
259
248
|
}
|
|
260
249
|
}
|
|
261
250
|
|
|
262
|
-
|
|
251
|
+
const joints = bundle.nodes.map((_node, index) => index);
|
|
252
|
+
|
|
253
|
+
bundle.skins = [Skin.from({
|
|
254
|
+
joints,
|
|
255
|
+
inverse_bind_matrices: new Float32Array(joints.length * 16)
|
|
256
|
+
})];
|
|
257
|
+
|
|
258
|
+
const prefab = prefab_compile(bundle);
|
|
259
|
+
|
|
260
|
+
// the character is entities of the page's dataset, under a placement standing at the origin;
|
|
261
|
+
// the attachment system composes every joint's world from there, the way a rig's would
|
|
262
|
+
const placement = ecd.createEntity();
|
|
263
|
+
const placement_transform = new Transform64();
|
|
264
|
+
|
|
265
|
+
placement_transform.updateMatrix();
|
|
266
|
+
|
|
267
|
+
ecd.addComponentToEntity(placement, placement_transform);
|
|
268
|
+
|
|
269
|
+
const instance = prefab_instantiate(prefab, ecd, placement);
|
|
263
270
|
|
|
264
271
|
return {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
272
|
+
prefab,
|
|
273
|
+
instance,
|
|
274
|
+
placement,
|
|
275
|
+
root: instance.entity_of('root'),
|
|
276
|
+
pelvis: instance.entity_of('pelvis'),
|
|
277
|
+
bone: bundle.nodes.slice(0, character_count).map(node => instance.entity_of(node.name)),
|
|
278
|
+
joint: garment_names.map(name => instance.entity_of(name)),
|
|
269
279
|
garment_names,
|
|
270
|
-
skin:
|
|
271
|
-
joints,
|
|
272
|
-
inverse_bind_matrices: new Float32Array(joints.length * 16)
|
|
273
|
-
})
|
|
280
|
+
skin: prefab.skins[0]
|
|
274
281
|
};
|
|
275
282
|
}
|
|
276
283
|
|
|
@@ -278,7 +285,7 @@ function build_skeleton(entry, links, spacing) {
|
|
|
278
285
|
* Capsules on the character's own bones, opted into cloth the way any collider
|
|
279
286
|
* is: a `ClothCollider` beside an existing `(Collider, Transform64)`.
|
|
280
287
|
*
|
|
281
|
-
* They are entities
|
|
288
|
+
* They are entities of their own because that is what a `ClothCollider`
|
|
282
289
|
* is — §3.5's "the `RigidBody`-analogue" — and because a character's collision
|
|
283
290
|
* capsules are authored as entities in a real scene too. The page keeps their
|
|
284
291
|
* transforms in step with the bones by hand, which is what a rig would do.
|
|
@@ -288,7 +295,7 @@ function build_skeleton(entry, links, spacing) {
|
|
|
288
295
|
* @private
|
|
289
296
|
*/
|
|
290
297
|
function add_body_colliders(ecd, skeleton) {
|
|
291
|
-
const
|
|
298
|
+
const instance = skeleton.instance;
|
|
292
299
|
|
|
293
300
|
const parts = [
|
|
294
301
|
{ bone: 'spine', shape: CapsuleShape3D.from(0.13, 0.3), offset: [0, 0.1, 0] },
|
|
@@ -300,9 +307,9 @@ function add_body_colliders(ecd, skeleton) {
|
|
|
300
307
|
skeleton.body = [];
|
|
301
308
|
|
|
302
309
|
for (const part of parts) {
|
|
303
|
-
const node =
|
|
310
|
+
const node = instance.entity_of(part.bone);
|
|
304
311
|
|
|
305
|
-
if (node ===
|
|
312
|
+
if (node === -1) {
|
|
306
313
|
continue;
|
|
307
314
|
}
|
|
308
315
|
|
|
@@ -340,9 +347,8 @@ export function garment_sync_colliders(scene) {
|
|
|
340
347
|
}
|
|
341
348
|
|
|
342
349
|
for (const part of body) {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
const t = node.transform_global;
|
|
350
|
+
// the bone's world, as the attachment system composed it
|
|
351
|
+
const t = scene.ecd.getComponent(part.node, Transform64);
|
|
346
352
|
|
|
347
353
|
part.transform.setTranslation(
|
|
348
354
|
t.translation[0] + part.offset[0],
|
|
@@ -2,6 +2,9 @@ import { Cloth } from "../ecs/Cloth.js";
|
|
|
2
2
|
import { CLOTH_DYNAMICS_BY_NAME } from "../ecs/cloth_dynamics_library.js";
|
|
3
3
|
import { PlaygroundCamera, project } from "./cloth_playground_draw.js";
|
|
4
4
|
import { GARMENT_PRESETS, build_garment, garment_sync_colliders } from "./garment_build.js";
|
|
5
|
+
import { TRANSFORM_ATTACHMENT_EVENT_CHANGE } from "../../../ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js";
|
|
6
|
+
import { TransformAttachment } from "../../../ecs/transform-attachment/TransformAttachment.js";
|
|
7
|
+
import { Transform64 } from "../../../ecs/transform/Transform64.js";
|
|
5
8
|
|
|
6
9
|
/**
|
|
7
10
|
* # Skinned garments playground — M3
|
|
@@ -11,9 +14,9 @@ import { GARMENT_PRESETS, build_garment, garment_sync_colliders } from "./garmen
|
|
|
11
14
|
*
|
|
12
15
|
* The rig page (`rig.html`) is a `Cloth` over an entity subtree; this is a
|
|
13
16
|
* `Cloth` + a `ClothRig` over a skinned model's **joints**. Every point on
|
|
14
|
-
* screen is a `
|
|
15
|
-
* and it is where it is because the solver wrote
|
|
16
|
-
*
|
|
17
|
+
* screen is a joint's world `Transform64` — an entity of the character's prefab
|
|
18
|
+
* instance — and it is where it is because the solver wrote the joint's own
|
|
19
|
+
* offset and the attachment system composed the chain.
|
|
17
20
|
*
|
|
18
21
|
* What it exists to show, because these are claims about a hierarchy rather
|
|
19
22
|
* than about an array:
|
|
@@ -122,35 +125,43 @@ function step_once() {
|
|
|
122
125
|
* the race it exists to prevent.
|
|
123
126
|
*/
|
|
124
127
|
function drive_character() {
|
|
125
|
-
const
|
|
126
|
-
|
|
128
|
+
const ecd = scene.ecd;
|
|
129
|
+
|
|
130
|
+
// the bones' own offsets, under their parents: what a rig's animation would write
|
|
131
|
+
const root = ecd.getComponent(scene.root, TransformAttachment).transform;
|
|
132
|
+
const pelvis = ecd.getComponent(scene.pelvis, TransformAttachment).transform;
|
|
127
133
|
|
|
128
134
|
if (control.motion === 'still') {
|
|
129
|
-
root.
|
|
130
|
-
root.
|
|
131
|
-
pelvis.
|
|
135
|
+
root.setTranslation(0, 0, 0);
|
|
136
|
+
root.setRotation(0, 0, 0, 1);
|
|
137
|
+
pelvis.setTranslation(0, 0.95, 0);
|
|
132
138
|
} else if (control.motion === 'walk') {
|
|
133
|
-
root.
|
|
134
|
-
root.
|
|
135
|
-
pelvis.
|
|
139
|
+
root.setTranslation(0, 0, Math.sin(time * 1.6) * 0.9);
|
|
140
|
+
root.setRotation(0, 0, 0, 1);
|
|
141
|
+
pelvis.setTranslation(0, 0.95 + Math.sin(time * 6.4) * 0.02, 0);
|
|
136
142
|
} else if (control.motion === 'turn') {
|
|
137
143
|
const angle = time * 1.9;
|
|
138
144
|
|
|
139
|
-
root.
|
|
140
|
-
root.
|
|
141
|
-
pelvis.
|
|
145
|
+
root.setTranslation(0, 0, 0);
|
|
146
|
+
root.setRotation(0, Math.sin(angle * 0.5), 0, Math.cos(angle * 0.5));
|
|
147
|
+
pelvis.setTranslation(0, 0.95, 0);
|
|
142
148
|
} else {
|
|
143
149
|
// §7 P7's own profile: a **square wave in velocity**, integrated rather
|
|
144
150
|
// than written as a position — a position that resets is a nine-metre
|
|
145
151
|
// discontinuity, which is a teleport (§7 P6) wearing a sprint's clothes.
|
|
146
152
|
sprint_z += (Math.floor(time) % 2 === 0 ? 9 : -9) * FIXED_STEP;
|
|
147
153
|
|
|
148
|
-
root.
|
|
149
|
-
root.
|
|
150
|
-
pelvis.
|
|
154
|
+
root.setTranslation(0, 0, sprint_z);
|
|
155
|
+
root.setRotation(0, 0, 0, 1);
|
|
156
|
+
pelvis.setTranslation(0, 0.95, 0);
|
|
151
157
|
}
|
|
152
158
|
|
|
153
|
-
root.
|
|
159
|
+
root.updateMatrix();
|
|
160
|
+
pelvis.updateMatrix();
|
|
161
|
+
|
|
162
|
+
// announced, so the attachment system composes the chain below each
|
|
163
|
+
ecd.sendEvent(scene.root, TRANSFORM_ATTACHMENT_EVENT_CHANGE);
|
|
164
|
+
ecd.sendEvent(scene.pelvis, TRANSFORM_ATTACHMENT_EVENT_CHANGE);
|
|
154
165
|
}
|
|
155
166
|
|
|
156
167
|
// ------------------------------------------------------------------- draw
|
|
@@ -183,18 +194,35 @@ function draw() {
|
|
|
183
194
|
}
|
|
184
195
|
|
|
185
196
|
/**
|
|
186
|
-
* @param {
|
|
197
|
+
* @param {number} node an entity of the character
|
|
187
198
|
* @param {Float64Array} out
|
|
188
199
|
* @param {number} width
|
|
189
200
|
* @param {number} height
|
|
190
201
|
* @returns {number} depth
|
|
191
202
|
*/
|
|
192
203
|
function project_node(node, out, width, height) {
|
|
193
|
-
const t = node.
|
|
204
|
+
const t = scene.ecd.getComponent(node, Transform64).translation;
|
|
194
205
|
|
|
195
206
|
return project(out, camera, t[0], t[1], t[2], width, height);
|
|
196
207
|
}
|
|
197
208
|
|
|
209
|
+
/**
|
|
210
|
+
* The bone an entity hangs from, or -1 at the top of the character — the placement above the
|
|
211
|
+
* root is not a bone.
|
|
212
|
+
*
|
|
213
|
+
* @param {number} node
|
|
214
|
+
* @returns {number}
|
|
215
|
+
*/
|
|
216
|
+
function parent_of(node) {
|
|
217
|
+
const attachment = scene.ecd.getComponent(node, TransformAttachment);
|
|
218
|
+
|
|
219
|
+
if (attachment === undefined || attachment.parent === scene.placement) {
|
|
220
|
+
return -1;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return attachment.parent;
|
|
224
|
+
}
|
|
225
|
+
|
|
198
226
|
function draw_ground(width, height) {
|
|
199
227
|
context.save();
|
|
200
228
|
context.strokeStyle = '#1d222a';
|
|
@@ -227,11 +255,13 @@ function draw_body(width, height) {
|
|
|
227
255
|
context.lineWidth = Math.max(2, width / 500);
|
|
228
256
|
|
|
229
257
|
for (const node of scene.bone) {
|
|
230
|
-
|
|
258
|
+
const parent = parent_of(node);
|
|
259
|
+
|
|
260
|
+
if (parent === -1) {
|
|
231
261
|
continue;
|
|
232
262
|
}
|
|
233
263
|
|
|
234
|
-
project_node(
|
|
264
|
+
project_node(parent, SCREEN, width, height);
|
|
235
265
|
project_node(node, OTHER, width, height);
|
|
236
266
|
|
|
237
267
|
context.beginPath();
|
|
@@ -257,17 +287,13 @@ function draw_bind(width, height) {
|
|
|
257
287
|
const joint = scene.joint;
|
|
258
288
|
|
|
259
289
|
for (let i = 0; i < joint.length; i++) {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
const parent_index = joint.indexOf(
|
|
290
|
+
const node = joint[i];
|
|
291
|
+
const parent = parent_of(node);
|
|
292
|
+
const parent_index = joint.indexOf(parent);
|
|
263
293
|
|
|
264
294
|
const from = parent_index >= 0
|
|
265
295
|
? bind[parent_index]
|
|
266
|
-
:
|
|
267
|
-
node.parent.transform_global.translation[0],
|
|
268
|
-
node.parent.transform_global.translation[1],
|
|
269
|
-
node.parent.transform_global.translation[2]
|
|
270
|
-
];
|
|
296
|
+
: Array.from(scene.ecd.getComponent(parent, Transform64).translation);
|
|
271
297
|
|
|
272
298
|
project(SCREEN, camera, from[0], from[1], from[2], width, height);
|
|
273
299
|
project(OTHER, camera, bind[i][0], bind[i][1], bind[i][2], width, height);
|
|
@@ -287,7 +313,7 @@ function draw_garment(width, height) {
|
|
|
287
313
|
context.lineWidth = Math.max(1.5, width / 700);
|
|
288
314
|
|
|
289
315
|
for (const node of scene.joint) {
|
|
290
|
-
project_node(node
|
|
316
|
+
project_node(parent_of(node), SCREEN, width, height);
|
|
291
317
|
project_node(node, OTHER, width, height);
|
|
292
318
|
|
|
293
319
|
context.beginPath();
|
|
@@ -313,7 +339,7 @@ function draw_garment(width, height) {
|
|
|
313
339
|
* Each joint's reconstructed orientation, as an axis triple. A particle has no
|
|
314
340
|
* orientation, so this is §11.1's swing — the minimal rotation from the link's
|
|
315
341
|
* bind direction to its simulated one, and the reason the rig path can write a
|
|
316
|
-
*
|
|
342
|
+
* offset of its own at all.
|
|
317
343
|
*/
|
|
318
344
|
function draw_frames(width, height) {
|
|
319
345
|
const axes = [
|
|
@@ -328,7 +354,7 @@ function draw_frames(width, height) {
|
|
|
328
354
|
context.lineWidth = 1;
|
|
329
355
|
|
|
330
356
|
for (const node of scene.joint) {
|
|
331
|
-
const t = node
|
|
357
|
+
const t = scene.ecd.getComponent(node, Transform64);
|
|
332
358
|
|
|
333
359
|
project(SCREEN, camera, t.translation[0], t.translation[1], t.translation[2], width, height);
|
|
334
360
|
|