@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.
Files changed (401) hide show
  1. package/README.md +14 -18
  2. package/editor/SelectionVisualizer.js +127 -127
  3. package/editor/entity_world_bounds.js +27 -27
  4. package/editor/particles/rebuildParticleEmitter.js +31 -31
  5. package/editor/process/SymbolicDisplayProcess.js +1 -1
  6. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  7. package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
  8. package/editor/prototypeEditorShell.js +156 -156
  9. package/editor/selection/editor_pick.js +130 -130
  10. package/editor/selection/screen_rect_frustum.js +119 -119
  11. package/editor/tools/v2/TransformControls.js +971 -971
  12. package/package.json +1 -1
  13. package/src/engine/Engine.d.ts +3 -3
  14. package/src/engine/Engine.d.ts.map +1 -1
  15. package/src/engine/Engine.js +726 -726
  16. package/src/engine/EngineHarness.d.ts +1 -1
  17. package/src/engine/EngineHarness.js +590 -590
  18. package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
  19. package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
  20. package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
  21. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
  22. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  23. package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
  24. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
  25. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
  26. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
  27. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
  28. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
  29. package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
  30. package/src/engine/graphics/ecs/water/Water.js +104 -104
  31. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
  32. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
  33. package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
  34. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
  35. package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
  36. package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
  37. package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
  38. package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
  39. package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
  40. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
  41. package/src/engine/graphics3/AnimationSystem.js +352 -0
  42. package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
  43. package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
  44. package/src/engine/graphics3/AnimationSystem3.js +6 -348
  45. package/src/engine/graphics3/CameraSystem.d.ts +49 -0
  46. package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
  47. package/src/engine/graphics3/CameraSystem.js +170 -0
  48. package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
  49. package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
  50. package/src/engine/graphics3/CameraSystem3.js +6 -166
  51. package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
  52. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
  53. package/src/engine/graphics3/DebugDrawSystem.js +205 -0
  54. package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
  55. package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
  56. package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
  57. package/src/engine/graphics3/DecalSystem.d.ts +81 -0
  58. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
  59. package/src/engine/graphics3/DecalSystem.js +441 -0
  60. package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
  61. package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
  62. package/src/engine/graphics3/DecalSystem3.js +6 -437
  63. package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
  64. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
  65. package/src/engine/graphics3/FogOfWarSystem.js +265 -0
  66. package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
  67. package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
  68. package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
  69. package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
  70. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
  71. package/src/engine/graphics3/GraphicsEngine.js +790 -0
  72. package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
  73. package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
  74. package/src/engine/graphics3/GraphicsEngine3.js +6 -786
  75. package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
  76. package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
  77. package/src/engine/graphics3/HighlightSystem.js +241 -0
  78. package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
  79. package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
  80. package/src/engine/graphics3/HighlightSystem3.js +6 -237
  81. package/src/engine/graphics3/LightSystem.d.ts +40 -0
  82. package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
  83. package/src/engine/graphics3/LightSystem.js +211 -0
  84. package/src/engine/graphics3/LightSystem3.d.ts +6 -36
  85. package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
  86. package/src/engine/graphics3/LightSystem3.js +6 -207
  87. package/src/engine/graphics3/MeshSystem.d.ts +106 -0
  88. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
  89. package/src/engine/graphics3/MeshSystem.js +647 -0
  90. package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
  91. package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
  92. package/src/engine/graphics3/MeshSystem3.js +6 -642
  93. package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
  94. package/src/engine/graphics3/ParticipatingMedia.js +203 -203
  95. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
  96. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
  97. package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
  98. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
  99. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
  100. package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
  101. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
  102. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
  103. package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
  104. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
  105. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
  106. package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
  107. package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
  108. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
  109. package/src/engine/graphics3/PathDisplaySystem.js +309 -0
  110. package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
  111. package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
  112. package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
  113. package/src/engine/graphics3/Pickable.d.ts +1 -1
  114. package/src/engine/graphics3/Pickable.js +65 -65
  115. package/src/engine/graphics3/PickingQuery.d.ts +1 -1
  116. package/src/engine/graphics3/PickingQuery.js +48 -48
  117. package/src/engine/graphics3/PickingSystem.d.ts +67 -0
  118. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
  119. package/src/engine/graphics3/PickingSystem.js +273 -0
  120. package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
  121. package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
  122. package/src/engine/graphics3/PickingSystem3.js +6 -269
  123. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
  124. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
  125. package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
  126. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
  127. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
  128. package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
  129. package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
  130. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
  131. package/src/engine/graphics3/TerrainSystem.js +566 -0
  132. package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
  133. package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
  134. package/src/engine/graphics3/TerrainSystem3.js +6 -562
  135. package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
  136. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
  137. package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
  138. package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
  139. package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
  140. package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
  141. package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
  142. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
  143. package/src/engine/graphics3/Trail3DSystem.js +221 -0
  144. package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
  145. package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
  146. package/src/engine/graphics3/Trail3DSystem3.js +6 -217
  147. package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
  148. package/src/engine/graphics3/VolumetricLightMap.js +2 -2
  149. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
  150. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
  151. package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
  152. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
  153. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
  154. package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
  155. package/src/engine/graphics3/WaterSystem.d.ts +59 -0
  156. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
  157. package/src/engine/graphics3/WaterSystem.js +293 -0
  158. package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
  159. package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
  160. package/src/engine/graphics3/WaterSystem3.js +6 -289
  161. package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
  162. package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
  163. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
  164. package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
  165. package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
  166. package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
  167. package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
  168. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
  169. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
  170. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  171. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
  172. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
  173. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
  174. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
  175. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
  176. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  177. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  178. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
  179. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
  180. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
  181. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
  182. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  183. package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
  184. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  185. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
  186. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  187. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  188. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
  189. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  190. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
  191. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  192. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
  193. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
  194. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
  195. package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
  196. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
  197. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  198. package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
  199. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
  201. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  202. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
  203. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  204. package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
  205. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  206. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
  207. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  208. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
  209. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  210. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
  211. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  212. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
  213. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  214. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
  215. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  216. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
  217. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  218. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +0 -1
  219. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
  220. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  221. package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
  222. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
  223. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  224. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
  225. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
  226. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
  227. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  228. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
  229. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  230. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
  231. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  232. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
  233. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
  234. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
  235. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  236. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
  237. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
  238. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
  239. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
  240. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  241. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  242. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
  243. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  244. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
  245. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  246. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
  247. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  248. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
  249. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  250. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
  251. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  252. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
  253. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
  254. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  255. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
  256. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
  257. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
  258. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
  259. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  260. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +4 -7
  261. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
  262. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  263. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
  264. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
  265. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
  266. package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
  267. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  268. package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
  269. package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
  270. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  271. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
  272. package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
  273. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  274. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
  275. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  276. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
  277. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  278. package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
  279. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  280. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
  281. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  282. package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
  283. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
  284. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
  285. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
  286. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  287. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
  288. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  289. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
  290. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  291. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
  292. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
  293. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
  294. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  295. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
  296. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  297. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
  298. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  299. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
  300. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
  301. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
  302. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
  303. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +2 -2
  304. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  305. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
  306. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
  307. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
  308. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  309. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +0 -1
  310. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  311. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
  312. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  313. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
  314. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
  315. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
  316. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  317. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
  318. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  319. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
  320. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
  321. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
  322. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
  323. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
  324. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  325. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
  326. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  327. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
  328. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  329. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
  330. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  331. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
  332. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  333. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
  334. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  335. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
  336. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
  337. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
  338. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  339. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
  340. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
  341. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
  342. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
  343. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
  344. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  345. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
  346. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
  347. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  348. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
  349. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  350. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
  351. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  352. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
  353. package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
  354. package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
  355. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
  356. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
  357. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
  358. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
  359. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
  360. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
  361. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
  362. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
  363. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  364. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
  365. package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
  366. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  367. package/src/shade/renderer/shader/ComputeShader.js +350 -296
  368. package/src/shade/renderer/shader/ImageShader.js +217 -217
  369. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
  370. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  371. package/src/shade/renderer/shader/ShaderDescriptor.js +20 -0
  372. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
  373. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
  374. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
  375. package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
  376. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
  377. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
  378. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
  379. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  380. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
  381. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
  382. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  383. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +12 -15
  384. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +3 -2
  385. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  386. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +3 -2
  387. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
  388. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  389. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
  390. package/src/shade/renderer/water/shader_water.js +246 -246
  391. package/src/shade/vitest.setup.mjs +1 -1
  392. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
  393. package/src/view/minimap/Minimap.d.ts +2 -2
  394. package/src/view/minimap/Minimap.d.ts.map +1 -1
  395. package/src/view/minimap/Minimap.js +225 -225
  396. package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
  397. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  398. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  399. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
  400. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
  401. 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: `MeshSystem3` registers every clip a model carries,
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: `MeshSystem3` 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 `AnimationSystem3.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
- }
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 AnimationSystem3} owns one per clip in the list and hands them out, because the
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 AnimationSystem3}.
55
+ * see {@link AnimationSystem}.
56
56
  *
57
57
  * @type {number}
58
58
  */