@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,334 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
|
|
3
|
+
import { ShadeAnimationChannel } from "../../../shade/renderer/animation/ShadeAnimationChannel.js";
|
|
4
|
+
import { ShadeAnimationClip } from "../../../shade/renderer/animation/ShadeAnimationClip.js";
|
|
5
|
+
import { Skin } from "../../../shade/renderer/animation/Skin.js";
|
|
6
|
+
import { Transform64 } from "../../ecs/transform/Transform64.js";
|
|
7
|
+
import { Prefab, PrefabPrimitive } from "./Prefab.js";
|
|
8
|
+
import { prefab_normalize_skin_frames } from "./prefab_normalize_skin_frames.js";
|
|
9
|
+
import { prefab_skin_clip_scale_conflicts } from "./prefab_skin_clip_scale_conflicts.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @typedef {import("../../../shade/renderer/loader/SceneBundle.js").SceneBundle} SceneBundle
|
|
13
|
+
* @typedef {import("../../../shade/renderer/loader/SceneNode.js").SceneNode} SceneNode
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The root's world, and every node's until it is composed.
|
|
18
|
+
*
|
|
19
|
+
* @type {Float64Array}
|
|
20
|
+
*/
|
|
21
|
+
const IDENTITY = new Float64Array([
|
|
22
|
+
1, 0, 0, 0,
|
|
23
|
+
0, 1, 0, 0,
|
|
24
|
+
0, 0, 1, 0,
|
|
25
|
+
0, 0, 0, 1,
|
|
26
|
+
]);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Whether a root can be folded into the prefab's root: it carries nothing an entity would be
|
|
30
|
+
* spawned for. glTF gives every scene one of these, so folding it is one entity fewer per
|
|
31
|
+
* placement; a root that is posed, named, drawn or animated is kept.
|
|
32
|
+
*
|
|
33
|
+
* @param {SceneNode} node
|
|
34
|
+
* @param {number} index the node's index in the bundle
|
|
35
|
+
* @param {Set<number>} referenced indices of the nodes a skin or a clip names
|
|
36
|
+
* @returns {boolean}
|
|
37
|
+
*/
|
|
38
|
+
function foldable(node, index, referenced) {
|
|
39
|
+
return node.parent === -1
|
|
40
|
+
&& node.name === ""
|
|
41
|
+
&& node.geometry === null
|
|
42
|
+
&& node.local.isIdentity()
|
|
43
|
+
&& !referenced.has(index);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Compile what a loader produced into a {@link Prefab}.
|
|
48
|
+
*
|
|
49
|
+
* The bundle is read and never written: it is the loader's, shared by every placement of the
|
|
50
|
+
* model and by whatever else reads it. Geometry, materials, inverse-bind matrices and curves are
|
|
51
|
+
* referenced, not copied.
|
|
52
|
+
*
|
|
53
|
+
* The bundle's nodes are in pre-order, so one forward pass indexes them with every parent below
|
|
54
|
+
* its children and composes each world from its parent's. Skins and clips are re-addressed from
|
|
55
|
+
* the bundle's indices to the prefab's; nothing about them changes otherwise. Then, once per model
|
|
56
|
+
* rather than once per placement, each skin's meshes are put into the frame the skin deforms in
|
|
57
|
+
* ({@link prefab_normalize_skin_frames}) and each clip that scales something is checked against
|
|
58
|
+
* each skin ({@link prefab_skin_clip_scale_conflicts}), both reported the way the animation
|
|
59
|
+
* manager used to report them on registration.
|
|
60
|
+
*
|
|
61
|
+
* @param {SceneBundle} bundle
|
|
62
|
+
* @returns {Prefab}
|
|
63
|
+
*/
|
|
64
|
+
export function prefab_compile(bundle) {
|
|
65
|
+
assert.defined(bundle, 'bundle');
|
|
66
|
+
assert.equal(bundle.isSceneBundle, true, 'bundle.isSceneBundle !== true');
|
|
67
|
+
|
|
68
|
+
const nodes = bundle.nodes;
|
|
69
|
+
|
|
70
|
+
const referenced = new Set();
|
|
71
|
+
|
|
72
|
+
for (const skin of bundle.skins) {
|
|
73
|
+
for (const joint of skin.joints) {
|
|
74
|
+
referenced.add(joint);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
for (const mesh of skin.meshes) {
|
|
78
|
+
referenced.add(mesh);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
for (const clip of bundle.clips) {
|
|
83
|
+
for (const channel of clip.channels) {
|
|
84
|
+
referenced.add(channel.target);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const prefab = new Prefab();
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* The prefab index of each bundle node; a folded root's is the prefab's root.
|
|
92
|
+
*
|
|
93
|
+
* @type {Int32Array}
|
|
94
|
+
*/
|
|
95
|
+
const index_of = new Int32Array(nodes.length).fill(-1);
|
|
96
|
+
|
|
97
|
+
const parents = [-1];
|
|
98
|
+
const names = [""];
|
|
99
|
+
const locals = [new Transform64()];
|
|
100
|
+
const worlds = [new Float64Array(IDENTITY)];
|
|
101
|
+
|
|
102
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
103
|
+
const node = nodes[i];
|
|
104
|
+
|
|
105
|
+
assert.equal(node.parent < i, true, `bundle node ${i} names parent ${node.parent}: the bundle is not in pre-order`);
|
|
106
|
+
|
|
107
|
+
if (foldable(node, i, referenced)) {
|
|
108
|
+
index_of[i] = 0;
|
|
109
|
+
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const parent = node.parent === -1 ? 0 : index_of[node.parent];
|
|
114
|
+
const index = parents.length;
|
|
115
|
+
|
|
116
|
+
index_of[i] = index;
|
|
117
|
+
|
|
118
|
+
parents.push(parent);
|
|
119
|
+
names.push(node.name);
|
|
120
|
+
|
|
121
|
+
const local = new Transform64();
|
|
122
|
+
|
|
123
|
+
local.copy(node.local);
|
|
124
|
+
local.updateMatrix();
|
|
125
|
+
|
|
126
|
+
locals.push(local);
|
|
127
|
+
|
|
128
|
+
const world = new Float64Array(16);
|
|
129
|
+
|
|
130
|
+
m4_multiply(world, worlds[parent], local);
|
|
131
|
+
|
|
132
|
+
worlds.push(world);
|
|
133
|
+
|
|
134
|
+
if (node.geometry !== null) {
|
|
135
|
+
const primitive = new PrefabPrimitive();
|
|
136
|
+
|
|
137
|
+
primitive.node = index;
|
|
138
|
+
primitive.geometry = node.geometry;
|
|
139
|
+
primitive.material = node.material;
|
|
140
|
+
|
|
141
|
+
prefab.primitives.push(primitive);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
prefab.node_count = parents.length;
|
|
146
|
+
prefab.parent = Int32Array.from(parents);
|
|
147
|
+
prefab.name = names;
|
|
148
|
+
prefab.local = locals;
|
|
149
|
+
prefab.world = worlds;
|
|
150
|
+
prefab.animated = new Uint8Array(parents.length);
|
|
151
|
+
prefab.index_names();
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* @param {number} node an index into the bundle's nodes
|
|
155
|
+
* @param {string} what
|
|
156
|
+
* @returns {number} the prefab's index for it
|
|
157
|
+
*/
|
|
158
|
+
function resolve(node, what) {
|
|
159
|
+
assert.isNonNegativeInteger(node, `${what}: a node is named by its index in the bundle`);
|
|
160
|
+
assert.lessThan(node, nodes.length, `${what} names node ${node}, and the bundle has ${nodes.length}`);
|
|
161
|
+
|
|
162
|
+
return index_of[node];
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
prefab.skins = bundle.skins.map((skin, s) => {
|
|
166
|
+
const joints = skin.joints.map((joint, j) => resolve(joint, `skin ${s} joint ${j}`));
|
|
167
|
+
const meshes = skin.meshes.map((mesh, m) => resolve(mesh, `skin ${s} mesh ${m}`));
|
|
168
|
+
|
|
169
|
+
for (const joint of joints) {
|
|
170
|
+
prefab.animated[joint] = 1;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
for (const mesh of meshes) {
|
|
174
|
+
const primitive = prefab.primitives.find(primitive => primitive.node === mesh);
|
|
175
|
+
|
|
176
|
+
assert.defined(primitive, `skin ${s} deforms node ${mesh}, which carries no geometry`);
|
|
177
|
+
|
|
178
|
+
primitive.skin = s;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return Skin.from({
|
|
182
|
+
name: skin.name,
|
|
183
|
+
joints,
|
|
184
|
+
inverse_bind_matrices: skin.inverse_bind_matrices,
|
|
185
|
+
meshes,
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
prefab.clips = bundle.clips.map((clip, c) => ShadeAnimationClip.from({
|
|
190
|
+
name: clip.name,
|
|
191
|
+
channels: clip.channels.map((channel, ch) => {
|
|
192
|
+
const target = resolve(channel.target, `clip ${c} channel ${ch}`);
|
|
193
|
+
|
|
194
|
+
prefab.animated[target] = 1;
|
|
195
|
+
|
|
196
|
+
return ShadeAnimationChannel.from({
|
|
197
|
+
target,
|
|
198
|
+
property: channel.property,
|
|
199
|
+
curves: channel.curves,
|
|
200
|
+
});
|
|
201
|
+
}),
|
|
202
|
+
}));
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
A node under an animated one is animated too: once a clip takes the joint, the GPU composes
|
|
206
|
+
the joint's world and every world below it, so the instance has to be able to say so on each
|
|
207
|
+
of those entities without adding a component mid-game. Pre-order puts every parent before
|
|
208
|
+
its children, so one pass carries the mark all the way down.
|
|
209
|
+
*/
|
|
210
|
+
const animated = prefab.animated;
|
|
211
|
+
const parent_of = prefab.parent;
|
|
212
|
+
|
|
213
|
+
for (let i = 1; i < animated.length; i++) {
|
|
214
|
+
if (animated[parent_of[i]] === 1) {
|
|
215
|
+
animated[i] = 1;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const reports = prefab_normalize_skin_frames(prefab);
|
|
220
|
+
|
|
221
|
+
for (let s = 0; s < reports.length; s++) {
|
|
222
|
+
report_frame(prefab, prefab.skins[s], reports[s]);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
for (const clip of prefab.clips) {
|
|
226
|
+
for (const skin of prefab.skins) {
|
|
227
|
+
report_scale_conflicts(prefab, skin, clip);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return prefab;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* The name a person would recognise a skin by: its own, or its first mesh's.
|
|
236
|
+
*
|
|
237
|
+
* @param {Prefab} prefab
|
|
238
|
+
* @param {Skin} skin
|
|
239
|
+
* @returns {string}
|
|
240
|
+
*/
|
|
241
|
+
function skin_label(prefab, skin) {
|
|
242
|
+
if (skin.name !== '') {
|
|
243
|
+
return skin.name;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const mesh = skin.meshes[0];
|
|
247
|
+
|
|
248
|
+
return mesh === undefined ? '<unnamed>' : (prefab.name[mesh] || '<unnamed>');
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Say what {@link prefab_normalize_skin_frames} found, on the console, the way registration
|
|
253
|
+
* used to: an asset that renders wrong should say which asset and by how much, once, where it
|
|
254
|
+
* was compiled, rather than reaching a person as a screenshot of soup.
|
|
255
|
+
*
|
|
256
|
+
* @param {Prefab} prefab
|
|
257
|
+
* @param {Skin} skin
|
|
258
|
+
* @param {object} report
|
|
259
|
+
*/
|
|
260
|
+
function report_frame(prefab, skin, report) {
|
|
261
|
+
const label = skin_label(prefab, skin);
|
|
262
|
+
|
|
263
|
+
if (report.frame_defect > 0.001) {
|
|
264
|
+
console.error(
|
|
265
|
+
`skin '${label}': no frame can deform it — `
|
|
266
|
+
+ `inverse(frame) × joint.global × inverse_bind is ${report.frame_defect.toFixed(4)} `
|
|
267
|
+
+ `away from rigid at its own bind pose, and a dual quaternion carries a rotation and `
|
|
268
|
+
+ `a translation and nothing else. The rest pose has a non-uniform scale or a shear `
|
|
269
|
+
+ `in it. Rendering will be wrong; see SKINNING_FRAME_PLAN.md §4.`
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (report.residual > 0.001) {
|
|
276
|
+
console.error(
|
|
277
|
+
`skin '${label}': its mesh frame did not land — ${report.residual.toFixed(6)} `
|
|
278
|
+
+ `left over. A correction carrying shear does not survive a Transform64's TRS `
|
|
279
|
+
+ `components. Rendering will be wrong; see SKINNING_FRAME_PLAN.md §3.`
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
for (const mesh of report.obstructed) {
|
|
286
|
+
console.warn(
|
|
287
|
+
`skin '${label}': mesh node '${prefab.name[mesh]}' carries the skin's frame now, and `
|
|
288
|
+
+ `its child nodes inherit it. Sockets belong on bones.`
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (report.corrected > 0) {
|
|
293
|
+
// verbose rather than a warning: this is a legal asset shape, and a crowd of them would
|
|
294
|
+
// otherwise be a crowd of log lines
|
|
295
|
+
console.debug(
|
|
296
|
+
`skin '${label}': ${report.corrected} mesh frame(s) moved onto the skin's bind `
|
|
297
|
+
+ `transform, absorbing ${report.absorbed.toFixed(4)} of non-rigidity the skinning `
|
|
298
|
+
+ `pass could not have carried.`
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Say so when a clip scales a skin's joints out from under the frame it is deformed in. Nothing
|
|
305
|
+
* is refused: the clip is legal animation and the skin is a legal skin, and it is their
|
|
306
|
+
* combination the skinning pass cannot carry.
|
|
307
|
+
*
|
|
308
|
+
* @param {Prefab} prefab
|
|
309
|
+
* @param {Skin} skin
|
|
310
|
+
* @param {ShadeAnimationClip} clip
|
|
311
|
+
*/
|
|
312
|
+
function report_scale_conflicts(prefab, skin, clip) {
|
|
313
|
+
const conflicts = prefab_skin_clip_scale_conflicts(prefab, skin, clip);
|
|
314
|
+
|
|
315
|
+
if (conflicts.length === 0) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const nodes = conflicts.map(conflict => prefab.name[conflict.node] || '<unnamed>').join(', ');
|
|
320
|
+
|
|
321
|
+
const uniform = conflicts.every(conflict => conflict.uniform);
|
|
322
|
+
|
|
323
|
+
console.error(
|
|
324
|
+
`clip '${clip.name}' scales ${conflicts.length} node(s) of skin '${skin_label(prefab, skin)}' — `
|
|
325
|
+
+ `${nodes} — which reach its joints but not its mesh, so the scale enters the joint `
|
|
326
|
+
+ `matrices and not the frame they are folded against. A dual quaternion cannot carry `
|
|
327
|
+
+ `it and no choice of frame fixes it: the deformation will be wrong while this clip `
|
|
328
|
+
+ `plays. `
|
|
329
|
+
+ (uniform
|
|
330
|
+
? `The scale is uniform, which SKINNING_FRAME_PLAN.md §4 has a design for.`
|
|
331
|
+
: `The scale is non-uniform, which no dual quaternion holds — §4's linear-blend `
|
|
332
|
+
+ `path or an import-time refusal.`)
|
|
333
|
+
);
|
|
334
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spawn a prefab as entities under `root`, in bulk.
|
|
3
|
+
*
|
|
4
|
+
* **What a model is in an ECS.** Each node of the prefab becomes an entity: named, attached to
|
|
5
|
+
* its parent's entity by a `TransformAttachment` carrying the node's rest pose, holding a world
|
|
6
|
+
* `Transform64` composed from the root's, drawing through a `ShadedGeometry` where the node
|
|
7
|
+
* carries geometry, and declaring `GPUStateAuthority` — with a zero flags word — where a clip or a
|
|
8
|
+
* skin may later hand the node to the GPU, so that the hand-over is a bit write and never a
|
|
9
|
+
* component add. Node 0 is `root` itself, the caller's entity, whose `Transform64` is the
|
|
10
|
+
* placement.
|
|
11
|
+
*
|
|
12
|
+
* **Parents before children, and the transform last.** Entities are built in the prefab's node
|
|
13
|
+
* order, which puts every parent's entity there before its children's, so
|
|
14
|
+
* `TransformAttachmentSystem` binds each one on the spot rather than parking it. The `Transform64`
|
|
15
|
+
* is the last component added to each entity, so every system whose dependencies include it —
|
|
16
|
+
* and they all do — links once, seeing the entity complete.
|
|
17
|
+
*
|
|
18
|
+
* Every entity is the root's for its lifetime (`ParentEntity`) and, unless told otherwise,
|
|
19
|
+
* transient to serialization: a save holds the model's placement, not sixty joints of derived
|
|
20
|
+
* state.
|
|
21
|
+
*
|
|
22
|
+
* @param {Prefab} prefab
|
|
23
|
+
* @param {EntityComponentDataset} dataset
|
|
24
|
+
* @param {number} root an entity carrying a `Transform64`
|
|
25
|
+
* @param {object} [options]
|
|
26
|
+
* @param {boolean} [options.transient] whether the spawned entities are skipped by serialization;
|
|
27
|
+
* true unless said otherwise
|
|
28
|
+
* @returns {PrefabInstance}
|
|
29
|
+
*/
|
|
30
|
+
export function prefab_instantiate(prefab: Prefab, dataset: EntityComponentDataset, root: number, { transient }?: {
|
|
31
|
+
transient?: boolean;
|
|
32
|
+
}): PrefabInstance;
|
|
33
|
+
/**
|
|
34
|
+
* Remove every entity an instance spawned. The root is the caller's and stays.
|
|
35
|
+
*
|
|
36
|
+
* Children before parents, so that no parent's removal has to reach down and detach a child
|
|
37
|
+
* that is about to go anyway.
|
|
38
|
+
*
|
|
39
|
+
* @param {EntityComponentDataset} dataset
|
|
40
|
+
* @param {PrefabInstance} instance
|
|
41
|
+
*/
|
|
42
|
+
export function prefab_instance_destroy(dataset: EntityComponentDataset, instance: PrefabInstance): void;
|
|
43
|
+
export type Prefab = import("./Prefab.js").Prefab;
|
|
44
|
+
export type EntityComponentDataset = import("../../ecs/EntityComponentDataset.js").EntityComponentDataset;
|
|
45
|
+
import { PrefabInstance } from "./PrefabInstance.js";
|
|
46
|
+
//# sourceMappingURL=prefab_instantiate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefab_instantiate.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_instantiate.js"],"names":[],"mappings":"AAsCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,2CARW,MAAM,WACN,sBAAsB,QACtB,MAAM;IAEY,SAAS,GAA3B,OAAO;IAEL,cAAc,CAgJ1B;AAED;;;;;;;;GAQG;AACH,iDAHW,sBAAsB,YACtB,cAAc,QAWxB;qBApNY,OAAO,aAAa,EAAE,MAAM;qCAC5B,OAAO,qCAAqC,EAAE,sBAAsB;+BAJlD,qBAAqB"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
|
|
3
|
+
import { ShadeAnimationChannel } from "../../../shade/renderer/animation/ShadeAnimationChannel.js";
|
|
4
|
+
import { ShadeAnimationClip } from "../../../shade/renderer/animation/ShadeAnimationClip.js";
|
|
5
|
+
import { Skin } from "../../../shade/renderer/animation/Skin.js";
|
|
6
|
+
import { SerializationMetadata } from "../../ecs/components/SerializationMetadata.js";
|
|
7
|
+
import { GPUStateAuthority } from "../../ecs/gpu/GPUStateAuthority.js";
|
|
8
|
+
import { Name } from "../../ecs/name/Name.js";
|
|
9
|
+
import { ParentEntity } from "../../ecs/parent/ParentEntity.js";
|
|
10
|
+
import { TransformAttachment } from "../../ecs/transform-attachment/TransformAttachment.js";
|
|
11
|
+
import { Transform64 } from "../../ecs/transform/Transform64.js";
|
|
12
|
+
import { DrawMode } from "../../graphics/ecs/mesh-v2/DrawMode.js";
|
|
13
|
+
import { ShadedGeometry } from "../../graphics/ecs/mesh-v2/ShadedGeometry.js";
|
|
14
|
+
import { ShadedGeometryFlags } from "../../graphics/ecs/mesh-v2/ShadedGeometryFlags.js";
|
|
15
|
+
import { PrefabInstance } from "./PrefabInstance.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @typedef {import("./Prefab.js").Prefab} Prefab
|
|
19
|
+
* @typedef {import("../../ecs/EntityComponentDataset.js").EntityComponentDataset} EntityComponentDataset
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Every component type an instance may attach. Registered once per dataset, before the first
|
|
24
|
+
* entity is built, because registering a type rebuilds the dataset's occupancy and a spawn of
|
|
25
|
+
* thousands of entities must not do that per component.
|
|
26
|
+
*
|
|
27
|
+
* @type {Function[]}
|
|
28
|
+
*/
|
|
29
|
+
const COMPONENT_TYPES = [
|
|
30
|
+
Transform64,
|
|
31
|
+
TransformAttachment,
|
|
32
|
+
Name,
|
|
33
|
+
ShadedGeometry,
|
|
34
|
+
GPUStateAuthority,
|
|
35
|
+
ParentEntity,
|
|
36
|
+
SerializationMetadata,
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Spawn a prefab as entities under `root`, in bulk.
|
|
41
|
+
*
|
|
42
|
+
* **What a model is in an ECS.** Each node of the prefab becomes an entity: named, attached to
|
|
43
|
+
* its parent's entity by a `TransformAttachment` carrying the node's rest pose, holding a world
|
|
44
|
+
* `Transform64` composed from the root's, drawing through a `ShadedGeometry` where the node
|
|
45
|
+
* carries geometry, and declaring `GPUStateAuthority` — with a zero flags word — where a clip or a
|
|
46
|
+
* skin may later hand the node to the GPU, so that the hand-over is a bit write and never a
|
|
47
|
+
* component add. Node 0 is `root` itself, the caller's entity, whose `Transform64` is the
|
|
48
|
+
* placement.
|
|
49
|
+
*
|
|
50
|
+
* **Parents before children, and the transform last.** Entities are built in the prefab's node
|
|
51
|
+
* order, which puts every parent's entity there before its children's, so
|
|
52
|
+
* `TransformAttachmentSystem` binds each one on the spot rather than parking it. The `Transform64`
|
|
53
|
+
* is the last component added to each entity, so every system whose dependencies include it —
|
|
54
|
+
* and they all do — links once, seeing the entity complete.
|
|
55
|
+
*
|
|
56
|
+
* Every entity is the root's for its lifetime (`ParentEntity`) and, unless told otherwise,
|
|
57
|
+
* transient to serialization: a save holds the model's placement, not sixty joints of derived
|
|
58
|
+
* state.
|
|
59
|
+
*
|
|
60
|
+
* @param {Prefab} prefab
|
|
61
|
+
* @param {EntityComponentDataset} dataset
|
|
62
|
+
* @param {number} root an entity carrying a `Transform64`
|
|
63
|
+
* @param {object} [options]
|
|
64
|
+
* @param {boolean} [options.transient] whether the spawned entities are skipped by serialization;
|
|
65
|
+
* true unless said otherwise
|
|
66
|
+
* @returns {PrefabInstance}
|
|
67
|
+
*/
|
|
68
|
+
export function prefab_instantiate(prefab, dataset, root, { transient = true } = {}) {
|
|
69
|
+
assert.defined(prefab, 'prefab');
|
|
70
|
+
assert.equal(prefab.isPrefab, true, 'prefab.isPrefab !== true');
|
|
71
|
+
assert.defined(dataset, 'dataset');
|
|
72
|
+
assert.equal(dataset.isEntityComponentDataset, true, 'dataset.isEntityComponentDataset !== true');
|
|
73
|
+
assert.isNonNegativeInteger(root, 'root');
|
|
74
|
+
assert.ok(dataset.entityExists(root), `root entity ${root} does not exist`);
|
|
75
|
+
|
|
76
|
+
dataset.registerManyComponentTypes(COMPONENT_TYPES);
|
|
77
|
+
|
|
78
|
+
// Component indices resolved once: an add by index skips the class lookup and the guard that
|
|
79
|
+
// formats a component into an error message, and there are six or seven adds per entity.
|
|
80
|
+
const TRANSFORM = dataset.computeComponentTypeIndex(Transform64);
|
|
81
|
+
const ATTACHMENT = dataset.computeComponentTypeIndex(TransformAttachment);
|
|
82
|
+
const NAME = dataset.computeComponentTypeIndex(Name);
|
|
83
|
+
const GEOMETRY = dataset.computeComponentTypeIndex(ShadedGeometry);
|
|
84
|
+
const AUTHORITY = dataset.computeComponentTypeIndex(GPUStateAuthority);
|
|
85
|
+
const PARENT = dataset.computeComponentTypeIndex(ParentEntity);
|
|
86
|
+
const METADATA = dataset.computeComponentTypeIndex(SerializationMetadata);
|
|
87
|
+
|
|
88
|
+
const root_transform = dataset.getComponent(root, Transform64);
|
|
89
|
+
|
|
90
|
+
assert.defined(root_transform, `root entity ${root} carries no Transform64 to place the model by`);
|
|
91
|
+
|
|
92
|
+
const node_count = prefab.node_count;
|
|
93
|
+
|
|
94
|
+
const entities = new Int32Array(node_count);
|
|
95
|
+
|
|
96
|
+
entities[0] = root;
|
|
97
|
+
|
|
98
|
+
// Ids from the dataset's own occupancy, walking forward: `createEntity` scans from bit zero
|
|
99
|
+
// every time, which is quadratic over a spawn of this size.
|
|
100
|
+
const occupancy = dataset.entityOccupancy;
|
|
101
|
+
|
|
102
|
+
let cursor = 0;
|
|
103
|
+
|
|
104
|
+
for (let i = 1; i < node_count; i++) {
|
|
105
|
+
const entity = occupancy.nextClearBit(cursor);
|
|
106
|
+
|
|
107
|
+
dataset.createEntitySpecific(entity);
|
|
108
|
+
|
|
109
|
+
entities[i] = entity;
|
|
110
|
+
cursor = entity + 1;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const parent = prefab.parent;
|
|
114
|
+
const names = prefab.name;
|
|
115
|
+
const locals = prefab.local;
|
|
116
|
+
const worlds = prefab.world;
|
|
117
|
+
const animated = prefab.animated;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @type {Map<number, import("./Prefab.js").PrefabPrimitive>}
|
|
121
|
+
*/
|
|
122
|
+
const primitive_of = new Map();
|
|
123
|
+
|
|
124
|
+
for (const primitive of prefab.primitives) {
|
|
125
|
+
primitive_of.set(primitive.node, primitive);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// One lifetime component for the whole instance: it names the root and nothing else, it is
|
|
129
|
+
// immutable while attached, and sixty copies of one number are sixty allocations for nothing.
|
|
130
|
+
const owner = ParentEntity.from(root);
|
|
131
|
+
|
|
132
|
+
for (let i = 1; i < node_count; i++) {
|
|
133
|
+
const entity = entities[i];
|
|
134
|
+
|
|
135
|
+
if (transient) {
|
|
136
|
+
dataset.addComponentToEntityByIndex(entity, METADATA, SerializationMetadata.Transient);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
dataset.addComponentToEntityByIndex(entity, PARENT, owner);
|
|
140
|
+
|
|
141
|
+
const name = names[i];
|
|
142
|
+
|
|
143
|
+
if (name !== "") {
|
|
144
|
+
dataset.addComponentToEntityByIndex(entity, NAME, new Name(name));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (animated[i] !== 0) {
|
|
148
|
+
dataset.addComponentToEntityByIndex(entity, AUTHORITY, new GPUStateAuthority());
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const primitive = primitive_of.get(i);
|
|
152
|
+
|
|
153
|
+
if (primitive !== undefined) {
|
|
154
|
+
const geometry = ShadedGeometry.from(primitive.geometry, primitive.material, DrawMode.Triangles);
|
|
155
|
+
|
|
156
|
+
if (primitive.skin !== -1) {
|
|
157
|
+
geometry.setFlag(ShadedGeometryFlags.Skinned);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
dataset.addComponentToEntityByIndex(entity, GEOMETRY, geometry);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const attachment = new TransformAttachment();
|
|
164
|
+
|
|
165
|
+
attachment.parent = entities[parent[i]];
|
|
166
|
+
attachment.transform.copy(locals[i]);
|
|
167
|
+
|
|
168
|
+
// The world is composed below, from the same chain the attachment system would compose
|
|
169
|
+
// it from, so the system is told not to compose it again at link: a decomposition per
|
|
170
|
+
// entity, and an announcement nothing is listening for yet. It still follows every move
|
|
171
|
+
// of the parent from then on.
|
|
172
|
+
attachment.immediate = false;
|
|
173
|
+
|
|
174
|
+
dataset.addComponentToEntityByIndex(entity, ATTACHMENT, attachment);
|
|
175
|
+
|
|
176
|
+
// Composed here rather than left to the attachment system, so that a dataset with no
|
|
177
|
+
// systems — a preview, a spec — holds every world too.
|
|
178
|
+
const world = new Transform64();
|
|
179
|
+
|
|
180
|
+
m4_multiply(world, root_transform, worlds[i]);
|
|
181
|
+
world.updateComponents();
|
|
182
|
+
|
|
183
|
+
dataset.addComponentToEntityByIndex(entity, TRANSFORM, world);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const instance = new PrefabInstance();
|
|
187
|
+
|
|
188
|
+
instance.prefab = prefab;
|
|
189
|
+
instance.root = root;
|
|
190
|
+
instance.entities = entities;
|
|
191
|
+
instance.mesh_entities = Int32Array.from(prefab.primitives, primitive => entities[primitive.node]);
|
|
192
|
+
|
|
193
|
+
instance.skins = prefab.skins.map(skin => Skin.from({
|
|
194
|
+
name: skin.name,
|
|
195
|
+
joints: Array.from(skin.joints, joint => entities[joint]),
|
|
196
|
+
inverse_bind_matrices: skin.inverse_bind_matrices,
|
|
197
|
+
meshes: Array.from(skin.meshes, mesh => entities[mesh]),
|
|
198
|
+
}));
|
|
199
|
+
|
|
200
|
+
instance.clips = prefab.clips.map(clip => ShadeAnimationClip.from({
|
|
201
|
+
name: clip.name,
|
|
202
|
+
channels: clip.channels.map(channel => ShadeAnimationChannel.from({
|
|
203
|
+
target: entities[channel.target],
|
|
204
|
+
property: channel.property,
|
|
205
|
+
curves: channel.curves,
|
|
206
|
+
})),
|
|
207
|
+
}));
|
|
208
|
+
|
|
209
|
+
return instance;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Remove every entity an instance spawned. The root is the caller's and stays.
|
|
214
|
+
*
|
|
215
|
+
* Children before parents, so that no parent's removal has to reach down and detach a child
|
|
216
|
+
* that is about to go anyway.
|
|
217
|
+
*
|
|
218
|
+
* @param {EntityComponentDataset} dataset
|
|
219
|
+
* @param {PrefabInstance} instance
|
|
220
|
+
*/
|
|
221
|
+
export function prefab_instance_destroy(dataset, instance) {
|
|
222
|
+
assert.defined(dataset, 'dataset');
|
|
223
|
+
assert.defined(instance, 'instance');
|
|
224
|
+
|
|
225
|
+
const entities = instance.entities;
|
|
226
|
+
|
|
227
|
+
for (let i = entities.length - 1; i >= 1; i--) {
|
|
228
|
+
dataset.removeEntity(entities[i]);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {object} PrefabSkinFrameReport
|
|
3
|
+
* @property {number} frame_defect how far the skin is from being deformable in *any* frame; zero
|
|
4
|
+
* when it is fine
|
|
5
|
+
* @property {number} absorbed how far from rigid the largest correction was — for a violation,
|
|
6
|
+
* the number the soup was made of
|
|
7
|
+
* @property {number} corrected meshes moved
|
|
8
|
+
* @property {number} unchanged meshes already right
|
|
9
|
+
* @property {number} residual the worst `|mesh.world − bind|` left afterwards
|
|
10
|
+
* @property {number[]} obstructed corrected mesh nodes that have children, which inherit a
|
|
11
|
+
* transform nobody asked for
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Put every skin's meshes into the frame the skin deforms in, once, on the prefab.
|
|
15
|
+
*
|
|
16
|
+
* The skinning pass writes each clone's vertices in `inverse(mesh.global)` space and the
|
|
17
|
+
* rasterizer re-applies `mesh.global`, so `mesh.global` is the *frame* a skinned mesh's vertices
|
|
18
|
+
* live in — and the pass gets there by folding `inverse(mesh.global) × joint.global ×
|
|
19
|
+
* inverse_bind` into a dual quaternion, which carries a rotation and a translation and nothing
|
|
20
|
+
* else. glTF says a skinned mesh's node transform is ignored, so the frame is the engine's to
|
|
21
|
+
* choose, and the one that is guaranteed to fold rigidly is the skin's own bind transform,
|
|
22
|
+
* `joint.global × inverse_bind` at rest ({@link prefab_skin_bind_transform}). After this the fold
|
|
23
|
+
* is the joint's displacement from bind, rigid whenever the clip rotates and translates and does
|
|
24
|
+
* not scale. `SKINNING_FRAME_PLAN.md` is the whole argument.
|
|
25
|
+
*
|
|
26
|
+
* Done here rather than on registration because the correction is placement-invariant and
|
|
27
|
+
* idempotent: it is a property of the asset, so it belongs to the compiled model and not to each
|
|
28
|
+
* of its placements. A file whose inverse-bind matrices already agree with its node transforms is
|
|
29
|
+
* not touched. A skin whose own bind frame does not fold — a rest pose carrying a non-uniform
|
|
30
|
+
* scale or a shear — is reported and left as the asset had it.
|
|
31
|
+
*
|
|
32
|
+
* The correction goes on the mesh node's **local** transform, and its descendants' worlds are
|
|
33
|
+
* recomposed, so the prefab's {@link Prefab.world} stays consistent with its {@link Prefab.local}.
|
|
34
|
+
*
|
|
35
|
+
* @param {Prefab} prefab
|
|
36
|
+
* @returns {PrefabSkinFrameReport[]} one report per skin
|
|
37
|
+
*/
|
|
38
|
+
export function prefab_normalize_skin_frames(prefab: Prefab): PrefabSkinFrameReport[];
|
|
39
|
+
export type PrefabSkinFrameReport = {
|
|
40
|
+
/**
|
|
41
|
+
* how far the skin is from being deformable in *any* frame; zero
|
|
42
|
+
* when it is fine
|
|
43
|
+
*/
|
|
44
|
+
frame_defect: number;
|
|
45
|
+
/**
|
|
46
|
+
* how far from rigid the largest correction was — for a violation,
|
|
47
|
+
* the number the soup was made of
|
|
48
|
+
*/
|
|
49
|
+
absorbed: number;
|
|
50
|
+
/**
|
|
51
|
+
* meshes moved
|
|
52
|
+
*/
|
|
53
|
+
corrected: number;
|
|
54
|
+
/**
|
|
55
|
+
* meshes already right
|
|
56
|
+
*/
|
|
57
|
+
unchanged: number;
|
|
58
|
+
/**
|
|
59
|
+
* the worst `|mesh.world − bind|` left afterwards
|
|
60
|
+
*/
|
|
61
|
+
residual: number;
|
|
62
|
+
/**
|
|
63
|
+
* corrected mesh nodes that have children, which inherit a
|
|
64
|
+
* transform nobody asked for
|
|
65
|
+
*/
|
|
66
|
+
obstructed: number[];
|
|
67
|
+
};
|
|
68
|
+
export type Prefab = import("./Prefab.js").Prefab;
|
|
69
|
+
export type Skin = import("../../../shade/renderer/animation/Skin.js").Skin;
|
|
70
|
+
//# sourceMappingURL=prefab_normalize_skin_frames.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefab_normalize_skin_frames.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_normalize_skin_frames.js"],"names":[],"mappings":"AA6BA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qDAHW,MAAM,GACJ,qBAAqB,EAAE,CAOnC;;;;;;kBAzCa,MAAM;;;;;cAEN,MAAM;;;;eAEN,MAAM;;;;eACN,MAAM;;;;cACN,MAAM;;;;;gBACN,MAAM,EAAE;;qBA9BT,OAAO,aAAa,EAAE,MAAM;mBAC5B,OAAO,2CAA2C,EAAE,IAAI"}
|