@woosh/meep-engine 3.11.3 → 3.12.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/README.md +14 -18
- package/editor/SelectionVisualizer.js +127 -127
- package/editor/entity_world_bounds.js +27 -27
- package/editor/particles/rebuildParticleEmitter.js +31 -31
- package/editor/process/SymbolicDisplayProcess.js +1 -1
- package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
- package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
- package/editor/prototypeEditorShell.js +156 -156
- package/editor/selection/editor_pick.js +130 -130
- package/editor/selection/screen_rect_frustum.js +119 -119
- package/editor/tools/v2/TransformControls.js +971 -971
- package/package.json +1 -1
- package/src/engine/Engine.d.ts +3 -3
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +726 -726
- package/src/engine/EngineHarness.d.ts +1 -1
- package/src/engine/EngineHarness.js +590 -590
- package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
- package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
- package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
- package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
- package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
- package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
- package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
- package/src/engine/graphics/ecs/water/Water.js +104 -104
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
- package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
- package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
- package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
- package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
- package/src/engine/graphics3/AnimationSystem.js +352 -0
- package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
- package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem3.js +6 -348
- package/src/engine/graphics3/CameraSystem.d.ts +49 -0
- package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
- package/src/engine/graphics3/CameraSystem.js +170 -0
- package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
- package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/CameraSystem3.js +6 -166
- package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
- package/src/engine/graphics3/DebugDrawSystem.js +205 -0
- package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
- package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
- package/src/engine/graphics3/DecalSystem.d.ts +81 -0
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
- package/src/engine/graphics3/DecalSystem.js +441 -0
- package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
- package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem3.js +6 -437
- package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
- package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
- package/src/engine/graphics3/FogOfWarSystem.js +265 -0
- package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
- package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
- package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
- package/src/engine/graphics3/GraphicsEngine.js +790 -0
- package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
- package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine3.js +6 -786
- package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
- package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
- package/src/engine/graphics3/HighlightSystem.js +241 -0
- package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
- package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/HighlightSystem3.js +6 -237
- package/src/engine/graphics3/LightSystem.d.ts +40 -0
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
- package/src/engine/graphics3/LightSystem.js +211 -0
- package/src/engine/graphics3/LightSystem3.d.ts +6 -36
- package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem3.js +6 -207
- package/src/engine/graphics3/MeshSystem.d.ts +106 -0
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
- package/src/engine/graphics3/MeshSystem.js +647 -0
- package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
- package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem3.js +6 -642
- package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
- package/src/engine/graphics3/ParticipatingMedia.js +203 -203
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
- package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
- package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
- package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
- package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
- package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
- package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
- package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
- package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
- package/src/engine/graphics3/PathDisplaySystem.js +309 -0
- package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
- package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
- package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
- package/src/engine/graphics3/Pickable.d.ts +1 -1
- package/src/engine/graphics3/Pickable.js +65 -65
- package/src/engine/graphics3/PickingQuery.d.ts +1 -1
- package/src/engine/graphics3/PickingQuery.js +48 -48
- package/src/engine/graphics3/PickingSystem.d.ts +67 -0
- package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
- package/src/engine/graphics3/PickingSystem.js +273 -0
- package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
- package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/PickingSystem3.js +6 -269
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
- package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
- package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
- package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
- package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
- package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
- package/src/engine/graphics3/TerrainSystem.js +566 -0
- package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
- package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/TerrainSystem3.js +6 -562
- package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
- package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
- package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
- package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
- package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
- package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
- package/src/engine/graphics3/Trail3DSystem.js +221 -0
- package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
- package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem3.js +6 -217
- package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
- package/src/engine/graphics3/VolumetricLightMap.js +2 -2
- package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
- package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
- package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
- package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
- package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
- package/src/engine/graphics3/WaterSystem.d.ts +59 -0
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
- package/src/engine/graphics3/WaterSystem.js +293 -0
- package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
- package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem3.js +6 -289
- package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
- package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
- package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
- package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
- package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
- package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
- package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
- package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
- package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
- package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
- package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
- package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
- package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
- package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
- package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
- package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
- package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
- package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
- package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
- package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
- package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
- package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
- package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
- package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
- package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
- package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +0 -1
- package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
- package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
- package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
- package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
- package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
- package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +4 -7
- package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
- package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
- package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
- package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
- package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
- package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
- package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
- package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
- 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 +57 -58
- package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
- package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
- package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
- package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
- package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
- package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
- package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
- package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
- package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +2 -2
- package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
- package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +0 -1
- package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
- package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
- package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
- package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
- package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
- package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
- package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
- package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +350 -296
- package/src/shade/renderer/shader/ImageShader.js +217 -217
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/ShaderDescriptor.js +20 -0
- package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
- package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
- package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
- package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
- package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
- package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
- package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +12 -15
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +3 -2
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +3 -2
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
- package/src/shade/renderer/water/shader_water.js +246 -246
- package/src/shade/vitest.setup.mjs +1 -1
- package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
- package/src/view/minimap/Minimap.d.ts +2 -2
- package/src/view/minimap/Minimap.d.ts.map +1 -1
- package/src/view/minimap/Minimap.js +225 -225
- package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
- package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
- package/src/view/minimap/dom/MinimapCameraView.js +206 -206
- package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
- package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
- package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
|
@@ -49,7 +49,7 @@ export class ClipListPlayer {
|
|
|
49
49
|
* What each of the model's clips weighs, by the instance's own clip order — which is the order
|
|
50
50
|
* the animation manager's registration uses, so it is the lookup for both.
|
|
51
51
|
*
|
|
52
|
-
* A clip the list does not name weighs zero: `
|
|
52
|
+
* A clip the list does not name weighs zero: `MeshSystem` registers every clip a model carries,
|
|
53
53
|
* and an unclaimed one would otherwise lay itself over the pose at full strength.
|
|
54
54
|
*
|
|
55
55
|
* @type {Float32Array}
|
|
@@ -1,263 +1,263 @@
|
|
|
1
|
-
import { assert } from "../../../core/assert.js";
|
|
2
|
-
import { AnimationEventTypes } from "../../graphics/ecs/animation/animator/AnimationEventTypes.js";
|
|
3
|
-
import { ClipPlayback } from "./ClipPlayback.js";
|
|
4
|
-
import { wrap_clip_time } from "./wrap_clip_time.js";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Plays one {@link Animation} component's list of clips against one model.
|
|
8
|
-
*
|
|
9
|
-
* **The component is reused as it stands**, unlike the graph's, which had to be restated because it
|
|
10
|
-
* *was* an `AnimationMixer`: `Animation` holds a name, a repeat count, a weight and a time scale per
|
|
11
|
-
* clip and no renderer handle of any kind. What the legacy system added to it — the mixer, its
|
|
12
|
-
* actions and their clocks — is what this replaces, and the clocks are here because the pose
|
|
13
|
-
* gameplay asks about has to come off the same clock the picture is drawn from (I-4).
|
|
14
|
-
*
|
|
15
|
-
* **Weights are shares of one pose.** Shade's accumulator adds up what every bound clip contributes
|
|
16
|
-
* and has no rest-pose term, so what reaches it is each clip's weight over the list's total —
|
|
17
|
-
* which is what three's mixer did too, by cumulative weight, and is why the game can author a walk
|
|
18
|
-
* clip at weight 1000 against an idle at 1 and mean "the walk".
|
|
19
|
-
*
|
|
20
|
-
* **A clip that has run out holds its last frame.** Three disabled a finished one-shot and let the
|
|
21
|
-
* rig fall back to its bind pose; there is no pose to fall back to here, and a list whose every clip
|
|
22
|
-
* has stopped contributing resolves each joint it drives to *zero* rather than to rest. So
|
|
23
|
-
* `AnimationClipFlag.ClampWhenFinished` decides nothing — holding is the only case — and it keeps
|
|
24
|
-
* deserializing (I-13) like `AnimationFlags.MeshSizeCulling`, whose 32 px² cull does not come across
|
|
25
|
-
* either: a clock camera framing can stop is a simulation camera framing can change (§2.6-2).
|
|
26
|
-
*/
|
|
27
|
-
export class ClipListPlayer {
|
|
28
|
-
/**
|
|
29
|
-
* The list being played. Every entry's `weight`, `timeScale` and `repeatCount` is read each
|
|
30
|
-
* tick, so changing one takes effect without removing and re-adding the clip.
|
|
31
|
-
*
|
|
32
|
-
* @type {Animation}
|
|
33
|
-
*/
|
|
34
|
-
component = null;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* The entity's private copy of the model — where the clips named in the list are found, and
|
|
38
|
-
* where their durations come from.
|
|
39
|
-
*
|
|
40
|
-
* @type {SceneBundleInstance}
|
|
41
|
-
*/
|
|
42
|
-
instance = null;
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* One per entry of {@link component}'s list, in the list's own order.
|
|
46
|
-
*
|
|
47
|
-
* @type {ClipPlayback[]}
|
|
48
|
-
*/
|
|
49
|
-
playbacks = [];
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* What each of the model's clips weighs, by the instance's own clip order — which is the order
|
|
53
|
-
* the animation manager's registration uses, so it is the lookup for both.
|
|
54
|
-
*
|
|
55
|
-
* A clip the list does not name weighs zero: `
|
|
56
|
-
* and an unclaimed one would otherwise lay itself over the pose at full strength.
|
|
57
|
-
*
|
|
58
|
-
* @type {Float32Array}
|
|
59
|
-
*/
|
|
60
|
-
weights = new Float32Array(0);
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* @type {number}
|
|
64
|
-
*/
|
|
65
|
-
#entity = -1;
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* @type {EntityComponentDataset}
|
|
69
|
-
*/
|
|
70
|
-
#dataset = null;
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Names already reported as absent from this model, so the report is one line rather than one a
|
|
74
|
-
* frame. Cleared with the model, because the next one may well carry the name.
|
|
75
|
-
*
|
|
76
|
-
* @type {Set<string>}
|
|
77
|
-
*/
|
|
78
|
-
#reported_missing = new Set();
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* @param {Animation} component
|
|
82
|
-
* @returns {ClipListPlayer}
|
|
83
|
-
*/
|
|
84
|
-
static from(component) {
|
|
85
|
-
assert.defined(component, 'component');
|
|
86
|
-
|
|
87
|
-
const r = new ClipListPlayer();
|
|
88
|
-
|
|
89
|
-
r.component = component;
|
|
90
|
-
|
|
91
|
-
return r;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Take up a model, and the entity whose events its clips fire as.
|
|
96
|
-
*
|
|
97
|
-
* Every playback is dropped, because the clips a playback was pointing at are not this model's.
|
|
98
|
-
*
|
|
99
|
-
* @param {number} entity
|
|
100
|
-
* @param {EntityComponentDataset} ecd
|
|
101
|
-
* @param {SceneBundleInstance} instance
|
|
102
|
-
*/
|
|
103
|
-
bind(entity, ecd, instance) {
|
|
104
|
-
assert.isNonNegativeInteger(entity, 'entity');
|
|
105
|
-
assert.defined(ecd, 'ecd');
|
|
106
|
-
assert.defined(instance, 'instance');
|
|
107
|
-
|
|
108
|
-
this.#entity = entity;
|
|
109
|
-
this.#dataset = ecd;
|
|
110
|
-
|
|
111
|
-
this.instance = instance;
|
|
112
|
-
this.playbacks = [];
|
|
113
|
-
this.weights = new Float32Array(instance.clips.length);
|
|
114
|
-
this.#reported_missing.clear();
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Advance every clock, say so when one runs out, and work out what the list therefore weighs.
|
|
119
|
-
*
|
|
120
|
-
* Unconditional by design: §2.6-2's split puts pose evaluation and its events on the CPU
|
|
121
|
-
* precisely so that camera framing cannot decide whether a clip's end is ever reached.
|
|
122
|
-
*
|
|
123
|
-
* @param {number} time_delta_seconds
|
|
124
|
-
*/
|
|
125
|
-
tick(time_delta_seconds) {
|
|
126
|
-
this.#reconcile();
|
|
127
|
-
this.#advance(time_delta_seconds);
|
|
128
|
-
this.#blend();
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Match the playbacks against the list, which the game edits while it runs —
|
|
133
|
-
* `StartAnimationBehavior` adds an entry, `StopAnimationBehavior` and `AnimationController`'s
|
|
134
|
-
* rules remove one. Identity is the match, so a clip stopped and started again is a new entry
|
|
135
|
-
* and plays from its own beginning.
|
|
136
|
-
*
|
|
137
|
-
* **A name the model has not got does not play, and says so once (D43).** Clip names are
|
|
138
|
-
* authored against models the game does not own and they do miss — the strategy map's buildings
|
|
139
|
-
* ask for `Take01` of a model whose clip is `Take 001`, and one that has no clips at all. This
|
|
140
|
-
* threw until D43, out of `
|
|
141
|
-
* every frame for as long as one such entity existed. Reporting it per frame buries the console
|
|
142
|
-
* and reporting it not at all is how the mismatch survived the three path unnoticed, so it is
|
|
143
|
-
* said once per name, with the model's real clip list beside it.
|
|
144
|
-
*/
|
|
145
|
-
#reconcile() {
|
|
146
|
-
const clips = this.component.clips;
|
|
147
|
-
const playbacks = this.playbacks;
|
|
148
|
-
|
|
149
|
-
for (let i = playbacks.length - 1; i >= 0; i--) {
|
|
150
|
-
if (clips.indexOf(playbacks[i].clip) === -1) {
|
|
151
|
-
playbacks.splice(i, 1);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const available = this.instance.clips;
|
|
156
|
-
|
|
157
|
-
for (let i = 0; i < clips.length; i++) {
|
|
158
|
-
const clip = clips.get(i);
|
|
159
|
-
|
|
160
|
-
if (find_playback(playbacks, clip) !== null) {
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const name = clip.name.getValue();
|
|
165
|
-
const slot = available.findIndex(c => c.name === name);
|
|
166
|
-
|
|
167
|
-
if (slot === -1) {
|
|
168
|
-
this.#report_missing(name, available);
|
|
169
|
-
|
|
170
|
-
continue;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
playbacks.push(ClipPlayback.from(clip, slot, available[slot].duration));
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Say once, per name, that this model has no such clip — and say what it does have, because the
|
|
179
|
-
* mismatch is nearly always spelling and the answer is in the list beside it.
|
|
180
|
-
*
|
|
181
|
-
* @param {string} name
|
|
182
|
-
* @param {ShadeAnimationClip[]} available
|
|
183
|
-
*/
|
|
184
|
-
#report_missing(name, available) {
|
|
185
|
-
if (this.#reported_missing.has(name)) {
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
this.#reported_missing.add(name);
|
|
190
|
-
|
|
191
|
-
console.warn(
|
|
192
|
-
`Animation clip '${name}' is not in the model of entity ${this.#entity}, so it does not `
|
|
193
|
-
+ `play. The model carries: ${available.map(c => `'${c.name}'`).join(', ')}`
|
|
194
|
-
);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* @param {number} time_delta_seconds
|
|
199
|
-
*/
|
|
200
|
-
#advance(time_delta_seconds) {
|
|
201
|
-
const playing = this.component.isPlaying;
|
|
202
|
-
const playbacks = this.playbacks;
|
|
203
|
-
|
|
204
|
-
for (let i = 0; i < playbacks.length; i++) {
|
|
205
|
-
const playback = playbacks[i];
|
|
206
|
-
|
|
207
|
-
if (playing && !playback.finished) {
|
|
208
|
-
playback.elapsed += time_delta_seconds * playback.clip.timeScale.getValue();
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
const repeats = playback.clip.repeatCount.getValue();
|
|
212
|
-
|
|
213
|
-
// `Infinity * duration` is `Infinity`, which no elapsed time reaches — so a looping
|
|
214
|
-
// clip takes the wrapping branch forever without a case of its own
|
|
215
|
-
const finished = playback.elapsed >= repeats * playback.duration;
|
|
216
|
-
|
|
217
|
-
playback.time = wrap_clip_time(playback.elapsed, playback.duration, !finished);
|
|
218
|
-
|
|
219
|
-
if (finished && !playback.finished) {
|
|
220
|
-
playback.finished = true;
|
|
221
|
-
|
|
222
|
-
this.#dataset.sendEvent(this.#entity, AnimationEventTypes.ClipEnded, playback.clip);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
#blend() {
|
|
228
|
-
const playbacks = this.playbacks;
|
|
229
|
-
const weights = this.weights;
|
|
230
|
-
|
|
231
|
-
weights.fill(0);
|
|
232
|
-
|
|
233
|
-
let total = 0;
|
|
234
|
-
|
|
235
|
-
for (let i = 0; i < playbacks.length; i++) {
|
|
236
|
-
total += playbacks[i].clip.weight.getValue();
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
for (let i = 0; i < playbacks.length; i++) {
|
|
240
|
-
const playback = playbacks[i];
|
|
241
|
-
|
|
242
|
-
// an author who weighted every clip at zero asked for silence, and gets it
|
|
243
|
-
playback.weight = total > 0 ? playback.clip.weight.getValue() / total : 0;
|
|
244
|
-
|
|
245
|
-
weights[playback.slot] += playback.weight;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* @param {ClipPlayback[]} playbacks
|
|
252
|
-
* @param {AnimationClip} clip
|
|
253
|
-
* @returns {ClipPlayback|null}
|
|
254
|
-
*/
|
|
255
|
-
function find_playback(playbacks, clip) {
|
|
256
|
-
for (let i = 0; i < playbacks.length; i++) {
|
|
257
|
-
if (playbacks[i].clip === clip) {
|
|
258
|
-
return playbacks[i];
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
return null;
|
|
263
|
-
}
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { AnimationEventTypes } from "../../graphics/ecs/animation/animator/AnimationEventTypes.js";
|
|
3
|
+
import { ClipPlayback } from "./ClipPlayback.js";
|
|
4
|
+
import { wrap_clip_time } from "./wrap_clip_time.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Plays one {@link Animation} component's list of clips against one model.
|
|
8
|
+
*
|
|
9
|
+
* **The component is reused as it stands**, unlike the graph's, which had to be restated because it
|
|
10
|
+
* *was* an `AnimationMixer`: `Animation` holds a name, a repeat count, a weight and a time scale per
|
|
11
|
+
* clip and no renderer handle of any kind. What the legacy system added to it — the mixer, its
|
|
12
|
+
* actions and their clocks — is what this replaces, and the clocks are here because the pose
|
|
13
|
+
* gameplay asks about has to come off the same clock the picture is drawn from (I-4).
|
|
14
|
+
*
|
|
15
|
+
* **Weights are shares of one pose.** Shade's accumulator adds up what every bound clip contributes
|
|
16
|
+
* and has no rest-pose term, so what reaches it is each clip's weight over the list's total —
|
|
17
|
+
* which is what three's mixer did too, by cumulative weight, and is why the game can author a walk
|
|
18
|
+
* clip at weight 1000 against an idle at 1 and mean "the walk".
|
|
19
|
+
*
|
|
20
|
+
* **A clip that has run out holds its last frame.** Three disabled a finished one-shot and let the
|
|
21
|
+
* rig fall back to its bind pose; there is no pose to fall back to here, and a list whose every clip
|
|
22
|
+
* has stopped contributing resolves each joint it drives to *zero* rather than to rest. So
|
|
23
|
+
* `AnimationClipFlag.ClampWhenFinished` decides nothing — holding is the only case — and it keeps
|
|
24
|
+
* deserializing (I-13) like `AnimationFlags.MeshSizeCulling`, whose 32 px² cull does not come across
|
|
25
|
+
* either: a clock camera framing can stop is a simulation camera framing can change (§2.6-2).
|
|
26
|
+
*/
|
|
27
|
+
export class ClipListPlayer {
|
|
28
|
+
/**
|
|
29
|
+
* The list being played. Every entry's `weight`, `timeScale` and `repeatCount` is read each
|
|
30
|
+
* tick, so changing one takes effect without removing and re-adding the clip.
|
|
31
|
+
*
|
|
32
|
+
* @type {Animation}
|
|
33
|
+
*/
|
|
34
|
+
component = null;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The entity's private copy of the model — where the clips named in the list are found, and
|
|
38
|
+
* where their durations come from.
|
|
39
|
+
*
|
|
40
|
+
* @type {SceneBundleInstance}
|
|
41
|
+
*/
|
|
42
|
+
instance = null;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* One per entry of {@link component}'s list, in the list's own order.
|
|
46
|
+
*
|
|
47
|
+
* @type {ClipPlayback[]}
|
|
48
|
+
*/
|
|
49
|
+
playbacks = [];
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* What each of the model's clips weighs, by the instance's own clip order — which is the order
|
|
53
|
+
* the animation manager's registration uses, so it is the lookup for both.
|
|
54
|
+
*
|
|
55
|
+
* A clip the list does not name weighs zero: `MeshSystem` registers every clip a model carries,
|
|
56
|
+
* and an unclaimed one would otherwise lay itself over the pose at full strength.
|
|
57
|
+
*
|
|
58
|
+
* @type {Float32Array}
|
|
59
|
+
*/
|
|
60
|
+
weights = new Float32Array(0);
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @type {number}
|
|
64
|
+
*/
|
|
65
|
+
#entity = -1;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @type {EntityComponentDataset}
|
|
69
|
+
*/
|
|
70
|
+
#dataset = null;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Names already reported as absent from this model, so the report is one line rather than one a
|
|
74
|
+
* frame. Cleared with the model, because the next one may well carry the name.
|
|
75
|
+
*
|
|
76
|
+
* @type {Set<string>}
|
|
77
|
+
*/
|
|
78
|
+
#reported_missing = new Set();
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @param {Animation} component
|
|
82
|
+
* @returns {ClipListPlayer}
|
|
83
|
+
*/
|
|
84
|
+
static from(component) {
|
|
85
|
+
assert.defined(component, 'component');
|
|
86
|
+
|
|
87
|
+
const r = new ClipListPlayer();
|
|
88
|
+
|
|
89
|
+
r.component = component;
|
|
90
|
+
|
|
91
|
+
return r;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Take up a model, and the entity whose events its clips fire as.
|
|
96
|
+
*
|
|
97
|
+
* Every playback is dropped, because the clips a playback was pointing at are not this model's.
|
|
98
|
+
*
|
|
99
|
+
* @param {number} entity
|
|
100
|
+
* @param {EntityComponentDataset} ecd
|
|
101
|
+
* @param {SceneBundleInstance} instance
|
|
102
|
+
*/
|
|
103
|
+
bind(entity, ecd, instance) {
|
|
104
|
+
assert.isNonNegativeInteger(entity, 'entity');
|
|
105
|
+
assert.defined(ecd, 'ecd');
|
|
106
|
+
assert.defined(instance, 'instance');
|
|
107
|
+
|
|
108
|
+
this.#entity = entity;
|
|
109
|
+
this.#dataset = ecd;
|
|
110
|
+
|
|
111
|
+
this.instance = instance;
|
|
112
|
+
this.playbacks = [];
|
|
113
|
+
this.weights = new Float32Array(instance.clips.length);
|
|
114
|
+
this.#reported_missing.clear();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Advance every clock, say so when one runs out, and work out what the list therefore weighs.
|
|
119
|
+
*
|
|
120
|
+
* Unconditional by design: §2.6-2's split puts pose evaluation and its events on the CPU
|
|
121
|
+
* precisely so that camera framing cannot decide whether a clip's end is ever reached.
|
|
122
|
+
*
|
|
123
|
+
* @param {number} time_delta_seconds
|
|
124
|
+
*/
|
|
125
|
+
tick(time_delta_seconds) {
|
|
126
|
+
this.#reconcile();
|
|
127
|
+
this.#advance(time_delta_seconds);
|
|
128
|
+
this.#blend();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Match the playbacks against the list, which the game edits while it runs —
|
|
133
|
+
* `StartAnimationBehavior` adds an entry, `StopAnimationBehavior` and `AnimationController`'s
|
|
134
|
+
* rules remove one. Identity is the match, so a clip stopped and started again is a new entry
|
|
135
|
+
* and plays from its own beginning.
|
|
136
|
+
*
|
|
137
|
+
* **A name the model has not got does not play, and says so once (D43).** Clip names are
|
|
138
|
+
* authored against models the game does not own and they do miss — the strategy map's buildings
|
|
139
|
+
* ask for `Take01` of a model whose clip is `Take 001`, and one that has no clips at all. This
|
|
140
|
+
* threw until D43, out of `AnimationSystem.update`, which cost *every* entity its animation on
|
|
141
|
+
* every frame for as long as one such entity existed. Reporting it per frame buries the console
|
|
142
|
+
* and reporting it not at all is how the mismatch survived the three path unnoticed, so it is
|
|
143
|
+
* said once per name, with the model's real clip list beside it.
|
|
144
|
+
*/
|
|
145
|
+
#reconcile() {
|
|
146
|
+
const clips = this.component.clips;
|
|
147
|
+
const playbacks = this.playbacks;
|
|
148
|
+
|
|
149
|
+
for (let i = playbacks.length - 1; i >= 0; i--) {
|
|
150
|
+
if (clips.indexOf(playbacks[i].clip) === -1) {
|
|
151
|
+
playbacks.splice(i, 1);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const available = this.instance.clips;
|
|
156
|
+
|
|
157
|
+
for (let i = 0; i < clips.length; i++) {
|
|
158
|
+
const clip = clips.get(i);
|
|
159
|
+
|
|
160
|
+
if (find_playback(playbacks, clip) !== null) {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const name = clip.name.getValue();
|
|
165
|
+
const slot = available.findIndex(c => c.name === name);
|
|
166
|
+
|
|
167
|
+
if (slot === -1) {
|
|
168
|
+
this.#report_missing(name, available);
|
|
169
|
+
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
playbacks.push(ClipPlayback.from(clip, slot, available[slot].duration));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Say once, per name, that this model has no such clip — and say what it does have, because the
|
|
179
|
+
* mismatch is nearly always spelling and the answer is in the list beside it.
|
|
180
|
+
*
|
|
181
|
+
* @param {string} name
|
|
182
|
+
* @param {ShadeAnimationClip[]} available
|
|
183
|
+
*/
|
|
184
|
+
#report_missing(name, available) {
|
|
185
|
+
if (this.#reported_missing.has(name)) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
this.#reported_missing.add(name);
|
|
190
|
+
|
|
191
|
+
console.warn(
|
|
192
|
+
`Animation clip '${name}' is not in the model of entity ${this.#entity}, so it does not `
|
|
193
|
+
+ `play. The model carries: ${available.map(c => `'${c.name}'`).join(', ')}`
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @param {number} time_delta_seconds
|
|
199
|
+
*/
|
|
200
|
+
#advance(time_delta_seconds) {
|
|
201
|
+
const playing = this.component.isPlaying;
|
|
202
|
+
const playbacks = this.playbacks;
|
|
203
|
+
|
|
204
|
+
for (let i = 0; i < playbacks.length; i++) {
|
|
205
|
+
const playback = playbacks[i];
|
|
206
|
+
|
|
207
|
+
if (playing && !playback.finished) {
|
|
208
|
+
playback.elapsed += time_delta_seconds * playback.clip.timeScale.getValue();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const repeats = playback.clip.repeatCount.getValue();
|
|
212
|
+
|
|
213
|
+
// `Infinity * duration` is `Infinity`, which no elapsed time reaches — so a looping
|
|
214
|
+
// clip takes the wrapping branch forever without a case of its own
|
|
215
|
+
const finished = playback.elapsed >= repeats * playback.duration;
|
|
216
|
+
|
|
217
|
+
playback.time = wrap_clip_time(playback.elapsed, playback.duration, !finished);
|
|
218
|
+
|
|
219
|
+
if (finished && !playback.finished) {
|
|
220
|
+
playback.finished = true;
|
|
221
|
+
|
|
222
|
+
this.#dataset.sendEvent(this.#entity, AnimationEventTypes.ClipEnded, playback.clip);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
#blend() {
|
|
228
|
+
const playbacks = this.playbacks;
|
|
229
|
+
const weights = this.weights;
|
|
230
|
+
|
|
231
|
+
weights.fill(0);
|
|
232
|
+
|
|
233
|
+
let total = 0;
|
|
234
|
+
|
|
235
|
+
for (let i = 0; i < playbacks.length; i++) {
|
|
236
|
+
total += playbacks[i].clip.weight.getValue();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
for (let i = 0; i < playbacks.length; i++) {
|
|
240
|
+
const playback = playbacks[i];
|
|
241
|
+
|
|
242
|
+
// an author who weighted every clip at zero asked for silence, and gets it
|
|
243
|
+
playback.weight = total > 0 ? playback.clip.weight.getValue() / total : 0;
|
|
244
|
+
|
|
245
|
+
weights[playback.slot] += playback.weight;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* @param {ClipPlayback[]} playbacks
|
|
252
|
+
* @param {AnimationClip} clip
|
|
253
|
+
* @returns {ClipPlayback|null}
|
|
254
|
+
*/
|
|
255
|
+
function find_playback(playbacks, clip) {
|
|
256
|
+
for (let i = 0; i < playbacks.length; i++) {
|
|
257
|
+
if (playbacks[i].clip === clip) {
|
|
258
|
+
return playbacks[i];
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* The `Animation` component says *what* to play — a name, a repeat count, a weight, a time scale —
|
|
5
5
|
* and holds no clock of its own, because it is data that a level authors and a save round-trips.
|
|
6
6
|
* This is the running half: where that clip is, how strongly it is contributing, and whether it has
|
|
7
|
-
* run out. {@link
|
|
7
|
+
* run out. {@link AnimationSystem} owns one per clip in the list and hands them out, because the
|
|
8
8
|
* pose a gameplay query has to answer from is exactly this (I-4) — never a readback.
|
|
9
9
|
*/
|
|
10
10
|
export class ClipPlayback {
|
|
@@ -52,7 +52,7 @@ export class ClipPlayback {
|
|
|
52
52
|
time: number;
|
|
53
53
|
/**
|
|
54
54
|
* The share of the pose this clip is contributing, normalized across every clip in the list —
|
|
55
|
-
* see {@link
|
|
55
|
+
* see {@link AnimationSystem}.
|
|
56
56
|
*
|
|
57
57
|
* @type {number}
|
|
58
58
|
*/
|