@woosh/meep-engine 3.55.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 (650) 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/ecs/transform/Transform64.d.ts +21 -0
  176. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  177. package/src/engine/ecs/transform/Transform64.js +26 -0
  178. package/src/engine/graphics/sh3/path_tracer/geometry/sort_triangles_by_distance_to_point.js +1 -1
  179. package/src/engine/graphics/texture/sampler/sampler2d_channel_compute_min_indices.js +1 -1
  180. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  181. package/src/engine/graphics3/WaterSystem.js +2 -1
  182. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -1
  183. package/src/engine/graphics3/prefab/prefab_skin_frame.js +1 -12
  184. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +1 -1
  185. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  186. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +141 -137
  187. package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
  188. package/src/engine/input/ecs/systems/InputControllerSystem.js +13 -3
  189. package/src/engine/input/ecs/systems/InputSystem.d.ts.map +1 -1
  190. package/src/engine/input/ecs/systems/InputSystem.js +2 -1
  191. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts +1 -1
  192. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts.map +1 -1
  193. package/src/engine/intelligence/behavior/composite/ParallelBehavior.js +4 -1
  194. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.d.ts.map +1 -1
  195. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.js +3 -1
  196. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.d.ts.map +1 -1
  197. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.js +3 -1
  198. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.d.ts.map +1 -1
  199. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.js +39 -33
  200. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts +5 -0
  201. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts.map +1 -1
  202. package/src/engine/intelligence/behavior/util/ConditionalBehavior.js +93 -75
  203. package/src/engine/intelligence/behavior/util/RotationBehavior.d.ts.map +1 -1
  204. package/src/engine/intelligence/behavior/util/RotationBehavior.js +79 -76
  205. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts +1 -0
  206. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts.map +1 -1
  207. package/src/engine/intelligence/blackboard/BlackboardStack.js +159 -123
  208. package/src/engine/intelligence/mcts/StateNode.d.ts.map +1 -1
  209. package/src/engine/intelligence/mcts/StateNode.js +366 -364
  210. package/src/engine/intelligence/resource/ResourceAllocationSolver.js +1 -1
  211. package/src/engine/navigation/ecs/components/Path.d.ts.map +1 -1
  212. package/src/engine/navigation/ecs/components/Path.js +2 -1
  213. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  214. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +5 -2
  215. package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
  216. package/src/engine/physics/body/SolverBodyState.js +2 -6
  217. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  218. package/src/engine/physics/ccd/linear_sweep.js +3 -16
  219. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  220. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +2 -16
  221. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +13 -1
  222. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  223. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +15 -4
  224. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  225. package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
  226. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts +12 -0
  227. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts.map +1 -0
  228. package/src/engine/physics/inertia/locked_inverse_inertia.js +22 -0
  229. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
  230. package/src/engine/physics/integration/integrate_velocity.js +3 -18
  231. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts +1 -0
  232. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
  233. package/src/engine/physics/mls-mpm/MLS_MPM.js +5 -4
  234. package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
  235. package/src/engine/physics/narrowphase/convex_decomposition.js +7 -16
  236. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  237. package/src/engine/physics/vehicle/RaycastVehicle.js +15 -5
  238. package/src/engine/save/StorageBackedList.d.ts +5 -0
  239. package/src/engine/save/StorageBackedList.d.ts.map +1 -1
  240. package/src/engine/save/StorageBackedList.js +161 -144
  241. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  242. package/src/engine/simulation/Ticker.js +394 -391
  243. package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts.map +1 -1
  244. package/src/engine/sound/simulation/probe/AcousticProbeField.js +6 -19
  245. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts +15 -0
  246. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts.map +1 -1
  247. package/src/engine/sound/simulation/probe/probe_edge_visible.js +59 -41
  248. package/src/engine/sound/simulation/probe/probe_refine_connectivity.d.ts.map +1 -1
  249. package/src/engine/sound/simulation/probe/probe_refine_connectivity.js +164 -181
  250. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts.map +1 -1
  251. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +20 -5
  252. package/src/format/image/avif/av1/decode/Av1FrameContext.d.ts.map +1 -1
  253. package/src/format/image/avif/av1/decode/Av1FrameContext.js +3 -10
  254. package/src/format/image/avif/av1/decode/reconstruct.d.ts +20 -0
  255. package/src/format/image/avif/av1/decode/reconstruct.d.ts.map +1 -1
  256. package/src/format/image/avif/av1/decode/reconstruct.js +22 -9
  257. package/src/format/image/avif/av1/encode/choose_restoration.js +2 -18
  258. package/src/format/image/avif/av1/encode/quantise.d.ts.map +1 -1
  259. package/src/format/image/avif/av1/encode/quantise.js +1 -55
  260. package/src/format/image/avif/av1/filter/loop_restoration.d.ts +9 -0
  261. package/src/format/image/avif/av1/filter/loop_restoration.d.ts.map +1 -1
  262. package/src/format/image/avif/av1/filter/loop_restoration.js +1 -1
  263. package/src/format/texture/basis/transcode/etc1s_to_bc7.js +2 -33
  264. package/src/format/texture/basis/transcode/fit_endpoints.d.ts +11 -0
  265. package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -1
  266. package/src/format/texture/basis/transcode/fit_endpoints.js +1 -1
  267. package/src/format/texture/basis/uastc/uastc_decode_block.d.ts.map +1 -1
  268. package/src/format/texture/basis/uastc/uastc_decode_block.js +2 -19
  269. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +220 -0
  270. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +172 -0
  271. package/src/generation/foliage/FOLIAGE_DESIGN.md +165 -15
  272. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +158 -0
  273. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +248 -0
  274. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +694 -0
  275. package/src/generation/foliage/analysis/CrownOpacity.d.ts +118 -0
  276. package/src/generation/foliage/analysis/CrownOpacity.d.ts.map +1 -0
  277. package/src/generation/foliage/analysis/CrownOpacity.js +182 -0
  278. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts +10 -0
  279. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts.map +1 -0
  280. package/src/generation/foliage/analysis/crown_opacity_frames.js +132 -0
  281. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts +51 -0
  282. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts.map +1 -0
  283. package/src/generation/foliage/analysis/crown_opacity_measure.js +649 -0
  284. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts +66 -0
  285. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts.map +1 -0
  286. package/src/generation/foliage/analysis/foliage_measure_leaf_area.js +192 -0
  287. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts +27 -0
  288. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -0
  289. package/src/generation/foliage/analysis/tree_crown_opacity.js +58 -0
  290. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +3 -2
  291. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -1
  292. package/src/generation/foliage/animation/build_tree_wind_rig.js +12 -30
  293. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts +12 -0
  294. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts.map +1 -0
  295. package/src/generation/foliage/animation/tree_wind_bend_limit.js +13 -0
  296. package/src/generation/foliage/asset/TreeAsset.d.ts +5 -0
  297. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
  298. package/src/generation/foliage/asset/TreeAsset.js +6 -0
  299. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
  300. package/src/generation/foliage/asset/generate_tree.js +23 -6
  301. package/src/generation/foliage/config/{BranchLevelConfig.d.ts → BranchGeneratorConfig.d.ts} +61 -75
  302. package/src/generation/foliage/config/BranchGeneratorConfig.d.ts.map +1 -0
  303. package/src/generation/foliage/config/{BranchLevelConfig.js → BranchGeneratorConfig.js} +83 -126
  304. package/src/generation/foliage/config/BranchSpawnRule.d.ts +118 -0
  305. package/src/generation/foliage/config/BranchSpawnRule.d.ts.map +1 -0
  306. package/src/generation/foliage/config/BranchSpawnRule.js +217 -0
  307. package/src/generation/foliage/config/FoliageCardType.d.ts +1 -1
  308. package/src/generation/foliage/config/FoliageCardType.js +2 -2
  309. package/src/generation/foliage/config/FoliageConfig.d.ts +23 -45
  310. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -1
  311. package/src/generation/foliage/config/FoliageConfig.js +47 -93
  312. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +12 -20
  313. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
  314. package/src/generation/foliage/config/FoliageMaterialConfig.js +261 -279
  315. package/src/generation/foliage/config/FoliageSpawnRule.d.ts +77 -0
  316. package/src/generation/foliage/config/FoliageSpawnRule.d.ts.map +1 -0
  317. package/src/generation/foliage/config/FoliageSpawnRule.js +135 -0
  318. package/src/generation/foliage/config/FoliageTileContent.d.ts +9 -0
  319. package/src/generation/foliage/config/FoliageTileContent.d.ts.map +1 -0
  320. package/src/generation/foliage/config/FoliageTileContent.js +12 -0
  321. package/src/generation/foliage/config/LeafApexShape.d.ts +12 -0
  322. package/src/generation/foliage/config/LeafApexShape.d.ts.map +1 -0
  323. package/src/generation/foliage/config/LeafApexShape.js +17 -0
  324. package/src/generation/foliage/config/LeafArchitecture.d.ts +155 -0
  325. package/src/generation/foliage/config/LeafArchitecture.d.ts.map +1 -0
  326. package/src/generation/foliage/config/LeafArchitecture.js +288 -0
  327. package/src/generation/foliage/config/LeafBaseShape.d.ts +14 -0
  328. package/src/generation/foliage/config/LeafBaseShape.d.ts.map +1 -0
  329. package/src/generation/foliage/config/LeafBaseShape.js +21 -0
  330. package/src/generation/foliage/config/LeafLobation.d.ts +10 -0
  331. package/src/generation/foliage/config/LeafLobation.d.ts.map +1 -0
  332. package/src/generation/foliage/config/LeafLobation.js +14 -0
  333. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +11 -0
  334. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -1
  335. package/src/generation/foliage/config/PhyllotaxisMode.js +36 -0
  336. package/src/generation/foliage/config/ShootBudZone.d.ts +105 -0
  337. package/src/generation/foliage/config/ShootBudZone.d.ts.map +1 -0
  338. package/src/generation/foliage/config/ShootBudZone.js +219 -0
  339. package/src/generation/foliage/config/ShootGrowthConfig.d.ts +84 -0
  340. package/src/generation/foliage/config/ShootGrowthConfig.d.ts.map +1 -0
  341. package/src/generation/foliage/config/ShootGrowthConfig.js +146 -0
  342. package/src/generation/foliage/config/ShootSystemRule.d.ts +144 -0
  343. package/src/generation/foliage/config/ShootSystemRule.d.ts.map +1 -0
  344. package/src/generation/foliage/config/ShootSystemRule.js +316 -0
  345. package/src/generation/foliage/config/TreeLODConfig.d.ts +1 -1
  346. package/src/generation/foliage/config/TreeLODConfig.js +1 -1
  347. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +40 -8
  348. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -1
  349. package/src/generation/foliage/config/TreeSpeciesConfig.js +124 -68
  350. package/src/generation/foliage/config/TreeWindConfig.d.ts +23 -10
  351. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -1
  352. package/src/generation/foliage/config/TreeWindConfig.js +34 -25
  353. package/src/generation/foliage/index.d.ts +19 -2
  354. package/src/generation/foliage/index.js +63 -44
  355. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts +59 -0
  356. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts.map +1 -0
  357. package/src/generation/foliage/material/FoliageAtlasCutout.js +93 -0
  358. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts +26 -0
  359. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts.map +1 -0
  360. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.js +63 -0
  361. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts +34 -0
  362. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts.map +1 -0
  363. package/src/generation/foliage/material/foliage_atlas_cutout.js +174 -0
  364. package/src/generation/foliage/material/foliage_tile.d.ts +110 -0
  365. package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -0
  366. package/src/generation/foliage/material/foliage_tile.js +286 -0
  367. package/src/generation/foliage/material/leaf_geometry.d.ts +103 -0
  368. package/src/generation/foliage/material/leaf_geometry.d.ts.map +1 -0
  369. package/src/generation/foliage/material/leaf_geometry.js +528 -0
  370. package/src/generation/foliage/material/make_foliage_material.d.ts +13 -33
  371. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
  372. package/src/generation/foliage/material/make_foliage_material.js +356 -605
  373. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +39 -4
  374. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
  375. package/src/generation/foliage/mesh/foliage_collect_attachments.js +637 -569
  376. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts +48 -0
  377. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts.map +1 -0
  378. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.js +232 -0
  379. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  380. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1023 -1049
  381. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +9 -2
  382. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
  383. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +467 -454
  384. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  385. package/src/generation/foliage/presets/make_tree_species_preset.js +1648 -870
  386. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts +35 -0
  387. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts.map +1 -0
  388. package/src/generation/foliage/skeleton/ShootFrameworkHash.js +129 -0
  389. package/src/generation/foliage/skeleton/ShootGirth.d.ts +51 -0
  390. package/src/generation/foliage/skeleton/ShootGirth.d.ts.map +1 -0
  391. package/src/generation/foliage/skeleton/ShootGirth.js +212 -0
  392. package/src/generation/foliage/skeleton/ShootLightField.d.ts +73 -0
  393. package/src/generation/foliage/skeleton/ShootLightField.d.ts.map +1 -0
  394. package/src/generation/foliage/skeleton/ShootLightField.js +197 -0
  395. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +106 -3
  396. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
  397. package/src/generation/foliage/skeleton/TreeSkeleton.js +217 -39
  398. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts +13 -0
  399. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts.map +1 -0
  400. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.js +16 -0
  401. package/src/generation/foliage/skeleton/foliage_card_density.d.ts +71 -0
  402. package/src/generation/foliage/skeleton/foliage_card_density.d.ts.map +1 -0
  403. package/src/generation/foliage/skeleton/foliage_card_density.js +101 -0
  404. package/src/generation/foliage/skeleton/foliage_senescence.d.ts +101 -0
  405. package/src/generation/foliage/skeleton/foliage_senescence.d.ts.map +1 -0
  406. package/src/generation/foliage/skeleton/foliage_senescence.js +149 -0
  407. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts +76 -0
  408. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts.map +1 -0
  409. package/src/generation/foliage/skeleton/foliage_unit_cards.js +95 -0
  410. package/src/generation/foliage/skeleton/shoot_demography.d.ts +22 -0
  411. package/src/generation/foliage/skeleton/shoot_demography.d.ts.map +1 -0
  412. package/src/generation/foliage/skeleton/shoot_demography.js +96 -0
  413. package/src/generation/foliage/skeleton/shoot_geometry.d.ts +66 -0
  414. package/src/generation/foliage/skeleton/shoot_geometry.d.ts.map +1 -0
  415. package/src/generation/foliage/skeleton/shoot_geometry.js +109 -0
  416. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts +166 -0
  417. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts.map +1 -0
  418. package/src/generation/foliage/skeleton/shoot_systems_simulate.js +588 -0
  419. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +28 -12
  420. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -1
  421. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +137 -102
  422. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +112 -0
  423. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -0
  424. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +408 -0
  425. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
  426. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +208 -206
  427. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +5 -2
  428. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  429. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +2048 -1871
  430. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +17 -0
  431. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -0
  432. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +231 -0
  433. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts +14 -0
  434. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts.map +1 -0
  435. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.js +26 -0
  436. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts +10 -0
  437. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts.map +1 -0
  438. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.js +20 -0
  439. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
  440. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +4 -1
  441. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +1 -0
  442. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
  443. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +98 -86
  444. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +263 -0
  445. package/src/shade/descriptor/WebGPUExtensionType.d.ts +17 -0
  446. package/src/shade/descriptor/WebGPUExtensionType.d.ts.map +1 -1
  447. package/src/shade/descriptor/WebGPUExtensionType.js +31 -1
  448. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts +37 -0
  449. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts.map +1 -0
  450. package/src/shade/playground/foliage_wind/FoliageRigOverlay.js +491 -0
  451. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  452. package/src/shade/playground/foliage_wind/foliage_world.js +600 -602
  453. package/src/shade/playground/foliage_wind/index.html +6 -0
  454. package/src/shade/playground/foliage_wind/main.js +14 -0
  455. package/src/shade/renderer/Renderer.d.ts +5 -0
  456. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  457. package/src/shade/renderer/Renderer.js +25 -2
  458. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  459. package/src/shade/renderer/animation/GPUAnimationManager.js +2 -1
  460. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +2 -1
  461. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -1
  462. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +2 -1
  463. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -1
  464. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +4 -2
  465. package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
  466. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  467. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +403 -401
  468. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +1 -62
  469. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
  470. package/src/shade/renderer/camera/OrbitalCameraController.js +1 -374
  471. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.d.ts.map +1 -1
  472. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.js +3 -0
  473. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.d.ts.map +1 -1
  474. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +6 -1
  475. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +1 -1
  476. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +2 -2
  477. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  478. package/src/shade/renderer/fluid/GPUFluidCascade.js +6 -3
  479. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +361 -0
  480. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  481. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +335 -241
  482. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
  483. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +108 -101
  484. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.d.ts.map +1 -1
  485. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.js +69 -67
  486. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +7 -6
  487. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
  488. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +341 -287
  489. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -4
  490. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  491. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +427 -400
  492. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts +10 -5
  493. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  494. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +532 -190
  495. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  496. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +231 -237
  497. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +2 -2
  498. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  499. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +282 -245
  500. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts +1 -3
  501. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts.map +1 -1
  502. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +139 -109
  503. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts +6 -6
  504. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts.map +1 -1
  505. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.js +257 -222
  506. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts +8 -7
  507. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts.map +1 -1
  508. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.js +119 -92
  509. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts +6 -9
  510. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts.map +1 -1
  511. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.js +229 -181
  512. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +17 -7
  513. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  514. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +634 -621
  515. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts +8 -6
  516. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts.map +1 -1
  517. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.js +166 -149
  518. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts +8 -6
  519. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts.map +1 -1
  520. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.js +219 -183
  521. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
  522. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +142 -122
  523. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +674 -663
  524. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +1 -1
  525. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  526. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +63 -29
  527. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  528. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +77 -87
  529. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.d.ts.map +1 -1
  530. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js +4 -3
  531. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +11 -11
  532. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  533. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +17 -19
  534. package/src/shade/renderer/global_illumination/lpv/graph_bake_irradiance_lookup_2d.js +4 -4
  535. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.d.ts.map +1 -1
  536. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.js +5 -1
  537. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  538. package/src/shade/renderer/loader/gltf/load_gltf.js +11 -35
  539. package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
  540. package/src/shade/renderer/loader/usd/load_usd.js +6 -19
  541. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +2 -1
  542. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  543. package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
  544. package/src/shade/renderer/particles/graph_particles_avboit.d.ts +2 -2
  545. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  546. package/src/shade/renderer/particles/graph_particles_avboit.js +4 -9
  547. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  548. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +199 -193
  549. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
  550. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +151 -143
  551. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.d.ts.map +1 -1
  552. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.js +11 -5
  553. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  554. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +6 -18
  555. package/src/shade/renderer/postprocess/gtao/GTAO.js +1 -1
  556. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  557. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +3 -5
  558. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +1 -1
  559. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  560. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.d.ts.map +1 -1
  561. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.js +7 -3
  562. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  563. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +4 -2
  564. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  565. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +4 -1
  566. package/src/shade/renderer/postprocess/ssr/downsample_karis.d.ts.map +1 -1
  567. package/src/shade/renderer/postprocess/ssr/downsample_karis.js +6 -3
  568. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  569. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +4 -3
  570. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  571. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +4 -1
  572. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  573. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  574. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts.map +1 -1
  575. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.js +35 -39
  576. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.d.ts.map +1 -1
  577. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.js +20 -17
  578. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  579. package/src/shade/renderer/postprocess/taa/shader_taa.js +6 -3
  580. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  581. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -1
  582. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +1 -1
  583. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +2 -2
  584. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
  585. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -1
  586. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +92 -83
  587. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +1 -1
  588. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  589. package/src/shade/renderer/shader/ShaderDescriptor.js +12 -4
  590. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
  591. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +294 -286
  592. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_interpolate_probe_irradiance8.js +5 -5
  593. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.d.ts.map +1 -1
  594. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.js +5 -3
  595. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.d.ts.map +1 -1
  596. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.js +9 -6
  597. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.d.ts.map +1 -1
  598. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.js +33 -38
  599. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  600. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +690 -675
  601. package/src/shade/renderer/shader/type/WebGPUArray.d.ts +3 -0
  602. package/src/shade/renderer/shader/type/WebGPUArray.d.ts.map +1 -1
  603. package/src/shade/renderer/shader/type/WebGPUArray.js +185 -167
  604. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  605. package/src/shade/renderer/shader/type/WebGPUStruct.js +461 -455
  606. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  607. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +335 -211
  608. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.d.ts.map +1 -1
  609. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.js +329 -221
  610. package/src/shade/renderer/shader/type/type_has_f16.d.ts +12 -0
  611. package/src/shade/renderer/shader/type/type_has_f16.d.ts.map +1 -0
  612. package/src/shade/renderer/shader/type/type_has_f16.js +66 -0
  613. package/src/shade/renderer/view/GPUViewContext.d.ts +0 -14
  614. package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
  615. package/src/shade/renderer/view/GPUViewContext.js +0 -29
  616. package/src/shade/renderer/view/ViewManager.d.ts +1 -1
  617. package/src/shade/renderer/view/ViewManager.js +1 -1
  618. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +40 -3
  619. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  620. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +660 -583
  621. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  622. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +16 -2
  623. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  624. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +5 -2
  625. package/src/shade/renderer/water/shader_water_avboit.js +1 -1
  626. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  627. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  628. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +260 -23
  629. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts +6 -7
  630. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  631. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +269 -69
  632. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  633. package/src/shade/wgsl/validate_wgsl_source.js +27 -1
  634. package/src/view/controller/controls/ListController.d.ts.map +1 -1
  635. package/src/view/controller/controls/ListController.js +118 -113
  636. package/src/view/controller/controls/Vector1Control.js +97 -97
  637. package/src/view/elements/image/SvgImageView.d.ts +1 -0
  638. package/src/view/elements/image/SvgImageView.d.ts.map +1 -1
  639. package/src/view/elements/image/SvgImageView.js +92 -90
  640. package/src/view/minimap/dom/MinimapTerrainView.d.ts +1 -0
  641. package/src/view/minimap/dom/MinimapTerrainView.d.ts.map +1 -1
  642. package/src/view/minimap/dom/MinimapTerrainView.js +151 -147
  643. package/src/view/tooltip/gml/TooltipParser.js +2 -2
  644. package/src/engine/network/PriorityFetch.d.ts +0 -59
  645. package/src/engine/network/PriorityFetch.d.ts.map +0 -1
  646. package/src/engine/network/PriorityFetch.js +0 -193
  647. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +0 -1
  648. package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.d.ts +0 -2
  649. package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.d.ts.map +0 -1
  650. package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AcousticProbeField.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/AcousticProbeField.js"],"names":[],"mappings":"AAmCA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAmDI;;OAEG;IACH,mBAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;;OAIG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;;OAIG;IACH,kBAHW,MAAM,GACJ,MAAM,CAIlB;IAwBD;;;;;;;;;OASG;IACH,wBALW,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,QAsBhB;IAED;;;;;;;;OAQG;IACH,2BALW,MAAM,OACN,MAAM,OACN,MAAM,QACN,MAAM,QAShB;IAED;;;;;;;OAOG;IACH,gCAHW,MAAM,cACN,YAAY,GAAC,MAAM,EAAE,QAS/B;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;OAKG;IACH,cAJW,MAAM,QACN,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,mBAJW,MAAM,QACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAS/B;IAED;;;;OAIG;IACH,eAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,gBALW,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;;;;;;;OAaG;IACH,uBANW,MAAM,KACN,MAAM,KACN,MAAM,yCAEJ,MAAM,CAyBlB;IAED;;;;;;;;;;;;;;;OAeG;IACH,2BARW,MAAM,EAAE,GAAC,WAAW,iBACpB,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,UACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;OAOG;IACH,iBALW,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;OAOG;IACH,iBALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAe/B;IAED;;;;;;;OAOG;IACH,sBALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAkB/B;IAmCD;;;;;;OAMG;IACH,0CAEC;IAED;;;;;;OAMG;IACH,kBAHW,WAAW,QACX,YAAY,QAKtB;IAED;;;;;;;;;;;;OAYG;IACH,mBATW,YAAY,GAAC,MAAM,EAAE,KACrB,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QAQhB;IAED;;;;;;;OAOG;IACH,mBAJW,MAAM,MACN,MAAM,GACJ,MAAM,EAAE,GAAC,IAAI,CAQzB;IAED;;;;;;;;MA0BC;IAED;;;;OAIG;IACH,eAFW;QAAC,MAAM,EAAC;YAAC,CAAC,EAAC,MAAM,CAAC;YAAA,CAAC,EAAC,MAAM,CAAC;YAAA,CAAC,EAAC,MAAM,CAAC;YAAA,WAAW,EAAC,MAAM,EAAE,CAAC;YAAA,eAAe,EAAC,MAAM,EAAE,CAAA;SAAC,EAAE,CAAA;KAAC,QAoB/F;;CACJ"}
1
+ {"version":3,"file":"AcousticProbeField.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/AcousticProbeField.js"],"names":[],"mappings":"AAgCA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAmDI;;OAEG;IACH,mBAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;;OAIG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;;OAIG;IACH,kBAHW,MAAM,GACJ,MAAM,CAIlB;IAwBD;;;;;;;;;OASG;IACH,wBALW,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,QAsBhB;IAED;;;;;;;;OAQG;IACH,2BALW,MAAM,OACN,MAAM,OACN,MAAM,QACN,MAAM,QAShB;IAED;;;;;;;OAOG;IACH,gCAHW,MAAM,cACN,YAAY,GAAC,MAAM,EAAE,QAS/B;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;OAKG;IACH,cAJW,MAAM,QACN,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,mBAJW,MAAM,QACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAS/B;IAED;;;;OAIG;IACH,eAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,gBALW,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;;;;;;;OAaG;IACH,uBANW,MAAM,KACN,MAAM,KACN,MAAM,yCAEJ,MAAM,CAelB;IAED;;;;;;;;;;;;;;;OAeG;IACH,2BARW,MAAM,EAAE,GAAC,WAAW,iBACpB,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,UACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;OAOG;IACH,iBALW,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;OAOG;IACH,iBALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAe/B;IAED;;;;;;;OAOG;IACH,sBALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAkB/B;IAmCD;;;;;;OAMG;IACH,0CAEC;IAED;;;;;;OAMG;IACH,kBAHW,WAAW,QACX,YAAY,QAKtB;IAED;;;;;;;;;;;;OAYG;IACH,mBATW,YAAY,GAAC,MAAM,EAAE,KACrB,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QAQhB;IAED;;;;;;;OAOG;IACH,mBAJW,MAAM,MACN,MAAM,GACJ,MAAM,EAAE,GAAC,IAAI,CAQzB;IAED;;;;;;;;MA0BC;IAED;;;;OAIG;IACH,eAFW;QAAC,MAAM,EAAC;YAAC,CAAC,EAAC,MAAM,CAAC;YAAA,CAAC,EAAC,MAAM,CAAC;YAAA,CAAC,EAAC,MAAM,CAAC;YAAA,WAAW,EAAC,MAAM,EAAE,CAAC;YAAA,eAAe,EAAC,MAAM,EAAE,CAAA;SAAC,EAAE,CAAA;KAAC,QAoB/F;;CACJ"}
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  bvh_query_user_data_nearest_to_point_filtered
10
10
  } from "../../../../core/bvh2/bvh3/query/bvh_query_user_data_nearest_to_point_filtered.js";
11
- import { Ray3 } from "../../../../core/geom/3d/ray/Ray3.js";
11
+ import { probe_segment_visible } from "./probe_edge_visible.js";
12
12
  import { csr_graph_find_shortest_path } from "../../../../core/graph/csr/csr_graph_find_shortest_path.js";
13
13
  import { acoustic_probe_transfer, LOBE_STRIDE } from "./acoustic_probe_transfer.js";
14
14
 
@@ -30,9 +30,6 @@ const DEFAULT_CAPACITY = 8;
30
30
  // module scratch for a point-leaf AABB during BVH build
31
31
  const LEAF_BOUNDS = new Float32Array(6);
32
32
 
33
- // module scratch — the query→probe line-of-sight ray for nearestVisibleIndex
34
- const VISIBILITY_RAY = new Ray3();
35
-
36
33
  /**
37
34
  * The baked probe volume: the set of acoustic probes covering a scene, plus the connectivity between them.
38
35
  * Carries everything an offline bake produces about the field and everything the runtime reads back from
@@ -327,21 +324,11 @@ export class AcousticProbeField {
327
324
 
328
325
  return bvh_query_user_data_nearest_to_point_filtered(this.#bvh, x, y, z, (probeIndex) => {
329
326
  const base = probeIndex * STRIDE;
330
- const dx = data[base + OFFSET_X] - x;
331
- const dy = data[base + OFFSET_Y] - y;
332
- const dz = data[base + OFFSET_Z] - z;
333
-
334
- const d = Math.sqrt(dx * dx + dy * dy + dz * dz);
335
- if (d === 0) {
336
- return true; // the query point coincides with the probe — trivially visible
337
- }
338
-
339
- const inv = 1 / d;
340
- VISIBILITY_RAY.setOrigin(x, y, z);
341
- VISIBILITY_RAY.setDirection(dx * inv, dy * inv, dz * inv);
342
- VISIBILITY_RAY.tMax = d;
343
-
344
- return !occluderIndex.anyHit(VISIBILITY_RAY);
327
+ return probe_segment_visible(
328
+ occluderIndex,
329
+ x, y, z,
330
+ data[base + OFFSET_X], data[base + OFFSET_Y], data[base + OFFSET_Z]
331
+ );
345
332
  });
346
333
  }
347
334
 
@@ -1,3 +1,18 @@
1
+ /**
2
+ * Whether points `(ax, ay, az)` and `(bx, by, bz)` have clear line of sight in `index` — a single shadow ray
3
+ * along the segment between them, true if no occluder blocks it. Coincident points are trivially visible.
4
+ * Allocation-free; no WebAudio.
5
+ *
6
+ * @param {AcousticOccluderIndex} index
7
+ * @param {number} ax
8
+ * @param {number} ay
9
+ * @param {number} az
10
+ * @param {number} bx
11
+ * @param {number} by
12
+ * @param {number} bz
13
+ * @returns {boolean}
14
+ */
15
+ export function probe_segment_visible(index: AcousticOccluderIndex, ax: number, ay: number, az: number, bx: number, by: number, bz: number): boolean;
1
16
  /**
2
17
  * Whether probes `a` and `b` have clear line of sight in the current `index` — a single shadow ray along the
3
18
  * segment between them, true if no occluder blocks it. This is the one visibility test shared by the offline
@@ -1 +1 @@
1
- {"version":3,"file":"probe_edge_visible.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/probe_edge_visible.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;GAaG;AACH,oGAJW,MAAM,KACN,MAAM,GACJ,OAAO,CAuBnB"}
1
+ {"version":3,"file":"probe_edge_visible.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/probe_edge_visible.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;GAaG;AACH,wEARW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,OAAO,CAmBnB;AAED;;;;;;;;;;;;;GAaG;AACH,oGAJW,MAAM,KACN,MAAM,GACJ,OAAO,CAQnB"}
@@ -1,41 +1,59 @@
1
- import { Ray3 } from "../../../../core/geom/3d/ray/Ray3.js";
2
-
3
- // module-static scratch — the shadow ray between two probes (allocation-free)
4
- const RAY = new Ray3();
5
-
6
- /**
7
- * Whether probes `a` and `b` have clear line of sight in the current `index` — a single shadow ray along the
8
- * segment between them, true if no occluder blocks it. This is the one visibility test shared by the offline
9
- * bake ({@link bakeVisibility}) and the runtime {@link ProbeVisibilityRecheck}, so they agree exactly.
10
- * Coincident probes are trivially "visible" (a zero-length segment blocks nothing). Allocation-free; no
11
- * WebAudio.
12
- *
13
- * @param {AcousticProbeField} probeField
14
- * @param {AcousticOccluderIndex} index the acoustic scene (live geometry — a door that has since closed will
15
- * block the ray even though the baked graph still has the edge)
16
- * @param {number} a probe index
17
- * @param {number} b probe index
18
- * @returns {boolean}
19
- */
20
- export function probe_edge_visible(probeField, index, a, b) {
21
- const ax = probeField.probeX(a);
22
- const ay = probeField.probeY(a);
23
- const az = probeField.probeZ(a);
24
-
25
- const dx = probeField.probeX(b) - ax;
26
- const dy = probeField.probeY(b) - ay;
27
- const dz = probeField.probeZ(b) - az;
28
-
29
- const distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
30
-
31
- if (distance === 0) {
32
- return true;
33
- }
34
-
35
- const inv = 1 / distance;
36
- RAY.setOrigin(ax, ay, az);
37
- RAY.setDirection(dx * inv, dy * inv, dz * inv);
38
- RAY.tMax = distance;
39
-
40
- return !index.anyHit(RAY);
41
- }
1
+ import { Ray3 } from "../../../../core/geom/3d/ray/Ray3.js";
2
+
3
+ // module-static scratch — the shadow ray between two points (allocation-free)
4
+ const RAY = new Ray3();
5
+
6
+ /**
7
+ * Whether points `(ax, ay, az)` and `(bx, by, bz)` have clear line of sight in `index` — a single shadow ray
8
+ * along the segment between them, true if no occluder blocks it. Coincident points are trivially visible.
9
+ * Allocation-free; no WebAudio.
10
+ *
11
+ * @param {AcousticOccluderIndex} index
12
+ * @param {number} ax
13
+ * @param {number} ay
14
+ * @param {number} az
15
+ * @param {number} bx
16
+ * @param {number} by
17
+ * @param {number} bz
18
+ * @returns {boolean}
19
+ */
20
+ export function probe_segment_visible(index, ax, ay, az, bx, by, bz) {
21
+ const dx = bx - ax;
22
+ const dy = by - ay;
23
+ const dz = bz - az;
24
+
25
+ const distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
26
+
27
+ if (distance === 0) {
28
+ return true;
29
+ }
30
+
31
+ const inv = 1 / distance;
32
+ RAY.setOrigin(ax, ay, az);
33
+ RAY.setDirection(dx * inv, dy * inv, dz * inv);
34
+ RAY.tMax = distance;
35
+
36
+ return !index.anyHit(RAY);
37
+ }
38
+
39
+ /**
40
+ * Whether probes `a` and `b` have clear line of sight in the current `index` — a single shadow ray along the
41
+ * segment between them, true if no occluder blocks it. This is the one visibility test shared by the offline
42
+ * bake ({@link bakeVisibility}) and the runtime {@link ProbeVisibilityRecheck}, so they agree exactly.
43
+ * Coincident probes are trivially "visible" (a zero-length segment blocks nothing). Allocation-free; no
44
+ * WebAudio.
45
+ *
46
+ * @param {AcousticProbeField} probeField
47
+ * @param {AcousticOccluderIndex} index the acoustic scene (live geometry — a door that has since closed will
48
+ * block the ray even though the baked graph still has the edge)
49
+ * @param {number} a probe index
50
+ * @param {number} b probe index
51
+ * @returns {boolean}
52
+ */
53
+ export function probe_edge_visible(probeField, index, a, b) {
54
+ return probe_segment_visible(
55
+ index,
56
+ probeField.probeX(a), probeField.probeY(a), probeField.probeZ(a),
57
+ probeField.probeX(b), probeField.probeY(b), probeField.probeZ(b)
58
+ );
59
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"probe_refine_connectivity.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/probe_refine_connectivity.js"],"names":[],"mappings":"AAmBA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,+GAJW,MAAM,YACN;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAC,GACtD,MAAM,EAAE,CAiDpB"}
1
+ {"version":3,"file":"probe_refine_connectivity.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/probe_refine_connectivity.js"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,+GAJW,MAAM,YACN;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAC,GACtD,MAAM,EAAE,CAiDpB"}
@@ -1,181 +1,164 @@
1
- import { uf_find, uf_init, uf_union } from "../../../../core/collection/union-find/union_find.js";
2
- import { Ray3 } from "../../../../core/geom/3d/ray/Ray3.js";
3
- import { sphere_fibonacci_point } from "../../../../core/geom/3d/sphere/sphere_fibonacci_point.js";
4
-
5
- // Connectivity refinement may place probes finer than the spacing hint, down to minSpacing / this factor.
6
- const DEFAULT_MAX_REFINE_FACTOR = 4;
7
- // Two components are candidates to thread only if probes come within this multiple of minSpacing — beyond it
8
- // we assume they're genuinely sealed (a closed wall, not a bend). Also the SDF / waypoint search radius.
9
- const DEFAULT_CORRIDOR_REACH_FACTOR = 4;
10
- // Per-step waypoint search: directions on a Fibonacci sphere × these fractions of the segment length.
11
- const SAMPLE_DIRECTIONS = 24;
12
- const SAMPLE_RADII = [0.5, 0.25, 0.125];
13
- // Bound the greedy walk so a hopeless gap can't recurse forever.
14
- const MAX_THREAD_DEPTH = 12;
15
-
16
- // module-static scratch
17
- const RAY = new Ray3();
18
- const DIR = [0, 0, 0];
19
-
20
- /**
21
- * Connectivity refinement — the acoustic stage the reference GI placer lacks. After the SDF cover + a
22
- * provisional {@link bakeVisibility}, the graph may have islands a bend/throat separates even though sound
23
- * routes between them: `bakeVisibility` only links probes with STRAIGHT line of sight, so a corridor that
24
- * bends sharper than the cover's spacing leaves its two ends in different components. This inserts the
25
- * minimum extra probes so a chain of mutually-visible probes spans every such path — "ray bounces between
26
- * probes", as a bounded greedy walk through open air.
27
- *
28
- * For each pair of nearby components (within `corridorReachFactor · minSpacing`), it walks from one side
29
- * toward the other: at each step it samples open-air waypoints around the segment (a Fibonacci sphere × a
30
- * few radii), keeps those visible from the current point, and steps to the one nearest the target — until a
31
- * waypoint sees the target (chain complete) or no progress is possible (give up — a genuinely sealed wall
32
- * stays disconnected, correctly). It never subdivides below `minSpacing / maxRefineFactor`. The waypoints
33
- * are returned for the caller to append; the FINAL `bakeVisibility` then links them.
34
- *
35
- * @param {AcousticOccluderIndex} index the acoustic scene
36
- * @param {AcousticProbeField} field cover probes WITH a baked visibility graph (defines the components)
37
- * @param {number} minSpacing the placement spacing hint
38
- * @param {{maxRefineFactor?: number, corridorReachFactor?: number}} [options]
39
- * @returns {number[]} flat extra probe positions `[x,y,z, …]` (possibly empty)
40
- */
41
- export function probe_refine_connectivity(index, field, minSpacing, options = {}) {
42
- const maxRefineFactor = options.maxRefineFactor ?? DEFAULT_MAX_REFINE_FACTOR;
43
- const reach = (options.corridorReachFactor ?? DEFAULT_CORRIDOR_REACH_FACTOR) * minSpacing;
44
- const floor = minSpacing / maxRefineFactor;
45
-
46
- const n = field.size;
47
- const graph = field.visibilityGraph;
48
-
49
- // connected components of the provisional visibility graph
50
- const parent = new Uint32Array(n);
51
- uf_init(parent, n);
52
- for (let v = 0; v < n; v++) {
53
- for (let k = graph.edge_addresses[v]; k < graph.edge_addresses[v + 1]; k++) {
54
- uf_union(parent, v, graph.adjacency[k]);
55
- }
56
- }
57
-
58
- const waypoints = [];
59
- const hits = [];
60
-
61
- for (let i = 0; i < n; i++) {
62
- const ix = field.probeX(i), iy = field.probeY(i), iz = field.probeZ(i);
63
-
64
- const count = field.probesWithinRadius(hits, 0, ix, iy, iz, reach);
65
-
66
- for (let h = 0; h < count; h++) {
67
- const j = hits[h];
68
- if (j <= i) {
69
- continue;
70
- }
71
- // re-read roots each time — an earlier successful thread may have merged these components, directly
72
- // or transitively (so we don't thread a redundant chain across 3+ mutually-near components)
73
- if (uf_find(parent, i) === uf_find(parent, j)) {
74
- continue;
75
- }
76
-
77
- const chain = thread(index, ix, iy, iz, field.probeX(j), field.probeY(j), field.probeZ(j), floor, reach, 0);
78
- if (chain !== null) {
79
- uf_union(parent, i, j); // merge → later pairs across these now-connected components are skipped
80
- for (let w = 0; w < chain.length; w++) {
81
- waypoints.push(chain[w]);
82
- }
83
- }
84
- }
85
- }
86
-
87
- return waypoints;
88
- }
89
-
90
- /**
91
- * Greedily walk from (ax,ay,az) toward (bx,by,bz) through open air, inserting waypoints, until a waypoint
92
- * sees the target. Returns the flat waypoint list `[x,y,z, …]`, or `null` if no open chain was found.
93
- */
94
- function thread(index, ax, ay, az, bx, by, bz, floor, reach, depth) {
95
- if (segment_clear(index, ax, ay, az, bx, by, bz)) {
96
- return []; // already mutually visible
97
- }
98
- if (depth >= MAX_THREAD_DEPTH) {
99
- return null;
100
- }
101
-
102
- const w = open_waypoint_toward_target(index, ax, ay, az, bx, by, bz, reach);
103
- if (w === null) {
104
- return null; // no visible open point makes progress → sealed
105
- }
106
-
107
- const dx = w[0] - ax, dy = w[1] - ay, dz = w[2] - az;
108
- if (Math.sqrt(dx * dx + dy * dy + dz * dz) < floor) {
109
- return null; // would need probes finer than the refine floor
110
- }
111
-
112
- const rest = thread(index, w[0], w[1], w[2], bx, by, bz, floor, reach, depth + 1);
113
- if (rest === null) {
114
- return null;
115
- }
116
-
117
- return [w[0], w[1], w[2], ...rest];
118
- }
119
-
120
- /**
121
- * Among open-air points sampled around the (a→b) segment that are VISIBLE from `a`, return the one nearest
122
- * `b` that makes progress (closer to `b` than `a` is), or `null`. Sampled on a Fibonacci sphere around the
123
- * segment midpoint at a few fractions of the segment length, so both perpendicular detours (over a baffle)
124
- * and along-segment steps are covered.
125
- * @returns {number[]|null} `[x,y,z]` or null
126
- */
127
- function open_waypoint_toward_target(index, ax, ay, az, bx, by, bz, reach) {
128
- const mx = (ax + bx) * 0.5, my = (ay + by) * 0.5, mz = (az + bz) * 0.5;
129
- const segLen = Math.sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay) + (bz - az) * (bz - az));
130
-
131
- let best = null;
132
- // must improve on a's own distance to b (strict progress → the walk terminates)
133
- let bestDistB = Math.sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay) + (bz - az) * (bz - az));
134
-
135
- for (let d = 0; d < SAMPLE_DIRECTIONS; d++) {
136
- sphere_fibonacci_point(DIR, 0, d, SAMPLE_DIRECTIONS);
137
-
138
- for (let r = 0; r < SAMPLE_RADII.length; r++) {
139
- const radius = segLen * SAMPLE_RADII[r];
140
- const sx = mx + DIR[0] * radius;
141
- const sy = my + DIR[1] * radius;
142
- const sz = mz + DIR[2] * radius;
143
-
144
- // must be in open air (clearance > a small margin so the reverb bake + visibility are valid)
145
- if (index.signedDistanceAt(sx, sy, sz, reach) <= 1e-3) {
146
- continue;
147
- }
148
-
149
- const distB = Math.sqrt((bx - sx) * (bx - sx) + (by - sy) * (by - sy) + (bz - sz) * (bz - sz));
150
- if (distB >= bestDistB) {
151
- continue; // no progress toward b
152
- }
153
-
154
- if (!segment_clear(index, ax, ay, az, sx, sy, sz)) {
155
- continue; // a can't see this waypoint
156
- }
157
-
158
- bestDistB = distB;
159
- best = best === null ? [sx, sy, sz] : best;
160
- best[0] = sx; best[1] = sy; best[2] = sz;
161
- }
162
- }
163
-
164
- return best;
165
- }
166
-
167
- /** Whether the open segment a→b is clear of occluders (one shadow ray; mirrors probe_edge_visible). */
168
- function segment_clear(index, ax, ay, az, bx, by, bz) {
169
- const dx = bx - ax, dy = by - ay, dz = bz - az;
170
- const d = Math.sqrt(dx * dx + dy * dy + dz * dz);
171
- if (d === 0) {
172
- return true;
173
- }
174
-
175
- const inv = 1 / d;
176
- RAY.setOrigin(ax, ay, az);
177
- RAY.setDirection(dx * inv, dy * inv, dz * inv);
178
- RAY.tMax = d;
179
-
180
- return !index.anyHit(RAY);
181
- }
1
+ import { uf_find, uf_init, uf_union } from "../../../../core/collection/union-find/union_find.js";
2
+ import { sphere_fibonacci_point } from "../../../../core/geom/3d/sphere/sphere_fibonacci_point.js";
3
+ import { probe_segment_visible } from "./probe_edge_visible.js";
4
+
5
+ // Connectivity refinement may place probes finer than the spacing hint, down to minSpacing / this factor.
6
+ const DEFAULT_MAX_REFINE_FACTOR = 4;
7
+ // Two components are candidates to thread only if probes come within this multiple of minSpacing — beyond it
8
+ // we assume they're genuinely sealed (a closed wall, not a bend). Also the SDF / waypoint search radius.
9
+ const DEFAULT_CORRIDOR_REACH_FACTOR = 4;
10
+ // Per-step waypoint search: directions on a Fibonacci sphere × these fractions of the segment length.
11
+ const SAMPLE_DIRECTIONS = 24;
12
+ const SAMPLE_RADII = [0.5, 0.25, 0.125];
13
+ // Bound the greedy walk so a hopeless gap can't recurse forever.
14
+ const MAX_THREAD_DEPTH = 12;
15
+
16
+ // module-static scratch
17
+ const DIR = [0, 0, 0];
18
+
19
+ /**
20
+ * Connectivity refinement — the acoustic stage the reference GI placer lacks. After the SDF cover + a
21
+ * provisional {@link bakeVisibility}, the graph may have islands a bend/throat separates even though sound
22
+ * routes between them: `bakeVisibility` only links probes with STRAIGHT line of sight, so a corridor that
23
+ * bends sharper than the cover's spacing leaves its two ends in different components. This inserts the
24
+ * minimum extra probes so a chain of mutually-visible probes spans every such path — "ray bounces between
25
+ * probes", as a bounded greedy walk through open air.
26
+ *
27
+ * For each pair of nearby components (within `corridorReachFactor · minSpacing`), it walks from one side
28
+ * toward the other: at each step it samples open-air waypoints around the segment (a Fibonacci sphere × a
29
+ * few radii), keeps those visible from the current point, and steps to the one nearest the target — until a
30
+ * waypoint sees the target (chain complete) or no progress is possible (give up — a genuinely sealed wall
31
+ * stays disconnected, correctly). It never subdivides below `minSpacing / maxRefineFactor`. The waypoints
32
+ * are returned for the caller to append; the FINAL `bakeVisibility` then links them.
33
+ *
34
+ * @param {AcousticOccluderIndex} index the acoustic scene
35
+ * @param {AcousticProbeField} field cover probes WITH a baked visibility graph (defines the components)
36
+ * @param {number} minSpacing the placement spacing hint
37
+ * @param {{maxRefineFactor?: number, corridorReachFactor?: number}} [options]
38
+ * @returns {number[]} flat extra probe positions `[x,y,z, …]` (possibly empty)
39
+ */
40
+ export function probe_refine_connectivity(index, field, minSpacing, options = {}) {
41
+ const maxRefineFactor = options.maxRefineFactor ?? DEFAULT_MAX_REFINE_FACTOR;
42
+ const reach = (options.corridorReachFactor ?? DEFAULT_CORRIDOR_REACH_FACTOR) * minSpacing;
43
+ const floor = minSpacing / maxRefineFactor;
44
+
45
+ const n = field.size;
46
+ const graph = field.visibilityGraph;
47
+
48
+ // connected components of the provisional visibility graph
49
+ const parent = new Uint32Array(n);
50
+ uf_init(parent, n);
51
+ for (let v = 0; v < n; v++) {
52
+ for (let k = graph.edge_addresses[v]; k < graph.edge_addresses[v + 1]; k++) {
53
+ uf_union(parent, v, graph.adjacency[k]);
54
+ }
55
+ }
56
+
57
+ const waypoints = [];
58
+ const hits = [];
59
+
60
+ for (let i = 0; i < n; i++) {
61
+ const ix = field.probeX(i), iy = field.probeY(i), iz = field.probeZ(i);
62
+
63
+ const count = field.probesWithinRadius(hits, 0, ix, iy, iz, reach);
64
+
65
+ for (let h = 0; h < count; h++) {
66
+ const j = hits[h];
67
+ if (j <= i) {
68
+ continue;
69
+ }
70
+ // re-read roots each time — an earlier successful thread may have merged these components, directly
71
+ // or transitively (so we don't thread a redundant chain across 3+ mutually-near components)
72
+ if (uf_find(parent, i) === uf_find(parent, j)) {
73
+ continue;
74
+ }
75
+
76
+ const chain = thread(index, ix, iy, iz, field.probeX(j), field.probeY(j), field.probeZ(j), floor, reach, 0);
77
+ if (chain !== null) {
78
+ uf_union(parent, i, j); // merge → later pairs across these now-connected components are skipped
79
+ for (let w = 0; w < chain.length; w++) {
80
+ waypoints.push(chain[w]);
81
+ }
82
+ }
83
+ }
84
+ }
85
+
86
+ return waypoints;
87
+ }
88
+
89
+ /**
90
+ * Greedily walk from (ax,ay,az) toward (bx,by,bz) through open air, inserting waypoints, until a waypoint
91
+ * sees the target. Returns the flat waypoint list `[x,y,z, …]`, or `null` if no open chain was found.
92
+ */
93
+ function thread(index, ax, ay, az, bx, by, bz, floor, reach, depth) {
94
+ if (probe_segment_visible(index, ax, ay, az, bx, by, bz)) {
95
+ return []; // already mutually visible
96
+ }
97
+ if (depth >= MAX_THREAD_DEPTH) {
98
+ return null;
99
+ }
100
+
101
+ const w = open_waypoint_toward_target(index, ax, ay, az, bx, by, bz, reach);
102
+ if (w === null) {
103
+ return null; // no visible open point makes progress → sealed
104
+ }
105
+
106
+ const dx = w[0] - ax, dy = w[1] - ay, dz = w[2] - az;
107
+ if (Math.sqrt(dx * dx + dy * dy + dz * dz) < floor) {
108
+ return null; // would need probes finer than the refine floor
109
+ }
110
+
111
+ const rest = thread(index, w[0], w[1], w[2], bx, by, bz, floor, reach, depth + 1);
112
+ if (rest === null) {
113
+ return null;
114
+ }
115
+
116
+ return [w[0], w[1], w[2], ...rest];
117
+ }
118
+
119
+ /**
120
+ * Among open-air points sampled around the (a→b) segment that are VISIBLE from `a`, return the one nearest
121
+ * `b` that makes progress (closer to `b` than `a` is), or `null`. Sampled on a Fibonacci sphere around the
122
+ * segment midpoint at a few fractions of the segment length, so both perpendicular detours (over a baffle)
123
+ * and along-segment steps are covered.
124
+ * @returns {number[]|null} `[x,y,z]` or null
125
+ */
126
+ function open_waypoint_toward_target(index, ax, ay, az, bx, by, bz, reach) {
127
+ const mx = (ax + bx) * 0.5, my = (ay + by) * 0.5, mz = (az + bz) * 0.5;
128
+ const segLen = Math.sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay) + (bz - az) * (bz - az));
129
+
130
+ let best = null;
131
+ // must improve on a's own distance to b (strict progress → the walk terminates)
132
+ let bestDistB = Math.sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay) + (bz - az) * (bz - az));
133
+
134
+ for (let d = 0; d < SAMPLE_DIRECTIONS; d++) {
135
+ sphere_fibonacci_point(DIR, 0, d, SAMPLE_DIRECTIONS);
136
+
137
+ for (let r = 0; r < SAMPLE_RADII.length; r++) {
138
+ const radius = segLen * SAMPLE_RADII[r];
139
+ const sx = mx + DIR[0] * radius;
140
+ const sy = my + DIR[1] * radius;
141
+ const sz = mz + DIR[2] * radius;
142
+
143
+ // must be in open air (clearance > a small margin so the reverb bake + visibility are valid)
144
+ if (index.signedDistanceAt(sx, sy, sz, reach) <= 1e-3) {
145
+ continue;
146
+ }
147
+
148
+ const distB = Math.sqrt((bx - sx) * (bx - sx) + (by - sy) * (by - sy) + (bz - sz) * (bz - sz));
149
+ if (distB >= bestDistB) {
150
+ continue; // no progress toward b
151
+ }
152
+
153
+ if (!probe_segment_visible(index, ax, ay, az, sx, sy, sz)) {
154
+ continue; // a can't see this waypoint
155
+ }
156
+
157
+ bestDistB = distB;
158
+ best = best === null ? [sx, sy, sz] : best;
159
+ best[0] = sx; best[1] = sy; best[2] = sz;
160
+ }
161
+ }
162
+
163
+ return best;
164
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"FoaProbeReverbRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/render/FoaProbeReverbRenderer.js"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH;IA0MI;;;OAGG;IACH,2BAHW,gBAAgB,eAChB,SAAS,EAkEnB;IA7QD;;;OAGG;IACH,YAFU,MAAM,CAED;IAEf;;;OAGG;IACH,kBAFU,MAAM,CAEO;IAEvB;;;OAGG;IACH,UAFU,MAAM,CAEA;IAEhB;;;;;;;;;;;OAWG;IACH,iBAFU,MAAM,CAEM;IAEtB;;;;;;;;;;;;OAYG;IACH,iBAFU,MAAM,CAEI;IAgBpB,6BAUC;IAxBD;;;;;;;;;OASG;IACH,wBAEC;IAoND;;;OAGG;IACH,uBAEC;IAED;;;OAGG;IACH,wBAEC;IAED;;OAEG;IACH,oDAeC;IAED;;;;;;;;;OASG;IACH,UALW,MAAM,KACN,MAAM,KACN,MAAM,eACN;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC,QAsB/C;;CA+FJ"}
1
+ {"version":3,"file":"FoaProbeReverbRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/render/FoaProbeReverbRenderer.js"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH;IA2MI;;;OAGG;IACH,2BAHW,gBAAgB,eAChB,SAAS,EAkEnB;IA9QD;;;OAGG;IACH,YAFU,MAAM,CAED;IAEf;;;OAGG;IACH,kBAFU,MAAM,CAEO;IAEvB;;;OAGG;IACH,UAFU,MAAM,CAEA;IAEhB;;;;;;;;;;;OAWG;IACH,iBAFU,MAAM,CAEM;IAEtB;;;;;;;;;;;;OAYG;IACH,iBAFU,MAAM,CAEI;IAgBpB,6BAUC;IAxBD;;;;;;;;;OASG;IACH,wBAEC;IAqND;;;OAGG;IACH,uBAEC;IAED;;;OAGG;IACH,wBAEC;IAED;;OAEG;IACH,oDAeC;IAED;;;;;;;;;OASG;IACH,UALW,MAAM,KACN,MAAM,KACN,MAAM,eACN;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC,QAsB/C;;CA6GJ"}
@@ -135,7 +135,8 @@ export class FoaProbeReverbRenderer {
135
135
  * @private
136
136
  * @type {Float64Array}
137
137
  */
138
- #currentBands = new Float64Array([NaN, NaN, NaN]);
138
+ #currentBands = new Float64Array([NaN, NaN, NaN]);
139
+ #currentDirs = new Float64Array([NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]);
139
140
 
140
141
  /**
141
142
  * Whether the baked IR is audible, i.e. whether the last crossfade went to the send level or to
@@ -408,10 +409,23 @@ export class FoaProbeReverbRenderer {
408
409
  dirs[band * 3 + 2] = this.#tmpDir[2];
409
410
  }
410
411
 
411
- audible = Math.max(bands[0], bands[1], bands[2]) >= this.minDecay;
412
+ audible = Math.max(bands[0], bands[1], bands[2]) >= this.minDecay;
413
+ } else {
414
+ bands[0] = 0;
415
+ bands[1] = 0;
416
+ bands[2] = 0;
417
+ dirs.fill(0);
412
418
  }
413
419
 
414
- const current = this.#currentBands;
420
+ const current = this.#currentBands;
421
+ const currentDirs = this.#currentDirs;
422
+ let dirsClose = true;
423
+ for (let k = 0; k < 9; k++) {
424
+ if (!(Math.abs(dirs[k] - currentDirs[k]) < this.changeThreshold)) {
425
+ dirsClose = false;
426
+ break;
427
+ }
428
+ }
415
429
 
416
430
  const bandsClose = Math.abs(bands[0] - current[0]) < this.changeThreshold
417
431
  && Math.abs(bands[1] - current[1]) < this.changeThreshold
@@ -423,13 +437,14 @@ export class FoaProbeReverbRenderer {
423
437
  crossing smaller than `changeThreshold` (0.1 > 0.05) and leave the reverb stuck on or off
424
438
  across that boundary — the same reasoning as ProbeReverbRenderer#setBands.
425
439
  */
426
- if (bandsClose && audible === this.#currentlyAudible) {
440
+ if (bandsClose && (!audible || dirsClose) && audible === this.#currentlyAudible) {
427
441
  return;
428
442
  }
429
443
 
430
444
  current[0] = bands[0];
431
445
  current[1] = bands[1];
432
- current[2] = bands[2];
446
+ current[2] = bands[2];
447
+ currentDirs.set(dirs);
433
448
  this.#currentlyAudible = audible;
434
449
 
435
450
  const inactive = 1 - this.#active;