@woosh/meep-engine 3.56.0 → 3.57.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 (625) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/DUPLICATION_REVIEW_2026_10_24.md +1072 -0
  4. package/src/core/binary/BitSet.js +1 -1
  5. package/src/core/binary/FLOAT16_MAX.d.ts +2 -0
  6. package/src/core/binary/FLOAT16_MAX.d.ts.map +1 -0
  7. package/src/core/binary/FLOAT16_MAX.js +1 -0
  8. package/src/core/binary/base58/base58_encode.js +2 -2
  9. package/src/core/binary/type/TypeBuilder.js +1 -1
  10. package/src/core/bvh2/bvh3/BVH.js +1 -1
  11. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.d.ts.map +1 -1
  12. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.js +7 -3
  13. package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.d.ts.map +1 -1
  14. package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.js +5 -1
  15. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.d.ts.map +1 -1
  16. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +195 -246
  17. package/src/core/collection/CuckooFilter.js +1 -1
  18. package/src/core/collection/array/isArrayEqual.d.ts.map +1 -1
  19. package/src/core/collection/array/isArrayEqual.js +33 -58
  20. package/src/core/collection/array/typed/array_buffer_hash.d.ts.map +1 -1
  21. package/src/core/collection/array/typed/array_buffer_hash.js +41 -39
  22. package/src/core/collection/array/typed/float32_array_hash.js +38 -38
  23. package/src/core/collection/array/typed/uint16_array_hash.d.ts +2 -1
  24. package/src/core/collection/array/typed/uint16_array_hash.d.ts.map +1 -1
  25. package/src/core/collection/array/typed/uint16_array_hash.js +30 -29
  26. package/src/core/collection/array/typed/uint32_array_hash.d.ts +2 -1
  27. package/src/core/collection/array/typed/uint32_array_hash.d.ts.map +1 -1
  28. package/src/core/collection/array/typed/uint32_array_hash.js +21 -20
  29. package/src/core/collection/array/typed/uint8_array_hash.d.ts +2 -1
  30. package/src/core/collection/array/typed/uint8_array_hash.d.ts.map +1 -1
  31. package/src/core/collection/array/typed/uint8_array_hash.js +37 -36
  32. package/src/core/collection/array/typed/uint_array_for_count.js +2 -2
  33. package/src/core/collection/list/List.d.ts.map +1 -1
  34. package/src/core/collection/list/List.js +3 -19
  35. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  36. package/src/core/collection/table/RowFirstTable.js +4 -28
  37. package/src/core/debug/matchers/DescribeAs.d.ts.map +1 -1
  38. package/src/core/debug/matchers/DescribeAs.js +62 -64
  39. package/src/core/function/FunctionCompiler.js +4 -4
  40. package/src/core/function/objectsEqual.d.ts.map +1 -1
  41. package/src/core/function/objectsEqual.js +3 -2
  42. package/src/core/geom/2d/bvh/BVH2D.d.ts.map +1 -1
  43. package/src/core/geom/2d/bvh/BVH2D.js +4 -3
  44. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts +5 -2
  45. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts.map +1 -1
  46. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.js +49 -11
  47. package/src/core/geom/2d/hash-grid/shg_query_elements_circle.d.ts.map +1 -1
  48. package/src/core/geom/2d/hash-grid/shg_query_elements_circle.js +122 -159
  49. package/src/core/geom/2d/hash-grid/shg_query_elements_line.d.ts.map +1 -1
  50. package/src/core/geom/2d/hash-grid/shg_query_elements_line.js +8 -5
  51. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts +18 -0
  52. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts.map +1 -0
  53. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.js +97 -0
  54. package/src/core/geom/2d/r-tree/StaticR2Tree.js +2 -2
  55. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts +21 -0
  56. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts.map +1 -0
  57. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.js +54 -0
  58. package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts.map +1 -1
  59. package/src/core/geom/3d/aabb/aabb3_build_frustum.js +20 -53
  60. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts +1 -1
  61. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts.map +1 -1
  62. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.js +11 -42
  63. package/src/core/geom/3d/atlas/pack/atlas_pack_charts.d.ts.map +1 -1
  64. package/src/core/geom/3d/atlas/pack/atlas_pack_charts.js +30 -32
  65. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.d.ts.map +1 -1
  66. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.js +1 -5
  67. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.d.ts.map +1 -1
  68. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.js +1 -15
  69. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.d.ts.map +1 -1
  70. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.js +105 -116
  71. package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.d.ts.map +1 -1
  72. package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.js +36 -54
  73. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts +5 -10
  74. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts.map +1 -1
  75. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +20 -82
  76. package/src/core/geom/3d/plane/plane3_slerp.d.ts.map +1 -1
  77. package/src/core/geom/3d/plane/plane3_slerp.js +87 -102
  78. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts +12 -0
  79. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts.map +1 -1
  80. package/src/core/geom/3d/polygon/polygon3_compute_normal.js +107 -60
  81. package/src/core/geom/3d/ray/ray3_compute_closest_point.d.ts.map +1 -1
  82. package/src/core/geom/3d/ray/ray3_compute_closest_point.js +37 -43
  83. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  84. package/src/core/geom/3d/shape/ConvexHullShape3D.js +5 -16
  85. package/src/core/geom/3d/shape/MeshShape3D.js +2 -56
  86. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  87. package/src/core/geom/3d/shape/TransformedShape3D.js +10 -7
  88. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  89. package/src/core/geom/3d/shape/UnionShape3D.js +9 -3
  90. package/src/core/geom/3d/shape/json/shape_to_type.js +2 -2
  91. package/src/core/geom/3d/sphere/harmonics/SH3_COEFFICIENTS.js +17 -17
  92. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts.map +1 -1
  93. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +6 -2
  94. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -1
  95. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +3 -2
  96. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts +20 -2
  97. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts.map +1 -1
  98. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.js +52 -37
  99. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.d.ts.map +1 -1
  100. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.js +40 -56
  101. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
  102. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +251 -260
  103. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -1
  104. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +104 -113
  105. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.d.ts.map +1 -1
  106. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.js +227 -238
  107. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  108. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +15 -24
  109. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.d.ts.map +1 -1
  110. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +31 -115
  111. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.d.ts.map +1 -1
  112. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.js +142 -150
  113. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
  114. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +151 -194
  115. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.d.ts.map +1 -1
  116. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.js +60 -85
  117. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.d.ts.map +1 -1
  118. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.js +156 -171
  119. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.d.ts.map +1 -1
  120. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.js +8 -44
  121. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.d.ts.map +1 -1
  122. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.js +2 -7
  123. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -1
  124. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +3 -2
  125. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.d.ts.map +1 -1
  126. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.js +128 -133
  127. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts +8 -14
  128. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts.map +1 -1
  129. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +36 -82
  130. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
  131. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +7 -144
  132. package/src/core/geom/ConicRay.d.ts.map +1 -1
  133. package/src/core/geom/ConicRay.js +230 -237
  134. package/src/core/localization/LocaleDataset.d.ts +6 -0
  135. package/src/core/localization/LocaleDataset.d.ts.map +1 -1
  136. package/src/core/localization/LocaleDataset.js +48 -37
  137. package/src/core/localization/LocalizationEngine.d.ts.map +1 -1
  138. package/src/core/localization/LocalizationEngine.js +3 -2
  139. package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -1
  140. package/src/core/math/lookup/ParameterLookupTable.js +3 -1
  141. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.d.ts.map +1 -1
  142. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.js +330 -400
  143. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -0
  144. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
  145. package/src/core/math/spline/spline3_hermite_nearest_point.js +134 -167
  146. package/src/core/model/DebouncedObservedBoolean.d.ts +1 -2
  147. package/src/core/model/DebouncedObservedBoolean.d.ts.map +1 -1
  148. package/src/core/model/DebouncedObservedBoolean.js +1 -1
  149. package/src/core/model/node-graph/node/NodeInstance.d.ts.map +1 -1
  150. package/src/core/model/node-graph/node/NodeInstance.js +2 -7
  151. package/src/core/model/node-graph/node/parameter/NodeParameterDescription.js +1 -1
  152. package/src/core/model/object/optional_equality.d.ts +3 -3
  153. package/src/core/model/object/optional_equality.d.ts.map +1 -1
  154. package/src/core/model/object/optional_equality.js +10 -27
  155. package/src/core/model/object/write_property.js +1 -1
  156. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.js +2 -2
  157. package/src/core/primitives/strings/string_compute_byte_size.d.ts +3 -3
  158. package/src/core/primitives/strings/string_compute_byte_size.d.ts.map +1 -1
  159. package/src/core/primitives/strings/string_compute_byte_size.js +8 -21
  160. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  161. package/src/core/process/executor/ConcurrentExecutor.js +14 -2
  162. package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts +6 -3
  163. package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts.map +1 -1
  164. package/src/engine/achievements/gateway/StorageAchievementGateway.js +31 -75
  165. package/src/engine/asset/loaders/SVGAssetLoader.d.ts.map +1 -1
  166. package/src/engine/asset/loaders/SVGAssetLoader.js +33 -31
  167. package/src/engine/control/first-person/math/criticallyDampedSpring.d.ts.map +1 -1
  168. package/src/engine/control/first-person/math/criticallyDampedSpring.js +3 -14
  169. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  170. package/src/engine/ecs/EntityComponentDataset.js +4 -1
  171. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts +0 -2
  172. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts.map +1 -1
  173. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.js +3 -3
  174. package/src/engine/ecs/terrain/ecs/layers/TerrainLayer.js +2 -2
  175. package/src/engine/graphics/sh3/path_tracer/geometry/sort_triangles_by_distance_to_point.js +1 -1
  176. package/src/engine/graphics/texture/sampler/sampler2d_channel_compute_min_indices.js +1 -1
  177. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  178. package/src/engine/graphics3/WaterSystem.js +2 -1
  179. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -1
  180. package/src/engine/graphics3/prefab/prefab_skin_frame.js +1 -12
  181. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +1 -1
  182. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  183. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +141 -137
  184. package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
  185. package/src/engine/input/ecs/systems/InputControllerSystem.js +13 -3
  186. package/src/engine/input/ecs/systems/InputSystem.d.ts.map +1 -1
  187. package/src/engine/input/ecs/systems/InputSystem.js +2 -1
  188. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts +1 -1
  189. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts.map +1 -1
  190. package/src/engine/intelligence/behavior/composite/ParallelBehavior.js +4 -1
  191. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.d.ts.map +1 -1
  192. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.js +3 -1
  193. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.d.ts.map +1 -1
  194. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.js +3 -1
  195. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.d.ts.map +1 -1
  196. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.js +39 -33
  197. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts +5 -0
  198. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts.map +1 -1
  199. package/src/engine/intelligence/behavior/util/ConditionalBehavior.js +93 -75
  200. package/src/engine/intelligence/behavior/util/RotationBehavior.d.ts.map +1 -1
  201. package/src/engine/intelligence/behavior/util/RotationBehavior.js +79 -76
  202. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts +1 -0
  203. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts.map +1 -1
  204. package/src/engine/intelligence/blackboard/BlackboardStack.js +159 -123
  205. package/src/engine/intelligence/mcts/StateNode.d.ts.map +1 -1
  206. package/src/engine/intelligence/mcts/StateNode.js +366 -364
  207. package/src/engine/intelligence/resource/ResourceAllocationSolver.js +1 -1
  208. package/src/engine/navigation/ecs/components/Path.d.ts.map +1 -1
  209. package/src/engine/navigation/ecs/components/Path.js +2 -1
  210. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  211. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +5 -2
  212. package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
  213. package/src/engine/physics/body/SolverBodyState.js +2 -6
  214. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  215. package/src/engine/physics/ccd/linear_sweep.js +3 -16
  216. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  217. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +2 -16
  218. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +13 -1
  219. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  220. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +15 -4
  221. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  222. package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
  223. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts +12 -0
  224. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts.map +1 -0
  225. package/src/engine/physics/inertia/locked_inverse_inertia.js +22 -0
  226. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
  227. package/src/engine/physics/integration/integrate_velocity.js +3 -18
  228. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts +1 -0
  229. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
  230. package/src/engine/physics/mls-mpm/MLS_MPM.js +5 -4
  231. package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
  232. package/src/engine/physics/narrowphase/convex_decomposition.js +7 -16
  233. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  234. package/src/engine/physics/vehicle/RaycastVehicle.js +15 -5
  235. package/src/engine/save/StorageBackedList.d.ts +5 -0
  236. package/src/engine/save/StorageBackedList.d.ts.map +1 -1
  237. package/src/engine/save/StorageBackedList.js +161 -144
  238. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  239. package/src/engine/simulation/Ticker.js +394 -391
  240. package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts.map +1 -1
  241. package/src/engine/sound/simulation/probe/AcousticProbeField.js +6 -19
  242. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts +15 -0
  243. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts.map +1 -1
  244. package/src/engine/sound/simulation/probe/probe_edge_visible.js +59 -41
  245. package/src/engine/sound/simulation/probe/probe_refine_connectivity.d.ts.map +1 -1
  246. package/src/engine/sound/simulation/probe/probe_refine_connectivity.js +164 -181
  247. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts.map +1 -1
  248. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +20 -5
  249. package/src/format/image/avif/av1/decode/Av1FrameContext.d.ts.map +1 -1
  250. package/src/format/image/avif/av1/decode/Av1FrameContext.js +3 -10
  251. package/src/format/image/avif/av1/decode/reconstruct.d.ts +20 -0
  252. package/src/format/image/avif/av1/decode/reconstruct.d.ts.map +1 -1
  253. package/src/format/image/avif/av1/decode/reconstruct.js +22 -9
  254. package/src/format/image/avif/av1/encode/choose_restoration.js +2 -18
  255. package/src/format/image/avif/av1/encode/quantise.d.ts.map +1 -1
  256. package/src/format/image/avif/av1/encode/quantise.js +1 -55
  257. package/src/format/image/avif/av1/filter/loop_restoration.d.ts +9 -0
  258. package/src/format/image/avif/av1/filter/loop_restoration.d.ts.map +1 -1
  259. package/src/format/image/avif/av1/filter/loop_restoration.js +1 -1
  260. package/src/format/texture/basis/transcode/etc1s_to_bc7.js +2 -33
  261. package/src/format/texture/basis/transcode/fit_endpoints.d.ts +11 -0
  262. package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -1
  263. package/src/format/texture/basis/transcode/fit_endpoints.js +1 -1
  264. package/src/format/texture/basis/uastc/uastc_decode_block.d.ts.map +1 -1
  265. package/src/format/texture/basis/uastc/uastc_decode_block.js +2 -19
  266. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +220 -0
  267. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +172 -0
  268. package/src/generation/foliage/FOLIAGE_DESIGN.md +165 -15
  269. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +158 -0
  270. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +248 -0
  271. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +694 -0
  272. package/src/generation/foliage/analysis/CrownOpacity.d.ts +118 -0
  273. package/src/generation/foliage/analysis/CrownOpacity.d.ts.map +1 -0
  274. package/src/generation/foliage/analysis/CrownOpacity.js +182 -0
  275. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts +10 -0
  276. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts.map +1 -0
  277. package/src/generation/foliage/analysis/crown_opacity_frames.js +132 -0
  278. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts +51 -0
  279. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts.map +1 -0
  280. package/src/generation/foliage/analysis/crown_opacity_measure.js +649 -0
  281. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts +66 -0
  282. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts.map +1 -0
  283. package/src/generation/foliage/analysis/foliage_measure_leaf_area.js +192 -0
  284. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts +27 -0
  285. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -0
  286. package/src/generation/foliage/analysis/tree_crown_opacity.js +58 -0
  287. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +3 -2
  288. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -1
  289. package/src/generation/foliage/animation/build_tree_wind_rig.js +12 -30
  290. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts +12 -0
  291. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts.map +1 -0
  292. package/src/generation/foliage/animation/tree_wind_bend_limit.js +13 -0
  293. package/src/generation/foliage/asset/TreeAsset.d.ts +5 -0
  294. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
  295. package/src/generation/foliage/asset/TreeAsset.js +6 -0
  296. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
  297. package/src/generation/foliage/asset/generate_tree.js +23 -6
  298. package/src/generation/foliage/config/{BranchLevelConfig.d.ts → BranchGeneratorConfig.d.ts} +61 -75
  299. package/src/generation/foliage/config/BranchGeneratorConfig.d.ts.map +1 -0
  300. package/src/generation/foliage/config/{BranchLevelConfig.js → BranchGeneratorConfig.js} +83 -126
  301. package/src/generation/foliage/config/BranchSpawnRule.d.ts +118 -0
  302. package/src/generation/foliage/config/BranchSpawnRule.d.ts.map +1 -0
  303. package/src/generation/foliage/config/BranchSpawnRule.js +217 -0
  304. package/src/generation/foliage/config/FoliageCardType.d.ts +1 -1
  305. package/src/generation/foliage/config/FoliageCardType.js +2 -2
  306. package/src/generation/foliage/config/FoliageConfig.d.ts +23 -45
  307. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -1
  308. package/src/generation/foliage/config/FoliageConfig.js +47 -93
  309. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +12 -20
  310. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
  311. package/src/generation/foliage/config/FoliageMaterialConfig.js +261 -279
  312. package/src/generation/foliage/config/FoliageSpawnRule.d.ts +77 -0
  313. package/src/generation/foliage/config/FoliageSpawnRule.d.ts.map +1 -0
  314. package/src/generation/foliage/config/FoliageSpawnRule.js +135 -0
  315. package/src/generation/foliage/config/FoliageTileContent.d.ts +9 -0
  316. package/src/generation/foliage/config/FoliageTileContent.d.ts.map +1 -0
  317. package/src/generation/foliage/config/FoliageTileContent.js +12 -0
  318. package/src/generation/foliage/config/LeafApexShape.d.ts +12 -0
  319. package/src/generation/foliage/config/LeafApexShape.d.ts.map +1 -0
  320. package/src/generation/foliage/config/LeafApexShape.js +17 -0
  321. package/src/generation/foliage/config/LeafArchitecture.d.ts +155 -0
  322. package/src/generation/foliage/config/LeafArchitecture.d.ts.map +1 -0
  323. package/src/generation/foliage/config/LeafArchitecture.js +288 -0
  324. package/src/generation/foliage/config/LeafBaseShape.d.ts +14 -0
  325. package/src/generation/foliage/config/LeafBaseShape.d.ts.map +1 -0
  326. package/src/generation/foliage/config/LeafBaseShape.js +21 -0
  327. package/src/generation/foliage/config/LeafLobation.d.ts +10 -0
  328. package/src/generation/foliage/config/LeafLobation.d.ts.map +1 -0
  329. package/src/generation/foliage/config/LeafLobation.js +14 -0
  330. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +11 -0
  331. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -1
  332. package/src/generation/foliage/config/PhyllotaxisMode.js +36 -0
  333. package/src/generation/foliage/config/ShootBudZone.d.ts +105 -0
  334. package/src/generation/foliage/config/ShootBudZone.d.ts.map +1 -0
  335. package/src/generation/foliage/config/ShootBudZone.js +219 -0
  336. package/src/generation/foliage/config/ShootGrowthConfig.d.ts +84 -0
  337. package/src/generation/foliage/config/ShootGrowthConfig.d.ts.map +1 -0
  338. package/src/generation/foliage/config/ShootGrowthConfig.js +146 -0
  339. package/src/generation/foliage/config/ShootSystemRule.d.ts +144 -0
  340. package/src/generation/foliage/config/ShootSystemRule.d.ts.map +1 -0
  341. package/src/generation/foliage/config/ShootSystemRule.js +316 -0
  342. package/src/generation/foliage/config/TreeLODConfig.d.ts +1 -1
  343. package/src/generation/foliage/config/TreeLODConfig.js +1 -1
  344. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +40 -8
  345. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -1
  346. package/src/generation/foliage/config/TreeSpeciesConfig.js +124 -68
  347. package/src/generation/foliage/config/TreeWindConfig.d.ts +23 -10
  348. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -1
  349. package/src/generation/foliage/config/TreeWindConfig.js +34 -25
  350. package/src/generation/foliage/index.d.ts +19 -2
  351. package/src/generation/foliage/index.js +63 -44
  352. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts +59 -0
  353. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts.map +1 -0
  354. package/src/generation/foliage/material/FoliageAtlasCutout.js +93 -0
  355. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts +26 -0
  356. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts.map +1 -0
  357. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.js +63 -0
  358. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts +34 -0
  359. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts.map +1 -0
  360. package/src/generation/foliage/material/foliage_atlas_cutout.js +174 -0
  361. package/src/generation/foliage/material/foliage_tile.d.ts +110 -0
  362. package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -0
  363. package/src/generation/foliage/material/foliage_tile.js +286 -0
  364. package/src/generation/foliage/material/leaf_geometry.d.ts +103 -0
  365. package/src/generation/foliage/material/leaf_geometry.d.ts.map +1 -0
  366. package/src/generation/foliage/material/leaf_geometry.js +528 -0
  367. package/src/generation/foliage/material/make_foliage_material.d.ts +13 -33
  368. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
  369. package/src/generation/foliage/material/make_foliage_material.js +356 -605
  370. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +39 -4
  371. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
  372. package/src/generation/foliage/mesh/foliage_collect_attachments.js +637 -569
  373. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts +48 -0
  374. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts.map +1 -0
  375. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.js +232 -0
  376. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  377. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1023 -1049
  378. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +9 -2
  379. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
  380. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +467 -454
  381. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  382. package/src/generation/foliage/presets/make_tree_species_preset.js +1648 -870
  383. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts +35 -0
  384. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts.map +1 -0
  385. package/src/generation/foliage/skeleton/ShootFrameworkHash.js +129 -0
  386. package/src/generation/foliage/skeleton/ShootGirth.d.ts +51 -0
  387. package/src/generation/foliage/skeleton/ShootGirth.d.ts.map +1 -0
  388. package/src/generation/foliage/skeleton/ShootGirth.js +212 -0
  389. package/src/generation/foliage/skeleton/ShootLightField.d.ts +73 -0
  390. package/src/generation/foliage/skeleton/ShootLightField.d.ts.map +1 -0
  391. package/src/generation/foliage/skeleton/ShootLightField.js +197 -0
  392. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +106 -3
  393. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
  394. package/src/generation/foliage/skeleton/TreeSkeleton.js +217 -39
  395. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts +13 -0
  396. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts.map +1 -0
  397. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.js +16 -0
  398. package/src/generation/foliage/skeleton/foliage_card_density.d.ts +71 -0
  399. package/src/generation/foliage/skeleton/foliage_card_density.d.ts.map +1 -0
  400. package/src/generation/foliage/skeleton/foliage_card_density.js +101 -0
  401. package/src/generation/foliage/skeleton/foliage_senescence.d.ts +101 -0
  402. package/src/generation/foliage/skeleton/foliage_senescence.d.ts.map +1 -0
  403. package/src/generation/foliage/skeleton/foliage_senescence.js +149 -0
  404. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts +76 -0
  405. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts.map +1 -0
  406. package/src/generation/foliage/skeleton/foliage_unit_cards.js +95 -0
  407. package/src/generation/foliage/skeleton/shoot_demography.d.ts +22 -0
  408. package/src/generation/foliage/skeleton/shoot_demography.d.ts.map +1 -0
  409. package/src/generation/foliage/skeleton/shoot_demography.js +96 -0
  410. package/src/generation/foliage/skeleton/shoot_geometry.d.ts +66 -0
  411. package/src/generation/foliage/skeleton/shoot_geometry.d.ts.map +1 -0
  412. package/src/generation/foliage/skeleton/shoot_geometry.js +109 -0
  413. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts +166 -0
  414. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts.map +1 -0
  415. package/src/generation/foliage/skeleton/shoot_systems_simulate.js +588 -0
  416. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +28 -12
  417. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -1
  418. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +137 -102
  419. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +112 -0
  420. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -0
  421. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +408 -0
  422. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
  423. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +208 -206
  424. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +5 -2
  425. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  426. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +2048 -1871
  427. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +17 -0
  428. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -0
  429. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +231 -0
  430. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts +14 -0
  431. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts.map +1 -0
  432. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.js +26 -0
  433. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts +10 -0
  434. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts.map +1 -0
  435. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.js +20 -0
  436. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
  437. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +4 -1
  438. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +1 -0
  439. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
  440. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +98 -86
  441. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +263 -0
  442. package/src/shade/descriptor/WebGPUExtensionType.d.ts +17 -0
  443. package/src/shade/descriptor/WebGPUExtensionType.d.ts.map +1 -1
  444. package/src/shade/descriptor/WebGPUExtensionType.js +31 -1
  445. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts +37 -0
  446. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts.map +1 -0
  447. package/src/shade/playground/foliage_wind/FoliageRigOverlay.js +491 -0
  448. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  449. package/src/shade/playground/foliage_wind/foliage_world.js +600 -602
  450. package/src/shade/playground/foliage_wind/index.html +6 -0
  451. package/src/shade/playground/foliage_wind/main.js +14 -0
  452. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  453. package/src/shade/renderer/animation/GPUAnimationManager.js +2 -1
  454. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +2 -1
  455. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -1
  456. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +2 -1
  457. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -1
  458. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +4 -2
  459. package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
  460. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  461. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +403 -401
  462. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +1 -62
  463. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
  464. package/src/shade/renderer/camera/OrbitalCameraController.js +1 -374
  465. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.d.ts.map +1 -1
  466. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.js +3 -0
  467. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.d.ts.map +1 -1
  468. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +6 -1
  469. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +1 -1
  470. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +2 -2
  471. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  472. package/src/shade/renderer/fluid/GPUFluidCascade.js +6 -3
  473. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +361 -0
  474. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  475. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +335 -241
  476. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
  477. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +108 -101
  478. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.d.ts.map +1 -1
  479. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.js +69 -67
  480. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +7 -6
  481. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
  482. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +341 -287
  483. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -4
  484. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  485. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +427 -400
  486. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts +10 -5
  487. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  488. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +532 -190
  489. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  490. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +231 -237
  491. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +2 -2
  492. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  493. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +282 -245
  494. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts +1 -3
  495. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts.map +1 -1
  496. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +139 -109
  497. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts +6 -6
  498. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts.map +1 -1
  499. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.js +257 -222
  500. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts +8 -7
  501. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts.map +1 -1
  502. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.js +119 -92
  503. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts +6 -9
  504. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts.map +1 -1
  505. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.js +229 -181
  506. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +17 -7
  507. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  508. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +634 -621
  509. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts +8 -6
  510. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts.map +1 -1
  511. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.js +166 -149
  512. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts +8 -6
  513. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts.map +1 -1
  514. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.js +219 -183
  515. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
  516. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +142 -122
  517. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +674 -663
  518. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +1 -1
  519. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  520. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +63 -29
  521. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  522. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +77 -87
  523. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.d.ts.map +1 -1
  524. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js +4 -3
  525. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +11 -11
  526. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  527. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +17 -19
  528. package/src/shade/renderer/global_illumination/lpv/graph_bake_irradiance_lookup_2d.js +4 -4
  529. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.d.ts.map +1 -1
  530. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.js +5 -1
  531. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  532. package/src/shade/renderer/loader/gltf/load_gltf.js +11 -35
  533. package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
  534. package/src/shade/renderer/loader/usd/load_usd.js +6 -19
  535. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  536. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +199 -193
  537. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
  538. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +151 -143
  539. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.d.ts.map +1 -1
  540. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.js +11 -5
  541. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  542. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +6 -18
  543. package/src/shade/renderer/postprocess/gtao/GTAO.js +1 -1
  544. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  545. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +3 -5
  546. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +1 -1
  547. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.d.ts.map +1 -1
  548. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.js +7 -3
  549. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  550. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +4 -2
  551. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  552. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +4 -1
  553. package/src/shade/renderer/postprocess/ssr/downsample_karis.d.ts.map +1 -1
  554. package/src/shade/renderer/postprocess/ssr/downsample_karis.js +6 -3
  555. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  556. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +4 -3
  557. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  558. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +4 -1
  559. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  560. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  561. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts.map +1 -1
  562. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.js +35 -39
  563. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.d.ts.map +1 -1
  564. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.js +20 -17
  565. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  566. package/src/shade/renderer/postprocess/taa/shader_taa.js +6 -3
  567. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  568. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -1
  569. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +1 -1
  570. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +2 -2
  571. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
  572. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -1
  573. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +92 -83
  574. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +1 -1
  575. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  576. package/src/shade/renderer/shader/ShaderDescriptor.js +12 -4
  577. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
  578. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +294 -286
  579. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_interpolate_probe_irradiance8.js +5 -5
  580. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.d.ts.map +1 -1
  581. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.js +5 -3
  582. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.d.ts.map +1 -1
  583. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.js +9 -6
  584. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.d.ts.map +1 -1
  585. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.js +33 -38
  586. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  587. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +690 -675
  588. package/src/shade/renderer/shader/type/WebGPUArray.d.ts +3 -0
  589. package/src/shade/renderer/shader/type/WebGPUArray.d.ts.map +1 -1
  590. package/src/shade/renderer/shader/type/WebGPUArray.js +185 -167
  591. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  592. package/src/shade/renderer/shader/type/WebGPUStruct.js +461 -455
  593. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  594. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +335 -211
  595. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.d.ts.map +1 -1
  596. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.js +329 -221
  597. package/src/shade/renderer/shader/type/type_has_f16.d.ts +12 -0
  598. package/src/shade/renderer/shader/type/type_has_f16.d.ts.map +1 -0
  599. package/src/shade/renderer/shader/type/type_has_f16.js +66 -0
  600. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  601. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +16 -2
  602. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  603. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +5 -2
  604. package/src/shade/renderer/water/shader_water_avboit.js +1 -1
  605. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  606. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +260 -23
  607. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts +6 -7
  608. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  609. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +269 -69
  610. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  611. package/src/shade/wgsl/validate_wgsl_source.js +27 -1
  612. package/src/view/controller/controls/ListController.d.ts.map +1 -1
  613. package/src/view/controller/controls/ListController.js +118 -113
  614. package/src/view/controller/controls/Vector1Control.js +97 -97
  615. package/src/view/elements/image/SvgImageView.d.ts +1 -0
  616. package/src/view/elements/image/SvgImageView.d.ts.map +1 -1
  617. package/src/view/elements/image/SvgImageView.js +92 -90
  618. package/src/view/minimap/dom/MinimapTerrainView.d.ts +1 -0
  619. package/src/view/minimap/dom/MinimapTerrainView.d.ts.map +1 -1
  620. package/src/view/minimap/dom/MinimapTerrainView.js +151 -147
  621. package/src/view/tooltip/gml/TooltipParser.js +2 -2
  622. package/src/engine/network/PriorityFetch.d.ts +0 -59
  623. package/src/engine/network/PriorityFetch.d.ts.map +0 -1
  624. package/src/engine/network/PriorityFetch.js +0 -193
  625. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +0 -1
@@ -1,401 +1,403 @@
1
- import { assert } from "../../../../../core/assert.js";
2
- import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
3
- import { BitSet } from "../../../../../core/binary/BitSet.js";
4
- import { platform_compute_endianness } from "../../../../../core/binary/platform_compute_endianness.js";
5
- import {
6
- u32_index_clear,
7
- u32_index_count,
8
- u32_index_get,
9
- u32_index_set,
10
- } from "../../../../../core/collection/map/u32_index.js";
11
- import { round_up } from "../../../../../core/math/round_up.js";
12
- import { KILOBYTE } from "../../../../../core/science/units/memory/KILOBYTE.js";
13
- import { write_wgsl_type_value } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
14
- import { u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
15
- import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
16
- import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
17
- import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
18
- import { ComputeShader } from "../../../shader/ComputeShader.js";
19
- import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
20
- import { inspect_gpu_buffer_typed } from "../../inspect_gpu_buffer_typed.js";
21
- import { GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE } from "../GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE.js";
22
-
23
- /**
24
- * @typedef {import("../../../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} PipelineEnquiry
25
- * @typedef {import("../../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} ShadeGPUCommandContext
26
- * @typedef {import("../../../shader/type/WebGPUType.js").WebGPUType} WebGPUType
27
- */
28
-
29
- const UPLOAD_BUFFER_LIMIT = 64 * KILOBYTE;
30
- const INITIAL_BUFFER_SIZE = 4 * KILOBYTE;
31
-
32
- const UPDATE_SETTINGS_STRUCT = WebGPUStruct.from({
33
- count: u32,
34
- record_size: u32,
35
- });
36
-
37
- const resources = new ShaderResourceSetDescriptor();
38
-
39
- // per-dispatch, eight bytes, read-only: immediate data rather than a uniform buffer, which cost a
40
- // transient buffer, a mapped staging buffer and a copyBufferToBuffer to carry two integers already
41
- // known on the CPU
42
- resources.setImmediate('settings', UPDATE_SETTINGS_STRUCT);
43
-
44
- resources.createGroup()
45
- .addStorageBuffer('upload_buffer', WebGPUArray.from(u32), false)
46
- .addStorageBuffer('destination', WebGPUArray.from(u32), true);
47
-
48
- const update_shader = ComputeShader.from({
49
- label: 'GPUSingleTypeTable.update',
50
- body: CodeChunk.from(
51
- //language=WGSL
52
- `
53
- @compute @workgroup_size(${GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE},1,1)
54
- fn main(@builtin(global_invocation_id) global_id : vec3<u32>){
55
- let buffer_index = global_id.x;
56
-
57
- if(buffer_index >= settings.count){
58
- return;
59
- }
60
-
61
- let upload_record_offset = buffer_index * ( settings.record_size + 1u );
62
-
63
- let element_id = upload_buffer[upload_record_offset];
64
-
65
- let read_offset = upload_record_offset + 1u;
66
- let write_offset = element_id * settings.record_size;
67
-
68
- // copy data
69
- for(var i = 0u; i < settings.record_size; i++){
70
- // TODO these is a race condition, if the buffer is updated while we are copying, we will overwrite the data
71
- destination[write_offset + i] = upload_buffer[read_offset + i];
72
- }
73
- }
74
- `
75
- ),
76
- resources
77
- });
78
-
79
- /**
80
- * Fully GPU-resident key-value dictionary. The keys are 32-bit unsigned integers.
81
- * @see {GPUDatabase}
82
- */
83
- export class GPUSingleTypeTable {
84
-
85
- /**
86
- * Offer the pipeline {@link update} uploads records with, one for every table — see
87
- * {@link PipelineEnquiry}.
88
- *
89
- * @param {PipelineEnquiry} enquiry
90
- */
91
- static enquirePipelines(enquiry) {
92
- enquiry.compute.push(update_shader.pipeline);
93
- }
94
-
95
- /**
96
- * @type {WebGPUType}
97
- * @readonly
98
- */
99
- type;
100
-
101
- /**
102
- * @type {GPUBuffer}
103
- * @readonly
104
- */
105
- buffer
106
-
107
- /**
108
- * @private
109
- * @type {BinaryBuffer}
110
- */
111
- upload_buffer = BinaryBuffer.fromEndianness(platform_compute_endianness());
112
-
113
- /**
114
- * @private
115
- * @type {BitSet}
116
- */
117
- occupancy = new BitSet();
118
-
119
- /**
120
- * Byte offset in {@link upload_buffer} of the record pending for an id, for every id that has
121
- * one.
122
- *
123
- * Every record is consumed by its own thread of a single {@link update} dispatch, so two
124
- * records aimed at one id are last-writer-wins across workgroups that have no ordering between
125
- * them — the buffer must therefore hold at most one record per id. This was a backwards scan
126
- * over the last 256 records, and a window is not a guarantee: a record further back than the
127
- * scan reached stayed queued alongside the one that replaced it. The sibling
128
- * {@link GPUTypedTable} was found doing exactly that, through a downstream report of corrupted
129
- * animation bindings.
130
- *
131
- * No consumer of this table has reached it — each writes an id once per frame — which is the
132
- * only reason it was latent rather than live here.
133
- *
134
- * `null` until the table takes its first write.
135
- *
136
- * @private
137
- * @type {Uint32Array|null}
138
- */
139
- #pending_records = null;
140
-
141
- /**
142
- * @type {GPUDevice}
143
- */
144
- #device
145
-
146
- /**
147
- *
148
- * @return {number} in bytes
149
- */
150
- get gpu_memory_usage() {
151
- return this.buffer.size;
152
- }
153
-
154
- /**
155
- *
156
- * @param {Object} options
157
- * @param {GPUDevice} options.device
158
- * @param {WebGPUType} options.type
159
- * @param {number} [options.initial_size] in bytes
160
- */
161
- constructor({
162
- device,
163
- type,
164
- initial_size = INITIAL_BUFFER_SIZE
165
- }) {
166
- assert.defined(device, 'device');
167
- assert.defined(type, 'type');
168
- assert.isNonNegativeInteger(initial_size, 'initial_size');
169
-
170
- this.#device = device;
171
- this.type = type;
172
-
173
- this.buffer = device.createBuffer({
174
- size: round_up(Math.max(1, initial_size), this.type.aligned_size),
175
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,
176
- mappedAtCreation: false
177
- });
178
-
179
- }
180
-
181
- /**
182
- *
183
- * @param {number} id
184
- */
185
- remove(id) {
186
- assert.isNonNegativeInteger(id, 'id');
187
-
188
- this.occupancy.set(id, false);
189
-
190
- // TODO zero out the slot?
191
- }
192
-
193
- /**
194
- * Get the next empty slot. Not reserved, use {@link set} to reserve.
195
- * @return {number}
196
- */
197
- next() {
198
- return this.occupancy.nextClearBit(0);
199
- }
200
-
201
- /**
202
- * @template T
203
- * @param {number} id
204
- * @param {T} value
205
- */
206
- set(id, value) {
207
- assert.isNonNegativeInteger(id, 'id');
208
-
209
- this.occupancy.set(id, true);
210
-
211
- const upload_buffer = this.upload_buffer;
212
-
213
- // records are laid out at fixed strides: [u32 id, value], rounded up
214
- const stride = this.type.aligned_size + u32.size;
215
- const tail = upload_buffer.position;
216
-
217
- // Dedupe against everything queued, not a window of it: each record is consumed by its own
218
- // thread in a single update dispatch, so two records for the same id would race
219
- // (last-writer-wins, non-deterministic). Overwrite the previous value in place.
220
- const pending_record = this.#pending_record_offset(id);
221
-
222
- if (pending_record >= 0) {
223
- upload_buffer.position = pending_record + u32.size;
224
-
225
- write_wgsl_type_value(value, upload_buffer, this.type);
226
-
227
- upload_buffer.position = tail;
228
-
229
- return;
230
- }
231
-
232
- // Reserve the whole stride up front. The writes below only reach the last field,
233
- // so on a type that pads out to `aligned_size` they would leave the buffer short
234
- // of the tail rounded up to below — and that tail is what `update` copies out to,
235
- // past the end of `data`.
236
- upload_buffer.ensureCapacity(tail + stride);
237
-
238
- upload_buffer.writeUint32(id);
239
- write_wgsl_type_value(value, upload_buffer, this.type);
240
-
241
- upload_buffer.position = round_up(upload_buffer.position, stride);
242
-
243
- this.#pending_records = u32_index_set(this.#pending_records, id, tail);
244
- }
245
-
246
- /**
247
- * Byte offset of the record already pending for an id, or -1. One record per id is the
248
- * invariant that keeps the update dispatch race-free — see {@link #pending_records}.
249
- *
250
- * Also where a stream dispatched since the last write gets noticed: {@link update} rewinds
251
- * {@link upload_buffer} by moving its position back to zero and tells nobody, so the index can
252
- * outlive the records it points at. {@link set} consults this before appending, which is what
253
- * the staleness check rests on.
254
- *
255
- * @private
256
- * @param {number} id
257
- * @returns {number} byte offset of the pending record, or -1
258
- */
259
- #pending_record_offset(id) {
260
- const pending = this.#pending_records;
261
-
262
- if (pending === null || u32_index_count(pending) === 0) {
263
- return -1;
264
- }
265
-
266
- if (this.upload_buffer.position === 0) {
267
- // the stream was dispatched and rewound since these were recorded
268
- u32_index_clear(pending);
269
-
270
- return -1;
271
- }
272
-
273
- return u32_index_get(pending, id);
274
- }
275
-
276
- /**
277
- * @template T
278
- * @param {number} id
279
- * @returns {T}
280
- */
281
- async get(id) {
282
- assert.isNonNegativeInteger(id, 'id');
283
-
284
- const type = this.type;
285
-
286
- const values = await inspect_gpu_buffer_typed({
287
- buffer: this.buffer,
288
- device: this.#device,
289
- type,
290
- offset: id * type.aligned_size,
291
- count: 1
292
- });
293
-
294
- return values[0];
295
- }
296
-
297
- /**
298
- *
299
- * @param {ShadeGPUCommandContext} encoder
300
- * @param {number} count
301
- */
302
- #update_capacity(encoder, count) {
303
- const existing_buffer = this.buffer;
304
- const alignment = this.type.aligned_size;
305
- const needed_size_bytes = count * alignment;
306
-
307
- if (existing_buffer.size >= needed_size_bytes) {
308
- // TODO shrink buffer when too small
309
- return;
310
- }
311
-
312
- const GROW_FACTOR = 1.25;
313
-
314
- const new_size = Math.max(
315
- needed_size_bytes,
316
- round_up(existing_buffer.size * GROW_FACTOR, alignment)
317
- );
318
-
319
- const new_buffer = this.#device.createBuffer({
320
- size: new_size,
321
- usage: existing_buffer.usage,
322
- mappedAtCreation: false
323
- });
324
-
325
- encoder.copyBufferToBuffer(existing_buffer, 0, new_buffer, 0, existing_buffer.size);
326
-
327
- encoder.onFinished.add(() => {
328
- existing_buffer.destroy();
329
- });
330
-
331
- this.buffer = new_buffer;
332
- }
333
-
334
- /**
335
- *
336
- * @param {ShadeGPUCommandContext} command_ctx
337
- */
338
- update(command_ctx) {
339
- assert.defined(command_ctx, 'command_ctx');
340
- assert.equal(command_ctx.isGPUCommandContext, true, 'command_ctx.isGPUCommandContext !== true');
341
-
342
-
343
- if (this.upload_buffer.position === 0) {
344
- // nothing to do
345
- return;
346
- }
347
-
348
- // resize the buffer if necessary.
349
- const min_capacity = this.occupancy.size();
350
- this.#update_capacity(command_ctx, min_capacity);
351
-
352
- // execute copy shader.
353
- const count = this.upload_buffer.position / (this.type.aligned_size + u32.size);
354
-
355
- assert.isNonNegativeInteger(count, 'count');
356
-
357
- // immediate data — a plain value written straight into the pass, not a buffer
358
- const settings = {
359
- count,
360
- record_size: this.type.aligned_size / u32.size,
361
- };
362
-
363
- const upload_buffer = command_ctx.allocateTransientBufferAndLoad(
364
- this.upload_buffer.data,
365
- GPUBufferUsage.STORAGE,
366
- 0,
367
- this.upload_buffer.position
368
- );
369
-
370
- update_shader.dispatchThreads({
371
- encoder: command_ctx,
372
- thread_count_x: count,
373
- bindings: {
374
- settings,
375
- upload_buffer,
376
- destination: this.buffer,
377
- }
378
- })
379
-
380
- // drop upload buffer
381
- this.upload_buffer.position = 0;
382
- if (this.upload_buffer.capacity > UPLOAD_BUFFER_LIMIT) {
383
- // release memory held by upload buffer
384
- this.upload_buffer.setCapacity(UPLOAD_BUFFER_LIMIT);
385
- }
386
- }
387
-
388
- async debug_dump() {
389
- return inspect_gpu_buffer_typed({
390
- buffer: this.buffer,
391
- device: this.#device,
392
- type: this.type,
393
- offset: 0,
394
- count: this.occupancy.size(),
395
- });
396
- }
397
-
398
- destroy() {
399
- this.buffer.destroy();
400
- }
401
- }
1
+ import { assert } from "../../../../../core/assert.js";
2
+ import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
3
+ import { BitSet } from "../../../../../core/binary/BitSet.js";
4
+ import { platform_compute_endianness } from "../../../../../core/binary/platform_compute_endianness.js";
5
+ import {
6
+ u32_index_clear,
7
+ u32_index_count,
8
+ u32_index_get,
9
+ u32_index_set,
10
+ } from "../../../../../core/collection/map/u32_index.js";
11
+ import { round_up } from "../../../../../core/math/round_up.js";
12
+ import { KILOBYTE } from "../../../../../core/science/units/memory/KILOBYTE.js";
13
+ import { write_wgsl_type_value } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
14
+ import { u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
15
+ import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
16
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
17
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
18
+ import { ComputeShader } from "../../../shader/ComputeShader.js";
19
+ import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
20
+ import { inspect_gpu_buffer_typed } from "../../inspect_gpu_buffer_typed.js";
21
+ import { GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE } from "../GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE.js";
22
+
23
+ /**
24
+ * @typedef {import("../../../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} PipelineEnquiry
25
+ * @typedef {import("../../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} ShadeGPUCommandContext
26
+ * @typedef {import("../../../shader/type/WebGPUType.js").WebGPUType} WebGPUType
27
+ */
28
+
29
+ const UPLOAD_BUFFER_LIMIT = 64 * KILOBYTE;
30
+ const INITIAL_BUFFER_SIZE = 4 * KILOBYTE;
31
+
32
+ const UPDATE_SETTINGS_STRUCT = WebGPUStruct.from({
33
+ count: u32,
34
+ record_size: u32,
35
+ });
36
+
37
+ const resources = new ShaderResourceSetDescriptor();
38
+
39
+ // per-dispatch, eight bytes, read-only: immediate data rather than a uniform buffer, which cost a
40
+ // transient buffer, a mapped staging buffer and a copyBufferToBuffer to carry two integers already
41
+ // known on the CPU
42
+ resources.setImmediate('settings', UPDATE_SETTINGS_STRUCT);
43
+
44
+ resources.createGroup()
45
+ .addStorageBuffer('upload_buffer', WebGPUArray.from(u32), false)
46
+ .addStorageBuffer('destination', WebGPUArray.from(u32), true);
47
+
48
+ const update_shader = ComputeShader.from({
49
+ label: 'GPUSingleTypeTable.update',
50
+ body: CodeChunk.from(
51
+ //language=WGSL
52
+ `
53
+ @compute @workgroup_size(${GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE},1,1)
54
+ fn main(@builtin(global_invocation_id) global_id : vec3<u32>){
55
+ let buffer_index = global_id.x;
56
+
57
+ if(buffer_index >= settings.count){
58
+ return;
59
+ }
60
+
61
+ let upload_record_offset = buffer_index * ( settings.record_size + 1u );
62
+
63
+ let element_id = upload_buffer[upload_record_offset];
64
+
65
+ let read_offset = upload_record_offset + 1u;
66
+ let write_offset = element_id * settings.record_size;
67
+
68
+ // copy data
69
+ for(var i = 0u; i < settings.record_size; i++){
70
+ // TODO these is a race condition, if the buffer is updated while we are copying, we will overwrite the data
71
+ destination[write_offset + i] = upload_buffer[read_offset + i];
72
+ }
73
+ }
74
+ `
75
+ ),
76
+ resources
77
+ });
78
+
79
+ /**
80
+ * Fully GPU-resident key-value dictionary. The keys are 32-bit unsigned integers.
81
+ * @see {GPUDatabase}
82
+ */
83
+ export class GPUSingleTypeTable {
84
+
85
+ /**
86
+ * Offer the pipeline {@link update} uploads records with, one for every table — see
87
+ * {@link PipelineEnquiry}.
88
+ *
89
+ * @param {PipelineEnquiry} enquiry
90
+ */
91
+ static enquirePipelines(enquiry) {
92
+ enquiry.compute.push(update_shader.pipeline);
93
+ }
94
+
95
+ /**
96
+ * @type {WebGPUType}
97
+ * @readonly
98
+ */
99
+ type;
100
+
101
+ /**
102
+ * @type {GPUBuffer}
103
+ * @readonly
104
+ */
105
+ buffer
106
+
107
+ /**
108
+ * @private
109
+ * @type {BinaryBuffer}
110
+ */
111
+ upload_buffer = BinaryBuffer.fromEndianness(platform_compute_endianness());
112
+
113
+ /**
114
+ * @private
115
+ * @type {BitSet}
116
+ */
117
+ occupancy = new BitSet();
118
+
119
+ /**
120
+ * Byte offset in {@link upload_buffer} of the record pending for an id, for every id that has
121
+ * one.
122
+ *
123
+ * Every record is consumed by its own thread of a single {@link update} dispatch, so two
124
+ * records aimed at one id are last-writer-wins across workgroups that have no ordering between
125
+ * them — the buffer must therefore hold at most one record per id. This was a backwards scan
126
+ * over the last 256 records, and a window is not a guarantee: a record further back than the
127
+ * scan reached stayed queued alongside the one that replaced it. The sibling
128
+ * {@link GPUTypedTable} was found doing exactly that, through a downstream report of corrupted
129
+ * animation bindings.
130
+ *
131
+ * No consumer of this table has reached it — each writes an id once per frame — which is the
132
+ * only reason it was latent rather than live here.
133
+ *
134
+ * `null` until the table takes its first write.
135
+ *
136
+ * @private
137
+ * @type {Uint32Array|null}
138
+ */
139
+ #pending_records = null;
140
+
141
+ /**
142
+ * @type {GPUDevice}
143
+ */
144
+ #device
145
+
146
+ /**
147
+ *
148
+ * @return {number} in bytes
149
+ */
150
+ get gpu_memory_usage() {
151
+ return this.buffer.size;
152
+ }
153
+
154
+ /**
155
+ *
156
+ * @param {Object} options
157
+ * @param {GPUDevice} options.device
158
+ * @param {WebGPUType} options.type
159
+ * @param {number} [options.initial_size] in bytes
160
+ */
161
+ constructor({
162
+ device,
163
+ type,
164
+ initial_size = INITIAL_BUFFER_SIZE
165
+ }) {
166
+ assert.defined(device, 'device');
167
+ assert.defined(type, 'type');
168
+ assert.isNonNegativeInteger(initial_size, 'initial_size');
169
+
170
+ this.#device = device;
171
+ this.type = type;
172
+
173
+ this.buffer = device.createBuffer({
174
+ size: round_up(Math.max(1, initial_size), this.type.aligned_size),
175
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,
176
+ mappedAtCreation: false
177
+ });
178
+
179
+ }
180
+
181
+ /**
182
+ *
183
+ * @param {number} id
184
+ */
185
+ remove(id) {
186
+ assert.isNonNegativeInteger(id, 'id');
187
+
188
+ this.occupancy.set(id, false);
189
+
190
+ // TODO zero out the slot?
191
+ }
192
+
193
+ /**
194
+ * Get the next empty slot. Not reserved, use {@link set} to reserve.
195
+ * @return {number}
196
+ */
197
+ next() {
198
+ return this.occupancy.nextClearBit(0);
199
+ }
200
+
201
+ /**
202
+ * @template T
203
+ * @param {number} id
204
+ * @param {T} value
205
+ */
206
+ set(id, value) {
207
+ assert.isNonNegativeInteger(id, 'id');
208
+
209
+ this.occupancy.set(id, true);
210
+
211
+ const upload_buffer = this.upload_buffer;
212
+
213
+ // records are laid out at fixed strides: [u32 id, value], rounded up
214
+ const stride = this.type.aligned_size + u32.size;
215
+ const tail = upload_buffer.position;
216
+
217
+ // Dedupe against everything queued, not a window of it: each record is consumed by its own
218
+ // thread in a single update dispatch, so two records for the same id would race
219
+ // (last-writer-wins, non-deterministic). Overwrite the previous value in place.
220
+ const pending_record = this.#pending_record_offset(id);
221
+
222
+ if (pending_record >= 0) {
223
+ upload_buffer.position = pending_record + u32.size;
224
+ new Uint8Array(upload_buffer.data, pending_record + u32.size, this.type.aligned_size).fill(0);
225
+
226
+ write_wgsl_type_value(value, upload_buffer, this.type);
227
+
228
+ upload_buffer.position = tail;
229
+
230
+ return;
231
+ }
232
+
233
+ // Reserve the whole stride up front. The writes below only reach the last field,
234
+ // so on a type that pads out to `aligned_size` they would leave the buffer short
235
+ // of the tail rounded up to below — and that tail is what `update` copies out to,
236
+ // past the end of `data`.
237
+ upload_buffer.ensureCapacity(tail + stride);
238
+
239
+ upload_buffer.writeUint32(id);
240
+ new Uint8Array(upload_buffer.data, tail + u32.size, this.type.aligned_size).fill(0);
241
+ write_wgsl_type_value(value, upload_buffer, this.type);
242
+
243
+ upload_buffer.position = tail + stride;
244
+
245
+ this.#pending_records = u32_index_set(this.#pending_records, id, tail);
246
+ }
247
+
248
+ /**
249
+ * Byte offset of the record already pending for an id, or -1. One record per id is the
250
+ * invariant that keeps the update dispatch race-free — see {@link #pending_records}.
251
+ *
252
+ * Also where a stream dispatched since the last write gets noticed: {@link update} rewinds
253
+ * {@link upload_buffer} by moving its position back to zero and tells nobody, so the index can
254
+ * outlive the records it points at. {@link set} consults this before appending, which is what
255
+ * the staleness check rests on.
256
+ *
257
+ * @private
258
+ * @param {number} id
259
+ * @returns {number} byte offset of the pending record, or -1
260
+ */
261
+ #pending_record_offset(id) {
262
+ const pending = this.#pending_records;
263
+
264
+ if (pending === null || u32_index_count(pending) === 0) {
265
+ return -1;
266
+ }
267
+
268
+ if (this.upload_buffer.position === 0) {
269
+ // the stream was dispatched and rewound since these were recorded
270
+ u32_index_clear(pending);
271
+
272
+ return -1;
273
+ }
274
+
275
+ return u32_index_get(pending, id);
276
+ }
277
+
278
+ /**
279
+ * @template T
280
+ * @param {number} id
281
+ * @returns {T}
282
+ */
283
+ async get(id) {
284
+ assert.isNonNegativeInteger(id, 'id');
285
+
286
+ const type = this.type;
287
+
288
+ const values = await inspect_gpu_buffer_typed({
289
+ buffer: this.buffer,
290
+ device: this.#device,
291
+ type,
292
+ offset: id * type.aligned_size,
293
+ count: 1
294
+ });
295
+
296
+ return values[0];
297
+ }
298
+
299
+ /**
300
+ *
301
+ * @param {ShadeGPUCommandContext} encoder
302
+ * @param {number} count
303
+ */
304
+ #update_capacity(encoder, count) {
305
+ const existing_buffer = this.buffer;
306
+ const alignment = this.type.aligned_size;
307
+ const needed_size_bytes = count * alignment;
308
+
309
+ if (existing_buffer.size >= needed_size_bytes) {
310
+ // TODO shrink buffer when too small
311
+ return;
312
+ }
313
+
314
+ const GROW_FACTOR = 1.25;
315
+
316
+ const new_size = Math.max(
317
+ needed_size_bytes,
318
+ round_up(existing_buffer.size * GROW_FACTOR, alignment)
319
+ );
320
+
321
+ const new_buffer = this.#device.createBuffer({
322
+ size: new_size,
323
+ usage: existing_buffer.usage,
324
+ mappedAtCreation: false
325
+ });
326
+
327
+ encoder.copyBufferToBuffer(existing_buffer, 0, new_buffer, 0, existing_buffer.size);
328
+
329
+ encoder.onFinished.add(() => {
330
+ existing_buffer.destroy();
331
+ });
332
+
333
+ this.buffer = new_buffer;
334
+ }
335
+
336
+ /**
337
+ *
338
+ * @param {ShadeGPUCommandContext} command_ctx
339
+ */
340
+ update(command_ctx) {
341
+ assert.defined(command_ctx, 'command_ctx');
342
+ assert.equal(command_ctx.isGPUCommandContext, true, 'command_ctx.isGPUCommandContext !== true');
343
+
344
+
345
+ if (this.upload_buffer.position === 0) {
346
+ // nothing to do
347
+ return;
348
+ }
349
+
350
+ // resize the buffer if necessary.
351
+ const min_capacity = this.occupancy.size();
352
+ this.#update_capacity(command_ctx, min_capacity);
353
+
354
+ // execute copy shader.
355
+ const count = this.upload_buffer.position / (this.type.aligned_size + u32.size);
356
+
357
+ assert.isNonNegativeInteger(count, 'count');
358
+
359
+ // immediate data — a plain value written straight into the pass, not a buffer
360
+ const settings = {
361
+ count,
362
+ record_size: this.type.aligned_size / u32.size,
363
+ };
364
+
365
+ const upload_buffer = command_ctx.allocateTransientBufferAndLoad(
366
+ this.upload_buffer.data,
367
+ GPUBufferUsage.STORAGE,
368
+ 0,
369
+ this.upload_buffer.position
370
+ );
371
+
372
+ update_shader.dispatchThreads({
373
+ encoder: command_ctx,
374
+ thread_count_x: count,
375
+ bindings: {
376
+ settings,
377
+ upload_buffer,
378
+ destination: this.buffer,
379
+ }
380
+ })
381
+
382
+ // drop upload buffer
383
+ this.upload_buffer.position = 0;
384
+ if (this.upload_buffer.capacity > UPLOAD_BUFFER_LIMIT) {
385
+ // release memory held by upload buffer
386
+ this.upload_buffer.setCapacity(UPLOAD_BUFFER_LIMIT);
387
+ }
388
+ }
389
+
390
+ async debug_dump() {
391
+ return inspect_gpu_buffer_typed({
392
+ buffer: this.buffer,
393
+ device: this.#device,
394
+ type: this.type,
395
+ offset: 0,
396
+ count: this.occupancy.size(),
397
+ });
398
+ }
399
+
400
+ destroy() {
401
+ this.buffer.destroy();
402
+ }
403
+ }