@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
@@ -1,329 +1,444 @@
1
- import { assert } from "../../../core/assert.js";
2
- import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
3
- import { GPUDatabase } from "../buffer/table/GPUDatabase.js";
4
- import { GPUSceneShadowmapContext } from "../shadow/map/GPUSceneShadowmapContext.js";
5
- import { GPUTextureContext } from "../texture/GPUTextureContext.js";
6
- import { texture_mip_level_count } from "../../util/texture_mip_extent.js";
7
- import { texture_write_to_gpu } from "../texture/texture_write_to_gpu.js";
8
- import { execute_filter_environment_map } from "./environment/execute_filter_environment_map.js";
9
- import { LIGHT_DATABASE_SPEC } from "./LIGHT_DATABASE_SPEC.js";
10
- import { light_record_directional } from "./model/io/light_record_directional.js";
11
- import { light_record_point } from "./model/io/light_record_point.js";
12
- import { light_record_spot } from "./model/io/light_record_spot.js";
13
-
14
- /**
15
- * @typedef {import("../GraphicsContext.js").GraphicsContext} GraphicsContext
16
- * @typedef {import("../scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
17
- * @typedef {import("./LightCollection.js").LightCollection} LightCollection
18
- */
19
-
20
- /**
21
- * Directional-light cap. Sized so the directional occupancy bitmap
22
- * fits in a single u32, which is what
23
- * {@link chunk_directional_lights_iteration_mask} reads. Writing past
24
- * key 31 would silently drop the light from iteration; {@link #build}
25
- * warns once per build when this happens.
26
- *
27
- * Point and spot lights have no analogous cap — their consumers walk
28
- * the full per-page bitmap, so any number of point/spot lights
29
- * iterate correctly (e.g. clustered rendering routinely deals in
30
- * hundreds).
31
- *
32
- * @type {number}
33
- */
34
- const MAX_DIRECTIONAL_LIGHTS = 32;
35
-
36
- export class GPULightCollection {
37
-
38
- /**
39
- * @type {LightCollection}
40
- */
41
- #source
42
-
43
- /**
44
- *
45
- * @returns {LightCollection}
46
- */
47
- get source() {
48
- return this.#source;
49
- }
50
-
51
- /**
52
- * @type {GPUDevice}
53
- */
54
- #device
55
-
56
- /**
57
- * Backing GPUDatabase for the per-type light tables (point, spot, directional)
58
- * and shadowmap regions. Layout is defined by {@link LIGHT_DATABASE_SPEC}.
59
- *
60
- * @type {GPUDatabase}
61
- */
62
- #database;
63
-
64
- /**
65
- * @returns {GPUDatabase}
66
- */
67
- get database() {
68
- return this.#database;
69
- }
70
-
71
- /**
72
- * The single GPU buffer that backs the database. Bind this as `array<u32>` in
73
- * shaders that need to read light records via the auto-generated
74
- * {@link GPUTypedTableDescriptor.chunk_read} helpers.
75
- *
76
- * @returns {GPUBuffer}
77
- */
78
- get buffer_data() {
79
- return this.#database.buffer;
80
- }
81
-
82
- /**
83
- * Per-scene shadow allocator + rasterizer, owned by this collection because the
84
- * shadow records live in the same database (shadow_point / shadow_spot /
85
- * shadow_directional tables) and the per-light `shadow_id` field is the index into
86
- * those tables. Lifecycle, update, and destruction are all chained off this object.
87
- * @type {GPUSceneShadowmapContext}
88
- */
89
- #shadow_context;
90
-
91
- /**
92
- * @returns {GPUSceneShadowmapContext}
93
- */
94
- get shadow_context() {
95
- return this.#shadow_context;
96
- }
97
-
98
- /**
99
- *
100
- * @type {number}
101
- */
102
- #committed_version = -1;
103
-
104
- /**
105
- * Per-type counts written in the previous {@link build} pass. Used to identify
106
- * the trailing slot range that must be removed to keep each table tightly packed.
107
- */
108
- #prev_point_count = 0;
109
- #prev_spot_count = 0;
110
- #prev_directional_count = 0;
111
-
112
- /**
113
- * Octahedral encoded texture, convolved
114
- * see {@link LightCollection.environment}
115
- * @type {GPUTextureContext}
116
- */
117
- #environment;
118
-
119
- /**
120
- * @type {ShadeTexture}
121
- */
122
- #environment_source;
123
-
124
-
125
- /**
126
- *
127
- * @returns {GPUTextureContext}
128
- */
129
- get environment() {
130
- return this.#environment;
131
- }
132
-
133
-
134
- get gpu_memory_usage() {
135
- return this.#environment.gpu_memory_usage
136
- + this.#database.gpu_memory_usage
137
- ;
138
- }
139
-
140
- /**
141
- *
142
- * @param {GraphicsContext} graphics
143
- * @param {GPUSceneContext} scene_ctx the GPU-side context for this scene; the shadow
144
- * context constructs its own ViewManager that needs to look up this same context
145
- * when materializing GPUViewContexts for shadow views.
146
- */
147
- constructor(graphics, scene_ctx) {
148
- assert.defined(graphics, 'graphics');
149
- assert.defined(scene_ctx, 'scene_ctx');
150
- assert.equal(scene_ctx.isGPUSceneContext, true, 'scene_ctx.isGPUSceneContext !== true');
151
-
152
- const scene = scene_ctx.scene;
153
- const device = graphics.device;
154
-
155
- this.#device = device;
156
- this.#source = scene.lights;
157
-
158
- this.#environment = new GPUTextureContext(this.#device);
159
- this.#environment.descriptor.label = "environment map";
160
- this.#environment.descriptor.format = "rgba16float";
161
- this.#environment.descriptor.usage |=
162
- GPUTextureUsage.COPY_DST // so we can write to it
163
- | GPUTextureUsage.STORAGE_BINDING // so we can convolve it in compute shader
164
- ;
165
-
166
- this.#database = new GPUDatabase({
167
- device,
168
- label: 'Light Collection / Database',
169
- definition: LIGHT_DATABASE_SPEC,
170
- });
171
-
172
- this.#shadow_context = new GPUSceneShadowmapContext(graphics, scene_ctx, this);
173
- }
174
-
175
- /**
176
- *
177
- * @param {GraphicsContext} ctx
178
- */
179
- #update_environment(ctx) {
180
- const source_env = this.#source.environment;
181
-
182
- if (this.#environment_source === source_env) {
183
- // assume up-to-date
184
- return;
185
- }
186
-
187
- this.#environment_source = source_env;
188
-
189
- const gpu_ctx = this.#environment;
190
-
191
- const source_image = source_env.image;
192
- gpu_ctx.resize(source_image.width, source_image.height);
193
- /*
194
- The environment map is equirectangular and this context is built 2D a few lines up — the
195
- descriptor keeps the default dimension and `resize` above only takes two axes. Asked of the
196
- descriptor rather than assumed, so the count follows if that ever stops being true.
197
- */
198
- const gpu_size = gpu_ctx.descriptor.size;
199
-
200
- gpu_ctx.descriptor.mipLevelCount = texture_mip_level_count(
201
- gpu_size.width, gpu_size.height, gpu_size.depthOrArrayLayers, gpu_ctx.descriptor.dimension
202
- );
203
-
204
- gpu_ctx.allocate();
205
-
206
- if (
207
- source_image.source instanceof ImageBitmap
208
- && (gpu_ctx.descriptor.usage & GPUTextureUsage.RENDER_ATTACHMENT) === 0
209
- ) {
210
- // need RENDER_ATTACHMENT to use GPUQueue.copyExternalImageToTexture API
211
- // update descriptor and re-allocate texture
212
- gpu_ctx.descriptor.usage |= GPUTextureUsage.RENDER_ATTACHMENT;
213
- gpu_ctx.allocate(false);
214
- }
215
-
216
- texture_write_to_gpu(source_image, gpu_ctx.gpu_texture, this.#device.queue, source_image.level_count);
217
-
218
- // convolve
219
- const cmd = ShadeGPUCommandContext.create(ctx);
220
-
221
- execute_filter_environment_map(gpu_ctx, cmd);
222
-
223
- cmd.finish();
224
- }
225
-
226
- /**
227
- *
228
- * @param {GraphicsContext} ctx
229
- */
230
- update(ctx) {
231
- assert.defined(ctx, 'ctx');
232
-
233
- this.#update_environment(ctx);
234
-
235
- // Reconcile shadow allocations against the current scene every frame, even when
236
- // {@link LightCollection.version} hasn't moved. Shadow allocations can shift on
237
- // changes that don't bump version (e.g. flipping `light.casts_shadow`), and the
238
- // `shadow_id` we stamp into each light record depends on this allocation. When
239
- // process_lights touches anything we mark the source dirty so the build below
240
- // re-publishes those records.
241
- if (this.#shadow_context.process_lights()) {
242
- this.#source.needsUpdate = true;
243
- }
244
-
245
- if (this.#committed_version === this.#source.version) {
246
- return;
247
- }
248
-
249
- const cmd = ShadeGPUCommandContext.create(ctx, 'GPULightCollection/build');
250
-
251
- this.#build(cmd);
252
-
253
- cmd.finish();
254
- }
255
-
256
- /**
257
- * Marshal source lights into the per-type database tables, keeping each table
258
- * tightly packed in the index range [0, type_count).
259
- *
260
- * @param {ShadeGPUCommandContext} cmd
261
- */
262
- #build(cmd) {
263
- const lights = this.#source.elements;
264
-
265
- const table_point = this.#database.get('light_point');
266
- const table_spot = this.#database.get('light_spot');
267
- const table_directional = this.#database.get('light_directional');
268
-
269
- let point_count = 0;
270
- let spot_count = 0;
271
- let directional_count = 0;
272
-
273
- // Directional only — silently dropping a directional light
274
- // would surface as a missing visual; flagging keeps consumers
275
- // iterating only the first bitmap word correct for whatever
276
- // did fit. Point and spot have no cap.
277
- let directional_overflow_warned = false;
278
-
279
- for (let i = 0; i < lights.length; i++) {
280
- const light = lights[i];
281
-
282
- if (light.isPointLight === true) {
283
- table_point.set(point_count, light_record_point(light));
284
- point_count++;
285
- } else if (light.isDirectionalLight === true) {
286
- if (directional_count >= MAX_DIRECTIONAL_LIGHTS) {
287
- if (!directional_overflow_warned) {
288
- console.warn(
289
- `GPULightCollection: directional light count exceeds MAX_DIRECTIONAL_LIGHTS (${MAX_DIRECTIONAL_LIGHTS}); extras will not be written to the database.`
290
- );
291
- directional_overflow_warned = true;
292
- }
293
- continue;
294
- }
295
- table_directional.set(directional_count, light_record_directional(light));
296
- directional_count++;
297
- } else if (light.isSpotLight === true) {
298
- table_spot.set(spot_count, light_record_spot(light));
299
- spot_count++;
300
- }
301
- // unrecognized light kinds are silently dropped
302
- }
303
-
304
- // trim trailing slots from previous build to keep each table tightly packed
305
- for (let i = point_count; i < this.#prev_point_count; i++) {
306
- table_point.remove(i);
307
- }
308
- for (let i = spot_count; i < this.#prev_spot_count; i++) {
309
- table_spot.remove(i);
310
- }
311
- for (let i = directional_count; i < this.#prev_directional_count; i++) {
312
- table_directional.remove(i);
313
- }
314
-
315
- this.#prev_point_count = point_count;
316
- this.#prev_spot_count = spot_count;
317
- this.#prev_directional_count = directional_count;
318
-
319
- this.#database.update(cmd);
320
-
321
- this.#committed_version = this.#source.version;
322
- }
323
-
324
- destroy() {
325
- this.#shadow_context.destroy();
326
- this.#database.destroy();
327
- this.#environment.destroy();
328
- }
329
- }
1
+ import { assert } from "../../../core/assert.js";
2
+ import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
3
+ import { GPUDatabase } from "../buffer/table/GPUDatabase.js";
4
+ import { GPUSceneShadowmapContext } from "../shadow/map/GPUSceneShadowmapContext.js";
5
+ import { GPUTextureContext } from "../texture/GPUTextureContext.js";
6
+ import { texture_mip_level_count } from "../../util/texture_mip_extent.js";
7
+ import { texture_write_to_gpu } from "../texture/texture_write_to_gpu.js";
8
+ import { execute_filter_environment_map } from "./environment/execute_filter_environment_map.js";
9
+ import { LIGHT_DATABASE_SPEC } from "./LIGHT_DATABASE_SPEC.js";
10
+ import { light_record_directional } from "./model/io/light_record_directional.js";
11
+ import { light_record_point } from "./model/io/light_record_point.js";
12
+ import { light_record_spot } from "./model/io/light_record_spot.js";
13
+ import { row_of_entity } from "../scene/rows/GPUSceneRows.js";
14
+ import {
15
+ REFRESH_LIGHT_POSES_TABLE_COUNT,
16
+ REFRESH_LIGHT_POSES_WORKGROUP_SIZE,
17
+ shader_refresh_light_poses,
18
+ } from "./shader_refresh_light_poses.js";
19
+
20
+ /**
21
+ * @typedef {import("../GraphicsContext.js").GraphicsContext} GraphicsContext
22
+ * @typedef {import("../scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
23
+ * @typedef {import("./LightCollection.js").LightCollection} LightCollection
24
+ */
25
+
26
+ /**
27
+ * Directional-light cap. Sized so the directional occupancy bitmap
28
+ * fits in a single u32, which is what
29
+ * {@link chunk_directional_lights_iteration_mask} reads. Writing past
30
+ * key 31 would silently drop the light from iteration; {@link #build}
31
+ * warns once per build when this happens.
32
+ *
33
+ * Point and spot lights have no analogous cap — their consumers walk
34
+ * the full per-page bitmap, so any number of point/spot lights
35
+ * iterate correctly (e.g. clustered rendering routinely deals in
36
+ * hundreds).
37
+ *
38
+ * @type {number}
39
+ */
40
+ const MAX_DIRECTIONAL_LIGHTS = 32;
41
+
42
+ export class GPULightCollection {
43
+
44
+ /**
45
+ * @type {LightCollection}
46
+ */
47
+ #source
48
+
49
+ /**
50
+ *
51
+ * @returns {LightCollection}
52
+ */
53
+ get source() {
54
+ return this.#source;
55
+ }
56
+
57
+ /**
58
+ * @type {GPUDevice}
59
+ */
60
+ #device
61
+
62
+ /**
63
+ * Backing GPUDatabase for the per-type light tables (point, spot, directional)
64
+ * and shadowmap regions. Layout is defined by {@link LIGHT_DATABASE_SPEC}.
65
+ *
66
+ * @type {GPUDatabase}
67
+ */
68
+ #database;
69
+
70
+ /**
71
+ * @returns {GPUDatabase}
72
+ */
73
+ get database() {
74
+ return this.#database;
75
+ }
76
+
77
+ /**
78
+ * The single GPU buffer that backs the database. Bind this as `array<u32>` in
79
+ * shaders that need to read light records via the auto-generated
80
+ * {@link GPUTypedTableDescriptor.chunk_read} helpers.
81
+ *
82
+ * @returns {GPUBuffer}
83
+ */
84
+ get buffer_data() {
85
+ return this.#database.buffer;
86
+ }
87
+
88
+ /**
89
+ * The readback service over the light database — what carries a GPU-written row back to the
90
+ * CPU: a directional shadow map's caster range, measured against one frame's cascades and
91
+ * applied to the next frame's. Requests are taken any time; the copies are encoded at the tail
92
+ * of the shadow draw and delivered at the head of {@link update}.
93
+ *
94
+ * @returns {import("../buffer/table/GPUDatabaseReadback.js").GPUDatabaseReadback}
95
+ */
96
+ get readback() {
97
+ return this.#database.readback;
98
+ }
99
+
100
+ /**
101
+ * Per-scene shadow allocator + rasterizer, owned by this collection because the
102
+ * shadow records live in the same database (shadow_point / shadow_spot /
103
+ * shadow_directional tables) and the per-light `shadow_id` field is the index into
104
+ * those tables. Lifecycle, update, and destruction are all chained off this object.
105
+ * @type {GPUSceneShadowmapContext}
106
+ */
107
+ #shadow_context;
108
+
109
+ /**
110
+ * @returns {GPUSceneShadowmapContext}
111
+ */
112
+ get shadow_context() {
113
+ return this.#shadow_context;
114
+ }
115
+
116
+ /**
117
+ *
118
+ * @type {number}
119
+ */
120
+ #committed_version = -1;
121
+
122
+ /**
123
+ * Light -> the entity whose `transforms` row this holds for it.
124
+ * @type {Map<import("./model/Light.js").Light, number>}
125
+ */
126
+ #held = new Map();
127
+
128
+ /**
129
+ * The source version {@link sync_rows} last reconciled the held rows against.
130
+ * @type {number}
131
+ */
132
+ #rows_version = -1;
133
+
134
+ /**
135
+ * Per-type counts written in the previous {@link build} pass. Used to identify
136
+ * the trailing slot range that must be removed to keep each table tightly packed.
137
+ */
138
+ #prev_point_count = 0;
139
+ #prev_spot_count = 0;
140
+ #prev_directional_count = 0;
141
+
142
+ /**
143
+ * Octahedral encoded texture, convolved
144
+ * see {@link LightCollection.environment}
145
+ * @type {GPUTextureContext}
146
+ */
147
+ #environment;
148
+
149
+ /**
150
+ * @type {ShadeTexture}
151
+ */
152
+ #environment_source;
153
+
154
+
155
+ /**
156
+ *
157
+ * @returns {GPUTextureContext}
158
+ */
159
+ get environment() {
160
+ return this.#environment;
161
+ }
162
+
163
+
164
+ get gpu_memory_usage() {
165
+ return this.#environment.gpu_memory_usage
166
+ + this.#database.gpu_memory_usage
167
+ ;
168
+ }
169
+
170
+ /**
171
+ *
172
+ * @param {GraphicsContext} graphics
173
+ * @param {GPUSceneContext} scene_ctx the GPU-side context for this scene; the shadow
174
+ * context constructs its own ViewManager that needs to look up this same context
175
+ * when materializing GPUViewContexts for shadow views.
176
+ */
177
+ constructor(graphics, scene_ctx) {
178
+ assert.defined(graphics, 'graphics');
179
+ assert.defined(scene_ctx, 'scene_ctx');
180
+ assert.equal(scene_ctx.isGPUSceneContext, true, 'scene_ctx.isGPUSceneContext !== true');
181
+
182
+ const scene = scene_ctx.scene;
183
+ const device = graphics.device;
184
+
185
+ this.#device = device;
186
+ this.#source = scene.lights;
187
+
188
+ this.#environment = new GPUTextureContext(this.#device);
189
+ this.#environment.descriptor.label = "environment map";
190
+ this.#environment.descriptor.format = "rgba16float";
191
+ this.#environment.descriptor.usage |=
192
+ GPUTextureUsage.COPY_DST // so we can write to it
193
+ | GPUTextureUsage.STORAGE_BINDING // so we can convolve it in compute shader
194
+ ;
195
+
196
+ this.#database = new GPUDatabase({
197
+ device,
198
+ label: 'Light Collection / Database',
199
+ definition: LIGHT_DATABASE_SPEC,
200
+ });
201
+
202
+ this.#shadow_context = new GPUSceneShadowmapContext(graphics, scene_ctx, this);
203
+ }
204
+
205
+ /**
206
+ *
207
+ * @param {GraphicsContext} ctx
208
+ */
209
+ #update_environment(ctx) {
210
+ const source_env = this.#source.environment;
211
+
212
+ if (this.#environment_source === source_env) {
213
+ // assume up-to-date
214
+ return;
215
+ }
216
+
217
+ this.#environment_source = source_env;
218
+
219
+ const gpu_ctx = this.#environment;
220
+
221
+ const source_image = source_env.image;
222
+ gpu_ctx.resize(source_image.width, source_image.height);
223
+ /*
224
+ The environment map is equirectangular and this context is built 2D a few lines up — the
225
+ descriptor keeps the default dimension and `resize` above only takes two axes. Asked of the
226
+ descriptor rather than assumed, so the count follows if that ever stops being true.
227
+ */
228
+ const gpu_size = gpu_ctx.descriptor.size;
229
+
230
+ gpu_ctx.descriptor.mipLevelCount = texture_mip_level_count(
231
+ gpu_size.width, gpu_size.height, gpu_size.depthOrArrayLayers, gpu_ctx.descriptor.dimension
232
+ );
233
+
234
+ gpu_ctx.allocate();
235
+
236
+ if (
237
+ source_image.source instanceof ImageBitmap
238
+ && (gpu_ctx.descriptor.usage & GPUTextureUsage.RENDER_ATTACHMENT) === 0
239
+ ) {
240
+ // need RENDER_ATTACHMENT to use GPUQueue.copyExternalImageToTexture API
241
+ // update descriptor and re-allocate texture
242
+ gpu_ctx.descriptor.usage |= GPUTextureUsage.RENDER_ATTACHMENT;
243
+ gpu_ctx.allocate(false);
244
+ }
245
+
246
+ texture_write_to_gpu(source_image, gpu_ctx.gpu_texture, this.#device.queue, source_image.level_count);
247
+
248
+ // convolve
249
+ const cmd = ShadeGPUCommandContext.create(ctx);
250
+
251
+ execute_filter_environment_map(gpu_ctx, cmd);
252
+
253
+ cmd.finish();
254
+ }
255
+
256
+ /**
257
+ *
258
+ * @param {GraphicsContext} ctx
259
+ */
260
+ update(ctx) {
261
+ assert.defined(ctx, 'ctx');
262
+
263
+ // the apply point: whatever the device has answered since is delivered before anything
264
+ // this frame reads it
265
+ this.#database.readback.apply();
266
+
267
+ this.#update_environment(ctx);
268
+
269
+ // Reconcile shadow allocations against the current scene every frame, even when
270
+ // {@link LightCollection.version} hasn't moved. Shadow allocations can shift on
271
+ // changes that don't bump version (e.g. flipping `light.casts_shadow`), and the
272
+ // `shadow_id` we stamp into each light record depends on this allocation. When
273
+ // process_lights touches anything we mark the source dirty so the build below
274
+ // re-publishes those records.
275
+ if (this.#shadow_context.process_lights()) {
276
+ this.#source.needsUpdate = true;
277
+ }
278
+
279
+ if (this.#committed_version === this.#source.version) {
280
+ return;
281
+ }
282
+
283
+ const cmd = ShadeGPUCommandContext.create(ctx, 'GPULightCollection/build');
284
+
285
+ this.#build(cmd);
286
+
287
+ cmd.finish();
288
+ }
289
+
290
+ /**
291
+ * Hold a `transforms` row for every light's entity, and let go of the rows of lights that left.
292
+ *
293
+ * Called by the scene context before it flushes its rows, so a light that arrived this frame is
294
+ * written this frame; runs only when the source's version moved, and a moved light is one of
295
+ * the things that moves it, so every held row is marked as well — a mark on a row the GPU
296
+ * composes writes nothing.
297
+ *
298
+ * @param {import("../scene/rows/GPUSceneRows.js").GPUSceneRows} rows
299
+ */
300
+ sync_rows(rows) {
301
+ const source = this.#source;
302
+
303
+ if (this.#rows_version === source.version) {
304
+ return;
305
+ }
306
+
307
+ const held = this.#held;
308
+ const lights = source.elements;
309
+
310
+ for (let i = 0; i < lights.length; i++) {
311
+ const light = lights[i];
312
+ const entity = source.entity_of(light);
313
+
314
+ if (held.has(light)) {
315
+ rows.mark_world(entity);
316
+ } else {
317
+ rows.acquire(entity);
318
+ held.set(light, entity);
319
+ }
320
+ }
321
+
322
+ if (held.size !== lights.length) {
323
+ for (const [light, entity] of held) {
324
+ if (!source.has(light)) {
325
+ rows.release(entity);
326
+ held.delete(light);
327
+ }
328
+ }
329
+ }
330
+
331
+ this.#rows_version = source.version;
332
+ }
333
+
334
+ /**
335
+ * Write every light record's pose from its entity's row — after the hierarchy pass composed it.
336
+ * Nothing to dispatch while there is no light.
337
+ *
338
+ * @param {ShadeGPUCommandContext} cmd_ctx
339
+ * @param {GPUBuffer} scene_database
340
+ */
341
+ refresh_poses(cmd_ctx, scene_database) {
342
+ const database = this.#database;
343
+
344
+ const group_count = Math.max(
345
+ database.get('light_point').dispatch_group_count(REFRESH_LIGHT_POSES_WORKGROUP_SIZE),
346
+ database.get('light_spot').dispatch_group_count(REFRESH_LIGHT_POSES_WORKGROUP_SIZE),
347
+ database.get('light_directional').dispatch_group_count(REFRESH_LIGHT_POSES_WORKGROUP_SIZE),
348
+ );
349
+
350
+ if (group_count === 0) {
351
+ return;
352
+ }
353
+
354
+ shader_refresh_light_poses.dispatch({
355
+ encoder: cmd_ctx,
356
+ group_count_x: group_count,
357
+ group_count_y: REFRESH_LIGHT_POSES_TABLE_COUNT,
358
+ bindings: {
359
+ scene_database,
360
+ light_database: database.buffer,
361
+ },
362
+ });
363
+ }
364
+
365
+ /**
366
+ * Marshal source lights into the per-type database tables, keeping each table
367
+ * tightly packed in the index range [0, type_count).
368
+ *
369
+ * @param {ShadeGPUCommandContext} cmd
370
+ */
371
+ #build(cmd) {
372
+ const source = this.#source;
373
+ const lights = source.elements;
374
+
375
+ const table_point = this.#database.get('light_point');
376
+ const table_spot = this.#database.get('light_spot');
377
+ const table_directional = this.#database.get('light_directional');
378
+
379
+ let point_count = 0;
380
+ let spot_count = 0;
381
+ let directional_count = 0;
382
+
383
+ // Directional only — silently dropping a directional light
384
+ // would surface as a missing visual; flagging keeps consumers
385
+ // iterating only the first bitmap word correct for whatever
386
+ // did fit. Point and spot have no cap.
387
+ let directional_overflow_warned = false;
388
+
389
+ for (let i = 0; i < lights.length; i++) {
390
+ const light = lights[i];
391
+ const transform_row = row_of_entity(source.entity_of(light));
392
+
393
+ if (light.isPointLight === true) {
394
+ table_point.set(point_count, light_record_point(light, transform_row));
395
+ point_count++;
396
+ } else if (light.isDirectionalLight === true) {
397
+ if (directional_count >= MAX_DIRECTIONAL_LIGHTS) {
398
+ if (!directional_overflow_warned) {
399
+ console.warn(
400
+ `GPULightCollection: directional light count exceeds MAX_DIRECTIONAL_LIGHTS (${MAX_DIRECTIONAL_LIGHTS}); extras will not be written to the database.`
401
+ );
402
+ directional_overflow_warned = true;
403
+ }
404
+ continue;
405
+ }
406
+ table_directional.set(directional_count, light_record_directional(light, transform_row));
407
+ directional_count++;
408
+ } else if (light.isSpotLight === true) {
409
+ table_spot.set(spot_count, light_record_spot(light, transform_row));
410
+ spot_count++;
411
+ }
412
+ // unrecognized light kinds are silently dropped
413
+ }
414
+
415
+ // trim trailing slots from previous build to keep each table tightly packed
416
+ for (let i = point_count; i < this.#prev_point_count; i++) {
417
+ table_point.remove(i);
418
+ }
419
+ for (let i = spot_count; i < this.#prev_spot_count; i++) {
420
+ table_spot.remove(i);
421
+ }
422
+ for (let i = directional_count; i < this.#prev_directional_count; i++) {
423
+ table_directional.remove(i);
424
+ }
425
+
426
+ this.#prev_point_count = point_count;
427
+ this.#prev_spot_count = spot_count;
428
+ this.#prev_directional_count = directional_count;
429
+
430
+ this.#database.update(cmd);
431
+
432
+ this.#committed_version = this.#source.version;
433
+ }
434
+
435
+ destroy() {
436
+ // the rows go with the context that held them
437
+ this.#held.clear();
438
+ this.#rows_version = -1;
439
+
440
+ this.#shadow_context.destroy();
441
+ this.#database.destroy();
442
+ this.#environment.destroy();
443
+ }
444
+ }