@woosh/meep-engine 3.43.0 → 3.45.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 (466) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/editor/prototypeEditorShell.d.ts.map +1 -1
  3. package/editor/prototypeEditorShell.js +4 -2
  4. package/package.json +1 -1
  5. package/src/core/collection/array/array_sort_insertion_ascending.d.ts +19 -0
  6. package/src/core/collection/array/array_sort_insertion_ascending.d.ts.map +1 -0
  7. package/src/core/collection/array/array_sort_insertion_ascending.js +31 -0
  8. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts +27 -0
  9. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts.map +1 -0
  10. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.js +39 -0
  11. package/src/core/geom/3d/aabb/aabb3_from_v3_array.d.ts.map +1 -1
  12. package/src/core/geom/3d/aabb/aabb3_from_v3_array.js +4 -1
  13. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts +2 -2
  14. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts.map +1 -1
  15. package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +1 -1
  16. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts +21 -0
  17. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts.map +1 -0
  18. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.js +36 -0
  19. package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts +25 -0
  20. package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts.map +1 -0
  21. package/src/core/geom/3d/pose/pose3_apply_point_array.js +40 -0
  22. package/src/core/geom/3d/pose/pose3_compose_array.d.ts +28 -0
  23. package/src/core/geom/3d/pose/pose3_compose_array.d.ts.map +1 -0
  24. package/src/core/geom/3d/pose/pose3_compose_array.js +41 -0
  25. package/src/core/geom/3d/pose/pose3_to_local_array.d.ts +29 -0
  26. package/src/core/geom/3d/pose/pose3_to_local_array.d.ts.map +1 -0
  27. package/src/core/geom/3d/pose/pose3_to_local_array.js +42 -0
  28. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts +28 -0
  29. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts.map +1 -0
  30. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.js +66 -0
  31. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts +22 -0
  32. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts.map +1 -0
  33. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.js +30 -0
  34. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts +23 -0
  35. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts.map +1 -0
  36. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.js +31 -0
  37. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts +26 -0
  38. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts.map +1 -0
  39. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.js +46 -0
  40. package/src/core/geom/vec3/v3_distance_array.d.ts +11 -0
  41. package/src/core/geom/vec3/v3_distance_array.d.ts.map +1 -0
  42. package/src/core/geom/vec3/v3_distance_array.js +19 -0
  43. package/src/core/geom/vec3/v3_normalize_array_checked.d.ts +23 -0
  44. package/src/core/geom/vec3/v3_normalize_array_checked.d.ts.map +1 -0
  45. package/src/core/geom/vec3/v3_normalize_array_checked.js +49 -0
  46. package/src/core/geom/vec3/v3_reject_array.d.ts +15 -0
  47. package/src/core/geom/vec3/v3_reject_array.d.ts.map +1 -0
  48. package/src/core/geom/vec3/v3_reject_array.js +32 -0
  49. package/src/core/graph/csr/csr_build_incidence.d.ts +26 -0
  50. package/src/core/graph/csr/csr_build_incidence.d.ts.map +1 -0
  51. package/src/core/graph/csr/csr_build_incidence.js +71 -0
  52. package/src/core/graph/csr/csr_graph_color_greedy.d.ts +25 -0
  53. package/src/core/graph/csr/csr_graph_color_greedy.d.ts.map +1 -0
  54. package/src/core/graph/csr/csr_graph_color_greedy.js +83 -0
  55. package/src/core/graph/csr/csr_graph_validate_coloring.d.ts +15 -0
  56. package/src/core/graph/csr/csr_graph_validate_coloring.d.ts.map +1 -0
  57. package/src/core/graph/csr/csr_graph_validate_coloring.js +33 -0
  58. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts +26 -0
  59. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts.map +1 -0
  60. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.js +71 -0
  61. package/src/core/math/max2_exact.d.ts +15 -0
  62. package/src/core/math/max2_exact.d.ts.map +1 -0
  63. package/src/core/math/max2_exact.js +30 -0
  64. package/src/core/math/min2_exact.d.ts +20 -0
  65. package/src/core/math/min2_exact.d.ts.map +1 -0
  66. package/src/core/math/min2_exact.js +35 -0
  67. package/src/engine/Clock.d.ts +15 -0
  68. package/src/engine/Clock.d.ts.map +1 -1
  69. package/src/engine/Clock.js +29 -5
  70. package/src/engine/Engine.d.ts.map +1 -1
  71. package/src/engine/Engine.js +11 -19
  72. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
  73. package/src/engine/ecs/ik/IKGoalSystem.js +3 -19
  74. package/src/engine/ecs/parent/parent_entity_model_of.d.ts +17 -0
  75. package/src/engine/ecs/parent/parent_entity_model_of.d.ts.map +1 -0
  76. package/src/engine/ecs/parent/parent_entity_model_of.js +26 -0
  77. package/src/engine/ecs/transform/t64_read_pose_array.d.ts +15 -0
  78. package/src/engine/ecs/transform/t64_read_pose_array.d.ts.map +1 -0
  79. package/src/engine/ecs/transform/t64_read_pose_array.js +24 -0
  80. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts +57 -0
  81. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts.map +1 -0
  82. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.js +84 -0
  83. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts +2 -0
  84. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts.map +1 -1
  85. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.js +10 -21
  86. package/src/engine/graphics3/AnimationGraphSystem.d.ts +28 -13
  87. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  88. package/src/engine/graphics3/AnimationGraphSystem.js +107 -64
  89. package/src/engine/graphics3/AnimationSystem.d.ts +29 -15
  90. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  91. package/src/engine/graphics3/AnimationSystem.js +112 -61
  92. package/src/engine/graphics3/MeshSkinSystem.d.ts +56 -0
  93. package/src/engine/graphics3/MeshSkinSystem.d.ts.map +1 -0
  94. package/src/engine/graphics3/MeshSkinSystem.js +317 -0
  95. package/src/engine/graphics3/MeshSystem.d.ts +15 -35
  96. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  97. package/src/engine/graphics3/MeshSystem.js +21 -298
  98. package/src/engine/graphics3/RowChains.d.ts +76 -0
  99. package/src/engine/graphics3/RowChains.d.ts.map +1 -0
  100. package/src/engine/graphics3/RowChains.js +347 -0
  101. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -0
  102. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  103. package/src/engine/graphics3/ShadedGeometrySystem.js +329 -309
  104. package/src/engine/graphics3/animation/AnimationClips.d.ts +56 -0
  105. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -0
  106. package/src/engine/graphics3/animation/AnimationClips.js +79 -0
  107. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +13 -14
  108. package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
  109. package/src/engine/graphics3/animation/ClipListPlayer.js +262 -263
  110. package/src/engine/graphics3/animation/write_clip_playback.d.ts +3 -3
  111. package/src/engine/graphics3/animation/write_clip_playback.js +4 -4
  112. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +5 -0
  113. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  114. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +80 -75
  115. package/src/engine/graphics3/prefab/PrefabInstance.d.ts +4 -24
  116. package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -1
  117. package/src/engine/graphics3/prefab/PrefabInstance.js +60 -80
  118. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +16 -3
  119. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  120. package/src/engine/graphics3/prefab/prefab_instantiate.js +49 -12
  121. package/src/engine/graphics3/prefab/prefab_place.d.ts +31 -17
  122. package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -1
  123. package/src/engine/graphics3/prefab/prefab_place.js +175 -130
  124. package/src/engine/graphics3/register_clips.d.ts +93 -0
  125. package/src/engine/graphics3/register_clips.d.ts.map +1 -0
  126. package/src/engine/graphics3/register_clips.js +166 -0
  127. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +9 -0
  128. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
  129. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -1
  130. package/src/engine/physics/cloth/MEASUREMENTS.md +795 -0
  131. package/src/engine/physics/cloth/PLAN.md +349 -17
  132. package/src/engine/physics/cloth/build/ClothProxy.d.ts +113 -61
  133. package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -1
  134. package/src/engine/physics/cloth/build/ClothProxy.js +142 -77
  135. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +44 -0
  136. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -0
  137. package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +107 -0
  138. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +43 -30
  139. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  140. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +371 -284
  141. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts +62 -0
  142. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -0
  143. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +275 -0
  144. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +7 -0
  145. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
  146. package/src/engine/physics/cloth/collider/ClothColliderIndex.js +85 -67
  147. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -1
  148. package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +19 -101
  149. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts +2 -5
  150. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts.map +1 -1
  151. package/src/engine/physics/cloth/collider/cloth_collider_pack.js +7 -15
  152. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +1 -1
  153. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -1
  154. package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +17 -62
  155. package/src/engine/physics/cloth/ecs/Cloth.d.ts +17 -9
  156. package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
  157. package/src/engine/physics/cloth/ecs/Cloth.js +220 -212
  158. package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts +0 -1
  159. package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +6 -19
  160. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +1 -2
  161. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  162. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +3 -12
  163. package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +6 -0
  164. package/src/engine/physics/cloth/ecs/ClothHold.d.ts +91 -0
  165. package/src/engine/physics/cloth/ecs/ClothHold.d.ts.map +1 -0
  166. package/src/engine/physics/cloth/ecs/ClothHold.js +103 -0
  167. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +254 -48
  168. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  169. package/src/engine/physics/cloth/ecs/ClothInstance.js +277 -47
  170. package/src/engine/physics/cloth/ecs/ClothPin.d.ts +73 -0
  171. package/src/engine/physics/cloth/ecs/ClothPin.d.ts.map +1 -0
  172. package/src/engine/physics/cloth/ecs/ClothPin.js +92 -0
  173. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts +36 -0
  174. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts.map +1 -0
  175. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.js +61 -0
  176. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +23 -17
  177. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
  178. package/src/engine/physics/cloth/ecs/ClothRig.js +29 -27
  179. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +12 -14
  180. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  181. package/src/engine/physics/cloth/ecs/ClothSystem.js +20 -15
  182. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +57 -36
  183. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  184. package/src/engine/physics/cloth/ecs/ClothWorld.js +754 -207
  185. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +12 -13
  186. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
  187. package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +20 -14
  188. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +63 -11
  189. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  190. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +297 -101
  191. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +9 -7
  192. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
  193. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +12 -10
  194. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +3 -3
  195. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
  196. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +60 -120
  197. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +37 -0
  198. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -0
  199. package/src/engine/physics/cloth/ecs/cloth_geodesic.js +135 -0
  200. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts +97 -0
  201. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -0
  202. package/src/engine/physics/cloth/ecs/cloth_holds.js +583 -0
  203. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +2 -2
  204. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
  205. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +168 -51
  206. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +17 -22
  207. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  208. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +55 -117
  209. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -6
  210. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  211. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +51 -42
  212. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +5 -0
  213. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  214. package/src/engine/physics/cloth/ecs/cloth_write_back.js +62 -50
  215. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
  216. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +65 -58
  217. package/src/engine/physics/cloth/playground/cloth_playground_build.d.ts.map +1 -1
  218. package/src/engine/physics/cloth/playground/cloth_playground_build.js +2 -3
  219. package/src/engine/physics/cloth/playground/collide_main.js +3 -29
  220. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
  221. package/src/engine/physics/cloth/playground/garment_build.js +17 -5
  222. package/src/engine/physics/cloth/playground/garment_main.js +5 -20
  223. package/src/engine/physics/cloth/playground/main.js +6 -48
  224. package/src/engine/physics/cloth/playground/rig_build.d.ts.map +1 -1
  225. package/src/engine/physics/cloth/playground/rig_build.js +302 -296
  226. package/src/engine/physics/cloth/playground/rig_main.js +947 -955
  227. package/src/engine/physics/cloth/playground/wind_main.js +8 -7
  228. package/src/engine/physics/cloth/solver/ClothState.d.ts +45 -7
  229. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  230. package/src/engine/physics/cloth/solver/ClothState.js +79 -83
  231. package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts +10 -8
  232. package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts.map +1 -1
  233. package/src/engine/physics/cloth/solver/cloth_color_particles.js +30 -102
  234. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +6 -1
  235. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
  236. package/src/engine/physics/cloth/solver/cloth_contact_find.js +9 -3
  237. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts +114 -0
  238. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -0
  239. package/src/engine/physics/cloth/solver/cloth_hold_line.js +350 -0
  240. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts +21 -0
  241. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts.map +1 -0
  242. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.js +45 -0
  243. package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts +32 -0
  244. package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts.map +1 -0
  245. package/src/engine/physics/cloth/solver/cloth_particle_coupling.js +133 -0
  246. package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts +16 -0
  247. package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts.map +1 -0
  248. package/src/engine/physics/cloth/solver/cloth_particle_of_source.js +19 -0
  249. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +6 -2
  250. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
  251. package/src/engine/physics/cloth/solver/cloth_self_find.js +19 -68
  252. package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
  253. package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +30 -65
  254. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +24 -12
  255. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  256. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +24 -12
  257. package/src/engine/physics/cloth/solver/cloth_step.d.ts +16 -0
  258. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  259. package/src/engine/physics/cloth/solver/cloth_step.js +189 -48
  260. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +1 -0
  261. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
  262. package/src/engine/physics/cloth/solver/cloth_step_instance.js +12 -6
  263. package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts +21 -0
  264. package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts.map +1 -0
  265. package/src/engine/physics/cloth/solver/cloth_stretch_residual.js +54 -0
  266. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts +15 -0
  267. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts.map +1 -1
  268. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.js +28 -0
  269. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts +30 -0
  270. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts.map +1 -0
  271. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.js +56 -0
  272. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
  273. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +3 -17
  274. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts +1 -1
  275. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts.map +1 -1
  276. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.js +353 -346
  277. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +7 -5
  278. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
  279. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +7 -5
  280. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +2 -1
  281. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
  282. package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -25
  283. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +12 -10
  284. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
  285. package/src/engine/physics/cloth/wind/cloth_sample_air.js +60 -82
  286. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
  287. package/src/engine/physics/ecs/ContactProbeSystem.js +2 -18
  288. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  289. package/src/engine/physics/ecs/PhysicsSystem.js +9 -50
  290. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  291. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts +24 -0
  292. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts.map +1 -0
  293. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.js +42 -0
  294. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts +25 -0
  295. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts.map +1 -0
  296. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.js +40 -0
  297. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -1
  298. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +40 -90
  299. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
  300. package/src/engine/physics/narrowphase/capsule_contacts.js +3 -5
  301. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
  302. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +2 -14
  303. package/src/engine/physics/narrowphase/hull_sphere_contact.d.ts.map +1 -1
  304. package/src/engine/physics/narrowphase/hull_sphere_contact.js +2 -5
  305. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  306. package/src/engine/physics/narrowphase/narrowphase_step.js +13 -32
  307. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -1
  308. package/src/engine/physics/narrowphase/sphere_box_contact.js +2 -5
  309. package/src/engine/simulation/Ticker.d.ts +13 -0
  310. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  311. package/src/engine/simulation/Ticker.js +43 -8
  312. package/src/format/texture/basis/transcode/etc1s_to_astc.d.ts.map +1 -1
  313. package/src/format/texture/basis/transcode/etc1s_to_astc.js +2 -1
  314. package/src/shade/RENDERER_CONTRACT.md +8 -2
  315. package/src/shade/playground/image_decode_bench/main.js +2 -1
  316. package/src/shade/playground/mesh_row_ceiling/main.js +2 -1
  317. package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.d.ts.map +1 -1
  318. package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.js +2 -1
  319. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  320. package/src/shade/playground/skinned_blas_refit/main.js +11 -19
  321. package/src/shade/playground/skinned_blas_refit/place_character.d.ts +6 -3
  322. package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
  323. package/src/shade/playground/skinned_blas_refit/place_character.js +90 -90
  324. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  325. package/src/shade/playground/skinned_mesh_soup/main.js +502 -509
  326. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
  327. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +2 -1
  328. package/src/shade/playground/ssr_variance/statistics.d.ts.map +1 -1
  329. package/src/shade/playground/ssr_variance/statistics.js +2 -1
  330. package/src/shade/playground/texture_encode/README.md +129 -109
  331. package/src/shade/playground/texture_encode/main.d.ts.map +1 -1
  332. package/src/shade/playground/texture_encode/main.js +1431 -1430
  333. package/src/shade/playground/volumetrics_froxel/measure.d.ts.map +1 -1
  334. package/src/shade/playground/volumetrics_froxel/measure.js +2 -1
  335. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +45 -14
  336. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  337. package/src/shade/renderer/animation/GPUAnimationManager.js +316 -64
  338. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +5 -0
  339. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  340. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -1
  341. package/src/shade/renderer/buffer/table/gpu_database_check_links.d.ts.map +1 -1
  342. package/src/shade/renderer/buffer/table/gpu_database_check_links.js +2 -1
  343. package/src/shade/renderer/geometry/BoxGeometry.d.ts +1 -11
  344. package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
  345. package/src/shade/renderer/geometry/BoxGeometry.js +6 -13
  346. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts +19 -0
  347. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts.map +1 -0
  348. package/src/shade/renderer/geometry/CapsuleGeometry.js +24 -0
  349. package/src/shade/renderer/geometry/ConeGeometry.d.ts +20 -0
  350. package/src/shade/renderer/geometry/ConeGeometry.d.ts.map +1 -0
  351. package/src/shade/renderer/geometry/ConeGeometry.js +33 -0
  352. package/src/shade/renderer/geometry/CylinderGeometry.d.ts +21 -0
  353. package/src/shade/renderer/geometry/CylinderGeometry.d.ts.map +1 -0
  354. package/src/shade/renderer/geometry/CylinderGeometry.js +35 -0
  355. package/src/shade/renderer/geometry/PlaneGeometry.d.ts +17 -0
  356. package/src/shade/renderer/geometry/PlaneGeometry.d.ts.map +1 -0
  357. package/src/shade/renderer/geometry/PlaneGeometry.js +22 -0
  358. package/src/shade/renderer/geometry/TorusGeometry.d.ts +18 -0
  359. package/src/shade/renderer/geometry/TorusGeometry.d.ts.map +1 -0
  360. package/src/shade/renderer/geometry/TorusGeometry.js +23 -0
  361. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts +21 -0
  362. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts.map +1 -0
  363. package/src/shade/renderer/geometry/UVSphereGeometry.js +34 -0
  364. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts +19 -0
  365. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts.map +1 -0
  366. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.js +205 -0
  367. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts +21 -0
  368. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts.map +1 -0
  369. package/src/shade/renderer/geometry/primitives/make_cone_geometry.js +36 -0
  370. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts +1 -1
  371. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts.map +1 -1
  372. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +44 -9
  373. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts +20 -0
  374. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts.map +1 -0
  375. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.js +190 -0
  376. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -1
  377. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +3 -2
  378. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -1
  379. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +2 -1
  380. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -1
  381. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +2 -1
  382. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -1
  383. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +2 -1
  384. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -1
  385. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +3 -2
  386. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -1
  387. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.js +2 -1
  388. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
  389. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +2 -1
  390. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  391. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +3 -2
  392. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  393. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -2
  394. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +26 -8
  395. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
  396. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +56 -39
  397. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +7 -0
  398. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  399. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +46 -4
  400. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.d.ts.map +1 -1
  401. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js +4 -2
  402. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +2 -2
  403. package/src/shade/renderer/gpu_primitive/sort/defs.js +79 -79
  404. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +1 -1
  405. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  406. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +7 -3
  407. package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
  408. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +4 -3
  409. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
  410. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +200 -194
  411. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  412. package/src/shade/renderer/particles/graph_particles.js +6 -2
  413. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -1
  414. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +3 -2
  415. package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -1
  416. package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +334 -329
  417. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  418. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +7 -2
  419. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  420. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +16 -4
  421. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +2444 -2345
  422. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -1
  423. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +312 -310
  424. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +3 -3
  425. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -1
  426. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +383 -375
  427. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -1
  428. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +349 -346
  429. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts +58 -0
  430. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts.map +1 -0
  431. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.js +536 -0
  432. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +21 -7
  433. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -1
  434. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +291 -327
  435. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts +25 -0
  436. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts.map +1 -0
  437. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.js +99 -0
  438. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +5 -3
  439. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -1
  440. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +47 -71
  441. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts +10 -0
  442. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts.map +1 -0
  443. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.js +50 -0
  444. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +4 -5
  445. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
  446. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +7 -8
  447. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
  448. package/src/shade/renderer/water/chunk_water_transport.js +7 -5
  449. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  450. package/src/shade/renderer/water/medium/GPUWaterBodies.js +8 -2
  451. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +3 -2
  452. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  453. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +3 -2
  454. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  455. package/src/shade/renderer/water/shader_water.js +3 -1
  456. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -1
  457. package/src/shade/renderer/water/surface/GPUWaterSurface.js +3 -1
  458. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  459. package/src/shade/renderer/water/surface/graph_water_tessellation.js +11 -4
  460. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  461. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +37 -20
  462. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  463. package/src/shade/wgsl/validate_wgsl_source.js +74 -3
  464. package/src/engine/graphics3/register_instance_animation.d.ts +0 -114
  465. package/src/engine/graphics3/register_instance_animation.d.ts.map +0 -1
  466. package/src/engine/graphics3/register_instance_animation.js +0 -201
@@ -1,309 +1,329 @@
1
- import { assert } from "../../core/assert.js";
2
- import { System } from "../ecs/System.js";
3
- import { Transform64 } from "../ecs/transform/Transform64.js";
4
- import { TRANSFORM64_EVENT_CHANGE } from "../ecs/transform/TRANSFORM64_EVENT_CHANGE.js";
5
- import { TRANSFORM_ATTACHMENT_EVENT_CHANGE } from "../ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js";
6
- import { SHADED_GEOMETRY_EVENT_CHANGE } from "../graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.js";
7
- import { ShadedGeometry } from "../graphics/ecs/mesh-v2/ShadedGeometry.js";
8
- import { ShadedGeometryFlags } from "../graphics/ecs/mesh-v2/ShadedGeometryFlags.js";
9
-
10
- /**
11
- * @typedef {import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
12
- * @typedef {import("./GraphicsEngine.js").GraphicsEngine} GraphicsEngine
13
- * @typedef {import("../../shade/renderer/scene/Scene.js").Scene} Scene
14
- */
15
-
16
- /**
17
- * One primitive's place in the scene database, and what is listening on its behalf.
18
- */
19
- class Entry {
20
- /**
21
- * @type {number}
22
- */
23
- entity = -1;
24
-
25
- /**
26
- * @type {ShadedGeometry}
27
- */
28
- geometry = null;
29
-
30
- /**
31
- * The GPU context the entity's rows are held in, or null while there is no device — before
32
- * the first start, and again after a stop.
33
- *
34
- * @type {GPUSceneContext|null}
35
- */
36
- context = null;
37
-
38
- /**
39
- * @type {function(): void}
40
- */
41
- on_world_changed = null;
42
-
43
- /**
44
- * @type {function(): void}
45
- */
46
- on_local_changed = null;
47
- }
48
-
49
- /**
50
- * Gives one primitive its rows in the scene database, and keeps them where the entity says.
51
- *
52
- * **The component and the row are the same shape, which is the whole reason this system is short.**
53
- * `ShadedGeometry` is a geometry, a material and a flat transform — *"not a hierarchical data
54
- * structure"*, in its own docblock — and a `meshes` row is a geometry, a material and the
55
- * `transforms` row it draws under. The entity is both rows, at `entity + 1`: the system
56
- * `attach_mesh`es it and marks it when the entity moves, and the scene database's flush writes what
57
- * the CPU owns.
58
- *
59
- * **What it is not is a model.** A model file is many primitives arranged in a hierarchy, and in an
60
- * ECS a hierarchy is entities — one per node, attached to their parents, each carrying its own
61
- * `ShadedGeometry` where it draws. `MeshSystem` is the layer that spawns a loaded file as those
62
- * entities (a prefab); this system never sees the file, only the primitives that came out of it,
63
- * and cannot tell them from primitives some tool built by hand. A primitive a skin deforms says so
64
- * on its component ({@link ShadedGeometryFlags.Skinned}) and draws a per-instance clone the
65
- * skinning pass writes; the skin itself is the model's business.
66
- *
67
- * **Rows need a device.** A primitive linked before the renderer has started, or after it has been
68
- * replaced, waits: {@link update} notices the scene's GPU context arriving or changing and attaches
69
- * everything it holds to it. Nothing about the entity is lost meanwhile — the component and the
70
- * transform are the truth, and the rows are written from them.
71
- */
72
- export class ShadedGeometrySystem extends System {
73
- /**
74
- * @type {GraphicsEngine}
75
- */
76
- #graphics;
77
-
78
- /**
79
- * @type {Scene}
80
- */
81
- #scene;
82
-
83
- /**
84
- * @type {Map<number, Entry>}
85
- */
86
- #entries = new Map();
87
-
88
- /**
89
- * Shade's GPU state for {@link scene}, as of the last {@link update}. A change means every
90
- * row this system held is void and every primitive is attached again.
91
- *
92
- * @type {GPUSceneContext|null}
93
- */
94
- #context = null;
95
-
96
- /**
97
- * Entries not yet attached to {@link #context} — linked while there was no device, or since a
98
- * restart. A queue rather than a scan, because the answer is almost always "nothing to do".
99
- *
100
- * @type {Entry[]}
101
- */
102
- #unattached = [];
103
-
104
- /**
105
- * @param {GraphicsEngine} graphics
106
- * @param {Scene} scene
107
- */
108
- constructor(graphics, scene) {
109
- super();
110
-
111
- assert.defined(graphics, 'graphics');
112
- assert.defined(scene, 'scene');
113
-
114
- this.#graphics = graphics;
115
- this.#scene = scene;
116
-
117
- this.dependencies = [ShadedGeometry, Transform64];
118
- }
119
-
120
- /**
121
- * @returns {Scene}
122
- */
123
- get scene() {
124
- return this.#scene;
125
- }
126
-
127
- async startup(entityManager) {
128
- this.entityManager = entityManager;
129
-
130
- // the scene's rows are this dataset's entities; the first system to place one says so
131
- const dataset = entityManager.dataset;
132
- const scene = this.#scene;
133
-
134
- assert.ok(
135
- scene.dataset === null || scene.dataset === undefined || scene.dataset === dataset,
136
- 'the scene is bound to another dataset'
137
- );
138
-
139
- scene.dataset = dataset;
140
- }
141
-
142
- async shutdown(entityManager) {
143
- for (const entity of Array.from(this.#entries.keys())) {
144
- this.#drop(entity);
145
- }
146
-
147
- this.#context = null;
148
- this.#unattached.length = 0;
149
- }
150
-
151
- /**
152
- * Attach what arrived since the last frame, and everything again after a renderer restart.
153
- *
154
- * @param {number} time_delta_seconds
155
- */
156
- update(time_delta_seconds) {
157
- const context = this.#graphics.scene_context(this.#scene);
158
-
159
- if (context === null) {
160
- // No device — before the first start, or after a stop. Nothing holds rows while this
161
- // holds, and the next context to arrive is a change like any other.
162
- return;
163
- }
164
-
165
- if (context !== this.#context) {
166
- this.#context = context;
167
-
168
- const waiting = this.#unattached;
169
-
170
- waiting.length = 0;
171
-
172
- for (const entry of this.#entries.values()) {
173
- entry.context = null;
174
-
175
- waiting.push(entry);
176
- }
177
- }
178
-
179
- const waiting = this.#unattached;
180
-
181
- for (let i = 0; i < waiting.length; i++) {
182
- this.#attach(waiting[i], context);
183
- }
184
-
185
- waiting.length = 0;
186
- }
187
-
188
- /**
189
- * @param {ShadedGeometry} geometry
190
- * @param {Transform64} transform
191
- * @param {number} entity
192
- */
193
- link(geometry, transform, entity) {
194
- // the component's own bounds query reads the transform through this
195
- geometry.__c_transform = transform;
196
- geometry.__entity = entity;
197
-
198
- const entry = new Entry();
199
-
200
- entry.entity = entity;
201
- entry.geometry = geometry;
202
-
203
- // Marked when the entity moves rather than placed on a poll: an entity that has not moved
204
- // costs nothing, which is the same bargain the scene database makes downstream. A
205
- // Transform64 has no signals of its own, so the announcement comes from the dataset. The
206
- // world event says the entity's pose moved; the attachment event says its offset from its
207
- // parent did — which is what its row holds when the parent has a row of its own.
208
- entry.on_world_changed = () => {
209
- if (entry.context !== null) {
210
- entry.context.rows.mark_world(entity);
211
- }
212
- };
213
-
214
- entry.on_local_changed = () => {
215
- if (entry.context !== null) {
216
- entry.context.rows.mark_local(entity);
217
- }
218
- };
219
-
220
- // The component changed in place — a material swapped, most often — and the row is
221
- // rewritten from it. Same geometry, same clone: a skinned primitive fading out keeps the
222
- // vertex region the skinning pass is deforming.
223
- entry.on_changed = () => {
224
- if (entry.context !== null) {
225
- this.#attach(entry, entry.context);
226
- }
227
- };
228
-
229
- const dataset = this.entityManager.dataset;
230
-
231
- dataset.addEntityEventListener(entity, TRANSFORM64_EVENT_CHANGE, entry.on_world_changed);
232
- dataset.addEntityEventListener(entity, TRANSFORM_ATTACHMENT_EVENT_CHANGE, entry.on_local_changed);
233
- dataset.addEntityEventListener(entity, SHADED_GEOMETRY_EVENT_CHANGE, entry.on_changed);
234
-
235
- this.#entries.set(entity, entry);
236
-
237
- const context = this.#context;
238
-
239
- if (context !== null && context === this.#graphics.scene_context(this.#scene)) {
240
- this.#attach(entry, context);
241
- } else {
242
- this.#unattached.push(entry);
243
- }
244
- }
245
-
246
- /**
247
- * @param {ShadedGeometry} geometry
248
- * @param {Transform64} transform
249
- * @param {number} entity
250
- */
251
- unlink(geometry, transform, entity) {
252
- geometry.__c_transform = null;
253
- geometry.__entity = -1;
254
-
255
- this.#drop(entity);
256
- }
257
-
258
- /**
259
- * Give the primitive its rows in a context.
260
- *
261
- * @param {Entry} entry
262
- * @param {GPUSceneContext} context
263
- */
264
- #attach(entry, context) {
265
- const geometry = entry.geometry;
266
-
267
- context.rows.attach_mesh(
268
- entry.entity,
269
- geometry.geometry,
270
- geometry.material,
271
- geometry.getFlag(ShadedGeometryFlags.Skinned)
272
- );
273
-
274
- entry.context = context;
275
- }
276
-
277
- /**
278
- * @param {number} entity
279
- */
280
- #drop(entity) {
281
- const entry = this.#entries.get(entity);
282
-
283
- if (entry === undefined) {
284
- return;
285
- }
286
-
287
- this.#entries.delete(entity);
288
-
289
- const dataset = this.entityManager.dataset;
290
-
291
- dataset.removeEntityEventListener(entity, TRANSFORM64_EVENT_CHANGE, entry.on_world_changed);
292
- dataset.removeEntityEventListener(entity, TRANSFORM_ATTACHMENT_EVENT_CHANGE, entry.on_local_changed);
293
- dataset.removeEntityEventListener(entity, SHADED_GEOMETRY_EVENT_CHANGE, entry.on_changed);
294
-
295
- const waiting = this.#unattached.indexOf(entry);
296
-
297
- if (waiting !== -1) {
298
- this.#unattached.splice(waiting, 1);
299
- }
300
-
301
- // A context that has been replaced took its rows with it; only the one that is running
302
- // is handed anything back.
303
- if (entry.context !== null && entry.context === this.#graphics.scene_context(this.#scene)) {
304
- entry.context.rows.detach_mesh(entity);
305
- }
306
-
307
- entry.context = null;
308
- }
309
- }
1
+ import { assert } from "../../core/assert.js";
2
+ import { System } from "../ecs/System.js";
3
+ import { Transform64 } from "../ecs/transform/Transform64.js";
4
+ import { TRANSFORM64_EVENT_CHANGE } from "../ecs/transform/TRANSFORM64_EVENT_CHANGE.js";
5
+ import { SHADED_GEOMETRY_EVENT_CHANGE } from "../graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.js";
6
+ import { ShadedGeometry } from "../graphics/ecs/mesh-v2/ShadedGeometry.js";
7
+ import { ShadedGeometryFlags } from "../graphics/ecs/mesh-v2/ShadedGeometryFlags.js";
8
+ import { RowChains } from "./RowChains.js";
9
+
10
+ /**
11
+ * @typedef {import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
12
+ * @typedef {import("./GraphicsEngine.js").GraphicsEngine} GraphicsEngine
13
+ * @typedef {import("../../shade/renderer/scene/Scene.js").Scene} Scene
14
+ */
15
+
16
+ /**
17
+ * One primitive's place in the scene database, and what is listening on its behalf.
18
+ */
19
+ class Entry {
20
+ /**
21
+ * @type {number}
22
+ */
23
+ entity = -1;
24
+
25
+ /**
26
+ * @type {ShadedGeometry}
27
+ */
28
+ geometry = null;
29
+
30
+ /**
31
+ * The GPU context the entity's rows are held in, or null while there is no device — before
32
+ * the first start, and again after a stop.
33
+ *
34
+ * @type {GPUSceneContext|null}
35
+ */
36
+ context = null;
37
+
38
+ /**
39
+ * @type {function(): void}
40
+ */
41
+ on_world_changed = null;
42
+
43
+ /**
44
+ * @type {function(): void}
45
+ */
46
+ on_changed = null;
47
+ }
48
+
49
+ /**
50
+ * Gives one primitive its rows in the scene database, and keeps them where the entity says.
51
+ *
52
+ * **The component and the row are the same shape, which is the whole reason this system is short.**
53
+ * `ShadedGeometry` is a geometry, a material and a flat transform — *"not a hierarchical data
54
+ * structure"*, in its own docblock — and a `meshes` row is a geometry, a material and the
55
+ * `transforms` row it draws under. The entity is both rows, at `entity + 1`: the system
56
+ * `attach_mesh`es it and marks it when the entity moves, and the scene database's flush writes what
57
+ * the CPU owns.
58
+ *
59
+ * **What it is not is a model.** A model file is many primitives arranged in a hierarchy, and in an
60
+ * ECS a hierarchy is entities — one per node, attached to their parents, each carrying its own
61
+ * `ShadedGeometry` where it draws. `MeshSystem` is the layer that spawns a loaded file as those
62
+ * entities (a prefab); this system never sees the file, only the primitives that came out of it,
63
+ * and cannot tell them from primitives some tool built by hand. A primitive a skin deforms says so
64
+ * on its component ({@link ShadedGeometryFlags.Skinned}) and draws a per-instance clone the
65
+ * skinning pass writes; the skin itself is the model's business.
66
+ *
67
+ * **A primitive holds the rows of everything it hangs from** ({@link RowChains}). Under a parent
68
+ * with no row it would carry its CPU world under the scene root, which stops moving the moment a
69
+ * clip drives a node above it — a rigid head under an animated tag is the common case. Holding the
70
+ * chain lets the GPU compose it from the top, and holds the tag's row, without which the clip never
71
+ * binds.
72
+ *
73
+ * **Rows need a device.** A primitive linked before the renderer has started, or after it has been
74
+ * replaced, waits: {@link update} notices the scene's GPU context arriving or changing and attaches
75
+ * everything it holds to it. Nothing about the entity is lost meanwhile — the component and the
76
+ * transform are the truth, and the rows are written from them.
77
+ */
78
+ export class ShadedGeometrySystem extends System {
79
+ /**
80
+ * @type {GraphicsEngine}
81
+ */
82
+ #graphics;
83
+
84
+ /**
85
+ * @type {Scene}
86
+ */
87
+ #scene;
88
+
89
+ /**
90
+ * @type {Map<number, Entry>}
91
+ */
92
+ #entries = new Map();
93
+
94
+ /**
95
+ * Shade's GPU state for {@link scene}, as of the last {@link update}. A change means every
96
+ * row this system held is void and every primitive is attached again.
97
+ *
98
+ * @type {GPUSceneContext|null}
99
+ */
100
+ #context = null;
101
+
102
+ /**
103
+ * Entries not yet attached to {@link #context} — linked while there was no device, or since a
104
+ * restart. A queue rather than a scan, because the answer is almost always "nothing to do".
105
+ *
106
+ * @type {Entry[]}
107
+ */
108
+ #unattached = [];
109
+
110
+ /**
111
+ * Each primitive's chain: its own row and the rows of the entities above it, followed as they
112
+ * move. Null until the system has a dataset.
113
+ *
114
+ * @type {RowChains|null}
115
+ */
116
+ #chains = null;
117
+
118
+ /**
119
+ * @param {GraphicsEngine} graphics
120
+ * @param {Scene} scene
121
+ */
122
+ constructor(graphics, scene) {
123
+ super();
124
+
125
+ assert.defined(graphics, 'graphics');
126
+ assert.defined(scene, 'scene');
127
+
128
+ this.#graphics = graphics;
129
+ this.#scene = scene;
130
+
131
+ this.dependencies = [ShadedGeometry, Transform64];
132
+ }
133
+
134
+ /**
135
+ * @returns {Scene}
136
+ */
137
+ get scene() {
138
+ return this.#scene;
139
+ }
140
+
141
+ async startup(entityManager) {
142
+ this.entityManager = entityManager;
143
+
144
+ // the scene's rows are this dataset's entities; the first system to place one says so
145
+ const dataset = entityManager.dataset;
146
+ const scene = this.#scene;
147
+
148
+ assert.ok(
149
+ scene.dataset === null || scene.dataset === undefined || scene.dataset === dataset,
150
+ 'the scene is bound to another dataset'
151
+ );
152
+
153
+ scene.dataset = dataset;
154
+
155
+ this.#chains = new RowChains(dataset);
156
+ }
157
+
158
+ async shutdown(entityManager) {
159
+ for (const entity of Array.from(this.#entries.keys())) {
160
+ this.#drop(entity);
161
+ }
162
+
163
+ this.#chains.destroy();
164
+ this.#chains = null;
165
+
166
+ this.#context = null;
167
+ this.#unattached.length = 0;
168
+ }
169
+
170
+ /**
171
+ * Attach what arrived since the last frame, and everything again after a renderer restart.
172
+ *
173
+ * @param {number} time_delta_seconds
174
+ */
175
+ update(time_delta_seconds) {
176
+ const context = this.#graphics.scene_context(this.#scene);
177
+
178
+ if (context === null) {
179
+ // No device — before the first start, or after a stop. Nothing holds rows while this
180
+ // holds, and the next context to arrive is a change like any other.
181
+ this.#chains.bind(null);
182
+
183
+ return;
184
+ }
185
+
186
+ if (context !== this.#context) {
187
+ this.#context = context;
188
+
189
+ // the chains first, so that a primitive attached below finds its parents' rows there
190
+ this.#chains.bind(context.rows);
191
+
192
+ const waiting = this.#unattached;
193
+
194
+ waiting.length = 0;
195
+
196
+ for (const entry of this.#entries.values()) {
197
+ entry.context = null;
198
+
199
+ waiting.push(entry);
200
+ }
201
+ }
202
+
203
+ const waiting = this.#unattached;
204
+
205
+ for (let i = 0; i < waiting.length; i++) {
206
+ this.#attach(waiting[i], context);
207
+ }
208
+
209
+ waiting.length = 0;
210
+ }
211
+
212
+ /**
213
+ * @param {ShadedGeometry} geometry
214
+ * @param {Transform64} transform
215
+ * @param {number} entity
216
+ */
217
+ link(geometry, transform, entity) {
218
+ // the component's own bounds query reads the transform through this
219
+ geometry.__c_transform = transform;
220
+ geometry.__entity = entity;
221
+
222
+ const entry = new Entry();
223
+
224
+ entry.entity = entity;
225
+ entry.geometry = geometry;
226
+
227
+ // Marked when the entity moves rather than placed on a poll: an entity that has not moved
228
+ // costs nothing, which is the same bargain the scene database makes downstream. A
229
+ // Transform64 has no signals of its own, so the announcement comes from the dataset. The
230
+ // world event says the entity's pose moved, which for a primitive composed under a parent's
231
+ // row is its place in the scene's tree; its offset from the parent is the chain's to follow.
232
+ entry.on_world_changed = () => {
233
+ if (entry.context !== null) {
234
+ entry.context.rows.mark_world(entity);
235
+ }
236
+ };
237
+
238
+ // The component changed in place — a material swapped, most often — and the row is
239
+ // rewritten from it. Same geometry, same clone: a skinned primitive fading out keeps the
240
+ // vertex region the skinning pass is deforming.
241
+ entry.on_changed = () => {
242
+ if (entry.context !== null) {
243
+ this.#attach(entry, entry.context);
244
+ }
245
+ };
246
+
247
+ const dataset = this.entityManager.dataset;
248
+
249
+ dataset.addEntityEventListener(entity, TRANSFORM64_EVENT_CHANGE, entry.on_world_changed);
250
+ dataset.addEntityEventListener(entity, SHADED_GEOMETRY_EVENT_CHANGE, entry.on_changed);
251
+
252
+ this.#entries.set(entity, entry);
253
+
254
+ this.#chains.hold(entity);
255
+
256
+ const context = this.#context;
257
+
258
+ if (context !== null && context === this.#graphics.scene_context(this.#scene)) {
259
+ this.#attach(entry, context);
260
+ } else {
261
+ this.#unattached.push(entry);
262
+ }
263
+ }
264
+
265
+ /**
266
+ * @param {ShadedGeometry} geometry
267
+ * @param {Transform64} transform
268
+ * @param {number} entity
269
+ */
270
+ unlink(geometry, transform, entity) {
271
+ geometry.__c_transform = null;
272
+ geometry.__entity = -1;
273
+
274
+ this.#drop(entity);
275
+ }
276
+
277
+ /**
278
+ * Give the primitive its rows in a context.
279
+ *
280
+ * @param {Entry} entry
281
+ * @param {GPUSceneContext} context
282
+ */
283
+ #attach(entry, context) {
284
+ const geometry = entry.geometry;
285
+
286
+ context.rows.attach_mesh(
287
+ entry.entity,
288
+ geometry.geometry,
289
+ geometry.material,
290
+ geometry.getFlag(ShadedGeometryFlags.Skinned)
291
+ );
292
+
293
+ entry.context = context;
294
+ }
295
+
296
+ /**
297
+ * @param {number} entity
298
+ */
299
+ #drop(entity) {
300
+ const entry = this.#entries.get(entity);
301
+
302
+ if (entry === undefined) {
303
+ return;
304
+ }
305
+
306
+ this.#entries.delete(entity);
307
+
308
+ const dataset = this.entityManager.dataset;
309
+
310
+ dataset.removeEntityEventListener(entity, TRANSFORM64_EVENT_CHANGE, entry.on_world_changed);
311
+ dataset.removeEntityEventListener(entity, SHADED_GEOMETRY_EVENT_CHANGE, entry.on_changed);
312
+
313
+ const waiting = this.#unattached.indexOf(entry);
314
+
315
+ if (waiting !== -1) {
316
+ this.#unattached.splice(waiting, 1);
317
+ }
318
+
319
+ // A context that has been replaced took its rows with it; only the one that is running
320
+ // is handed anything back.
321
+ if (entry.context !== null && entry.context === this.#graphics.scene_context(this.#scene)) {
322
+ entry.context.rows.detach_mesh(entity);
323
+ }
324
+
325
+ entry.context = null;
326
+
327
+ this.#chains.release(entity);
328
+ }
329
+ }