@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
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { m4_invert } from "../../../core/geom/3d/mat4/m4_invert.js";
|
|
3
|
+
import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
|
|
4
|
+
import { m4_rigidity_defect } from "../../../core/geom/3d/mat4/m4_rigidity_defect.js";
|
|
5
|
+
import { Transform64 } from "../../ecs/transform/Transform64.js";
|
|
6
|
+
import { prefab_skin_bind_transform, prefab_skin_frame_defect } from "./prefab_skin_frame.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {import("./Prefab.js").Prefab} Prefab
|
|
10
|
+
* @typedef {import("../../../shade/renderer/animation/Skin.js").Skin} Skin
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* How far from the bind transform a mesh node may sit and still be left alone, and how large a
|
|
15
|
+
* residual counts as landed. A `Transform64` recomposes its matrix from TRS components, and the
|
|
16
|
+
* correction is applied through that round trip, so the frame arrives with rounding on it; this
|
|
17
|
+
* is far above the rounding and far below anything that shows.
|
|
18
|
+
*
|
|
19
|
+
* @type {number}
|
|
20
|
+
*/
|
|
21
|
+
const TOLERANCE = 1e-4;
|
|
22
|
+
|
|
23
|
+
const IDENTITY = new Float64Array([
|
|
24
|
+
1, 0, 0, 0,
|
|
25
|
+
0, 1, 0, 0,
|
|
26
|
+
0, 0, 1, 0,
|
|
27
|
+
0, 0, 0, 1,
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @typedef {object} PrefabSkinFrameReport
|
|
32
|
+
* @property {number} frame_defect how far the skin is from being deformable in *any* frame; zero
|
|
33
|
+
* when it is fine
|
|
34
|
+
* @property {number} absorbed how far from rigid the largest correction was — for a violation,
|
|
35
|
+
* the number the soup was made of
|
|
36
|
+
* @property {number} corrected meshes moved
|
|
37
|
+
* @property {number} unchanged meshes already right
|
|
38
|
+
* @property {number} residual the worst `|mesh.world − bind|` left afterwards
|
|
39
|
+
* @property {number[]} obstructed corrected mesh nodes that have children, which inherit a
|
|
40
|
+
* transform nobody asked for
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Put every skin's meshes into the frame the skin deforms in, once, on the prefab.
|
|
45
|
+
*
|
|
46
|
+
* The skinning pass writes each clone's vertices in `inverse(mesh.global)` space and the
|
|
47
|
+
* rasterizer re-applies `mesh.global`, so `mesh.global` is the *frame* a skinned mesh's vertices
|
|
48
|
+
* live in — and the pass gets there by folding `inverse(mesh.global) × joint.global ×
|
|
49
|
+
* inverse_bind` into a dual quaternion, which carries a rotation and a translation and nothing
|
|
50
|
+
* else. glTF says a skinned mesh's node transform is ignored, so the frame is the engine's to
|
|
51
|
+
* choose, and the one that is guaranteed to fold rigidly is the skin's own bind transform,
|
|
52
|
+
* `joint.global × inverse_bind` at rest ({@link prefab_skin_bind_transform}). After this the fold
|
|
53
|
+
* is the joint's displacement from bind, rigid whenever the clip rotates and translates and does
|
|
54
|
+
* not scale. `SKINNING_FRAME_PLAN.md` is the whole argument.
|
|
55
|
+
*
|
|
56
|
+
* Done here rather than on registration because the correction is placement-invariant and
|
|
57
|
+
* idempotent: it is a property of the asset, so it belongs to the compiled model and not to each
|
|
58
|
+
* of its placements. A file whose inverse-bind matrices already agree with its node transforms is
|
|
59
|
+
* not touched. A skin whose own bind frame does not fold — a rest pose carrying a non-uniform
|
|
60
|
+
* scale or a shear — is reported and left as the asset had it.
|
|
61
|
+
*
|
|
62
|
+
* The correction goes on the mesh node's **local** transform, and its descendants' worlds are
|
|
63
|
+
* recomposed, so the prefab's {@link Prefab.world} stays consistent with its {@link Prefab.local}.
|
|
64
|
+
*
|
|
65
|
+
* @param {Prefab} prefab
|
|
66
|
+
* @returns {PrefabSkinFrameReport[]} one report per skin
|
|
67
|
+
*/
|
|
68
|
+
export function prefab_normalize_skin_frames(prefab) {
|
|
69
|
+
assert.defined(prefab, 'prefab');
|
|
70
|
+
assert.equal(prefab.isPrefab, true, 'prefab.isPrefab !== true');
|
|
71
|
+
|
|
72
|
+
return prefab.skins.map(skin => normalize_skin(prefab, skin));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @param {Prefab} prefab
|
|
77
|
+
* @param {Skin} skin
|
|
78
|
+
* @returns {PrefabSkinFrameReport}
|
|
79
|
+
*/
|
|
80
|
+
function normalize_skin(prefab, skin) {
|
|
81
|
+
const report = {
|
|
82
|
+
frame_defect: 0,
|
|
83
|
+
absorbed: 0,
|
|
84
|
+
corrected: 0,
|
|
85
|
+
unchanged: 0,
|
|
86
|
+
residual: 0,
|
|
87
|
+
obstructed: [],
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const bind = new Float64Array(16);
|
|
91
|
+
|
|
92
|
+
prefab_skin_bind_transform(bind, prefab, skin);
|
|
93
|
+
|
|
94
|
+
report.frame_defect = prefab_skin_frame_defect(prefab, skin, bind);
|
|
95
|
+
|
|
96
|
+
if (!(report.frame_defect <= TOLERANCE)) {
|
|
97
|
+
// `!(x <= t)` rather than `x > t` so that a NaN — a singular joint matrix — lands here too
|
|
98
|
+
return report;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const inverse_world = new Float64Array(16);
|
|
102
|
+
const correction_matrix = new Float64Array(16);
|
|
103
|
+
const correction = new Transform64();
|
|
104
|
+
|
|
105
|
+
for (const mesh of skin.meshes) {
|
|
106
|
+
const world = prefab.world[mesh];
|
|
107
|
+
|
|
108
|
+
if (!m4_invert(inverse_world, world)) {
|
|
109
|
+
// a mesh node with no inverse is not a frame either; the skinning pass inverts this
|
|
110
|
+
report.residual = Infinity;
|
|
111
|
+
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
m4_multiply(correction_matrix, inverse_world, bind);
|
|
116
|
+
|
|
117
|
+
const absorbed = m4_rigidity_defect(correction_matrix);
|
|
118
|
+
|
|
119
|
+
report.absorbed = Math.max(report.absorbed, absorbed);
|
|
120
|
+
|
|
121
|
+
if (matrix_distance(correction_matrix, IDENTITY) <= TOLERANCE) {
|
|
122
|
+
report.unchanged++;
|
|
123
|
+
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
correction.fromMatrix(correction_matrix);
|
|
128
|
+
|
|
129
|
+
prefab.local[mesh].multiply(correction);
|
|
130
|
+
|
|
131
|
+
recompose_subtree(prefab, mesh);
|
|
132
|
+
|
|
133
|
+
report.corrected++;
|
|
134
|
+
report.residual = Math.max(report.residual, matrix_distance(prefab.world[mesh], bind));
|
|
135
|
+
|
|
136
|
+
if (has_children(prefab, mesh)) {
|
|
137
|
+
report.obstructed.push(mesh);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return report;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Recompose the world of `node` and of every node under it from their locals. Children follow
|
|
146
|
+
* their parents in index order, so one forward pass from `node` is enough.
|
|
147
|
+
*
|
|
148
|
+
* @param {Prefab} prefab
|
|
149
|
+
* @param {number} node
|
|
150
|
+
*/
|
|
151
|
+
function recompose_subtree(prefab, node) {
|
|
152
|
+
const parent = prefab.parent;
|
|
153
|
+
const world = prefab.world;
|
|
154
|
+
const local = prefab.local;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* @type {Set<number>}
|
|
158
|
+
*/
|
|
159
|
+
const inside = new Set([node]);
|
|
160
|
+
|
|
161
|
+
m4_multiply(world[node], world[parent[node]], local[node]);
|
|
162
|
+
|
|
163
|
+
for (let i = node + 1; i < prefab.node_count; i++) {
|
|
164
|
+
const p = parent[i];
|
|
165
|
+
|
|
166
|
+
if (!inside.has(p)) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
inside.add(i);
|
|
171
|
+
|
|
172
|
+
m4_multiply(world[i], world[p], local[i]);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @param {Prefab} prefab
|
|
178
|
+
* @param {number} node
|
|
179
|
+
* @returns {boolean}
|
|
180
|
+
*/
|
|
181
|
+
function has_children(prefab, node) {
|
|
182
|
+
const parent = prefab.parent;
|
|
183
|
+
|
|
184
|
+
for (let i = node + 1; i < prefab.node_count; i++) {
|
|
185
|
+
if (parent[i] === node) {
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* @param {ArrayLike<number>} a
|
|
195
|
+
* @param {ArrayLike<number>} b
|
|
196
|
+
* @returns {number}
|
|
197
|
+
*/
|
|
198
|
+
function matrix_distance(a, b) {
|
|
199
|
+
let worst = 0;
|
|
200
|
+
|
|
201
|
+
for (let i = 0; i < 16; i++) {
|
|
202
|
+
const difference = Math.abs(a[i] - b[i]);
|
|
203
|
+
|
|
204
|
+
if (difference > worst) {
|
|
205
|
+
worst = difference;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return worst;
|
|
210
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("./Prefab.js").Prefab} Prefab
|
|
3
|
+
* @typedef {import("./PrefabInstance.js").PrefabInstance} PrefabInstance
|
|
4
|
+
* @typedef {import("../../ecs/EntityComponentDataset.js").EntityComponentDataset} EntityComponentDataset
|
|
5
|
+
* @typedef {import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
|
|
6
|
+
* @typedef {import("../register_instance_animation.js").InstanceAnimationRegistration} InstanceAnimationRegistration
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Put a model into a scene that has no systems: a playground, a preview, a tool.
|
|
10
|
+
*
|
|
11
|
+
* A game does this in two systems — `MeshSystem` spawns the prefab under the entity that wears
|
|
12
|
+
* it, and `ShadedGeometrySystem` takes a mesh row for every primitive as its component appears.
|
|
13
|
+
* A scene bound to a bare dataset has neither, so this does the same by hand, in one call: a root
|
|
14
|
+
* entity carrying `placement`, the prefab spawned under it, a `transforms` row acquired for every
|
|
15
|
+
* entity of the instance, a `meshes` row attached for every primitive (over a clone of its geometry
|
|
16
|
+
* where the primitive is skinned), and the instance's skins and clips registered with the
|
|
17
|
+
* animation manager — unless told otherwise.
|
|
18
|
+
*
|
|
19
|
+
* @param {GPUSceneContext} scene_context the scene's context — its rows are where the instance goes
|
|
20
|
+
* @param {EntityComponentDataset} dataset the dataset the scene is bound to
|
|
21
|
+
* @param {Prefab} prefab the model, compiled once
|
|
22
|
+
* @param {Transform64} placement where the model's root goes; copied
|
|
23
|
+
* @param {object} [options]
|
|
24
|
+
* @param {boolean} [options.register_animation] whether the instance's skins and clips are
|
|
25
|
+
* registered; off leaves a skinned primitive's clone undeformed
|
|
26
|
+
* @param {boolean} [options.skinned] whether skinned primitives take a row at all; a preview that
|
|
27
|
+
* registers no skin has nothing to pose them with and leaves them out
|
|
28
|
+
* @returns {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null, drawn: number}}
|
|
29
|
+
* `drawn` is how many primitives took a row
|
|
30
|
+
*/
|
|
31
|
+
export function prefab_place(scene_context: GPUSceneContext, dataset: EntityComponentDataset, prefab: Prefab, placement: Transform64, { register_animation, skinned }?: {
|
|
32
|
+
register_animation?: boolean;
|
|
33
|
+
skinned?: boolean;
|
|
34
|
+
}): {
|
|
35
|
+
root: number;
|
|
36
|
+
instance: PrefabInstance;
|
|
37
|
+
animation: InstanceAnimationRegistration | null;
|
|
38
|
+
drawn: number;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Take a placed model out again: its rows given back, its animation unregistered, its entities
|
|
42
|
+
* removed — the root included, since {@link prefab_place} made it.
|
|
43
|
+
*
|
|
44
|
+
* @param {GPUSceneContext} scene_context
|
|
45
|
+
* @param {EntityComponentDataset} dataset
|
|
46
|
+
* @param {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null}} placed
|
|
47
|
+
* what {@link prefab_place} answered
|
|
48
|
+
*/
|
|
49
|
+
export function prefab_unplace(scene_context: GPUSceneContext, dataset: EntityComponentDataset, placed: {
|
|
50
|
+
root: number;
|
|
51
|
+
instance: PrefabInstance;
|
|
52
|
+
animation: InstanceAnimationRegistration | null;
|
|
53
|
+
}): void;
|
|
54
|
+
export type Prefab = import("./Prefab.js").Prefab;
|
|
55
|
+
export type PrefabInstance = import("./PrefabInstance.js").PrefabInstance;
|
|
56
|
+
export type EntityComponentDataset = import("../../ecs/EntityComponentDataset.js").EntityComponentDataset;
|
|
57
|
+
export type GPUSceneContext = import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext;
|
|
58
|
+
export type InstanceAnimationRegistration = import("../register_instance_animation.js").InstanceAnimationRegistration;
|
|
59
|
+
import { Transform64 } from "../../ecs/transform/Transform64.js";
|
|
60
|
+
//# sourceMappingURL=prefab_place.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefab_place.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_place.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,4CAZW,eAAe,WACf,sBAAsB,UACtB,MAAM,aACN,WAAW;IAEO,kBAAkB,GAApC,OAAO;IAEW,OAAO,GAAzB,OAAO;IAEL;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,6BAA6B,GAAC,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAyDlH;AAED;;;;;;;;GAQG;AACH,8CALW,eAAe,WACf,sBAAsB,UACtB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,6BAA6B,GAAC,IAAI,CAAA;CAAC,QA6BjG;qBAzHY,OAAO,aAAa,EAAE,MAAM;6BAC5B,OAAO,qBAAqB,EAAE,cAAc;qCAC5C,OAAO,qCAAqC,EAAE,sBAAsB;8BACpE,OAAO,kDAAkD,EAAE,eAAe;4CAC1E,OAAO,mCAAmC,EAAE,6BAA6B;4BAX1D,oCAAoC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { Transform64 } from "../../ecs/transform/Transform64.js";
|
|
3
|
+
import { ShadedGeometry } from "../../graphics/ecs/mesh-v2/ShadedGeometry.js";
|
|
4
|
+
import { ShadedGeometryFlags } from "../../graphics/ecs/mesh-v2/ShadedGeometryFlags.js";
|
|
5
|
+
import { register_instance_animation, unregister_instance_animation } from "../register_instance_animation.js";
|
|
6
|
+
import { prefab_instance_destroy, prefab_instantiate } from "./prefab_instantiate.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {import("./Prefab.js").Prefab} Prefab
|
|
10
|
+
* @typedef {import("./PrefabInstance.js").PrefabInstance} PrefabInstance
|
|
11
|
+
* @typedef {import("../../ecs/EntityComponentDataset.js").EntityComponentDataset} EntityComponentDataset
|
|
12
|
+
* @typedef {import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
|
|
13
|
+
* @typedef {import("../register_instance_animation.js").InstanceAnimationRegistration} InstanceAnimationRegistration
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Put a model into a scene that has no systems: a playground, a preview, a tool.
|
|
18
|
+
*
|
|
19
|
+
* A game does this in two systems — `MeshSystem` spawns the prefab under the entity that wears
|
|
20
|
+
* it, and `ShadedGeometrySystem` takes a mesh row for every primitive as its component appears.
|
|
21
|
+
* A scene bound to a bare dataset has neither, so this does the same by hand, in one call: a root
|
|
22
|
+
* entity carrying `placement`, the prefab spawned under it, a `transforms` row acquired for every
|
|
23
|
+
* entity of the instance, a `meshes` row attached for every primitive (over a clone of its geometry
|
|
24
|
+
* where the primitive is skinned), and the instance's skins and clips registered with the
|
|
25
|
+
* animation manager — unless told otherwise.
|
|
26
|
+
*
|
|
27
|
+
* @param {GPUSceneContext} scene_context the scene's context — its rows are where the instance goes
|
|
28
|
+
* @param {EntityComponentDataset} dataset the dataset the scene is bound to
|
|
29
|
+
* @param {Prefab} prefab the model, compiled once
|
|
30
|
+
* @param {Transform64} placement where the model's root goes; copied
|
|
31
|
+
* @param {object} [options]
|
|
32
|
+
* @param {boolean} [options.register_animation] whether the instance's skins and clips are
|
|
33
|
+
* registered; off leaves a skinned primitive's clone undeformed
|
|
34
|
+
* @param {boolean} [options.skinned] whether skinned primitives take a row at all; a preview that
|
|
35
|
+
* registers no skin has nothing to pose them with and leaves them out
|
|
36
|
+
* @returns {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null, drawn: number}}
|
|
37
|
+
* `drawn` is how many primitives took a row
|
|
38
|
+
*/
|
|
39
|
+
export function prefab_place(scene_context, dataset, prefab, placement, { register_animation = true, skinned = true } = {}) {
|
|
40
|
+
assert.defined(scene_context, 'scene_context');
|
|
41
|
+
assert.defined(dataset, 'dataset');
|
|
42
|
+
assert.equal(dataset.isEntityComponentDataset, true, 'dataset.isEntityComponentDataset !== true');
|
|
43
|
+
assert.defined(prefab, 'prefab');
|
|
44
|
+
assert.equal(prefab.isPrefab, true, 'prefab.isPrefab !== true');
|
|
45
|
+
assert.defined(placement, 'placement');
|
|
46
|
+
assert.isBoolean(register_animation, 'register_animation');
|
|
47
|
+
assert.isBoolean(skinned, 'skinned');
|
|
48
|
+
|
|
49
|
+
// a fresh dataset knows no component types; the prefab registers its own, and the root is
|
|
50
|
+
// placed before the prefab is spawned
|
|
51
|
+
dataset.registerManyComponentTypes([Transform64]);
|
|
52
|
+
|
|
53
|
+
const root = dataset.createEntity();
|
|
54
|
+
const transform = new Transform64();
|
|
55
|
+
|
|
56
|
+
transform.copy(placement);
|
|
57
|
+
transform.updateMatrix();
|
|
58
|
+
|
|
59
|
+
dataset.addComponentToEntity(root, transform);
|
|
60
|
+
|
|
61
|
+
const instance = prefab_instantiate(prefab, dataset, root);
|
|
62
|
+
|
|
63
|
+
const rows = scene_context.rows;
|
|
64
|
+
const entities = instance.entities;
|
|
65
|
+
|
|
66
|
+
for (let i = 0; i < entities.length; i++) {
|
|
67
|
+
rows.acquire(entities[i]);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const mesh_entities = instance.mesh_entities;
|
|
71
|
+
|
|
72
|
+
let drawn = 0;
|
|
73
|
+
|
|
74
|
+
for (let i = 0; i < mesh_entities.length; i++) {
|
|
75
|
+
const entity = mesh_entities[i];
|
|
76
|
+
const geometry = dataset.getComponent(entity, ShadedGeometry);
|
|
77
|
+
const is_skinned = geometry.getFlag(ShadedGeometryFlags.Skinned);
|
|
78
|
+
|
|
79
|
+
if (is_skinned && !skinned) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
rows.attach_mesh(entity, geometry.geometry, geometry.material, is_skinned);
|
|
84
|
+
|
|
85
|
+
drawn++;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const animation = register_animation
|
|
89
|
+
? register_instance_animation(scene_context, instance)
|
|
90
|
+
: null;
|
|
91
|
+
|
|
92
|
+
return { root, instance, animation, drawn };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Take a placed model out again: its rows given back, its animation unregistered, its entities
|
|
97
|
+
* removed — the root included, since {@link prefab_place} made it.
|
|
98
|
+
*
|
|
99
|
+
* @param {GPUSceneContext} scene_context
|
|
100
|
+
* @param {EntityComponentDataset} dataset
|
|
101
|
+
* @param {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null}} placed
|
|
102
|
+
* what {@link prefab_place} answered
|
|
103
|
+
*/
|
|
104
|
+
export function prefab_unplace(scene_context, dataset, placed) {
|
|
105
|
+
assert.defined(scene_context, 'scene_context');
|
|
106
|
+
assert.defined(dataset, 'dataset');
|
|
107
|
+
assert.defined(placed, 'placed');
|
|
108
|
+
|
|
109
|
+
if (placed.animation !== null) {
|
|
110
|
+
unregister_instance_animation(placed.animation);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const rows = scene_context.rows;
|
|
114
|
+
const instance = placed.instance;
|
|
115
|
+
const mesh_entities = instance.mesh_entities;
|
|
116
|
+
|
|
117
|
+
for (let i = 0; i < mesh_entities.length; i++) {
|
|
118
|
+
// safe on a skinned primitive that took no row
|
|
119
|
+
rows.detach_mesh(mesh_entities[i]);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const entities = instance.entities;
|
|
123
|
+
|
|
124
|
+
for (let i = 0; i < entities.length; i++) {
|
|
125
|
+
rows.release(entities[i]);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
prefab_instance_destroy(dataset, instance);
|
|
129
|
+
dataset.removeEntity(placed.root);
|
|
130
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("./Prefab.js").Prefab} Prefab
|
|
3
|
+
* @typedef {import("../../../shade/renderer/animation/Skin.js").Skin} Skin
|
|
4
|
+
* @typedef {import("../../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip} ShadeAnimationClip
|
|
5
|
+
* @typedef {import("../../../shade/renderer/animation/ShadeAnimationChannel.js").ShadeAnimationChannel} ShadeAnimationChannel
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {object} PrefabSkinScaleConflict
|
|
9
|
+
* @property {ShadeAnimationChannel} channel the scaling channel
|
|
10
|
+
* @property {number} node the node it scales
|
|
11
|
+
* @property {boolean} uniform whether the scale is the same on every axis
|
|
12
|
+
* @property {number} joints_reached how many of the skin's joints sit under the node
|
|
13
|
+
* @property {boolean} reaches_mesh whether any of the skin's meshes sit under the node
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* The scale channels of `clip` that reach some of a skin's joints and meshes but not all of them.
|
|
17
|
+
*
|
|
18
|
+
* The frame {@link prefab_normalize_skin_frames} chooses is fixed at compile, and it is sound
|
|
19
|
+
* because the joints and the mesh share their scaling ancestors. A scale that reaches only some
|
|
20
|
+
* of them — a joint's own scale, a scale on a bone above half the skeleton — breaks that every
|
|
21
|
+
* frame it plays, on the GPU, where nothing can see it: the scale enters the joint matrices and
|
|
22
|
+
* not the frame they are folded against, and a dual quaternion cannot carry it. A scale on the
|
|
23
|
+
* character's root reaches the mesh and every joint and cancels; a scale on a node the skin has
|
|
24
|
+
* nothing to do with reaches nothing.
|
|
25
|
+
*
|
|
26
|
+
* The same question `skin_clip_scale_conflicts` asked of a node tree, asked of parent indices.
|
|
27
|
+
*
|
|
28
|
+
* @param {Prefab} prefab
|
|
29
|
+
* @param {Skin} skin joints and meshes as node indices
|
|
30
|
+
* @param {ShadeAnimationClip} clip channels targeting node indices
|
|
31
|
+
* @returns {PrefabSkinScaleConflict[]}
|
|
32
|
+
*/
|
|
33
|
+
export function prefab_skin_clip_scale_conflicts(prefab: Prefab, skin: Skin, clip: ShadeAnimationClip): PrefabSkinScaleConflict[];
|
|
34
|
+
export type Prefab = import("./Prefab.js").Prefab;
|
|
35
|
+
export type Skin = import("../../../shade/renderer/animation/Skin.js").Skin;
|
|
36
|
+
export type ShadeAnimationClip = import("../../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip;
|
|
37
|
+
export type ShadeAnimationChannel = import("../../../shade/renderer/animation/ShadeAnimationChannel.js").ShadeAnimationChannel;
|
|
38
|
+
export type PrefabSkinScaleConflict = {
|
|
39
|
+
/**
|
|
40
|
+
* the scaling channel
|
|
41
|
+
*/
|
|
42
|
+
channel: ShadeAnimationChannel;
|
|
43
|
+
/**
|
|
44
|
+
* the node it scales
|
|
45
|
+
*/
|
|
46
|
+
node: number;
|
|
47
|
+
/**
|
|
48
|
+
* whether the scale is the same on every axis
|
|
49
|
+
*/
|
|
50
|
+
uniform: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* how many of the skin's joints sit under the node
|
|
53
|
+
*/
|
|
54
|
+
joints_reached: number;
|
|
55
|
+
/**
|
|
56
|
+
* whether any of the skin's meshes sit under the node
|
|
57
|
+
*/
|
|
58
|
+
reaches_mesh: boolean;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=prefab_skin_clip_scale_conflicts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefab_skin_clip_scale_conflicts.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,yDALW,MAAM,QACN,IAAI,QACJ,kBAAkB,GAChB,uBAAuB,EAAE,CAqDrC;qBApFY,OAAO,aAAa,EAAE,MAAM;mBAC5B,OAAO,2CAA2C,EAAE,IAAI;iCACxD,OAAO,yDAAyD,EAAE,kBAAkB;oCACpF,OAAO,4DAA4D,EAAE,qBAAqB;;;;;aAKzF,qBAAqB;;;;UACrB,MAAM;;;;aACN,OAAO;;;;oBACP,MAAM;;;;kBACN,OAAO"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { clip_scale_channels } from "../../../shade/renderer/animation/skin_clip_scale_conflicts.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {import("./Prefab.js").Prefab} Prefab
|
|
6
|
+
* @typedef {import("../../../shade/renderer/animation/Skin.js").Skin} Skin
|
|
7
|
+
* @typedef {import("../../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip} ShadeAnimationClip
|
|
8
|
+
* @typedef {import("../../../shade/renderer/animation/ShadeAnimationChannel.js").ShadeAnimationChannel} ShadeAnimationChannel
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @typedef {object} PrefabSkinScaleConflict
|
|
13
|
+
* @property {ShadeAnimationChannel} channel the scaling channel
|
|
14
|
+
* @property {number} node the node it scales
|
|
15
|
+
* @property {boolean} uniform whether the scale is the same on every axis
|
|
16
|
+
* @property {number} joints_reached how many of the skin's joints sit under the node
|
|
17
|
+
* @property {boolean} reaches_mesh whether any of the skin's meshes sit under the node
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The scale channels of `clip` that reach some of a skin's joints and meshes but not all of them.
|
|
22
|
+
*
|
|
23
|
+
* The frame {@link prefab_normalize_skin_frames} chooses is fixed at compile, and it is sound
|
|
24
|
+
* because the joints and the mesh share their scaling ancestors. A scale that reaches only some
|
|
25
|
+
* of them — a joint's own scale, a scale on a bone above half the skeleton — breaks that every
|
|
26
|
+
* frame it plays, on the GPU, where nothing can see it: the scale enters the joint matrices and
|
|
27
|
+
* not the frame they are folded against, and a dual quaternion cannot carry it. A scale on the
|
|
28
|
+
* character's root reaches the mesh and every joint and cancels; a scale on a node the skin has
|
|
29
|
+
* nothing to do with reaches nothing.
|
|
30
|
+
*
|
|
31
|
+
* The same question `skin_clip_scale_conflicts` asked of a node tree, asked of parent indices.
|
|
32
|
+
*
|
|
33
|
+
* @param {Prefab} prefab
|
|
34
|
+
* @param {Skin} skin joints and meshes as node indices
|
|
35
|
+
* @param {ShadeAnimationClip} clip channels targeting node indices
|
|
36
|
+
* @returns {PrefabSkinScaleConflict[]}
|
|
37
|
+
*/
|
|
38
|
+
export function prefab_skin_clip_scale_conflicts(prefab, skin, clip) {
|
|
39
|
+
assert.defined(prefab, 'prefab');
|
|
40
|
+
assert.equal(prefab.isPrefab, true, 'prefab.isPrefab !== true');
|
|
41
|
+
assert.defined(skin, 'skin');
|
|
42
|
+
assert.equal(skin.isSkin, true, 'skin.isSkin !== true');
|
|
43
|
+
assert.defined(clip, 'clip');
|
|
44
|
+
|
|
45
|
+
const scaling = clip_scale_channels(clip);
|
|
46
|
+
|
|
47
|
+
const conflicts = [];
|
|
48
|
+
|
|
49
|
+
if (scaling.length === 0) {
|
|
50
|
+
return conflicts;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const joints = new Set(skin.joints);
|
|
54
|
+
const meshes = new Set(skin.meshes);
|
|
55
|
+
|
|
56
|
+
for (const channel of scaling) {
|
|
57
|
+
const target = channel.target;
|
|
58
|
+
|
|
59
|
+
let joints_reached = 0;
|
|
60
|
+
let meshes_reached = 0;
|
|
61
|
+
|
|
62
|
+
for (const node of subtree(prefab, target)) {
|
|
63
|
+
if (joints.has(node)) {
|
|
64
|
+
joints_reached++;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (meshes.has(node)) {
|
|
68
|
+
meshes_reached++;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const reaches_everything = joints_reached === joints.size && meshes_reached === meshes.size;
|
|
73
|
+
const reaches_nothing = joints_reached === 0 && meshes_reached === 0;
|
|
74
|
+
|
|
75
|
+
if (reaches_everything || reaches_nothing) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
conflicts.push({
|
|
80
|
+
channel,
|
|
81
|
+
node: target,
|
|
82
|
+
uniform: is_uniform(channel),
|
|
83
|
+
joints_reached,
|
|
84
|
+
reaches_mesh: meshes_reached > 0,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return conflicts;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* `node` and every node under it. Children follow their parents in index order, so a forward
|
|
93
|
+
* pass from `node` with a membership set finds them all.
|
|
94
|
+
*
|
|
95
|
+
* @param {Prefab} prefab
|
|
96
|
+
* @param {number} node
|
|
97
|
+
* @returns {number[]}
|
|
98
|
+
*/
|
|
99
|
+
function subtree(prefab, node) {
|
|
100
|
+
const parent = prefab.parent;
|
|
101
|
+
const inside = new Set([node]);
|
|
102
|
+
const found = [node];
|
|
103
|
+
|
|
104
|
+
for (let i = node + 1; i < prefab.node_count; i++) {
|
|
105
|
+
if (inside.has(parent[i])) {
|
|
106
|
+
inside.add(i);
|
|
107
|
+
found.push(i);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return found;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @param {ShadeAnimationChannel} channel
|
|
116
|
+
* @returns {boolean}
|
|
117
|
+
*/
|
|
118
|
+
function is_uniform(channel) {
|
|
119
|
+
const { x, y, z } = channel.curves;
|
|
120
|
+
|
|
121
|
+
if (x === undefined || y === undefined || z === undefined) {
|
|
122
|
+
// an axis left unanimated keeps whatever the node's own scale holds while the others move,
|
|
123
|
+
// which is a non-uniform scale however uniform the curves that are there
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return (x === y || x.equals(y)) && (x === z || x.equals(z));
|
|
128
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A joint's skinning matrix at the prefab's rest pose: the joint's world under the root, times
|
|
3
|
+
* its inverse-bind matrix. What the skin matrix prep pass computes on the GPU from the row's
|
|
4
|
+
* `global`, computed here from the prefab's own composition.
|
|
5
|
+
*
|
|
6
|
+
* @param {Float64Array} out
|
|
7
|
+
* @param {Prefab} prefab
|
|
8
|
+
* @param {Skin} skin joints as node indices
|
|
9
|
+
* @param {number} joint_index
|
|
10
|
+
* @returns {Float64Array} `out`
|
|
11
|
+
*/
|
|
12
|
+
export function prefab_skin_joint_matrix(out: Float64Array, prefab: Prefab, skin: Skin, joint_index: number): Float64Array;
|
|
13
|
+
/**
|
|
14
|
+
* The frame a skin's meshes are deformed in: its first joint's skinning matrix at rest. For a
|
|
15
|
+
* skin whose rest pose is rigid every joint gives the same answer, and the first is as good as any.
|
|
16
|
+
*
|
|
17
|
+
* @param {Float64Array} out
|
|
18
|
+
* @param {Prefab} prefab
|
|
19
|
+
* @param {Skin} skin
|
|
20
|
+
* @returns {Float64Array} `out`
|
|
21
|
+
*/
|
|
22
|
+
export function prefab_skin_bind_transform(out: Float64Array, prefab: Prefab, skin: Skin): Float64Array;
|
|
23
|
+
/**
|
|
24
|
+
* How far a skin is from being deformable in `frame`: the worst rigidity defect of
|
|
25
|
+
* `inverse(frame) × joint.world × inverse_bind` over its joints, at rest. Zero for a skin that
|
|
26
|
+
* folds rigidly, `Infinity` for a frame with no inverse or a joint that reflects.
|
|
27
|
+
*
|
|
28
|
+
* A reflection scores perfectly on orthonormality, which is why it is caught by its determinant
|
|
29
|
+
* rather than by the defect: a dual quaternion would answer it with a rotation, silently, which is
|
|
30
|
+
* precisely the class of failure this exists to end.
|
|
31
|
+
*
|
|
32
|
+
* @param {Prefab} prefab
|
|
33
|
+
* @param {Skin} skin
|
|
34
|
+
* @param {ArrayLike<number>} frame
|
|
35
|
+
* @returns {number}
|
|
36
|
+
*/
|
|
37
|
+
export function prefab_skin_frame_defect(prefab: Prefab, skin: Skin, frame: ArrayLike<number>): number;
|
|
38
|
+
export type Prefab = import("./Prefab.js").Prefab;
|
|
39
|
+
export type Skin = import("../../../shade/renderer/animation/Skin.js").Skin;
|
|
40
|
+
//# sourceMappingURL=prefab_skin_frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefab_skin_frame.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_skin_frame.js"],"names":[],"mappings":"AAcA;;;;;;;;;;GAUG;AACH,8CANW,YAAY,UACZ,MAAM,QACN,IAAI,eACJ,MAAM,GACJ,YAAY,CAqBxB;AAED;;;;;;;;GAQG;AACH,gDALW,YAAY,UACZ,MAAM,QACN,IAAI,GACF,YAAY,CAMxB;AAED;;;;;;;;;;;;;GAaG;AACH,iDALW,MAAM,QACN,IAAI,SACJ,UAAU,MAAM,CAAC,GACf,MAAM,CA8BlB;qBAjGY,OAAO,aAAa,EAAE,MAAM;mBAC5B,OAAO,2CAA2C,EAAE,IAAI"}
|