@woosh/meep-engine 3.57.0 → 3.58.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 (1396) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/editor/ecs/component/editors/ColorEditor.js +2 -2
  3. package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
  4. package/editor/particles/effect/ParticleEffectDocument.js +2 -5
  5. package/editor/tools/GridPaintTool.js +2 -2
  6. package/editor/view/node-graph/NodeGraphEditorView.d.ts +1 -1
  7. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  8. package/editor/view/node-graph/NodeGraphEditorView.js +2 -2
  9. package/editor/view/node-graph/NodeGraphView.d.ts +0 -1
  10. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  11. package/editor/view/node-graph/NodeGraphView.js +0 -2
  12. package/package.json +1 -1
  13. package/src/core/bvh8/build/NodeProxy.js +2 -2
  14. package/src/core/bvh8/build/aabb3_compute_merge_cost.js +4 -4
  15. package/src/core/bvh8/build/bvh8_build_for_geometry.js +2 -2
  16. package/src/core/geom/2d/line/line2_segment_intersection_fraction_2d.d.ts +1 -1
  17. package/src/core/geom/2d/line/line2_segment_intersection_fraction_2d.js +1 -1
  18. package/src/core/geom/2d/triangle/tri2_intersects_aabb2.d.ts +17 -0
  19. package/src/core/geom/2d/triangle/tri2_intersects_aabb2.d.ts.map +1 -0
  20. package/src/core/geom/2d/triangle/tri2_intersects_aabb2.js +64 -0
  21. package/src/core/geom/2d/triangle/tri2_rasterize_barycentric.d.ts +23 -0
  22. package/src/core/geom/2d/triangle/tri2_rasterize_barycentric.d.ts.map +1 -0
  23. package/src/core/geom/2d/triangle/tri2_rasterize_barycentric.js +81 -0
  24. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.d.ts.map +1 -1
  25. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.js +36 -99
  26. package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts +0 -11
  27. package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts.map +1 -1
  28. package/src/core/geom/3d/aabb/aabb3_build_frustum.js +15 -20
  29. package/src/core/geom/3d/box/box3_raycast.d.ts +1 -1
  30. package/src/core/geom/3d/box/box3_raycast.js +1 -1
  31. package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.d.ts +1 -1
  32. package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.js +1 -1
  33. package/src/core/geom/3d/quaternion/quat3_to_matrix3.d.ts +3 -3
  34. package/src/core/geom/3d/quaternion/quat3_to_matrix3.js +3 -3
  35. package/src/core/geom/3d/shape/HeightMapShape3D.js +2 -2
  36. package/src/core/geom/3d/shape/MeshShape3D.d.ts +2 -2
  37. package/src/core/geom/3d/shape/MeshShape3D.js +2 -2
  38. package/src/core/geom/3d/shape/PosedShape3D.js +2 -2
  39. package/src/core/geom/3d/sphere/sphere_matrix4_transform.d.ts +0 -7
  40. package/src/core/geom/3d/sphere/sphere_matrix4_transform.d.ts.map +1 -1
  41. package/src/core/geom/3d/sphere/sphere_matrix4_transform.js +0 -4
  42. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_compute_tet_quality.d.ts +1 -1
  43. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_compute_tet_quality.js +1 -1
  44. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts +1 -1
  45. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.js +1 -1
  46. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.d.ts +1 -1
  47. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js +1 -1
  48. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.d.ts +1 -1
  49. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.js +1 -1
  50. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts +2 -2
  51. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.js +2 -2
  52. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.d.ts +0 -14
  53. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.d.ts.map +1 -1
  54. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.js +0 -5
  55. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +151 -151
  56. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.js +1 -1
  57. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_vertex_adjacent_faces.d.ts +1 -1
  58. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_vertex_adjacent_faces.js +1 -1
  59. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.d.ts.map +1 -1
  60. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.js +1 -2
  61. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts +0 -8
  62. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts.map +1 -1
  63. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +25 -36
  64. package/src/core/geom/clipmap/ClipmapCascadePlacement.d.ts +137 -0
  65. package/src/core/geom/clipmap/ClipmapCascadePlacement.d.ts.map +1 -0
  66. package/src/core/geom/clipmap/ClipmapCascadePlacement.js +350 -0
  67. package/src/core/geom/polyline/polyline_simplify_by_error.d.ts +16 -0
  68. package/src/core/geom/polyline/polyline_simplify_by_error.d.ts.map +1 -0
  69. package/src/core/geom/polyline/polyline_simplify_by_error.js +52 -0
  70. package/src/core/geom/vec3/v3_quaternion_apply.d.ts +1 -1
  71. package/src/core/geom/vec3/v3_quaternion_apply.js +1 -1
  72. package/src/core/geom/vec3/v3_quaternion_apply_inverse.d.ts +2 -2
  73. package/src/core/geom/vec3/v3_quaternion_apply_inverse.js +2 -2
  74. package/src/core/geom/vec3/v3_triple_cross.d.ts +1 -1
  75. package/src/core/geom/vec3/v3_triple_cross.js +1 -1
  76. package/src/engine/asset/preloader/AssetPreloader.d.ts +0 -5
  77. package/src/engine/asset/preloader/AssetPreloader.d.ts.map +1 -1
  78. package/src/engine/asset/preloader/AssetPreloader.js +0 -6
  79. package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
  80. package/src/engine/ecs/terrain/tiles/TerrainTile.js +25 -12
  81. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts +2 -2
  82. package/src/engine/graphics/ecs/decal/v2/Decal.js +2 -2
  83. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts.map +1 -1
  84. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +420 -418
  85. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.d.ts +1 -0
  86. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +10 -0
  87. package/src/engine/graphics/ecs/particles/ParticleEffect.js +3 -3
  88. package/src/engine/graphics/ecs/path/tube/build/makeTubeStream.js +2 -2
  89. package/src/engine/graphics/geometry/buffered/build_height_field_geometry.d.ts +12 -0
  90. package/src/engine/graphics/geometry/buffered/build_height_field_geometry.d.ts.map +1 -1
  91. package/src/engine/graphics/geometry/buffered/build_height_field_geometry.js +29 -2
  92. package/src/engine/graphics/texture/sprite/prototypeSpriteCutoutGeometry.js +1 -1
  93. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +2 -1
  94. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  95. package/src/engine/graphics3/ShadedGeometrySystem.js +7 -5
  96. package/src/engine/graphics3/Trail3DSystem.d.ts +1 -1
  97. package/src/engine/graphics3/Trail3DSystem.js +1 -1
  98. package/src/engine/graphics3/WaterSystem.d.ts +60 -0
  99. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  100. package/src/engine/graphics3/WaterSystem.js +733 -300
  101. package/src/engine/graphics3/make_default_environment.d.ts.map +1 -1
  102. package/src/engine/graphics3/make_default_environment.js +2 -4
  103. package/src/engine/graphics3/prefab/prefab_place.js +1 -1
  104. package/src/engine/navigation/mesh/build/clip_soup_against_overhangs.js +628 -628
  105. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  106. package/src/engine/physics/inertia/world_inverse_inertia.js +1 -1
  107. package/src/engine/physics/narrowphase/narrowphase_step.js +1 -1
  108. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts +0 -1
  109. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
  110. package/src/engine/sound/simulation/render/reverbImpulseResponse.js +0 -6
  111. package/src/engine/sound/simulation/render/reverb_band_tails.d.ts +1 -1
  112. package/src/engine/sound/simulation/render/reverb_band_tails.js +1 -1
  113. package/src/engine/sound/sopra/runtime/EventInstance.js +1 -1
  114. package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +86 -0
  115. package/src/generation/foliage/FOLIAGE_DESIGN.md +87 -30
  116. package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +486 -0
  117. package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +86 -0
  118. package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +346 -0
  119. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts.map +1 -1
  120. package/src/generation/foliage/analysis/crown_opacity_measure.js +80 -102
  121. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts.map +1 -1
  122. package/src/generation/foliage/analysis/foliage_measure_leaf_area.js +1 -7
  123. package/src/generation/foliage/analysis/tree_crown_opacity.js +1 -1
  124. package/src/generation/foliage/analysis/tree_leaf_area_targets.d.ts +66 -0
  125. package/src/generation/foliage/analysis/tree_leaf_area_targets.d.ts.map +1 -0
  126. package/src/generation/foliage/analysis/tree_leaf_area_targets.js +95 -0
  127. package/src/generation/foliage/analysis/tree_render_cost.d.ts +88 -0
  128. package/src/generation/foliage/analysis/tree_render_cost.d.ts.map +1 -0
  129. package/src/generation/foliage/analysis/tree_render_cost.js +157 -0
  130. package/src/generation/foliage/asset/TreeAsset.d.ts +7 -6
  131. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
  132. package/src/generation/foliage/asset/TreeAsset.js +10 -7
  133. package/src/generation/foliage/asset/TreeLODAsset.d.ts +24 -11
  134. package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -1
  135. package/src/generation/foliage/asset/TreeLODAsset.js +49 -20
  136. package/src/generation/foliage/asset/generate_tree.d.ts +11 -0
  137. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
  138. package/src/generation/foliage/asset/generate_tree.js +84 -10
  139. package/src/generation/foliage/asset/tree_lod_plan.d.ts +71 -0
  140. package/src/generation/foliage/asset/tree_lod_plan.d.ts.map +1 -0
  141. package/src/generation/foliage/asset/tree_lod_plan.js +119 -0
  142. package/src/generation/foliage/config/BranchGeneratorConfig.d.ts +0 -10
  143. package/src/generation/foliage/config/BranchGeneratorConfig.d.ts.map +1 -1
  144. package/src/generation/foliage/config/BranchGeneratorConfig.js +1 -23
  145. package/src/generation/foliage/config/ShootGrowthConfig.d.ts +45 -10
  146. package/src/generation/foliage/config/ShootGrowthConfig.d.ts.map +1 -1
  147. package/src/generation/foliage/config/ShootGrowthConfig.js +70 -16
  148. package/src/generation/foliage/config/ShootSystemRule.d.ts +12 -12
  149. package/src/generation/foliage/config/ShootSystemRule.d.ts.map +1 -1
  150. package/src/generation/foliage/config/ShootSystemRule.js +24 -20
  151. package/src/generation/foliage/config/TreeLODConfig.d.ts +14 -37
  152. package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -1
  153. package/src/generation/foliage/config/TreeLODConfig.js +23 -116
  154. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +2 -1
  155. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -1
  156. package/src/generation/foliage/config/TreeSpeciesConfig.js +2 -7
  157. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts +6 -4
  158. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts.map +1 -1
  159. package/src/generation/foliage/material/foliage_atlas_cutout.js +32 -27
  160. package/src/generation/foliage/material/foliage_material_from_samplers.d.ts +13 -0
  161. package/src/generation/foliage/material/foliage_material_from_samplers.d.ts.map +1 -0
  162. package/src/generation/foliage/material/foliage_material_from_samplers.js +69 -0
  163. package/src/generation/foliage/material/foliage_tile.d.ts +19 -0
  164. package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -1
  165. package/src/generation/foliage/material/foliage_tile.js +9 -1
  166. package/src/generation/foliage/material/leaf_geometry.d.ts +7 -0
  167. package/src/generation/foliage/material/leaf_geometry.d.ts.map +1 -1
  168. package/src/generation/foliage/material/leaf_geometry.js +21 -9
  169. package/src/generation/foliage/material/make_foliage_material.d.ts +2 -3
  170. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
  171. package/src/generation/foliage/material/make_foliage_material.js +3 -57
  172. package/src/generation/foliage/material/tree_cluster_atlas_pack.d.ts +14 -0
  173. package/src/generation/foliage/material/tree_cluster_atlas_pack.d.ts.map +1 -0
  174. package/src/generation/foliage/material/tree_cluster_atlas_pack.js +28 -0
  175. package/src/generation/foliage/material/tree_cluster_bake.d.ts +74 -0
  176. package/src/generation/foliage/material/tree_cluster_bake.d.ts.map +1 -0
  177. package/src/generation/foliage/material/tree_cluster_bake.js +415 -0
  178. package/src/generation/foliage/material/tree_cluster_press.d.ts +18 -0
  179. package/src/generation/foliage/material/tree_cluster_press.d.ts.map +1 -0
  180. package/src/generation/foliage/material/tree_cluster_press.js +83 -0
  181. package/src/generation/foliage/material/tree_cluster_tiles.d.ts +46 -0
  182. package/src/generation/foliage/material/tree_cluster_tiles.d.ts.map +1 -0
  183. package/src/generation/foliage/material/tree_cluster_tiles.js +75 -0
  184. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +22 -4
  185. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
  186. package/src/generation/foliage/mesh/foliage_collect_attachments.js +26 -14
  187. package/src/generation/foliage/mesh/tree_cluster_cards.d.ts +61 -0
  188. package/src/generation/foliage/mesh/tree_cluster_cards.d.ts.map +1 -0
  189. package/src/generation/foliage/mesh/tree_cluster_cards.js +114 -0
  190. package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts +121 -0
  191. package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts.map +1 -0
  192. package/src/generation/foliage/mesh/tree_cluster_representatives.js +309 -0
  193. package/src/generation/foliage/mesh/tree_clusters.d.ts +71 -0
  194. package/src/generation/foliage/mesh/tree_clusters.d.ts.map +1 -0
  195. package/src/generation/foliage/mesh/tree_clusters.js +174 -0
  196. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  197. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +577 -172
  198. package/src/generation/foliage/mesh/tree_mesh_build_clusters.d.ts +25 -0
  199. package/src/generation/foliage/mesh/tree_mesh_build_clusters.d.ts.map +1 -0
  200. package/src/generation/foliage/mesh/tree_mesh_build_clusters.js +144 -0
  201. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +7 -10
  202. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
  203. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +13 -39
  204. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  205. package/src/generation/foliage/presets/make_tree_species_preset.js +80 -208
  206. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts +5 -2
  207. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts.map +1 -1
  208. package/src/generation/foliage/skeleton/ShootFrameworkHash.js +13 -8
  209. package/src/generation/foliage/skeleton/ShootGirth.d.ts.map +1 -1
  210. package/src/generation/foliage/skeleton/ShootGirth.js +6 -5
  211. package/src/generation/foliage/skeleton/ShootLightField.d.ts +9 -0
  212. package/src/generation/foliage/skeleton/ShootLightField.d.ts.map +1 -1
  213. package/src/generation/foliage/skeleton/ShootLightField.js +25 -0
  214. package/src/generation/foliage/skeleton/ShootWoodHash.d.ts +89 -0
  215. package/src/generation/foliage/skeleton/ShootWoodHash.d.ts.map +1 -0
  216. package/src/generation/foliage/skeleton/ShootWoodHash.js +195 -0
  217. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +6 -0
  218. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
  219. package/src/generation/foliage/skeleton/TreeSkeleton.js +9 -0
  220. package/src/generation/foliage/skeleton/shoot_demography.d.ts +17 -4
  221. package/src/generation/foliage/skeleton/shoot_demography.d.ts.map +1 -1
  222. package/src/generation/foliage/skeleton/shoot_demography.js +22 -6
  223. package/src/generation/foliage/skeleton/shoot_geometry.d.ts +5 -6
  224. package/src/generation/foliage/skeleton/shoot_geometry.d.ts.map +1 -1
  225. package/src/generation/foliage/skeleton/shoot_geometry.js +29 -12
  226. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts +43 -4
  227. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts.map +1 -1
  228. package/src/generation/foliage/skeleton/shoot_systems_simulate.js +537 -70
  229. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +30 -5
  230. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -1
  231. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +46 -10
  232. package/src/generation/foliage/skeleton/tree_skeleton_bind_skin_joints.d.ts +10 -0
  233. package/src/generation/foliage/skeleton/tree_skeleton_bind_skin_joints.d.ts.map +1 -0
  234. package/src/generation/foliage/skeleton/tree_skeleton_bind_skin_joints.js +12 -0
  235. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  236. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +2 -1
  237. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +4 -0
  238. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -1
  239. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +102 -6
  240. package/src/shade/descriptor/binding/BindGroupLayoutEntry.js +6 -6
  241. package/src/shade/descriptor/pipeline/render/ColorTargetState.js +2 -2
  242. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +3 -3
  243. package/src/shade/playground/additive_blending/main.js +529 -529
  244. package/src/shade/playground/avboit/main.js +1 -1
  245. package/src/shade/playground/basis_textures/main.js +365 -365
  246. package/src/shade/playground/caldera/main.js +1 -1
  247. package/src/shade/playground/contact_shadows/main.js +1 -1
  248. package/src/shade/playground/foliage_wind/main.js +289 -289
  249. package/src/shade/playground/mesh_row_ceiling/main.js +1 -1
  250. package/src/shade/playground/particle_ecs/main.js +1 -1
  251. package/src/shade/playground/particle_system/main.js +1 -1
  252. package/src/shade/playground/sh_exponential/main.js +1 -1
  253. package/src/shade/playground/skinned_blas_refit/main.js +1 -1
  254. package/src/shade/playground/skinned_mesh_soup/main.js +1 -1
  255. package/src/shade/playground/sponza_path_trace/main.js +1 -1
  256. package/src/shade/playground/ssr_motion/main.js +1 -1
  257. package/src/shade/playground/ssr_reprojection/main.js +1 -1
  258. package/src/shade/playground/tonemap_sdr/main.js +1 -1
  259. package/src/shade/playground/vgeo_runtime/main.js +1 -1
  260. package/src/shade/playground/vgeo_scene/main.js +1 -1
  261. package/src/shade/playground/volumetrics_froxel/main.js +1 -1
  262. package/src/shade/playground/vsm/index.html +4 -1
  263. package/src/shade/playground/vsm/main.d.ts.map +1 -1
  264. package/src/shade/playground/vsm/main.js +8 -5
  265. package/src/shade/playground/water_refraction/main.js +1 -1
  266. package/src/shade/playground/water_surface/main.js +1 -1
  267. package/src/shade/renderer/Renderer.d.ts +13 -0
  268. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  269. package/src/shade/renderer/Renderer.js +132 -3
  270. package/src/shade/renderer/ShadeIndirectLightingMode.d.ts +1 -0
  271. package/src/shade/renderer/ShadeIndirectLightingMode.js +6 -0
  272. package/src/shade/renderer/camera/orbital/README.md +3 -6
  273. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.d.ts +1 -1
  274. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.js +1 -1
  275. package/src/shade/renderer/fluid/FluidCascadePlacement.d.ts +8 -105
  276. package/src/shade/renderer/fluid/FluidCascadePlacement.d.ts.map +1 -1
  277. package/src/shade/renderer/fluid/FluidCascadePlacement.js +13 -306
  278. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  279. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  280. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  281. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_command.d.ts.map +1 -1
  282. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_command.js +8 -14
  283. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  284. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  285. package/src/shade/renderer/geometry/BoxGeometry.d.ts +0 -1
  286. package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
  287. package/src/shade/renderer/geometry/BoxGeometry.js +0 -9
  288. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts +4 -2
  289. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  290. package/src/shade/renderer/geometry/GPUGeometryManager.js +13 -2
  291. package/src/shade/renderer/geometry/Geometry.js +2 -2
  292. package/src/shade/renderer/geometry/blas_from_meshlets.d.ts.map +1 -1
  293. package/src/shade/renderer/geometry/blas_from_meshlets.js +12 -2
  294. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  295. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +18 -0
  296. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts.map +1 -1
  297. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.js +5 -0
  298. package/src/shade/renderer/geometry/mesh_compute_surface_area.js +4 -4
  299. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts +5 -0
  300. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
  301. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +15 -0
  302. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts.map +1 -1
  303. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.js +35 -26
  304. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
  305. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +2 -1
  306. package/src/shade/renderer/geometry/normals/decode_octahedral_u32_to_normal.d.ts +13 -0
  307. package/src/shade/renderer/geometry/normals/decode_octahedral_u32_to_normal.d.ts.map +1 -0
  308. package/src/shade/renderer/geometry/normals/decode_octahedral_u32_to_normal.js +33 -0
  309. package/src/shade/renderer/geometry/normals/geometry_build_tangents.js +7 -7
  310. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +189 -45
  311. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  312. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +1853 -144
  313. package/src/shade/renderer/geometry/sdf/MESH_SDF.d.ts +60 -0
  314. package/src/shade/renderer/geometry/sdf/MESH_SDF.d.ts.map +1 -0
  315. package/src/shade/renderer/geometry/sdf/MESH_SDF.js +62 -0
  316. package/src/shade/renderer/geometry/sdf/MESH_SDF_RESOURCES.d.ts +29 -0
  317. package/src/shade/renderer/geometry/sdf/MESH_SDF_RESOURCES.d.ts.map +1 -0
  318. package/src/shade/renderer/geometry/sdf/MESH_SDF_RESOURCES.js +41 -0
  319. package/src/shade/renderer/geometry/sdf/MESH_SDF_STRUCT.d.ts +12 -0
  320. package/src/shade/renderer/geometry/sdf/MESH_SDF_STRUCT.d.ts.map +1 -0
  321. package/src/shade/renderer/geometry/sdf/MESH_SDF_STRUCT.js +53 -0
  322. package/src/shade/renderer/geometry/sdf/MeshSDFLayout.d.ts +79 -0
  323. package/src/shade/renderer/geometry/sdf/MeshSDFLayout.d.ts.map +1 -0
  324. package/src/shade/renderer/geometry/sdf/MeshSDFLayout.js +168 -0
  325. package/src/shade/renderer/geometry/sdf/bake/MESH_SDF_BAKE.d.ts +75 -0
  326. package/src/shade/renderer/geometry/sdf/bake/MESH_SDF_BAKE.d.ts.map +1 -0
  327. package/src/shade/renderer/geometry/sdf/bake/MESH_SDF_BAKE.js +110 -0
  328. package/src/shade/renderer/geometry/sdf/bake/chunk_mesh_sdf_bake.d.ts +48 -0
  329. package/src/shade/renderer/geometry/sdf/bake/chunk_mesh_sdf_bake.d.ts.map +1 -0
  330. package/src/shade/renderer/geometry/sdf/bake/chunk_mesh_sdf_bake.js +146 -0
  331. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.d.ts +31 -0
  332. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.d.ts.map +1 -0
  333. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js +136 -0
  334. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.d.ts +29 -0
  335. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.d.ts.map +1 -0
  336. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js +146 -0
  337. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_free.d.ts +19 -0
  338. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_free.d.ts.map +1 -0
  339. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_free.js +77 -0
  340. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_store.d.ts +18 -0
  341. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_store.d.ts.map +1 -0
  342. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_store.js +84 -0
  343. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_take.d.ts +19 -0
  344. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_take.d.ts.map +1 -0
  345. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_take.js +72 -0
  346. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +171 -0
  347. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -0
  348. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +884 -0
  349. package/src/shade/renderer/geometry/sdf/cards/MESH_CARDS.d.ts +82 -0
  350. package/src/shade/renderer/geometry/sdf/cards/MESH_CARDS.d.ts.map +1 -0
  351. package/src/shade/renderer/geometry/sdf/cards/MESH_CARDS.js +127 -0
  352. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_RESOURCES.d.ts +24 -0
  353. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_RESOURCES.d.ts.map +1 -0
  354. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_RESOURCES.js +29 -0
  355. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_SET_STRUCT.d.ts +12 -0
  356. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_SET_STRUCT.d.ts.map +1 -0
  357. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_SET_STRUCT.js +31 -0
  358. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_card_surface.d.ts +29 -0
  359. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_card_surface.d.ts.map +1 -0
  360. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_card_surface.js +179 -0
  361. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_cards.d.ts +17 -0
  362. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_cards.d.ts.map +1 -0
  363. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_cards.js +107 -0
  364. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts +36 -0
  365. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts.map +1 -0
  366. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.js +237 -0
  367. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_compact.d.ts +19 -0
  368. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_compact.d.ts.map +1 -0
  369. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_compact.js +61 -0
  370. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.d.ts +18 -0
  371. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.d.ts.map +1 -0
  372. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.js +102 -0
  373. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_log.d.ts +15 -0
  374. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_log.d.ts.map +1 -0
  375. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_log.js +65 -0
  376. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_merge.d.ts +22 -0
  377. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_merge.d.ts.map +1 -0
  378. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_merge.js +136 -0
  379. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_pages.d.ts +20 -0
  380. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_pages.d.ts.map +1 -0
  381. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_pages.js +104 -0
  382. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_split.d.ts +30 -0
  383. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_split.d.ts.map +1 -0
  384. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_split.js +146 -0
  385. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts +35 -0
  386. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts.map +1 -0
  387. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js +161 -0
  388. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf.d.ts +21 -0
  389. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf.d.ts.map +1 -0
  390. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf.js +112 -0
  391. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_normal.d.ts +15 -0
  392. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_normal.d.ts.map +1 -0
  393. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_normal.js +34 -0
  394. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_raymarch.d.ts +17 -0
  395. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_raymarch.d.ts.map +1 -0
  396. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_raymarch.js +64 -0
  397. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_sample.d.ts +32 -0
  398. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_sample.d.ts.map +1 -0
  399. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_sample.js +104 -0
  400. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts +2 -0
  401. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  402. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +13 -23
  403. package/src/shade/renderer/geometry/util/geometry_compute_surface_area.js +2 -2
  404. package/src/shade/renderer/geometry/util/geometry_estimate_uv_aspect.js +2 -2
  405. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
  406. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_ao.js +2 -2
  407. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +2 -2
  408. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +0 -2
  409. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
  410. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +3 -13
  411. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts +10 -16
  412. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
  413. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +39 -82
  414. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +115 -0
  415. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -0
  416. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +369 -0
  417. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +2677 -0
  418. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +83 -0
  419. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -0
  420. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +626 -0
  421. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +265 -0
  422. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -0
  423. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +475 -0
  424. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +131 -0
  425. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -0
  426. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +181 -0
  427. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_MOVERS.d.ts +37 -0
  428. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_MOVERS.d.ts.map +1 -0
  429. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_MOVERS.js +48 -0
  430. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +223 -0
  431. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -0
  432. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +984 -0
  433. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts +69 -0
  434. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts.map +1 -0
  435. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.js +169 -0
  436. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +191 -0
  437. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -0
  438. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +590 -0
  439. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +30 -0
  440. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -0
  441. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +43 -0
  442. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts +35 -0
  443. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts.map +1 -0
  444. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.js +124 -0
  445. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +29 -0
  446. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -0
  447. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +97 -0
  448. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_object.d.ts +21 -0
  449. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_object.d.ts.map +1 -0
  450. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_object.js +42 -0
  451. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts +26 -0
  452. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts.map +1 -0
  453. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.js +73 -0
  454. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts +35 -0
  455. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +1 -0
  456. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +247 -0
  457. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_clear.d.ts +10 -0
  458. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_clear.d.ts.map +1 -0
  459. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_clear.js +44 -0
  460. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_coarse.d.ts +24 -0
  461. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_coarse.d.ts.map +1 -0
  462. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_coarse.js +92 -0
  463. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts +26 -0
  464. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts.map +1 -0
  465. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.js +133 -0
  466. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers.d.ts +21 -0
  467. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers.d.ts.map +1 -0
  468. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers.js +146 -0
  469. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers_command.d.ts +18 -0
  470. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers_command.d.ts.map +1 -0
  471. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers_command.js +84 -0
  472. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_requeue.d.ts +16 -0
  473. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_requeue.d.ts.map +1 -0
  474. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_requeue.js +67 -0
  475. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_scroll.d.ts +20 -0
  476. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_scroll.d.ts.map +1 -0
  477. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_scroll.js +128 -0
  478. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_store.d.ts +20 -0
  479. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_store.d.ts.map +1 -0
  480. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_store.js +127 -0
  481. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_take.d.ts +20 -0
  482. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_take.d.ts.map +1 -0
  483. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_take.js +79 -0
  484. package/src/shade/renderer/global_illumination/probe_clipmap/debug/ProbeClipmapDebugView.d.ts +11 -0
  485. package/src/shade/renderer/global_illumination/probe_clipmap/debug/ProbeClipmapDebugView.d.ts.map +1 -0
  486. package/src/shade/renderer/global_illumination/probe_clipmap/debug/ProbeClipmapDebugView.js +16 -0
  487. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.d.ts +29 -0
  488. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.d.ts.map +1 -0
  489. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.js +160 -0
  490. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_cards.d.ts +34 -0
  491. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_cards.d.ts.map +1 -0
  492. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_cards.js +189 -0
  493. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.d.ts +25 -0
  494. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.d.ts.map +1 -0
  495. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.js +138 -0
  496. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +170 -0
  497. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -0
  498. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +982 -0
  499. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +216 -0
  500. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -0
  501. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +289 -0
  502. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +232 -0
  503. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -0
  504. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +448 -0
  505. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +41 -0
  506. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -0
  507. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +110 -0
  508. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +30 -0
  509. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -0
  510. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +261 -0
  511. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +34 -0
  512. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -0
  513. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +169 -0
  514. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +22 -0
  515. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -0
  516. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +110 -0
  517. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_fill.d.ts +10 -0
  518. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_fill.d.ts.map +1 -0
  519. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_fill.js +39 -0
  520. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +26 -0
  521. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -0
  522. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +177 -0
  523. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.d.ts +18 -0
  524. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.d.ts.map +1 -0
  525. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.js +105 -0
  526. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.d.ts +25 -0
  527. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.d.ts.map +1 -0
  528. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +124 -0
  529. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +21 -0
  530. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -0
  531. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +118 -0
  532. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +19 -0
  533. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -0
  534. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +72 -0
  535. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +24 -0
  536. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -0
  537. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +141 -0
  538. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +33 -0
  539. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -0
  540. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +203 -0
  541. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts +19 -0
  542. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts.map +1 -0
  543. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.js +88 -0
  544. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts +27 -0
  545. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts.map +1 -0
  546. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js +199 -0
  547. package/src/shade/renderer/gpu_primitive/indirect/chunk_folded_dispatch.d.ts +19 -0
  548. package/src/shade/renderer/gpu_primitive/indirect/chunk_folded_dispatch.d.ts.map +1 -0
  549. package/src/shade/renderer/gpu_primitive/indirect/chunk_folded_dispatch.js +31 -0
  550. package/src/shade/renderer/gpu_primitive/slot_stack/chunk_slot_stack.d.ts +33 -0
  551. package/src/shade/renderer/gpu_primitive/slot_stack/chunk_slot_stack.d.ts.map +1 -0
  552. package/src/shade/renderer/gpu_primitive/slot_stack/chunk_slot_stack.js +58 -0
  553. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_fill.d.ts +31 -0
  554. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_fill.d.ts.map +1 -0
  555. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_fill.js +62 -0
  556. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_push_range.d.ts +21 -0
  557. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_push_range.d.ts.map +1 -0
  558. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_push_range.js +61 -0
  559. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  560. package/src/shade/renderer/light/GPULightCollection.js +12 -11
  561. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -1
  562. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  563. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +117 -120
  564. package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.d.ts +1 -2
  565. package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.d.ts.map +1 -1
  566. package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.js +44 -45
  567. package/src/shade/renderer/lightmap/atlas/rescale_uvs.js +2 -2
  568. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  569. package/src/shade/renderer/material/StandardShadeMaterial.js +5 -5
  570. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +10 -4
  571. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  572. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +112 -8
  573. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts +21 -0
  574. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts.map +1 -0
  575. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.js +30 -0
  576. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +24 -0
  577. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +1 -0
  578. package/src/shade/renderer/material/resident/shader_resident_texture_means.js +120 -0
  579. package/src/shade/renderer/particles/GPUParticleSystem.js +7 -7
  580. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +0 -1
  581. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
  582. package/src/shade/renderer/particles/graph/validate_particle_graph.js +0 -6
  583. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  584. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +5 -6
  585. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts.map +1 -1
  586. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.js +5 -7
  587. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  588. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -2
  589. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts.map +1 -1
  590. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.js +3 -2
  591. package/src/shade/renderer/particles/warmup/shader_particle_warmup.d.ts.map +1 -1
  592. package/src/shade/renderer/particles/warmup/shader_particle_warmup.js +316 -318
  593. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.d.ts.map +1 -1
  594. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.js +3 -2
  595. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.d.ts.map +1 -1
  596. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.js +2 -0
  597. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.js +1 -1
  598. package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.d.ts.map +1 -1
  599. package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.js +75 -78
  600. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts +0 -5
  601. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  602. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +377 -382
  603. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  604. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.js +1 -0
  605. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts +2 -1
  606. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts.map +1 -1
  607. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.js +3 -1
  608. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts +1 -0
  609. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts.map +1 -1
  610. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.js +2 -0
  611. package/src/shade/renderer/scene/GPUSceneContext.d.ts +17 -2
  612. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  613. package/src/shade/renderer/scene/GPUSceneContext.js +38 -2
  614. package/src/shade/renderer/scene/MESH_INSTANCE_METADATA_STRUCT.d.ts +17 -0
  615. package/src/shade/renderer/scene/MESH_INSTANCE_METADATA_STRUCT.d.ts.map +1 -1
  616. package/src/shade/renderer/scene/MESH_INSTANCE_METADATA_STRUCT.js +27 -0
  617. package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts.map +1 -1
  618. package/src/shade/renderer/scene/bvh/StaticSceneBVH.js +4 -6
  619. package/src/shade/renderer/scene/chunk_mesh_flags.d.ts +9 -0
  620. package/src/shade/renderer/scene/chunk_mesh_flags.d.ts.map +1 -0
  621. package/src/shade/renderer/scene/chunk_mesh_flags.js +22 -0
  622. package/src/shade/renderer/scene/movers/SCENE_MOVER_LAYOUT.d.ts +65 -0
  623. package/src/shade/renderer/scene/movers/SCENE_MOVER_LAYOUT.d.ts.map +1 -0
  624. package/src/shade/renderer/scene/movers/SCENE_MOVER_LAYOUT.js +87 -0
  625. package/src/shade/renderer/scene/movers/SceneMoverTracker.d.ts +42 -0
  626. package/src/shade/renderer/scene/movers/SceneMoverTracker.d.ts.map +1 -0
  627. package/src/shade/renderer/scene/movers/SceneMoverTracker.js +153 -0
  628. package/src/shade/renderer/scene/movers/chunk_scene_append_mover.d.ts +14 -0
  629. package/src/shade/renderer/scene/movers/chunk_scene_append_mover.d.ts.map +1 -0
  630. package/src/shade/renderer/scene/movers/chunk_scene_append_mover.js +33 -0
  631. package/src/shade/renderer/scene/movers/graph_scene_movers.d.ts +33 -0
  632. package/src/shade/renderer/scene/movers/graph_scene_movers.d.ts.map +1 -0
  633. package/src/shade/renderer/scene/movers/graph_scene_movers.js +114 -0
  634. package/src/shade/renderer/scene/movers/shader_scene_movers.d.ts +33 -0
  635. package/src/shade/renderer/scene/movers/shader_scene_movers.d.ts.map +1 -0
  636. package/src/shade/renderer/scene/movers/shader_scene_movers.js +197 -0
  637. package/src/shade/renderer/scene/movers/shader_scene_skinned_movers.d.ts +24 -0
  638. package/src/shade/renderer/scene/movers/shader_scene_skinned_movers.d.ts.map +1 -0
  639. package/src/shade/renderer/scene/movers/shader_scene_skinned_movers.js +112 -0
  640. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +26 -4
  641. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  642. package/src/shade/renderer/scene/rows/GPUSceneRows.js +64 -6
  643. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_nearest_point_on_surface.js +1 -1
  644. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_decompose_transform.d.ts +1 -1
  645. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_decompose_transform.js +2 -2
  646. package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_decode_u32.d.ts +1 -1
  647. package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_decode_u32.js +1 -1
  648. package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_encode_u32.d.ts +1 -1
  649. package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_encode_u32.js +1 -1
  650. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_mat2x4.d.ts.map +1 -1
  651. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_mat2x4.js +10 -7
  652. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_vec4.d.ts.map +1 -1
  653. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_vec4.js +6 -3
  654. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts +22 -0
  655. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts.map +1 -1
  656. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.js +62 -34
  657. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +1 -1
  658. package/src/shade/renderer/shader/compiler/ShaderSwitch.d.ts +1 -1
  659. package/src/shade/renderer/shader/compiler/ShaderSwitchSet.d.ts +1 -1
  660. package/src/shade/renderer/shader/resource/ShaderResourceDescriptor.d.ts +1 -1
  661. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -4
  662. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +50 -11
  663. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  664. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +188 -51
  665. package/src/shade/renderer/shadow/map/SHADOWMAP_PATCH_MIN_SIDE.d.ts +8 -0
  666. package/src/shade/renderer/shadow/map/SHADOWMAP_PATCH_MIN_SIDE.d.ts.map +1 -0
  667. package/src/shade/renderer/shadow/map/SHADOWMAP_PATCH_MIN_SIDE.js +7 -0
  668. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +7 -7
  669. package/src/shade/renderer/shadow/map/Shadowmap.js +7 -7
  670. package/src/shade/renderer/shadow/map/ShadowmapResolutionPolicy.d.ts +17 -0
  671. package/src/shade/renderer/shadow/map/ShadowmapResolutionPolicy.d.ts.map +1 -1
  672. package/src/shade/renderer/shadow/map/ShadowmapResolutionPolicy.js +29 -8
  673. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_get_light_visibility.d.ts +0 -1
  674. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_get_light_visibility.d.ts.map +1 -1
  675. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_get_light_visibility.js +0 -3
  676. package/src/shade/renderer/shadow/sdf/SDF_DRAW_SETTINGS_STRUCT.d.ts.map +1 -1
  677. package/src/shade/renderer/shadow/sdf/SDF_DRAW_SETTINGS_STRUCT.js +2 -5
  678. package/src/shade/renderer/shadow/sdf/chunk_geometry_sdf_query_distance.d.ts +8 -0
  679. package/src/shade/renderer/shadow/sdf/chunk_geometry_sdf_query_distance.d.ts.map +1 -1
  680. package/src/shade/renderer/shadow/sdf/chunk_geometry_sdf_query_distance.js +13 -41
  681. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.js +6 -5
  682. package/src/shade/renderer/shadow/sdf/chunk_sdf_geometry_raymarch.d.ts +8 -0
  683. package/src/shade/renderer/shadow/sdf/chunk_sdf_geometry_raymarch.d.ts.map +1 -1
  684. package/src/shade/renderer/shadow/sdf/chunk_sdf_geometry_raymarch.js +20 -73
  685. package/src/shade/renderer/shadow/sdf/chunk_sdf_mesh_raymarch.d.ts.map +1 -1
  686. package/src/shade/renderer/shadow/sdf/chunk_sdf_mesh_raymarch.js +4 -0
  687. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts +2 -0
  688. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  689. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +14 -8
  690. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_LOW_LOAD_FACTOR.d.ts +12 -0
  691. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_LOW_LOAD_FACTOR.d.ts.map +1 -0
  692. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_LOW_LOAD_FACTOR.js +11 -0
  693. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts +9 -0
  694. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts.map +1 -0
  695. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.js +8 -0
  696. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.d.ts +13 -0
  697. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.d.ts.map +1 -0
  698. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.js +12 -0
  699. package/src/shade/renderer/shadow/vsm/PLAN.md +3 -1
  700. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +80 -1
  701. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -1
  702. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +303 -3
  703. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +54 -3
  704. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
  705. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +418 -338
  706. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +8 -9
  707. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -1
  708. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +9 -92
  709. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +6 -6
  710. package/src/shade/renderer/texture/atlas/GPUTileAtlas2D.d.ts +90 -0
  711. package/src/shade/renderer/texture/atlas/GPUTileAtlas2D.d.ts.map +1 -0
  712. package/src/shade/renderer/texture/atlas/GPUTileAtlas2D.js +208 -0
  713. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +23 -4
  714. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -1
  715. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +56 -5
  716. package/src/shade/renderer/view/GPUViewContext.js +2 -2
  717. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_shadow_group_list.d.ts +59 -0
  718. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_shadow_group_list.d.ts.map +1 -0
  719. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_shadow_group_list.js +152 -0
  720. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  721. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +145 -46
  722. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +2 -1
  723. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -1
  724. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +3 -1
  725. package/src/shade/renderer/volumetrics/shader_volumetrics_bin_sun_shadow_media.d.ts +21 -0
  726. package/src/shade/renderer/volumetrics/shader_volumetrics_bin_sun_shadow_media.d.ts.map +1 -0
  727. package/src/shade/renderer/volumetrics/shader_volumetrics_bin_sun_shadow_media.js +125 -0
  728. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +4 -44
  729. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
  730. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +558 -311
  731. package/src/shade/renderer/volumetrics/shader_volumetrics_cull_sun_shadow_media.d.ts +18 -0
  732. package/src/shade/renderer/volumetrics/shader_volumetrics_cull_sun_shadow_media.d.ts.map +1 -0
  733. package/src/shade/renderer/volumetrics/shader_volumetrics_cull_sun_shadow_media.js +84 -0
  734. package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.d.ts +4 -0
  735. package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.d.ts.map +1 -1
  736. package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.js +1 -1
  737. package/src/shade/renderer/water/chunk_water_gi.d.ts +2 -2
  738. package/src/shade/renderer/water/chunk_water_gi.d.ts.map +1 -1
  739. package/src/shade/renderer/water/chunk_water_gi.js +4 -2
  740. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +127 -0
  741. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts.map +1 -0
  742. package/src/shade/renderer/water/query/GPUWaterQueries.js +741 -0
  743. package/src/shade/renderer/water/query/WATER_QUERY_DATABASE_SPEC.d.ts +58 -0
  744. package/src/shade/renderer/water/query/WATER_QUERY_DATABASE_SPEC.d.ts.map +1 -0
  745. package/src/shade/renderer/water/query/WATER_QUERY_DATABASE_SPEC.js +79 -0
  746. package/src/shade/renderer/water/query/shader_water_surface_query.d.ts +32 -0
  747. package/src/shade/renderer/water/query/shader_water_surface_query.d.ts.map +1 -0
  748. package/src/shade/renderer/water/query/shader_water_surface_query.js +227 -0
  749. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  750. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +12 -6
  751. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  752. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +20 -1
  753. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  754. package/src/shade/wgsl/validate_wgsl_source.js +26 -0
  755. package/src/view/common/LabelView.js +1 -1
  756. package/src/view/common/VirtualListView.js +1 -1
  757. package/src/view/elements/progress/SmoothProgressBar.js +1 -1
  758. package/src/view/tooltip/TooltipManager.js +1 -1
  759. package/editor/view/ecs/components/DatGuiController.d.ts +0 -2
  760. package/editor/view/ecs/components/DatGuiController.d.ts.map +0 -1
  761. package/editor/view/ecs/components/DatGuiController.js +0 -2
  762. package/editor/view/v2/SplitView.d.ts +0 -2
  763. package/editor/view/v2/SplitView.d.ts.map +0 -1
  764. package/editor/view/v2/SplitView.js +0 -2
  765. package/src/core/binary/hash/XXH128Hash.d.ts +0 -2
  766. package/src/core/binary/hash/XXH128Hash.d.ts.map +0 -1
  767. package/src/core/binary/hash/XXH128Hash.js +0 -4
  768. package/src/core/binary/hash/XXH3_SECRET.d.ts +0 -2
  769. package/src/core/binary/hash/XXH3_SECRET.d.ts.map +0 -1
  770. package/src/core/binary/hash/XXH3_SECRET.js +0 -4
  771. package/src/core/binary/hash/crc32.d.ts +0 -2
  772. package/src/core/binary/hash/crc32.d.ts.map +0 -1
  773. package/src/core/binary/hash/crc32.js +0 -4
  774. package/src/core/binary/hash/xxh3_128.d.ts +0 -2
  775. package/src/core/binary/hash/xxh3_128.d.ts.map +0 -1
  776. package/src/core/binary/hash/xxh3_128.js +0 -4
  777. package/src/core/binary/hash/xxh3_64.d.ts +0 -2
  778. package/src/core/binary/hash/xxh3_64.d.ts.map +0 -1
  779. package/src/core/binary/hash/xxh3_64.js +0 -4
  780. package/src/core/binary/hash/xxh3_common.d.ts +0 -2
  781. package/src/core/binary/hash/xxh3_common.d.ts.map +0 -1
  782. package/src/core/binary/hash/xxh3_common.js +0 -90
  783. package/src/core/binary/lsb_32.d.ts +0 -17
  784. package/src/core/binary/lsb_32.d.ts.map +0 -1
  785. package/src/core/binary/lsb_32.js +0 -17
  786. package/src/core/color/hex/hex2rgb.d.ts +0 -2
  787. package/src/core/color/hex/hex2rgb.d.ts.map +0 -1
  788. package/src/core/color/hex/hex2rgb.js +0 -7
  789. package/src/core/color/hex/rgb2hex.d.ts +0 -2
  790. package/src/core/color/hex/rgb2hex.d.ts.map +0 -1
  791. package/src/core/color/hex/rgb2hex.js +0 -7
  792. package/src/core/color/hsv/hsv2rgb.d.ts +0 -2
  793. package/src/core/color/hsv/hsv2rgb.d.ts.map +0 -1
  794. package/src/core/color/hsv/hsv2rgb.js +0 -8
  795. package/src/core/color/hsv/rgb2hsv.d.ts +0 -2
  796. package/src/core/color/hsv/rgb2hsv.d.ts.map +0 -1
  797. package/src/core/color/hsv/rgb2hsv.js +0 -7
  798. package/src/core/color/hunt/hpe_to_xyz.d.ts +0 -2
  799. package/src/core/color/hunt/hpe_to_xyz.d.ts.map +0 -1
  800. package/src/core/color/hunt/hpe_to_xyz.js +0 -4
  801. package/src/core/color/hunt/xyz_to_hpe.d.ts +0 -2
  802. package/src/core/color/hunt/xyz_to_hpe.d.ts.map +0 -1
  803. package/src/core/color/hunt/xyz_to_hpe.js +0 -12
  804. package/src/core/color/int2rgb.d.ts +0 -2
  805. package/src/core/color/int2rgb.d.ts.map +0 -1
  806. package/src/core/color/int2rgb.js +0 -7
  807. package/src/core/color/rgb2uint24.d.ts +0 -2
  808. package/src/core/color/rgb2uint24.d.ts.map +0 -1
  809. package/src/core/color/rgb2uint24.js +0 -7
  810. package/src/core/color/rgb2uint32.d.ts +0 -2
  811. package/src/core/color/rgb2uint32.d.ts.map +0 -1
  812. package/src/core/color/rgb2uint32.js +0 -7
  813. package/src/core/geom/2d/aabb/aabb2_array_combine.d.ts +0 -7
  814. package/src/core/geom/2d/aabb/aabb2_array_combine.d.ts.map +0 -1
  815. package/src/core/geom/2d/aabb/aabb2_array_combine.js +0 -7
  816. package/src/core/geom/2d/aabb/aabb2_compute_area.d.ts +0 -7
  817. package/src/core/geom/2d/aabb/aabb2_compute_area.d.ts.map +0 -1
  818. package/src/core/geom/2d/aabb/aabb2_compute_area.js +0 -7
  819. package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.d.ts +0 -7
  820. package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.d.ts.map +0 -1
  821. package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.js +0 -7
  822. package/src/core/geom/2d/aabb/aabb2_compute_overlap.d.ts +0 -7
  823. package/src/core/geom/2d/aabb/aabb2_compute_overlap.d.ts.map +0 -1
  824. package/src/core/geom/2d/aabb/aabb2_compute_overlap.js +0 -7
  825. package/src/core/geom/2d/aabb/aabb2_from_v2_array.d.ts +0 -7
  826. package/src/core/geom/2d/aabb/aabb2_from_v2_array.d.ts.map +0 -1
  827. package/src/core/geom/2d/aabb/aabb2_from_v2_array.js +0 -7
  828. package/src/core/geom/2d/aabb/aabb2_intersects_point.d.ts +0 -7
  829. package/src/core/geom/2d/aabb/aabb2_intersects_point.d.ts.map +0 -1
  830. package/src/core/geom/2d/aabb/aabb2_intersects_point.js +0 -7
  831. package/src/core/geom/2d/aabb/aabb2_overlap_exists.d.ts +0 -7
  832. package/src/core/geom/2d/aabb/aabb2_overlap_exists.d.ts.map +0 -1
  833. package/src/core/geom/2d/aabb/aabb2_overlap_exists.js +0 -7
  834. package/src/core/geom/2d/circle/circle_compute_circle_intersection.d.ts +0 -7
  835. package/src/core/geom/2d/circle/circle_compute_circle_intersection.d.ts.map +0 -1
  836. package/src/core/geom/2d/circle/circle_compute_circle_intersection.js +0 -7
  837. package/src/core/geom/2d/circle/circle_compute_circle_penetration.d.ts +0 -7
  838. package/src/core/geom/2d/circle/circle_compute_circle_penetration.d.ts.map +0 -1
  839. package/src/core/geom/2d/circle/circle_compute_circle_penetration.js +0 -7
  840. package/src/core/geom/2d/circle/circle_intersects_point.d.ts +0 -7
  841. package/src/core/geom/2d/circle/circle_intersects_point.d.ts.map +0 -1
  842. package/src/core/geom/2d/circle/circle_intersects_point.js +0 -7
  843. package/src/core/geom/2d/compute_polygon_area_2d.d.ts +0 -7
  844. package/src/core/geom/2d/compute_polygon_area_2d.d.ts.map +0 -1
  845. package/src/core/geom/2d/compute_polygon_area_2d.js +0 -7
  846. package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.d.ts +0 -7
  847. package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.d.ts.map +0 -1
  848. package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.js +0 -7
  849. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.d.ts +0 -7
  850. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.d.ts.map +0 -1
  851. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.js +0 -7
  852. package/src/core/geom/2d/convex-hull/orientation3_array.d.ts +0 -7
  853. package/src/core/geom/2d/convex-hull/orientation3_array.d.ts.map +0 -1
  854. package/src/core/geom/2d/convex-hull/orientation3_array.js +0 -7
  855. package/src/core/geom/2d/intersect_ray_2d.d.ts +0 -7
  856. package/src/core/geom/2d/intersect_ray_2d.d.ts.map +0 -1
  857. package/src/core/geom/2d/intersect_ray_2d.js +0 -7
  858. package/src/core/geom/2d/line/line2_distance_to_point_sqr.d.ts +0 -7
  859. package/src/core/geom/2d/line/line2_distance_to_point_sqr.d.ts.map +0 -1
  860. package/src/core/geom/2d/line/line2_distance_to_point_sqr.js +0 -7
  861. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.d.ts +0 -7
  862. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.d.ts.map +0 -1
  863. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.js +0 -7
  864. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.d.ts +0 -7
  865. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.d.ts.map +0 -1
  866. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.js +0 -7
  867. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.d.ts +0 -7
  868. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.d.ts.map +0 -1
  869. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.js +0 -7
  870. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.d.ts +0 -7
  871. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.d.ts.map +0 -1
  872. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.js +0 -7
  873. package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.d.ts +0 -7
  874. package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.d.ts.map +0 -1
  875. package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.js +0 -7
  876. package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.d.ts +0 -7
  877. package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.d.ts.map +0 -1
  878. package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.js +0 -7
  879. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts +0 -7
  880. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts.map +0 -1
  881. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.js +0 -7
  882. package/src/core/geom/2d/rectangle_to_aabb.d.ts +0 -7
  883. package/src/core/geom/2d/rectangle_to_aabb.d.ts.map +0 -1
  884. package/src/core/geom/2d/rectangle_to_aabb.js +0 -7
  885. package/src/core/geom/2d/spline_bezier2_2d.d.ts +0 -7
  886. package/src/core/geom/2d/spline_bezier2_2d.d.ts.map +0 -1
  887. package/src/core/geom/2d/spline_bezier2_2d.js +0 -7
  888. package/src/core/geom/2d/triangle2d_compute_area.d.ts +0 -7
  889. package/src/core/geom/2d/triangle2d_compute_area.d.ts.map +0 -1
  890. package/src/core/geom/2d/triangle2d_compute_area.js +0 -7
  891. package/src/core/geom/2d/triangle2d_contains_point.d.ts +0 -7
  892. package/src/core/geom/2d/triangle2d_contains_point.d.ts.map +0 -1
  893. package/src/core/geom/2d/triangle2d_contains_point.js +0 -7
  894. package/src/core/geom/2d/triangle2d_get_barycentric.d.ts +0 -7
  895. package/src/core/geom/2d/triangle2d_get_barycentric.d.ts.map +0 -1
  896. package/src/core/geom/2d/triangle2d_get_barycentric.js +0 -7
  897. package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.d.ts +0 -7
  898. package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.d.ts.map +0 -1
  899. package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.js +0 -7
  900. package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.d.ts +0 -7
  901. package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.d.ts.map +0 -1
  902. package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.js +0 -7
  903. package/src/core/geom/3d/aabb/aabb3_combined_surface_area.d.ts +0 -7
  904. package/src/core/geom/3d/aabb/aabb3_combined_surface_area.d.ts.map +0 -1
  905. package/src/core/geom/3d/aabb/aabb3_combined_surface_area.js +0 -7
  906. package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.d.ts +0 -7
  907. package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.d.ts.map +0 -1
  908. package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.js +0 -7
  909. package/src/core/geom/3d/aabb/aabb3_compute_projected_area.d.ts +0 -7
  910. package/src/core/geom/3d/aabb/aabb3_compute_projected_area.d.ts.map +0 -1
  911. package/src/core/geom/3d/aabb/aabb3_compute_projected_area.js +0 -7
  912. package/src/core/geom/3d/aabb/aabb3_compute_surface_area.d.ts +0 -7
  913. package/src/core/geom/3d/aabb/aabb3_compute_surface_area.d.ts.map +0 -1
  914. package/src/core/geom/3d/aabb/aabb3_compute_surface_area.js +0 -7
  915. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.d.ts +0 -7
  916. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.d.ts.map +0 -1
  917. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +0 -7
  918. package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.d.ts +0 -7
  919. package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.d.ts.map +0 -1
  920. package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.js +0 -7
  921. package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.d.ts +0 -7
  922. package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.d.ts.map +0 -1
  923. package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.js +0 -7
  924. package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.d.ts +0 -7
  925. package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.d.ts.map +0 -1
  926. package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.js +0 -7
  927. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.d.ts +0 -7
  928. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.d.ts.map +0 -1
  929. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js +0 -7
  930. package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.d.ts +0 -7
  931. package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.d.ts.map +0 -1
  932. package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.js +0 -7
  933. package/src/core/geom/3d/aabb/aabb3_raycast.d.ts +0 -7
  934. package/src/core/geom/3d/aabb/aabb3_raycast.d.ts.map +0 -1
  935. package/src/core/geom/3d/aabb/aabb3_raycast.js +0 -7
  936. package/src/core/geom/3d/aabb/compute_aabb_from_points.d.ts +0 -7
  937. package/src/core/geom/3d/aabb/compute_aabb_from_points.d.ts.map +0 -1
  938. package/src/core/geom/3d/aabb/compute_aabb_from_points.js +0 -7
  939. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts +0 -7
  940. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts.map +0 -1
  941. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.js +0 -7
  942. package/src/core/geom/3d/compute_circle_bounding_box.d.ts +0 -7
  943. package/src/core/geom/3d/compute_circle_bounding_box.d.ts.map +0 -1
  944. package/src/core/geom/3d/compute_circle_bounding_box.js +0 -7
  945. package/src/core/geom/3d/cone/computeConeBoundingBox.d.ts +0 -7
  946. package/src/core/geom/3d/cone/computeConeBoundingBox.d.ts.map +0 -1
  947. package/src/core/geom/3d/cone/computeConeBoundingBox.js +0 -7
  948. package/src/core/geom/3d/cone/computeConePlaneSide.d.ts +0 -7
  949. package/src/core/geom/3d/cone/computeConePlaneSide.d.ts.map +0 -1
  950. package/src/core/geom/3d/cone/computeConePlaneSide.js +0 -7
  951. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.d.ts +0 -7
  952. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.d.ts.map +0 -1
  953. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js +0 -7
  954. package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.d.ts +0 -7
  955. package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.d.ts.map +0 -1
  956. package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.js +0 -7
  957. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.d.ts +0 -7
  958. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.d.ts.map +0 -1
  959. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +0 -7
  960. package/src/core/geom/3d/frustum/frustum_matrix4_project.d.ts +0 -7
  961. package/src/core/geom/3d/frustum/frustum_matrix4_project.d.ts.map +0 -1
  962. package/src/core/geom/3d/frustum/frustum_matrix4_project.js +0 -7
  963. package/src/core/geom/3d/frustum/hexahedron_from_aabb.d.ts +0 -7
  964. package/src/core/geom/3d/frustum/hexahedron_from_aabb.d.ts.map +0 -1
  965. package/src/core/geom/3d/frustum/hexahedron_from_aabb.js +0 -7
  966. package/src/core/geom/3d/frustum/read_three_planes_to_array.d.ts +0 -7
  967. package/src/core/geom/3d/frustum/read_three_planes_to_array.d.ts.map +0 -1
  968. package/src/core/geom/3d/frustum/read_three_planes_to_array.js +0 -7
  969. package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.d.ts +0 -7
  970. package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.d.ts.map +0 -1
  971. package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.js +0 -7
  972. package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts +0 -7
  973. package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts.map +0 -1
  974. package/src/core/geom/3d/line/line3_closest_points_segment_segment.js +0 -7
  975. package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.d.ts +0 -7
  976. package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.d.ts.map +0 -1
  977. package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.js +0 -7
  978. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.d.ts +0 -7
  979. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.d.ts.map +0 -1
  980. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.js +0 -7
  981. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.d.ts +0 -7
  982. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.d.ts.map +0 -1
  983. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.js +0 -7
  984. package/src/core/geom/3d/mat4/allocate_m4.d.ts +0 -7
  985. package/src/core/geom/3d/mat4/allocate_m4.d.ts.map +0 -1
  986. package/src/core/geom/3d/mat4/allocate_m4.js +0 -7
  987. package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.d.ts +0 -7
  988. package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.d.ts.map +0 -1
  989. package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.js +0 -7
  990. package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.d.ts +0 -7
  991. package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.d.ts.map +0 -1
  992. package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.js +0 -7
  993. package/src/core/geom/3d/mat4/compose_matrix4_array.d.ts +0 -7
  994. package/src/core/geom/3d/mat4/compose_matrix4_array.d.ts.map +0 -1
  995. package/src/core/geom/3d/mat4/compose_matrix4_array.js +0 -7
  996. package/src/core/geom/3d/mat4/decompose_matrix_4_array.d.ts +0 -7
  997. package/src/core/geom/3d/mat4/decompose_matrix_4_array.d.ts.map +0 -1
  998. package/src/core/geom/3d/mat4/decompose_matrix_4_array.js +0 -7
  999. package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.d.ts +0 -7
  1000. package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.d.ts.map +0 -1
  1001. package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.js +0 -7
  1002. package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.d.ts +0 -7
  1003. package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.d.ts.map +0 -1
  1004. package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.js +0 -7
  1005. package/src/core/geom/3d/morton/mortonEncode_LUT.d.ts +0 -7
  1006. package/src/core/geom/3d/morton/mortonEncode_LUT.d.ts.map +0 -1
  1007. package/src/core/geom/3d/morton/mortonEncode_LUT.js +0 -7
  1008. package/src/core/geom/3d/morton/mortonEncode_magicbits.d.ts +0 -7
  1009. package/src/core/geom/3d/morton/mortonEncode_magicbits.d.ts.map +0 -1
  1010. package/src/core/geom/3d/morton/mortonEncode_magicbits.js +0 -7
  1011. package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.d.ts +0 -2
  1012. package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.d.ts.map +0 -1
  1013. package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.js +0 -5
  1014. package/src/core/geom/3d/plane/is_point_within_planes.d.ts +0 -7
  1015. package/src/core/geom/3d/plane/is_point_within_planes.d.ts.map +0 -1
  1016. package/src/core/geom/3d/plane/is_point_within_planes.js +0 -7
  1017. package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.d.ts +0 -7
  1018. package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.d.ts.map +0 -1
  1019. package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.js +0 -7
  1020. package/src/core/geom/3d/plane/plane3_compute_plane_intersection.d.ts +0 -7
  1021. package/src/core/geom/3d/plane/plane3_compute_plane_intersection.d.ts.map +0 -1
  1022. package/src/core/geom/3d/plane/plane3_compute_plane_intersection.js +0 -7
  1023. package/src/core/geom/3d/plane/plane3_intersect_plane.d.ts +0 -7
  1024. package/src/core/geom/3d/plane/plane3_intersect_plane.d.ts.map +0 -1
  1025. package/src/core/geom/3d/plane/plane3_intersect_plane.js +0 -7
  1026. package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.d.ts +0 -7
  1027. package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.d.ts.map +0 -1
  1028. package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.js +0 -7
  1029. package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.d.ts +0 -7
  1030. package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.d.ts.map +0 -1
  1031. package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.js +0 -7
  1032. package/src/core/geom/3d/quaternion/quat_decode_from_uint32.d.ts +0 -7
  1033. package/src/core/geom/3d/quaternion/quat_decode_from_uint32.d.ts.map +0 -1
  1034. package/src/core/geom/3d/quaternion/quat_decode_from_uint32.js +0 -7
  1035. package/src/core/geom/3d/quaternion/quat_encode_to_uint32.d.ts +0 -7
  1036. package/src/core/geom/3d/quaternion/quat_encode_to_uint32.d.ts.map +0 -1
  1037. package/src/core/geom/3d/quaternion/quat_encode_to_uint32.js +0 -7
  1038. package/src/core/geom/3d/ray/ray3_array_compose.d.ts +0 -7
  1039. package/src/core/geom/3d/ray/ray3_array_compose.d.ts.map +0 -1
  1040. package/src/core/geom/3d/ray/ray3_array_compose.js +0 -7
  1041. package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.d.ts +0 -7
  1042. package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.d.ts.map +0 -1
  1043. package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.js +0 -7
  1044. package/src/core/geom/3d/ray/ray3_distance_to_point.d.ts +0 -7
  1045. package/src/core/geom/3d/ray/ray3_distance_to_point.d.ts.map +0 -1
  1046. package/src/core/geom/3d/ray/ray3_distance_to_point.js +0 -7
  1047. package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.d.ts +0 -7
  1048. package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.d.ts.map +0 -1
  1049. package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.js +0 -7
  1050. package/src/core/geom/3d/shape/shape_mesh_from_geometry.d.ts +0 -7
  1051. package/src/core/geom/3d/shape/shape_mesh_from_geometry.d.ts.map +0 -1
  1052. package/src/core/geom/3d/shape/shape_mesh_from_geometry.js +0 -7
  1053. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts +0 -7
  1054. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +0 -1
  1055. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +0 -7
  1056. package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.d.ts +0 -7
  1057. package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.d.ts.map +0 -1
  1058. package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.js +0 -7
  1059. package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.d.ts +0 -7
  1060. package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.d.ts.map +0 -1
  1061. package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.js +0 -7
  1062. package/src/core/geom/3d/sphere/harmonics/sh_compute_K.d.ts +0 -7
  1063. package/src/core/geom/3d/sphere/harmonics/sh_compute_K.d.ts.map +0 -1
  1064. package/src/core/geom/3d/sphere/harmonics/sh_compute_K.js +0 -7
  1065. package/src/core/geom/3d/sphere/sphere_array_intersects_point.d.ts +0 -7
  1066. package/src/core/geom/3d/sphere/sphere_array_intersects_point.d.ts.map +0 -1
  1067. package/src/core/geom/3d/sphere/sphere_array_intersects_point.js +0 -7
  1068. package/src/core/geom/3d/sphere/sphere_array_intersects_ray.d.ts +0 -7
  1069. package/src/core/geom/3d/sphere/sphere_array_intersects_ray.d.ts.map +0 -1
  1070. package/src/core/geom/3d/sphere/sphere_array_intersects_ray.js +0 -7
  1071. package/src/core/geom/3d/sphere/sphere_intersects_point.d.ts +0 -7
  1072. package/src/core/geom/3d/sphere/sphere_intersects_point.d.ts.map +0 -1
  1073. package/src/core/geom/3d/sphere/sphere_intersects_point.js +0 -7
  1074. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts +0 -7
  1075. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts.map +0 -1
  1076. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js +0 -7
  1077. package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.d.ts +0 -7
  1078. package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.d.ts.map +0 -1
  1079. package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.js +0 -7
  1080. package/src/core/geom/3d/sphere/spherical_from_cartesian.d.ts +0 -7
  1081. package/src/core/geom/3d/sphere/spherical_from_cartesian.d.ts.map +0 -1
  1082. package/src/core/geom/3d/sphere/spherical_from_cartesian.js +0 -7
  1083. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts +0 -7
  1084. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts.map +0 -1
  1085. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.js +0 -7
  1086. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.d.ts +0 -7
  1087. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.d.ts.map +0 -1
  1088. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.js +0 -7
  1089. package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.d.ts +0 -7
  1090. package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.d.ts.map +0 -1
  1091. package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.js +0 -7
  1092. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts +0 -7
  1093. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts.map +0 -1
  1094. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js +0 -7
  1095. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.d.ts +0 -7
  1096. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.d.ts.map +0 -1
  1097. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.js +0 -7
  1098. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.d.ts +0 -7
  1099. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.d.ts.map +0 -1
  1100. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.js +0 -7
  1101. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.d.ts +0 -7
  1102. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.d.ts.map +0 -1
  1103. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.js +0 -7
  1104. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.d.ts +0 -7
  1105. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.d.ts.map +0 -1
  1106. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.js +0 -7
  1107. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.d.ts +0 -7
  1108. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.d.ts.map +0 -1
  1109. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.js +0 -7
  1110. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.d.ts +0 -7
  1111. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.d.ts.map +0 -1
  1112. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.js +0 -7
  1113. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.d.ts +0 -7
  1114. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.d.ts.map +0 -1
  1115. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.js +0 -7
  1116. package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.d.ts +0 -7
  1117. package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.d.ts.map +0 -1
  1118. package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.js +0 -7
  1119. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.d.ts +0 -8
  1120. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.d.ts.map +0 -1
  1121. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.js +0 -8
  1122. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts +0 -7
  1123. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts.map +0 -1
  1124. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.js +0 -7
  1125. package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.d.ts +0 -7
  1126. package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.d.ts.map +0 -1
  1127. package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.js +0 -7
  1128. package/src/core/geom/3d/triangle/computeTriangleRayIntersection.d.ts +0 -7
  1129. package/src/core/geom/3d/triangle/computeTriangleRayIntersection.d.ts.map +0 -1
  1130. package/src/core/geom/3d/triangle/computeTriangleRayIntersection.js +0 -7
  1131. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.d.ts +0 -7
  1132. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.d.ts.map +0 -1
  1133. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.js +0 -7
  1134. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.d.ts +0 -7
  1135. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.d.ts.map +0 -1
  1136. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js +0 -7
  1137. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.d.ts +0 -7
  1138. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.d.ts.map +0 -1
  1139. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.js +0 -7
  1140. package/src/core/geom/3d/triangle/compute_triangle_area_3d.d.ts +0 -7
  1141. package/src/core/geom/3d/triangle/compute_triangle_area_3d.d.ts.map +0 -1
  1142. package/src/core/geom/3d/triangle/compute_triangle_area_3d.js +0 -7
  1143. package/src/core/geom/3d/triangle/compute_triangle_normal.d.ts +0 -7
  1144. package/src/core/geom/3d/triangle/compute_triangle_normal.d.ts.map +0 -1
  1145. package/src/core/geom/3d/triangle/compute_triangle_normal.js +0 -7
  1146. package/src/core/geom/3d/triangle/rayTriangleIntersection.d.ts +0 -7
  1147. package/src/core/geom/3d/triangle/rayTriangleIntersection.d.ts.map +0 -1
  1148. package/src/core/geom/3d/triangle/rayTriangleIntersection.js +0 -7
  1149. package/src/core/geom/3d/triangle/triangle3_incenter.d.ts +0 -7
  1150. package/src/core/geom/3d/triangle/triangle3_incenter.d.ts.map +0 -1
  1151. package/src/core/geom/3d/triangle/triangle3_incenter.js +0 -7
  1152. package/src/core/geom/3d/triangle/triangle_compute_plane_side.d.ts +0 -7
  1153. package/src/core/geom/3d/triangle/triangle_compute_plane_side.d.ts.map +0 -1
  1154. package/src/core/geom/3d/triangle/triangle_compute_plane_side.js +0 -7
  1155. package/src/core/geom/3d/triangle/triangle_compute_signed_volume.d.ts +0 -7
  1156. package/src/core/geom/3d/triangle/triangle_compute_signed_volume.d.ts.map +0 -1
  1157. package/src/core/geom/3d/triangle/triangle_compute_signed_volume.js +0 -7
  1158. package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.d.ts +0 -7
  1159. package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.d.ts.map +0 -1
  1160. package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.js +0 -7
  1161. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts +0 -7
  1162. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts.map +0 -1
  1163. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.js +0 -7
  1164. package/src/core/geom/3d/triangle/v3_compute_triangle_normal.d.ts +0 -7
  1165. package/src/core/geom/3d/triangle/v3_compute_triangle_normal.d.ts.map +0 -1
  1166. package/src/core/geom/3d/triangle/v3_compute_triangle_normal.js +0 -7
  1167. package/src/core/geom/3d/util/make_justified_point_grid.d.ts +0 -7
  1168. package/src/core/geom/3d/util/make_justified_point_grid.d.ts.map +0 -1
  1169. package/src/core/geom/3d/util/make_justified_point_grid.js +0 -7
  1170. package/src/core/geom/mat3/m3_cm_from_translation.d.ts +0 -7
  1171. package/src/core/geom/mat3/m3_cm_from_translation.d.ts.map +0 -1
  1172. package/src/core/geom/mat3/m3_cm_from_translation.js +0 -7
  1173. package/src/core/geom/mat3/m3_cm_invert.d.ts +0 -7
  1174. package/src/core/geom/mat3/m3_cm_invert.d.ts.map +0 -1
  1175. package/src/core/geom/mat3/m3_cm_invert.js +0 -7
  1176. package/src/core/geom/mat3/m3_make_rotation.d.ts +0 -2
  1177. package/src/core/geom/mat3/m3_make_rotation.d.ts.map +0 -1
  1178. package/src/core/geom/mat3/m3_make_rotation.js +0 -5
  1179. package/src/core/geom/mat3/m3_multiply_vec3.d.ts +0 -7
  1180. package/src/core/geom/mat3/m3_multiply_vec3.d.ts.map +0 -1
  1181. package/src/core/geom/mat3/m3_multiply_vec3.js +0 -7
  1182. package/src/core/geom/packing/computeBoundingSphereOfSpheres.d.ts +0 -7
  1183. package/src/core/geom/packing/computeBoundingSphereOfSpheres.d.ts.map +0 -1
  1184. package/src/core/geom/packing/computeBoundingSphereOfSpheres.js +0 -7
  1185. package/src/core/geom/packing/max-rect/cost/costByBestShortSide.d.ts +0 -7
  1186. package/src/core/geom/packing/max-rect/cost/costByBestShortSide.d.ts.map +0 -1
  1187. package/src/core/geom/packing/max-rect/cost/costByBestShortSide.js +0 -7
  1188. package/src/core/geom/packing/max-rect/cost/costByRemainingArea.d.ts +0 -7
  1189. package/src/core/geom/packing/max-rect/cost/costByRemainingArea.d.ts.map +0 -1
  1190. package/src/core/geom/packing/max-rect/cost/costByRemainingArea.js +0 -7
  1191. package/src/core/geom/packing/max-rect/cutArea.d.ts +0 -7
  1192. package/src/core/geom/packing/max-rect/cutArea.d.ts.map +0 -1
  1193. package/src/core/geom/packing/max-rect/cutArea.js +0 -7
  1194. package/src/core/geom/packing/max-rect/findBestContainer.d.ts +0 -7
  1195. package/src/core/geom/packing/max-rect/findBestContainer.d.ts.map +0 -1
  1196. package/src/core/geom/packing/max-rect/findBestContainer.js +0 -7
  1197. package/src/core/geom/packing/max-rect/packMaxRectangles.d.ts +0 -7
  1198. package/src/core/geom/packing/max-rect/packMaxRectangles.d.ts.map +0 -1
  1199. package/src/core/geom/packing/max-rect/packMaxRectangles.js +0 -7
  1200. package/src/core/geom/packing/max-rect/packOneBox.d.ts +0 -7
  1201. package/src/core/geom/packing/max-rect/packOneBox.d.ts.map +0 -1
  1202. package/src/core/geom/packing/max-rect/packOneBox.js +0 -7
  1203. package/src/core/geom/packing/max-rect/removeRedundantBoxes.d.ts +0 -7
  1204. package/src/core/geom/packing/max-rect/removeRedundantBoxes.d.ts.map +0 -1
  1205. package/src/core/geom/packing/max-rect/removeRedundantBoxes.js +0 -7
  1206. package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.d.ts +0 -7
  1207. package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.d.ts.map +0 -1
  1208. package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.js +0 -7
  1209. package/src/core/geom/random/randomPointInBox.d.ts +0 -7
  1210. package/src/core/geom/random/randomPointInBox.d.ts.map +0 -1
  1211. package/src/core/geom/random/randomPointInBox.js +0 -7
  1212. package/src/core/geom/random/randomPointInCircle.d.ts +0 -7
  1213. package/src/core/geom/random/randomPointInCircle.d.ts.map +0 -1
  1214. package/src/core/geom/random/randomPointInCircle.js +0 -7
  1215. package/src/core/geom/random/randomPointInPoint.d.ts +0 -7
  1216. package/src/core/geom/random/randomPointInPoint.d.ts.map +0 -1
  1217. package/src/core/geom/random/randomPointInPoint.js +0 -7
  1218. package/src/core/geom/random/randomPointInSphere.d.ts +0 -7
  1219. package/src/core/geom/random/randomPointInSphere.d.ts.map +0 -1
  1220. package/src/core/geom/random/randomPointInSphere.js +0 -7
  1221. package/src/core/geom/random/randomPointOnBox.d.ts +0 -7
  1222. package/src/core/geom/random/randomPointOnBox.d.ts.map +0 -1
  1223. package/src/core/geom/random/randomPointOnBox.js +0 -7
  1224. package/src/core/geom/random/randomPointOnSphere.d.ts +0 -7
  1225. package/src/core/geom/random/randomPointOnSphere.d.ts.map +0 -1
  1226. package/src/core/geom/random/randomPointOnSphere.js +0 -7
  1227. package/src/core/geom/vec/vector_copy.d.ts +0 -7
  1228. package/src/core/geom/vec/vector_copy.d.ts.map +0 -1
  1229. package/src/core/geom/vec/vector_copy.js +0 -7
  1230. package/src/core/geom/vec/vector_scale_array.d.ts +0 -7
  1231. package/src/core/geom/vec/vector_scale_array.d.ts.map +0 -1
  1232. package/src/core/geom/vec/vector_scale_array.js +0 -7
  1233. package/src/core/geom/vec3/v3_angle_atan2_between.d.ts +0 -7
  1234. package/src/core/geom/vec3/v3_angle_atan2_between.d.ts.map +0 -1
  1235. package/src/core/geom/vec3/v3_angle_atan2_between.js +0 -7
  1236. package/src/core/geom/vec3/v3_angle_between.d.ts +0 -7
  1237. package/src/core/geom/vec3/v3_angle_between.d.ts.map +0 -1
  1238. package/src/core/geom/vec3/v3_angle_between.js +0 -7
  1239. package/src/core/geom/vec3/v3_angle_cos_between.d.ts +0 -7
  1240. package/src/core/geom/vec3/v3_angle_cos_between.d.ts.map +0 -1
  1241. package/src/core/geom/vec3/v3_angle_cos_between.js +0 -7
  1242. package/src/core/geom/vec3/v3_array_add_in_place.d.ts +0 -7
  1243. package/src/core/geom/vec3/v3_array_add_in_place.d.ts.map +0 -1
  1244. package/src/core/geom/vec3/v3_array_add_in_place.js +0 -7
  1245. package/src/core/geom/vec3/v3_array_centroid.d.ts +0 -7
  1246. package/src/core/geom/vec3/v3_array_centroid.d.ts.map +0 -1
  1247. package/src/core/geom/vec3/v3_array_centroid.js +0 -7
  1248. package/src/core/geom/vec3/v3_array_copy.d.ts +0 -7
  1249. package/src/core/geom/vec3/v3_array_copy.d.ts.map +0 -1
  1250. package/src/core/geom/vec3/v3_array_copy.js +0 -7
  1251. package/src/core/geom/vec3/v3_array_displace_in_direction.d.ts +0 -7
  1252. package/src/core/geom/vec3/v3_array_displace_in_direction.d.ts.map +0 -1
  1253. package/src/core/geom/vec3/v3_array_displace_in_direction.js +0 -7
  1254. package/src/core/geom/vec3/v3_array_equals.d.ts +0 -7
  1255. package/src/core/geom/vec3/v3_array_equals.d.ts.map +0 -1
  1256. package/src/core/geom/vec3/v3_array_equals.js +0 -7
  1257. package/src/core/geom/vec3/v3_array_immediate_add.d.ts +0 -7
  1258. package/src/core/geom/vec3/v3_array_immediate_add.d.ts.map +0 -1
  1259. package/src/core/geom/vec3/v3_array_immediate_add.js +0 -7
  1260. package/src/core/geom/vec3/v3_array_matrix4_rotate.d.ts +0 -7
  1261. package/src/core/geom/vec3/v3_array_matrix4_rotate.d.ts.map +0 -1
  1262. package/src/core/geom/vec3/v3_array_matrix4_rotate.js +0 -7
  1263. package/src/core/geom/vec3/v3_array_normalize.d.ts +0 -7
  1264. package/src/core/geom/vec3/v3_array_normalize.d.ts.map +0 -1
  1265. package/src/core/geom/vec3/v3_array_normalize.js +0 -7
  1266. package/src/core/geom/vec3/v3_array_scale.d.ts +0 -7
  1267. package/src/core/geom/vec3/v3_array_scale.d.ts.map +0 -1
  1268. package/src/core/geom/vec3/v3_array_scale.js +0 -7
  1269. package/src/core/geom/vec3/v3_compute_interior_angle.d.ts +0 -7
  1270. package/src/core/geom/vec3/v3_compute_interior_angle.d.ts.map +0 -1
  1271. package/src/core/geom/vec3/v3_compute_interior_angle.js +0 -7
  1272. package/src/core/geom/vec3/v3_dot_array_array.d.ts +0 -7
  1273. package/src/core/geom/vec3/v3_dot_array_array.d.ts.map +0 -1
  1274. package/src/core/geom/vec3/v3_dot_array_array.js +0 -7
  1275. package/src/core/geom/vec3/v3_matrix4_rotate.d.ts +0 -7
  1276. package/src/core/geom/vec3/v3_matrix4_rotate.d.ts.map +0 -1
  1277. package/src/core/geom/vec3/v3_matrix4_rotate.js +0 -7
  1278. package/src/core/geom/vec3/v3_multiply_scalar.d.ts +0 -7
  1279. package/src/core/geom/vec3/v3_multiply_scalar.d.ts.map +0 -1
  1280. package/src/core/geom/vec3/v3_multiply_scalar.js +0 -7
  1281. package/src/core/geom/vec3/v3_quat3_apply.d.ts +0 -7
  1282. package/src/core/geom/vec3/v3_quat3_apply.d.ts.map +0 -1
  1283. package/src/core/geom/vec3/v3_quat3_apply.js +0 -7
  1284. package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts +0 -7
  1285. package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts.map +0 -1
  1286. package/src/core/geom/vec3/v3_quat3_apply_inverse.js +0 -7
  1287. package/src/core/geom/vec3/v3_triple_cross_product.d.ts +0 -7
  1288. package/src/core/geom/vec3/v3_triple_cross_product.d.ts.map +0 -1
  1289. package/src/core/geom/vec3/v3_triple_cross_product.js +0 -7
  1290. package/src/core/geom/vec4/v4_multiply_mat4.d.ts +0 -7
  1291. package/src/core/geom/vec4/v4_multiply_mat4.d.ts.map +0 -1
  1292. package/src/core/geom/vec4/v4_multiply_mat4.js +0 -7
  1293. package/src/core/math/fabsf.d.ts +0 -6
  1294. package/src/core/math/fabsf.d.ts.map +0 -1
  1295. package/src/core/math/fabsf.js +0 -6
  1296. package/src/core/model/object/optional_equality.d.ts +0 -10
  1297. package/src/core/model/object/optional_equality.d.ts.map +0 -1
  1298. package/src/core/model/object/optional_equality.js +0 -10
  1299. package/src/core/primitives/strings/string_compute_byte_size.d.ts +0 -7
  1300. package/src/core/primitives/strings/string_compute_byte_size.d.ts.map +0 -1
  1301. package/src/core/primitives/strings/string_compute_byte_size.js +0 -8
  1302. package/src/engine/graphics/FrameThrottle.d.ts +0 -2
  1303. package/src/engine/graphics/FrameThrottle.d.ts.map +0 -1
  1304. package/src/engine/graphics/FrameThrottle.js +0 -2
  1305. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts +0 -2
  1306. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts.map +0 -1
  1307. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.js +0 -2
  1308. package/src/engine/graphics/texture/isImageBitmap.d.ts +0 -2
  1309. package/src/engine/graphics/texture/isImageBitmap.d.ts.map +0 -1
  1310. package/src/engine/graphics/texture/isImageBitmap.js +0 -2
  1311. package/src/engine/graphics3/AnimationGraphSystem3.d.ts +0 -10
  1312. package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +0 -1
  1313. package/src/engine/graphics3/AnimationGraphSystem3.js +0 -10
  1314. package/src/engine/graphics3/AnimationSystem3.d.ts +0 -10
  1315. package/src/engine/graphics3/AnimationSystem3.d.ts.map +0 -1
  1316. package/src/engine/graphics3/AnimationSystem3.js +0 -10
  1317. package/src/engine/graphics3/CameraSystem3.d.ts +0 -10
  1318. package/src/engine/graphics3/CameraSystem3.d.ts.map +0 -1
  1319. package/src/engine/graphics3/CameraSystem3.js +0 -10
  1320. package/src/engine/graphics3/DebugDrawSystem3.d.ts +0 -10
  1321. package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +0 -1
  1322. package/src/engine/graphics3/DebugDrawSystem3.js +0 -10
  1323. package/src/engine/graphics3/DecalSystem3.d.ts +0 -10
  1324. package/src/engine/graphics3/DecalSystem3.d.ts.map +0 -1
  1325. package/src/engine/graphics3/DecalSystem3.js +0 -10
  1326. package/src/engine/graphics3/FogOfWarSystem3.d.ts +0 -10
  1327. package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +0 -1
  1328. package/src/engine/graphics3/FogOfWarSystem3.js +0 -10
  1329. package/src/engine/graphics3/GraphicsEngine3.d.ts +0 -10
  1330. package/src/engine/graphics3/GraphicsEngine3.d.ts.map +0 -1
  1331. package/src/engine/graphics3/GraphicsEngine3.js +0 -10
  1332. package/src/engine/graphics3/HighlightSystem.d.ts +0 -19
  1333. package/src/engine/graphics3/HighlightSystem.d.ts.map +0 -1
  1334. package/src/engine/graphics3/HighlightSystem.js +0 -27
  1335. package/src/engine/graphics3/HighlightSystem3.d.ts +0 -13
  1336. package/src/engine/graphics3/HighlightSystem3.d.ts.map +0 -1
  1337. package/src/engine/graphics3/HighlightSystem3.js +0 -15
  1338. package/src/engine/graphics3/LightSystem3.d.ts +0 -10
  1339. package/src/engine/graphics3/LightSystem3.d.ts.map +0 -1
  1340. package/src/engine/graphics3/LightSystem3.js +0 -10
  1341. package/src/engine/graphics3/MeshSystem3.d.ts +0 -10
  1342. package/src/engine/graphics3/MeshSystem3.d.ts.map +0 -1
  1343. package/src/engine/graphics3/MeshSystem3.js +0 -10
  1344. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +0 -10
  1345. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +0 -1
  1346. package/src/engine/graphics3/ParticipatingMediaSystem3.js +0 -10
  1347. package/src/engine/graphics3/PathDisplaySystem3.d.ts +0 -10
  1348. package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +0 -1
  1349. package/src/engine/graphics3/PathDisplaySystem3.js +0 -10
  1350. package/src/engine/graphics3/PickingSystem3.d.ts +0 -10
  1351. package/src/engine/graphics3/PickingSystem3.d.ts.map +0 -1
  1352. package/src/engine/graphics3/PickingSystem3.js +0 -10
  1353. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +0 -10
  1354. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +0 -1
  1355. package/src/engine/graphics3/ShadedGeometrySystem3.js +0 -10
  1356. package/src/engine/graphics3/TerrainSystem3.d.ts +0 -10
  1357. package/src/engine/graphics3/TerrainSystem3.d.ts.map +0 -1
  1358. package/src/engine/graphics3/TerrainSystem3.js +0 -10
  1359. package/src/engine/graphics3/TooltipComponentSystem3.d.ts +0 -10
  1360. package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +0 -1
  1361. package/src/engine/graphics3/TooltipComponentSystem3.js +0 -10
  1362. package/src/engine/graphics3/Trail3DSystem3.d.ts +0 -10
  1363. package/src/engine/graphics3/Trail3DSystem3.d.ts.map +0 -1
  1364. package/src/engine/graphics3/Trail3DSystem3.js +0 -10
  1365. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +0 -10
  1366. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +0 -1
  1367. package/src/engine/graphics3/VolumetricLightMapSystem3.js +0 -10
  1368. package/src/engine/graphics3/WaterSystem3.d.ts +0 -10
  1369. package/src/engine/graphics3/WaterSystem3.d.ts.map +0 -1
  1370. package/src/engine/graphics3/WaterSystem3.js +0 -10
  1371. package/src/engine/network/convertPathToURL.d.ts +0 -2
  1372. package/src/engine/network/convertPathToURL.d.ts.map +0 -1
  1373. package/src/engine/network/convertPathToURL.js +0 -2
  1374. package/src/format/image/png/crc32.d.ts +0 -2
  1375. package/src/format/image/png/crc32.d.ts.map +0 -1
  1376. package/src/format/image/png/crc32.js +0 -7
  1377. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +0 -2
  1378. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +0 -1
  1379. package/src/shade/renderer/camera/OrbitalCameraController.js +0 -1
  1380. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.d.ts +0 -16
  1381. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.d.ts.map +0 -1
  1382. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.js +0 -17
  1383. package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.js +0 -8
  1384. package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.js +0 -1
  1385. package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.js +0 -49
  1386. package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.js +0 -90
  1387. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +0 -126
  1388. package/src/shade/renderer/light/environment/octahedral_uv_to_direction.d.ts +0 -8
  1389. package/src/shade/renderer/light/environment/octahedral_uv_to_direction.d.ts.map +0 -1
  1390. package/src/shade/renderer/light/environment/octahedral_uv_to_direction.js +0 -10
  1391. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.js +0 -62
  1392. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +0 -153
  1393. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +0 -75
  1394. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +0 -32
  1395. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +0 -184
  1396. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +0 -109
@@ -1,229 +1,1938 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { array_compute_max } from "../../../../core/collection/array/array_compute_max.js";
2
+ import { ALLOCATOR_NO_SPACE, OffsetAllocator } from "../../../../core/binary/allocator/OffsetAllocator.js";
3
+ import Signal from "../../../../core/events/signal/Signal.js";
4
+ import { BufferDescriptor } from "../../../descriptor/buffer/BufferDescriptor.js";
5
+ import { graph_read_buffer } from "../../buffer/graph_read_buffer.js";
6
+ import { GPU_DATABASE_NULL } from "../../buffer/table/GPU_DATABASE_NULL.js";
7
+ import { WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION } from "../../gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js";
8
+ import { shader_slot_stack_fill, SLOT_STACK_FILL_WORKGROUP_SIZE } from "../../gpu_primitive/slot_stack/shader_slot_stack_fill.js";
9
+ import {
10
+ shader_slot_stack_push_range,
11
+ SLOT_STACK_PUSH_RANGE_WORKGROUP_SIZE
12
+ } from "../../gpu_primitive/slot_stack/shader_slot_stack_push_range.js";
13
+ import { graph_import_buffer } from "../../shader/graph/graph_import_buffer.js";
3
14
  import { GPUTileAtlas3D } from "../../texture/atlas/GPUTileAtlas3D.js";
4
- import { SFD_BUILD_WORKGROUP_SIZE } from "./SFD_BUILD_WORKGROUP_SIZE.js";
5
- import { shader_build_sdf } from "./shader_build_sdf.js";
15
+ import {
16
+ MESH_SDF_BAKE_WORKGROUP_SIZE,
17
+ MESH_SDF_COUNTER_SLOTS,
18
+ MESH_SDF_COUNTER_WORDS,
19
+ MESH_SDF_LOG_COMPLETIONS,
20
+ MESH_SDF_LOG_HEADER_WORDS,
21
+ MESH_SDF_LOG_PLACED,
22
+ MESH_SDF_LOG_QUEUED,
23
+ MESH_SDF_LOG_RECORD_WORDS,
24
+ MESH_SDF_LOG_FREE_SLOTS,
25
+ MESH_SDF_LOG_STARVED,
26
+ MESH_SDF_LOG_TAKEN,
27
+ MESH_SDF_STAGING_VEC4S,
28
+ MESH_SDF_GROUPS_PER_BRICK,
29
+ MESH_SDF_TAKE_DISPATCH,
30
+ MESH_SDF_TAKE_PLACE_DISPATCH,
31
+ MESH_SDF_TAKE_WORDS
32
+ } from "./bake/MESH_SDF_BAKE.js";
33
+ import { shader_mesh_sdf_classify } from "./bake/shader_mesh_sdf_classify.js";
34
+ import { shader_mesh_sdf_evaluate } from "./bake/shader_mesh_sdf_evaluate.js";
35
+ import { shader_mesh_sdf_free } from "./bake/shader_mesh_sdf_free.js";
36
+ import { shader_mesh_sdf_store } from "./bake/shader_mesh_sdf_store.js";
37
+ import { shader_mesh_sdf_take } from "./bake/shader_mesh_sdf_take.js";
38
+ import { GPUMeshCardSets, MESH_CARD_CAPTURE_BUDGET_MAX } from "./cards/GPUMeshCardSets.js";
39
+ import { mesh_card_layout_words, mesh_card_placement_of } from "./cards/MESH_CARDS.js";
40
+ import { shader_mesh_cards_compact } from "./cards/shader_mesh_cards_compact.js";
41
+ import { shader_mesh_cards_histogram } from "./cards/shader_mesh_cards_histogram.js";
42
+ import { shader_mesh_cards_log } from "./cards/shader_mesh_cards_log.js";
43
+ import { shader_mesh_cards_merge } from "./cards/shader_mesh_cards_merge.js";
44
+ import { shader_mesh_cards_pages } from "./cards/shader_mesh_cards_pages.js";
45
+ import { shader_mesh_cards_split } from "./cards/shader_mesh_cards_split.js";
46
+ import { MESH_SDF_BRICK_TEXELS, MeshSDFState } from "./MESH_SDF.js";
47
+ import { MESH_SDF_SAMPLER } from "./MESH_SDF_RESOURCES.js";
48
+ import { MESH_SDF_STRUCT } from "./MESH_SDF_STRUCT.js";
49
+ import { MeshSDFLayout } from "./MeshSDFLayout.js";
6
50
 
7
51
  /**
8
- * @typedef {import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} ShadeGPUCommandContext
52
+ * @typedef {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} FrameGraph
9
53
  * @typedef {import("../GPUGeometryManager.js").GPUGeometryManager} GPUGeometryManager
10
- * @typedef {import("../bvh/GPUGeometryBVHManager.js").GPUGeometryBVHManager} GPUGeometryBVHManager
54
+ * @typedef {import("../GPUGeometryMetadata.js").GPUGeometryMetadata} GPUGeometryMetadata
55
+ * @typedef {import("../../material/resident/GPUResidentMaterialContext.js").GPUResidentMaterialContext} GPUResidentMaterialContext
11
56
  */
12
57
 
58
+ /*
59
+ What the host knows of a geometry id. `Queued` is the host's alone: the header reads None until the
60
+ bake is admitted and the indirection range is the geometry's.
61
+ */
62
+ const HOST_NONE = 0;
63
+ const HOST_QUEUED = 1;
64
+ const HOST_BAKING = 2;
65
+ const HOST_RESIDENT = 3;
66
+ const HOST_ALIAS = 4;
67
+
68
+ /*
69
+ Where a resident geometry's cards are (§6.5): waiting for placement; being placed, in a range sized
70
+ for any layout of its grid; placed, waiting to be moved into a range of their own size; placed.
71
+ */
72
+ const CARDS_NONE = 0;
73
+ const CARDS_QUEUED = 1;
74
+ const CARDS_PLACING = 2;
75
+ const CARDS_COMPACTING = 3;
76
+ const CARDS_PLACED = 4;
77
+
78
+ const HEADER_BYTES = MESH_SDF_STRUCT.size;
79
+ const HEADER_ORIGIN = MESH_SDF_STRUCT.get("origin").offset;
80
+ const HEADER_VOXEL = MESH_SDF_STRUCT.get("voxel").offset;
81
+ const HEADER_BRICKS = MESH_SDF_STRUCT.get("bricks").offset;
82
+ const HEADER_LEVEL_COUNT = MESH_SDF_STRUCT.get("level_count").offset;
83
+ const HEADER_INDIRECTION = MESH_SDF_STRUCT.get("indirection").offset;
84
+ const HEADER_CARDS = MESH_SDF_STRUCT.get("cards").offset;
85
+ const HEADER_STATE = MESH_SDF_STRUCT.get("state").offset;
86
+ const HEADER_SOURCE = MESH_SDF_STRUCT.get("source").offset;
87
+ const HEADER_GENERATION = MESH_SDF_STRUCT.get("generation").offset;
88
+ const HEADER_TWO_SIDED = MESH_SDF_STRUCT.get("two_sided").offset;
89
+
90
+ /**
91
+ * Tiles across x and y of the brick atlas: a layer is 128² texels and holds 256 bricks, and the
92
+ * atlas grows in whole layers.
93
+ * @type {number}
94
+ */
95
+ const ATLAS_SLOTS_XY = 16;
96
+
97
+ /**
98
+ * Slots the atlas starts with: one layer. It doubles each time a frame's take is held back by the
99
+ * free slots, so a scene reaches what it needs in a few doublings and never holds much past it.
100
+ * @type {number}
101
+ */
102
+ const INITIAL_SLOT_CAPACITY = ATLAS_SLOTS_XY * ATLAS_SLOTS_XY;
103
+
104
+ /**
105
+ * Readbacks of the bake's log in flight before a frame's bake is skipped. A mapping normally lands a
106
+ * frame or two after its copy; past this the device is behind, and a frame that cannot be read back
107
+ * must not complete a geometry the host would never hear of.
108
+ * @type {number}
109
+ */
110
+ const MAX_LOGS_IN_FLIGHT = 3;
111
+
112
+ /**
113
+ * Completion records the log has room for to start with; it doubles when more geometries are in
114
+ * flight at once.
115
+ * @type {number}
116
+ */
117
+ const INITIAL_LOG_CAPACITY = 64;
118
+
13
119
  /**
14
- * X*X*X voxels allocated in the atlas to represent SDF for an object
120
+ * Words the arena starts with. It doubles as allocations need, appending.
15
121
  * @type {number}
16
122
  */
17
- const DEFAULT_MESH_RESOLUTION = 50;
123
+ const INITIAL_ARENA_WORDS = 4096;
18
124
 
19
125
  /**
20
- * Tiles across x and y to start with: the atlas grows a layer of 16 slots at a time along z, 16 being
21
- * what the manager started with and its smallest growth step before it moved onto the atlas. Under
22
- * a `maxTextureDimension3D` of 2048, z is full at 40 layers (640 slots, 320 MB of `r32float`), and
23
- * the atlas then widens to 8×4 with 21 layers, moving every tile; a slot keeps its index.
126
+ * Geometries whose cards one frame places, at most: a safety net for a frame in which many complete.
127
+ * A placement's five passes cost 140 µs a geometry at the median over Sponza's fill on the RTX 4090
128
+ * (220 µs on the AMD iGPU), its split pass most of it, so ⌊1 ms / 140 µs⌋ of them fit the bake's
129
+ * basis of 1 ms a frame there.
24
130
  * @type {number}
25
131
  */
26
- const ATLAS_SLOTS_X = 4;
132
+ const MESH_CARD_PLACEMENTS_PER_FRAME = 7;
27
133
 
28
134
  /**
135
+ * Most bricks a frame's take may hand out: evaluate and store run {@link MESH_SDF_GROUPS_PER_BRICK}
136
+ * workgroups a brick in one dispatch row.
29
137
  * @type {number}
30
138
  */
31
- const ATLAS_SLOTS_Y = 4;
139
+ export const MESH_SDF_BAKE_BUDGET_MAX = Math.floor(WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION / MESH_SDF_GROUPS_PER_BRICK);
140
+
141
+ /**
142
+ * The most bricks one geometry can have under `max_bricks`: every level of a cube of that many.
143
+ *
144
+ * @param {number} max_bricks
145
+ * @returns {number}
146
+ */
147
+ function max_bricks_of_a_geometry(max_bricks) {
148
+ let total = 0;
149
+
150
+ for (let level = 0; ; level++) {
151
+ const per_axis = Math.ceil(max_bricks / 2 ** level);
152
+
153
+ total += per_axis ** 3;
154
+
155
+ if (per_axis <= 1) {
156
+ return total;
157
+ }
158
+ }
159
+ }
160
+
161
+ /**
162
+ * Grow a typed array by doubling until it holds `length`, keeping its contents.
163
+ *
164
+ * @template {Uint8Array|Uint32Array} T
165
+ * @param {T} array
166
+ * @param {number} length
167
+ * @returns {T}
168
+ */
169
+ function grow_typed(array, length) {
170
+ if (array.length >= length) {
171
+ return array;
172
+ }
173
+
174
+ let size = Math.max(1, array.length);
175
+
176
+ while (size < length) {
177
+ size *= 2;
178
+ }
179
+
180
+ const grown = new array.constructor(size);
181
+
182
+ grown.set(array);
183
+
184
+ return grown;
185
+ }
32
186
 
33
187
  /**
34
- * Per-geometry signed distance fields, one {@link DEFAULT_MESH_RESOLUTION}³ `r32float` tile each, in
35
- * a {@link GPUTileAtlas3D}.
188
+ * Per-geometry sparse signed distance fields (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §6): bricks of 8³
189
+ * `r8unorm` texels on 7³ voxels, in size classes with levels ({@link MeshSDFLayout}), baked on the
190
+ * device from the geometry's BLAS and kept by geometry id for as long as something holds the
191
+ * geometry.
192
+ *
193
+ * **Lifetime.** {@link acquire} and {@link release} count holders per geometry id. The first holder
194
+ * queues a bake; the last one going leaves the cache in place until {@link trim}, which only a user of
195
+ * the caches calls, so a cache outlives a mode that stops using it and is there when the mode comes
196
+ * back (D28). {@link forget} drops a geometry the geometry manager has let go of, whatever holds it.
197
+ * {@link alias} points a skinned clone's id at its source's cache, which readers follow.
36
198
  *
37
- * **A slot is its geometry's id.** The build shader reads `blas_lookup[slot]` and every reader
38
- * addresses a geometry's tile by that id, so slots are claimed in order and never freed: the
39
- * atlas's n-th allocation is slot n.
199
+ * **Side.** A holder says whether it draws both sides of the geometry. A field is baked two-sided
200
+ * while any of its holders does: its vote then counts no back face, so nothing is inside it (UE 5.4's
201
+ * rule, which takes the side from the material). A field whose holders' side has changed since its
202
+ * bake is baked again at the next bake, so holds moved within a frame bake nothing; a field no one
203
+ * holds keeps the side it has.
40
204
  *
41
- * **No border.** Every reader loads texels with `textureLoad` and clamps the far neighbour of its
42
- * trilinear tap to the tile's last texel (`sdf_texture_region_sample_linear_uv`), and the texture
43
- * is bound `unfilterable-float`, so no read leaves its tile. A skirt would be dead texels, and the
44
- * atlas's skirt is a wrap besides — the far side of a mesh is not the continuation of its near side.
205
+ * **The bake** ({@link graph_bake}, once a frame) admits queued geometries in request order whose
206
+ * trees are resident, while the ring has room for every brick they could queue, and runs free,
207
+ * classify, take, evaluate and store (`bake/`). At most `budget` bricks are evaluated a frame. The
208
+ * device logs each geometry it completes; the log is read back, and the host turns the header
209
+ * resident and sends {@link onBaked}. A take held back by the free slots is logged too, and the atlas
210
+ * and its slot stack double.
211
+ *
212
+ * **Cards** (§6.5): a geometry turned resident has its cards placed by the next bake that has room
213
+ * (`cards/`), in a range sized for any layout of its grid. The placement is logged with the columns
214
+ * and pages it took; on that readback the geometry gets a range of exactly that size, and the next bake
215
+ * moves the layout into it and gives the placement's range back. The layout then reaches
216
+ * {@link cards}, whose card sets — one per (geometry, material) pair — are captured after the bake,
217
+ * `capture_budget` pages a frame.
218
+ *
219
+ * **Readers** bind {@link headers}, {@link indirection}, {@link texture} and {@link MESH_SDF_SAMPLER}
220
+ * (see {@link write_bindings}) and sample through `mesh_sdf_sample`, which only a resident header
221
+ * should be given to.
222
+ *
223
+ * Device storage is made on first use: a renderer that never asks for a cache allocates nothing.
45
224
  */
46
225
  export class GPUGeometrySDFManager {
47
226
 
48
227
  /**
49
- * @type {GPUTileAtlas3D}
228
+ * @type {GPUDevice}
229
+ */
230
+ #device;
231
+
232
+ /**
233
+ * @type {GPUGeometryManager}
234
+ */
235
+ #geometries;
236
+
237
+ /**
238
+ * Sent with a geometry id when its cache turns resident, on the frame its completion is read back.
239
+ * @type {Signal<number>}
240
+ */
241
+ onBaked = new Signal();
242
+
243
+ #voxel_size = 0.125;
244
+ #max_bricks = 18;
245
+
246
+ // ---- per geometry id ----
247
+
248
+ #references = new Uint32Array(64);
249
+ /** Holders drawing both sides. */
250
+ #two_sided_references = new Uint32Array(64);
251
+ /** 1 when the bake under way, or the cache, is two-sided: what its header says. */
252
+ #two_sided = new Uint8Array(64);
253
+ #state = new Uint8Array(64);
254
+ #generation = new Uint32Array(64);
255
+ #brick_count = new Uint32Array(64);
256
+
257
+ #card_state = new Uint8Array(64);
258
+ /** Words of the range the geometry's cards are placed in. */
259
+ #placement_words = new Uint32Array(64);
260
+ /** Where the placement's scratch starts in it. */
261
+ #placement_scratch = new Uint32Array(64);
262
+ /** Columns over the six directions of the geometry's level-0 grid: the histogram's threads. */
263
+ #placement_columns = new Uint32Array(64);
264
+ /** Pages the placed layout has. */
265
+ #card_pages = new Uint32Array(64);
266
+ /** Words the placed layout keeps. */
267
+ #card_words = new Uint32Array(64);
268
+
269
+ /**
270
+ * The range each geometry's cards are being placed in.
271
+ * @type {(import("../../../../core/binary/allocator/OffsetAllocator.js").Allocation|null)[]}
50
272
  */
51
- #atlas;
273
+ #card_scratch = [];
52
274
 
53
275
  /**
54
- * The atlas's grid in tiles, as the shaders take it; refreshed on read.
276
+ * The range each geometry's placed layout keeps.
277
+ * @type {(import("../../../../core/binary/allocator/OffsetAllocator.js").Allocation|null)[]}
278
+ */
279
+ #card_ranges = [];
280
+
281
+ /**
282
+ * Resident geometries whose cards wait for placement, in the order they turned resident.
55
283
  * @type {number[]}
56
284
  */
57
- #atlas_resolution_in_tiles = [0, 0, 0];
285
+ #place_queue = [];
286
+
287
+ /**
288
+ * Geometries whose placed layout waits to be moved into its own range.
289
+ * @type {number[]}
290
+ */
291
+ #compact_queue = [];
292
+
293
+ /**
294
+ * The (geometry, material) pairs' captures of the layouts.
295
+ * @type {GPUMeshCardSets}
296
+ */
297
+ #cards;
298
+
299
+ /**
300
+ * @type {(import("../../../../core/binary/allocator/OffsetAllocator.js").Allocation|null)[]}
301
+ */
302
+ #ranges = [];
303
+
304
+ /**
305
+ * @type {(GPUGeometryMetadata|undefined)[]}
306
+ */
307
+ #records = [];
308
+
309
+ /**
310
+ * Ids waiting for their bake, in request order. An id dropped while queued stays until the next
311
+ * admission walks past it.
312
+ * @type {number[]}
313
+ */
314
+ #queue = [];
315
+
316
+ /**
317
+ * Ids whose last holder went since the last {@link trim}.
318
+ * @type {number[]}
319
+ */
320
+ #unreferenced = [];
321
+
322
+ /**
323
+ * Ids whose holders changed since the last bake, which may draw a side other than their field's.
324
+ * @type {number[]}
325
+ */
326
+ #holders_changed = [];
327
+
328
+ /**
329
+ * Indirection ranges given back since the last bake, as offset then count, for the free pass.
330
+ * @type {number[]}
331
+ */
332
+ #freed = [];
333
+
334
+ /**
335
+ * The allocations of {@link #freed}, held from the allocator until their free pass is recorded.
336
+ * @type {import("../../../../core/binary/allocator/OffsetAllocator.js").Allocation[]}
337
+ */
338
+ #freeing = [];
339
+
340
+ /**
341
+ * Allocations whose last reader was recorded in the last bake, given back to the allocator at the
342
+ * start of the next. A range handed out in the frame that reads it would take the new owner's host
343
+ * writes, which land before the frame's commands run.
344
+ * @type {import("../../../../core/binary/allocator/OffsetAllocator.js").Allocation[]}
345
+ */
346
+ #release_next = [];
347
+
348
+ /**
349
+ * Geometries admitted and not yet complete.
350
+ * @type {number}
351
+ */
352
+ #baking = 0;
353
+
354
+ #layout = new MeshSDFLayout();
355
+
356
+ #header_scratch = new DataView(new ArrayBuffer(HEADER_BYTES));
357
+ #word_scratch = new Uint32Array(4);
358
+
359
+ // ---- device storage, made by #ensure_device ----
360
+
361
+ /** @type {GPUBuffer|null} */
362
+ #headers = null;
363
+ #header_capacity = 0;
364
+
365
+ /** @type {GPUBuffer|null} */
366
+ #indirection = null;
367
+ /** @type {OffsetAllocator|null} */
368
+ #indirection_allocator = null;
369
+ #indirection_capacity = 0;
370
+
371
+ /** @type {GPUTileAtlas3D|null} */
372
+ #atlas = null;
373
+ /** @type {GPUBuffer|null} */
374
+ #slots = null;
375
+ #slot_capacity = 0;
376
+ #fill_pending = false;
377
+
378
+ /**
379
+ * Ranges of slots the next bake pushes, as first then count: what the atlas gained.
380
+ * @type {number[]}
381
+ */
382
+ #pushes = [];
383
+
384
+ /** @type {GPUBuffer|null} */
385
+ #take = null;
386
+
387
+ /**
388
+ * The frame's words in the arena: its log, room for {@link #log_capacity} completions, then its
389
+ * tallies, a word for each of {@link #staging_bricks} bricks taken.
390
+ * @type {import("../../../../core/binary/allocator/OffsetAllocator.js").Allocation|null}
391
+ */
392
+ #frame_range = null;
393
+ #log_capacity = 0;
394
+
395
+ /**
396
+ * The ring's entries, then the staging of {@link #staging_bricks} bricks.
397
+ * @type {GPUBuffer|null}
398
+ */
399
+ #ring = null;
400
+ #ring_capacity = 0;
401
+ #staging_bricks = 0;
402
+
403
+ /** @type {GPUBuffer|null} */
404
+ #classify_ranges = null;
405
+ #classify_ranges_capacity = 0;
406
+ #classify_scratch = new Uint32Array(64);
407
+
408
+ /** @type {GPUBuffer|null} */
409
+ #free_ranges = null;
410
+ #free_ranges_capacity = 0;
411
+ #free_scratch = new Uint32Array(64);
412
+
413
+ // ---- the frame's bake, as graph_bake records it for #execute_bake ----
414
+
415
+ #frame_classify_runs = 0;
416
+ #frame_classify_bricks = 0;
417
+ #frame_free_runs = 0;
418
+ #frame_free_entries = 0;
419
+ #frame_budget = 0;
420
+ #frame_log_capacity = 1;
421
+ #frame_log_offset = 0;
422
+ #frame_log_bytes = 0;
423
+ #frame_tally_offset = 0;
424
+ #frame_bytes = 0;
425
+
426
+ #log_data = { arena: -1 };
427
+
428
+ /** The frame's placements, as geometry, the range's first word, and where its scratch starts. */
429
+ #frame_placements = [];
430
+ /** The frame's layout moves, as source, destination and words. */
431
+ #frame_compactions = [];
432
+
433
+ #histogram_settings = { geometry: 0, columns: 0 };
434
+ #split_settings = { geometry: 0 };
435
+ #merge_settings = { geometry: 0, dispatch: MESH_SDF_TAKE_PLACE_DISPATCH };
436
+ #pages_settings = { geometry: 0 };
437
+ #place_log_settings = { geometry: 0, log_offset: 0, log_capacity: 0 };
438
+ #compact_settings = { source: 0, destination: 0, count: 0, groups_x: 0 };
439
+
440
+ #blas_bindings = { blas_lookup: null, blas_data: null, geometries: null, meshlet_metadata: null, meshlet_data: null };
441
+
442
+ #classify_settings = { range_count: 0, brick_count: 0, groups_x: 0, ring_capacity: 0, log_offset: 0, log_capacity: 0 };
443
+ #free_settings = { range_count: 0, entry_count: 0, groups_x: 0 };
444
+ #take_settings = { budget: 0, log_offset: 0 };
445
+ #evaluate_settings = { ring_capacity: 0, slot_capacity: 0, log_offset: 0, log_capacity: 0, tally_offset: 0 };
446
+ #store_settings = { ring_capacity: 0 };
447
+ #push_settings = { first: 0, count: 0, counter: MESH_SDF_COUNTER_SLOTS };
448
+ #bindings = {};
449
+
450
+ // ---- what the log has told ----
451
+
452
+ #frame = 0;
453
+ #logs_in_flight = 0;
454
+ #skipped_frames = 0;
455
+
456
+ /** Bricks admitted since the device storage was made: an upper bound on what the ring has had. */
457
+ #admitted_total = 0;
458
+ #read_frame = -1;
459
+ #read_queued = 0;
460
+ #read_admitted = 0;
461
+ /** Bumped when the ring is emptied by hand, which voids every log recorded before it. */
462
+ #ring_epoch = 0;
463
+ #grown_frame = -1;
464
+
465
+ #coarsened_count = 0;
466
+ #resident_count = 0;
467
+ #starved_frames = 0;
468
+ #bricks_evaluated = 0;
469
+ #free_slots = 0;
470
+
471
+ #destroyed = false;
58
472
 
59
473
  /**
60
- *
61
474
  * @param {GPUDevice} device
475
+ * @param {GPUGeometryManager} geometries whose ids the caches are kept by, and whose trees the bake reads
62
476
  */
63
- constructor(device) {
477
+ constructor(device, geometries) {
64
478
  assert.defined(device, 'device');
479
+ assert.defined(geometries, 'geometries');
65
480
 
66
- this.#atlas = new GPUTileAtlas3D({
67
- device,
68
- formats: ["r32float"],
69
- // a cube: the build and every reader take one resolution for all three axes
70
- content_size: [DEFAULT_MESH_RESOLUTION, DEFAULT_MESH_RESOLUTION, DEFAULT_MESH_RESOLUTION],
71
- border: 0,
72
- slots_x: ATLAS_SLOTS_X,
73
- slots_y: ATLAS_SLOTS_Y,
74
- capacity: ATLAS_SLOTS_X * ATLAS_SLOTS_Y,
75
- // loaded by the readers, stored into by shader_build_sdf
76
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING,
77
- label: "GPUGeometrySDFManager/atlas",
78
- });
481
+ this.#device = device;
482
+ this.#geometries = geometries;
483
+ this.#cards = new GPUMeshCardSets(device);
79
484
  }
80
485
 
81
486
  /**
82
- * Allocate slots through {@link ensureCapacity} and {@link build_slots}, never on the atlas
83
- * directly: a slot handed out of order would no longer be its geometry's id.
84
- * @return {GPUTileAtlas3D}
487
+ * The card sets: one capture of a geometry's layout per (geometry, material) pair, which their
488
+ * user acquires and releases. Layouts reach it as they are placed.
489
+ * @returns {GPUMeshCardSets}
85
490
  */
86
- get atlas() {
87
- return this.#atlas;
491
+ get cards() {
492
+ return this.#cards;
88
493
  }
89
494
 
90
495
  /**
91
- * Individual SDF textures are written here. Replaced when the atlas grows, so take a view after
92
- * {@link build_slots}, never across it.
93
- * @return {import("../../texture/GPUTextureContext.js").GPUTextureContext}
496
+ * Level 0's voxel, in the geometry's local units, and the bricks per axis past which it grows. A
497
+ * change rebakes every cache.
498
+ *
499
+ * @param {number} voxel_size
500
+ * @param {number} max_bricks even, at least 2
94
501
  */
95
- get texture() {
96
- return this.#atlas.texture;
502
+ configure(voxel_size, max_bricks) {
503
+ assert.isFinite(voxel_size, 'voxel_size');
504
+ assert.greaterThan(voxel_size, 0, 'voxel_size');
505
+ assert.isPositiveInteger(max_bricks, 'max_bricks');
506
+ assert.equal(max_bricks % 2, 0, 'max_bricks must be even');
507
+
508
+ if (voxel_size === this.#voxel_size && max_bricks === this.#max_bricks) {
509
+ return;
510
+ }
511
+
512
+ this.#voxel_size = voxel_size;
513
+ this.#max_bricks = max_bricks;
514
+
515
+ const state = this.#state;
516
+
517
+ for (let id = 0; id < state.length; id++) {
518
+ const s = state[id];
519
+
520
+ if (s === HOST_BAKING || s === HOST_RESIDENT) {
521
+ this.#drop(id);
522
+ }
523
+
524
+ if (this.#references[id] > 0 && state[id] === HOST_NONE) {
525
+ state[id] = HOST_QUEUED;
526
+ this.#queue.push(id);
527
+ }
528
+ }
529
+
530
+ if (this.#ring !== null) {
531
+ // every bake was cancelled, so the ring holds stale bricks alone, and a ring sized for
532
+ // the new cap may be needed
533
+ this.#reset_ring();
534
+ }
97
535
  }
98
536
 
99
537
  /**
100
- * Resolution in SDF texels for a single geometry along each axis — the tile is a cube — which is
101
- * also the stride between tiles: the atlas holds them with no border.
102
- * @return {number}
538
+ * @returns {number}
103
539
  */
104
- get tile_resolution() {
105
- return DEFAULT_MESH_RESOLUTION;
540
+ get voxel_size() {
541
+ return this.#voxel_size;
106
542
  }
107
543
 
108
544
  /**
109
- * Tiles along x, y and z — x and y are what `tile_atlas_slot_origin` takes to place a slot. Read it
110
- * after {@link build_slots}: when the atlas widens, x or y changes and every tile moves.
111
- * @return {number[]}
545
+ * @returns {number}
112
546
  */
113
- get atlas_resolution_in_tiles() {
114
- const atlas = this.#atlas;
115
- const out = this.#atlas_resolution_in_tiles;
116
-
117
- out[0] = atlas.slots_x;
118
- out[1] = atlas.slots_y;
119
- out[2] = atlas.slots_z;
120
-
121
- return out;
547
+ get max_bricks() {
548
+ return this.#max_bricks;
122
549
  }
123
550
 
124
551
  /**
125
- * Slots the texture holds now.
126
- * @return {number}
552
+ * One more holder of a geometry's cache; the first queues its bake.
553
+ *
554
+ * @param {GPUGeometryMetadata} record
555
+ * @param {boolean} two_sided whether the holder draws both sides of the geometry
127
556
  */
128
- get capacity() {
129
- return this.#atlas.capacity;
557
+ acquire(record, two_sided) {
558
+ assert.defined(record, 'record');
559
+ assert.isBoolean(two_sided, 'two_sided');
560
+
561
+ const id = record.index;
562
+
563
+ this.#ensure_id(id);
564
+
565
+ this.#records[id] = record;
566
+
567
+ if (two_sided) {
568
+ this.#two_sided_references[id]++;
569
+ }
570
+
571
+ if (++this.#references[id] === 1 && this.#state[id] === HOST_NONE) {
572
+ this.#state[id] = HOST_QUEUED;
573
+ this.#queue.push(id);
574
+ }
575
+
576
+ this.#holders_changed.push(id);
130
577
  }
131
578
 
132
579
  /**
133
- * Claim every slot below `min_capacity`, growing the atlas as it fills.
580
+ * One holder fewer. The cache stays until {@link trim}.
134
581
  *
135
- * @param {number} min_capacity
582
+ * @param {GPUGeometryMetadata} record
583
+ * @param {boolean} two_sided as the holder acquired it
136
584
  */
137
- ensureCapacity(min_capacity) {
138
- assert.isNonNegativeInteger(min_capacity, 'min_capacity');
585
+ release(record, two_sided) {
586
+ assert.defined(record, 'record');
587
+ assert.isBoolean(two_sided, 'two_sided');
139
588
 
140
- const atlas = this.#atlas;
589
+ const id = record.index;
590
+
591
+ assert.greaterThan(this.#references[id] ?? 0, 0, `geometry ${id} released more often than acquired`);
141
592
 
142
- while (atlas.live_count < min_capacity) {
143
- const slot = atlas.allocate();
593
+ if (two_sided) {
594
+ assert.greaterThan(this.#two_sided_references[id], 0, `geometry ${id} released two-sided more often than acquired so`);
595
+
596
+ this.#two_sided_references[id]--;
597
+ }
144
598
 
145
- assert.equal(slot, atlas.live_count - 1, `slot ${slot} came out of order; a geometry SDF slot is its geometry's id, so the atlas must hand them out in sequence`);
599
+ if (--this.#references[id] === 0) {
600
+ this.#unreferenced.push(id);
146
601
  }
602
+
603
+ this.#holders_changed.push(id);
147
604
  }
148
605
 
149
- destroy() {
150
- this.#atlas.destroy();
606
+ /**
607
+ * Drop the cache of every geometry whose last holder went since the last trim, and is still gone.
608
+ */
609
+ trim() {
610
+ const unreferenced = this.#unreferenced;
611
+
612
+ for (let i = 0; i < unreferenced.length; i++) {
613
+ const id = unreferenced[i];
614
+
615
+ if (this.#references[id] === 0 && this.#state[id] !== HOST_ALIAS) {
616
+ this.#drop(id);
617
+ }
618
+ }
619
+
620
+ unreferenced.length = 0;
151
621
  }
152
622
 
623
+ /**
624
+ * The geometry manager has let a geometry go: its cache, or its alias, goes now, whatever holds
625
+ * it.
626
+ *
627
+ * @param {GPUGeometryMetadata} record
628
+ */
629
+ forget(record) {
630
+ assert.defined(record, 'record');
631
+
632
+ const id = record.index;
633
+
634
+ if (id >= this.#state.length) {
635
+ return;
636
+ }
637
+
638
+ this.#references[id] = 0;
639
+ this.#two_sided_references[id] = 0;
640
+ this.#drop(id);
641
+ this.#records[id] = undefined;
642
+ }
153
643
 
154
644
  /**
645
+ * Readers of `clone` read `source`'s cache: the hook for a skinned clone, whose unskinned shape is
646
+ * its source's (§6.3). Written once; it follows the source through its bake.
155
647
  *
156
- * @param {ShadeGPUCommandContext} command_ctx
157
- * @param {number[]} slot_indices
158
- * @param {GPUGeometryManager} geometries
648
+ * @param {GPUGeometryMetadata} clone
649
+ * @param {GPUGeometryMetadata} source
159
650
  */
160
- build_slots(
161
- command_ctx,
162
- slot_indices,
163
- geometries
164
- ) {
165
- if (slot_indices.length <= 0) {
166
- // nothing to do
651
+ alias(clone, source) {
652
+ assert.defined(clone, 'clone');
653
+ assert.defined(source, 'source');
654
+ assert.notEqual(clone.index, source.index, 'a geometry cannot alias itself');
655
+
656
+ const id = clone.index;
657
+
658
+ this.#ensure_id(Math.max(id, source.index));
659
+
660
+ if (this.#state[id] === HOST_ALIAS) {
167
661
  return;
168
662
  }
169
663
 
170
- // claim every slot before the first dispatch: a grow replaces the texture, and submits its
171
- // copy ahead of the command stream the dispatches are recorded into
172
- const max_slot = array_compute_max(slot_indices);
173
- this.ensureCapacity(max_slot + 1);
174
-
175
- // TODO spread work over multiple frames
176
-
177
- const slot_resolution = this.tile_resolution;
178
- const atlas_resolution_in_slots = this.atlas_resolution_in_tiles;
179
-
180
- for (let i = 0; i < slot_indices.length; i++) {
181
- const slot_index = slot_indices[i];
182
-
183
- const buffer_settings = {
184
- slot_index,
185
- slot_resolution,
186
- atlas_resolution_in_slots,
187
- };
188
-
189
-
190
- const wgx = Math.ceil(slot_resolution / SFD_BUILD_WORKGROUP_SIZE[0]);
191
- const wgy = Math.ceil(slot_resolution / SFD_BUILD_WORKGROUP_SIZE[1]);
192
- const wgz = Math.ceil(slot_resolution / SFD_BUILD_WORKGROUP_SIZE[2]);
193
-
194
- /**
195
- *
196
- * @type {GPUGeometryBVHManager}
197
- */
198
- const blas = geometries.blas;
199
-
200
- shader_build_sdf.dispatch({
201
- encoder: command_ctx,
202
- bindings: {
203
- settings: buffer_settings,
204
- blas_lookup: blas.buffer_metadata,
205
- blas_data: blas.buffer_data,
206
- geometries: geometries.buffer_metadata,
207
- // the triangles the query reads, through their meshlets
208
- meshlet_metadata: geometries.meshlets.buffer_metadata,
209
- meshlet_data: geometries.meshlets.buffer_data,
210
- output_texture: this.#atlas.texture.obtainView(),
211
- },
212
- group_count_x: wgx,
213
- group_count_y: wgy,
214
- group_count_z: wgz,
215
- });
664
+ this.#drop(id);
665
+
666
+ this.#state[id] = HOST_ALIAS;
667
+
668
+ if (this.#headers !== null) {
669
+ this.#ensure_headers(id + 1);
670
+ this.#write_header_alias(id, source.index);
216
671
  }
217
672
 
673
+ this.#records[id] = clone;
674
+ this.#aliases.set(id, source.index);
218
675
  }
219
676
 
220
677
  /**
221
- * Downloads raw data for a given slot. Mainly for debugging.
222
- * @param {number} slot
223
- * @return {Promise<Float32Array>}
678
+ * Aliases by clone id, for the headers written when device storage is made.
679
+ * @type {Map<number, number>}
224
680
  */
225
- async download_slot(slot) {
226
- const atlas = this.#atlas;
227
- return /** @type {Promise<Float32Array>} */ (atlas.texture.download_region(atlas.slot_origin(slot, [0, 0, 0]), atlas.tile_size));
681
+ #aliases = new Map();
682
+
683
+ /**
684
+ * What a reader finds in the geometry's header.
685
+ *
686
+ * @param {GPUGeometryMetadata} record
687
+ * @returns {MeshSDFState}
688
+ */
689
+ state_of(record) {
690
+ switch (this.#state[record.index] ?? HOST_NONE) {
691
+ case HOST_BAKING:
692
+ return MeshSDFState.Baking;
693
+ case HOST_RESIDENT:
694
+ return MeshSDFState.Resident;
695
+ case HOST_ALIAS:
696
+ return MeshSDFState.Alias;
697
+ default:
698
+ return MeshSDFState.None;
699
+ }
700
+ }
701
+
702
+ /**
703
+ * Geometries whose layout was coarsened by the cap, of those baked: coarser than asked.
704
+ * @returns {number}
705
+ */
706
+ get coarsened_count() {
707
+ return this.#coarsened_count;
708
+ }
709
+
710
+ /**
711
+ * @returns {number}
712
+ */
713
+ get resident_count() {
714
+ return this.#resident_count;
715
+ }
716
+
717
+ /**
718
+ * Geometries admitted and not yet complete.
719
+ * @returns {number}
720
+ */
721
+ get baking_count() {
722
+ return this.#baking;
723
+ }
724
+
725
+ /**
726
+ * Geometries requested and not yet admitted.
727
+ * @returns {number}
728
+ */
729
+ get queued_count() {
730
+ let count = 0;
731
+
732
+ for (const id of this.#queue) {
733
+ if (this.#state[id] === HOST_QUEUED) {
734
+ count++;
735
+ }
736
+ }
737
+
738
+ return count;
739
+ }
740
+
741
+ /**
742
+ * Frames whose take the free slots held back, as read back.
743
+ * @returns {number}
744
+ */
745
+ get starved_frames() {
746
+ return this.#starved_frames;
747
+ }
748
+
749
+ /**
750
+ * Bricks evaluate has been handed, as read back: classify's survivors, stale ones included.
751
+ * @returns {number}
752
+ */
753
+ get bricks_evaluated() {
754
+ return this.#bricks_evaluated;
755
+ }
756
+
757
+ /**
758
+ * Free slots of the atlas before the last take read back.
759
+ * @returns {number}
760
+ */
761
+ get free_slots() {
762
+ return this.#free_slots;
763
+ }
764
+
765
+ /**
766
+ * Frames whose bake was skipped because its log could not be read back.
767
+ * @returns {number}
768
+ */
769
+ get skipped_frames() {
770
+ return this.#skipped_frames;
771
+ }
772
+
773
+ /**
774
+ * Slots the brick atlas holds.
775
+ * @returns {number}
776
+ */
777
+ get slot_capacity() {
778
+ return this.#slot_capacity;
779
+ }
780
+
781
+ /**
782
+ * Every geometry's header, by geometry id. Replaced when it grows; take it each frame.
783
+ * @returns {GPUBuffer}
784
+ */
785
+ get headers() {
786
+ this.#ensure_device();
787
+
788
+ return this.#headers;
789
+ }
790
+
791
+ /**
792
+ * Every brick's entry: a slot or EMPTY. Replaced when it grows; take it each frame.
793
+ * @returns {GPUBuffer}
794
+ */
795
+ get indirection() {
796
+ this.#ensure_device();
797
+
798
+ return this.#indirection;
799
+ }
800
+
801
+ /**
802
+ * The brick atlas, `r8unorm`. Replaced when it grows; take a view each frame.
803
+ * @returns {import("../../texture/GPUTextureContext.js").GPUTextureContext}
804
+ */
805
+ get texture() {
806
+ this.#ensure_device();
807
+
808
+ return this.#atlas.texture;
809
+ }
810
+
811
+ /**
812
+ * Put what `mesh_sdf_sample` and `mesh_sdf_header` read into a reader's bindings, under the names
813
+ * they take.
814
+ *
815
+ * @param {Object} bindings
816
+ * @returns {Object} bindings
817
+ */
818
+ write_bindings(bindings) {
819
+ bindings.mesh_sdf_headers = this.headers;
820
+ bindings.mesh_sdf_indirection = this.indirection;
821
+ bindings.mesh_sdf_atlas = this.texture.obtainView();
822
+ bindings.mesh_sdf_sampler = MESH_SDF_SAMPLER;
823
+
824
+ return bindings;
825
+ }
826
+
827
+ /**
828
+ * @returns {number} bytes
829
+ */
830
+ get gpu_memory_usage() {
831
+ let bytes = 0;
832
+
833
+ for (const buffer of [this.#headers, this.#indirection, this.#slots, this.#take, this.#ring, this.#classify_ranges, this.#free_ranges]) {
834
+ if (buffer !== null) {
835
+ bytes += buffer.size;
836
+ }
837
+ }
838
+
839
+ if (this.#atlas !== null) {
840
+ bytes += this.#atlas.capacity * MESH_SDF_BRICK_TEXELS ** 3;
841
+ }
842
+
843
+ return bytes + this.#cards.gpu_memory_usage;
844
+ }
845
+
846
+ /**
847
+ * Record the frame's bake: queue again what is held for the other side than it was baked for, free
848
+ * what was given back, classify what is admitted, take, evaluate and store up to `budget` bricks,
849
+ * place the cards of what turned resident and move placed layouts into their ranges. Then, with a
850
+ * `capture_budget`, capture up to that many pages of card sets. Records nothing when there is
851
+ * nothing to do.
852
+ *
853
+ * @param {Object} options
854
+ * @param {FrameGraph} options.graph
855
+ * @param {number} options.budget bricks evaluated at most, `mesh_sdf_bake_budget`
856
+ * @param {number} [options.capture_budget] card pages captured at most, `card_capture_budget`; 0
857
+ * captures nothing
858
+ * @param {GPUResidentMaterialContext|null} [options.materials] what the capture shades with, as it
859
+ * stands this frame; needed with a `capture_budget`
860
+ */
861
+ graph_bake({ graph, budget, capture_budget = 0, materials = null }) {
862
+ assert.defined(graph, 'graph');
863
+ assert.isPositiveInteger(budget, 'budget');
864
+ assert.lessThanOrEqual(budget, MESH_SDF_BAKE_BUDGET_MAX, 'budget');
865
+ assert.isNonNegativeInteger(capture_budget, 'capture_budget');
866
+ assert.lessThanOrEqual(capture_budget, MESH_CARD_CAPTURE_BUDGET_MAX, 'capture_budget');
867
+
868
+ this.#frame++;
869
+
870
+ this.#follow_sides();
871
+
872
+ // the last bake's commands were submitted before this call: what they read may be handed out
873
+ const release_next = this.#release_next;
874
+
875
+ for (let i = 0; i < release_next.length; i++) {
876
+ this.#indirection_allocator.free(release_next[i]);
877
+ }
878
+
879
+ release_next.length = 0;
880
+
881
+ const queued_bound = this.#read_queued + (this.#admitted_total - this.#read_admitted);
882
+
883
+ const has_work = this.#queue.length > 0
884
+ || queued_bound > 0
885
+ || this.#freed.length > 0
886
+ || this.#pushes.length > 0
887
+ || this.#fill_pending
888
+ || this.#place_queue.length > 0
889
+ || this.#compact_queue.length > 0;
890
+
891
+ let arena = -1;
892
+
893
+ if (has_work) {
894
+ if (this.#logs_in_flight >= MAX_LOGS_IN_FLIGHT) {
895
+ this.#skipped_frames++;
896
+ } else {
897
+ arena = this.#record_bake(graph, budget, queued_bound);
898
+ }
899
+ }
900
+
901
+ if (capture_budget > 0 && this.#cards.has_pending_capture) {
902
+ assert.notNull(materials, 'materials');
903
+
904
+ this.#ensure_device();
905
+
906
+ if (arena === -1) {
907
+ arena = graph_import_buffer(graph, this.#indirection, "mesh_sdf_indirection");
908
+ }
909
+
910
+ const geometries = this.#geometries;
911
+ const blas = this.#blas_bindings;
912
+
913
+ blas.blas_lookup = geometries.blas.buffer_metadata;
914
+ blas.blas_data = geometries.blas.buffer_data;
915
+ blas.geometries = geometries.buffer_metadata;
916
+ blas.meshlet_metadata = geometries.meshlets.buffer_metadata;
917
+ blas.meshlet_data = geometries.meshlets.buffer_data;
918
+
919
+ this.#cards.graph_capture({ graph, budget: capture_budget, arena, headers: this.#headers, materials, blas });
920
+ }
921
+ }
922
+
923
+ /**
924
+ * @param {FrameGraph} graph
925
+ * @param {number} budget
926
+ * @param {number} queued_bound
927
+ * @returns {number} graph handle of the arena as the bake leaves it
928
+ */
929
+ #record_bake(graph, budget, queued_bound) {
930
+ this.#ensure_device();
931
+ this.#ensure_headers(this.#geometries.__last_geometry_index);
932
+
933
+ this.#admit(queued_bound);
934
+ this.#upload_free_ranges();
935
+ this.#take_placements();
936
+ this.#take_compactions();
937
+
938
+ // room for a completion of every geometry in flight and a record of every placement, and a tally
939
+ // and staging for every brick the budget takes
940
+ this.#ensure_frame(Math.max(1, this.#baking + this.#frame_placements.length / 3), budget);
941
+
942
+ const log_words = MESH_SDF_LOG_HEADER_WORDS + MESH_SDF_LOG_RECORD_WORDS * this.#log_capacity;
943
+
944
+ this.#frame_budget = budget;
945
+ this.#frame_log_capacity = this.#log_capacity;
946
+ this.#frame_log_offset = this.#frame_range.offset;
947
+ this.#frame_log_bytes = 4 * log_words;
948
+ this.#frame_tally_offset = this.#frame_range.offset + log_words;
949
+ this.#frame_bytes = 4 * (log_words + this.#staging_bricks);
950
+
951
+ const data = this.#log_data;
952
+
953
+ const pass = graph.add("Mesh SDF Bake", data, this.#execute);
954
+
955
+ // the arena as it stands after every growth of the frame: the log is read back out of it
956
+ data.arena = pass.write(graph_import_buffer(graph, this.#indirection, "mesh_sdf_indirection"));
957
+
958
+ pass.make_side_effect();
959
+
960
+ const frame = this.#frame;
961
+ const admitted = this.#admitted_total;
962
+ const epoch = this.#ring_epoch;
963
+ const capacity = this.#frame_log_capacity;
964
+
965
+ this.#logs_in_flight++;
966
+
967
+ graph_read_buffer({ graph, buffer: data.arena, offset: 4 * this.#frame_log_offset, size: this.#frame_log_bytes })
968
+ .then(reference => {
969
+ try {
970
+ if (!this.#destroyed) {
971
+ this.#apply_log(new Uint32Array(reference.getValue()), frame, admitted, epoch, capacity);
972
+ }
973
+ } finally {
974
+ reference.release();
975
+ }
976
+ })
977
+ .catch(error => {
978
+ if (!this.#destroyed) {
979
+ // a lost log costs its completions until the geometry is baked again; say so
980
+ console.warn('GPUGeometrySDFManager: bake log readback failed', error);
981
+ }
982
+ })
983
+ .finally(() => {
984
+ this.#logs_in_flight--;
985
+ });
986
+
987
+ return data.arena;
988
+ }
989
+
990
+ /**
991
+ * Drop and queue again each field whose holders draw another side than it was baked for: two-sided
992
+ * while any of them draws both sides. A field no one holds keeps its side.
993
+ */
994
+ #follow_sides() {
995
+ const changed = this.#holders_changed;
996
+
997
+ for (let i = 0; i < changed.length; i++) {
998
+ const id = changed[i];
999
+ const state = this.#state[id];
1000
+
1001
+ if (this.#references[id] === 0 || (state !== HOST_BAKING && state !== HOST_RESIDENT)) {
1002
+ // a queued field takes its holders' side when admitted
1003
+ continue;
1004
+ }
1005
+
1006
+ if ((this.#two_sided_references[id] > 0) === (this.#two_sided[id] === 1)) {
1007
+ continue;
1008
+ }
1009
+
1010
+ this.#drop(id);
1011
+
1012
+ this.#state[id] = HOST_QUEUED;
1013
+ this.#queue.push(id);
1014
+ }
1015
+
1016
+ changed.length = 0;
1017
+ }
1018
+
1019
+ /**
1020
+ * Give the frame's placements their ranges, in the order the geometries turned resident.
1021
+ */
1022
+ #take_placements() {
1023
+ const queue = this.#place_queue;
1024
+ const placements = this.#frame_placements;
1025
+
1026
+ placements.length = 0;
1027
+
1028
+ let taken = 0;
1029
+
1030
+ while (taken < queue.length && placements.length < 3 * MESH_CARD_PLACEMENTS_PER_FRAME) {
1031
+ const id = queue[taken++];
1032
+
1033
+ if (this.#state[id] !== HOST_RESIDENT || this.#card_state[id] !== CARDS_QUEUED) {
1034
+ // dropped since it was queued
1035
+ continue;
1036
+ }
1037
+
1038
+ const words = this.#placement_words[id];
1039
+
1040
+ this.#ensure_indirection(words);
1041
+
1042
+ const range = this.#indirection_allocator.allocate(words);
1043
+
1044
+ assert.notEqual(range.offset, ALLOCATOR_NO_SPACE, 'card placement allocation after growth');
1045
+
1046
+ this.#card_scratch[id] = range;
1047
+ this.#card_state[id] = CARDS_PLACING;
1048
+ this.#write_header_cards(id, range.offset);
1049
+
1050
+ placements.push(id, range.offset, this.#placement_scratch[id]);
1051
+ }
1052
+
1053
+ queue.copyWithin(0, taken);
1054
+ queue.length -= taken;
1055
+ }
1056
+
1057
+ /**
1058
+ * Move the layouts whose placement has been read back into their own ranges, this frame; their
1059
+ * card sets can be captured from here.
1060
+ */
1061
+ #take_compactions() {
1062
+ const queue = this.#compact_queue;
1063
+ const moves = this.#frame_compactions;
1064
+
1065
+ moves.length = 0;
1066
+
1067
+ for (let i = 0; i < queue.length; i++) {
1068
+ const id = queue[i];
1069
+
1070
+ if (this.#card_state[id] !== CARDS_COMPACTING) {
1071
+ // dropped since
1072
+ continue;
1073
+ }
1074
+
1075
+ const source = this.#card_scratch[id];
1076
+ const target = this.#card_ranges[id];
1077
+
1078
+ moves.push(source.offset, target.offset, this.#card_words[id]);
1079
+
1080
+ // the copy reads it this frame
1081
+ this.#release_next.push(source);
1082
+ this.#card_scratch[id] = null;
1083
+
1084
+ this.#card_state[id] = CARDS_PLACED;
1085
+ this.#write_header_cards(id, target.offset);
1086
+
1087
+ this.#cards.set_layout(id, this.#card_pages[id]);
1088
+ }
1089
+
1090
+ queue.length = 0;
1091
+ }
1092
+
1093
+ /**
1094
+ * Admit queued geometries in request order: those whose tree is resident, while every brick they
1095
+ * could queue fits on the ring beside what may be on it already.
1096
+ *
1097
+ * @param {number} queued_bound bricks the ring may hold now, at most
1098
+ */
1099
+ #admit(queued_bound) {
1100
+ const queue = this.#queue;
1101
+ const state = this.#state;
1102
+ const blas = this.#geometries.blas;
1103
+ const layout = this.#layout;
1104
+
1105
+ let bound = queued_bound;
1106
+ let runs = 0;
1107
+ let bricks = 0;
1108
+ let kept = 0;
1109
+ let full = false;
1110
+
1111
+ for (let i = 0; i < queue.length; i++) {
1112
+ const id = queue[i];
1113
+
1114
+ if (state[id] !== HOST_QUEUED) {
1115
+ // dropped while queued
1116
+ continue;
1117
+ }
1118
+
1119
+ const record = this.#records[id];
1120
+
1121
+ if (full || blas.get_address(record) === undefined) {
1122
+ // the ring is full this frame, or the tree is not traceable yet
1123
+ queue[kept++] = id;
1124
+ continue;
1125
+ }
1126
+
1127
+ layout.compute(record.geometry.bounding_box, this.#voxel_size, this.#max_bricks);
1128
+
1129
+ const count = layout.brick_count;
1130
+
1131
+ if (bound + count > this.#ring_capacity) {
1132
+ // in request order: the rest wait with it
1133
+ full = true;
1134
+ queue[kept++] = id;
1135
+ continue;
1136
+ }
1137
+
1138
+ // the geometry's pending word, then its entries
1139
+ this.#ensure_indirection(count + 1);
1140
+
1141
+ const range = this.#indirection_allocator.allocate(count + 1);
1142
+
1143
+ assert.notEqual(range.offset, ALLOCATOR_NO_SPACE, 'indirection allocation after growth');
1144
+
1145
+ this.#ranges[id] = range;
1146
+ this.#brick_count[id] = count;
1147
+ this.#generation[id]++;
1148
+ this.#two_sided[id] = this.#two_sided_references[id] > 0 ? 1 : 0;
1149
+ state[id] = HOST_BAKING;
1150
+ this.#baking++;
1151
+
1152
+ if (layout.coarsened) {
1153
+ this.#coarsened_count++;
1154
+ }
1155
+
1156
+ this.#write_header_baking(id, layout, range.offset + 1);
1157
+
1158
+ // level 0's grid, which the cards are placed over
1159
+ const grid = layout.bricks;
1160
+ const placement = mesh_card_placement_of(grid);
1161
+
1162
+ this.#placement_words[id] = placement.words;
1163
+ this.#placement_scratch[id] = placement.histograms;
1164
+ this.#placement_columns[id] = 2 * (grid[0] * grid[1] + grid[1] * grid[2] + grid[0] * grid[2]);
1165
+
1166
+ this.#word_scratch[0] = count;
1167
+ this.#device.queue.writeBuffer(this.#indirection, range.offset * 4, this.#word_scratch, 0, 1);
1168
+
1169
+ this.#classify_scratch = grow_typed(this.#classify_scratch, 2 * (runs + 1));
1170
+ this.#classify_scratch[2 * runs] = bricks;
1171
+ this.#classify_scratch[2 * runs + 1] = id;
1172
+
1173
+ runs++;
1174
+ bricks += count;
1175
+ bound += count;
1176
+ this.#admitted_total += count;
1177
+ }
1178
+
1179
+ queue.length = kept;
1180
+
1181
+ this.#frame_classify_runs = runs;
1182
+ this.#frame_classify_bricks = bricks;
1183
+
1184
+ if (runs > 0) {
1185
+ this.#classify_ranges = this.#ensure_runs_buffer(this.#classify_ranges, runs, "classify");
1186
+ this.#device.queue.writeBuffer(this.#classify_ranges, 0, this.#classify_scratch, 0, 2 * runs);
1187
+ }
1188
+ }
1189
+
1190
+ #upload_free_ranges() {
1191
+ const freed = this.#freed;
1192
+ const runs = freed.length / 2;
1193
+
1194
+ let entries = 0;
1195
+
1196
+ if (runs > 0) {
1197
+ this.#free_scratch = grow_typed(this.#free_scratch, 2 * runs);
1198
+
1199
+ for (let i = 0; i < runs; i++) {
1200
+ this.#free_scratch[2 * i] = entries;
1201
+ this.#free_scratch[2 * i + 1] = freed[2 * i];
1202
+
1203
+ entries += freed[2 * i + 1];
1204
+ }
1205
+
1206
+ this.#free_ranges = this.#ensure_runs_buffer(this.#free_ranges, runs, "free");
1207
+ this.#device.queue.writeBuffer(this.#free_ranges, 0, this.#free_scratch, 0, 2 * runs);
1208
+
1209
+ freed.length = 0;
1210
+
1211
+ // read by this frame's free pass
1212
+ const freeing = this.#freeing;
1213
+
1214
+ for (let i = 0; i < freeing.length; i++) {
1215
+ this.#release_next.push(freeing[i]);
1216
+ }
1217
+
1218
+ freeing.length = 0;
1219
+ }
1220
+
1221
+ this.#frame_free_runs = runs;
1222
+ this.#frame_free_entries = entries;
1223
+ }
1224
+
1225
+ /**
1226
+ * {@link #execute_bake}, bound once.
1227
+ * @type {function(Object, Object, Object): void}
1228
+ */
1229
+ #execute = (data, resources, context) => this.#execute_bake(data, resources, context);
1230
+
1231
+ /**
1232
+ * @param {Object} data
1233
+ * @param {import("../../../../engine/graphics/render/frame_graph/FramePassResources.js").FramePassResources} resources
1234
+ * @param {import("../../../device/graph/GraphicsExecutionContext.js").GraphicsExecutionContext} context
1235
+ */
1236
+ #execute_bake(data, resources, context) {
1237
+ const encoder = context.encoder;
1238
+ const arena = resources.get(data.arena);
1239
+ const b = this.#bindings;
1240
+
1241
+ // the log and the tallies
1242
+ encoder.clearBuffer(arena, 4 * this.#frame_log_offset, this.#frame_bytes);
1243
+
1244
+ if (this.#fill_pending) {
1245
+ this.#fill_pending = false;
1246
+
1247
+ shader_slot_stack_fill.dispatch({
1248
+ encoder,
1249
+ group_count_x: Math.min(Math.ceil(this.#slot_capacity / SLOT_STACK_FILL_WORKGROUP_SIZE), WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION),
1250
+ bindings: { capacity: this.#slot_capacity, slots: this.#slots },
1251
+ });
1252
+ }
1253
+
1254
+ const pushes = this.#pushes;
1255
+
1256
+ for (let i = 0; i < pushes.length; i += 2) {
1257
+ const settings = this.#push_settings;
1258
+
1259
+ settings.first = pushes[i];
1260
+ settings.count = pushes[i + 1];
1261
+
1262
+ shader_slot_stack_push_range.dispatch({
1263
+ encoder,
1264
+ group_count_x: Math.min(Math.ceil(settings.count / SLOT_STACK_PUSH_RANGE_WORKGROUP_SIZE), WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION),
1265
+ bindings: { settings, counts: arena, slots: this.#slots },
1266
+ });
1267
+ }
1268
+
1269
+ pushes.length = 0;
1270
+
1271
+ const geometries = this.#geometries;
1272
+
1273
+ b.blas_lookup = geometries.blas.buffer_metadata;
1274
+ b.blas_data = geometries.blas.buffer_data;
1275
+ b.geometries = geometries.buffer_metadata;
1276
+ b.meshlet_metadata = geometries.meshlets.buffer_metadata;
1277
+ b.meshlet_data = geometries.meshlets.buffer_data;
1278
+ b.mesh_sdf_headers = this.#headers;
1279
+ b.mesh_sdf_indirection = arena;
1280
+ b.mesh_sdf_slots = this.#slots;
1281
+ b.mesh_sdf_ring = this.#ring;
1282
+ b.mesh_sdf_take = this.#take;
1283
+
1284
+ if (this.#frame_free_entries > 0) {
1285
+ const groups = Math.ceil(this.#frame_free_entries / MESH_SDF_BAKE_WORKGROUP_SIZE);
1286
+ const groups_x = Math.min(groups, WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION);
1287
+ const settings = this.#free_settings;
1288
+
1289
+ settings.range_count = this.#frame_free_runs;
1290
+ settings.entry_count = this.#frame_free_entries;
1291
+ settings.groups_x = groups_x;
1292
+
1293
+ b.settings = settings;
1294
+ b.mesh_sdf_ranges = this.#free_ranges;
1295
+
1296
+ shader_mesh_sdf_free.dispatch({
1297
+ encoder,
1298
+ group_count_x: groups_x,
1299
+ group_count_y: Math.ceil(groups / groups_x),
1300
+ bindings: b,
1301
+ });
1302
+ }
1303
+
1304
+ if (this.#frame_classify_bricks > 0) {
1305
+ const groups = Math.ceil(this.#frame_classify_bricks / MESH_SDF_BAKE_WORKGROUP_SIZE);
1306
+ const groups_x = Math.min(groups, WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION);
1307
+ const settings = this.#classify_settings;
1308
+
1309
+ settings.range_count = this.#frame_classify_runs;
1310
+ settings.brick_count = this.#frame_classify_bricks;
1311
+ settings.groups_x = groups_x;
1312
+ settings.ring_capacity = this.#ring_capacity;
1313
+ settings.log_offset = this.#frame_log_offset;
1314
+ settings.log_capacity = this.#frame_log_capacity;
1315
+
1316
+ b.settings = settings;
1317
+ b.mesh_sdf_ranges = this.#classify_ranges;
1318
+
1319
+ shader_mesh_sdf_classify.dispatch({
1320
+ encoder,
1321
+ group_count_x: groups_x,
1322
+ group_count_y: Math.ceil(groups / groups_x),
1323
+ bindings: b,
1324
+ });
1325
+ }
1326
+
1327
+ this.#take_settings.budget = this.#frame_budget;
1328
+ this.#take_settings.log_offset = this.#frame_log_offset;
1329
+ b.settings = this.#take_settings;
1330
+
1331
+ shader_mesh_sdf_take.dispatch({ encoder, bindings: b });
1332
+
1333
+ const evaluate_settings = this.#evaluate_settings;
1334
+
1335
+ evaluate_settings.ring_capacity = this.#ring_capacity;
1336
+ evaluate_settings.slot_capacity = this.#slot_capacity;
1337
+ evaluate_settings.log_offset = this.#frame_log_offset;
1338
+ evaluate_settings.log_capacity = this.#frame_log_capacity;
1339
+ evaluate_settings.tally_offset = this.#frame_tally_offset;
1340
+
1341
+ b.settings = evaluate_settings;
1342
+
1343
+ shader_mesh_sdf_evaluate.dispatchIndirect({
1344
+ encoder,
1345
+ bindings: b,
1346
+ command: this.#take,
1347
+ command_offset: MESH_SDF_TAKE_DISPATCH * 4,
1348
+ });
1349
+
1350
+ this.#store_settings.ring_capacity = this.#ring_capacity;
1351
+ b.settings = this.#store_settings;
1352
+ b.mesh_sdf_atlas_store = this.#atlas.texture.obtainView();
1353
+
1354
+ shader_mesh_sdf_store.dispatchIndirect({
1355
+ encoder,
1356
+ bindings: b,
1357
+ command: this.#take,
1358
+ command_offset: MESH_SDF_TAKE_DISPATCH * 4,
1359
+ });
1360
+
1361
+ // card placement, a geometry at a time over its level-0 entries: the scratch cleared, then
1362
+ // histogram, split, merge, pages and log
1363
+ const placements = this.#frame_placements;
1364
+
1365
+ for (let i = 0; i < placements.length; i += 3) {
1366
+ const id = placements[i];
1367
+ const first = placements[i + 1];
1368
+ const scratch = placements[i + 2];
1369
+
1370
+ encoder.clearBuffer(arena, 4 * (first + scratch), 4 * (this.#placement_words[id] - scratch));
1371
+
1372
+ const histogram = this.#histogram_settings;
1373
+
1374
+ histogram.geometry = id;
1375
+ histogram.columns = this.#placement_columns[id];
1376
+ b.settings = histogram;
1377
+
1378
+ shader_mesh_cards_histogram.dispatch({
1379
+ encoder,
1380
+ group_count_x: Math.ceil(histogram.columns / MESH_SDF_BAKE_WORKGROUP_SIZE),
1381
+ bindings: b,
1382
+ });
1383
+
1384
+ this.#split_settings.geometry = id;
1385
+ b.settings = this.#split_settings;
1386
+
1387
+ shader_mesh_cards_split.dispatch({ encoder, bindings: b });
1388
+
1389
+ this.#merge_settings.geometry = id;
1390
+ b.settings = this.#merge_settings;
1391
+
1392
+ shader_mesh_cards_merge.dispatch({ encoder, bindings: b });
1393
+
1394
+ this.#pages_settings.geometry = id;
1395
+ b.settings = this.#pages_settings;
1396
+
1397
+ shader_mesh_cards_pages.dispatchIndirect({
1398
+ encoder,
1399
+ bindings: b,
1400
+ command: this.#take,
1401
+ command_offset: MESH_SDF_TAKE_PLACE_DISPATCH * 4,
1402
+ });
1403
+
1404
+ const log = this.#place_log_settings;
1405
+
1406
+ log.geometry = id;
1407
+ log.log_offset = this.#frame_log_offset;
1408
+ log.log_capacity = this.#frame_log_capacity;
1409
+ b.settings = log;
1410
+
1411
+ shader_mesh_cards_log.dispatch({ encoder, bindings: b });
1412
+ }
1413
+
1414
+ // placed layouts into ranges of their own size
1415
+ const moves = this.#frame_compactions;
1416
+
1417
+ for (let i = 0; i < moves.length; i += 3) {
1418
+ const settings = this.#compact_settings;
1419
+ const groups = Math.ceil(moves[i + 2] / MESH_SDF_BAKE_WORKGROUP_SIZE);
1420
+ const groups_x = Math.min(groups, WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION);
1421
+
1422
+ settings.source = moves[i];
1423
+ settings.destination = moves[i + 1];
1424
+ settings.count = moves[i + 2];
1425
+ settings.groups_x = groups_x;
1426
+ b.settings = settings;
1427
+
1428
+ shader_mesh_cards_compact.dispatch({
1429
+ encoder,
1430
+ group_count_x: groups_x,
1431
+ group_count_y: Math.ceil(groups / groups_x),
1432
+ bindings: b,
1433
+ });
1434
+ }
1435
+ }
1436
+
1437
+ /**
1438
+ * @param {Uint32Array} words
1439
+ * @param {number} frame the frame the log is of
1440
+ * @param {number} admitted {@link #admitted_total} as that frame left it
1441
+ * @param {number} epoch {@link #ring_epoch} as that frame left it
1442
+ * @param {number} capacity records the log held
1443
+ */
1444
+ #apply_log(words, frame, admitted, epoch, capacity) {
1445
+ if (epoch === this.#ring_epoch && frame > this.#read_frame) {
1446
+ this.#read_frame = frame;
1447
+ this.#read_queued = words[MESH_SDF_LOG_QUEUED];
1448
+ this.#read_admitted = admitted;
1449
+ }
1450
+
1451
+ this.#bricks_evaluated += words[MESH_SDF_LOG_TAKEN];
1452
+
1453
+ if (frame === this.#read_frame) {
1454
+ this.#free_slots = words[MESH_SDF_LOG_FREE_SLOTS];
1455
+ }
1456
+
1457
+ if (words[MESH_SDF_LOG_STARVED] !== 0) {
1458
+ this.#starved_frames++;
1459
+
1460
+ // a log from before the last growth asked for what that growth gave
1461
+ if (frame > this.#grown_frame) {
1462
+ this.#grow_slots();
1463
+ this.#grown_frame = this.#frame;
1464
+ }
1465
+ }
1466
+
1467
+ const count = words[MESH_SDF_LOG_COMPLETIONS];
1468
+
1469
+ assert.lessThanOrEqual(count, capacity, 'bake log overflowed: a geometry completed that was not in flight');
1470
+
1471
+ for (let i = 0; i < count; i++) {
1472
+ const word = MESH_SDF_LOG_HEADER_WORDS + i * MESH_SDF_LOG_RECORD_WORDS;
1473
+ const marked = words[word];
1474
+
1475
+ if ((marked & MESH_SDF_LOG_PLACED) !== 0) {
1476
+ this.#apply_placed((marked & ~MESH_SDF_LOG_PLACED) >>> 0, words[word + 1], words[word + 2], words[word + 3]);
1477
+ continue;
1478
+ }
1479
+
1480
+ const id = marked;
1481
+
1482
+ if (this.#state[id] !== HOST_BAKING || this.#generation[id] !== words[word + 1]) {
1483
+ // of a bake dropped since
1484
+ continue;
1485
+ }
1486
+
1487
+ this.#state[id] = HOST_RESIDENT;
1488
+ this.#baking--;
1489
+ this.#resident_count++;
1490
+
1491
+ this.#word_scratch[0] = MeshSDFState.Resident;
1492
+ this.#device.queue.writeBuffer(this.#headers, id * HEADER_BYTES + HEADER_STATE, this.#word_scratch, 0, 1);
1493
+
1494
+ this.#card_state[id] = CARDS_QUEUED;
1495
+ this.#place_queue.push(id);
1496
+
1497
+ this.onBaked.send1(id);
1498
+ }
1499
+ }
1500
+
1501
+ /**
1502
+ * A geometry's cards are placed, with `columns` over every card and `pages` pages: a range of that
1503
+ * size for the layout, which the next bake moves it into.
1504
+ *
1505
+ * @param {number} id
1506
+ * @param {number} generation the bake's the placement read
1507
+ * @param {number} columns
1508
+ * @param {number} pages
1509
+ */
1510
+ #apply_placed(id, generation, columns, pages) {
1511
+ if (this.#state[id] !== HOST_RESIDENT || this.#generation[id] !== generation || this.#card_state[id] !== CARDS_PLACING) {
1512
+ // of a placement whose geometry was dropped since
1513
+ return;
1514
+ }
1515
+
1516
+ const words = mesh_card_layout_words(columns, pages);
1517
+
1518
+ this.#ensure_indirection(words);
1519
+
1520
+ const range = this.#indirection_allocator.allocate(words);
1521
+
1522
+ assert.notEqual(range.offset, ALLOCATOR_NO_SPACE, 'card layout allocation after growth');
1523
+
1524
+ this.#card_ranges[id] = range;
1525
+ this.#card_pages[id] = pages;
1526
+ this.#card_words[id] = words;
1527
+ this.#card_state[id] = CARDS_COMPACTING;
1528
+ this.#compact_queue.push(id);
1529
+ }
1530
+
1531
+ /**
1532
+ * @param {number} id
1533
+ * @param {number} offset the layout's first word in the arena
1534
+ */
1535
+ #write_header_cards(id, offset) {
1536
+ this.#word_scratch[0] = offset;
1537
+ this.#device.queue.writeBuffer(this.#headers, id * HEADER_BYTES + HEADER_CARDS, this.#word_scratch, 0, 1);
1538
+ }
1539
+
1540
+ /**
1541
+ * Give back a geometry's cards: its ranges once the passes reading them are submitted, its card
1542
+ * sets back to waiting.
1543
+ *
1544
+ * @param {number} id
1545
+ */
1546
+ #drop_cards(id) {
1547
+ if (this.#card_state[id] === CARDS_NONE) {
1548
+ return;
1549
+ }
1550
+
1551
+ this.#card_state[id] = CARDS_NONE;
1552
+
1553
+ for (const ranges of [this.#card_scratch, this.#card_ranges]) {
1554
+ const range = ranges[id];
1555
+
1556
+ if (range !== null && range !== undefined) {
1557
+ this.#release_next.push(range);
1558
+ ranges[id] = null;
1559
+ }
1560
+ }
1561
+
1562
+ this.#cards.drop_layout(id);
1563
+ }
1564
+
1565
+ /**
1566
+ * Drop whatever the id holds: a place in the queue, a bake, a resident cache, an alias.
1567
+ *
1568
+ * @param {number} id
1569
+ */
1570
+ #drop(id) {
1571
+ const state = this.#state[id];
1572
+
1573
+ if (state === HOST_NONE) {
1574
+ return;
1575
+ }
1576
+
1577
+ this.#state[id] = HOST_NONE;
1578
+
1579
+ if (state === HOST_QUEUED) {
1580
+ return;
1581
+ }
1582
+
1583
+ if (state === HOST_ALIAS) {
1584
+ this.#aliases.delete(id);
1585
+ } else {
1586
+ if (state === HOST_BAKING) {
1587
+ this.#baking--;
1588
+ } else {
1589
+ this.#resident_count--;
1590
+ }
1591
+
1592
+ const range = this.#ranges[id];
1593
+
1594
+ this.#freed.push(range.offset + 1, this.#brick_count[id]);
1595
+ this.#freeing.push(range);
1596
+ this.#ranges[id] = null;
1597
+
1598
+ this.#drop_cards(id);
1599
+ }
1600
+
1601
+ // bricks of this id still on the ring are stale from here on, by the state
1602
+ if (this.#headers !== null) {
1603
+ this.#word_scratch[0] = MeshSDFState.None;
1604
+ this.#device.queue.writeBuffer(this.#headers, id * HEADER_BYTES + HEADER_STATE, this.#word_scratch, 0, 1);
1605
+ }
1606
+ }
1607
+
1608
+ /**
1609
+ * @param {number} id
1610
+ * @param {MeshSDFLayout} layout
1611
+ * @param {number} indirection
1612
+ */
1613
+ #write_header_baking(id, layout, indirection) {
1614
+ const view = this.#header_scratch;
1615
+
1616
+ for (let axis = 0; axis < 3; axis++) {
1617
+ view.setFloat32(HEADER_ORIGIN + 4 * axis, layout.origin[axis], true);
1618
+ view.setUint32(HEADER_BRICKS + 4 * axis, layout.bricks[axis], true);
1619
+ }
1620
+
1621
+ view.setFloat32(HEADER_VOXEL, layout.voxel, true);
1622
+ view.setUint32(HEADER_LEVEL_COUNT, layout.level_count, true);
1623
+ view.setUint32(HEADER_INDIRECTION, indirection, true);
1624
+ view.setUint32(HEADER_CARDS, GPU_DATABASE_NULL, true);
1625
+ view.setUint32(HEADER_STATE, MeshSDFState.Baking, true);
1626
+ view.setUint32(HEADER_SOURCE, GPU_DATABASE_NULL, true);
1627
+ view.setUint32(HEADER_GENERATION, this.#generation[id], true);
1628
+ view.setUint32(HEADER_TWO_SIDED, this.#two_sided[id], true);
1629
+
1630
+ this.#device.queue.writeBuffer(this.#headers, id * HEADER_BYTES, view.buffer, 0, HEADER_BYTES);
1631
+ }
1632
+
1633
+ /**
1634
+ * @param {number} id
1635
+ * @param {number} source
1636
+ */
1637
+ #write_header_alias(id, source) {
1638
+ const view = this.#header_scratch;
1639
+
1640
+ new Uint8Array(view.buffer).fill(0);
1641
+
1642
+ view.setUint32(HEADER_CARDS, GPU_DATABASE_NULL, true);
1643
+ view.setUint32(HEADER_STATE, MeshSDFState.Alias, true);
1644
+ view.setUint32(HEADER_SOURCE, source, true);
1645
+ view.setUint32(HEADER_GENERATION, this.#generation[id], true);
1646
+
1647
+ this.#device.queue.writeBuffer(this.#headers, id * HEADER_BYTES, view.buffer, 0, HEADER_BYTES);
1648
+ }
1649
+
1650
+ /**
1651
+ * @param {number} id
1652
+ */
1653
+ #ensure_id(id) {
1654
+ const length = id + 1;
1655
+
1656
+ this.#references = grow_typed(this.#references, length);
1657
+ this.#two_sided_references = grow_typed(this.#two_sided_references, length);
1658
+ this.#two_sided = grow_typed(this.#two_sided, length);
1659
+ this.#state = grow_typed(this.#state, length);
1660
+ this.#generation = grow_typed(this.#generation, length);
1661
+ this.#brick_count = grow_typed(this.#brick_count, length);
1662
+ this.#card_state = grow_typed(this.#card_state, length);
1663
+ this.#placement_words = grow_typed(this.#placement_words, length);
1664
+ this.#placement_scratch = grow_typed(this.#placement_scratch, length);
1665
+ this.#placement_columns = grow_typed(this.#placement_columns, length);
1666
+ this.#card_pages = grow_typed(this.#card_pages, length);
1667
+ this.#card_words = grow_typed(this.#card_words, length);
1668
+ }
1669
+
1670
+ #ensure_device() {
1671
+ if (this.#headers !== null) {
1672
+ return;
1673
+ }
1674
+
1675
+ const device = this.#device;
1676
+
1677
+ this.#headers = this.#create_buffer("headers", HEADER_BYTES * 64, GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC);
1678
+ this.#header_capacity = 64;
1679
+
1680
+ this.#indirection_capacity = INITIAL_ARENA_WORDS;
1681
+ this.#indirection = this.#create_buffer("indirection", 4 * this.#indirection_capacity, GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST);
1682
+ this.#indirection_allocator = new OffsetAllocator(this.#indirection_capacity);
1683
+
1684
+ // the counters are the arena's first words, where every pass finds them
1685
+ const counters = this.#indirection_allocator.allocate(MESH_SDF_COUNTER_WORDS);
1686
+
1687
+ assert.equal(counters.offset, 0, 'the counters are the arena\'s first allocation');
1688
+
1689
+ this.#atlas = new GPUTileAtlas3D({
1690
+ device,
1691
+ formats: ["r8unorm"],
1692
+ content_size: [MESH_SDF_BRICK_TEXELS, MESH_SDF_BRICK_TEXELS, MESH_SDF_BRICK_TEXELS],
1693
+ border: 0,
1694
+ slots_x: ATLAS_SLOTS_XY,
1695
+ slots_y: ATLAS_SLOTS_XY,
1696
+ capacity: INITIAL_SLOT_CAPACITY,
1697
+ // sampled by the readers, stored into by the bake's store pass
1698
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING,
1699
+ label: "GPUGeometrySDFManager/bricks",
1700
+ });
1701
+
1702
+ this.#atlas.reserve(INITIAL_SLOT_CAPACITY);
1703
+
1704
+ this.#slot_capacity = INITIAL_SLOT_CAPACITY;
1705
+ this.#slots = this.#create_buffer("slots", 4 * this.#slot_capacity, GPUBufferUsage.COPY_SRC);
1706
+ this.#fill_pending = true;
1707
+
1708
+ this.#take = this.#create_buffer("take", 4 * MESH_SDF_TAKE_WORDS, GPUBufferUsage.INDIRECT);
1709
+
1710
+ this.#word_scratch[0] = this.#slot_capacity;
1711
+ this.#word_scratch[1] = 0;
1712
+ this.#word_scratch[2] = 0;
1713
+ this.#word_scratch[3] = 0;
1714
+ device.queue.writeBuffer(this.#indirection, 0, this.#word_scratch, 0, MESH_SDF_COUNTER_WORDS);
1715
+
1716
+ this.#reset_ring();
1717
+
1718
+ this.#ensure_frame(INITIAL_LOG_CAPACITY, 1);
1719
+
1720
+ // aliases made before there was a header to write them into
1721
+ for (const [id, source] of this.#aliases) {
1722
+ this.#ensure_headers(id + 1);
1723
+ this.#write_header_alias(id, source);
1724
+ }
1725
+ }
1726
+
1727
+ /**
1728
+ * A ring for twice the bricks of the largest geometry the cap allows, emptied.
1729
+ */
1730
+ #reset_ring() {
1731
+ const capacity = 2 ** Math.ceil(Math.log2(2 * max_bricks_of_a_geometry(this.#max_bricks)));
1732
+
1733
+ if (this.#ring === null || this.#ring_capacity !== capacity) {
1734
+ this.#ring?.destroy();
1735
+ this.#ring_capacity = capacity;
1736
+ // copied from when the staging grows
1737
+ this.#ring = this.#create_buffer("ring", 16 * (capacity + MESH_SDF_STAGING_VEC4S * this.#staging_bricks), GPUBufferUsage.COPY_SRC);
1738
+ }
1739
+
1740
+ // head and tail
1741
+ this.#word_scratch[0] = 0;
1742
+ this.#word_scratch[1] = 0;
1743
+ this.#device.queue.writeBuffer(this.#indirection, 4, this.#word_scratch, 0, 2);
1744
+
1745
+ this.#ring_epoch++;
1746
+ this.#read_queued = 0;
1747
+ this.#read_admitted = this.#admitted_total;
1748
+ }
1749
+
1750
+ /**
1751
+ * @param {number} id_count
1752
+ */
1753
+ #ensure_headers(id_count) {
1754
+ if (id_count > this.#header_capacity) {
1755
+ let capacity = this.#header_capacity;
1756
+
1757
+ while (capacity < id_count) {
1758
+ capacity *= 2;
1759
+ }
1760
+
1761
+ this.#headers = this.#regrow(this.#headers, "headers", HEADER_BYTES * capacity, GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC);
1762
+ this.#header_capacity = capacity;
1763
+ }
1764
+ }
1765
+
1766
+ /**
1767
+ * Room for a frame: a log for `records` completions and a tally for each of `bricks` bricks taken,
1768
+ * in one range of the arena, and staging for the bricks in the ring. Neither shrinks. A larger range
1769
+ * is a new one and nothing is copied, since the frame's words are written afresh every frame; the
1770
+ * ring's entries are copied when its staging grows.
1771
+ *
1772
+ * @param {number} records
1773
+ * @param {number} bricks
1774
+ */
1775
+ #ensure_frame(records, bricks) {
1776
+ if (this.#frame_range !== null && records <= this.#log_capacity && bricks <= this.#staging_bricks) {
1777
+ return;
1778
+ }
1779
+
1780
+ let log_capacity = Math.max(1, this.#log_capacity);
1781
+
1782
+ while (log_capacity < records) {
1783
+ log_capacity *= 2;
1784
+ }
1785
+
1786
+ const staging = Math.max(bricks, this.#staging_bricks);
1787
+
1788
+ if (this.#frame_range !== null) {
1789
+ this.#indirection_allocator.free(this.#frame_range);
1790
+ }
1791
+
1792
+ const words = MESH_SDF_LOG_HEADER_WORDS + MESH_SDF_LOG_RECORD_WORDS * log_capacity + staging;
1793
+
1794
+ this.#ensure_indirection(words);
1795
+
1796
+ this.#frame_range = this.#indirection_allocator.allocate(words);
1797
+ this.#log_capacity = log_capacity;
1798
+
1799
+ if (staging > this.#staging_bricks) {
1800
+ this.#staging_bricks = staging;
1801
+ this.#ring = this.#regrow(this.#ring, "ring", 16 * (this.#ring_capacity + MESH_SDF_STAGING_VEC4S * staging), 0);
1802
+ }
1803
+ }
1804
+
1805
+ /**
1806
+ * Room in the indirection for an allocation of `count` entries.
1807
+ *
1808
+ * @param {number} count
1809
+ */
1810
+ #ensure_indirection(count) {
1811
+ const allocator = this.#indirection_allocator;
1812
+
1813
+ if (allocator.can_allocate(count)) {
1814
+ return;
1815
+ }
1816
+
1817
+ // exactly what the allocation needs, rounded up to a doubling
1818
+ const target = allocator.grow_target_for(count);
1819
+
1820
+ let capacity = this.#indirection_capacity;
1821
+
1822
+ while (capacity < target) {
1823
+ capacity *= 2;
1824
+ }
1825
+
1826
+ // the new buffer first: grow() appends to the arena, and nothing moves
1827
+ this.#indirection = this.#regrow(this.#indirection, "indirection", 4 * capacity, 0);
1828
+ allocator.grow(capacity);
1829
+ this.#indirection_capacity = capacity;
1830
+ }
1831
+
1832
+ /**
1833
+ * Double the atlas and its slot stack, the new slots pushed by the next bake.
1834
+ */
1835
+ #grow_slots() {
1836
+ const atlas = this.#atlas;
1837
+ const old_capacity = this.#slot_capacity;
1838
+ const capacity = Math.min(2 * old_capacity, atlas.capacity_limit);
1839
+
1840
+ if (capacity <= old_capacity) {
1841
+ return;
1842
+ }
1843
+
1844
+ atlas.reserve(capacity);
1845
+
1846
+ this.#slots = this.#regrow(this.#slots, "slots", 4 * capacity, GPUBufferUsage.COPY_SRC);
1847
+ this.#slot_capacity = capacity;
1848
+ this.#pushes.push(old_capacity, capacity - old_capacity);
1849
+ }
1850
+
1851
+ /**
1852
+ * A runs buffer of at least `runs` entries.
1853
+ *
1854
+ * @param {GPUBuffer|null} buffer
1855
+ * @param {number} runs
1856
+ * @param {string} name
1857
+ * @returns {GPUBuffer}
1858
+ */
1859
+ #ensure_runs_buffer(buffer, runs, name) {
1860
+ const size = 8 * runs;
1861
+
1862
+ if (buffer !== null && buffer.size >= size) {
1863
+ return buffer;
1864
+ }
1865
+
1866
+ buffer?.destroy();
1867
+
1868
+ let capacity = 64;
1869
+
1870
+ while (8 * capacity < size) {
1871
+ capacity *= 2;
1872
+ }
1873
+
1874
+ return this.#create_buffer(name, 8 * capacity, GPUBufferUsage.COPY_DST);
1875
+ }
1876
+
1877
+ /**
1878
+ * @param {string} name
1879
+ * @param {number} size
1880
+ * @param {GPUBufferUsageFlags} usage beside STORAGE
1881
+ * @returns {GPUBuffer}
1882
+ */
1883
+ #create_buffer(name, size, usage) {
1884
+ return this.#device.createBuffer(BufferDescriptor.fromJSON({
1885
+ label: `GPUGeometrySDFManager/${name}`,
1886
+ size,
1887
+ usage: GPUBufferUsage.STORAGE | usage,
1888
+ }));
1889
+ }
1890
+
1891
+ /**
1892
+ * A larger buffer with the old one's bytes, copied ahead of the frame's commands; the old one is
1893
+ * destroyed after the copy is submitted.
1894
+ *
1895
+ * @param {GPUBuffer} old
1896
+ * @param {string} name
1897
+ * @param {number} size
1898
+ * @param {GPUBufferUsageFlags} usage beside STORAGE; COPY_SRC and COPY_DST are added
1899
+ * @returns {GPUBuffer}
1900
+ */
1901
+ #regrow(old, name, size, usage) {
1902
+ const device = this.#device;
1903
+ const buffer = this.#create_buffer(name, size, usage | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST);
1904
+
1905
+ const encoder = device.createCommandEncoder({ label: `GPUGeometrySDFManager/${name} growth` });
1906
+
1907
+ encoder.copyBufferToBuffer(old, 0, buffer, 0, old.size);
1908
+ device.queue.submit([encoder.finish()]);
1909
+
1910
+ old.destroy();
1911
+
1912
+ return buffer;
1913
+ }
1914
+
1915
+ destroy() {
1916
+ if (this.#destroyed) {
1917
+ return;
1918
+ }
1919
+
1920
+ this.#destroyed = true;
1921
+
1922
+ for (const buffer of [this.#headers, this.#indirection, this.#slots, this.#take, this.#ring, this.#classify_ranges, this.#free_ranges]) {
1923
+ buffer?.destroy();
1924
+ }
1925
+
1926
+ this.#atlas?.destroy();
1927
+ this.#cards.destroy();
1928
+
1929
+ this.#headers = null;
1930
+ this.#indirection = null;
1931
+ this.#slots = null;
1932
+ this.#take = null;
1933
+ this.#ring = null;
1934
+ this.#classify_ranges = null;
1935
+ this.#free_ranges = null;
1936
+ this.#atlas = null;
228
1937
  }
229
1938
  }