@woosh/meep-engine 3.23.0 → 3.24.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 (522) 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 +416 -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/terrain/pack_terrain_row_table.d.ts +11 -18
  158. package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts.map +1 -1
  159. package/src/engine/graphics3/terrain/pack_terrain_row_table.js +48 -53
  160. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +17 -2
  161. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  162. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +284 -256
  163. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +13 -15
  164. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  165. package/src/engine/physics/cloth/ecs/ClothInstance.js +12 -14
  166. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +7 -8
  167. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
  168. package/src/engine/physics/cloth/ecs/ClothRig.js +7 -8
  169. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +5 -4
  170. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  171. package/src/engine/physics/cloth/ecs/ClothSystem.js +11 -12
  172. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +19 -23
  173. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  174. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +201 -199
  175. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  176. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +8 -0
  177. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts +18 -34
  178. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
  179. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +58 -115
  180. package/src/engine/physics/cloth/playground/README.md +11 -11
  181. package/src/engine/physics/cloth/playground/garment_build.d.ts +0 -1
  182. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
  183. package/src/engine/physics/cloth/playground/garment_build.js +64 -58
  184. package/src/engine/physics/cloth/playground/garment_main.js +59 -33
  185. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  186. package/src/shade/RENDERER_CONTRACT.md +85 -53
  187. package/src/shade/device/ShadeGPUCommandContext.d.ts +23 -0
  188. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  189. package/src/shade/device/ShadeGPUCommandContext.js +36 -0
  190. package/src/shade/playground/add_random_meshes.d.ts +4 -4
  191. package/src/shade/playground/add_random_meshes.d.ts.map +1 -1
  192. package/src/shade/playground/add_random_meshes.js +20 -16
  193. package/src/shade/playground/avboit/main.d.ts +1 -0
  194. package/src/shade/playground/avboit/main.d.ts.map +1 -1
  195. package/src/shade/playground/avboit/main.js +916 -875
  196. package/src/shade/playground/basis_textures/main.d.ts.map +1 -1
  197. package/src/shade/playground/basis_textures/main.js +22 -8
  198. package/src/shade/playground/basis_textures/texture_inventory.d.ts +2 -2
  199. package/src/shade/playground/basis_textures/texture_inventory.d.ts.map +1 -1
  200. package/src/shade/playground/basis_textures/texture_inventory.js +6 -7
  201. package/src/shade/playground/ground_seam/main.d.ts.map +1 -1
  202. package/src/shade/playground/ground_seam/main.js +13 -4
  203. package/src/shade/playground/ground_seam/make_ground.d.ts +13 -4
  204. package/src/shade/playground/ground_seam/make_ground.d.ts.map +1 -1
  205. package/src/shade/playground/ground_seam/make_ground.js +21 -16
  206. package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
  207. package/src/shade/playground/particle_system/main.js +11 -10
  208. package/src/shade/playground/particle_system/particle_prototype.d.ts +15 -10
  209. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
  210. package/src/shade/playground/particle_system/particle_prototype.js +56 -15
  211. package/src/shade/playground/particle_system/particle_scene.d.ts +68 -28
  212. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  213. package/src/shade/playground/particle_system/particle_scene.js +149 -53
  214. package/src/shade/playground/readback_crossover/index.html +41 -0
  215. package/src/shade/playground/readback_crossover/main.d.ts +2 -0
  216. package/src/shade/playground/readback_crossover/main.d.ts.map +1 -0
  217. package/src/shade/playground/readback_crossover/main.js +372 -0
  218. package/src/shade/playground/skinned_blas_refit/README.md +11 -7
  219. package/src/shade/playground/skinned_blas_refit/add_floor.d.ts +13 -44
  220. package/src/shade/playground/skinned_blas_refit/add_floor.d.ts.map +1 -1
  221. package/src/shade/playground/skinned_blas_refit/add_floor.js +19 -59
  222. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  223. package/src/shade/playground/skinned_blas_refit/main.js +67 -58
  224. package/src/shade/playground/skinned_blas_refit/place_character.d.ts +40 -54
  225. package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
  226. package/src/shade/playground/skinned_blas_refit/place_character.js +47 -74
  227. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts +3 -3
  228. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
  229. package/src/shade/playground/skinned_blas_refit/sweep_views.js +4 -3
  230. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +3 -3
  231. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
  232. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +11 -4
  233. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
  234. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +38 -9
  235. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +3 -3
  236. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  237. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +9 -6
  238. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +3 -3
  239. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
  240. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +3 -3
  241. package/src/shade/playground/skinned_mesh_soup/README.md +6 -6
  242. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  243. package/src/shade/playground/skinned_mesh_soup/main.js +44 -102
  244. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +5 -5
  245. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
  246. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +42 -33
  247. package/src/shade/playground/sponza_path_trace/main.d.ts +1 -0
  248. package/src/shade/playground/sponza_path_trace/main.d.ts.map +1 -1
  249. package/src/shade/playground/sponza_path_trace/main.js +393 -363
  250. package/src/shade/playground/ssr_reprojection/main.js +11 -9
  251. package/src/shade/playground/ssr_reprojection/scene.d.ts +15 -4
  252. package/src/shade/playground/ssr_reprojection/scene.d.ts.map +1 -1
  253. package/src/shade/playground/ssr_reprojection/scene.js +32 -11
  254. package/src/shade/playground/ssr_variance/main.js +1 -1
  255. package/src/shade/playground/ssr_variance/scene.d.ts +10 -4
  256. package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -1
  257. package/src/shade/playground/ssr_variance/scene.js +39 -15
  258. package/src/shade/playground/vgeo_viewer/main.js +6 -2
  259. package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
  260. package/src/shade/playground/volumetrics_froxel/main.js +936 -922
  261. package/src/shade/renderer/GraphicsContext.d.ts +7 -0
  262. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  263. package/src/shade/renderer/GraphicsContext.js +11 -0
  264. package/src/shade/renderer/Renderer.d.ts +3 -2
  265. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  266. package/src/shade/renderer/Renderer.js +3 -2
  267. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +39 -47
  268. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  269. package/src/shade/renderer/animation/GPUAnimationManager.js +319 -256
  270. package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts +26 -22
  271. package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts.map +1 -1
  272. package/src/shade/renderer/animation/ShadeAnimationChannel.js +28 -23
  273. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +14 -6
  274. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
  275. package/src/shade/renderer/animation/ShadeAnimationClip.js +20 -8
  276. package/src/shade/renderer/animation/Skin.d.ts +19 -19
  277. package/src/shade/renderer/animation/Skin.d.ts.map +1 -1
  278. package/src/shade/renderer/animation/Skin.js +15 -13
  279. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +6 -5
  280. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  281. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +9 -9
  282. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +5 -59
  283. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -1
  284. package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +8 -132
  285. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +65 -62
  286. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  287. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +148 -194
  288. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  289. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +4 -7
  290. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +2 -2
  291. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +2 -2
  292. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts +74 -0
  293. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts.map +1 -0
  294. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.js +240 -0
  295. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +14 -0
  296. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  297. package/src/shade/renderer/buffer/table/GPUDatabase.js +64 -6
  298. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts +190 -0
  299. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts.map +1 -0
  300. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.js +1323 -0
  301. package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts +10 -0
  302. package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts.map +1 -1
  303. package/src/shade/renderer/buffer/table/GPUPageMetadata.js +12 -0
  304. package/src/shade/renderer/buffer/table/GPUReadbackStagingRing.d.ts +96 -0
  305. package/src/shade/renderer/buffer/table/GPUReadbackStagingRing.d.ts.map +1 -0
  306. package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts +15 -0
  307. package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts.map +1 -0
  308. package/src/shade/renderer/buffer/table/GPUReadbackStatus.js +34 -0
  309. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +75 -7
  310. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  311. package/src/shade/renderer/buffer/table/GPUTypedTable.js +518 -135
  312. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts +19 -0
  313. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts.map +1 -0
  314. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.js +18 -0
  315. package/src/shade/renderer/buffer/table/WordViews.d.ts +39 -0
  316. package/src/shade/renderer/buffer/table/WordViews.d.ts.map +1 -0
  317. package/src/shade/renderer/buffer/table/WordViews.js +62 -0
  318. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts +27 -0
  319. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts.map +1 -0
  320. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.js +117 -0
  321. package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts +121 -0
  322. package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts.map +1 -0
  323. package/src/shade/renderer/buffer/table/serde/generate_record_writer.js +395 -0
  324. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  325. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +70 -20
  326. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +1 -1
  327. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  328. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +6 -5
  329. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +3 -3
  330. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  331. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +15 -11
  332. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.d.ts +1 -1
  333. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.js +4 -4
  334. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts +1 -3
  335. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts.map +1 -1
  336. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.js +5 -4
  337. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -1
  338. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
  339. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -4
  340. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +8 -3
  341. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
  342. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +19 -14
  343. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
  344. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +9 -1
  345. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts +3 -3
  346. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts.map +1 -1
  347. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.js +12 -5
  348. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +1 -1
  349. package/src/shade/renderer/light/GPULightCollection.d.ts +29 -0
  350. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  351. package/src/shade/renderer/light/GPULightCollection.js +444 -329
  352. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  353. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +7 -1
  354. package/src/shade/renderer/light/LightCollection.d.ts +29 -1
  355. package/src/shade/renderer/light/LightCollection.d.ts.map +1 -1
  356. package/src/shade/renderer/light/LightCollection.js +50 -1
  357. package/src/shade/renderer/light/make_sunlight.js +2 -2
  358. package/src/shade/renderer/light/model/Light.d.ts +29 -2
  359. package/src/shade/renderer/light/model/Light.d.ts.map +1 -1
  360. package/src/shade/renderer/light/model/Light.js +30 -2
  361. package/src/shade/renderer/light/model/io/light_record_directional.d.ts +3 -1
  362. package/src/shade/renderer/light/model/io/light_record_directional.d.ts.map +1 -1
  363. package/src/shade/renderer/light/model/io/light_record_directional.js +8 -5
  364. package/src/shade/renderer/light/model/io/light_record_point.d.ts +3 -1
  365. package/src/shade/renderer/light/model/io/light_record_point.d.ts.map +1 -1
  366. package/src/shade/renderer/light/model/io/light_record_point.js +5 -2
  367. package/src/shade/renderer/light/model/io/light_record_spot.d.ts +4 -1
  368. package/src/shade/renderer/light/model/io/light_record_spot.d.ts.map +1 -1
  369. package/src/shade/renderer/light/model/io/light_record_spot.js +10 -6
  370. package/src/shade/renderer/light/place_light.d.ts +16 -0
  371. package/src/shade/renderer/light/place_light.d.ts.map +1 -0
  372. package/src/shade/renderer/light/place_light.js +36 -0
  373. package/src/shade/renderer/light/shader_refresh_light_poses.d.ts +44 -0
  374. package/src/shade/renderer/light/shader_refresh_light_poses.d.ts.map +1 -0
  375. package/src/shade/renderer/light/shader_refresh_light_poses.js +154 -0
  376. package/src/shade/renderer/lightmap/GPULightMap.js +1 -1
  377. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  378. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +12 -14
  379. package/src/shade/renderer/loader/SceneBundle.d.ts +53 -28
  380. package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
  381. package/src/shade/renderer/loader/SceneBundle.js +111 -56
  382. package/src/shade/renderer/loader/SceneNode.d.ts +81 -0
  383. package/src/shade/renderer/loader/SceneNode.d.ts.map +1 -0
  384. package/src/shade/renderer/loader/SceneNode.js +114 -0
  385. package/src/shade/renderer/loader/gltf/load_gltf.d.ts +3 -2
  386. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  387. package/src/shade/renderer/loader/gltf/load_gltf.js +110 -142
  388. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  389. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts +4 -4
  390. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts.map +1 -1
  391. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.js +2 -2
  392. package/src/shade/renderer/loader/usd/load_usd.d.ts +3 -2
  393. package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
  394. package/src/shade/renderer/loader/usd/load_usd.js +4 -5
  395. package/src/shade/renderer/loader/usd/usd_build_scene.d.ts +3 -3
  396. package/src/shade/renderer/loader/usd/usd_build_scene.d.ts.map +1 -1
  397. package/src/shade/renderer/loader/usd/usd_build_scene.js +47 -55
  398. package/src/shade/renderer/material/GPUMaterialManager.js +1 -1
  399. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +5 -4
  400. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  401. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +8 -15
  402. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts +15 -13
  403. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  404. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +40 -21
  405. package/src/shade/renderer/particles/DESIGN.md +53 -50
  406. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +31 -17
  407. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  408. package/src/shade/renderer/particles/GPUParticleSystem.js +54 -91
  409. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +12 -11
  410. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  411. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +12 -11
  412. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +13 -19
  413. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
  414. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +19 -25
  415. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +34 -24
  416. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  417. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +53 -40
  418. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -1
  419. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -1
  420. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  421. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
  422. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +2 -1
  423. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.d.ts.map +1 -1
  424. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.js +5 -2
  425. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +1 -1
  426. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
  427. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +1 -1
  428. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +1 -1
  429. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +1 -1
  430. package/src/shade/renderer/scene/DynamicMesh.d.ts +13 -4
  431. package/src/shade/renderer/scene/DynamicMesh.d.ts.map +1 -1
  432. package/src/shade/renderer/scene/DynamicMesh.js +14 -4
  433. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +38 -18
  434. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  435. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +112 -60
  436. package/src/shade/renderer/scene/GPUSceneContext.d.ts +55 -48
  437. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  438. package/src/shade/renderer/scene/GPUSceneContext.js +594 -928
  439. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +5 -5
  440. package/src/shade/renderer/scene/NODE3D_STRUCT.js +5 -5
  441. package/src/shade/renderer/scene/Node3D.d.ts +27 -8
  442. package/src/shade/renderer/scene/Node3D.d.ts.map +1 -1
  443. package/src/shade/renderer/scene/Node3DDirtyList.d.ts +59 -0
  444. package/src/shade/renderer/scene/Node3DDirtyList.d.ts.map +1 -0
  445. package/src/shade/renderer/scene/Scene.d.ts +18 -60
  446. package/src/shade/renderer/scene/Scene.d.ts.map +1 -1
  447. package/src/shade/renderer/scene/Scene.js +53 -146
  448. package/src/shade/renderer/scene/SkinnedMesh.d.ts +10 -93
  449. package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +1 -1
  450. package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts +24 -3
  451. package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts.map +1 -1
  452. package/src/shade/renderer/scene/bvh/StaticSceneBVH.js +53 -13
  453. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +5 -6
  454. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
  455. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +5 -6
  456. package/src/shade/renderer/scene/optimization/scene_optimize.d.ts +10 -2
  457. package/src/shade/renderer/scene/optimization/scene_optimize.d.ts.map +1 -1
  458. package/src/shade/renderer/scene/optimization/scene_optimize.js +266 -230
  459. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts +53 -0
  460. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts.map +1 -0
  461. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.js +144 -0
  462. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +227 -0
  463. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -0
  464. package/src/shade/renderer/scene/rows/GPUSceneRows.js +1136 -0
  465. package/src/shade/renderer/scene/rows/place_primitive.d.ts +48 -0
  466. package/src/shade/renderer/scene/rows/place_primitive.d.ts.map +1 -0
  467. package/src/shade/renderer/scene/rows/place_primitive.js +98 -0
  468. package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts +10 -8
  469. package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts.map +1 -1
  470. package/src/shade/renderer/scene/serialization/deserialize_scene.js +24 -27
  471. package/src/shade/renderer/scene/serialization/serialize_scene.d.ts +9 -2
  472. package/src/shade/renderer/scene/serialization/serialize_scene.d.ts.map +1 -1
  473. package/src/shade/renderer/scene/serialization/serialize_scene.js +25 -4
  474. package/src/shade/renderer/scene/verify_gpu_tlas_build.js +2 -2
  475. package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.d.ts.map +1 -1
  476. package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.js +5 -0
  477. package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.d.ts.map +1 -1
  478. package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.js +5 -0
  479. package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.d.ts.map +1 -1
  480. package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.js +5 -0
  481. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +39 -0
  482. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  483. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +112 -64
  484. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +7 -0
  485. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  486. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1541 -1352
  487. package/src/shade/renderer/shadow/map/PointLightShadowmap.js +1 -1
  488. package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +1 -1
  489. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +1 -1
  490. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts +29 -0
  491. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts.map +1 -0
  492. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.js +43 -0
  493. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts +13 -0
  494. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts.map +1 -0
  495. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.js +12 -0
  496. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +49 -0
  497. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -0
  498. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +194 -0
  499. package/src/shade/renderer/shadow/map/csm_debug_draw_preview.js +1 -1
  500. package/src/shade/renderer/shadow/map/shadowmap_update_score.js +1 -1
  501. package/src/shade/renderer/shadow/ray/RTXShadows.js +1 -1
  502. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +1 -1
  503. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  504. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +3 -1
  505. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +8 -8
  506. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  507. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +4 -3
  508. package/src/engine/graphics3/instantiate_scene_bundle.js +0 -164
  509. package/src/engine/graphics3/shade_node_to_entity_composition.js +0 -88
  510. package/src/shade/renderer/animation/compute_skin_world_bounds.js +0 -146
  511. package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +0 -531
  512. package/src/shade/renderer/animation/pose/pose_evaluate_world.js +0 -76
  513. package/src/shade/renderer/animation/skin_bind_transform.js +0 -33
  514. package/src/shade/renderer/animation/skin_frame_defect.js +0 -132
  515. package/src/shade/renderer/animation/skin_joint_matrix.js +0 -46
  516. package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +0 -216
  517. package/src/shade/renderer/scene/InstanceBatch.js +0 -235
  518. package/src/shade/renderer/scene/Mesh.js +0 -168
  519. package/src/shade/renderer/scene/Node3D.js +0 -263
  520. package/src/shade/renderer/scene/SceneNodeBinding.js +0 -56
  521. package/src/shade/renderer/scene/SkinnedMesh.js +0 -170
  522. package/src/shade/renderer/scene/TransformAuthority.js +0 -33
@@ -0,0 +1,395 @@
1
+ import { assert } from "../../../../../core/assert.js";
2
+ import LineBuilder from "../../../../../core/codegen/LineBuilder.js";
3
+ import {
4
+ atomic_i32,
5
+ atomic_u32,
6
+ bool,
7
+ f32,
8
+ i32,
9
+ mat3x2f,
10
+ mat4x4f,
11
+ u32,
12
+ vec2f,
13
+ vec2i,
14
+ vec2u,
15
+ vec3f,
16
+ vec3i,
17
+ vec3u,
18
+ vec4f,
19
+ vec4i,
20
+ vec4u
21
+ } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
22
+ import { GPU_DATABASE_BUFFER_ELEMENT_TYPE } from "../GPU_DATABASE_BUFFER_ELEMENT_TYPE.js";
23
+
24
+ /**
25
+ * @typedef {import("../../../shader/type/WebGPUType.js").WebGPUType} WebGPUType
26
+ * @typedef {import("../../../shader/type/WebGPUStruct.js").WebGPUStruct} WebGPUStruct
27
+ */
28
+
29
+ const WORD_SIZE = GPU_DATABASE_BUFFER_ELEMENT_TYPE.size;
30
+
31
+ /**
32
+ * How many words a primitive occupies, and which of the two views takes them — or `undefined` for
33
+ * a type this generator will not emit.
34
+ *
35
+ * The refusals are deliberate and they are all the same refusal: a matrix whose columns are
36
+ * `vec3` (`mat3x3f`, `mat2x3f`, `mat4x3f`) pads each column out to 16 bytes in WGSL, and
37
+ * {@link write_wgsl_type_value} writes its floats end to end instead. One of the two is wrong
38
+ * about where the second column starts, and generating code that agrees with the CPU writer would
39
+ * only pin the disagreement in a second place. `f16` is out for the same reason — half the views
40
+ * here are the wrong width for it.
41
+ *
42
+ * @type {Map<WebGPUType, {words: number, view: string}>}
43
+ */
44
+ const PRIMITIVE_LAYOUT = new Map([
45
+ [bool, { words: 1, view: 'u32' }],
46
+ [u32, { words: 1, view: 'u32' }],
47
+ [atomic_u32, { words: 1, view: 'u32' }],
48
+ // An i32 goes through the u32 view: assignment into a `Uint32Array` is a `ToUint32`, which is
49
+ // the same thirty-two bits a two's-complement `Int32Array` store would leave.
50
+ [i32, { words: 1, view: 'u32' }],
51
+ [atomic_i32, { words: 1, view: 'u32' }],
52
+ [f32, { words: 1, view: 'f32' }],
53
+
54
+ [vec2i, { words: 2, view: 'u32' }],
55
+ [vec3i, { words: 3, view: 'u32' }],
56
+ [vec4i, { words: 4, view: 'u32' }],
57
+
58
+ [vec2u, { words: 2, view: 'u32' }],
59
+ [vec3u, { words: 3, view: 'u32' }],
60
+ [vec4u, { words: 4, view: 'u32' }],
61
+
62
+ [vec2f, { words: 2, view: 'f32' }],
63
+ [vec3f, { words: 3, view: 'f32' }],
64
+ [vec4f, { words: 4, view: 'f32' }],
65
+
66
+ // 16 floats end to end, which is both what WGSL lays out for a vec4-column matrix and what
67
+ // the CPU writer produces
68
+ [mat4x4f, { words: 16, view: 'f32' }],
69
+ // likewise: vec2 columns, 8 bytes each, no padding between them
70
+ [mat3x2f, { words: 6, view: 'f32' }],
71
+ ]);
72
+
73
+ /**
74
+ * One destination the generated code stores into: a pair of views and the expression giving the
75
+ * word the record (or the range blob) starts at.
76
+ *
77
+ * @typedef {object} WriterTarget
78
+ * @property {string} f32 name of the `Float32Array` parameter
79
+ * @property {string} u32 name of the `Uint32Array` parameter
80
+ * @property {string} base name of the base-word parameter
81
+ * @property {function(number):number} word_of maps a byte offset within the record to a word index
82
+ * relative to `base`
83
+ */
84
+
85
+ /**
86
+ * Emit the stores that put `value_expr` — already bound to a local — at `byte_offset` within the
87
+ * record, into every target.
88
+ *
89
+ * @param {LineBuilder} builder
90
+ * @param {WriterTarget[]} targets
91
+ * @param {number} byte_offset within the record
92
+ * @param {WebGPUType} type
93
+ * @param {string} value_expr
94
+ */
95
+ function emit_value(builder, targets, byte_offset, type, value_expr) {
96
+ if (type.isStruct === true) {
97
+ const fields = type.fields;
98
+
99
+ for (let i = 0; i < fields.length; i++) {
100
+ const field = fields[i];
101
+
102
+ emit_value(builder, targets, byte_offset + field.offset, field.type, `${value_expr}.${field.name}`);
103
+ }
104
+
105
+ return;
106
+ }
107
+
108
+ if (type.isArray === true) {
109
+ assert.notOk(type.runtime_sized, `'${type}' is runtime sized — a record is fixed width`);
110
+
111
+ const element_type = type.type;
112
+ const element_stride = element_type.aligned_size;
113
+
114
+ for (let i = 0; i < type.count; i++) {
115
+ emit_value(builder, targets, byte_offset + i * element_stride, element_type, `${value_expr}[${i}]`);
116
+ }
117
+
118
+ return;
119
+ }
120
+
121
+ const layout = PRIMITIVE_LAYOUT.get(type);
122
+
123
+ if (layout === undefined) {
124
+ throw new Error(`Unsupported type '${type}' — see PRIMITIVE_LAYOUT for which types a record writer will emit and why`);
125
+ }
126
+
127
+ assert.equal(byte_offset % WORD_SIZE, 0, `'${value_expr}' sits at byte ${byte_offset}, which is not a whole number of ${WORD_SIZE}-byte words into the record`);
128
+
129
+ const word = byte_offset / WORD_SIZE;
130
+
131
+ if (layout.words === 1) {
132
+ for (const target of targets) {
133
+ builder.add(`${target[layout.view]}[${target.base} + ${target.word_of(word)}] = ${value_expr};`);
134
+ }
135
+
136
+ return;
137
+ }
138
+
139
+ for (let i = 0; i < layout.words; i++) {
140
+ for (const target of targets) {
141
+ builder.add(`${target[layout.view]}[${target.base} + ${target.word_of(word + i)}] = ${value_expr}[${i}];`);
142
+ }
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Byte ranges covering `fields`, ascending, with touching or overlapping ones merged.
148
+ *
149
+ * Merging is what makes the result worth generating from rather than iterating: `NODE3D_STRUCT`'s
150
+ * four CPU-owned fields are three separate spans in the source declaration and two ranges once
151
+ * `pack()` and this have had their say, so a row's update costs two descriptors rather than four.
152
+ *
153
+ * @param {WGSLStructField[]} fields
154
+ * @returns {number[]} `[byte_offset, byte_length]` pairs
155
+ */
156
+ function cover_fields(fields) {
157
+ const spans = fields
158
+ .map(field => [field.offset, field.offset + field.size])
159
+ .sort((a, b) => a[0] - b[0]);
160
+
161
+ const ranges = [];
162
+
163
+ let lo = spans[0][0];
164
+ let hi = spans[0][1];
165
+
166
+ for (let i = 1; i < spans.length; i++) {
167
+ const span = spans[i];
168
+
169
+ if (span[0] > hi) {
170
+ ranges.push(lo, hi - lo);
171
+
172
+ lo = span[0];
173
+ }
174
+
175
+ hi = Math.max(hi, span[1]);
176
+ }
177
+
178
+ ranges.push(lo, hi - lo);
179
+
180
+ return ranges;
181
+ }
182
+
183
+ /**
184
+ * A compiled writer for some subset of a record's fields — what {@link GPUTypedTable.set_record}
185
+ * and {@link GPUTypedTable.set_fields} take in place of walking the type.
186
+ *
187
+ * Built by {@link generate_record_writer}; there is no reason to construct one directly.
188
+ */
189
+ export class GPURecordWriter {
190
+
191
+ /**
192
+ * The record type this writer was generated against. A table only accepts a writer whose type
193
+ * is its own — a writer carries hard-coded offsets, so handing one to the wrong table would
194
+ * scatter fields across a record that has nothing to do with them.
195
+ *
196
+ * @type {WebGPUStruct}
197
+ */
198
+ type;
199
+
200
+ /**
201
+ * Names of the fields this writer sets, in ascending offset order. Anything else in the record
202
+ * is left exactly as it was found, on every destination.
203
+ *
204
+ * @type {string[]}
205
+ */
206
+ fields;
207
+
208
+ /**
209
+ * `[byte_offset, byte_length]` pairs covering {@link fields}, ascending and non-touching — the
210
+ * ranges {@link write_record_and_ranges} lays out, and the descriptors a partial upload
211
+ * queues for them.
212
+ *
213
+ * @type {number[]}
214
+ */
215
+ ranges;
216
+
217
+ /**
218
+ * Total words across {@link ranges} — what one row's update adds to a partial stream's data
219
+ * blob.
220
+ *
221
+ * @type {number}
222
+ */
223
+ range_word_count;
224
+
225
+ /**
226
+ * Write the owned fields of `value` into the record starting at word `word_base`.
227
+ *
228
+ * The destination is named as a pair of views rather than a buffer because it is not always a
229
+ * page: the same call patches a whole record already pending in an upload buffer, where the
230
+ * record starts one word past the element id.
231
+ *
232
+ * @type {function(Float32Array, Uint32Array, number, *):void}
233
+ * @param {Float32Array} f32
234
+ * @param {Uint32Array} u32
235
+ * @param {number} word_base word the record starts at
236
+ * @param {*} value
237
+ */
238
+ write_record;
239
+
240
+ /**
241
+ * As {@link write_record}, and in the same pass lay {@link ranges} out end to end starting at
242
+ * `data_word_base` of a partial stream's data blob.
243
+ *
244
+ * One pass rather than a write followed by a copy: the ranges of a given struct are fixed when
245
+ * the writer is generated, so the two destinations of every field are both constants and the
246
+ * value is only read once.
247
+ *
248
+ * @type {function(Float32Array, Uint32Array, number, Float32Array, Uint32Array, number, *):void}
249
+ * @param {Float32Array} f32
250
+ * @param {Uint32Array} u32
251
+ * @param {number} word_base word the record starts at
252
+ * @param {Float32Array} data_f32
253
+ * @param {Uint32Array} data_u32
254
+ * @param {number} data_word_base word the first range is laid out at
255
+ * @param {*} value
256
+ */
257
+ write_record_and_ranges;
258
+
259
+ /**
260
+ * Source of the two generated functions, for a spec to read and a developer to print. Not used
261
+ * at runtime — the functions are already compiled.
262
+ *
263
+ * @type {string}
264
+ */
265
+ source;
266
+ }
267
+
268
+ /**
269
+ * Compile a writer for `field_names` of `type`.
270
+ *
271
+ * {@link write_wgsl_type_value} walks the type on every record: a property lookup, a type
272
+ * dispatch and a `BinaryBuffer` cursor advance per field, per write. The offsets it arrives at are
273
+ * the same ones every time, so this arrives at them once and emits the stores.
274
+ *
275
+ * The fields a caller does *not* name matter as much as the ones it does. A consumer that owns
276
+ * part of a record — `GPUSceneContext` owns a node's local TRS and its parent row, the GPU owns
277
+ * the composed matrices — names its own, and gets both a writer that leaves the rest alone and
278
+ * the byte ranges to tell the GPU about. Naming every field instead gives a whole-record writer,
279
+ * which is what {@link GPUTypedTable.set} would have produced reflectively.
280
+ *
281
+ * @param {WebGPUStruct} type packed struct; offsets are read off its fields as they stand
282
+ * @param {string[]} [field_names] defaults to every field, in declaration order
283
+ * @returns {GPURecordWriter}
284
+ */
285
+ export function generate_record_writer(type, field_names) {
286
+ assert.defined(type, 'type');
287
+ assert.equal(type.isWebGPUType, true, 'type.isWebGPUType !== true');
288
+ assert.equal(type.isStruct, true, `'${type}' is not a struct — a record writer is named fields, and there are none to name`);
289
+ assert.equal(type.size % WORD_SIZE, 0, `'${type}' is ${type.size} bytes, not a whole number of ${WORD_SIZE}-byte words`);
290
+
291
+ const names = field_names === undefined
292
+ ? type.fields.map(field => field.name)
293
+ : field_names;
294
+
295
+ assert.isArray(names, 'field_names');
296
+ assert.greaterThan(names.length, 0, 'field_names.length');
297
+
298
+ const fields = names.map(name => type.get(name));
299
+
300
+ // Ascending offset, so the generated stores run forward through the record and the ranges they
301
+ // fill are laid out in the order the descriptors will name them.
302
+ fields.sort((a, b) => a.offset - b.offset);
303
+
304
+ const ranges = cover_fields(fields);
305
+
306
+ // Word index within the blob of each range's first word — the running total of the ranges
307
+ // before it.
308
+ const range_word_starts = [];
309
+ let range_word_count = 0;
310
+
311
+ for (let i = 0; i < ranges.length; i += 2) {
312
+ assert.equal(ranges[i] % WORD_SIZE, 0, `range starting at byte ${ranges[i]} of '${type}' is not word-aligned`);
313
+ assert.equal(ranges[i + 1] % WORD_SIZE, 0, `range of ${ranges[i + 1]} bytes in '${type}' is not a whole number of words`);
314
+
315
+ range_word_starts.push(range_word_count);
316
+
317
+ range_word_count += ranges[i + 1] / WORD_SIZE;
318
+ }
319
+
320
+ /**
321
+ * Word index within the blob for a word index within the record.
322
+ *
323
+ * @param {number} word
324
+ * @returns {number}
325
+ */
326
+ function blob_word_of(word) {
327
+ for (let i = 0; i < ranges.length; i += 2) {
328
+ const start = ranges[i] / WORD_SIZE;
329
+ const end = start + ranges[i + 1] / WORD_SIZE;
330
+
331
+ if (word >= start && word < end) {
332
+ return range_word_starts[i / 2] + (word - start);
333
+ }
334
+ }
335
+
336
+ throw new Error(`word ${word} of '${type}' is not covered by any range — the cover is built from the same fields the stores are`);
337
+ }
338
+
339
+ /**
340
+ * @type {WriterTarget}
341
+ */
342
+ const record_target = { f32: 'f32', u32: 'u32', base: 'word_base', word_of: word => word };
343
+
344
+ /**
345
+ * @type {WriterTarget}
346
+ */
347
+ const blob_target = { f32: 'data_f32', u32: 'data_u32', base: 'data_word_base', word_of: blob_word_of };
348
+
349
+ /**
350
+ * @param {WriterTarget[]} targets
351
+ * @returns {string}
352
+ */
353
+ function body(targets) {
354
+ const builder = new LineBuilder();
355
+
356
+ for (const field of fields) {
357
+ const local = `_${field.name}`;
358
+
359
+ builder.add(`const ${local} = value.${field.name};`);
360
+
361
+ emit_value(builder, targets, field.offset, field.type, local);
362
+ }
363
+
364
+ return builder.build();
365
+ }
366
+
367
+ const record_body = body([record_target]);
368
+ const both_body = body([record_target, blob_target]);
369
+
370
+ const writer = new GPURecordWriter();
371
+
372
+ writer.type = type;
373
+ writer.fields = fields.map(field => field.name);
374
+ writer.ranges = ranges;
375
+ writer.range_word_count = range_word_count;
376
+
377
+ writer.write_record = new Function('f32', 'u32', 'word_base', 'value', record_body);
378
+ writer.write_record_and_ranges = new Function(
379
+ 'f32', 'u32', 'word_base',
380
+ 'data_f32', 'data_u32', 'data_word_base',
381
+ 'value',
382
+ both_body
383
+ );
384
+
385
+ writer.source = [
386
+ `function write_record(f32, u32, word_base, value){`,
387
+ record_body,
388
+ `}`,
389
+ `function write_record_and_ranges(f32, u32, word_base, data_f32, data_u32, data_word_base, value){`,
390
+ both_body,
391
+ `}`,
392
+ ].join('\n');
393
+
394
+ return writer;
395
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"GPUSingleTypeTable.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js"],"names":[],"mappings":"AA2EA;;;GAGG;AACH;IAsCI;;;;;;OAMG;IACH;QAJ8B,MAAM;QACL,IAAI,EAAxB,UAAU;QACO,YAAY,GAA7B,MAAM;OAoBhB;IA9DD;;;OAGG;IACH,eAHU,UAAU,CAGf;IAEL;;;OAGG;IACH,2BAAM;IAEN;;;OAGG;IACH,sBAA2E;IAE3E;;;OAGG;IACH,kBAAyB;IAOzB;;;OAGG;IACH,+BAEC;IA6BD;;;OAGG;IACH,WAFW,MAAM,QAQhB;IAED;;;OAGG;IACH,QAFY,MAAM,CAIjB;IAED;;;;OAIG;IACH,WAHW,MAAM,kBA6ChB;IAED;;;;OAIG;IACH,aAHW,MAAM,OAiBhB;IAuCD;;;OAGG;IACH,oBAFW,sBAAsB,QAkDhC;IAED,0BAQC;IAED,gBAEC;;CACJ;qCAjUY,OAAO,8CAA8C,EAAE,sBAAsB;yBAC7E,OAAO,oCAAoC,EAAE,UAAU"}
1
+ {"version":3,"file":"GPUSingleTypeTable.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js"],"names":[],"mappings":"AA6EA;;;GAGG;AACH;IA4DI;;;;;;OAMG;IACH;QAJ8B,MAAM;QACL,IAAI,EAAxB,UAAU;QACO,YAAY,GAA7B,MAAM;OAoBhB;IApFD;;;OAGG;IACH,eAHU,UAAU,CAGf;IAEL;;;OAGG;IACH,2BAAM;IAEN;;;OAGG;IACH,sBAA2E;IAE3E;;;OAGG;IACH,kBAAyB;IA6BzB;;;OAGG;IACH,+BAEC;IA6BD;;;OAGG;IACH,WAFW,MAAM,QAQhB;IAED;;;OAGG;IACH,QAFY,MAAM,CAIjB;IAED;;;;OAIG;IACH,WAHW,MAAM,kBAyChB;IAgCD;;;;OAIG;IACH,aAHW,MAAM,OAiBhB;IAuCD;;;OAGG;IACH,oBAFW,sBAAsB,QAkDhC;IAED,0BAQC;IAED,gBAEC;;CACJ;qCA7WY,OAAO,8CAA8C,EAAE,sBAAsB;yBAC7E,OAAO,oCAAoC,EAAE,UAAU"}
@@ -2,6 +2,12 @@ import { assert } from "../../../../../core/assert.js";
2
2
  import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
3
3
  import { BitSet } from "../../../../../core/binary/BitSet.js";
4
4
  import { platform_compute_endianness } from "../../../../../core/binary/platform_compute_endianness.js";
5
+ import {
6
+ u32_index_clear,
7
+ u32_index_count,
8
+ u32_index_get,
9
+ u32_index_set,
10
+ } from "../../../../../core/collection/map/u32_index.js";
5
11
  import { round_up } from "../../../../../core/math/round_up.js";
6
12
  import { KILOBYTE } from "../../../../../core/science/units/memory/KILOBYTE.js";
7
13
  import { write_wgsl_type_value } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
@@ -22,10 +28,6 @@ import { GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE } from "../GPU_DATABASE_UPLOAD_
22
28
  const UPLOAD_BUFFER_LIMIT = 64 * KILOBYTE;
23
29
  const INITIAL_BUFFER_SIZE = 4 * KILOBYTE;
24
30
 
25
- // how many recent upload records set() scans for an existing record with the same id
26
- // (see GPUTypedTable's constant of the same name)
27
- const UPLOAD_BUFFER_DEDUP_LOOKBACK = 256;
28
-
29
31
  const UPDATE_SETTINGS_STRUCT = WebGPUStruct.from({
30
32
  count: u32,
31
33
  record_size: u32,
@@ -102,6 +104,28 @@ export class GPUSingleTypeTable {
102
104
  */
103
105
  occupancy = new BitSet();
104
106
 
107
+ /**
108
+ * Byte offset in {@link upload_buffer} of the record pending for an id, for every id that has
109
+ * one.
110
+ *
111
+ * Every record is consumed by its own thread of a single {@link update} dispatch, so two
112
+ * records aimed at one id are last-writer-wins across workgroups that have no ordering between
113
+ * them — the buffer must therefore hold at most one record per id. This was a backwards scan
114
+ * over the last 256 records, and a window is not a guarantee: a record further back than the
115
+ * scan reached stayed queued alongside the one that replaced it. The sibling
116
+ * {@link GPUTypedTable} was found doing exactly that, through a downstream report of corrupted
117
+ * animation bindings.
118
+ *
119
+ * No consumer of this table has reached it — each writes an id once per frame — which is the
120
+ * only reason it was latent rather than live here.
121
+ *
122
+ * `null` until the table takes its first write.
123
+ *
124
+ * @private
125
+ * @type {Uint32Array|null}
126
+ */
127
+ #pending_records = null;
128
+
105
129
  /**
106
130
  * @type {GPUDevice}
107
131
  */
@@ -178,25 +202,20 @@ export class GPUSingleTypeTable {
178
202
  const stride = this.type.aligned_size + u32.size;
179
203
  const tail = upload_buffer.position;
180
204
 
181
- // Dedupe against recent records: each record is consumed by its own thread in a
182
- // single update dispatch, so two records for the same id would race
205
+ // Dedupe against everything queued, not a window of it: each record is consumed by its own
206
+ // thread in a single update dispatch, so two records for the same id would race
183
207
  // (last-writer-wins, non-deterministic). Overwrite the previous value in place.
184
- const max_lookback = Math.min(
185
- UPLOAD_BUFFER_DEDUP_LOOKBACK,
186
- Math.floor(tail / stride),
187
- );
208
+ const pending_record = this.#pending_record_offset(id);
188
209
 
189
- for (let i = 1; i <= max_lookback; i++) {
190
- const candidate_start = tail - i * stride;
191
- upload_buffer.position = candidate_start;
192
- if (upload_buffer.readUint32() === id) {
193
- write_wgsl_type_value(value, upload_buffer, this.type);
194
- upload_buffer.position = tail;
195
- return;
196
- }
197
- }
210
+ if (pending_record >= 0) {
211
+ upload_buffer.position = pending_record + u32.size;
198
212
 
199
- upload_buffer.position = tail;
213
+ write_wgsl_type_value(value, upload_buffer, this.type);
214
+
215
+ upload_buffer.position = tail;
216
+
217
+ return;
218
+ }
200
219
 
201
220
  // Reserve the whole stride up front. The writes below only reach the last field,
202
221
  // so on a type that pads out to `aligned_size` they would leave the buffer short
@@ -209,6 +228,37 @@ export class GPUSingleTypeTable {
209
228
 
210
229
  upload_buffer.position = round_up(upload_buffer.position, stride);
211
230
 
231
+ this.#pending_records = u32_index_set(this.#pending_records, id, tail);
232
+ }
233
+
234
+ /**
235
+ * Byte offset of the record already pending for an id, or -1. One record per id is the
236
+ * invariant that keeps the update dispatch race-free — see {@link #pending_records}.
237
+ *
238
+ * Also where a stream dispatched since the last write gets noticed: {@link update} rewinds
239
+ * {@link upload_buffer} by moving its position back to zero and tells nobody, so the index can
240
+ * outlive the records it points at. {@link set} consults this before appending, which is what
241
+ * the staleness check rests on.
242
+ *
243
+ * @private
244
+ * @param {number} id
245
+ * @returns {number} byte offset of the pending record, or -1
246
+ */
247
+ #pending_record_offset(id) {
248
+ const pending = this.#pending_records;
249
+
250
+ if (pending === null || u32_index_count(pending) === 0) {
251
+ return -1;
252
+ }
253
+
254
+ if (this.upload_buffer.position === 0) {
255
+ // the stream was dispatched and rewound since these were recorded
256
+ u32_index_clear(pending);
257
+
258
+ return -1;
259
+ }
260
+
261
+ return u32_index_get(pending, id);
212
262
  }
213
263
 
214
264
  /**
@@ -125,7 +125,7 @@ export class GPUDynamicMeshResidency {
125
125
  */
126
126
  create_bindings(encoder, mesh, camera) {
127
127
  const draw_buffer = encoder.allocateTransientValueBuffer(DYNAMIC_MESH_DRAW_STRUCT, {
128
- model: mesh.transform_global,
128
+ model: mesh.transform.matrix,
129
129
  color: mesh.color,
130
130
  });
131
131
 
@@ -1 +1 @@
1
- {"version":3,"file":"GPUGeometryBVHManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js"],"names":[],"mappings":"AAmBA;;;GAGG;AAEH;;;;;GAKG;AACH,gDAGG;AAEH;;;;;;;;;;;GAWG;AACH,sCAFU,MAAM,CAEyB;AAoBzC;;;;;;;;;;;;;;GAcG;AACH;IA0II;;;OAGG;IACH,+BAoDC;IA1LD;;;OAGG;IACH,iCAEC;IAOD;;;OAGG;IACH,6BAEC;IAuCD;;OAEG;IACH,gCAEC;IAOD;;OAEG;IACH,mCAEC;IA+BD;;OAEG;IACH,gCAEC;IA6ED;;;;OAIG;IACH,iCAEC;IAED,+BAoBC;IAED;;;;;;;;;;;;;;OAcG;IACH,cALW,MAAM,UACN,eAAe,GAEb,sBAAsB,CAalC;IA8DD;;;;;;;;;;;;OAYG;IACH,wBAHW,MAAM,GACJ;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAC,GAAC,SAAS,CAqB3I;IAED;;;;;;OAMG;IACH,mBAHW,MAAM,GACJ,MAAM,GAAC,SAAS,CAU5B;IAED;;;;;;;;;OASG;IACH,0BAFW,WAAW,QAQrB;IAED;;;;;;;;;;;OAWG;IACH,cAHW,MAAM,GACJ,OAAO,CA8BnB;IA2LD;;;;;;;OAOG;IACH,eAOC;;CAuIJ;8BAvzBY,OAAO,uBAAuB,EAAE,eAAe;yBAC/C,OAAO,sDAAsD,EAAE,UAAU;6BAbzD,mCAAmC;uCASzB,6BAA6B"}
1
+ {"version":3,"file":"GPUGeometryBVHManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js"],"names":[],"mappings":"AAmBA;;;GAGG;AAEH;;;;;GAKG;AACH,gDAGG;AAEH;;;;;;;;;;;GAWG;AACH,sCAFU,MAAM,CAEyB;AAoBzC;;;;;;;;;;;;;;GAcG;AACH;IA0II;;;OAGG;IACH,+BAoDC;IA1LD;;;OAGG;IACH,iCAEC;IAOD;;;OAGG;IACH,6BAEC;IAuCD;;OAEG;IACH,gCAEC;IAOD;;OAEG;IACH,mCAEC;IA+BD;;OAEG;IACH,gCAEC;IA6ED;;;;OAIG;IACH,iCAEC;IAED,+BAoBC;IAED;;;;;;;;;;;;;;OAcG;IACH,cALW,MAAM,UACN,eAAe,GAEb,sBAAsB,CAalC;IA8DD;;;;;;;;;;;;OAYG;IACH,wBAHW,MAAM,GACJ;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAC,GAAC,SAAS,CAqB3I;IAED;;;;;;OAMG;IACH,mBAHW,MAAM,GACJ,MAAM,GAAC,SAAS,CAU5B;IAED;;;;;;;;;OASG;IACH,0BAFW,WAAW,QAQrB;IAED;;;;;;;;;;;OAWG;IACH,cAHW,MAAM,GACJ,OAAO,CA8BnB;IA4LD;;;;;;;OAOG;IACH,eAOC;;CAuIJ;8BAxzBY,OAAO,uBAAuB,EAAE,eAAe;yBAC/C,OAAO,sDAAsD,EAAE,UAAU;6BAbzD,mCAAmC;uCASzB,6BAA6B"}
@@ -584,11 +584,12 @@ export class GPUGeometryBVHManager {
584
584
  return first_attempt;
585
585
  }
586
586
 
587
- // The allocator sorts free space into bins by size and rounds a bin down, so it can refuse
588
- // a request the arena has room for. Asking for the shortfall exactly can therefore come
589
- // back refused a second time; the growth helper's own step and multiplier are the
590
- // headroom that makes the retry land.
591
- this.#ensure_data_capacity(this.#node_capacity + node_count);
587
+ // What the allocation is waiting for is a free run reaching a whole bin, which is more
588
+ // than the shortfall and is the allocator's arithmetic to do rather than this caller's.
589
+ // #ensure_data_capacity rounds the answer up to a buffer alignment and applies its own
590
+ // growth step on top, which is amortisation and not headroom: both are relative to the
591
+ // buffer as it stands, so neither adds anything to a request that dwarfs it.
592
+ this.#ensure_data_capacity(this.#allocator.grow_target_for(node_count));
592
593
 
593
594
  const second_attempt = this.#allocator.allocate(node_count);
594
595
 
@@ -26,9 +26,9 @@ export class GPUMeshletManager {
26
26
  * Growing closes no holes, which is why it leaves {@link #deallocations_since_last_rebuild}
27
27
  * alone: the holes it did not close are still there for a later {@link compact} to close.
28
28
  *
29
- * The arena an allocator is asked for is a little larger than the shortfall, because the bins
30
- * round free runs down and requests up, up to 9/8 apart — room for exactly `extra_data_size`
31
- * can still be refused the allocation that asked for it. And no larger than
29
+ * The arena an allocator is asked for is {@link OffsetAllocator#grow_target_for}, not the
30
+ * shortfall: room for exactly `extra_data_size` can still be refused the allocation that asked
31
+ * for it, and how much more than that it takes is the allocator's to say. And no larger than
32
32
  * `maxBufferSize`: growth stops at what the device will hand out, so an arena that cannot
33
33
  * hold the request reports that through the caller's failed allocation rather than through a
34
34
  * buffer that is not there.
@@ -1 +1 @@
1
- {"version":3,"file":"GPUMeshletManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/meshlet/GPUMeshletManager.js"],"names":[],"mappings":"AAmFA;IAqEI;;;;;;OAMG;IACH;QAJ8B,MAAM;QACR,qBAAqB,GAAtC,MAAM;QACW,yBAAyB,GAA1C,MAAM;OAkChB;IAzFD,6BAEC;IAOD,iCAEC;IAgFD,gBAKC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,sBAHW,MAAM,uBACN,MAAM,QAuHhB;IAqRD;;;;;;;;;;;OAWG;IACH,qBAJW,4BAA4B,GAE1B,OAAO,CAmBnB;IAgCD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,+BAHW,4BAA4B,GAC1B,4BAA4B,CA8BxC;IAED;;;;;;;;;;;;OAYG;IACH,gBAFW,sBAAsB,QA8GhC;IAED,gBAGC;IAED;;;;OAIG;IACH,iBAHW,YAAY,GACV,4BAA4B,CA6BxC;IAED,mCASC;IAED,wCAQC;IAED,+BAYC;;CACJ;yBA/4BY,OAAO,sDAAsD,EAAE,UAAU;qCACzE,OAAO,2CAA2C,EAAE,sBAAsB;2BAC1E,OAAO,mBAAmB,EAAE,YAAY;AA6BrD;IACI;;OAEG;IACH,UAFU,UAAU,CAEZ;IACR;;OAEG;IACH,MAFU,UAAU,CAEhB;IAEJ;;;OAGG;IACH,WAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,eAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,0BAFU,WAAW,CAEI;IAEzB;;;OAGG;IACH,aAAsB;CACzB"}
1
+ {"version":3,"file":"GPUMeshletManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/meshlet/GPUMeshletManager.js"],"names":[],"mappings":"AAuFA;IAqEI;;;;;;OAMG;IACH;QAJ8B,MAAM;QACR,qBAAqB,GAAtC,MAAM;QACW,yBAAyB,GAA1C,MAAM;OAkChB;IAzFD,6BAEC;IAOD,iCAEC;IAgFD,gBAKC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,sBAHW,MAAM,uBACN,MAAM,QAuHhB;IAqRD;;;;;;;;;;;OAWG;IACH,qBAJW,4BAA4B,GAE1B,OAAO,CAmBnB;IAgCD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,+BAHW,4BAA4B,GAC1B,4BAA4B,CA8BxC;IAED;;;;;;;;;;;;OAYG;IACH,gBAFW,sBAAsB,QA8GhC;IAED,gBAGC;IAED;;;;OAIG;IACH,iBAHW,YAAY,GACV,4BAA4B,CA6BxC;IAED,mCASC;IAED,wCAQC;IAED,+BAYC;;CACJ;yBA/4BY,OAAO,sDAAsD,EAAE,UAAU;qCACzE,OAAO,2CAA2C,EAAE,sBAAsB;2BAC1E,OAAO,mBAAmB,EAAE,YAAY;AA6BrD;IACI;;OAEG;IACH,UAFU,UAAU,CAEZ;IACR;;OAEG;IACH,MAFU,UAAU,CAEhB;IAEJ;;;OAGG;IACH,WAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,eAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,0BAFU,WAAW,CAEI;IAEzB;;;OAGG;IACH,aAAsB;CACzB"}
@@ -1,5 +1,9 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { ALLOCATOR_NO_SPACE, OffsetAllocator } from "../../../../core/binary/allocator/OffsetAllocator.js";
2
+ import {
3
+ ALLOCATOR_NO_SPACE,
4
+ allocator_run_size_for,
5
+ OffsetAllocator
6
+ } from "../../../../core/binary/allocator/OffsetAllocator.js";
3
7
  import { BinaryBuffer } from "../../../../core/binary/BinaryBuffer.js";
4
8
  import { platform_compute_endianness } from "../../../../core/binary/platform_compute_endianness.js";
5
9
  import Signal from "../../../../core/events/signal/Signal.js";
@@ -210,9 +214,9 @@ export class GPUMeshletManager {
210
214
  * Growing closes no holes, which is why it leaves {@link #deallocations_since_last_rebuild}
211
215
  * alone: the holes it did not close are still there for a later {@link compact} to close.
212
216
  *
213
- * The arena an allocator is asked for is a little larger than the shortfall, because the bins
214
- * round free runs down and requests up, up to 9/8 apart — room for exactly `extra_data_size`
215
- * can still be refused the allocation that asked for it. And no larger than
217
+ * The arena an allocator is asked for is {@link OffsetAllocator#grow_target_for}, not the
218
+ * shortfall: room for exactly `extra_data_size` can still be refused the allocation that asked
219
+ * for it, and how much more than that it takes is the allocator's to say. And no larger than
216
220
  * `maxBufferSize`: growth stops at what the device will hand out, so an arena that cannot
217
221
  * hold the request reports that through the caller's failed allocation rather than through a
218
222
  * buffer that is not there.
@@ -247,7 +251,7 @@ export class GPUMeshletManager {
247
251
  } else {
248
252
  // grow
249
253
  new_data_size = Math.max(
250
- current_buffer_size_words + Math.ceil(extra_data_size * 9 / 8),
254
+ this.#allocator_data.grow_target_for(extra_data_size),
251
255
  current_buffer_size_words + DATA_GROWTH_STEP,
252
256
  Math.ceil(current_buffer_size_words * GROWTH_MULTIPLIER)
253
257
  );
@@ -259,7 +263,7 @@ export class GPUMeshletManager {
259
263
  } else {
260
264
  // grow
261
265
  new_metadata_size = Math.max(
262
- current_metadata_buffer_size_elements + Math.ceil(extra_metadata_size * 9 / 8),
266
+ this.#allocator_metadata.grow_target_for(extra_metadata_size),
263
267
  current_metadata_buffer_size_elements + METADATA_GROWTH_STEP,
264
268
  Math.ceil(current_metadata_buffer_size_elements * GROWTH_MULTIPLIER)
265
269
  );
@@ -549,14 +553,14 @@ export class GPUMeshletManager {
549
553
 
550
554
  // An allocator holding enough free space for the request it just refused is one whose
551
555
  // space is scattered, and closing the holes is the only thing that helps. Anything else
552
- // is a shortfall, which growth covers by appending. The margin is the bins': a free run
553
- // the allocator rounds down can still be refused a request it rounds up, so "enough"
554
- // has to mean 9/8 of it, or a compaction could hand back a single run and still refuse.
556
+ // is a shortfall, which growth covers by appending. "Enough" is what a compaction would
557
+ // hand back — every hole as one run — measured against the run the request is accepted
558
+ // from, or a compaction could return the whole arena as one run and still be refused.
555
559
  const data_is_fragmented = !data_ok
556
- && this.#allocator_data.freeStorage >= Math.ceil(data_size_words * 9 / 8);
560
+ && this.#allocator_data.freeStorage >= allocator_run_size_for(data_size_words);
557
561
 
558
562
  const metadata_is_fragmented = !metadata_ok
559
- && this.#allocator_metadata.freeStorage >= Math.ceil(meshlet_count * 9 / 8);
563
+ && this.#allocator_metadata.freeStorage >= allocator_run_size_for(meshlet_count);
560
564
 
561
565
  // #rebuild zeroes the counter, so a compaction that does not free the request through
562
566
  // leaves the next pass to grow — the loop always makes progress
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Requires a fairly beefy GPU to run, confirmed to work on RTX 4090.
3
3
  * @param {Object} options
4
- * @param {Scene} options.scene
4
+ * @param {Scene} options.scene the scene the renderer holds a context for — what is baked
5
5
  * @param {Renderer} options.renderer
6
6
  * @param {number} [options.cell_size=0.5] desired cell size for the voxel grid
7
7
  * @param {number} [options.max_memory_usage_bytes] maximum memory usage in bytes, default is 16MB