@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,531 +0,0 @@
|
|
|
1
|
-
import { assert } from "../../../core/assert.js";
|
|
2
|
-
import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
|
|
3
|
-
import {
|
|
4
|
-
computeBoundingSphereOfSpheres
|
|
5
|
-
} from "../../../core/geom/packing/computeBoundingSphereOfSpheres.js";
|
|
6
|
-
import {
|
|
7
|
-
computeBoundingSphereFromVertexData
|
|
8
|
-
} from "../../../engine/graphics/geometry/computeBoundingSphereFromVertexData.js";
|
|
9
|
-
import {
|
|
10
|
-
mesh_apply_skeletal_vertex_skinning
|
|
11
|
-
} from "../../../engine/graphics/geometry/skining/mesh_apply_skeletal_vertex_skinning.js";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Identity 4×4 column-major matrix. The
|
|
15
|
-
* `mesh_apply_skeletal_vertex_skinning` helper takes `m4_bind` and
|
|
16
|
-
* `m4_bind_inv` arguments; both are identity for our use because the
|
|
17
|
-
* per-joint `bone_matrices` already encode the full skin transform
|
|
18
|
-
* (`joint_world × inverse_bind`) and the consumer of the resulting
|
|
19
|
-
* sphere re-applies `mesh.transform_global` on its side.
|
|
20
|
-
*
|
|
21
|
-
* @type {Float32Array}
|
|
22
|
-
*/
|
|
23
|
-
const IDENTITY_M4 = (() => {
|
|
24
|
-
const m = new Float32Array(16);
|
|
25
|
-
m[0] = 1; m[5] = 1; m[10] = 1; m[15] = 1;
|
|
26
|
-
return m;
|
|
27
|
-
})();
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* 4×4 scratch buffer used by the per-tick bone-matrix construction.
|
|
31
|
-
* Module-level rather than allocated per call so a long clip's
|
|
32
|
-
* thousands of ticks don't churn the heap.
|
|
33
|
-
*
|
|
34
|
-
* @type {Float32Array}
|
|
35
|
-
*/
|
|
36
|
-
const _scratch_mat4_b = new Float32Array(16);
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Joint-world matrix accumulator. Grown on demand; `length / 16`
|
|
40
|
-
* is the joint count it can hold. Re-allocated only when the
|
|
41
|
-
* current capacity is too small — never shrunk.
|
|
42
|
-
*
|
|
43
|
-
* @type {Float32Array}
|
|
44
|
-
*/
|
|
45
|
-
let _scratch_joint_world = new Float32Array(0);
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Bone-matrix scratch in the row-major 3×4 form
|
|
49
|
-
* {@link mesh_apply_skeletal_vertex_skinning} expects (12 floats per
|
|
50
|
-
* joint). Grown on demand alongside `_scratch_joint_world`.
|
|
51
|
-
*
|
|
52
|
-
* @type {Float32Array}
|
|
53
|
-
*/
|
|
54
|
-
let _scratch_bone_matrices = new Float32Array(0);
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Skinned-vertex output buffer for one pose. Sized to the largest
|
|
58
|
-
* `vertex_count × 3` we've seen so far. Reused across ticks.
|
|
59
|
-
*
|
|
60
|
-
* @type {Float32Array}
|
|
61
|
-
*/
|
|
62
|
-
let _scratch_skinned_positions = new Float32Array(0);
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Accumulator for per-tick `(cx, cy, cz, r)` spheres. Grown on
|
|
66
|
-
* demand to fit the largest tick count we've processed.
|
|
67
|
-
*
|
|
68
|
-
* @type {Float32Array}
|
|
69
|
-
*/
|
|
70
|
-
let _scratch_tick_spheres = new Float32Array(0);
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Per-tick sphere written by {@link computeBoundingSphereFromVertexData}.
|
|
74
|
-
* The function expects a `.set(x, y, z, w)`-compatible target;
|
|
75
|
-
* this tiny class is the minimum that satisfies it without
|
|
76
|
-
* pulling in Vector4. Reused every tick.
|
|
77
|
-
*/
|
|
78
|
-
const _scratch_tick_sphere = {
|
|
79
|
-
x: 0, y: 0, z: 0, w: 0,
|
|
80
|
-
set(x, y, z, w) {
|
|
81
|
-
this.x = x;
|
|
82
|
-
this.y = y;
|
|
83
|
-
this.z = z;
|
|
84
|
-
this.w = w;
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Bind-pose snapshots for joints touched by a clip. Saved on entry
|
|
90
|
-
* to {@link compute_skinned_mesh_clip_bounding_sphere} and restored
|
|
91
|
-
* on exit, so this routine never permanently mutates the caller's
|
|
92
|
-
* Node3D's. Module-level pool keyed by per-call slot index; grows
|
|
93
|
-
* to hold the largest channel count we've seen.
|
|
94
|
-
*
|
|
95
|
-
* Three parallel typed arrays — position (3 f32), rotation
|
|
96
|
-
* (4 f32 quaternion), scale (3 f32) — flattened so save/restore
|
|
97
|
-
* is a tight loop with no per-joint object allocation.
|
|
98
|
-
*
|
|
99
|
-
* @type {Float32Array}
|
|
100
|
-
*/
|
|
101
|
-
let _scratch_bind_position = new Float32Array(0);
|
|
102
|
-
let _scratch_bind_rotation = new Float32Array(0);
|
|
103
|
-
let _scratch_bind_scale = new Float32Array(0);
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Per-call joint set in topological order. `_scratch_joint_order[k]`
|
|
107
|
-
* holds the index (into `skin.joints`) of the k-th joint to
|
|
108
|
-
* process — parents always precede their children. Computed once
|
|
109
|
-
* per call (skin hierarchy is static across ticks) and reused
|
|
110
|
-
* across all ticks of that call.
|
|
111
|
-
*
|
|
112
|
-
* @type {Int32Array}
|
|
113
|
-
*/
|
|
114
|
-
let _scratch_joint_order = new Int32Array(0);
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Per-call parent index lookup. `_scratch_parent_in_set[i]` is the
|
|
118
|
-
* index of `skin.joints[i]`'s parent within `skin.joints`, or `-1`
|
|
119
|
-
* if the parent isn't part of the skin (an "outer" parent like the
|
|
120
|
-
* SkinnedMesh node or an armature anchor).
|
|
121
|
-
*
|
|
122
|
-
* @type {Int32Array}
|
|
123
|
-
*/
|
|
124
|
-
let _scratch_parent_in_set = new Int32Array(0);
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* DFS visited markers for the topo-sort pass. Cleared at the start
|
|
128
|
-
* of each call; module-level so we don't allocate per call.
|
|
129
|
-
*
|
|
130
|
-
* @type {Uint8Array}
|
|
131
|
-
*/
|
|
132
|
-
let _scratch_joint_visited = new Uint8Array(0);
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Ensure each module-level scratch typed array can hold at least
|
|
136
|
-
* `min_length` elements. Grow-only — never shrinks. Doubling
|
|
137
|
-
* strategy mirrors the GPU-side scratch buffers' policy.
|
|
138
|
-
*
|
|
139
|
-
* @param {Float32Array|Int32Array} buffer
|
|
140
|
-
* @param {number} min_length
|
|
141
|
-
* @param {function(number):Float32Array|Int32Array} make
|
|
142
|
-
* @returns {Float32Array|Int32Array} new buffer (or the input if it already fit)
|
|
143
|
-
*/
|
|
144
|
-
function _ensure_capacity(buffer, min_length, make) {
|
|
145
|
-
if (buffer.length >= min_length) return buffer;
|
|
146
|
-
let cap = Math.max(buffer.length, 1);
|
|
147
|
-
while (cap < min_length) cap *= 2;
|
|
148
|
-
return make(cap);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Inflate a column-major 4×4 matrix `m` into the row-major 3×4 form
|
|
153
|
-
* `mesh_apply_skeletal_vertex_skinning` reads per bone. Writes
|
|
154
|
-
* 12 floats starting at `out[out_offset]`.
|
|
155
|
-
*
|
|
156
|
-
* Mapping: the meep skinner does
|
|
157
|
-
* `sx = b[0]*x + b[1]*y + b[2]*z + b[3]` etc., which is row-major
|
|
158
|
-
* 3×4 (`b[r*4 + c]`). Our `m` is column-major 4×4, so column `c`
|
|
159
|
-
* lives at `m[c*4 + r]`. Hence `b[r*4 + c] = m[c*4 + r]`.
|
|
160
|
-
*
|
|
161
|
-
* Exported (with leading underscore) for direct test coverage.
|
|
162
|
-
*
|
|
163
|
-
* @param {Float32Array} m column-major 4×4
|
|
164
|
-
* @param {Float32Array} out
|
|
165
|
-
* @param {number} out_offset
|
|
166
|
-
*/
|
|
167
|
-
export function _pack_mat4_to_bone_3x4(m, out, out_offset) {
|
|
168
|
-
out[out_offset + 0] = m[0]; // m00
|
|
169
|
-
out[out_offset + 1] = m[4]; // m01
|
|
170
|
-
out[out_offset + 2] = m[8]; // m02
|
|
171
|
-
out[out_offset + 3] = m[12]; // m03 (tx)
|
|
172
|
-
out[out_offset + 4] = m[1]; // m10
|
|
173
|
-
out[out_offset + 5] = m[5]; // m11
|
|
174
|
-
out[out_offset + 6] = m[9]; // m12
|
|
175
|
-
out[out_offset + 7] = m[13]; // m13 (ty)
|
|
176
|
-
out[out_offset + 8] = m[2]; // m20
|
|
177
|
-
out[out_offset + 9] = m[6]; // m21
|
|
178
|
-
out[out_offset + 10] = m[10]; // m22
|
|
179
|
-
out[out_offset + 11] = m[14]; // m23 (tz)
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* 4-float scratch slot used to receive the union sphere from
|
|
184
|
-
* {@link computeBoundingSphereOfSpheres}. The meep helper writes
|
|
185
|
-
* `[cx, cy, cz, r]` into a `result` array-like; we then copy
|
|
186
|
-
* those four floats into the caller's `out` via `.set(x, y, z, w)`.
|
|
187
|
-
*
|
|
188
|
-
* @type {Float32Array}
|
|
189
|
-
*/
|
|
190
|
-
const _scratch_union_result = new Float32Array(4);
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* CPU skinning + bounding-sphere computation for a single pose.
|
|
194
|
-
*
|
|
195
|
-
* Pure-function sub-step. Takes pre-built `bone_matrices` (already
|
|
196
|
-
* in the row-major 3×4 form `mesh_apply_skeletal_vertex_skinning`
|
|
197
|
-
* expects, with `joint_world × inverse_bind` baked in per bone)
|
|
198
|
-
* plus the bind-pose vertex data, performs CPU skinning into an
|
|
199
|
-
* internal scratch buffer, and writes the resulting tight bounding
|
|
200
|
-
* sphere into `out_sphere` via miniball.
|
|
201
|
-
*
|
|
202
|
-
* Doesn't allocate (beyond the one-time scratch growth on first
|
|
203
|
-
* call with larger-than-seen-before inputs).
|
|
204
|
-
*
|
|
205
|
-
* @param {object} args
|
|
206
|
-
* @param {Float32Array} args.positions bind-pose vertex positions, flat `3 × vertex_count`
|
|
207
|
-
* @param {Uint32Array|number[]} args.joint_indices flat `4 × vertex_count` joint indices
|
|
208
|
-
* @param {Float32Array} args.joint_weights flat `4 × vertex_count` weights
|
|
209
|
-
* @param {number} args.vertex_count
|
|
210
|
-
* @param {Float32Array} args.bone_matrices row-major 3×4 (12 floats) per joint
|
|
211
|
-
* @param {{ set: function(number,number,number,number):void }} out_sphere
|
|
212
|
-
*/
|
|
213
|
-
export function compute_skinned_pose_bounding_sphere({
|
|
214
|
-
positions,
|
|
215
|
-
joint_indices,
|
|
216
|
-
joint_weights,
|
|
217
|
-
vertex_count,
|
|
218
|
-
bone_matrices,
|
|
219
|
-
}, out_sphere) {
|
|
220
|
-
|
|
221
|
-
const required_positions = vertex_count * 3;
|
|
222
|
-
_scratch_skinned_positions = _ensure_capacity(
|
|
223
|
-
_scratch_skinned_positions,
|
|
224
|
-
required_positions,
|
|
225
|
-
(n) => new Float32Array(n),
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
// m4_bind / m4_bind_inv are identity for our use — the full
|
|
229
|
-
// skin transform is already inside each entry of bone_matrices
|
|
230
|
-
// (see compute_skinned_mesh_clip_bounding_sphere). The meep
|
|
231
|
-
// skinner's pre/post-bind multiplies then become no-ops.
|
|
232
|
-
mesh_apply_skeletal_vertex_skinning(
|
|
233
|
-
_scratch_skinned_positions,
|
|
234
|
-
0,
|
|
235
|
-
positions,
|
|
236
|
-
vertex_count,
|
|
237
|
-
joint_weights,
|
|
238
|
-
joint_indices,
|
|
239
|
-
bone_matrices,
|
|
240
|
-
IDENTITY_M4,
|
|
241
|
-
IDENTITY_M4,
|
|
242
|
-
4,
|
|
243
|
-
);
|
|
244
|
-
|
|
245
|
-
// miniball over the skinned positions. computeBoundingSphereFromVertexData
|
|
246
|
-
// calls result.set(cx, cy, cz, radius). The subarray view keeps
|
|
247
|
-
// the call bounded to the vertices we actually wrote (the
|
|
248
|
-
// scratch buffer may be larger from a previous call).
|
|
249
|
-
const view = _scratch_skinned_positions.subarray(0, required_positions);
|
|
250
|
-
computeBoundingSphereFromVertexData(view, out_sphere);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Tight-ish bounding sphere over an entire clip's worth of poses.
|
|
255
|
-
* Steps the clip at a fixed `dt`, CPU-skins the bind-pose vertices
|
|
256
|
-
* at each tick, computes a per-tick miniball sphere, and unions
|
|
257
|
-
* them into one final sphere.
|
|
258
|
-
*
|
|
259
|
-
* The output sphere is in the mesh's **local space** — the bone
|
|
260
|
-
* matrices encode `joint_world × inverse_bind` only, with no mesh-
|
|
261
|
-
* node factor. Multiplying the sphere by the SkinnedMesh's runtime
|
|
262
|
-
* `transform_global` produces the world-space sphere a frustum-cull
|
|
263
|
-
* pass can compare against. This matches the rasterizer's
|
|
264
|
-
* convention (clone vertices are mesh-local; world placement comes
|
|
265
|
-
* from `mesh.transform_global` at draw time).
|
|
266
|
-
*
|
|
267
|
-
* Mutates the joint Node3D's `transform_local` while stepping —
|
|
268
|
-
* bind-pose values are saved on entry and restored on exit. Doesn't
|
|
269
|
-
* touch joints not driven by the clip.
|
|
270
|
-
*
|
|
271
|
-
* Allocation: zero per-call. Module-level scratch grows once on
|
|
272
|
-
* first call with a new largest size; subsequent calls reuse it.
|
|
273
|
-
*
|
|
274
|
-
* For the per-clip cost: this is intended for one-time computation
|
|
275
|
-
* at scene-setup time, so the bounding sphere can be uploaded to
|
|
276
|
-
* the GPU for skinning-workload culling. Per-frame use isn't
|
|
277
|
-
* supported (would have to deal with concurrent users of the
|
|
278
|
-
* module-level scratch).
|
|
279
|
-
*
|
|
280
|
-
* @param {object} args
|
|
281
|
-
* @param {Float32Array} args.positions bind-pose vertex positions, flat `3 × vertex_count`
|
|
282
|
-
* @param {Uint32Array|number[]} args.joint_indices flat `4 × vertex_count` joint indices
|
|
283
|
-
* @param {Float32Array} args.joint_weights flat `4 × vertex_count` weights
|
|
284
|
-
* @param {number} args.vertex_count
|
|
285
|
-
* @param {Skin} args.skin joints + inverse-bind matrices (column-major, 16 each)
|
|
286
|
-
* @param {ShadeAnimationClip} args.clip
|
|
287
|
-
* @param {number} [args.dt] time step in seconds (default `1/60`)
|
|
288
|
-
* @param {{ set: function(number,number,number,number):void }} out_sphere
|
|
289
|
-
*/
|
|
290
|
-
export function compute_skinned_mesh_clip_bounding_sphere({
|
|
291
|
-
positions,
|
|
292
|
-
joint_indices,
|
|
293
|
-
joint_weights,
|
|
294
|
-
vertex_count,
|
|
295
|
-
skin,
|
|
296
|
-
clip,
|
|
297
|
-
dt = 1 / 60,
|
|
298
|
-
}, out_sphere) {
|
|
299
|
-
|
|
300
|
-
assert.defined(positions, 'positions');
|
|
301
|
-
assert.defined(joint_indices, 'joint_indices');
|
|
302
|
-
assert.defined(joint_weights, 'joint_weights');
|
|
303
|
-
assert.isNonNegativeInteger(vertex_count, 'vertex_count');
|
|
304
|
-
assert.defined(skin, 'skin');
|
|
305
|
-
assert.equal(skin.isSkin, true, 'skin.isSkin !== true');
|
|
306
|
-
assert.defined(clip, 'clip');
|
|
307
|
-
assert.equal(clip.isShadeAnimationClip, true, 'clip.isShadeAnimationClip !== true');
|
|
308
|
-
assert.greaterThan(dt, 0, 'dt');
|
|
309
|
-
assert.defined(out_sphere, 'out_sphere');
|
|
310
|
-
|
|
311
|
-
const joints = skin.joints;
|
|
312
|
-
const joint_count = joints.length;
|
|
313
|
-
const channels = clip.channels;
|
|
314
|
-
const channel_count = channels.length;
|
|
315
|
-
|
|
316
|
-
// ── Topological order over the joint set ──────────────────
|
|
317
|
-
//
|
|
318
|
-
// Computed once per call; the skin's joint hierarchy is static.
|
|
319
|
-
// For each joint we also note whether its parent is itself a
|
|
320
|
-
// skin joint — outer parents (SkinnedMesh node, armature
|
|
321
|
-
// anchor) are handled separately so we can fold their current
|
|
322
|
-
// transform_global into the walk without confusing it with
|
|
323
|
-
// an intra-skin link.
|
|
324
|
-
_scratch_joint_order = _ensure_capacity(
|
|
325
|
-
_scratch_joint_order, joint_count,
|
|
326
|
-
(n) => new Int32Array(n),
|
|
327
|
-
);
|
|
328
|
-
_scratch_parent_in_set = _ensure_capacity(
|
|
329
|
-
_scratch_parent_in_set, joint_count,
|
|
330
|
-
(n) => new Int32Array(n),
|
|
331
|
-
);
|
|
332
|
-
|
|
333
|
-
const joint_index_map = new Map();
|
|
334
|
-
for (let i = 0; i < joint_count; i++) joint_index_map.set(joints[i], i);
|
|
335
|
-
for (let i = 0; i < joint_count; i++) {
|
|
336
|
-
const parent = joints[i].parent;
|
|
337
|
-
const p = parent !== null ? joint_index_map.get(parent) : undefined;
|
|
338
|
-
_scratch_parent_in_set[i] = p === undefined ? -1 : p;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// DFS-based topo sort: visit parent before child. The visited
|
|
342
|
-
// marker array is module-level scratch; grow if needed and
|
|
343
|
-
// clear the joint_count prefix at the start of each call.
|
|
344
|
-
_scratch_joint_visited = _ensure_capacity(
|
|
345
|
-
_scratch_joint_visited, joint_count,
|
|
346
|
-
(n) => new Uint8Array(n),
|
|
347
|
-
);
|
|
348
|
-
for (let i = 0; i < joint_count; i++) _scratch_joint_visited[i] = 0;
|
|
349
|
-
|
|
350
|
-
let order_cursor = 0;
|
|
351
|
-
const visit = (i) => {
|
|
352
|
-
if (_scratch_joint_visited[i]) return;
|
|
353
|
-
const parent_in_set = _scratch_parent_in_set[i];
|
|
354
|
-
if (parent_in_set >= 0) visit(parent_in_set);
|
|
355
|
-
_scratch_joint_visited[i] = 1;
|
|
356
|
-
_scratch_joint_order[order_cursor++] = i;
|
|
357
|
-
};
|
|
358
|
-
for (let i = 0; i < joint_count; i++) visit(i);
|
|
359
|
-
|
|
360
|
-
// ── Save bind-pose TRS for every channel-driven joint ──────
|
|
361
|
-
//
|
|
362
|
-
// Only the joints the clip actually animates are at risk of
|
|
363
|
-
// being mutated — others stay at their bind values throughout.
|
|
364
|
-
// Grow the snapshot buffers to fit one slot per channel
|
|
365
|
-
// (channels are 1-to-1 with target Node3Ds in practice; the
|
|
366
|
-
// same target can in theory show up across multiple channels
|
|
367
|
-
// for different properties, but we still need only one snapshot
|
|
368
|
-
// per channel).
|
|
369
|
-
_scratch_bind_position = _ensure_capacity(
|
|
370
|
-
_scratch_bind_position, channel_count * 3,
|
|
371
|
-
(n) => new Float32Array(n),
|
|
372
|
-
);
|
|
373
|
-
_scratch_bind_rotation = _ensure_capacity(
|
|
374
|
-
_scratch_bind_rotation, channel_count * 4,
|
|
375
|
-
(n) => new Float32Array(n),
|
|
376
|
-
);
|
|
377
|
-
_scratch_bind_scale = _ensure_capacity(
|
|
378
|
-
_scratch_bind_scale, channel_count * 3,
|
|
379
|
-
(n) => new Float32Array(n),
|
|
380
|
-
);
|
|
381
|
-
|
|
382
|
-
for (let c = 0; c < channel_count; c++) {
|
|
383
|
-
const tl = channels[c].target.transform_local;
|
|
384
|
-
_scratch_bind_position[c * 3 + 0] = tl.translation_x;
|
|
385
|
-
_scratch_bind_position[c * 3 + 1] = tl.translation_y;
|
|
386
|
-
_scratch_bind_position[c * 3 + 2] = tl.translation_z;
|
|
387
|
-
_scratch_bind_rotation[c * 4 + 0] = tl.rotation_x;
|
|
388
|
-
_scratch_bind_rotation[c * 4 + 1] = tl.rotation_y;
|
|
389
|
-
_scratch_bind_rotation[c * 4 + 2] = tl.rotation_z;
|
|
390
|
-
_scratch_bind_rotation[c * 4 + 3] = tl.rotation_w;
|
|
391
|
-
_scratch_bind_scale[c * 3 + 0] = tl.scale_x;
|
|
392
|
-
_scratch_bind_scale[c * 3 + 1] = tl.scale_y;
|
|
393
|
-
_scratch_bind_scale[c * 3 + 2] = tl.scale_z;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// ── Allocate scratch sized to the joint count + clip extent ─
|
|
397
|
-
_scratch_joint_world = _ensure_capacity(
|
|
398
|
-
_scratch_joint_world, joint_count * 16,
|
|
399
|
-
(n) => new Float32Array(n),
|
|
400
|
-
);
|
|
401
|
-
_scratch_bone_matrices = _ensure_capacity(
|
|
402
|
-
_scratch_bone_matrices, joint_count * 12,
|
|
403
|
-
(n) => new Float32Array(n),
|
|
404
|
-
);
|
|
405
|
-
|
|
406
|
-
// ── Step the clip ────────────────────────────────────────
|
|
407
|
-
const t_start = clip.start_time;
|
|
408
|
-
const t_end = clip.end_time;
|
|
409
|
-
const span = Math.max(t_end - t_start, 0);
|
|
410
|
-
// Plus 1 to include both endpoints when (span % dt) == 0.
|
|
411
|
-
const tick_count = Math.max(1, Math.floor(span / dt) + 1);
|
|
412
|
-
|
|
413
|
-
_scratch_tick_spheres = _ensure_capacity(
|
|
414
|
-
_scratch_tick_spheres, tick_count * 4,
|
|
415
|
-
(n) => new Float32Array(n),
|
|
416
|
-
);
|
|
417
|
-
|
|
418
|
-
for (let tick = 0; tick < tick_count; tick++) {
|
|
419
|
-
// Last tick lands exactly on t_end so the clip's endpoint
|
|
420
|
-
// pose is included even when (span / dt) doesn't divide
|
|
421
|
-
// evenly.
|
|
422
|
-
const t = (tick === tick_count - 1) ? t_end : t_start + tick * dt;
|
|
423
|
-
|
|
424
|
-
// Apply the clip to each channel's target Node3D. Mutates
|
|
425
|
-
// bind-pose TRS on the animated joints — snapshot/restore
|
|
426
|
-
// outside the tick loop covers it.
|
|
427
|
-
clip.apply(t);
|
|
428
|
-
|
|
429
|
-
// Walk the skin's joints in topological order, composing
|
|
430
|
-
// each joint's world matrix from its parent's world matrix
|
|
431
|
-
// and its own local. Outer parents (parent_in_set < 0)
|
|
432
|
-
// contribute their current `transform_global.matrix` so the
|
|
433
|
-
// sphere lands in the right outer frame; if the joint has
|
|
434
|
-
// no parent at all, its world is just its local.
|
|
435
|
-
for (let oi = 0; oi < joint_count; oi++) {
|
|
436
|
-
const i = _scratch_joint_order[oi];
|
|
437
|
-
const joint = joints[i];
|
|
438
|
-
|
|
439
|
-
// Refresh the joint's matrix from its (possibly clip-
|
|
440
|
-
// mutated) TRS.
|
|
441
|
-
joint.transform_local.updateMatrix();
|
|
442
|
-
const local = joint.transform_local.matrix;
|
|
443
|
-
const parent_in_set = _scratch_parent_in_set[i];
|
|
444
|
-
const out_offset = i * 16;
|
|
445
|
-
|
|
446
|
-
if (parent_in_set >= 0) {
|
|
447
|
-
const parent_world = _scratch_joint_world.subarray(
|
|
448
|
-
parent_in_set * 16, parent_in_set * 16 + 16,
|
|
449
|
-
);
|
|
450
|
-
const out_view = _scratch_joint_world.subarray(out_offset, out_offset + 16);
|
|
451
|
-
m4_multiply(out_view, parent_world, local);
|
|
452
|
-
} else {
|
|
453
|
-
const parent = joint.parent;
|
|
454
|
-
if (parent !== null) {
|
|
455
|
-
const out_view = _scratch_joint_world.subarray(out_offset, out_offset + 16);
|
|
456
|
-
m4_multiply(out_view, parent.transform_global.matrix, local);
|
|
457
|
-
} else {
|
|
458
|
-
for (let k = 0; k < 16; k++) {
|
|
459
|
-
_scratch_joint_world[out_offset + k] = local[k];
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
// Build per-joint bone matrices in the 3×4 form the meep
|
|
466
|
-
// skinner reads:
|
|
467
|
-
// skin_matrix_i = joint_world_i × inverse_bind_i
|
|
468
|
-
// No mesh-node factor — the consumer of `out_sphere` applies
|
|
469
|
-
// `mesh.transform_global` on its side, matching the
|
|
470
|
-
// rasterizer convention.
|
|
471
|
-
const inverse_bind = skin.inverse_bind_matrices;
|
|
472
|
-
for (let i = 0; i < joint_count; i++) {
|
|
473
|
-
const joint_world = _scratch_joint_world.subarray(i * 16, i * 16 + 16);
|
|
474
|
-
const inv_bind = inverse_bind.subarray(i * 16, i * 16 + 16);
|
|
475
|
-
|
|
476
|
-
m4_multiply(_scratch_mat4_b, joint_world, inv_bind);
|
|
477
|
-
_pack_mat4_to_bone_3x4(_scratch_mat4_b, _scratch_bone_matrices, i * 12);
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
// Skin + miniball sphere for this tick.
|
|
481
|
-
compute_skinned_pose_bounding_sphere({
|
|
482
|
-
positions,
|
|
483
|
-
joint_indices,
|
|
484
|
-
joint_weights,
|
|
485
|
-
vertex_count,
|
|
486
|
-
bone_matrices: _scratch_bone_matrices,
|
|
487
|
-
}, _scratch_tick_sphere);
|
|
488
|
-
|
|
489
|
-
const o = tick * 4;
|
|
490
|
-
_scratch_tick_spheres[o + 0] = _scratch_tick_sphere.x;
|
|
491
|
-
_scratch_tick_spheres[o + 1] = _scratch_tick_sphere.y;
|
|
492
|
-
_scratch_tick_spheres[o + 2] = _scratch_tick_sphere.z;
|
|
493
|
-
_scratch_tick_spheres[o + 3] = _scratch_tick_sphere.w;
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
// ── Union the per-tick spheres into one ──────────────────
|
|
497
|
-
//
|
|
498
|
-
// Layout: `_scratch_tick_spheres[tick * 4 + (0..3)] = (cx, cy, cz, r)`,
|
|
499
|
-
// so each sphere is 4 floats wide. We pass `dimensions = 3` to
|
|
500
|
-
// describe the spatial dimensionality of the centres.
|
|
501
|
-
computeBoundingSphereOfSpheres(
|
|
502
|
-
_scratch_union_result, _scratch_tick_spheres, 0, tick_count, 3,
|
|
503
|
-
);
|
|
504
|
-
out_sphere.set(
|
|
505
|
-
_scratch_union_result[0],
|
|
506
|
-
_scratch_union_result[1],
|
|
507
|
-
_scratch_union_result[2],
|
|
508
|
-
_scratch_union_result[3],
|
|
509
|
-
);
|
|
510
|
-
|
|
511
|
-
// ── Restore bind-pose TRS ──────────────────────────────────
|
|
512
|
-
for (let c = 0; c < channel_count; c++) {
|
|
513
|
-
const tl = channels[c].target.transform_local;
|
|
514
|
-
tl.setTranslation(
|
|
515
|
-
_scratch_bind_position[c * 3 + 0],
|
|
516
|
-
_scratch_bind_position[c * 3 + 1],
|
|
517
|
-
_scratch_bind_position[c * 3 + 2],
|
|
518
|
-
);
|
|
519
|
-
tl.setRotation(
|
|
520
|
-
_scratch_bind_rotation[c * 4 + 0],
|
|
521
|
-
_scratch_bind_rotation[c * 4 + 1],
|
|
522
|
-
_scratch_bind_rotation[c * 4 + 2],
|
|
523
|
-
_scratch_bind_rotation[c * 4 + 3],
|
|
524
|
-
);
|
|
525
|
-
tl.setScale(
|
|
526
|
-
_scratch_bind_scale[c * 3 + 0],
|
|
527
|
-
_scratch_bind_scale[c * 3 + 1],
|
|
528
|
-
_scratch_bind_scale[c * 3 + 2],
|
|
529
|
-
);
|
|
530
|
-
}
|
|
531
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { assert } from "../../../../core/assert.js";
|
|
2
|
-
import { Transform64 } from "../../../../engine/ecs/transform/Transform64.js";
|
|
3
|
-
import { pose_evaluate_local } from "./pose_evaluate_local.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Scratch for one level of the parent walk. Depth is bounded by the skeleton, and reusing a small
|
|
7
|
-
* stack keeps the query allocation-free.
|
|
8
|
-
*
|
|
9
|
-
* @type {Transform64[]}
|
|
10
|
-
*/
|
|
11
|
-
const SCRATCH = [];
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @type {Node3D[]}
|
|
15
|
-
*/
|
|
16
|
-
const CHAIN = [];
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* @param {number} depth
|
|
20
|
-
* @returns {Transform64}
|
|
21
|
-
*/
|
|
22
|
-
function scratch_at(depth) {
|
|
23
|
-
while (SCRATCH.length <= depth) {
|
|
24
|
-
SCRATCH.push(new Transform64());
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return SCRATCH[depth];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Evaluate a node's **world** pose under a set of playing clips.
|
|
32
|
-
*
|
|
33
|
-
* This is the query gameplay actually asks: where is the muzzle, where does this effect attach,
|
|
34
|
-
* where does the projectile leave from. It walks the node's parent chain, evaluates every ancestor's
|
|
35
|
-
* animated local pose the same way, and composes down — so a socket on a hand follows the arm, the
|
|
36
|
-
* shoulder and the root without any of it having been read back from the GPU.
|
|
37
|
-
*
|
|
38
|
-
* The chain is composed in double precision and every level is evaluated from the same `playbacks`,
|
|
39
|
-
* which is what makes the result a pure function of (clip set, time, weights) rather than of
|
|
40
|
-
* whatever the renderer last happened to write.
|
|
41
|
-
*
|
|
42
|
-
* @param {Transform64} result
|
|
43
|
-
* @param {Node3D} node
|
|
44
|
-
* @param {PosePlayback[]} playbacks
|
|
45
|
-
* @returns {Transform64} `result`
|
|
46
|
-
*/
|
|
47
|
-
export function pose_evaluate_world(result, node, playbacks) {
|
|
48
|
-
assert.defined(result, 'result');
|
|
49
|
-
assert.defined(node, 'node');
|
|
50
|
-
|
|
51
|
-
CHAIN.length = 0;
|
|
52
|
-
|
|
53
|
-
for (let cursor = node; cursor !== null; cursor = cursor.parent) {
|
|
54
|
-
CHAIN.push(cursor);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// root first, so each step composes onto what is already accumulated
|
|
58
|
-
let depth = 0;
|
|
59
|
-
|
|
60
|
-
for (let i = CHAIN.length - 1; i >= 0; i--) {
|
|
61
|
-
const local = scratch_at(depth);
|
|
62
|
-
|
|
63
|
-
pose_evaluate_local(local, CHAIN[i], playbacks);
|
|
64
|
-
local.updateMatrix();
|
|
65
|
-
|
|
66
|
-
if (i === CHAIN.length - 1) {
|
|
67
|
-
result.copy(local);
|
|
68
|
-
} else {
|
|
69
|
-
result.multiplyTransforms(result, local);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
depth++;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return result;
|
|
76
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { assert } from "../../../core/assert.js";
|
|
2
|
-
import { skin_joint_matrix } from "./skin_joint_matrix.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* The transform that maps this skin's mesh-space geometry into the world at rest.
|
|
6
|
-
*
|
|
7
|
-
* `compute_skin_world_bounds` already names the thing: *"with every joint at its bind pose
|
|
8
|
-
* `joint.global × inverse_bind` collapses to one and the same matrix, the character's placement in
|
|
9
|
-
* the world"*. This returns that matrix. It is the frame a skinned mesh's vertices belong in, and
|
|
10
|
-
* under {@link skin_normalize_mesh_frame} it becomes the mesh node's transform — see
|
|
11
|
-
* `SKINNING_FRAME_PLAN.md`.
|
|
12
|
-
*
|
|
13
|
-
* **Joint 0's is the one taken.** In a file whose rest pose is its bind pose every joint answers the
|
|
14
|
-
* same matrix, so which one is asked is not a choice; in a file where they differ there is no single
|
|
15
|
-
* answer and no amount of averaging makes one. What matters is not that they agree but that
|
|
16
|
-
* `frame⁻¹ · joint_matrix` comes out rigid for every joint, which is a weaker condition and a
|
|
17
|
-
* different question — {@link skin_frame_defect} is that question, and it is the one to ask.
|
|
18
|
-
*
|
|
19
|
-
* Reads the joints' `transform_global`, so the skeleton has to have been walked
|
|
20
|
-
* ({@link Node3D#updateMatrices}) since it was last moved. Joints under
|
|
21
|
-
* {@link TransformAuthority.GPU} hold the rest pose there, which is what this wants.
|
|
22
|
-
*
|
|
23
|
-
* @param {Float64Array|Float32Array|number[]} out 16 elements, column-major
|
|
24
|
-
* @param {Skin} skin
|
|
25
|
-
* @returns {Float64Array|Float32Array|number[]} `out`
|
|
26
|
-
*/
|
|
27
|
-
export function skin_bind_transform(out, skin) {
|
|
28
|
-
assert.defined(skin, 'skin');
|
|
29
|
-
assert.equal(skin.isSkin, true, 'skin.isSkin !== true');
|
|
30
|
-
assert.greaterThanOrEqual(skin.joints.length, 1, 'skin.joints.length');
|
|
31
|
-
|
|
32
|
-
return skin_joint_matrix(out, skin, 0);
|
|
33
|
-
}
|