@woosh/meep-engine 3.23.0 → 3.25.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 (812) hide show
  1. package/editor/entity_world_bounds.d.ts +9 -3
  2. package/editor/entity_world_bounds.d.ts.map +1 -1
  3. package/editor/entity_world_bounds.js +61 -4
  4. package/package.json +1 -1
  5. package/src/core/binary/allocator/OffsetAllocator.d.ts +40 -2
  6. package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
  7. package/src/core/binary/allocator/OffsetAllocator.js +124 -29
  8. package/src/core/collection/map/u32_index.d.ts +83 -0
  9. package/src/core/collection/map/u32_index.d.ts.map +1 -0
  10. package/src/core/collection/map/u32_index.js +247 -0
  11. package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.d.ts +2 -2
  12. package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.js +2 -2
  13. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts +1 -2
  14. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts.map +1 -1
  15. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.js +4 -12
  16. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +55 -0
  17. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -0
  18. package/src/engine/ecs/gpu/GPUStateAuthority.js +72 -0
  19. package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts +40 -0
  20. package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts.map +1 -0
  21. package/src/engine/ecs/gpu/GPUStateAuthorityFlags.js +79 -0
  22. package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts +18 -0
  23. package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts.map +1 -0
  24. package/src/engine/ecs/gpu/gpu_authority_assert_cpu.js +27 -0
  25. package/src/engine/ecs/gpu/gpu_authority_declare.d.ts +23 -0
  26. package/src/engine/ecs/gpu/gpu_authority_declare.d.ts.map +1 -0
  27. package/src/engine/ecs/gpu/gpu_authority_declare.js +39 -0
  28. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +15 -0
  29. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -0
  30. package/src/engine/ecs/gpu/gpu_authority_grant.js +38 -0
  31. package/src/engine/ecs/gpu/gpu_authority_has.d.ts +18 -0
  32. package/src/engine/ecs/gpu/gpu_authority_has.d.ts.map +1 -0
  33. package/src/engine/ecs/gpu/gpu_authority_has.js +28 -0
  34. package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts +24 -0
  35. package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts.map +1 -0
  36. package/src/engine/ecs/gpu/gpu_authority_revoke.js +49 -0
  37. package/src/engine/ecs/ik/IKProblem.d.ts +14 -0
  38. package/src/engine/ecs/ik/IKProblem.d.ts.map +1 -1
  39. package/src/engine/ecs/ik/IKProblem.js +16 -0
  40. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +1 -1
  41. package/src/engine/ecs/ik/InverseKinematicsSystem.js +19 -0
  42. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +2 -2
  43. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +2 -2
  44. package/src/engine/ecs/ik/ik_bone_chain.d.ts +11 -2
  45. package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +1 -1
  46. package/src/engine/ecs/ik/ik_bone_chain.js +47 -2
  47. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
  48. package/src/engine/ecs/ik/ik_write_local_rotation.js +6 -0
  49. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  50. package/src/engine/ecs/speaker/VoiceSystem.js +6 -0
  51. package/src/engine/ecs/transform/T64WorldCache.d.ts +50 -0
  52. package/src/engine/ecs/transform/T64WorldCache.d.ts.map +1 -0
  53. package/src/engine/ecs/transform/T64WorldCache.js +139 -0
  54. package/src/engine/ecs/transform/t64_evaluate_world.d.ts +31 -0
  55. package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -0
  56. package/src/engine/ecs/transform/t64_evaluate_world.js +126 -0
  57. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts +8 -0
  58. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
  59. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +59 -30
  60. package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.d.ts.map +1 -1
  61. package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.js +4 -11
  62. package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts +14 -0
  63. package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts.map +1 -0
  64. package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.js +13 -0
  65. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +2 -14
  66. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts.map +1 -1
  67. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +11 -21
  68. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.d.ts +1 -0
  69. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +7 -0
  70. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts +5 -6
  71. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts.map +1 -1
  72. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.js +13 -11
  73. package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts +14 -0
  74. package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts.map +1 -0
  75. package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.js +21 -0
  76. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +1 -1
  77. package/src/engine/graphics/ecs/particles/ParticleEffect.js +1 -1
  78. package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.d.ts +1 -1
  79. package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +1 -1
  80. package/src/engine/graphics3/AnimationGraphSystem.js +3 -3
  81. package/src/engine/graphics3/AnimationSystem.js +2 -2
  82. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
  83. package/src/engine/graphics3/DebugDrawSystem.js +2 -4
  84. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +34 -27
  85. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  86. package/src/engine/graphics3/GPUParticleEmitterSystem.js +185 -85
  87. package/src/engine/graphics3/HighlightOutlineSystem.d.ts +4 -3
  88. package/src/engine/graphics3/HighlightOutlineSystem.d.ts.map +1 -1
  89. package/src/engine/graphics3/HighlightOutlineSystem.js +7 -9
  90. package/src/engine/graphics3/LightSystem.d.ts +7 -5
  91. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  92. package/src/engine/graphics3/LightSystem.js +36 -22
  93. package/src/engine/graphics3/MeshSystem.d.ts +43 -39
  94. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  95. package/src/engine/graphics3/MeshSystem.js +324 -331
  96. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -1
  97. package/src/engine/graphics3/PathDisplaySystem.js +2 -4
  98. package/src/engine/graphics3/PickingQuery.d.ts +15 -21
  99. package/src/engine/graphics3/PickingQuery.d.ts.map +1 -1
  100. package/src/engine/graphics3/PickingQuery.js +21 -25
  101. package/src/engine/graphics3/PickingSystem.d.ts +60 -31
  102. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
  103. package/src/engine/graphics3/PickingSystem.js +413 -273
  104. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +22 -12
  105. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  106. package/src/engine/graphics3/ShadedGeometrySystem.js +309 -174
  107. package/src/engine/graphics3/TerrainSystem.d.ts +19 -11
  108. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
  109. package/src/engine/graphics3/TerrainSystem.js +102 -53
  110. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -1
  111. package/src/engine/graphics3/TooltipComponentSystem.js +2 -14
  112. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
  113. package/src/engine/graphics3/Trail3DSystem.js +2 -4
  114. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +4 -4
  115. package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
  116. package/src/engine/graphics3/animation/ClipListPlayer.js +2 -2
  117. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +9 -11
  118. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  119. package/src/engine/graphics3/highlight/pack_highlight_table.js +11 -18
  120. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +4 -3
  121. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  122. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +75 -74
  123. package/src/engine/graphics3/prefab/Prefab.d.ts +130 -0
  124. package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -0
  125. package/src/engine/graphics3/prefab/Prefab.js +162 -0
  126. package/src/engine/graphics3/prefab/PrefabInstance.d.ts +72 -0
  127. package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -0
  128. package/src/engine/graphics3/prefab/PrefabInstance.js +80 -0
  129. package/src/engine/graphics3/prefab/prefab_compile.d.ts +23 -0
  130. package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -0
  131. package/src/engine/graphics3/prefab/prefab_compile.js +334 -0
  132. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +46 -0
  133. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -0
  134. package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -0
  135. package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts +70 -0
  136. package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts.map +1 -0
  137. package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.js +210 -0
  138. package/src/engine/graphics3/prefab/prefab_place.d.ts +60 -0
  139. package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -0
  140. package/src/engine/graphics3/prefab/prefab_place.js +130 -0
  141. package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts +60 -0
  142. package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts.map +1 -0
  143. package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.js +128 -0
  144. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts +40 -0
  145. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -0
  146. package/src/engine/graphics3/prefab/prefab_skin_frame.js +116 -0
  147. package/src/engine/graphics3/preview/make_model_preview_scene.d.ts +16 -14
  148. package/src/engine/graphics3/preview/make_model_preview_scene.d.ts.map +1 -1
  149. package/src/engine/graphics3/preview/make_model_preview_scene.js +126 -154
  150. package/src/engine/graphics3/preview/make_model_thumbnail.js +1 -1
  151. package/src/engine/graphics3/register_instance_animation.d.ts +6 -6
  152. package/src/engine/graphics3/register_instance_animation.d.ts.map +1 -1
  153. package/src/engine/graphics3/register_instance_animation.js +4 -4
  154. package/src/engine/graphics3/shade_bundle_bounds.d.ts +2 -6
  155. package/src/engine/graphics3/shade_bundle_bounds.d.ts.map +1 -1
  156. package/src/engine/graphics3/shade_bundle_bounds.js +47 -55
  157. package/src/engine/graphics3/shader_picking_gather.d.ts +40 -0
  158. package/src/engine/graphics3/shader_picking_gather.d.ts.map +1 -0
  159. package/src/engine/graphics3/shader_picking_gather.js +120 -0
  160. package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts +11 -18
  161. package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts.map +1 -1
  162. package/src/engine/graphics3/terrain/pack_terrain_row_table.js +48 -53
  163. package/src/engine/physics/cloth/MEASUREMENTS.md +1050 -0
  164. package/src/engine/physics/cloth/PLAN.md +411 -49
  165. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +17 -2
  166. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  167. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +284 -256
  168. package/src/engine/physics/cloth/ecs/ClothColliderSerializationAdapter.d.ts +52 -0
  169. package/src/engine/physics/cloth/ecs/ClothColliderSerializationAdapter.d.ts.map +1 -0
  170. package/src/engine/physics/cloth/ecs/ClothColliderSerializationAdapter.js +70 -0
  171. package/src/engine/physics/cloth/ecs/ClothDynamics.d.ts +12 -3
  172. package/src/engine/physics/cloth/ecs/ClothDynamics.d.ts.map +1 -1
  173. package/src/engine/physics/cloth/ecs/ClothDynamics.js +340 -331
  174. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +49 -37
  175. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  176. package/src/engine/physics/cloth/ecs/ClothInstance.js +50 -37
  177. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +7 -8
  178. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
  179. package/src/engine/physics/cloth/ecs/ClothRig.js +7 -8
  180. package/src/engine/physics/cloth/ecs/ClothSerializationAdapter.d.ts +84 -0
  181. package/src/engine/physics/cloth/ecs/ClothSerializationAdapter.d.ts.map +1 -0
  182. package/src/engine/physics/cloth/ecs/ClothSerializationAdapter.js +141 -0
  183. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +51 -81
  184. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  185. package/src/engine/physics/cloth/ecs/ClothSystem.js +81 -870
  186. package/src/engine/physics/cloth/ecs/ClothWorkerCore.d.ts +48 -0
  187. package/src/engine/physics/cloth/ecs/ClothWorkerCore.d.ts.map +1 -0
  188. package/src/engine/physics/cloth/ecs/ClothWorkerCore.js +107 -0
  189. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +286 -0
  190. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -0
  191. package/src/engine/physics/cloth/ecs/ClothWorld.js +1104 -0
  192. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +182 -0
  193. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -0
  194. package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +562 -0
  195. package/src/engine/physics/cloth/ecs/cloth.worker.d.ts +2 -0
  196. package/src/engine/physics/cloth/ecs/cloth.worker.d.ts.map +1 -0
  197. package/src/engine/physics/cloth/ecs/cloth.worker.js +12 -0
  198. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  199. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +2 -1
  200. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +58 -0
  201. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
  202. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +341 -271
  203. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +20 -2
  204. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
  205. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +39 -15
  206. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +19 -23
  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 +201 -199
  209. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  210. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +8 -0
  211. package/src/engine/physics/cloth/ecs/cloth_worker_protocol.d.ts +29 -0
  212. package/src/engine/physics/cloth/ecs/cloth_worker_protocol.d.ts.map +1 -0
  213. package/src/engine/physics/cloth/ecs/cloth_worker_protocol.js +78 -0
  214. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts +18 -34
  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 +58 -115
  217. package/src/engine/physics/cloth/ecs/makeClothWorker.d.ts +17 -0
  218. package/src/engine/physics/cloth/ecs/makeClothWorker.d.ts.map +1 -0
  219. package/src/engine/physics/cloth/ecs/makeClothWorker.js +18 -0
  220. package/src/engine/physics/cloth/playground/README.md +84 -13
  221. package/src/engine/physics/cloth/playground/garment_build.d.ts +0 -1
  222. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
  223. package/src/engine/physics/cloth/playground/garment_build.js +64 -58
  224. package/src/engine/physics/cloth/playground/garment_main.js +59 -33
  225. package/src/engine/physics/cloth/playground/wind.html +166 -0
  226. package/src/engine/physics/cloth/playground/wind_build.d.ts +81 -0
  227. package/src/engine/physics/cloth/playground/wind_build.d.ts.map +1 -0
  228. package/src/engine/physics/cloth/playground/wind_build.js +141 -0
  229. package/src/engine/physics/cloth/playground/wind_main.d.ts +2 -0
  230. package/src/engine/physics/cloth/playground/wind_main.d.ts.map +1 -0
  231. package/src/engine/physics/cloth/playground/wind_main.js +681 -0
  232. package/src/engine/physics/cloth/solver/ClothState.d.ts +134 -79
  233. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  234. package/src/engine/physics/cloth/solver/ClothState.js +273 -12
  235. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +33 -0
  236. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  237. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +34 -0
  238. package/src/engine/physics/cloth/solver/cloth_step.d.ts +21 -2
  239. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  240. package/src/engine/physics/cloth/solver/cloth_step.js +173 -4
  241. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +40 -0
  242. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -0
  243. package/src/engine/physics/cloth/solver/cloth_step_instance.js +284 -0
  244. package/src/engine/physics/cloth/solver/cloth_wind_accelerate.d.ts +107 -0
  245. package/src/engine/physics/cloth/solver/cloth_wind_accelerate.d.ts.map +1 -0
  246. package/src/engine/physics/cloth/solver/cloth_wind_accelerate.js +263 -0
  247. package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts +88 -0
  248. package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts.map +1 -0
  249. package/src/engine/physics/cloth/wind/AbstractClothWind.js +100 -0
  250. package/src/engine/physics/cloth/wind/ClothAmbientWind.d.ts +85 -0
  251. package/src/engine/physics/cloth/wind/ClothAmbientWind.d.ts.map +1 -0
  252. package/src/engine/physics/cloth/wind/ClothAmbientWind.js +182 -0
  253. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +79 -0
  254. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -0
  255. package/src/engine/physics/cloth/wind/ClothFluidWind.js +210 -0
  256. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +101 -0
  257. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -0
  258. package/src/engine/physics/cloth/wind/cloth_sample_air.js +290 -0
  259. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  260. package/src/shade/RENDERER_CONTRACT.md +85 -53
  261. package/src/shade/device/ShadeGPUCommandContext.d.ts +23 -0
  262. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  263. package/src/shade/device/ShadeGPUCommandContext.js +36 -0
  264. package/src/shade/device/mock/texture_copy.d.ts.map +1 -1
  265. package/src/shade/device/mock/texture_copy.js +28 -0
  266. package/src/shade/playground/add_random_meshes.d.ts +4 -4
  267. package/src/shade/playground/add_random_meshes.d.ts.map +1 -1
  268. package/src/shade/playground/add_random_meshes.js +20 -16
  269. package/src/shade/playground/avboit/main.d.ts +1 -0
  270. package/src/shade/playground/avboit/main.d.ts.map +1 -1
  271. package/src/shade/playground/avboit/main.js +916 -875
  272. package/src/shade/playground/basis_textures/main.d.ts.map +1 -1
  273. package/src/shade/playground/basis_textures/main.js +22 -8
  274. package/src/shade/playground/basis_textures/texture_inventory.d.ts +2 -2
  275. package/src/shade/playground/basis_textures/texture_inventory.d.ts.map +1 -1
  276. package/src/shade/playground/basis_textures/texture_inventory.js +6 -7
  277. package/src/shade/playground/ground_seam/main.d.ts.map +1 -1
  278. package/src/shade/playground/ground_seam/main.js +13 -4
  279. package/src/shade/playground/ground_seam/make_ground.d.ts +13 -4
  280. package/src/shade/playground/ground_seam/make_ground.d.ts.map +1 -1
  281. package/src/shade/playground/ground_seam/make_ground.js +21 -16
  282. package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
  283. package/src/shade/playground/particle_system/main.js +11 -10
  284. package/src/shade/playground/particle_system/particle_prototype.d.ts +15 -10
  285. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
  286. package/src/shade/playground/particle_system/particle_prototype.js +56 -15
  287. package/src/shade/playground/particle_system/particle_scene.d.ts +68 -28
  288. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  289. package/src/shade/playground/particle_system/particle_scene.js +149 -53
  290. package/src/shade/playground/readback_crossover/index.html +41 -0
  291. package/src/shade/playground/readback_crossover/main.d.ts +2 -0
  292. package/src/shade/playground/readback_crossover/main.d.ts.map +1 -0
  293. package/src/shade/playground/readback_crossover/main.js +372 -0
  294. package/src/shade/playground/skinned_blas_refit/README.md +11 -7
  295. package/src/shade/playground/skinned_blas_refit/add_floor.d.ts +13 -44
  296. package/src/shade/playground/skinned_blas_refit/add_floor.d.ts.map +1 -1
  297. package/src/shade/playground/skinned_blas_refit/add_floor.js +19 -59
  298. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  299. package/src/shade/playground/skinned_blas_refit/main.js +67 -58
  300. package/src/shade/playground/skinned_blas_refit/place_character.d.ts +40 -54
  301. package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
  302. package/src/shade/playground/skinned_blas_refit/place_character.js +47 -74
  303. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts +3 -3
  304. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
  305. package/src/shade/playground/skinned_blas_refit/sweep_views.js +4 -3
  306. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +3 -3
  307. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
  308. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +11 -4
  309. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
  310. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +38 -9
  311. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +3 -3
  312. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  313. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +9 -6
  314. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +3 -3
  315. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
  316. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +3 -3
  317. package/src/shade/playground/skinned_mesh_soup/README.md +6 -6
  318. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  319. package/src/shade/playground/skinned_mesh_soup/main.js +44 -102
  320. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +5 -5
  321. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
  322. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +42 -33
  323. package/src/shade/playground/sponza_path_trace/main.d.ts +1 -0
  324. package/src/shade/playground/sponza_path_trace/main.d.ts.map +1 -1
  325. package/src/shade/playground/sponza_path_trace/main.js +393 -363
  326. package/src/shade/playground/ssr_reprojection/main.js +11 -9
  327. package/src/shade/playground/ssr_reprojection/scene.d.ts +15 -4
  328. package/src/shade/playground/ssr_reprojection/scene.d.ts.map +1 -1
  329. package/src/shade/playground/ssr_reprojection/scene.js +32 -11
  330. package/src/shade/playground/ssr_variance/main.js +1 -1
  331. package/src/shade/playground/ssr_variance/scene.d.ts +10 -4
  332. package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -1
  333. package/src/shade/playground/ssr_variance/scene.js +39 -15
  334. package/src/shade/playground/vgeo_runtime/README.md +94 -0
  335. package/src/shade/playground/vgeo_runtime/index.html +62 -0
  336. package/src/shade/playground/vgeo_runtime/main.d.ts +2 -0
  337. package/src/shade/playground/vgeo_runtime/main.d.ts.map +1 -0
  338. package/src/shade/playground/vgeo_runtime/main.js +399 -0
  339. package/src/shade/playground/vgeo_viewer/main.js +6 -2
  340. package/src/shade/playground/vgeo_viewer/sample_asset.js +1 -1
  341. package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
  342. package/src/shade/playground/volumetrics_froxel/main.js +936 -922
  343. package/src/shade/renderer/GraphicsContext.d.ts +7 -0
  344. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  345. package/src/shade/renderer/GraphicsContext.js +11 -0
  346. package/src/shade/renderer/Renderer.d.ts +3 -2
  347. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  348. package/src/shade/renderer/Renderer.js +3 -2
  349. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +39 -47
  350. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  351. package/src/shade/renderer/animation/GPUAnimationManager.js +319 -256
  352. package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts +26 -22
  353. package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts.map +1 -1
  354. package/src/shade/renderer/animation/ShadeAnimationChannel.js +28 -23
  355. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +14 -6
  356. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
  357. package/src/shade/renderer/animation/ShadeAnimationClip.js +20 -8
  358. package/src/shade/renderer/animation/Skin.d.ts +19 -19
  359. package/src/shade/renderer/animation/Skin.d.ts.map +1 -1
  360. package/src/shade/renderer/animation/Skin.js +15 -13
  361. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +6 -5
  362. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  363. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +9 -9
  364. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +5 -59
  365. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -1
  366. package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +8 -132
  367. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +65 -62
  368. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  369. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +148 -194
  370. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  371. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +4 -7
  372. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +2 -2
  373. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +2 -2
  374. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts +74 -0
  375. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts.map +1 -0
  376. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.js +240 -0
  377. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +14 -0
  378. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  379. package/src/shade/renderer/buffer/table/GPUDatabase.js +64 -6
  380. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts +190 -0
  381. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts.map +1 -0
  382. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.js +1323 -0
  383. package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts +10 -0
  384. package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts.map +1 -1
  385. package/src/shade/renderer/buffer/table/GPUPageMetadata.js +12 -0
  386. package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts +15 -0
  387. package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts.map +1 -0
  388. package/src/shade/renderer/buffer/table/GPUReadbackStatus.js +34 -0
  389. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +75 -7
  390. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  391. package/src/shade/renderer/buffer/table/GPUTypedTable.js +518 -135
  392. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts +19 -0
  393. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts.map +1 -0
  394. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.js +18 -0
  395. package/src/shade/renderer/buffer/table/WordViews.d.ts +39 -0
  396. package/src/shade/renderer/buffer/table/WordViews.d.ts.map +1 -0
  397. package/src/shade/renderer/buffer/table/WordViews.js +62 -0
  398. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts +27 -0
  399. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts.map +1 -0
  400. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.js +117 -0
  401. package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts +121 -0
  402. package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts.map +1 -0
  403. package/src/shade/renderer/buffer/table/serde/generate_record_writer.js +395 -0
  404. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  405. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +70 -20
  406. package/src/shade/renderer/camera/Camera.d.ts +14 -0
  407. package/src/shade/renderer/camera/Camera.d.ts.map +1 -1
  408. package/src/shade/renderer/camera/Camera.js +7 -1
  409. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +1 -1
  410. package/src/shade/renderer/geometry/GEOMETRY_METADATA_STRUCT.d.ts.map +1 -1
  411. package/src/shade/renderer/geometry/GEOMETRY_METADATA_STRUCT.js +16 -1
  412. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  413. package/src/shade/renderer/geometry/GPUGeometryManager.js +29 -9
  414. package/src/shade/renderer/geometry/GPUGeometryMetadata.d.ts +10 -0
  415. package/src/shade/renderer/geometry/GPUGeometryMetadata.d.ts.map +1 -1
  416. package/src/shade/renderer/geometry/GPUGeometryMetadata.js +13 -0
  417. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  418. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +6 -5
  419. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +3 -3
  420. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  421. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +15 -11
  422. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +46 -18
  423. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +70 -22
  424. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +97 -19
  425. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +12 -2
  426. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  427. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +14 -3
  428. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts +2 -2
  429. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +1 -1
  430. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.js +124 -6
  431. package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts +22 -0
  432. package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts.map +1 -0
  433. package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.js +53 -0
  434. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +8 -1
  435. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
  436. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +8 -1
  437. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES.d.ts +16 -0
  438. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES.d.ts.map +1 -0
  439. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES.js +15 -0
  440. package/src/shade/renderer/geometry/virtual/format/page/VGEO_DEFAULT_PAGE_SIZE.d.ts +54 -0
  441. package/src/shade/renderer/geometry/virtual/format/page/VGEO_DEFAULT_PAGE_SIZE.d.ts.map +1 -0
  442. package/src/shade/renderer/geometry/virtual/format/page/VGEO_DEFAULT_PAGE_SIZE.js +53 -0
  443. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts +13 -2
  444. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts.map +1 -1
  445. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.js +14 -2
  446. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +100 -0
  447. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
  448. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +113 -0
  449. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.d.ts.map +1 -1
  450. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js +5 -0
  451. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
  452. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +108 -0
  453. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  454. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +23 -0
  455. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  456. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +40 -0
  457. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts +228 -0
  458. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts.map +1 -0
  459. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.js +932 -0
  460. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +176 -0
  461. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -0
  462. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +425 -0
  463. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +241 -0
  464. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +574 -0
  465. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +120 -0
  466. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -0
  467. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +674 -0
  468. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts +287 -0
  469. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -0
  470. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +976 -0
  471. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts +42 -0
  472. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts.map +1 -0
  473. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.js +96 -0
  474. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_CULL.d.ts +16 -0
  475. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_CULL.d.ts.map +1 -0
  476. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_CULL.js +15 -0
  477. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts +19 -0
  478. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts.map +1 -0
  479. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js +83 -0
  480. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_WORKGROUP_SIZE.d.ts +9 -0
  481. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_WORKGROUP_SIZE.d.ts.map +1 -0
  482. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_WORKGROUP_SIZE.js +8 -0
  483. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts +19 -0
  484. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -0
  485. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +160 -0
  486. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts +3 -0
  487. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -0
  488. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +255 -0
  489. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts +3 -0
  490. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts.map +1 -0
  491. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.js +80 -0
  492. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts +3 -0
  493. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -0
  494. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +144 -0
  495. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts +3 -0
  496. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -0
  497. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +530 -0
  498. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts +39 -0
  499. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts.map +1 -0
  500. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js +54 -0
  501. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_if_enabled.d.ts +41 -0
  502. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_if_enabled.d.ts.map +1 -0
  503. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_if_enabled.js +56 -0
  504. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts +49 -0
  505. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -0
  506. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +328 -0
  507. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts +10 -0
  508. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts.map +1 -0
  509. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.js +51 -0
  510. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts +13 -0
  511. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts.map +1 -0
  512. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js +12 -0
  513. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +17 -0
  514. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts.map +1 -0
  515. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +99 -0
  516. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.d.ts +9 -0
  517. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.d.ts.map +1 -0
  518. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +8 -0
  519. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts +7 -0
  520. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts.map +1 -0
  521. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.js +27 -0
  522. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_NONE.d.ts +14 -0
  523. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_NONE.d.ts.map +1 -0
  524. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_NONE.js +13 -0
  525. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_OFFSET.d.ts +7 -0
  526. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_OFFSET.d.ts.map +1 -0
  527. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_OFFSET.js +35 -0
  528. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_WORDS.d.ts +9 -0
  529. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_WORDS.d.ts.map +1 -0
  530. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_WORDS.js +8 -0
  531. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_FLAG_SELECTABLE.d.ts +15 -0
  532. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_FLAG_SELECTABLE.d.ts.map +1 -0
  533. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_FLAG_SELECTABLE.js +14 -0
  534. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts +7 -0
  535. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts.map +1 -0
  536. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.js +36 -0
  537. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts +10 -0
  538. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts.map +1 -0
  539. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js +9 -0
  540. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_OFFSET.d.ts +11 -0
  541. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_OFFSET.d.ts.map +1 -0
  542. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_OFFSET.js +54 -0
  543. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_WORDS.d.ts +9 -0
  544. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_WORDS.d.ts.map +1 -0
  545. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_WORDS.js +8 -0
  546. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_LEAF_BIT.d.ts +11 -0
  547. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_LEAF_BIT.d.ts.map +1 -0
  548. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_LEAF_BIT.js +10 -0
  549. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_OFFSET.d.ts +7 -0
  550. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_OFFSET.d.ts.map +1 -0
  551. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_OFFSET.js +30 -0
  552. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_WORDS.d.ts +9 -0
  553. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_WORDS.d.ts.map +1 -0
  554. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_WORDS.js +8 -0
  555. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NO_CHILD_PAGE.d.ts +13 -0
  556. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NO_CHILD_PAGE.d.ts.map +1 -0
  557. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NO_CHILD_PAGE.js +12 -0
  558. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_NONE.d.ts +14 -0
  559. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_NONE.d.ts.map +1 -0
  560. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_NONE.js +13 -0
  561. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts +11 -0
  562. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts.map +1 -0
  563. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.js +61 -0
  564. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts +9 -0
  565. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts.map +1 -0
  566. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js +8 -0
  567. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_ITEM_WORDS.d.ts +13 -0
  568. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_ITEM_WORDS.d.ts.map +1 -0
  569. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_ITEM_WORDS.js +12 -0
  570. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_GROUP_BIT.d.ts +9 -0
  571. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_GROUP_BIT.d.ts.map +1 -0
  572. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_GROUP_BIT.js +8 -0
  573. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_WANT_WORDS.d.ts +20 -0
  574. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_WANT_WORDS.d.ts.map +1 -0
  575. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_WANT_WORDS.js +19 -0
  576. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts +23 -0
  577. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -0
  578. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +70 -0
  579. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts +18 -0
  580. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts.map +1 -0
  581. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js +25 -0
  582. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts +35 -0
  583. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts.map +1 -0
  584. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js +41 -0
  585. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts +32 -0
  586. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -0
  587. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +138 -0
  588. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.d.ts +1 -1
  589. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.js +4 -4
  590. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts +1 -3
  591. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts.map +1 -1
  592. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.js +5 -4
  593. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -1
  594. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
  595. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -4
  596. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +8 -3
  597. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
  598. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +19 -14
  599. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
  600. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +9 -1
  601. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts +3 -3
  602. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts.map +1 -1
  603. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.js +12 -5
  604. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +1 -1
  605. package/src/shade/renderer/light/GPULightCollection.d.ts +29 -0
  606. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  607. package/src/shade/renderer/light/GPULightCollection.js +444 -329
  608. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  609. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +7 -1
  610. package/src/shade/renderer/light/LightCollection.d.ts +29 -1
  611. package/src/shade/renderer/light/LightCollection.d.ts.map +1 -1
  612. package/src/shade/renderer/light/LightCollection.js +50 -1
  613. package/src/shade/renderer/light/make_sunlight.js +2 -2
  614. package/src/shade/renderer/light/model/Light.d.ts +29 -2
  615. package/src/shade/renderer/light/model/Light.d.ts.map +1 -1
  616. package/src/shade/renderer/light/model/Light.js +30 -2
  617. package/src/shade/renderer/light/model/io/light_record_directional.d.ts +3 -1
  618. package/src/shade/renderer/light/model/io/light_record_directional.d.ts.map +1 -1
  619. package/src/shade/renderer/light/model/io/light_record_directional.js +8 -5
  620. package/src/shade/renderer/light/model/io/light_record_point.d.ts +3 -1
  621. package/src/shade/renderer/light/model/io/light_record_point.d.ts.map +1 -1
  622. package/src/shade/renderer/light/model/io/light_record_point.js +5 -2
  623. package/src/shade/renderer/light/model/io/light_record_spot.d.ts +4 -1
  624. package/src/shade/renderer/light/model/io/light_record_spot.d.ts.map +1 -1
  625. package/src/shade/renderer/light/model/io/light_record_spot.js +10 -6
  626. package/src/shade/renderer/light/place_light.d.ts +16 -0
  627. package/src/shade/renderer/light/place_light.d.ts.map +1 -0
  628. package/src/shade/renderer/light/place_light.js +36 -0
  629. package/src/shade/renderer/light/shader_refresh_light_poses.d.ts +44 -0
  630. package/src/shade/renderer/light/shader_refresh_light_poses.d.ts.map +1 -0
  631. package/src/shade/renderer/light/shader_refresh_light_poses.js +154 -0
  632. package/src/shade/renderer/lightmap/GPULightMap.js +1 -1
  633. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  634. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +12 -14
  635. package/src/shade/renderer/loader/SceneBundle.d.ts +53 -28
  636. package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
  637. package/src/shade/renderer/loader/SceneBundle.js +111 -56
  638. package/src/shade/renderer/loader/SceneNode.d.ts +81 -0
  639. package/src/shade/renderer/loader/SceneNode.d.ts.map +1 -0
  640. package/src/shade/renderer/loader/SceneNode.js +114 -0
  641. package/src/shade/renderer/loader/gltf/load_gltf.d.ts +3 -2
  642. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  643. package/src/shade/renderer/loader/gltf/load_gltf.js +110 -142
  644. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  645. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts +4 -4
  646. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts.map +1 -1
  647. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.js +2 -2
  648. package/src/shade/renderer/loader/usd/load_usd.d.ts +3 -2
  649. package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
  650. package/src/shade/renderer/loader/usd/load_usd.js +4 -5
  651. package/src/shade/renderer/loader/usd/usd_build_scene.d.ts +3 -3
  652. package/src/shade/renderer/loader/usd/usd_build_scene.d.ts.map +1 -1
  653. package/src/shade/renderer/loader/usd/usd_build_scene.js +47 -55
  654. package/src/shade/renderer/material/GPUMaterialManager.js +1 -1
  655. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +5 -4
  656. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  657. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +8 -15
  658. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts +15 -13
  659. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  660. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +40 -21
  661. package/src/shade/renderer/particles/DESIGN.md +53 -50
  662. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +31 -17
  663. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  664. package/src/shade/renderer/particles/GPUParticleSystem.js +54 -91
  665. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +12 -11
  666. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  667. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +12 -11
  668. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +13 -19
  669. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
  670. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +19 -25
  671. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +34 -24
  672. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  673. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +53 -40
  674. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -1
  675. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -1
  676. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  677. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  678. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +9 -0
  679. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
  680. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +2 -1
  681. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.d.ts.map +1 -1
  682. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.js +5 -2
  683. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
  684. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +13 -2
  685. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
  686. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +1 -1
  687. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +1 -1
  688. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  689. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +12 -1
  690. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  691. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +10 -0
  692. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +1 -1
  693. package/src/shade/renderer/scene/DynamicMesh.d.ts +13 -4
  694. package/src/shade/renderer/scene/DynamicMesh.d.ts.map +1 -1
  695. package/src/shade/renderer/scene/DynamicMesh.js +14 -4
  696. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +38 -18
  697. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  698. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +112 -60
  699. package/src/shade/renderer/scene/GPUSceneContext.d.ts +69 -44
  700. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  701. package/src/shade/renderer/scene/GPUSceneContext.js +244 -525
  702. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +5 -5
  703. package/src/shade/renderer/scene/NODE3D_STRUCT.js +5 -5
  704. package/src/shade/renderer/scene/Scene.d.ts +18 -60
  705. package/src/shade/renderer/scene/Scene.d.ts.map +1 -1
  706. package/src/shade/renderer/scene/Scene.js +53 -146
  707. package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts +24 -3
  708. package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts.map +1 -1
  709. package/src/shade/renderer/scene/bvh/StaticSceneBVH.js +53 -13
  710. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +5 -6
  711. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
  712. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +5 -6
  713. package/src/shade/renderer/scene/optimization/scene_optimize.d.ts +10 -2
  714. package/src/shade/renderer/scene/optimization/scene_optimize.d.ts.map +1 -1
  715. package/src/shade/renderer/scene/optimization/scene_optimize.js +266 -230
  716. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts +53 -0
  717. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts.map +1 -0
  718. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.js +144 -0
  719. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +227 -0
  720. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -0
  721. package/src/shade/renderer/scene/rows/GPUSceneRows.js +1158 -0
  722. package/src/shade/renderer/scene/rows/place_primitive.d.ts +48 -0
  723. package/src/shade/renderer/scene/rows/place_primitive.d.ts.map +1 -0
  724. package/src/shade/renderer/scene/rows/place_primitive.js +98 -0
  725. package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts +10 -8
  726. package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts.map +1 -1
  727. package/src/shade/renderer/scene/serialization/deserialize_scene.js +24 -27
  728. package/src/shade/renderer/scene/serialization/serialize_scene.d.ts +9 -2
  729. package/src/shade/renderer/scene/serialization/serialize_scene.d.ts.map +1 -1
  730. package/src/shade/renderer/scene/serialization/serialize_scene.js +25 -4
  731. package/src/shade/renderer/scene/verify_gpu_tlas_build.js +2 -2
  732. package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.d.ts +35 -0
  733. package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.d.ts.map +1 -0
  734. package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.js +91 -0
  735. package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.d.ts.map +1 -1
  736. package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.js +5 -0
  737. package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.d.ts.map +1 -1
  738. package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.js +5 -0
  739. package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.d.ts.map +1 -1
  740. package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.js +5 -0
  741. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +39 -0
  742. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  743. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +112 -64
  744. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +7 -0
  745. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  746. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1541 -1352
  747. package/src/shade/renderer/shadow/map/PointLightShadowmap.js +1 -1
  748. package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +1 -1
  749. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +1 -1
  750. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts +29 -0
  751. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts.map +1 -0
  752. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.js +43 -0
  753. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts +13 -0
  754. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts.map +1 -0
  755. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.js +12 -0
  756. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +49 -0
  757. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -0
  758. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +194 -0
  759. package/src/shade/renderer/shadow/map/csm_debug_draw_preview.js +1 -1
  760. package/src/shade/renderer/shadow/map/shadowmap_update_score.js +1 -1
  761. package/src/shade/renderer/shadow/ray/RTXShadows.js +1 -1
  762. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +1 -1
  763. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  764. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +3 -1
  765. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +8 -8
  766. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  767. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +4 -3
  768. package/src/engine/graphics3/instantiate_scene_bundle.d.ts +0 -54
  769. package/src/engine/graphics3/instantiate_scene_bundle.d.ts.map +0 -1
  770. package/src/engine/graphics3/instantiate_scene_bundle.js +0 -164
  771. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +0 -39
  772. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts.map +0 -1
  773. package/src/engine/graphics3/shade_node_to_entity_composition.js +0 -88
  774. package/src/shade/renderer/animation/compute_skin_world_bounds.d.ts +0 -35
  775. package/src/shade/renderer/animation/compute_skin_world_bounds.d.ts.map +0 -1
  776. package/src/shade/renderer/animation/compute_skin_world_bounds.js +0 -146
  777. package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.d.ts +0 -96
  778. package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.d.ts.map +0 -1
  779. package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +0 -531
  780. package/src/shade/renderer/animation/pose/pose_evaluate_world.d.ts +0 -20
  781. package/src/shade/renderer/animation/pose/pose_evaluate_world.d.ts.map +0 -1
  782. package/src/shade/renderer/animation/pose/pose_evaluate_world.js +0 -76
  783. package/src/shade/renderer/animation/skin_bind_transform.d.ts +0 -25
  784. package/src/shade/renderer/animation/skin_bind_transform.d.ts.map +0 -1
  785. package/src/shade/renderer/animation/skin_bind_transform.js +0 -33
  786. package/src/shade/renderer/animation/skin_frame_defect.d.ts +0 -34
  787. package/src/shade/renderer/animation/skin_frame_defect.d.ts.map +0 -1
  788. package/src/shade/renderer/animation/skin_frame_defect.js +0 -132
  789. package/src/shade/renderer/animation/skin_joint_matrix.d.ts +0 -24
  790. package/src/shade/renderer/animation/skin_joint_matrix.d.ts.map +0 -1
  791. package/src/shade/renderer/animation/skin_joint_matrix.js +0 -46
  792. package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts +0 -70
  793. package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts.map +0 -1
  794. package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +0 -216
  795. package/src/shade/renderer/scene/InstanceBatch.d.ts +0 -92
  796. package/src/shade/renderer/scene/InstanceBatch.d.ts.map +0 -1
  797. package/src/shade/renderer/scene/InstanceBatch.js +0 -235
  798. package/src/shade/renderer/scene/Mesh.d.ts +0 -55
  799. package/src/shade/renderer/scene/Mesh.d.ts.map +0 -1
  800. package/src/shade/renderer/scene/Mesh.js +0 -168
  801. package/src/shade/renderer/scene/Node3D.d.ts +0 -140
  802. package/src/shade/renderer/scene/Node3D.d.ts.map +0 -1
  803. package/src/shade/renderer/scene/Node3D.js +0 -263
  804. package/src/shade/renderer/scene/SceneNodeBinding.d.ts +0 -52
  805. package/src/shade/renderer/scene/SceneNodeBinding.d.ts.map +0 -1
  806. package/src/shade/renderer/scene/SceneNodeBinding.js +0 -56
  807. package/src/shade/renderer/scene/SkinnedMesh.d.ts +0 -110
  808. package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +0 -1
  809. package/src/shade/renderer/scene/SkinnedMesh.js +0 -170
  810. package/src/shade/renderer/scene/TransformAuthority.d.ts +0 -19
  811. package/src/shade/renderer/scene/TransformAuthority.d.ts.map +0 -1
  812. package/src/shade/renderer/scene/TransformAuthority.js +0 -33
@@ -0,0 +1,1158 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+ import { BitSet } from "../../../../core/binary/BitSet.js";
3
+ import { GPUStateAuthority } from "../../../../engine/ecs/gpu/GPUStateAuthority.js";
4
+ import { GPUStateAuthorityFlags } from "../../../../engine/ecs/gpu/GPUStateAuthorityFlags.js";
5
+ import { TransformAttachment } from "../../../../engine/ecs/transform-attachment/TransformAttachment.js";
6
+ import { aabb3_matrix4_project } from "../../../../core/geom/3d/aabb/aabb3_matrix4_project.js";
7
+ import { Transform64 } from "../../../../engine/ecs/transform/Transform64.js";
8
+ import { generate_record_writer } from "../../buffer/table/serde/generate_record_writer.js";
9
+ import { MESH_INSTANCE_METADATA_STRUCT } from "../MESH_INSTANCE_METADATA_STRUCT.js";
10
+ import { NODE3D_SCENE_ID, NODE3D_STRUCT } from "../NODE3D_STRUCT.js";
11
+ import { TransparencyMode } from "../../material/TransparencyMode.js";
12
+
13
+ /**
14
+ * @typedef {import("../../../../engine/ecs/EntityComponentDataset.js").EntityComponentDataset} EntityComponentDataset
15
+ * @typedef {import("../../buffer/table/GPUTypedTable.js").GPUTypedTable} GPUTypedTable
16
+ * @typedef {import("../../geometry/GPUGeometryManager.js").GPUGeometryManager} GPUGeometryManager
17
+ * @typedef {import("../../material/GPUMaterialManager.js").GPUMaterialManager} GPUMaterialManager
18
+ * @typedef {import("../GPUInstancesAccelerationStructure.js").GPUInstancesAccelerationStructure} GPUInstancesAccelerationStructure
19
+ * @typedef {import("../../animation/skinning/GPUMeshSkinningContext.js").GPUMeshSkinningContext} GPUMeshSkinningContext
20
+ * @typedef {import("../../geometry/MeshletGeometry.js").MeshletGeometry} MeshletGeometry
21
+ * @typedef {import("../../material/ShadeMaterial.js").ShadeMaterial} ShadeMaterial
22
+ * @typedef {import("../../../../core/geom/3d/aabb/AABB3.js").AABB3} AABB3
23
+ */
24
+
25
+ /**
26
+ * The row an entity occupies in both scene tables.
27
+ *
28
+ * Row 0 is the scene root — the hierarchy walk's terminator and the natural value of a
29
+ * zero-initialised buffer — so entity 0 lands at row 1 and every entity after it one row on. There
30
+ * is no mapping to consult and nothing to keep in step: the identity is the arithmetic.
31
+ *
32
+ * @param {number} entity
33
+ * @returns {number}
34
+ */
35
+ export function row_of_entity(entity) {
36
+ return entity + 1;
37
+ }
38
+
39
+ /**
40
+ * The inverse of {@link row_of_entity}, for a row the renderer produced — a visibility-buffer
41
+ * pixel, a ray hit.
42
+ *
43
+ * @param {number} row
44
+ * @returns {number} the entity, or -1 for row 0
45
+ */
46
+ export function entity_of_row(row) {
47
+ return row - 1;
48
+ }
49
+
50
+ /**
51
+ * Why an entity is on the dirty list. Carried as bits, because one frame can bring several
52
+ * reasons and the flush wants the union.
53
+ */
54
+ const MARK_LOCAL = 1;
55
+ const MARK_WORLD = 2;
56
+ const MARK_MESH = 4;
57
+
58
+ /**
59
+ * Staging for one `transforms` row, reused across every write. `global` and `prev_global` are read
60
+ * only on a row's first write.
61
+ */
62
+ const TRANSFORM_RECORD = {
63
+ local_translation: new Float32Array(3),
64
+ local_rotation: new Float32Array(4),
65
+ local_scale: new Float32Array(3),
66
+ global: new Float32Array(16),
67
+ prev_global: new Float32Array(16),
68
+ parent: NODE3D_SCENE_ID,
69
+ };
70
+
71
+ /**
72
+ * What a `meshes` row's bounds hold until the bounds pass has derived them, which it does every
73
+ * tick for every occupied row, under the `global` the hierarchy pass composed — before anything
74
+ * culls, traces or reads them back. This side never computes a render box: for a subtree the GPU
75
+ * drives it does not hold the matrix the box needs, and a box it could compute would be one the
76
+ * pass overwrites within the frame.
77
+ *
78
+ * @type {Float32Array}
79
+ */
80
+ const UNDERIVED_BOUNDING_BOX = new Float32Array(6);
81
+
82
+ /**
83
+ * @type {Float32Array}
84
+ */
85
+ const UNDERIVED_BOUNDING_SPHERE = new Float32Array(4);
86
+
87
+ /**
88
+ * One mesh entry's geometry box under its entity's world matrix, for
89
+ * {@link GPUSceneRows.compute_world_bounds}.
90
+ *
91
+ * @type {Float64Array}
92
+ */
93
+ const SCRATCH_WORLD_BOX = new Float64Array(6);
94
+
95
+ /**
96
+ * Staging for one `meshes` row.
97
+ */
98
+ const MESH_RECORD = {
99
+ geometry: 0,
100
+ material: 0,
101
+ node: NODE3D_SCENE_ID,
102
+ bounding_box: UNDERIVED_BOUNDING_BOX,
103
+ bounding_sphere: UNDERIVED_BOUNDING_SPHERE,
104
+ };
105
+
106
+ /**
107
+ * The fields of a row this side owns: its local TRS and the row of its parent. `global` and
108
+ * `prev_global` are composed by the hierarchy pass every frame for every row, whoever owns the TRS
109
+ * — see `GPUSceneContext` for why writing them here would be wrong as well as wasteful.
110
+ *
111
+ * @type {GPURecordWriter}
112
+ */
113
+ const TRANSFORM_LOCAL_WRITER = generate_record_writer(NODE3D_STRUCT, [
114
+ 'local_translation',
115
+ 'local_rotation',
116
+ 'local_scale',
117
+ 'parent',
118
+ ]);
119
+
120
+ /**
121
+ * Only the parent row: what changes when a parent gains or loses a row of its own while the
122
+ * entity's local offset is somebody else's to write.
123
+ *
124
+ * @type {GPURecordWriter}
125
+ */
126
+ const TRANSFORM_PARENT_WRITER = generate_record_writer(NODE3D_STRUCT, ['parent']);
127
+
128
+ /**
129
+ * The whole row, for its first write: `global` and `prev_global` are seeded to the entity's world
130
+ * matrix so its first frame reports no motion instead of a jump from the origin.
131
+ *
132
+ * @type {GPURecordWriter}
133
+ */
134
+ const TRANSFORM_RECORD_WRITER = generate_record_writer(NODE3D_STRUCT);
135
+
136
+ /**
137
+ * @type {GPURecordWriter}
138
+ */
139
+ const MESH_RECORD_WRITER = generate_record_writer(MESH_INSTANCE_METADATA_STRUCT);
140
+
141
+ /**
142
+ * What one entity has in the `meshes` table.
143
+ */
144
+ class MeshEntry {
145
+ /**
146
+ * @type {MeshletGeometry}
147
+ */
148
+ geometry = null;
149
+
150
+ /**
151
+ * @type {ShadeMaterial}
152
+ */
153
+ material = null;
154
+
155
+ /**
156
+ * Whether the row draws a per-instance clone the skinning pass deforms, rather than the
157
+ * shared source. The clone is the skinning context's, made when the row is first written.
158
+ *
159
+ * @type {boolean}
160
+ */
161
+ skinned = false;
162
+
163
+ /**
164
+ * Whether the row has been written — and therefore whether the TLAS knows the row.
165
+ *
166
+ * @type {boolean}
167
+ */
168
+ written = false;
169
+
170
+ /**
171
+ * The material the written row draws with — the one its hold in the rows' material list is
172
+ * on. `null` until the row is written, and again once it is given back.
173
+ *
174
+ * @type {ShadeMaterial|null}
175
+ */
176
+ held = null;
177
+ }
178
+
179
+ /**
180
+ * Entities as rows of the scene database.
181
+ *
182
+ * **The entity is the row**, at {@link row_of_entity}. An entity that something in the renderer
183
+ * needs — a primitive, a joint, a parent of either — is {@link acquire}d, and from then until
184
+ * {@link release} its `transforms` row is written from its own components: `TransformAttachment`
185
+ * when it has one and its parent has a row, in which case the row holds the local offset and the
186
+ * parent's row and the GPU composes the world; the world `Transform64` otherwise, under the scene
187
+ * root, which is exact because the ECS composes every chain on the CPU regardless. A primitive
188
+ * {@link attach_mesh}es and takes the `meshes` row of the same index.
189
+ *
190
+ * **Change flow is mark, then flush.** The systems that place entities listen to the dataset's
191
+ * change events and {@link mark_local} or {@link mark_world}; nothing is read at mark time. The
192
+ * flush, in `GPUSceneContext.build`, reads each marked entity's components once, consults
193
+ * `GPUStateAuthority` then, writes the ranges the CPU owns, and clears the list. A world mark on
194
+ * an attached entity whose parent has a row writes nothing: its local offset and its parent are
195
+ * unchanged, and the GPU composes the rest. That is what stops a root's move from costing a row
196
+ * per descendant.
197
+ *
198
+ * **Render bounds are never written from this side.** They are derived on the GPU every tick from
199
+ * the composed world matrix, because the CPU does not hold that matrix for a subtree the GPU
200
+ * drives; a row is written with them underived, and the bounds pass has filled them in before
201
+ * anything reads them. What a consumer on this side wants is the readback (`GPUSceneContext.bounds`).
202
+ */
203
+ export class GPUSceneRows {
204
+
205
+ /**
206
+ * @type {EntityComponentDataset}
207
+ */
208
+ #dataset;
209
+
210
+ /**
211
+ * @type {GPUTypedTable}
212
+ */
213
+ #transforms;
214
+
215
+ /**
216
+ * @type {GPUTypedTable}
217
+ */
218
+ #meshes;
219
+
220
+ /**
221
+ * @type {GPUGeometryManager}
222
+ */
223
+ #geometries;
224
+
225
+ /**
226
+ * @type {GPUMaterialManager}
227
+ */
228
+ #materials;
229
+
230
+ /**
231
+ * How many written mesh rows draw with each material. A material is listed while the count is
232
+ * above zero — what the rasterizers iterate to decide which buckets and pipelines a frame needs.
233
+ *
234
+ * @type {Map<ShadeMaterial, number>}
235
+ */
236
+ #material_holds = new Map();
237
+
238
+ /**
239
+ * Moves when a material enters or leaves {@link #material_holds}; not when a count changes
240
+ * between two positive values.
241
+ *
242
+ * @type {number}
243
+ */
244
+ #materials_version = 0;
245
+
246
+ /**
247
+ * @type {ShadeMaterial[]}
248
+ */
249
+ #cached_materials = [];
250
+
251
+ /**
252
+ * @type {number}
253
+ */
254
+ #cached_materials_version = -1;
255
+
256
+ /**
257
+ * @type {GPUInstancesAccelerationStructure}
258
+ */
259
+ #tlas;
260
+
261
+ /**
262
+ * The scene's skinning context, asked for when a skinned row is written — a function, because
263
+ * the context is built on first use and the rows may be here first.
264
+ *
265
+ * @type {function(): GPUMeshSkinningContext}
266
+ */
267
+ #skinning;
268
+
269
+ /**
270
+ * Entities holding a `transforms` row, from the first {@link acquire} to the last
271
+ * {@link release}.
272
+ *
273
+ * @type {BitSet}
274
+ */
275
+ #acquired = new BitSet();
276
+
277
+ /**
278
+ * How many holders each acquired entity has. A model holds every one of its entities' rows and
279
+ * a primitive holds its own, and the row goes when the last of them lets go. Indexed by entity.
280
+ *
281
+ * @type {Uint16Array}
282
+ */
283
+ #holds = new Uint16Array(256);
284
+
285
+ /**
286
+ * Entities whose row has been written at least once — whose next write is a patch rather than
287
+ * the seeding write.
288
+ *
289
+ * @type {BitSet}
290
+ */
291
+ #written = new BitSet();
292
+
293
+ /**
294
+ * Why each marked entity is marked, or zero. Indexed by entity.
295
+ *
296
+ * @type {Uint8Array}
297
+ */
298
+ #reason = new Uint8Array(256);
299
+
300
+ /**
301
+ * The marked entities, in the order they were first marked this frame.
302
+ *
303
+ * @type {number[]}
304
+ */
305
+ #marked = [];
306
+
307
+ /**
308
+ * The `parent` field each written row currently holds. Indexed by entity, meaningful for
309
+ * written rows only. Lets the flush notice a parent that gained or lost its row, which is a
310
+ * change to the child's row that no component write announces.
311
+ *
312
+ * @type {Uint32Array}
313
+ */
314
+ #parent_row = new Uint32Array(256);
315
+
316
+ /**
317
+ * Which entity each row's attachment named when it was last flushed, or -1. Indexed by entity.
318
+ * Maintains {@link #children}.
319
+ *
320
+ * @type {Int32Array}
321
+ */
322
+ #parent_entity = new Int32Array(256).fill(-1);
323
+
324
+ /**
325
+ * Acquired entities by the entity their attachment names, whether or not that entity has a row
326
+ * itself. When it acquires or releases one, these are the rows that have to change shape.
327
+ *
328
+ * @type {Map<number, Set<number>>}
329
+ */
330
+ #children = new Map();
331
+
332
+ /**
333
+ * @type {Map<number, MeshEntry>}
334
+ */
335
+ #mesh_entries = new Map();
336
+
337
+ /**
338
+ * @type {number}
339
+ */
340
+ #mesh_rows_version = 0;
341
+
342
+ /**
343
+ * @param {object} options
344
+ * @param {EntityComponentDataset} options.dataset
345
+ * @param {GPUTypedTable} options.transforms
346
+ * @param {GPUTypedTable} options.meshes
347
+ * @param {GPUGeometryManager} options.geometries
348
+ * @param {GPUMaterialManager} options.materials
349
+ * @param {GPUInstancesAccelerationStructure} options.tlas
350
+ * @param {function(): GPUMeshSkinningContext} options.skinning
351
+ */
352
+ constructor({ dataset, transforms, meshes, geometries, materials, tlas, skinning }) {
353
+ assert.defined(dataset, 'dataset');
354
+ assert.equal(dataset.isEntityComponentDataset, true, 'dataset.isEntityComponentDataset !== true');
355
+ assert.defined(transforms, 'transforms');
356
+ assert.defined(meshes, 'meshes');
357
+ assert.defined(geometries, 'geometries');
358
+ assert.defined(materials, 'materials');
359
+ assert.defined(tlas, 'tlas');
360
+ assert.typeOf(skinning, 'function', 'skinning');
361
+
362
+ this.#dataset = dataset;
363
+ this.#transforms = transforms;
364
+ this.#meshes = meshes;
365
+ this.#geometries = geometries;
366
+ this.#materials = materials;
367
+ this.#tlas = tlas;
368
+ this.#skinning = skinning;
369
+ }
370
+
371
+ /**
372
+ * @returns {EntityComponentDataset}
373
+ */
374
+ get dataset() {
375
+ return this.#dataset;
376
+ }
377
+
378
+ /**
379
+ * Bumped every time the `meshes` table gains or loses an entity's row. A row read and kept is
380
+ * only as valid as this number.
381
+ *
382
+ * @returns {number}
383
+ */
384
+ get mesh_rows_version() {
385
+ return this.#mesh_rows_version;
386
+ }
387
+
388
+ /**
389
+ * Whether the entity holds a `transforms` row — acquired and not yet released, written or not.
390
+ *
391
+ * @param {number} entity
392
+ * @returns {boolean}
393
+ */
394
+ has(entity) {
395
+ return this.#acquired.get(entity);
396
+ }
397
+
398
+ /**
399
+ * Whether the entity holds a `meshes` row.
400
+ *
401
+ * @param {number} entity
402
+ * @returns {boolean}
403
+ */
404
+ has_mesh(entity) {
405
+ return this.#mesh_entries.has(entity);
406
+ }
407
+
408
+ /**
409
+ * Every entity holding a `meshes` row, with what the row draws — what a tool that walks the
410
+ * scene's primitives on this side (a CPU bake, a verifier) iterates. The order is the order
411
+ * the meshes were attached in.
412
+ *
413
+ * @param {function(number, MeshletGeometry, ShadeMaterial, boolean): void} visitor entity,
414
+ * geometry, material, whether the row draws a skinned clone
415
+ */
416
+ for_each_mesh(visitor) {
417
+ assert.isFunction(visitor, 'visitor');
418
+
419
+ for (const [entity, entry] of this.#mesh_entries) {
420
+ visitor(entity, entry.geometry, entry.material, entry.skinned);
421
+ }
422
+ }
423
+
424
+ /**
425
+ * The box around everything the rows draw, as this side can compose it: each mesh entry's
426
+ * geometry box projected under its entity's own `Transform64` — the ECS's world pose, exact
427
+ * for what the CPU placed and a frame behind for a subtree the GPU drives — and the union of
428
+ * them. What a consumer that sizes a volume once asks for; the box that is drawn is the GPU's,
429
+ * read back through `GPUSceneContext.bounds`.
430
+ *
431
+ * @param {AABB3} target set to the union, or to the empty box when nothing draws
432
+ * @returns {boolean} whether anything draws
433
+ */
434
+ compute_world_bounds(target) {
435
+ assert.defined(target, 'target');
436
+
437
+ target.setNegativelyInfiniteBounds();
438
+
439
+ let any = false;
440
+
441
+ for (const [entity, entry] of this.#mesh_entries) {
442
+ const world = this.#dataset.getComponent(entity, Transform64);
443
+
444
+ assert.defined(world, `entity ${entity} holds a mesh row and carries no Transform64`);
445
+
446
+ aabb3_matrix4_project(SCRATCH_WORLD_BOX, entry.geometry.bounding_box, world.matrix);
447
+
448
+ target._expandToFit(
449
+ SCRATCH_WORLD_BOX[0], SCRATCH_WORLD_BOX[1], SCRATCH_WORLD_BOX[2],
450
+ SCRATCH_WORLD_BOX[3], SCRATCH_WORLD_BOX[4], SCRATCH_WORLD_BOX[5],
451
+ );
452
+
453
+ any = true;
454
+ }
455
+
456
+ return any;
457
+ }
458
+
459
+ /**
460
+ * Hold the entity's `transforms` row. The first hold takes the row: it is written at the next
461
+ * flush, from the entity's components as they are then, and the entity must carry a
462
+ * `Transform64` by then. Every hold is matched by a {@link release}, and the row goes with the
463
+ * last one.
464
+ *
465
+ * Children already holding rows are re-marked on the first hold, so that they point at this
466
+ * one from the next flush instead of carrying their world pose under the scene root.
467
+ *
468
+ * @param {number} entity
469
+ */
470
+ acquire(entity) {
471
+ assert.isNonNegativeInteger(entity, 'entity');
472
+
473
+ this.#ensure_capacity(entity);
474
+
475
+ if (this.#acquired.get(entity)) {
476
+ this.#holds[entity]++;
477
+
478
+ return;
479
+ }
480
+
481
+ this.#acquired.set(entity, true);
482
+ this.#written.set(entity, false);
483
+ this.#holds[entity] = 1;
484
+
485
+ this.#parent_entity[entity] = -1;
486
+
487
+ /*
488
+ Indexed under its attachment's parent from the start rather than at the first flush: the
489
+ animation manager walks the rows below a joint the moment a clip binds to it, which is
490
+ the same update the rows were acquired in. The flush re-registers, so a parent that
491
+ changes later is still followed.
492
+ */
493
+ const dataset = this.#dataset;
494
+ const attachment_index = dataset.computeComponentTypeIndex(TransformAttachment);
495
+
496
+ if (attachment_index !== -1) {
497
+ const attachment = dataset.getComponentByIndex(entity, attachment_index);
498
+
499
+ if (attachment !== undefined && attachment !== null) {
500
+ this.#register_child(entity, attachment.parent);
501
+ }
502
+ }
503
+
504
+ this.#mark(entity, MARK_LOCAL);
505
+
506
+ this.#mark_children(entity);
507
+ }
508
+
509
+ /**
510
+ * Let go of the entity's `transforms` row. The last holder to let go takes it back — and its
511
+ * `meshes` row with it, if it had one. Children keep theirs and are re-marked, to be written
512
+ * under the scene root from their world pose.
513
+ *
514
+ * Safe on an entity that holds nothing.
515
+ *
516
+ * @param {number} entity
517
+ */
518
+ release(entity) {
519
+ assert.isNonNegativeInteger(entity, 'entity');
520
+
521
+ if (!this.#acquired.get(entity)) {
522
+ return;
523
+ }
524
+
525
+ if (--this.#holds[entity] > 0) {
526
+ return;
527
+ }
528
+
529
+ this.#free_mesh(entity);
530
+
531
+ if (this.#written.get(entity)) {
532
+ this.#transforms.remove(row_of_entity(entity));
533
+ }
534
+
535
+ this.#acquired.set(entity, false);
536
+ this.#written.set(entity, false);
537
+ this.#reason[entity] = 0;
538
+
539
+ this.#unregister_child(entity);
540
+
541
+ this.#mark_children(entity);
542
+ }
543
+
544
+ /**
545
+ * The entity's local offset or its attachment changed — what its own row holds.
546
+ *
547
+ * @param {number} entity
548
+ */
549
+ mark_local(entity) {
550
+ this.#mark(entity, MARK_LOCAL);
551
+ }
552
+
553
+ /**
554
+ * The entity's world transform changed. For an entity the GPU composes under a parent row this
555
+ * is nothing to write; for one carrying its world pose it is the row's contents.
556
+ *
557
+ * @param {number} entity
558
+ */
559
+ mark_world(entity) {
560
+ this.#mark(entity, MARK_WORLD);
561
+ }
562
+
563
+ /**
564
+ * Every material some written mesh row draws with, each once. The array is reused until the set
565
+ * changes — compare {@link materials_version} to know whether it did.
566
+ *
567
+ * @returns {ShadeMaterial[]}
568
+ */
569
+ get materials() {
570
+ if (this.#cached_materials_version !== this.#materials_version) {
571
+ this.#cached_materials = Array.from(this.#material_holds.keys());
572
+ this.#cached_materials_version = this.#materials_version;
573
+ }
574
+
575
+ return this.#cached_materials;
576
+ }
577
+
578
+ /**
579
+ * Moves when a material enters or leaves {@link materials}.
580
+ *
581
+ * @returns {number}
582
+ */
583
+ get materials_version() {
584
+ return this.#materials_version;
585
+ }
586
+
587
+ /**
588
+ * @param {ShadeMaterial} material
589
+ */
590
+ #hold_material(material) {
591
+ const holds = this.#material_holds;
592
+ const count = holds.get(material);
593
+
594
+ if (count === undefined) {
595
+ holds.set(material, 1);
596
+
597
+ this.#materials_version++;
598
+ } else {
599
+ holds.set(material, count + 1);
600
+ }
601
+ }
602
+
603
+ /**
604
+ * @param {ShadeMaterial} material
605
+ */
606
+ #release_material(material) {
607
+ const holds = this.#material_holds;
608
+ const count = holds.get(material);
609
+
610
+ assert.isNonNegativeInteger(count, 'count');
611
+ assert.greaterThan(count, 0, 'count');
612
+
613
+ if (count === 1) {
614
+ holds.delete(material);
615
+
616
+ this.#materials_version++;
617
+ } else {
618
+ holds.set(material, count - 1);
619
+ }
620
+ }
621
+
622
+ /**
623
+ * Give the entity a `meshes` row for one primitive, at the same index as its `transforms` row,
624
+ * which it takes as well if it does not have it yet. Replacing what it draws is the same call.
625
+ *
626
+ * A skinned primitive draws a per-instance clone of `geometry`, deformed by the skinning pass
627
+ * against whatever skin the entity is bound to; the clone is made when the row is written and
628
+ * given back with the row.
629
+ *
630
+ * The mesh is one hold on the `transforms` row, released by {@link detach_mesh}.
631
+ *
632
+ * @param {number} entity
633
+ * @param {MeshletGeometry} geometry
634
+ * @param {ShadeMaterial} material
635
+ * @param {boolean} [skinned]
636
+ */
637
+ attach_mesh(entity, geometry, material, skinned = false) {
638
+ assert.isNonNegativeInteger(entity, 'entity');
639
+ assert.defined(geometry, 'geometry');
640
+ assert.equal(geometry.isMeshletGeometry, true, 'geometry.isMeshletGeometry !== true');
641
+ assert.defined(material, 'material');
642
+ assert.isBoolean(skinned, 'skinned');
643
+
644
+ if (geometry.isVirtualGeometry === true
645
+ && material.transparency_mode !== TransparencyMode.Opaque) {
646
+ /*
647
+ It would draw nothing at all, silently. A virtual geometry expands to zero static
648
+ meshlets by construction, and the cut that fills that gap runs only in the opaque
649
+ rasterization paths — `prepare_meshlet_draw_commands_by_material`, which serves the
650
+ transparent and alpha-tested buckets, has no seam. VIRTUAL_GEOMETRY_DESIGN §9 scopes
651
+ v1 that way; what it did not do until now was say so, and the code cited it anyway
652
+ (REVIEW_LEDGER M14).
653
+
654
+ A warning rather than a refusal, because the attachment is otherwise legal and the
655
+ asset is fine — what is missing is a path, and the next campaign may add one.
656
+ */
657
+ console.warn(
658
+ `virtual geometry: entity ${entity} carries a ${
659
+ geometry.name ?? 'virtual'
660
+ } geometry with a non-opaque material, and will draw nothing.`
661
+ + ` The cut runs only in the opaque paths (DESIGN §9).`
662
+ );
663
+ }
664
+
665
+ let entry = this.#mesh_entries.get(entity);
666
+
667
+ if (entry === undefined) {
668
+ this.acquire(entity);
669
+
670
+ entry = new MeshEntry();
671
+
672
+ this.#mesh_entries.set(entity, entry);
673
+ } else if (entry.written && (entry.skinned !== skinned || (skinned && entry.geometry !== geometry))) {
674
+ // a different clone, or none: the one the row draws goes back with the next write
675
+ this.#skinning().release_clone(entity);
676
+ }
677
+
678
+ entry.geometry = geometry;
679
+ entry.material = material;
680
+ entry.skinned = skinned;
681
+
682
+ this.#mark(entity, MARK_MESH);
683
+ }
684
+
685
+ /**
686
+ * Take the entity's `meshes` row back, and let go of the hold the mesh had on its
687
+ * `transforms` row — which stays if anything else holds it. Safe on an entity that has none.
688
+ *
689
+ * @param {number} entity
690
+ */
691
+ detach_mesh(entity) {
692
+ if (!this.#mesh_entries.has(entity)) {
693
+ return;
694
+ }
695
+
696
+ this.#free_mesh(entity);
697
+
698
+ this.release(entity);
699
+ }
700
+
701
+ /**
702
+ * Give a `meshes` row back without touching the holds on the entity's `transforms` row.
703
+ *
704
+ * @param {number} entity
705
+ */
706
+ #free_mesh(entity) {
707
+ const entry = this.#mesh_entries.get(entity);
708
+
709
+ if (entry === undefined) {
710
+ return;
711
+ }
712
+
713
+ this.#mesh_entries.delete(entity);
714
+
715
+ if (!entry.written) {
716
+ return;
717
+ }
718
+
719
+ const row = row_of_entity(entity);
720
+
721
+ this.#meshes.remove(row);
722
+ this.#tlas.instance_remove(row);
723
+
724
+ this.#release_material(entry.held);
725
+
726
+ entry.held = null;
727
+
728
+ if (entry.skinned) {
729
+ // the row was the only thing naming the clone; its skin binding is kept, so a row
730
+ // that comes back is deformed again
731
+ this.#skinning().release_clone(entity);
732
+ }
733
+
734
+ this.#mesh_rows_version++;
735
+ }
736
+
737
+ /**
738
+ * Write every marked entity's rows from its components, and clear the list.
739
+ *
740
+ * @returns {number} rows written
741
+ */
742
+ flush() {
743
+ const marked = this.#marked;
744
+ const count = marked.length;
745
+
746
+ if (count === 0) {
747
+ return 0;
748
+ }
749
+
750
+ const dataset = this.#dataset;
751
+ const reason = this.#reason;
752
+
753
+ const transform_index = dataset.computeComponentTypeIndex(Transform64);
754
+ const attachment_index = dataset.computeComponentTypeIndex(TransformAttachment);
755
+ const authority_index = dataset.computeComponentTypeIndex(GPUStateAuthority);
756
+
757
+ let written = 0;
758
+
759
+ for (let i = 0; i < count; i++) {
760
+ const entity = marked[i];
761
+ const why = reason[entity];
762
+
763
+ reason[entity] = 0;
764
+
765
+ if (why === 0 || !this.#acquired.get(entity)) {
766
+ // released since it was marked
767
+ continue;
768
+ }
769
+
770
+ assert.ok(dataset.entityExists(entity), `entity ${entity} holds a row but is not in the dataset — release its row before removing it`);
771
+ assert.notEqual(transform_index, -1, 'Transform64 is not a registered component type of the dataset');
772
+
773
+ const world = dataset.getComponentByIndex(entity, transform_index);
774
+
775
+ assert.defined(world, `entity ${entity} holds a row and no Transform64`);
776
+
777
+ const attachment = attachment_index === -1
778
+ ? undefined
779
+ : dataset.getComponentByIndex(entity, attachment_index);
780
+
781
+ const authority = authority_index === -1
782
+ ? undefined
783
+ : dataset.getComponentByIndex(entity, authority_index);
784
+
785
+ const flags = authority === undefined ? 0 : authority.flags;
786
+
787
+ written += this.#flush_transform(entity, why, world, attachment, flags);
788
+ written += this.#flush_mesh(entity, why);
789
+ }
790
+
791
+ marked.length = 0;
792
+
793
+ return written;
794
+ }
795
+
796
+ /**
797
+ * @param {number} entity
798
+ * @param {number} why
799
+ * @param {Transform64} world
800
+ * @param {TransformAttachment|undefined} attachment
801
+ * @param {number} flags
802
+ * @returns {number} rows written
803
+ */
804
+ #flush_transform(entity, why, world, attachment, flags) {
805
+ const row = row_of_entity(entity);
806
+
807
+ const parent = attachment === undefined ? -1 : attachment.parent;
808
+
809
+ this.#register_child(entity, parent);
810
+
811
+ const parent_has_row = parent >= 0 && this.#acquired.get(parent);
812
+
813
+ const parent_row = parent_has_row ? row_of_entity(parent) : NODE3D_SCENE_ID;
814
+
815
+ // What the row's local TRS is: the offset from the parent row when there is one, the world
816
+ // pose under the scene root when there is not. The second is exact — the ECS composed it.
817
+ const local = parent_has_row ? attachment.transform : world;
818
+
819
+ const first = !this.#written.get(entity);
820
+
821
+ if (first) {
822
+ this.#transforms.set_record(row, this.#seed_record(local, parent_row, world), TRANSFORM_RECORD_WRITER);
823
+
824
+ this.#written.set(entity, true);
825
+ this.#parent_row[entity] = parent_row;
826
+
827
+ return 1;
828
+ }
829
+
830
+ const parent_changed = this.#parent_row[entity] !== parent_row;
831
+
832
+ if ((flags & GPUStateAuthorityFlags.TransformAttachment) !== 0) {
833
+ // The GPU writes this row's TRS — a clip, a pose the CPU never sees — and a CPU that
834
+ // wrote it too would race what the animation just resolved. The parent row is still
835
+ // this side's, and changes only when the parent's own row comes or goes.
836
+ if (!parent_changed) {
837
+ return 0;
838
+ }
839
+
840
+ TRANSFORM_RECORD.parent = parent_row;
841
+
842
+ this.#transforms.set_fields(row, TRANSFORM_RECORD, TRANSFORM_PARENT_WRITER);
843
+
844
+ this.#parent_row[entity] = parent_row;
845
+
846
+ return 1;
847
+ }
848
+
849
+ const moved = parent_has_row
850
+ ? (why & MARK_LOCAL) !== 0
851
+ : (why & (MARK_LOCAL | MARK_WORLD)) !== 0;
852
+
853
+ if (!moved && !parent_changed) {
854
+ return 0;
855
+ }
856
+
857
+ this.#transforms.set_fields(row, this.#local_record(local, parent_row), TRANSFORM_LOCAL_WRITER);
858
+
859
+ this.#parent_row[entity] = parent_row;
860
+
861
+ return 1;
862
+ }
863
+
864
+ /**
865
+ * @param {number} entity
866
+ * @param {number} why
867
+ * @returns {number} rows written
868
+ */
869
+ #flush_mesh(entity, why) {
870
+ const entry = this.#mesh_entries.get(entity);
871
+
872
+ if (entry === undefined) {
873
+ return 0;
874
+ }
875
+
876
+ const row = row_of_entity(entity);
877
+
878
+ if (entry.written && (why & MARK_MESH) === 0) {
879
+ if ((why & (MARK_WORLD | MARK_LOCAL)) !== 0) {
880
+ // The row's bounds are the GPU's — the bounds pass derives them under the composed
881
+ // global — and nothing on this side keeps a copy; what moved is the tree, which is
882
+ // rebuilt over them.
883
+ this.#tlas.instance_update(row);
884
+ }
885
+
886
+ return 0;
887
+ }
888
+
889
+ const geometry = entry.geometry;
890
+
891
+ this.#geometries.add(geometry);
892
+ this.#materials.obtain(entry.material);
893
+
894
+ if (entry.held !== entry.material) {
895
+ if (entry.held !== null) {
896
+ this.#release_material(entry.held);
897
+ }
898
+
899
+ this.#hold_material(entry.material);
900
+
901
+ entry.held = entry.material;
902
+ }
903
+
904
+ MESH_RECORD.geometry = entry.skinned
905
+ ? this.#skinning().obtain_clone(entity, geometry).index
906
+ : this.#geometries.getAddress(geometry);
907
+ MESH_RECORD.material = entry.material.id;
908
+ MESH_RECORD.node = row;
909
+
910
+ this.#meshes.set_record(row, MESH_RECORD, MESH_RECORD_WRITER);
911
+
912
+ if (entry.written) {
913
+ this.#tlas.instance_update(row);
914
+ } else {
915
+ entry.written = true;
916
+
917
+ this.#tlas.instance_add(row);
918
+
919
+ this.#mesh_rows_version++;
920
+ }
921
+
922
+ return 1;
923
+ }
924
+
925
+ /**
926
+ * @param {Transform64} local
927
+ * @param {number} parent_row
928
+ * @returns {object} the module-static record, valid until the next call
929
+ */
930
+ #local_record(local, parent_row) {
931
+ // through the scalar accessors: the vector properties are live views, freshly allocated
932
+ // on every access, and this runs once per changed row per frame
933
+ TRANSFORM_RECORD.local_translation[0] = local.translation_x;
934
+ TRANSFORM_RECORD.local_translation[1] = local.translation_y;
935
+ TRANSFORM_RECORD.local_translation[2] = local.translation_z;
936
+
937
+ TRANSFORM_RECORD.local_rotation[0] = local.rotation_x;
938
+ TRANSFORM_RECORD.local_rotation[1] = local.rotation_y;
939
+ TRANSFORM_RECORD.local_rotation[2] = local.rotation_z;
940
+ TRANSFORM_RECORD.local_rotation[3] = local.rotation_w;
941
+
942
+ TRANSFORM_RECORD.local_scale[0] = local.scale_x;
943
+ TRANSFORM_RECORD.local_scale[1] = local.scale_y;
944
+ TRANSFORM_RECORD.local_scale[2] = local.scale_z;
945
+
946
+ TRANSFORM_RECORD.parent = parent_row;
947
+
948
+ return TRANSFORM_RECORD;
949
+ }
950
+
951
+ /**
952
+ * @param {Transform64} local
953
+ * @param {number} parent_row
954
+ * @param {Transform64} world
955
+ * @returns {object} the module-static record, valid until the next call
956
+ */
957
+ #seed_record(local, parent_row, world) {
958
+ this.#local_record(local, parent_row);
959
+
960
+ for (let i = 0; i < 16; i++) {
961
+ TRANSFORM_RECORD.global[i] = world[i];
962
+ TRANSFORM_RECORD.prev_global[i] = world[i];
963
+ }
964
+
965
+ return TRANSFORM_RECORD;
966
+ }
967
+
968
+ /**
969
+ * @param {number} entity
970
+ * @param {number} why
971
+ */
972
+ #mark(entity, why) {
973
+ assert.isNonNegativeInteger(entity, 'entity');
974
+
975
+ if (!this.#acquired.get(entity)) {
976
+ // nothing to write for an entity holding no row; a mark is not an acquire
977
+ return;
978
+ }
979
+
980
+ const reason = this.#reason;
981
+
982
+ if (reason[entity] === 0) {
983
+ this.#marked.push(entity);
984
+ }
985
+
986
+ reason[entity] |= why;
987
+ }
988
+
989
+ /**
990
+ * Re-mark every acquired entity whose attachment names `parent`.
991
+ *
992
+ * @param {number} parent
993
+ */
994
+ /**
995
+ * Visit every entity holding a row below `entity`, parents before their children.
996
+ *
997
+ * The index behind this is the one the rows keep for re-marking a subtree when its parent's
998
+ * row appears or goes; an entity with no row is not in it, and neither are its children.
999
+ *
1000
+ * @param {number} entity
1001
+ * @param {function(number): void} visitor
1002
+ */
1003
+ for_each_descendant(entity, visitor) {
1004
+ assert.isNonNegativeInteger(entity, 'entity');
1005
+ assert.typeOf(visitor, 'function', 'visitor');
1006
+
1007
+ const children = this.#children.get(entity);
1008
+
1009
+ if (children === undefined) {
1010
+ return;
1011
+ }
1012
+
1013
+ for (const child of children) {
1014
+ visitor(child);
1015
+
1016
+ this.for_each_descendant(child, visitor);
1017
+ }
1018
+ }
1019
+
1020
+ #mark_children(parent) {
1021
+ const children = this.#children.get(parent);
1022
+
1023
+ if (children === undefined) {
1024
+ return;
1025
+ }
1026
+
1027
+ for (const child of children) {
1028
+ this.#mark(child, MARK_LOCAL);
1029
+ }
1030
+ }
1031
+
1032
+ /**
1033
+ * Keep {@link #children} in step with what the entity's attachment names.
1034
+ *
1035
+ * @param {number} entity
1036
+ * @param {number} parent the entity its attachment names, or -1
1037
+ */
1038
+ #register_child(entity, parent) {
1039
+ const previous = this.#parent_entity[entity];
1040
+
1041
+ if (previous === parent) {
1042
+ return;
1043
+ }
1044
+
1045
+ this.#unregister_child(entity);
1046
+
1047
+ if (parent < 0) {
1048
+ return;
1049
+ }
1050
+
1051
+ let children = this.#children.get(parent);
1052
+
1053
+ if (children === undefined) {
1054
+ children = new Set();
1055
+
1056
+ this.#children.set(parent, children);
1057
+ }
1058
+
1059
+ children.add(entity);
1060
+
1061
+ this.#parent_entity[entity] = parent;
1062
+ }
1063
+
1064
+ /**
1065
+ * @param {number} entity
1066
+ */
1067
+ #unregister_child(entity) {
1068
+ const previous = this.#parent_entity[entity];
1069
+
1070
+ if (previous < 0) {
1071
+ return;
1072
+ }
1073
+
1074
+ const children = this.#children.get(previous);
1075
+
1076
+ if (children !== undefined) {
1077
+ children.delete(entity);
1078
+
1079
+ if (children.size === 0) {
1080
+ this.#children.delete(previous);
1081
+ }
1082
+ }
1083
+
1084
+ this.#parent_entity[entity] = -1;
1085
+ }
1086
+
1087
+ /**
1088
+ * Grow the per-entity arrays to cover `entity`. Doubling, so a dataset that grows steadily
1089
+ * pays for this a logarithmic number of times.
1090
+ *
1091
+ * @param {number} entity
1092
+ */
1093
+ #ensure_capacity(entity) {
1094
+ const length = this.#reason.length;
1095
+
1096
+ if (entity < length) {
1097
+ return;
1098
+ }
1099
+
1100
+ let size = length;
1101
+
1102
+ while (size <= entity) {
1103
+ size *= 2;
1104
+ }
1105
+
1106
+ const reason = new Uint8Array(size);
1107
+ reason.set(this.#reason);
1108
+ this.#reason = reason;
1109
+
1110
+ const holds = new Uint16Array(size);
1111
+ holds.set(this.#holds);
1112
+ this.#holds = holds;
1113
+
1114
+ const parent_row = new Uint32Array(size);
1115
+ parent_row.set(this.#parent_row);
1116
+ this.#parent_row = parent_row;
1117
+
1118
+ const parent_entity = new Int32Array(size).fill(-1);
1119
+ parent_entity.set(this.#parent_entity);
1120
+ this.#parent_entity = parent_entity;
1121
+ }
1122
+
1123
+ /**
1124
+ * Forget everything, freeing every row. For the context's own teardown.
1125
+ */
1126
+ destroy() {
1127
+ for (const [entity, entry] of this.#mesh_entries) {
1128
+ if (entry.written) {
1129
+ const row = row_of_entity(entity);
1130
+
1131
+ this.#meshes.remove(row);
1132
+ this.#tlas.instance_remove(row);
1133
+
1134
+ if (entry.skinned) {
1135
+ this.#skinning().release_clone(entity);
1136
+ }
1137
+ }
1138
+ }
1139
+
1140
+ this.#mesh_entries.clear();
1141
+
1142
+ const acquired = this.#acquired;
1143
+
1144
+ for (let entity = acquired.nextSetBit(0); entity !== -1; entity = acquired.nextSetBit(entity + 1)) {
1145
+ if (this.#written.get(entity)) {
1146
+ this.#transforms.remove(row_of_entity(entity));
1147
+ }
1148
+ }
1149
+
1150
+ acquired.reset();
1151
+ this.#written.reset();
1152
+ this.#reason.fill(0);
1153
+ this.#holds.fill(0);
1154
+ this.#marked.length = 0;
1155
+ this.#children.clear();
1156
+ this.#parent_entity.fill(-1);
1157
+ }
1158
+ }