@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
@@ -1,5 +1,6 @@
1
+ import { GPUVirtualGeometryPool } from "../geometry/virtual/runtime/GPUVirtualGeometryPool.js";
2
+ import { GPUVirtualGeometryRuntime } from "../geometry/virtual/runtime/GPUVirtualGeometryRuntime.js";
1
3
  import { assert } from "../../../core/assert.js";
2
- import { typed_array_copy } from "../../../core/collection/array/typed/typed_array_copy.js";
3
4
  import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
4
5
  import { GPUAnimationManager } from "../animation/GPUAnimationManager.js";
5
6
  import { GPUDatabase } from "../buffer/table/GPUDatabase.js";
@@ -10,63 +11,64 @@ import { GPUSceneVolumetrics } from "../volumetrics/GPUSceneVolumetrics.js";
10
11
  import { Scene } from "./Scene.js";
11
12
  import { GPUInstancesAccelerationStructure } from "./GPUInstancesAccelerationStructure.js";
12
13
  import { GPUMeshSkinningContext } from "../animation/skinning/GPUMeshSkinningContext.js";
13
- import { NODE3D_SCENE_ID } from "./NODE3D_STRUCT.js";
14
+ import {
15
+ shader_refresh_all_mesh_bounds,
16
+ WORKGROUP_SIZE as REFRESH_ALL_MESH_BOUNDS_WORKGROUP_SIZE
17
+ } from "../object_property/shader_refresh_all_mesh_bounds.js";
18
+ import { GPUEntityBoundsReadback } from "./rows/GPUEntityBoundsReadback.js";
19
+ import { GPUSceneRows } from "./rows/GPUSceneRows.js";
20
+ import { generate_record_writer } from "../buffer/table/serde/generate_record_writer.js";
21
+ import { NODE3D_SCENE_ID, NODE3D_STRUCT } from "./NODE3D_STRUCT.js";
14
22
  import { SCENE_DATABASE_SPEC } from "./SCENE_DATABASE_SPEC.js";
15
- import { SceneNodeBinding } from "./SceneNodeBinding.js";
16
- import { TransformAuthority } from "./TransformAuthority.js";
17
23
 
18
24
  /**
19
25
  * @typedef {import("../GraphicsContext.js").GraphicsContext} GraphicsContext
20
26
  * @typedef {import("../geometry/GPUGeometryManager.js").GPUGeometryManager} GPUGeometryManager
21
27
  * @typedef {import("../material/GPUMaterialManager.js").GPUMaterialManager} GPUMaterialManager
22
- * @typedef {import("./Node3D.js").Node3D} Node3D
28
+ * @typedef {import("../material/ShadeMaterial.js").ShadeMaterial} ShadeMaterial
29
+ * @typedef {import("../buffer/table/serde/generate_record_writer.js").GPURecordWriter} GPURecordWriter
23
30
  */
24
31
 
25
32
 
26
33
  let id_counter = 0;
27
34
 
28
35
  /**
29
- * Staging for one `transforms` row. Reused across every write — the table serializes it into its
30
- * page shadow synchronously, so nothing outlives the call.
36
+ * Row 0 of the `transforms` table: the scene root. Identity, and its own parent — which is what the
37
+ * hierarchy pass takes as "no further ancestor" — so an entity whose attachment names no entity
38
+ * with a row is posed under it in world space, and the composition is exact. Written once, at the
39
+ * first {@link GPUSceneContext.build}, so it goes up with the first rows rather than being left to
40
+ * whatever the buffer held.
31
41
  */
32
- const TRANSFORM_RECORD = {
33
- local_translation: new Float32Array(3),
34
- local_rotation: new Float32Array(4),
35
- local_scale: new Float32Array(3),
36
- global: new Float32Array(16),
37
- prev_global: new Float32Array(16),
42
+ const ROOT_RECORD = {
43
+ local_translation: new Float32Array([0, 0, 0]),
44
+ local_rotation: new Float32Array([0, 0, 0, 1]),
45
+ local_scale: new Float32Array([1, 1, 1]),
46
+ global: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
47
+ prev_global: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
38
48
  parent: NODE3D_SCENE_ID,
39
49
  };
40
50
 
41
51
  /**
42
- * Placeholder for claiming a row before its contents are known — {@link GPUTypedTable.add} chooses
43
- * the row, and the record has to name it. Overwritten in the same breath, and the table's upload
44
- * de-duplication collapses the pair into a single record.
52
+ * @type {GPURecordWriter}
45
53
  */
46
- const EMPTY_TRANSFORM_RECORD = {
47
- local_translation: new Float32Array(3),
48
- local_rotation: new Float32Array(4),
49
- local_scale: new Float32Array(3),
50
- global: new Float32Array(16),
51
- prev_global: new Float32Array(16),
52
- parent: NODE3D_SCENE_ID,
53
- };
54
+ const ROOT_RECORD_WRITER = generate_record_writer(NODE3D_STRUCT);
54
55
 
55
56
  /**
56
- * Staging for one `meshes` row, on the same terms as {@link TRANSFORM_RECORD}. The two bounds
57
- * fields are references to the mesh's own arrays rather than copies — the table reads them before
58
- * the next call replaces them.
57
+ * What a scene with no rows draws with.
58
+ *
59
+ * @type {ShadeMaterial[]}
59
60
  */
60
- const MESH_RECORD = {
61
- geometry: 0,
62
- material: 0,
63
- node: NODE3D_SCENE_ID,
64
- bounding_box: undefined,
65
- bounding_sphere: undefined,
66
- };
61
+ const NO_MATERIALS = Object.freeze([]);
67
62
 
68
63
  /**
69
- * Abstraction on the context of a scene, there are no hierarchies, just a collection of meshes and a geometry context
64
+ * The GPU side of one {@link Scene}: its database — the `transforms` and `meshes` tables, one row
65
+ * per entity that is drawn or posed, at `entity + 1` — and what is built over that database each
66
+ * frame: the lights' records, the probe volume, the volumetrics, the animation, the TLAS.
67
+ *
68
+ * Nothing here holds a hierarchy of its own. An entity's row names its parent's row and the GPU
69
+ * composes the chain each frame, derives every mesh row's bounds under the composed matrix and
70
+ * builds the tree over them — see {@link tick}. What the CPU writes is what it owns: an entity's
71
+ * local TRS and the row of its parent, through {@link rows}.
70
72
  */
71
73
  export class GPUSceneContext {
72
74
 
@@ -158,37 +160,29 @@ export class GPUSceneContext {
158
160
 
159
161
  /**
160
162
  * GPU-resident scene database — mesh metadata in the `meshes` table,
161
- * scene-graph nodes (transforms) in the `transforms` table. Replaces
162
- * the old flat `instance_buffer`. Consumers bind `scene_database.buffer`
163
- * as `array<u32>` and read records via `scene_read_mesh` /
164
- * `scene_read_node` (see `chunk_scene_database_access`).
163
+ * transforms in the `transforms` table, one row per entity in each.
164
+ * Consumers bind `scene_database.buffer` as `array<u32>` and read
165
+ * records via `scene_read_mesh` / `scene_read_node` (see
166
+ * `chunk_scene_database_access`).
165
167
  *
166
168
  * @type {GPUDatabase}
167
169
  */
168
170
  #scene_database;
169
171
 
170
172
  /**
173
+ * Entities as rows of {@link scene_database} — see {@link rows}. Built the first time it is
174
+ * asked for, which needs the scene to name its dataset by then.
171
175
  *
172
- * @type {Uint32Array}
176
+ * @type {GPUSceneRows|null}
173
177
  */
174
- #instance_metadata = new Uint32Array();
178
+ #rows = null;
175
179
 
176
180
  /**
177
- * Mesh → instance index. Rebuilt each frame in {@link build}. The
178
- * Lookup from a node's stable JS-side {@link Node3D.id} to its row
179
- * in the scene database's `transforms` table. Built during
180
- * {@link build} as each node is allocated via
181
- * {@link GPUTypedTable.add}; the table itself owns the row
182
- * allocation, this map just bridges between Node3D handles and the
183
- * GPU rows they live at.
184
- *
185
- * Public so external code can do partial updates: looking up a
186
- * single node's row lets a system patch one `transforms_table`
187
- * entry instead of re-uploading the whole scene.
181
+ * Whether {@link ROOT_RECORD} has been written to row 0 — once, at the first build.
188
182
  *
189
- * @type {Map<number, number>}
183
+ * @type {boolean}
190
184
  */
191
- id_mapping = new Map();
185
+ #root_written = false;
192
186
 
193
187
  /**
194
188
  * Per-scene skinning state — clone-index cache today, plus
@@ -252,6 +246,57 @@ export class GPUSceneContext {
252
246
  this.#animation_manager = new GPUAnimationManager(device, `GPUSceneContext[${this.id}]/Animation`, this);
253
247
  }
254
248
 
249
+ /**
250
+ * The virtual-geometry runtime, once something has asked for one.
251
+ *
252
+ * `undefined` until {@link enable_virtual_geometry}, and every rasterization path treats that
253
+ * as "there is no virtual geometry in this scene" and skips the cut entirely. Opt-in rather
254
+ * than always-on because the pool owns real buffers — a page arena, a page table, a per-asset
255
+ * lookup — and a scene of ordinary meshes should not pay for them.
256
+ *
257
+ * @type {GPUVirtualGeometryRuntime|undefined}
258
+ */
259
+ #virtual_geometry;
260
+
261
+ /**
262
+ * @returns {GPUVirtualGeometryRuntime|undefined}
263
+ */
264
+ get virtual_geometry() {
265
+ return this.#virtual_geometry;
266
+ }
267
+
268
+ /**
269
+ * Give this scene a virtual-geometry runtime, sharing the meshlet pool with everything else it
270
+ * draws.
271
+ *
272
+ * Sharing the pool is the whole seam on this side: a cut emits `MESHLET_DEFINITION_STRUCT`
273
+ * records naming rows of the same metadata buffer a static mesh's meshlets live in, so nothing
274
+ * downstream of the expansion has to know which kind of geometry it is looking at.
275
+ *
276
+ * @param {Object} [options] passed to {@link GPUVirtualGeometryPool} and
277
+ * {@link GPUVirtualGeometryRuntime}
278
+ * @returns {GPUVirtualGeometryRuntime}
279
+ */
280
+ enable_virtual_geometry(options = {}) {
281
+ if (this.#virtual_geometry !== undefined) {
282
+ return this.#virtual_geometry;
283
+ }
284
+
285
+ const pool = new GPUVirtualGeometryPool({
286
+ device: this.#device,
287
+ meshlets: this.geometries.meshlets,
288
+ ...options,
289
+ });
290
+
291
+ this.#virtual_geometry = new GPUVirtualGeometryRuntime({
292
+ pool,
293
+ device: this.#device,
294
+ ...options,
295
+ });
296
+
297
+ return this.#virtual_geometry;
298
+ }
299
+
255
300
  /**
256
301
  * @returns {GPUAnimationManager}
257
302
  */
@@ -259,9 +304,6 @@ export class GPUSceneContext {
259
304
  return this.#animation_manager;
260
305
  }
261
306
 
262
- #instances_version = -1;
263
-
264
-
265
307
  /**
266
308
  * @type {GPUDevice}
267
309
  */
@@ -291,10 +333,9 @@ export class GPUSceneContext {
291
333
  }
292
334
 
293
335
  /**
294
- * Per-scene skinning subsystem. Routes {@link SkinnedMesh}
295
- * instances through per-instance geometry clones; later phases
296
- * grow Skin-binding management and the per-frame skinning compute
297
- * onto it.
336
+ * Per-scene skinning subsystem. Routes skinned rows through
337
+ * per-instance geometry clones; later phases grow Skin-binding
338
+ * management and the per-frame skinning compute onto it.
298
339
  *
299
340
  * Lazy because it depends on {@link geometries}, which is assigned
300
341
  * externally after this object's constructor returns
@@ -328,495 +369,106 @@ export class GPUSceneContext {
328
369
  }
329
370
 
330
371
  /**
331
- * Grow the per-row mesh metadata to cover `size` rows. Never shrinks: rows are addresses, and a
332
- * table that has held N rows can hand any of them out again.
372
+ * Entities as rows of the scene database, at `entity + 1` in both tables.
333
373
  *
334
- * @param {number} size
335
- */
336
- #allocate_instances(size) {
337
- const required = 2 * size;
338
-
339
- if (this.#instance_metadata.length >= required) {
340
- return;
341
- }
342
-
343
- const previous = this.#instance_metadata;
344
-
345
- this.#instance_metadata = new Uint32Array(required);
346
-
347
- typed_array_copy(previous, this.#instance_metadata);
348
- }
349
-
350
- /**
351
- * World matrix last published for each `transforms` row, 16 floats at `row * 16`.
352
- *
353
- * The GPU hierarchy pass takes whatever is in a row's `global` at the start of the frame and
354
- * moves it to `prev_global` before composing the new one, so what the CPU puts in `global` is
355
- * only ever read as *last* frame's world matrix. Handing it the current one collapses the
356
- * per-object velocity that motion vectors are derived from, which is why this cache exists
357
- * rather than reading `node.transform_global` twice.
358
- *
359
- * @type {Float32Array}
360
- */
361
- #published_globals = new Float32Array();
362
-
363
- /**
364
- * Rows this context owns, by node. Also the answer to "is this node already in the database".
365
- *
366
- * @type {Map<Node3D, SceneNodeBinding>}
367
- */
368
- #bindings = new Map();
369
-
370
- /**
371
- * @type {number}
372
- */
373
- #epoch = 0;
374
-
375
- /**
376
- * @param {number} row
377
- */
378
- #reserve_published_global(row) {
379
- const required = (row + 1) * 16;
380
-
381
- if (this.#published_globals.length >= required) {
382
- return;
383
- }
384
-
385
- const grown = new Float32Array(Math.max(required, this.#published_globals.length * 2));
386
-
387
- typed_array_copy(this.#published_globals, grown);
388
-
389
- this.#published_globals = grown;
390
- }
391
-
392
- /**
393
- * Fill the shared record with `node`'s local TRS, the parent row, and the world matrix last
394
- * published for `row` — see {@link #published_globals} for why that is the previous one and not
395
- * the current one. Leaves `#published_globals` holding the node's current world matrix.
374
+ * A system that places an entity acquires its row here and marks it on the dataset's change
375
+ * events; a scene with no systems places through `prefab_place` and `place_primitive`, which
376
+ * do the same by hand; and {@link build} flushes what was marked. The scene has to name its
377
+ * dataset ({@link Scene.dataset}) before this is first asked for, because the rows are written
378
+ * from that dataset's components.
396
379
  *
397
- * @param {Node3D} node
398
- * @param {number} row
399
- * @param {number} parent_row
400
- * @returns {object} the module-static record, valid until the next call
380
+ * @returns {GPUSceneRows}
401
381
  */
402
- #write_transform_record(node, row, parent_row) {
403
- // read through the scalar accessors: the `translation` / `rotation` / `scale` properties are
404
- // live views, freshly allocated on every access, and this runs once per changed row per frame
405
- const tl = node.transform_local;
406
-
407
- TRANSFORM_RECORD.local_translation[0] = tl.translation_x;
408
- TRANSFORM_RECORD.local_translation[1] = tl.translation_y;
409
- TRANSFORM_RECORD.local_translation[2] = tl.translation_z;
410
-
411
- TRANSFORM_RECORD.local_rotation[0] = tl.rotation_x;
412
- TRANSFORM_RECORD.local_rotation[1] = tl.rotation_y;
413
- TRANSFORM_RECORD.local_rotation[2] = tl.rotation_z;
414
- TRANSFORM_RECORD.local_rotation[3] = tl.rotation_w;
415
-
416
- TRANSFORM_RECORD.local_scale[0] = tl.scale_x;
417
- TRANSFORM_RECORD.local_scale[1] = tl.scale_y;
418
- TRANSFORM_RECORD.local_scale[2] = tl.scale_z;
419
-
420
- this.#reserve_published_global(row);
421
-
422
- const published = this.#published_globals;
423
- const base = row * 16;
424
-
425
- for (let i = 0; i < 16; i++) {
426
- const previous = published[base + i];
427
-
428
- TRANSFORM_RECORD.global[i] = previous;
429
- TRANSFORM_RECORD.prev_global[i] = previous;
430
- }
431
-
432
- const current = node.transform_global;
433
-
434
- for (let i = 0; i < 16; i++) {
435
- published[base + i] = current[i];
436
- }
437
-
438
- TRANSFORM_RECORD.parent = parent_row;
439
-
440
- return TRANSFORM_RECORD;
382
+ get rows() {
383
+ return this.#obtain_rows();
441
384
  }
442
385
 
443
386
  /**
444
- * Seed a row's published world matrix with the node's current one, so the row's first write
445
- * reports zero velocity instead of motion away from the origin.
387
+ * An entity's world bounds as the GPU holds them, read back — what a consumer that wants the
388
+ * box that is drawn asks, a frame or two behind the device. Built on demand, over the rows.
446
389
  *
447
- * @param {Node3D} node
448
- * @param {number} row
390
+ * @returns {GPUEntityBoundsReadback}
449
391
  */
450
- #seed_published_global(node, row) {
451
- this.#reserve_published_global(row);
452
-
453
- const current = node.transform_global;
454
- const base = row * 16;
455
-
456
- for (let i = 0; i < 16; i++) {
457
- this.#published_globals[base + i] = current[i];
458
- }
459
- }
460
-
461
- /**
462
- * @param {Mesh} mesh
463
- * @param {number} transform_row
464
- * @returns {object} the module-static record, valid until the next call
465
- */
466
- #write_mesh_record(mesh, transform_row) {
467
- // A skinned mesh's world bounds are a property of its *skeleton*, and the skeleton is not
468
- // in the mesh's own subtree — Michelle's joint root is the mesh node's next sibling, which
469
- // is the shape every glTF character has. `Node3D.updateMatrices` walks pre-order, so when
470
- // the mesh's own bounds pass ran the joints it reads had not been visited yet and it
471
- // described where the character stood before the move; a second walk would catch up, and
472
- // nothing calls one. Re-deriving here costs a matrix per joint on a mesh that just moved,
473
- // and here every walk is over — which is the only point at which the answer is knowable.
474
- if (mesh.isSkinnedMesh === true) {
475
- mesh.updateBoundsBasic();
392
+ get bounds() {
393
+ if (this.#bounds === null) {
394
+ this.#bounds = new GPUEntityBoundsReadback(this.#scene_database.readback, this.rows);
476
395
  }
477
396
 
478
- // SkinnedMesh routes to its per-instance clone (allocated + cached by the skinning
479
- // context); regular meshes get the source's id. obtain_geometry_index handles both,
480
- // idempotent.
481
- MESH_RECORD.geometry = this.skinning.obtain_geometry_index(mesh);
482
- MESH_RECORD.material = mesh.material.id;
483
- MESH_RECORD.node = transform_row;
484
- MESH_RECORD.bounding_box = mesh.bounding_box;
485
- MESH_RECORD.bounding_sphere = mesh.bounding_sphere;
486
-
487
- return MESH_RECORD;
397
+ return this.#bounds;
488
398
  }
489
399
 
490
400
  /**
491
- * Which row of the `meshes` table a node occupies — **the value the visibility buffer writes
492
- * for every pixel that node covers**, which is what makes it worth reading from outside.
493
- *
494
- * `id_mapping` is not this. That map goes from a node's id to its row in the `transforms`
495
- * table, which is a different table with different rows; a caller that used it to index the
496
- * visibility buffer would be reading somebody else's mesh.
497
- *
498
- * @param {Node3D} node
499
- * @returns {number} the row, or `-1` for a node that is not in this scene or carries no geometry
500
- */
501
- mesh_row_of(node) {
502
- const binding = this.#bindings.get(node);
503
-
504
- return binding === undefined ? -1 : binding.mesh_row;
505
- }
506
-
507
- /**
508
- * Bumped every time the `meshes` table gains or loses a row. **Rows are reused** — the table
509
- * hands out the lowest free one — so a row read through {@link mesh_row_of} and kept is only
510
- * valid while this number is unchanged. Anything holding one compares against its own copy and
511
- * re-reads when they differ.
512
- *
513
- * @returns {number}
514
- */
515
- get mesh_rows_version() {
516
- return this.#mesh_rows_version;
517
- }
518
-
519
- /**
520
- * @see mesh_rows_version
521
- * @type {number}
401
+ * @type {GPUEntityBoundsReadback|null}
522
402
  */
523
- #mesh_rows_version = 0;
403
+ #bounds = null;
524
404
 
525
405
  /**
526
- * Parent's row if the parent is already in the database, the scene root otherwise. The fallback
527
- * covers top-level nodes and parents that are not in this scene at all; a parent that is in the
528
- * scene but not yet added is handled by the caller, which revisits the node once the sweep has
529
- * placed everyone.
406
+ * Every material something in the scene draws with, each once — the rows' own list, kept
407
+ * current as meshes attach and detach. What the rasterizers iterate to decide which buckets
408
+ * and pipelines a frame needs. The array is reused until the set changes; a scene with no
409
+ * rows draws with nothing.
530
410
  *
531
- * @param {Node3D} node
532
- * @returns {number}
411
+ * @returns {ShadeMaterial[]}
533
412
  */
534
- #resolve_parent_row(node) {
535
- const parent = node.parent;
536
-
537
- if (parent === null) {
538
- return NODE3D_SCENE_ID;
539
- }
540
-
541
- const row = this.id_mapping.get(parent.id);
542
-
543
- return row !== undefined ? row : NODE3D_SCENE_ID;
544
- }
545
-
546
- /**
547
- * Give a node rows in the database — one in `transforms`, plus one in `meshes` when it carries
548
- * geometry.
549
- *
550
- * @param {Node3D} node
551
- * @param {GPUTypedTable} transforms_table
552
- * @param {GPUTypedTable} meshes_table
553
- * @returns {SceneNodeBinding}
554
- */
555
- #add_node(node, transforms_table, meshes_table) {
556
- const binding = new SceneNodeBinding();
557
-
558
- const transform_row = this.#add_transform_row(node, this.#resolve_parent_row(node), transforms_table);
559
-
560
- binding.transform_row = transform_row;
561
- binding.version = node.version;
562
- // Seeding a row is the CPU's job whoever owns it afterwards — the row has to exist and hold
563
- // a starting pose before the GPU has written anything into it.
564
- binding.authority = node.transform_authority;
565
-
566
- this.id_mapping.set(node.id, transform_row);
567
-
568
- if (node.isMesh === true) {
569
- this.materials.obtain(node.material);
570
-
571
- const mesh_row = meshes_table.add(this.#write_mesh_record(node, transform_row));
572
-
573
- binding.mesh_row = mesh_row;
574
-
575
- this.#mesh_rows_version++;
576
-
577
- this.#allocate_instances(meshes_table.element_capacity);
578
-
579
- this.#instance_metadata[mesh_row * 2] = node.id;
580
- this.#instance_metadata[mesh_row * 2 + 1] = node.version;
581
-
582
- this.#tlas.instance_add(mesh_row, node);
583
- }
584
-
585
- this.#bindings.set(node, binding);
586
-
587
- return binding;
413
+ get drawn_materials() {
414
+ return this.#rows === null ? NO_MATERIALS : this.#rows.materials;
588
415
  }
589
416
 
590
417
  /**
591
- * Allocate a `transforms` row for a node. The row is not known until the table hands one back,
592
- * and the record has to carry that row's published world matrix — so the row is claimed first
593
- * with a placeholder and written properly immediately after.
594
- *
595
- * @param {Node3D} node
596
- * @param {number} parent_row
597
- * @param {GPUTypedTable} transforms_table
598
- * @returns {number}
418
+ * @returns {GPUSceneRows}
599
419
  */
600
- #add_transform_row(node, parent_row, transforms_table) {
601
- const row = transforms_table.add(EMPTY_TRANSFORM_RECORD);
602
-
603
- this.#seed_published_global(node, row);
420
+ #obtain_rows() {
421
+ if (this.#rows === null) {
422
+ const dataset = this.#scene.dataset;
604
423
 
605
- transforms_table.set(row, this.#write_transform_record(node, row, parent_row));
424
+ assert.notNull(dataset, 'the scene names no dataset — set Scene.dataset before asking for its rows');
425
+ assert.defined(dataset, 'the scene names no dataset — set Scene.dataset before asking for its rows');
606
426
 
607
- return row;
608
- }
609
-
610
- /**
611
- * Take a node's rows back. The rows are freed, not reassigned — see {@link SceneNodeBinding}.
612
- *
613
- * @param {Node3D} node
614
- * @param {SceneNodeBinding} binding
615
- * @param {GPUTypedTable} transforms_table
616
- * @param {GPUTypedTable} meshes_table
617
- */
618
- #remove_node(node, binding, transforms_table, meshes_table) {
619
- if (node.isMesh === true) {
620
- const mesh_row = binding.mesh_row;
621
-
622
- meshes_table.remove(mesh_row);
623
- this.#tlas.instance_remove(mesh_row);
624
-
625
- this.#mesh_rows_version++;
626
-
627
- this.#instance_metadata[mesh_row * 2] = 0;
628
- this.#instance_metadata[mesh_row * 2 + 1] = 0;
629
-
630
- // A skinned mesh renders a per-instance copy of its geometry, and the row just
631
- // given back was the only thing naming it. This is where that copy — its vertex
632
- // region, its BLAS and its prev-position slice — goes back too; nothing else in
633
- // the engine sees a mesh leave, and unbinding deliberately does not free it.
634
- if (node.isSkinnedMesh === true) {
635
- this.skinning.release_clone(node);
636
- }
427
+ this.#rows = new GPUSceneRows({
428
+ dataset,
429
+ transforms: this.#scene_database.get('transforms'),
430
+ meshes: this.#scene_database.get('meshes'),
431
+ geometries: this.geometries,
432
+ materials: this.materials,
433
+ tlas: this.#tlas,
434
+ skinning: () => this.skinning,
435
+ });
637
436
  }
638
437
 
639
- transforms_table.remove(binding.transform_row);
640
-
641
- this.id_mapping.delete(node.id);
642
- this.#bindings.delete(node);
438
+ return this.#rows;
643
439
  }
644
440
 
645
441
  /**
646
- * Bring the database's membership in line with the scene's: nodes that arrived get rows, nodes
647
- * that left give theirs back. Runs only when the batch reports a change, so the per-frame path
648
- * never pays for it.
649
- *
650
- * @param {GPUTypedTable} transforms_table
651
- * @param {GPUTypedTable} meshes_table
652
- * @returns {number} rows written
442
+ * Bring the GPU scene database in line with the scene, writing only the rows that changed:
443
+ * the scene root's, once; a light's, as it arrives; and every entity's row that a system
444
+ * marked since the last build. Nothing is walked — the rows keep what was marked.
653
445
  */
654
- #sync_membership(transforms_table, meshes_table) {
655
- const epoch = ++this.#epoch;
656
-
446
+ build() {
657
447
  let written = 0;
658
448
 
659
- const scene = this.#scene;
660
-
661
- // The scene root must land at row 0 — it is both the hierarchy walk's terminator and the
662
- // natural value of any zero-initialised buffer.
663
- let scene_binding = this.#bindings.get(scene);
664
-
665
- if (scene_binding === undefined) {
666
- scene_binding = this.#add_node(scene, transforms_table, meshes_table);
667
-
668
- assert.equal(scene_binding.transform_row, NODE3D_SCENE_ID, 'scene must land at transforms table row 0');
449
+ if (!this.#root_written) {
450
+ this.#scene_database.get('transforms').set_record(NODE3D_SCENE_ID, ROOT_RECORD, ROOT_RECORD_WRITER);
669
451
 
452
+ this.#root_written = true;
670
453
  written++;
671
454
  }
672
455
 
673
- scene_binding.epoch = epoch;
674
-
675
- const nodes = this.#scene.instances.nodes;
676
- const node_count = nodes.length;
677
-
678
- // Nodes whose parent had not been placed when they were. `Scene.add` walks parents before
679
- // children, so this is empty unless a caller added a child to the scene ahead of its
680
- // parent.
681
- const orphaned = [];
682
-
683
- for (let i = 0; i < node_count; i++) {
684
- const node = nodes[i];
685
-
686
- let binding = this.#bindings.get(node);
687
-
688
- if (binding === undefined) {
689
- binding = this.#add_node(node, transforms_table, meshes_table);
690
-
691
- written++;
692
-
693
- if (node.parent !== null && this.id_mapping.get(node.parent.id) === undefined) {
694
- orphaned.push(node);
695
- }
696
- }
697
-
698
- binding.epoch = epoch;
699
- }
700
-
701
- for (let i = 0; i < orphaned.length; i++) {
702
- const node = orphaned[i];
703
- const parent_row = this.id_mapping.get(node.parent.id);
704
-
705
- if (parent_row === undefined) {
706
- // the parent really is not in this scene — the scene root stands
707
- continue;
708
- }
709
-
710
- const binding = this.#bindings.get(node);
711
-
712
- transforms_table.set(
713
- binding.transform_row,
714
- this.#write_transform_record(node, binding.transform_row, parent_row)
715
- );
716
- }
717
-
718
- for (const [node, binding] of this.#bindings) {
719
- if (binding.epoch !== epoch) {
720
- this.#remove_node(node, binding, transforms_table, meshes_table);
721
-
722
- written++;
723
- }
724
- }
725
-
726
- return written;
727
- }
728
-
729
- /**
730
- * Push every node that has moved since its row was last written, and nothing else.
731
- *
732
- * Rows the GPU owns are left alone entirely — see {@link TransformAuthority}. Their nodes still
733
- * report movement (a CPU-driven parent recursing through `updateMatrices` is enough to mark
734
- * every joint under it), and acting on that report is exactly the collision authority exists to
735
- * prevent.
736
- *
737
- * @param {GPUTypedTable} transforms_table
738
- * @param {GPUTypedTable} meshes_table
739
- * @returns {number} rows written
740
- */
741
- #sync_transforms(transforms_table, meshes_table) {
742
- let written = 0;
743
-
744
- for (const [node, binding] of this.#bindings) {
745
- const authority = node.transform_authority;
746
- const handed_back = authority !== binding.authority && authority === TransformAuthority.CPU;
747
-
748
- binding.authority = authority;
749
-
750
- if (authority === TransformAuthority.GPU) {
751
- continue;
752
- }
753
-
754
- const version = node.version;
755
-
756
- // A row just handed back has to be written whatever the version says: nothing moved it
757
- // while the GPU held it, so there is no change to notice, and the row it is taking over
758
- // holds a pose the CPU never wrote.
759
- if (version === binding.version && !handed_back) {
760
- continue;
761
- }
762
-
763
- if (handed_back) {
764
- // Taking over from an unknown pose — seed the published matrix the way a fresh row
765
- // is seeded, so the first frame back reports no velocity rather than a jump.
766
- this.#seed_published_global(node, binding.transform_row);
767
- }
768
-
769
- binding.version = version;
770
- written++;
771
-
772
- const transform_row = binding.transform_row;
773
-
774
- transforms_table.set(
775
- transform_row,
776
- this.#write_transform_record(node, transform_row, this.#resolve_parent_row(node))
777
- );
778
-
779
- if (node.isMesh !== true) {
780
- continue;
781
- }
782
-
783
- // World-space bounds moved with the node, and culling reads them off the mesh row.
784
- const mesh_row = binding.mesh_row;
785
-
786
- meshes_table.set(mesh_row, this.#write_mesh_record(node, transform_row));
787
-
788
- this.#instance_metadata[mesh_row * 2 + 1] = version;
789
-
790
- this.#tlas.instance_update(mesh_row, node);
456
+ // Entities are rows — marked by the systems that place them, written here. Built on demand
457
+ // because the scene may name its dataset after this context was made.
458
+ if (this.#rows === null && this.#scene.dataset !== null && this.#scene.dataset !== undefined) {
459
+ this.rows;
791
460
  }
792
461
 
793
- return written;
794
- }
462
+ if (this.#rows !== null) {
463
+ // A light is an entity's row, held here on the light collection's behalf — before the
464
+ // flush, so a light that arrived this frame is written this frame.
465
+ this.#lights.sync_rows(this.#rows);
795
466
 
796
- /**
797
- * Bring the GPU scene database in line with the scene, writing only the rows that changed.
798
- *
799
- * Membership is reconciled when the batch says it moved; transforms are checked every frame,
800
- * because a node moving does not touch the batch. Both walk the scene once and write nothing
801
- * for a node that has not changed.
802
- */
803
- build() {
804
-
805
- const batch = this.#scene.instances;
806
-
807
- const meshes_table = this.#scene_database.get('meshes');
808
- const transforms_table = this.#scene_database.get('transforms');
809
-
810
- let written = 0;
811
-
812
- if (this.#instances_version !== batch.version) {
813
- written += this.#sync_membership(transforms_table, meshes_table);
814
-
815
- this.#instances_version = batch.version;
467
+ written += this.#rows.flush();
468
+ } else {
469
+ assert.equal(this.#scene.lights.elements.length, 0, 'the scene has lights and names no dataset; a light is an entity of one');
816
470
  }
817
471
 
818
- written += this.#sync_transforms(transforms_table, meshes_table);
819
-
820
472
  if (written === 0) {
821
473
  return;
822
474
  }
@@ -825,9 +477,9 @@ export class GPUSceneContext {
825
477
  const cmd = ShadeGPUCommandContext.create(this.#graphics, 'GPUSceneContext/database-build');
826
478
 
827
479
  // Also flush the global geometry manager. The first time a scene
828
- // sees a new mesh, scene.build's `obtain_geometry_index` calls
829
- // `geometries.add(...)` which registers the source MeshletGeometry
830
- // and flips `geometries.__needs_update = true`. The next per-frame
480
+ // sees a new mesh, the rows' flush calls `geometries.add(...)`,
481
+ // which registers the source MeshletGeometry and flips
482
+ // `geometries.__needs_update = true`. The next per-frame
831
483
  // `graphics.update()` would normally rebuild
832
484
  // `geometries.buffer_metadata` to reflect those new entries — but
833
485
  // `graphics.update()` runs at the *head* of `Renderer.#begin_frame`,
@@ -871,6 +523,11 @@ export class GPUSceneContext {
871
523
 
872
524
  // TODO add a fast update check, so that calling this multiple times per frame can be fast.
873
525
 
526
+ // The apply point of the scene database's readback: whatever the device has answered since
527
+ // — an entity's drawn bounds, asked for through {@link bounds} — is delivered before
528
+ // anything this frame reads it, and never mid-update.
529
+ this.#scene_database.readback.apply();
530
+
874
531
  this.#light_probe_volume.update();
875
532
  this.#lights.update(ctx);
876
533
  this.#volumetrics.update(ctx, 0);
@@ -885,31 +542,93 @@ export class GPUSceneContext {
885
542
  // TODO update SDF
886
543
 
887
544
  this.build();
888
-
889
- // After the build, which is what feeds the TLAS this frame's arrivals, departures and moves —
890
- // and, for the GPU build, writes the world AABBs it reads out of the `meshes` table.
891
- this.#tlas.update(this.scene_database_buffer);
892
545
  }
893
546
 
894
547
  /**
895
- * Per-frame animation tick — drains pending registrations,
896
- * advances `clip.time` on the GPU, runs apply → resolve →
897
- * hierarchy propagate → skin-matrix prep → skinning. Thin
898
- * passthrough to {@link GPUAnimationManager#tick}; lives here
899
- * so the renderer can call it on every scene it renders without
900
- * reaching past `GPUSceneContext` for an internal manager.
548
+ * Per-frame GPU-side scene update, once per scene per frame, after every view's {@link update}
549
+ * has flushed what the CPU changed:
550
+ *
551
+ * 1. the animation tick — pending registrations drained, `clip.time` advanced, apply → resolve
552
+ * → hierarchy propagate → skin-matrix prep → skinning, through {@link GPUAnimationManager#tick};
553
+ * 2. render bounds — every mesh row's world box and sphere, derived from its geometry under
554
+ * the `global` the hierarchy pass just composed, because the CPU does not hold that matrix
555
+ * for a subtree the GPU drives;
556
+ * 3. light poses — every light record's position and direction, from its entity's row, for
557
+ * the same reason;
558
+ * 4. the TLAS — rebuilt from those bounds when anything moved, on either side.
901
559
  *
902
- * `dt_seconds` is wall-clock seconds since the last call (the
903
- * renderer's `time_delta_seconds` argument to `render()`).
560
+ * All four into `cmd_ctx`, in that order, so the tree the frame's ray passes traverse is built
561
+ * over this frame's bounds rather than last frame's, and what lights the frame is where it is
562
+ * this frame.
563
+ *
564
+ * `dt_seconds` is wall-clock seconds since the last call (the renderer's `time_delta_seconds`
565
+ * argument to `render()`).
904
566
  *
905
567
  * @param {ShadeGPUCommandContext} cmd_ctx
906
568
  * @param {number} dt_seconds wall-clock seconds since last call
907
569
  */
908
570
  tick(cmd_ctx, dt_seconds) {
909
- this.#animation_manager.tick(cmd_ctx, dt_seconds);
571
+ const animated = this.#animation_manager.tick(cmd_ctx, dt_seconds);
572
+
573
+ this.#refresh_mesh_bounds(cmd_ctx);
574
+
575
+ this.#lights.refresh_poses(cmd_ctx, this.scene_database_buffer);
576
+
577
+ if (animated) {
578
+ // Rows moved on the GPU, where no version was bumped: a clip resolved into a TRS, a
579
+ // skinning pass moved a clone's vertices. The bounds pass just re-derived their boxes,
580
+ // and the tree is built over boxes.
581
+ this.#tlas.invalidate();
582
+ }
583
+
584
+ this.#tlas.update(this.scene_database_buffer, cmd_ctx);
585
+
586
+ // What was asked of the scene database this frame is copied out at the tail of the
587
+ // database's own update when rows were written this frame, and here — after the bounds
588
+ // pass — when none were; either way what lands, at the head of a later frame's update, is
589
+ // the box the GPU held when the copy ran.
590
+ this.#scene_database.readback.encode(cmd_ctx);
591
+ }
592
+
593
+ /**
594
+ * Recompute every mesh row's world bounds from its geometry under its composed `global`.
595
+ * Skipped when there is no mesh row; otherwise one thread per slot of the `meshes` table's
596
+ * pages, occupancy-masked.
597
+ *
598
+ * @param {ShadeGPUCommandContext} cmd_ctx
599
+ */
600
+ #refresh_mesh_bounds(cmd_ctx) {
601
+ const meshes_table = this.#scene_database.get('meshes');
602
+
603
+ const group_count = meshes_table.dispatch_group_count(REFRESH_ALL_MESH_BOUNDS_WORKGROUP_SIZE);
604
+
605
+ if (group_count === 0) {
606
+ return;
607
+ }
608
+
609
+ const geometries = this.geometries.buffer_metadata;
610
+
611
+ if (geometries === null) {
612
+ // a mesh row names a geometry, and a geometry is registered before its row is written
613
+ // — so this is a scene whose first frame has not flushed the geometry manager yet
614
+ return;
615
+ }
616
+
617
+ shader_refresh_all_mesh_bounds.dispatch({
618
+ encoder: cmd_ctx,
619
+ group_count_x: group_count,
620
+ bindings: {
621
+ scene_database: this.scene_database_buffer,
622
+ geometries,
623
+ },
624
+ });
910
625
  }
911
626
 
912
627
  destroy() {
628
+ if (this.#rows !== null) {
629
+ this.#rows.destroy();
630
+ }
631
+
913
632
  this.#scene_database.destroy();
914
633
  this.#lights.destroy();
915
634
  this.#light_probe_volume.destroy();