@woosh/meep-engine 3.23.0 → 3.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/editor/entity_world_bounds.d.ts +9 -3
- package/editor/entity_world_bounds.d.ts.map +1 -1
- package/editor/entity_world_bounds.js +61 -4
- package/package.json +1 -1
- package/src/core/binary/allocator/OffsetAllocator.d.ts +40 -2
- package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
- package/src/core/binary/allocator/OffsetAllocator.js +124 -29
- package/src/core/collection/map/u32_index.d.ts +83 -0
- package/src/core/collection/map/u32_index.d.ts.map +1 -0
- package/src/core/collection/map/u32_index.js +247 -0
- package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.d.ts +2 -2
- package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.js +2 -2
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts +1 -2
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts.map +1 -1
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.js +4 -12
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +55 -0
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -0
- package/src/engine/ecs/gpu/GPUStateAuthority.js +72 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts +40 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts.map +1 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.js +79 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts +18 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.js +27 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.d.ts +23 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.js +39 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +15 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.js +38 -0
- package/src/engine/ecs/gpu/gpu_authority_has.d.ts +18 -0
- package/src/engine/ecs/gpu/gpu_authority_has.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_has.js +28 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts +24 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.js +49 -0
- package/src/engine/ecs/ik/IKProblem.d.ts +14 -0
- package/src/engine/ecs/ik/IKProblem.d.ts.map +1 -1
- package/src/engine/ecs/ik/IKProblem.js +16 -0
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +1 -1
- package/src/engine/ecs/ik/InverseKinematicsSystem.js +19 -0
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +2 -2
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +2 -2
- package/src/engine/ecs/ik/ik_bone_chain.d.ts +11 -2
- package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_bone_chain.js +47 -2
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.js +6 -0
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/speaker/VoiceSystem.js +6 -0
- package/src/engine/ecs/transform/T64WorldCache.d.ts +50 -0
- package/src/engine/ecs/transform/T64WorldCache.d.ts.map +1 -0
- package/src/engine/ecs/transform/T64WorldCache.js +139 -0
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts +31 -0
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_evaluate_world.js +126 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts +8 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +59 -30
- package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.js +4 -11
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts +14 -0
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts.map +1 -0
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.js +13 -0
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +2 -14
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +11 -21
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.d.ts +1 -0
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +7 -0
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts +5 -6
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.js +13 -11
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts +14 -0
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts.map +1 -0
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.js +21 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +1 -1
- package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.d.ts +1 -1
- package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +3 -3
- package/src/engine/graphics3/AnimationSystem.js +2 -2
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem.js +2 -4
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +34 -27
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +185 -85
- package/src/engine/graphics3/HighlightOutlineSystem.d.ts +4 -3
- package/src/engine/graphics3/HighlightOutlineSystem.d.ts.map +1 -1
- package/src/engine/graphics3/HighlightOutlineSystem.js +7 -9
- package/src/engine/graphics3/LightSystem.d.ts +7 -5
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +36 -22
- package/src/engine/graphics3/MeshSystem.d.ts +43 -39
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +324 -331
- package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -1
- package/src/engine/graphics3/PathDisplaySystem.js +2 -4
- package/src/engine/graphics3/PickingQuery.d.ts +15 -21
- package/src/engine/graphics3/PickingQuery.d.ts.map +1 -1
- package/src/engine/graphics3/PickingQuery.js +21 -25
- package/src/engine/graphics3/PickingSystem.d.ts +60 -31
- package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
- package/src/engine/graphics3/PickingSystem.js +416 -273
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +22 -12
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +309 -174
- package/src/engine/graphics3/TerrainSystem.d.ts +19 -11
- package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
- package/src/engine/graphics3/TerrainSystem.js +102 -53
- package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -1
- package/src/engine/graphics3/TooltipComponentSystem.js +2 -14
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem.js +2 -4
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts +4 -4
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
- package/src/engine/graphics3/animation/ClipListPlayer.js +2 -2
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +9 -11
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
- package/src/engine/graphics3/highlight/pack_highlight_table.js +11 -18
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +4 -3
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
- package/src/engine/graphics3/pose/query_entity_node_world_pose.js +75 -74
- package/src/engine/graphics3/prefab/Prefab.d.ts +130 -0
- package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/Prefab.js +162 -0
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts +72 -0
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/PrefabInstance.js +80 -0
- package/src/engine/graphics3/prefab/prefab_compile.d.ts +23 -0
- package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_compile.js +334 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +46 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts +70 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.js +210 -0
- package/src/engine/graphics3/prefab/prefab_place.d.ts +60 -0
- package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_place.js +130 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts +60 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.js +128 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts +40 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.js +116 -0
- package/src/engine/graphics3/preview/make_model_preview_scene.d.ts +16 -14
- package/src/engine/graphics3/preview/make_model_preview_scene.d.ts.map +1 -1
- package/src/engine/graphics3/preview/make_model_preview_scene.js +126 -154
- package/src/engine/graphics3/preview/make_model_thumbnail.js +1 -1
- package/src/engine/graphics3/register_instance_animation.d.ts +6 -6
- package/src/engine/graphics3/register_instance_animation.d.ts.map +1 -1
- package/src/engine/graphics3/register_instance_animation.js +4 -4
- package/src/engine/graphics3/shade_bundle_bounds.d.ts +2 -6
- package/src/engine/graphics3/shade_bundle_bounds.d.ts.map +1 -1
- package/src/engine/graphics3/shade_bundle_bounds.js +47 -55
- package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts +11 -18
- package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts.map +1 -1
- package/src/engine/graphics3/terrain/pack_terrain_row_table.js +48 -53
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +17 -2
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +284 -256
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +13 -15
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +12 -14
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts +7 -8
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothRig.js +7 -8
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +5 -4
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +11 -12
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +19 -23
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +201 -199
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +8 -0
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts +18 -34
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +58 -115
- package/src/engine/physics/cloth/playground/README.md +11 -11
- package/src/engine/physics/cloth/playground/garment_build.d.ts +0 -1
- package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/garment_build.js +64 -58
- package/src/engine/physics/cloth/playground/garment_main.js +59 -33
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/RENDERER_CONTRACT.md +85 -53
- package/src/shade/device/ShadeGPUCommandContext.d.ts +23 -0
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +36 -0
- package/src/shade/playground/add_random_meshes.d.ts +4 -4
- package/src/shade/playground/add_random_meshes.d.ts.map +1 -1
- package/src/shade/playground/add_random_meshes.js +20 -16
- package/src/shade/playground/avboit/main.d.ts +1 -0
- package/src/shade/playground/avboit/main.d.ts.map +1 -1
- package/src/shade/playground/avboit/main.js +916 -875
- package/src/shade/playground/basis_textures/main.d.ts.map +1 -1
- package/src/shade/playground/basis_textures/main.js +22 -8
- package/src/shade/playground/basis_textures/texture_inventory.d.ts +2 -2
- package/src/shade/playground/basis_textures/texture_inventory.d.ts.map +1 -1
- package/src/shade/playground/basis_textures/texture_inventory.js +6 -7
- package/src/shade/playground/ground_seam/main.d.ts.map +1 -1
- package/src/shade/playground/ground_seam/main.js +13 -4
- package/src/shade/playground/ground_seam/make_ground.d.ts +13 -4
- package/src/shade/playground/ground_seam/make_ground.d.ts.map +1 -1
- package/src/shade/playground/ground_seam/make_ground.js +21 -16
- package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
- package/src/shade/playground/particle_system/main.js +11 -10
- package/src/shade/playground/particle_system/particle_prototype.d.ts +15 -10
- package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_prototype.js +56 -15
- package/src/shade/playground/particle_system/particle_scene.d.ts +68 -28
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +149 -53
- package/src/shade/playground/readback_crossover/index.html +41 -0
- package/src/shade/playground/readback_crossover/main.d.ts +2 -0
- package/src/shade/playground/readback_crossover/main.d.ts.map +1 -0
- package/src/shade/playground/readback_crossover/main.js +372 -0
- package/src/shade/playground/skinned_blas_refit/README.md +11 -7
- package/src/shade/playground/skinned_blas_refit/add_floor.d.ts +13 -44
- package/src/shade/playground/skinned_blas_refit/add_floor.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/add_floor.js +19 -59
- package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/main.js +67 -58
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts +40 -54
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/place_character.js +47 -74
- package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/sweep_views.js +4 -3
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +11 -4
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +38 -9
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +9 -6
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +3 -3
- package/src/shade/playground/skinned_mesh_soup/README.md +6 -6
- package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/main.js +44 -102
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +5 -5
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +42 -33
- package/src/shade/playground/sponza_path_trace/main.d.ts +1 -0
- package/src/shade/playground/sponza_path_trace/main.d.ts.map +1 -1
- package/src/shade/playground/sponza_path_trace/main.js +393 -363
- package/src/shade/playground/ssr_reprojection/main.js +11 -9
- package/src/shade/playground/ssr_reprojection/scene.d.ts +15 -4
- package/src/shade/playground/ssr_reprojection/scene.d.ts.map +1 -1
- package/src/shade/playground/ssr_reprojection/scene.js +32 -11
- package/src/shade/playground/ssr_variance/main.js +1 -1
- package/src/shade/playground/ssr_variance/scene.d.ts +10 -4
- package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -1
- package/src/shade/playground/ssr_variance/scene.js +39 -15
- package/src/shade/playground/vgeo_viewer/main.js +6 -2
- package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +936 -922
- package/src/shade/renderer/GraphicsContext.d.ts +7 -0
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +11 -0
- package/src/shade/renderer/Renderer.d.ts +3 -2
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +3 -2
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +39 -47
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +319 -256
- package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts +26 -22
- package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts.map +1 -1
- package/src/shade/renderer/animation/ShadeAnimationChannel.js +28 -23
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +14 -6
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
- package/src/shade/renderer/animation/ShadeAnimationClip.js +20 -8
- package/src/shade/renderer/animation/Skin.d.ts +19 -19
- package/src/shade/renderer/animation/Skin.d.ts.map +1 -1
- package/src/shade/renderer/animation/Skin.js +15 -13
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +6 -5
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/pose_evaluate_local.js +9 -9
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +5 -59
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -1
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +8 -132
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +65 -62
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +148 -194
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +4 -7
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +2 -2
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +2 -2
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts +74 -0
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts.map +1 -0
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.js +240 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +14 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +64 -6
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts +190 -0
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.js +1323 -0
- package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts +10 -0
- package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUPageMetadata.js +12 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStagingRing.d.ts +96 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStagingRing.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts +15 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.js +34 -0
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +75 -7
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +518 -135
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts +19 -0
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.js +18 -0
- package/src/shade/renderer/buffer/table/WordViews.d.ts +39 -0
- package/src/shade/renderer/buffer/table/WordViews.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/WordViews.js +62 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts +27 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.js +117 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts +121 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.js +395 -0
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +70 -20
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +6 -5
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +3 -3
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +15 -11
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.d.ts +1 -1
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.js +4 -4
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts +1 -3
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.js +5 -4
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -4
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +8 -3
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +19 -14
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +9 -1
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts +3 -3
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.js +12 -5
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +1 -1
- package/src/shade/renderer/light/GPULightCollection.d.ts +29 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +444 -329
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +7 -1
- package/src/shade/renderer/light/LightCollection.d.ts +29 -1
- package/src/shade/renderer/light/LightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/LightCollection.js +50 -1
- package/src/shade/renderer/light/make_sunlight.js +2 -2
- package/src/shade/renderer/light/model/Light.d.ts +29 -2
- package/src/shade/renderer/light/model/Light.d.ts.map +1 -1
- package/src/shade/renderer/light/model/Light.js +30 -2
- package/src/shade/renderer/light/model/io/light_record_directional.d.ts +3 -1
- package/src/shade/renderer/light/model/io/light_record_directional.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_directional.js +8 -5
- package/src/shade/renderer/light/model/io/light_record_point.d.ts +3 -1
- package/src/shade/renderer/light/model/io/light_record_point.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_point.js +5 -2
- package/src/shade/renderer/light/model/io/light_record_spot.d.ts +4 -1
- package/src/shade/renderer/light/model/io/light_record_spot.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_spot.js +10 -6
- package/src/shade/renderer/light/place_light.d.ts +16 -0
- package/src/shade/renderer/light/place_light.d.ts.map +1 -0
- package/src/shade/renderer/light/place_light.js +36 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.d.ts +44 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.d.ts.map +1 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.js +154 -0
- package/src/shade/renderer/lightmap/GPULightMap.js +1 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +12 -14
- package/src/shade/renderer/loader/SceneBundle.d.ts +53 -28
- package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
- package/src/shade/renderer/loader/SceneBundle.js +111 -56
- package/src/shade/renderer/loader/SceneNode.d.ts +81 -0
- package/src/shade/renderer/loader/SceneNode.d.ts.map +1 -0
- package/src/shade/renderer/loader/SceneNode.js +114 -0
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts +3 -2
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/load_gltf.js +110 -142
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts +4 -4
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.js +2 -2
- package/src/shade/renderer/loader/usd/load_usd.d.ts +3 -2
- package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/load_usd.js +4 -5
- package/src/shade/renderer/loader/usd/usd_build_scene.d.ts +3 -3
- package/src/shade/renderer/loader/usd/usd_build_scene.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/usd_build_scene.js +47 -55
- package/src/shade/renderer/material/GPUMaterialManager.js +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +5 -4
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +8 -15
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts +15 -13
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +40 -21
- package/src/shade/renderer/particles/DESIGN.md +53 -50
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +31 -17
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +54 -91
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +12 -11
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +12 -11
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +13 -19
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +19 -25
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +34 -24
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +53 -40
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +2 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.js +5 -2
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +1 -1
- package/src/shade/renderer/scene/DynamicMesh.d.ts +13 -4
- package/src/shade/renderer/scene/DynamicMesh.d.ts.map +1 -1
- package/src/shade/renderer/scene/DynamicMesh.js +14 -4
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +38 -18
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +112 -60
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +55 -48
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +594 -928
- package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +5 -5
- package/src/shade/renderer/scene/NODE3D_STRUCT.js +5 -5
- package/src/shade/renderer/scene/Node3D.d.ts +27 -8
- package/src/shade/renderer/scene/Node3D.d.ts.map +1 -1
- package/src/shade/renderer/scene/Node3DDirtyList.d.ts +59 -0
- package/src/shade/renderer/scene/Node3DDirtyList.d.ts.map +1 -0
- package/src/shade/renderer/scene/Scene.d.ts +18 -60
- package/src/shade/renderer/scene/Scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/Scene.js +53 -146
- package/src/shade/renderer/scene/SkinnedMesh.d.ts +10 -93
- package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +1 -1
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts +24 -3
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts.map +1 -1
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.js +53 -13
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +5 -6
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +5 -6
- package/src/shade/renderer/scene/optimization/scene_optimize.d.ts +10 -2
- package/src/shade/renderer/scene/optimization/scene_optimize.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/scene_optimize.js +266 -230
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts +53 -0
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.js +144 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +227 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.js +1136 -0
- package/src/shade/renderer/scene/rows/place_primitive.d.ts +48 -0
- package/src/shade/renderer/scene/rows/place_primitive.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/place_primitive.js +98 -0
- package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts +10 -8
- package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/serialization/deserialize_scene.js +24 -27
- package/src/shade/renderer/scene/serialization/serialize_scene.d.ts +9 -2
- package/src/shade/renderer/scene/serialization/serialize_scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/serialization/serialize_scene.js +25 -4
- package/src/shade/renderer/scene/verify_gpu_tlas_build.js +2 -2
- package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +39 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +112 -64
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +7 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1541 -1352
- package/src/shade/renderer/shadow/map/PointLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts +29 -0
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.js +43 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts +13 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.js +12 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +49 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +194 -0
- package/src/shade/renderer/shadow/map/csm_debug_draw_preview.js +1 -1
- package/src/shade/renderer/shadow/map/shadowmap_update_score.js +1 -1
- package/src/shade/renderer/shadow/ray/RTXShadows.js +1 -1
- package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +3 -1
- package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +8 -8
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +4 -3
- package/src/engine/graphics3/instantiate_scene_bundle.js +0 -164
- package/src/engine/graphics3/shade_node_to_entity_composition.js +0 -88
- package/src/shade/renderer/animation/compute_skin_world_bounds.js +0 -146
- package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +0 -531
- package/src/shade/renderer/animation/pose/pose_evaluate_world.js +0 -76
- package/src/shade/renderer/animation/skin_bind_transform.js +0 -33
- package/src/shade/renderer/animation/skin_frame_defect.js +0 -132
- package/src/shade/renderer/animation/skin_joint_matrix.js +0 -46
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +0 -216
- package/src/shade/renderer/scene/InstanceBatch.js +0 -235
- package/src/shade/renderer/scene/Mesh.js +0 -168
- package/src/shade/renderer/scene/Node3D.js +0 -263
- package/src/shade/renderer/scene/SceneNodeBinding.js +0 -56
- package/src/shade/renderer/scene/SkinnedMesh.js +0 -170
- package/src/shade/renderer/scene/TransformAuthority.js +0 -33
|
@@ -1,40 +1,116 @@
|
|
|
1
1
|
import { assert } from "../../core/assert.js";
|
|
2
2
|
import { aabb3_array_combine } from "../../core/geom/3d/aabb/aabb3_array_combine.js";
|
|
3
|
-
import {
|
|
3
|
+
import { aabb3_matrix4_project } from "../../core/geom/3d/aabb/aabb3_matrix4_project.js";
|
|
4
4
|
import { Scene } from "../../shade/renderer/scene/Scene.js";
|
|
5
|
-
import { instantiate_scene_bundle } from "./instantiate_scene_bundle.js";
|
|
6
|
-
import {
|
|
7
|
-
register_instance_animation,
|
|
8
|
-
unregister_instance_animation
|
|
9
|
-
} from "./register_instance_animation.js";
|
|
10
5
|
import { System } from "../ecs/System.js";
|
|
11
6
|
import { Transform64 } from "../ecs/transform/Transform64.js";
|
|
12
|
-
import {
|
|
7
|
+
import { TRANSFORM64_EVENT_CHANGE } from "../ecs/transform/TRANSFORM64_EVENT_CHANGE.js";
|
|
8
|
+
import { TRANSFORM_ATTACHMENT_EVENT_CHANGE } from "../ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js";
|
|
13
9
|
import { ShadedGeometry } from "../graphics/ecs/mesh-v2/ShadedGeometry.js";
|
|
14
10
|
import { SGMesh } from "../graphics/ecs/mesh-v2/aggregate/SGMesh.js";
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
11
|
+
import { prefab_compile } from "./prefab/prefab_compile.js";
|
|
12
|
+
import { prefab_instance_destroy, prefab_instantiate } from "./prefab/prefab_instantiate.js";
|
|
13
|
+
import {
|
|
14
|
+
register_instance_animation,
|
|
15
|
+
unregister_instance_animation
|
|
16
|
+
} from "./register_instance_animation.js";
|
|
18
17
|
|
|
19
18
|
/**
|
|
20
|
-
*
|
|
19
|
+
* @typedef {import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
|
|
20
|
+
* @typedef {import("../../shade/renderer/loader/SceneBundle.js").SceneBundle} SceneBundle
|
|
21
|
+
* @typedef {import("./prefab/Prefab.js").Prefab} Prefab
|
|
22
|
+
* @typedef {import("./prefab/PrefabInstance.js").PrefabInstance} PrefabInstance
|
|
23
|
+
* @typedef {import("./register_instance_animation.js").InstanceAnimationRegistration} InstanceAnimationRegistration
|
|
24
|
+
* @typedef {import("./GraphicsEngine.js").GraphicsEngine} GraphicsEngine
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* What {@link MeshSystem.mesh_entities_of} answers for an entity with nothing in the scene.
|
|
21
29
|
*
|
|
22
|
-
*
|
|
23
|
-
|
|
30
|
+
* @type {Int32Array}
|
|
31
|
+
*/
|
|
32
|
+
const NO_ENTITIES = new Int32Array(0);
|
|
33
|
+
|
|
34
|
+
const SCRATCH_BOUNDS = new Float32Array(6);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* What one entity has: its model, once loaded, as entities; the ids the GPU issued for the model's
|
|
38
|
+
* skins; and what is listening on its behalf.
|
|
39
|
+
*/
|
|
40
|
+
class Entry {
|
|
41
|
+
/**
|
|
42
|
+
* @type {number}
|
|
43
|
+
*/
|
|
44
|
+
entity = -1;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @type {SGMesh}
|
|
48
|
+
*/
|
|
49
|
+
model = null;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @type {Transform64}
|
|
53
|
+
*/
|
|
54
|
+
transform = null;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The model as entities, or null until it has loaded.
|
|
58
|
+
*
|
|
59
|
+
* @type {PrefabInstance|null}
|
|
60
|
+
*/
|
|
61
|
+
instance = null;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* What the GPU gave back for the instance's skins, or null while there is nothing registered —
|
|
65
|
+
* no model yet, no device yet, or a renderer restart that has not been drained.
|
|
66
|
+
*
|
|
67
|
+
* @type {InstanceAnimationRegistration|null}
|
|
68
|
+
*/
|
|
69
|
+
animation = null;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The GPU context the instance's entities hold their rows in, or null while they hold none.
|
|
73
|
+
*
|
|
74
|
+
* @type {GPUSceneContext|null}
|
|
75
|
+
*/
|
|
76
|
+
context = null;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Fires when the placing entity's world transform moves.
|
|
80
|
+
*
|
|
81
|
+
* @type {function(): void}
|
|
82
|
+
*/
|
|
83
|
+
on_moved = null;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* One per entity of the instance, firing when that entity's offset from its parent moves —
|
|
87
|
+
* a joint an IK solver, a ragdoll or a cloth wrote.
|
|
88
|
+
*
|
|
89
|
+
* @type {Map<number, function(): void>}
|
|
90
|
+
*/
|
|
91
|
+
on_offset_moved = new Map();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Puts models into the scene as entities, and keeps their rows where the entities say.
|
|
24
96
|
*
|
|
25
|
-
*
|
|
26
|
-
* {@link
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
97
|
+
* **A model is a prefab, and a placement is entities.** A loaded bundle is compiled once per url
|
|
98
|
+
* ({@link prefab_compile}) and spawned once per entity that wears it
|
|
99
|
+
* ({@link prefab_instantiate}): every node of the file becomes an entity attached to its parent's,
|
|
100
|
+
* named, drawing where it draws, with the placing entity as the root. What used to be a private
|
|
101
|
+
* copy of a node tree per placement is the dataset's own hierarchy, addressable by every system —
|
|
102
|
+
* IK finds a foot by name, cloth seeds from joints, gameplay asks where a socket is — and the
|
|
103
|
+
* renderer's tables are indexed by those entities, at `entity + 1`.
|
|
30
104
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
105
|
+
* **It owns the scene and tells the facade to draw it**, rather than the facade handing a graph out
|
|
106
|
+
* for anyone to write into.
|
|
33
107
|
*
|
|
34
|
-
* **
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
108
|
+
* **Rows need a device, and registration does too.** A model loads whenever it loads, and there
|
|
109
|
+
* may be no renderer yet; {@link update} attaches every instance's entities to the scene's GPU
|
|
110
|
+
* context when one arrives, registers its skins with the animation manager, and does both again
|
|
111
|
+
* after a renderer restart. Driving the clips is not this system's business — that is the
|
|
112
|
+
* animation systems' — but a clip nothing has registered cannot be driven by anyone, which is why
|
|
113
|
+
* the instance is handed out ({@link instance_of}) rather than kept.
|
|
38
114
|
*/
|
|
39
115
|
export class MeshSystem extends System {
|
|
40
116
|
/**
|
|
@@ -43,53 +119,43 @@ export class MeshSystem extends System {
|
|
|
43
119
|
#graphics;
|
|
44
120
|
|
|
45
121
|
/**
|
|
46
|
-
* The scene this system writes into and the facade draws.
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* putting content into the same scene for either to be visible.
|
|
122
|
+
* The scene this system writes into and the facade draws. Received rather than created: lights
|
|
123
|
+
* come from a system of their own, and both have to be putting content into the same scene for
|
|
124
|
+
* either to be visible.
|
|
50
125
|
*
|
|
51
126
|
* @type {Scene}
|
|
52
127
|
*/
|
|
53
128
|
#scene;
|
|
54
129
|
|
|
55
130
|
/**
|
|
56
|
-
* Loaded
|
|
57
|
-
* once per placement would be the dominant cost of opening one
|
|
131
|
+
* Loaded and compiled models, by url. A level places the same model many times over, and
|
|
132
|
+
* loading it once per placement would be the dominant cost of opening one; compiling it once
|
|
133
|
+
* per placement would be the next.
|
|
58
134
|
*
|
|
59
|
-
* @type {Map<string, Promise<
|
|
135
|
+
* @type {Map<string, Promise<Prefab>>}
|
|
60
136
|
*/
|
|
61
|
-
#
|
|
137
|
+
#models = new Map();
|
|
62
138
|
|
|
63
139
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* `instance` and `animation` are null until the model has loaded and until the GPU has been
|
|
67
|
-
* told about it respectively — two different waits, which is why they are two fields.
|
|
68
|
-
*
|
|
69
|
-
* @type {Map<number, {nodes: Node3D[], bindings: SignalBinding[], instance: SceneBundleInstance|null, animation: InstanceAnimationRegistration|null}>}
|
|
140
|
+
* @type {Map<number, Entry>}
|
|
70
141
|
*/
|
|
71
142
|
#entries = new Map();
|
|
72
143
|
|
|
73
144
|
/**
|
|
74
|
-
* Shade's GPU state for {@link scene}, as of the last {@link update}.
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* everything placed has to be registered again. **Which manager a particular registration
|
|
78
|
-
* belongs to is the registration's own to say** — it carries the context that issued it — so
|
|
79
|
-
* this is not consulted when ids are handed back.
|
|
145
|
+
* Shade's GPU state for {@link scene}, as of the last {@link update}. Held to answer one
|
|
146
|
+
* question: has the renderer been replaced since the last frame, so that everything placed has
|
|
147
|
+
* to be attached and registered again.
|
|
80
148
|
*
|
|
81
149
|
* @type {GPUSceneContext|null}
|
|
82
150
|
*/
|
|
83
151
|
#context = null;
|
|
84
152
|
|
|
85
153
|
/**
|
|
86
|
-
* Entries whose instance is not
|
|
87
|
-
* loaded, or because a restart invalidated what it had.
|
|
88
|
-
*
|
|
89
|
-
* A queue rather than a scan over every entity, because this is per-frame work in a level that
|
|
90
|
-
* places hundreds of models and the answer is almost always "nothing to do".
|
|
154
|
+
* Entries whose instance is not attached to {@link #context} — either because it has just
|
|
155
|
+
* loaded, or because a restart invalidated what it had. A queue rather than a scan over every
|
|
156
|
+
* entity, because this is per-frame work and the answer is almost always "nothing to do".
|
|
91
157
|
*
|
|
92
|
-
* @type {
|
|
158
|
+
* @type {Entry[]}
|
|
93
159
|
*/
|
|
94
160
|
#unregistered = [];
|
|
95
161
|
|
|
@@ -97,16 +163,12 @@ export class MeshSystem extends System {
|
|
|
97
163
|
* Entities whose `SGMesh` carried no url when it was linked.
|
|
98
164
|
*
|
|
99
165
|
* `SGMesh.url` is an accessor with no change signal behind it, and the game assigns it late as a
|
|
100
|
-
* matter of
|
|
101
|
-
*
|
|
102
|
-
* a
|
|
103
|
-
*
|
|
104
|
-
* the only way to notice one arriving is to look again.
|
|
166
|
+
* matter of course: `GeneratedArmySystem` puts the component on an army entity and fills the
|
|
167
|
+
* url in from a promise, once the army it generated has picked the leader whose model the army
|
|
168
|
+
* wears. So a url that is missing at link time is the normal path to a model rather than an
|
|
169
|
+
* edge case, and the only way to notice one arriving is to look again.
|
|
105
170
|
*
|
|
106
|
-
*
|
|
107
|
-
* yet, and an entry leaves it for good the moment one is asked for.
|
|
108
|
-
*
|
|
109
|
-
* @type {{entity: number, model: SGMesh, transform: Transform}[]}
|
|
171
|
+
* @type {Entry[]}
|
|
110
172
|
*/
|
|
111
173
|
#awaiting_url = [];
|
|
112
174
|
|
|
@@ -146,82 +208,15 @@ export class MeshSystem extends System {
|
|
|
146
208
|
}
|
|
147
209
|
|
|
148
210
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
* The nodes are what the scene database keys on, so anything that has to say something about a
|
|
152
|
-
* particular entity's meshes — which rows they occupy, which of them the visibility buffer will
|
|
153
|
-
* name — starts here. A grouping node is skipped, because it has no geometry and therefore no
|
|
154
|
-
* row of its own.
|
|
155
|
-
*
|
|
156
|
-
* @param {number} entity
|
|
157
|
-
* @param {function(SGMesh): void} visitor
|
|
158
|
-
* @returns {boolean} `false` when the entity has nothing in the scene — never seen, or still
|
|
159
|
-
* loading, and neither is an error
|
|
160
|
-
*/
|
|
161
|
-
traverse_meshes(entity, visitor) {
|
|
162
|
-
const entry = this.#entries.get(entity);
|
|
163
|
-
|
|
164
|
-
if (entry === undefined) {
|
|
165
|
-
return false;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
for (let i = 0; i < entry.nodes.length; i++) {
|
|
169
|
-
entry.nodes[i].traverse(node => {
|
|
170
|
-
if (node.isMesh === true) {
|
|
171
|
-
visitor(node);
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
this.#traverse_expanded(entry, visitor);
|
|
177
|
-
|
|
178
|
-
return true;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* The rows of a model that became entities.
|
|
183
|
-
*
|
|
184
|
-
* Its primitives are components on descendants rather than nodes this system holds, and each one
|
|
185
|
-
* carries the row `ShadedGeometrySystem` put it in — so the walk is over the composition and the
|
|
186
|
-
* answer is the same kind of node the instance path yields. A primitive whose system has not
|
|
187
|
-
* linked it yet has no row and contributes nothing, which is the same "still loading" silence
|
|
188
|
-
* every reader here already tolerates.
|
|
189
|
-
*
|
|
190
|
-
* @param {object} entry
|
|
191
|
-
* @param {function(Mesh): void} visitor
|
|
192
|
-
*/
|
|
193
|
-
#traverse_expanded(entry, visitor) {
|
|
194
|
-
const composition = entry.composition;
|
|
195
|
-
|
|
196
|
-
if (composition === null) {
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
composition.traverse(node => {
|
|
201
|
-
const geometry = node.entity.getComponent(ShadedGeometry);
|
|
202
|
-
|
|
203
|
-
if (geometry === null || geometry === undefined) {
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
if (geometry.node === null) {
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
visitor(geometry.node);
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* The private copy of the model an entity is showing — its clips among other things, which is
|
|
217
|
-
* where their names and their durations come from.
|
|
211
|
+
* The model an entity is showing, as entities: its skins and clips addressed to them, and its
|
|
212
|
+
* nodes by name.
|
|
218
213
|
*
|
|
219
214
|
* Handed out rather than copied because an animation driver has to know *which* instance it is
|
|
220
215
|
* bound to: a model swap builds a new one, and a driver still holding the old one would be
|
|
221
|
-
* driving
|
|
216
|
+
* driving entities that have gone. The object's identity is the only signal that says so.
|
|
222
217
|
*
|
|
223
218
|
* @param {number} entity
|
|
224
|
-
* @returns {
|
|
219
|
+
* @returns {PrefabInstance|null} `null` for an entity this system has never seen, or one
|
|
225
220
|
* whose model has not finished loading
|
|
226
221
|
*/
|
|
227
222
|
instance_of(entity) {
|
|
@@ -235,7 +230,7 @@ export class MeshSystem extends System {
|
|
|
235
230
|
}
|
|
236
231
|
|
|
237
232
|
/**
|
|
238
|
-
* What the GPU's animation manager gave back for that instance — the skin
|
|
233
|
+
* What the GPU's animation manager gave back for that instance — the skin ids, in the
|
|
239
234
|
* instance's own order.
|
|
240
235
|
*
|
|
241
236
|
* Same reasoning as {@link instance_of} and a stronger version of it: these ids belong to one
|
|
@@ -257,11 +252,31 @@ export class MeshSystem extends System {
|
|
|
257
252
|
}
|
|
258
253
|
|
|
259
254
|
/**
|
|
260
|
-
*
|
|
255
|
+
* The entities of an entity's model that draw — one per primitive of the file. Each holds the
|
|
256
|
+
* `meshes` row `entity + 1`, which is what the visibility buffer writes for every pixel it
|
|
257
|
+
* covers; anything that has to say something about a particular model's meshes starts here.
|
|
261
258
|
*
|
|
262
|
-
*
|
|
263
|
-
*
|
|
264
|
-
*
|
|
259
|
+
* @param {number} entity
|
|
260
|
+
* @returns {Int32Array} empty for an entity with nothing in the scene — never seen, or still
|
|
261
|
+
* loading, and neither is an error. Not to be kept: a model swap replaces it
|
|
262
|
+
*/
|
|
263
|
+
mesh_entities_of(entity) {
|
|
264
|
+
const entry = this.#entries.get(entity);
|
|
265
|
+
|
|
266
|
+
if (entry === undefined || entry.instance === null) {
|
|
267
|
+
return NO_ENTITIES;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return entry.instance.mesh_entities;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Where an entity's model is, in world space: the union of its primitives' geometry bounds
|
|
275
|
+
* under their own entities' world transforms — which the ECS composes, so this answers with no
|
|
276
|
+
* device and with no frame of latency, from what the simulation knows. The box the renderer
|
|
277
|
+
* culls by is derived on the GPU from the same and is not consulted.
|
|
278
|
+
*
|
|
279
|
+
* A skinned primitive answers at its rest pose, under the frame its skin deforms in.
|
|
265
280
|
*
|
|
266
281
|
* @param {ArrayLike<number>|number[]|Float32Array} target aabb3, order `x0,y0,z0,x1,y1,z1`
|
|
267
282
|
* @param {number} entity
|
|
@@ -271,45 +286,57 @@ export class MeshSystem extends System {
|
|
|
271
286
|
compute_world_bounds(target, entity) {
|
|
272
287
|
const entry = this.#entries.get(entity);
|
|
273
288
|
|
|
274
|
-
if (entry === undefined) {
|
|
289
|
+
if (entry === undefined || entry.instance === null) {
|
|
275
290
|
return false;
|
|
276
291
|
}
|
|
277
292
|
|
|
293
|
+
const dataset = this.entityManager.dataset;
|
|
294
|
+
const primitives = entry.instance.mesh_entities;
|
|
295
|
+
|
|
278
296
|
let found = false;
|
|
279
297
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
298
|
+
for (let i = 0; i < primitives.length; i++) {
|
|
299
|
+
const primitive = primitives[i];
|
|
300
|
+
|
|
301
|
+
if (!dataset.entityExists(primitive)) {
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const geometry = dataset.getComponent(primitive, ShadedGeometry);
|
|
306
|
+
const world = dataset.getComponent(primitive, Transform64);
|
|
307
|
+
|
|
308
|
+
if (geometry === undefined || world === undefined || geometry.geometry === null) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// a Transform64's matrix starts at element 0, so it is its own mat4 argument
|
|
313
|
+
aabb3_matrix4_project(SCRATCH_BOUNDS, geometry.geometry.bounding_box, world);
|
|
285
314
|
|
|
286
315
|
// combining the first box with itself is how it lands in `target` — one operation
|
|
287
316
|
// for both cases, rather than a copy that only ever runs once
|
|
288
|
-
aabb3_array_combine(target, 0, found ? target :
|
|
317
|
+
aabb3_array_combine(target, 0, found ? target : SCRATCH_BOUNDS, 0, SCRATCH_BOUNDS, 0);
|
|
289
318
|
|
|
290
319
|
found = true;
|
|
291
|
-
};
|
|
292
|
-
|
|
293
|
-
for (let i = 0; i < entry.nodes.length; i++) {
|
|
294
|
-
entry.nodes[i].traverse(node => {
|
|
295
|
-
if (node.isMesh !== true) {
|
|
296
|
-
// a grouping node carries no geometry, so it has no bounds of its own
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
combine(node);
|
|
301
|
-
});
|
|
302
320
|
}
|
|
303
321
|
|
|
304
|
-
this.#traverse_expanded(entry, combine);
|
|
305
|
-
|
|
306
322
|
return found;
|
|
307
323
|
}
|
|
308
324
|
|
|
309
325
|
async startup(entityManager) {
|
|
310
326
|
this.entityManager = entityManager;
|
|
311
327
|
|
|
312
|
-
this
|
|
328
|
+
// the scene's rows are this dataset's entities; the first system to place one says so
|
|
329
|
+
const dataset = entityManager.dataset;
|
|
330
|
+
const scene = this.#scene;
|
|
331
|
+
|
|
332
|
+
assert.ok(
|
|
333
|
+
scene.dataset === null || scene.dataset === undefined || scene.dataset === dataset,
|
|
334
|
+
'the scene is bound to another dataset'
|
|
335
|
+
);
|
|
336
|
+
|
|
337
|
+
scene.dataset = dataset;
|
|
338
|
+
|
|
339
|
+
this.#graphics.set_scene(scene);
|
|
313
340
|
}
|
|
314
341
|
|
|
315
342
|
async shutdown(entityManager) {
|
|
@@ -317,24 +344,24 @@ export class MeshSystem extends System {
|
|
|
317
344
|
this.#drop(entity);
|
|
318
345
|
}
|
|
319
346
|
|
|
320
|
-
this.#
|
|
347
|
+
this.#models.clear();
|
|
321
348
|
|
|
322
349
|
this.#context = null;
|
|
323
350
|
this.#unregistered.length = 0;
|
|
324
351
|
}
|
|
325
352
|
|
|
326
353
|
/**
|
|
327
|
-
* Tell the GPU about the models that have arrived since the last frame
|
|
354
|
+
* Tell the GPU about the models that have arrived since the last frame: their entities take
|
|
355
|
+
* their rows, and their skins reach `GPUAnimationManager`.
|
|
328
356
|
*
|
|
329
|
-
*
|
|
330
|
-
*
|
|
331
|
-
*
|
|
332
|
-
*
|
|
333
|
-
*
|
|
334
|
-
* that drive deformation are built when every joint has a row.
|
|
357
|
+
* The manager hangs off the scene's GPU context, which exists only while there is a device, so
|
|
358
|
+
* neither can happen where instances are built (a model loads whenever it loads, including
|
|
359
|
+
* before the renderer has started). Registration is documented eventually-consistent at both
|
|
360
|
+
* entry points, so a frame of latency here costs nothing: the ids are live immediately and the
|
|
361
|
+
* chains that drive deformation are built when every joint has its row.
|
|
335
362
|
*
|
|
336
|
-
* A restart is the same event seen from here: the context object changes, every id
|
|
337
|
-
* issued is void, and everything currently placed queues up again.
|
|
363
|
+
* A restart is the same event seen from here: the context object changes, every id and every
|
|
364
|
+
* row the old one issued is void, and everything currently placed queues up again.
|
|
338
365
|
*
|
|
339
366
|
* @param {number} time_delta_seconds
|
|
340
367
|
*/
|
|
@@ -363,23 +390,13 @@ export class MeshSystem extends System {
|
|
|
363
390
|
**A throw in here does not cost one model, it costs the session.** The list is cleared after
|
|
364
391
|
the loop, so a registration that throws partway leaves the entries before it *already
|
|
365
392
|
registered* and *still queued*: the next update registers them a second time, `bind` finds
|
|
366
|
-
the
|
|
367
|
-
long as the game runs.
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
Seen for real: a second skinned model arriving in one frame used to overrun the meshlet
|
|
372
|
-
buffers while a clone was queued (fixed in `GPUMeshletManager`), and the cascade above is
|
|
373
|
-
what turned that one throw into a dead animation layer. Registering one entry at a time and
|
|
374
|
-
taking it off the list as it succeeds is the shape of the fix; what to do with an entry that
|
|
375
|
-
*cannot* be registered is the open question, which is why it is written down here rather
|
|
376
|
-
than fixed. The throw that exposed it is fixed (`ac5e430e3`); the amplifier is not, and any
|
|
377
|
-
future failure in registration reproduces the same cascade.
|
|
393
|
+
the entity already bound to another skin, and that assertion then fires once a frame for as
|
|
394
|
+
long as the game runs. Registering one entry at a time and taking it off the list as it
|
|
395
|
+
succeeds is the shape of the fix; what to do with an entry that *cannot* be registered is
|
|
396
|
+
the open question, which is why it is written down here rather than fixed.
|
|
378
397
|
*/
|
|
379
398
|
for (let i = 0; i < waiting.length; i++) {
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
entry.animation = register_instance_animation(context, entry.instance);
|
|
399
|
+
this.#register(waiting[i], context);
|
|
383
400
|
}
|
|
384
401
|
|
|
385
402
|
waiting.length = 0;
|
|
@@ -395,15 +412,15 @@ export class MeshSystem extends System {
|
|
|
395
412
|
const waiting = this.#awaiting_url;
|
|
396
413
|
|
|
397
414
|
for (let i = waiting.length - 1; i >= 0; i--) {
|
|
398
|
-
const
|
|
415
|
+
const entry = waiting[i];
|
|
399
416
|
|
|
400
|
-
if (
|
|
417
|
+
if (entry.model.url === null) {
|
|
401
418
|
continue;
|
|
402
419
|
}
|
|
403
420
|
|
|
404
421
|
waiting.splice(i, 1);
|
|
405
422
|
|
|
406
|
-
this.#attach(
|
|
423
|
+
this.#attach(entry, entry.model.url);
|
|
407
424
|
}
|
|
408
425
|
}
|
|
409
426
|
|
|
@@ -425,41 +442,69 @@ export class MeshSystem extends System {
|
|
|
425
442
|
}
|
|
426
443
|
|
|
427
444
|
entry.animation = null;
|
|
445
|
+
entry.context = null;
|
|
428
446
|
|
|
429
447
|
waiting.push(entry);
|
|
430
448
|
}
|
|
431
449
|
}
|
|
432
450
|
|
|
451
|
+
/**
|
|
452
|
+
* Give an instance's entities their rows in a context, and its skins to the animation manager.
|
|
453
|
+
*
|
|
454
|
+
* Every entity of the model takes a `transforms` row — a joint composes on the GPU, a grouping
|
|
455
|
+
* node is what its children compose under — and the placing entity takes one too, so the whole
|
|
456
|
+
* hierarchy composes from it. The primitives' `meshes` rows are `ShadedGeometrySystem`'s.
|
|
457
|
+
*
|
|
458
|
+
* @param {Entry} entry
|
|
459
|
+
* @param {GPUSceneContext} context
|
|
460
|
+
*/
|
|
461
|
+
#register(entry, context) {
|
|
462
|
+
const rows = context.rows;
|
|
463
|
+
const entities = entry.instance.entities;
|
|
464
|
+
|
|
465
|
+
for (let i = 0; i < entities.length; i++) {
|
|
466
|
+
rows.acquire(entities[i]);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
entry.animation = register_instance_animation(context, entry.instance);
|
|
470
|
+
entry.context = context;
|
|
471
|
+
}
|
|
472
|
+
|
|
433
473
|
/**
|
|
434
474
|
* @param {SGMesh} model
|
|
435
475
|
* @param {Transform64} transform
|
|
436
476
|
* @param {number} entity
|
|
437
477
|
*/
|
|
438
478
|
link(model, transform, entity) {
|
|
439
|
-
const entry =
|
|
479
|
+
const entry = new Entry();
|
|
440
480
|
|
|
441
|
-
|
|
481
|
+
entry.entity = entity;
|
|
482
|
+
entry.model = model;
|
|
483
|
+
entry.transform = transform;
|
|
442
484
|
|
|
443
|
-
|
|
444
|
-
// not changed costs nothing, which is the same bargain the scene database makes downstream.
|
|
445
|
-
// A Transform64 has no signals of its own, so the announcement comes from the dataset: the
|
|
446
|
-
// writer sends TRANSFORM64_EVENT_CHANGE and this wakes on it. Coarser than the three
|
|
447
|
-
// sub-object signals it replaces - a scale write wakes a placement that only reads the whole
|
|
448
|
-
// transform anyway - and #place already skips when nothing moved.
|
|
449
|
-
const on_changed = () => this.#place(entity, transform);
|
|
485
|
+
this.#entries.set(entity, entry);
|
|
450
486
|
|
|
451
|
-
|
|
487
|
+
// The placing entity's own row is marked when its transform moves, not on a poll: an
|
|
488
|
+
// entity that has not moved costs nothing, which is the same bargain the scene database
|
|
489
|
+
// makes downstream. A Transform64 has no signals of its own, so the announcement comes from
|
|
490
|
+
// the dataset. The entities under it follow through the attachment system and need no
|
|
491
|
+
// marking of their own for a move of the root — the GPU composes them.
|
|
492
|
+
entry.on_moved = () => {
|
|
493
|
+
if (entry.context !== null) {
|
|
494
|
+
entry.context.rows.mark_world(entity);
|
|
495
|
+
}
|
|
496
|
+
};
|
|
452
497
|
|
|
453
|
-
this.entityManager.dataset.addEntityEventListener(entity, TRANSFORM64_EVENT_CHANGE,
|
|
498
|
+
this.entityManager.dataset.addEntityEventListener(entity, TRANSFORM64_EVENT_CHANGE, entry.on_moved);
|
|
454
499
|
|
|
455
500
|
if (model.url === null) {
|
|
456
501
|
// nothing to show yet; {@link update} watches for the url arriving
|
|
457
|
-
this.#awaiting_url.push(
|
|
502
|
+
this.#awaiting_url.push(entry);
|
|
458
503
|
|
|
459
504
|
return;
|
|
460
505
|
}
|
|
461
506
|
|
|
462
|
-
this.#attach(
|
|
507
|
+
this.#attach(entry, model.url);
|
|
463
508
|
}
|
|
464
509
|
|
|
465
510
|
/**
|
|
@@ -472,144 +517,75 @@ export class MeshSystem extends System {
|
|
|
472
517
|
}
|
|
473
518
|
|
|
474
519
|
/**
|
|
475
|
-
*
|
|
520
|
+
* The prefab for a url, loading and compiling it on first mention.
|
|
476
521
|
*
|
|
477
|
-
* @param {number} entity
|
|
478
522
|
* @param {string} url
|
|
479
|
-
* @
|
|
523
|
+
* @returns {Promise<Prefab>}
|
|
480
524
|
*/
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
Which entry this load is for, decided before the wait rather than after it. A load is in
|
|
484
|
-
flight for as long as a fetch and a decode take, and the entity can leave and come back
|
|
485
|
-
inside that window — so asking `#entries` afterwards answers "the entry this entity has
|
|
486
|
-
now", which may be a different one. Attaching to that leaves the scene holding a second
|
|
487
|
-
model nothing owns, and its skins registered with the GPU under a record that has already
|
|
488
|
-
been overwritten.
|
|
489
|
-
*/
|
|
490
|
-
const started_for = this.#entries.get(entity);
|
|
491
|
-
|
|
492
|
-
let bundle = this.#bundles.get(url);
|
|
493
|
-
|
|
494
|
-
if (bundle === undefined) {
|
|
495
|
-
bundle = this.#load(url);
|
|
496
|
-
|
|
497
|
-
this.#bundles.set(url, bundle);
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
const loaded = await bundle;
|
|
525
|
+
#model(url) {
|
|
526
|
+
let prefab = this.#models.get(url);
|
|
501
527
|
|
|
502
|
-
|
|
528
|
+
if (prefab === undefined) {
|
|
529
|
+
prefab = this.#load(url).then(bundle => prefab_compile(bundle));
|
|
503
530
|
|
|
504
|
-
|
|
505
|
-
// the entity left while its model was in flight, or left and came back as another
|
|
506
|
-
// entry — both ordinary at level-load rates
|
|
507
|
-
return;
|
|
531
|
+
this.#models.set(url, prefab);
|
|
508
532
|
}
|
|
509
533
|
|
|
510
|
-
|
|
511
|
-
this.#expand(entity, loaded, transform);
|
|
512
|
-
|
|
513
|
-
return;
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
const instance = instantiate_scene_bundle(loaded);
|
|
517
|
-
|
|
518
|
-
entry.instance = instance;
|
|
519
|
-
|
|
520
|
-
for (const node of instance.roots) {
|
|
521
|
-
entry.nodes.push(node);
|
|
522
|
-
|
|
523
|
-
this.#scene.add(node);
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
this.#place(entity, transform);
|
|
527
|
-
|
|
528
|
-
// The GPU hears about it on the next update rather than here: a model finishes loading
|
|
529
|
-
// whenever it finishes, and there may be no device to tell.
|
|
530
|
-
this.#unregistered.push(entry);
|
|
534
|
+
return prefab;
|
|
531
535
|
}
|
|
532
536
|
|
|
533
537
|
/**
|
|
534
|
-
*
|
|
538
|
+
* Load and compile the model if it has not been seen, then spawn it under the entity.
|
|
535
539
|
*
|
|
536
|
-
*
|
|
537
|
-
*
|
|
538
|
-
* `ShadedGeometry` where they draw — and `ShadedGeometrySystem` gives each of those a row.
|
|
539
|
-
* Nothing here touches the scene, and no copy of the model is made: the entities name the
|
|
540
|
-
* bundle's own geometry and material, so a model placed two hundred times is one of each.
|
|
541
|
-
*
|
|
542
|
-
* **Only a model that neither deforms nor animates comes this way.** A skinned one deforms
|
|
543
|
-
* against a skeleton the renderer owns and the GPU poses; an animated one has clips that drive
|
|
544
|
-
* the nodes of an instance, and `GPUAnimationManager` addresses those nodes rather than
|
|
545
|
-
* entities. Making joints entities, or moving playback onto entity transforms, are both designs
|
|
546
|
-
* outside this program (D47) — so anything with a skin or a clip keeps the instance path above,
|
|
547
|
-
* exactly as Phase 4 built it.
|
|
548
|
-
*
|
|
549
|
-
* @param {number} entity
|
|
550
|
-
* @param {SceneBundle} bundle
|
|
551
|
-
* @param {Transform64} transform
|
|
540
|
+
* @param {Entry} entry
|
|
541
|
+
* @param {string} url
|
|
552
542
|
*/
|
|
553
|
-
#
|
|
554
|
-
const
|
|
555
|
-
|
|
556
|
-
const composition = shade_bundle_to_entity_composition(bundle);
|
|
543
|
+
async #attach(entry, url) {
|
|
544
|
+
const entity = entry.entity;
|
|
557
545
|
|
|
558
|
-
|
|
546
|
+
const prefab = await this.#model(url);
|
|
559
547
|
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
548
|
+
/*
|
|
549
|
+
Which entry this load is for was decided before the wait rather than after it. A load is in
|
|
550
|
+
flight for as long as a fetch and a decode take, and the entity can leave and come back
|
|
551
|
+
inside that window — so asking `#entries` afterwards answers "the entry this entity has
|
|
552
|
+
now", which may be a different one. Spawning for that one would leave a model in the scene
|
|
553
|
+
nothing owns.
|
|
554
|
+
*/
|
|
555
|
+
if (this.#entries.get(entity) !== entry) {
|
|
556
|
+
// the entity left while its model was in flight, or left and came back as another
|
|
557
|
+
// entry — both ordinary at level-load rates
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
572
560
|
|
|
573
|
-
|
|
561
|
+
const dataset = this.entityManager.dataset;
|
|
574
562
|
|
|
575
|
-
|
|
576
|
-
follow();
|
|
563
|
+
const instance = prefab_instantiate(prefab, dataset, entity);
|
|
577
564
|
|
|
578
|
-
|
|
579
|
-
// its own, so the follow rides the dataset announcement like every other consumer
|
|
580
|
-
const ecd = this.entityManager.dataset;
|
|
565
|
+
entry.instance = instance;
|
|
581
566
|
|
|
582
|
-
|
|
567
|
+
// A joint's offset moving — an IK solver, a ragdoll, a cloth writing it — is that joint's
|
|
568
|
+
// row. The world transforms the attachment system composes below it are not: the GPU
|
|
569
|
+
// composes those itself, from the offsets.
|
|
570
|
+
const entities = instance.entities;
|
|
583
571
|
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
);
|
|
572
|
+
for (let i = 1; i < entities.length; i++) {
|
|
573
|
+
const member = entities[i];
|
|
587
574
|
|
|
588
|
-
|
|
589
|
-
|
|
575
|
+
const on_offset_moved = () => {
|
|
576
|
+
if (entry.context !== null) {
|
|
577
|
+
entry.context.rows.mark_local(member);
|
|
578
|
+
}
|
|
579
|
+
};
|
|
590
580
|
|
|
591
|
-
|
|
592
|
-
* @param {number} entity
|
|
593
|
-
* @param {Transform64} transform
|
|
594
|
-
*/
|
|
595
|
-
#place(entity, transform) {
|
|
596
|
-
const entry = this.#entries.get(entity);
|
|
581
|
+
entry.on_offset_moved.set(member, on_offset_moved);
|
|
597
582
|
|
|
598
|
-
|
|
599
|
-
return;
|
|
583
|
+
dataset.addEntityEventListener(member, TRANSFORM_ATTACHMENT_EVENT_CHANGE, on_offset_moved);
|
|
600
584
|
}
|
|
601
585
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
const node = nodes[i];
|
|
606
|
-
|
|
607
|
-
node.transform_local.copy(transform);
|
|
608
|
-
|
|
609
|
-
// recomputes transform_global down the subtree, and bumps the version the scene
|
|
610
|
-
// database reads to decide what to upload
|
|
611
|
-
node.updateMatrices();
|
|
612
|
-
}
|
|
586
|
+
// The GPU hears about it on the next update rather than here: a model finishes loading
|
|
587
|
+
// whenever it finishes, and there may be no device to tell.
|
|
588
|
+
this.#unregistered.push(entry);
|
|
613
589
|
}
|
|
614
590
|
|
|
615
591
|
/**
|
|
@@ -622,21 +598,12 @@ export class MeshSystem extends System {
|
|
|
622
598
|
return;
|
|
623
599
|
}
|
|
624
600
|
|
|
625
|
-
|
|
626
|
-
this.entityManager.dataset.removeEntityEventListener(entity, TRANSFORM64_EVENT_CHANGE, entry.on_changed);
|
|
627
|
-
|
|
628
|
-
entry.on_changed = null;
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
for (let i = 0; i < entry.nodes.length; i++) {
|
|
632
|
-
this.#scene.remove(entry.nodes[i]);
|
|
633
|
-
}
|
|
601
|
+
this.#entries.delete(entity);
|
|
634
602
|
|
|
635
|
-
|
|
636
|
-
// the entities the model became are the model, so they go with it
|
|
637
|
-
entry.composition.destroy();
|
|
603
|
+
const dataset = this.entityManager.dataset;
|
|
638
604
|
|
|
639
|
-
|
|
605
|
+
if (dataset.entityExists(entity)) {
|
|
606
|
+
dataset.removeEntityEventListener(entity, TRANSFORM64_EVENT_CHANGE, entry.on_moved);
|
|
640
607
|
}
|
|
641
608
|
|
|
642
609
|
const waiting = this.#unregistered.indexOf(entry);
|
|
@@ -646,23 +613,49 @@ export class MeshSystem extends System {
|
|
|
646
613
|
this.#unregistered.splice(waiting, 1);
|
|
647
614
|
}
|
|
648
615
|
|
|
649
|
-
const awaiting = this.#awaiting_url.
|
|
616
|
+
const awaiting = this.#awaiting_url.indexOf(entry);
|
|
650
617
|
|
|
651
618
|
if (awaiting !== -1) {
|
|
652
619
|
// it left before it ever had a model to load
|
|
653
620
|
this.#awaiting_url.splice(awaiting, 1);
|
|
654
621
|
}
|
|
655
622
|
|
|
656
|
-
const
|
|
623
|
+
const instance = entry.instance;
|
|
657
624
|
|
|
658
|
-
if (
|
|
659
|
-
|
|
660
|
-
|
|
625
|
+
if (instance === null) {
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
entry.instance = null;
|
|
630
|
+
|
|
631
|
+
for (const [member, listener] of entry.on_offset_moved) {
|
|
632
|
+
if (dataset.entityExists(member)) {
|
|
633
|
+
dataset.removeEntityEventListener(member, TRANSFORM_ATTACHMENT_EVENT_CHANGE, listener);
|
|
661
634
|
}
|
|
635
|
+
}
|
|
662
636
|
|
|
663
|
-
|
|
637
|
+
entry.on_offset_moved.clear();
|
|
638
|
+
|
|
639
|
+
// A destroyed context must not be handed its rows or its ids back: a renderer restart
|
|
640
|
+
// takes the GPU scene context with it, and what the old one issued means nothing to the
|
|
641
|
+
// context that replaces it — so the entry forgets them rather than returning them.
|
|
642
|
+
if (entry.context !== null && entry.context === this.#graphics.scene_context(this.#scene)) {
|
|
643
|
+
const rows = entry.context.rows;
|
|
644
|
+
const entities = instance.entities;
|
|
645
|
+
|
|
646
|
+
for (let i = 0; i < entities.length; i++) {
|
|
647
|
+
rows.release(entities[i]);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
if (entry.animation !== null) {
|
|
651
|
+
unregister_instance_animation(entry.animation);
|
|
652
|
+
}
|
|
664
653
|
}
|
|
665
654
|
|
|
666
|
-
|
|
655
|
+
entry.animation = null;
|
|
656
|
+
entry.context = null;
|
|
657
|
+
|
|
658
|
+
// the entities the model became are the model, so they go with it
|
|
659
|
+
prefab_instance_destroy(dataset, instance);
|
|
667
660
|
}
|
|
668
661
|
}
|