@woosh/meep-engine 2.154.0 → 2.156.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 (487) hide show
  1. package/README.md +1 -1
  2. package/build/bundle-worker-image-decoder.js +1 -1
  3. package/build/bundle-worker-terrain.js +1 -1
  4. package/editor/view/ecs/ComponentControlView.d.ts +0 -9
  5. package/editor/view/ecs/ComponentControlView.js +2 -98
  6. package/package.json +1 -1
  7. package/src/core/binary/32BitEncoder.js +1 -1
  8. package/src/core/binary/to_half_float_uint16.js +3 -3
  9. package/src/core/bvh2/bvh3/ebvh_build_hierarchy_radix.d.ts.map +1 -1
  10. package/src/core/bvh2/bvh3/ebvh_build_hierarchy_radix.js +275 -253
  11. package/src/core/cache/Cache.d.ts.map +1 -1
  12. package/src/core/cache/Cache.js +7 -0
  13. package/src/core/cache/FrequencySketch.d.ts.map +1 -1
  14. package/src/core/cache/FrequencySketch.js +8 -4
  15. package/src/core/clipboard/obtainClipBoard.d.ts +6 -0
  16. package/src/core/clipboard/obtainClipBoard.d.ts.map +1 -0
  17. package/src/core/clipboard/obtainClipBoard.js +29 -0
  18. package/src/core/clipboard/safeClipboardReadText.d.ts +6 -0
  19. package/src/core/clipboard/safeClipboardReadText.d.ts.map +1 -0
  20. package/src/core/clipboard/safeClipboardReadText.js +55 -0
  21. package/src/core/clipboard/safeClipboardWriteText.d.ts +8 -0
  22. package/src/core/clipboard/safeClipboardWriteText.d.ts.map +1 -0
  23. package/src/core/clipboard/safeClipboardWriteText.js +23 -0
  24. package/src/core/collection/array/array_quick_sort_by_lookup_map.js +1 -1
  25. package/src/core/collection/array/array_set_diff_sorting.d.ts.map +1 -1
  26. package/src/core/collection/array/array_set_diff_sorting.js +4 -1
  27. package/src/core/collection/array/array_shuffle.d.ts.map +1 -1
  28. package/src/core/collection/array/array_shuffle.js +30 -27
  29. package/src/core/collection/array/binarySearchLowIndex.d.ts.map +1 -1
  30. package/src/core/collection/array/binarySearchLowIndex.js +4 -3
  31. package/src/core/collection/array/typed/array_buffer_hash.js +1 -1
  32. package/src/core/collection/array/typed/is_typed_array_equals.d.ts.map +1 -1
  33. package/src/core/collection/array/typed/is_typed_array_equals.js +12 -2
  34. package/src/core/collection/heap/BinaryHeap.d.ts.map +1 -1
  35. package/src/core/collection/heap/BinaryHeap.js +12 -2
  36. package/src/core/collection/queue/Deque.d.ts.map +1 -1
  37. package/src/core/collection/queue/Deque.js +10 -8
  38. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  39. package/src/core/collection/table/RowFirstTable.js +4 -2
  40. package/src/core/collection/table/RowFirstTableSpec.js +2 -2
  41. package/src/core/color/operations/color_lerp.d.ts.map +1 -1
  42. package/src/core/color/operations/color_lerp.js +10 -3
  43. package/src/core/color/rgb2uint32.js +1 -1
  44. package/src/core/color/rgbe9995_to_rgb.js +1 -1
  45. package/src/core/function/objectsEqual.d.ts.map +1 -1
  46. package/src/core/function/objectsEqual.js +2 -1
  47. package/src/core/geom/2d/aabb/AABB2.d.ts.map +1 -1
  48. package/src/core/geom/2d/aabb/AABB2.js +12 -11
  49. package/src/core/geom/2d/convex-hull/convex_hull_jarvis_2d.d.ts.map +1 -1
  50. package/src/core/geom/2d/convex-hull/convex_hull_jarvis_2d.js +30 -4
  51. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.d.ts.map +1 -1
  52. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.js +6 -2
  53. package/src/core/geom/2d/hash-grid/SpatialHashGrid.d.ts.map +1 -1
  54. package/src/core/geom/2d/hash-grid/SpatialHashGrid.js +388 -386
  55. package/src/core/geom/2d/hash-grid/shg_query_elements_line.d.ts.map +1 -1
  56. package/src/core/geom/2d/hash-grid/shg_query_elements_line.js +8 -3
  57. package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
  58. package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +9 -1
  59. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts +3 -1
  60. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts.map +1 -1
  61. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.js +3 -1
  62. package/src/core/geom/2d/quad-tree-binary/QuadTree.js +714 -714
  63. package/src/core/geom/2d/r-tree/StaticR2Tree.d.ts.map +1 -1
  64. package/src/core/geom/2d/r-tree/StaticR2Tree.js +5 -4
  65. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.d.ts.map +1 -1
  66. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +33 -29
  67. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.d.ts.map +1 -1
  68. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js +3 -1
  69. package/src/core/geom/3d/aabb/aabb3_signed_distance_to_aabb3.d.ts.map +1 -1
  70. package/src/core/geom/3d/aabb/aabb3_signed_distance_to_aabb3.js +10 -7
  71. package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.d.ts.map +1 -1
  72. package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.js +30 -9
  73. package/src/core/geom/3d/aabb/compute_aabb_from_points.js +3 -3
  74. package/src/core/geom/3d/box/box3_raycast.d.ts +37 -0
  75. package/src/core/geom/3d/box/box3_raycast.d.ts.map +1 -0
  76. package/src/core/geom/3d/box/box3_raycast.js +81 -0
  77. package/src/core/geom/3d/capsule/capsule_raycast.d.ts +35 -0
  78. package/src/core/geom/3d/capsule/capsule_raycast.d.ts.map +1 -0
  79. package/src/core/geom/3d/capsule/capsule_raycast.js +93 -0
  80. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.d.ts.map +1 -1
  81. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js +4 -0
  82. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
  83. package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.d.ts.map +1 -1
  84. package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js +3 -2
  85. package/src/core/geom/3d/mat4/decompose_matrix_4_array.d.ts.map +1 -1
  86. package/src/core/geom/3d/mat4/decompose_matrix_4_array.js +12 -2
  87. package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.js +2 -2
  88. package/src/core/geom/3d/mat4/m4_multiply_alphatensor.d.ts +1 -1
  89. package/src/core/geom/3d/mat4/m4_multiply_alphatensor.d.ts.map +1 -1
  90. package/src/core/geom/3d/mat4/m4_multiply_alphatensor.js +19 -13
  91. package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.d.ts.map +1 -1
  92. package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.js +3 -2
  93. package/src/core/geom/3d/plane/plane3_compute_plane_intersection.js +3 -2
  94. package/src/core/geom/3d/shape/MeshShape3D.d.ts.map +1 -1
  95. package/src/core/geom/3d/shape/MeshShape3D.js +7 -0
  96. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  97. package/src/core/geom/3d/shape/UnionShape3D.js +3 -2
  98. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +1 -1
  99. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +153 -148
  100. package/src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.d.ts.map +1 -1
  101. package/src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js +7 -0
  102. package/src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.d.ts.map +1 -1
  103. package/src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.js +13 -10
  104. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts +1 -1
  105. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js +2 -2
  106. package/src/core/geom/3d/sphere/sphere_raycast.d.ts +33 -0
  107. package/src/core/geom/3d/sphere/sphere_raycast.d.ts.map +1 -0
  108. package/src/core/geom/3d/sphere/sphere_raycast.js +47 -0
  109. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts +24 -0
  110. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts.map +1 -0
  111. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js +39 -0
  112. package/src/core/geom/3d/tetrahedra/triangle/trace_triangular_depth_map.d.ts.map +1 -1
  113. package/src/core/geom/3d/tetrahedra/triangle/trace_triangular_depth_map.js +4 -2
  114. package/src/core/geom/3d/topology/bounds/computeTriangleClusterNormalBoundingCone.js +3 -3
  115. package/src/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js +1 -1
  116. package/src/core/geom/3d/topology/tm_vertex_compute_normal.d.ts.map +1 -1
  117. package/src/core/geom/3d/topology/tm_vertex_compute_normal.js +4 -2
  118. package/src/core/geom/3d/util/make_justified_point_grid.d.ts.map +1 -1
  119. package/src/core/geom/3d/util/make_justified_point_grid.js +18 -10
  120. package/src/core/geom/ConicRay.d.ts.map +1 -1
  121. package/src/core/geom/ConicRay.js +11 -13
  122. package/src/core/geom/packing/max-rect/removeRedundantBoxes.d.ts.map +1 -1
  123. package/src/core/geom/packing/max-rect/removeRedundantBoxes.js +19 -4
  124. package/src/core/geom/vec3/v3_array_copy.d.ts +3 -3
  125. package/src/core/geom/vec3/v3_array_copy.d.ts.map +1 -1
  126. package/src/core/geom/vec3/v3_array_copy.js +2 -2
  127. package/src/core/geom/vec3/v3_cross.d.ts +17 -0
  128. package/src/core/geom/vec3/v3_cross.d.ts.map +1 -0
  129. package/src/core/geom/vec3/v3_cross.js +20 -0
  130. package/src/core/geom/vec3/v3_orthonormal_matrix_from_normal.d.ts.map +1 -0
  131. package/src/{engine/graphics/sh3/path_tracer/sampling → core/geom/vec3}/v3_orthonormal_matrix_from_normal.js +1 -1
  132. package/src/core/geom/vec3/v3_subtract.d.ts +16 -0
  133. package/src/core/geom/vec3/v3_subtract.d.ts.map +1 -0
  134. package/src/core/geom/vec3/v3_subtract.js +19 -0
  135. package/src/core/graph/coloring/colorizeGraph.js +2 -2
  136. package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
  137. package/src/core/graph/csr/CSRGraph.js +325 -319
  138. package/src/core/graph/layout/CircleLayout.d.ts.map +1 -1
  139. package/src/core/graph/layout/CircleLayout.js +8 -6
  140. package/src/core/graph/metis/native/refine/compute_kway_params.d.ts.map +1 -1
  141. package/src/core/graph/metis/native/refine/compute_kway_params.js +139 -138
  142. package/src/core/graph/mn_graph_coarsen.d.ts.map +1 -1
  143. package/src/core/graph/mn_graph_coarsen.js +4 -2
  144. package/src/core/graph/v2/NodeContainer.js +7 -7
  145. package/src/core/localization/LocalizationEngine.js +1 -1
  146. package/src/core/math/bell_membership_function.d.ts.map +1 -1
  147. package/src/core/math/bell_membership_function.js +3 -1
  148. package/src/core/math/complex/complex_add.d.ts +4 -4
  149. package/src/core/math/complex/complex_add.d.ts.map +1 -1
  150. package/src/core/math/complex/complex_add.js +3 -3
  151. package/src/core/math/complex/complex_div.d.ts +4 -4
  152. package/src/core/math/complex/complex_div.d.ts.map +1 -1
  153. package/src/core/math/complex/complex_div.js +3 -3
  154. package/src/core/math/complex/complex_mul.d.ts +4 -4
  155. package/src/core/math/complex/complex_mul.d.ts.map +1 -1
  156. package/src/core/math/complex/complex_mul.js +3 -3
  157. package/src/core/math/complex/complex_sub.d.ts +4 -4
  158. package/src/core/math/complex/complex_sub.d.ts.map +1 -1
  159. package/src/core/math/complex/complex_sub.js +3 -3
  160. package/src/core/math/idct_1d.d.ts +4 -4
  161. package/src/core/math/idct_1d.d.ts.map +1 -1
  162. package/src/core/math/idct_1d.js +3 -3
  163. package/src/core/math/noise/create_simplex_noise_2d.d.ts.map +1 -1
  164. package/src/core/math/noise/create_simplex_noise_2d.js +4 -2
  165. package/src/core/math/noise/sdnoise.d.ts.map +1 -1
  166. package/src/core/math/noise/sdnoise.js +12 -9
  167. package/src/core/math/physics/mie/compute_bhmie_optical_properties.d.ts.map +1 -1
  168. package/src/core/math/physics/mie/compute_bhmie_optical_properties.js +94 -50
  169. package/src/core/math/physics/mie/lorenz_mie_coefs.d.ts +3 -6
  170. package/src/core/math/physics/mie/lorenz_mie_coefs.d.ts.map +1 -1
  171. package/src/core/math/physics/mie/lorenz_mie_coefs.js +180 -157
  172. package/src/core/math/physics/mie/mie_ab_to_optical_properties.d.ts +3 -4
  173. package/src/core/math/physics/mie/mie_ab_to_optical_properties.d.ts.map +1 -1
  174. package/src/core/math/physics/mie/mie_ab_to_optical_properties.js +47 -21
  175. package/src/core/math/random/randomIntegerBetween.d.ts.map +1 -1
  176. package/src/core/math/random/randomIntegerBetween.js +4 -1
  177. package/src/core/math/solveCubic.d.ts.map +1 -1
  178. package/src/core/math/solveCubic.js +95 -82
  179. package/src/core/math/spline/computeCatmullRomSplineUniformDistance.d.ts.map +1 -1
  180. package/src/core/math/spline/computeCatmullRomSplineUniformDistance.js +13 -0
  181. package/src/core/math/statistics/softmax.js +1 -1
  182. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +1 -0
  183. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
  184. package/src/core/model/node-graph/visual/NodeGraphVisualData.js +2 -1
  185. package/src/core/model/node-graph/visual/NodeVisualData.js +1 -1
  186. package/src/core/model/object/ImmutableObjectPool.d.ts +7 -0
  187. package/src/core/model/object/ImmutableObjectPool.d.ts.map +1 -1
  188. package/src/core/model/object/ImmutableObjectPool.js +20 -10
  189. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.d.ts.map +1 -1
  190. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.js +39 -2
  191. package/src/core/model/reactive/model/terminal/ReactiveReference.d.ts.map +1 -1
  192. package/src/core/model/reactive/model/terminal/ReactiveReference.js +2 -0
  193. package/src/core/parser/simple/readHexToken.d.ts.map +1 -1
  194. package/src/core/parser/simple/readHexToken.js +6 -0
  195. package/src/core/primitives/numbers/number_pretty_print.d.ts.map +1 -1
  196. package/src/core/primitives/numbers/number_pretty_print.js +4 -1
  197. package/src/core/primitives/strings/string_jaro_winkler.js +1 -1
  198. package/src/core/process/CompositeProcess.js +1 -1
  199. package/src/core/process/action/AsynchronousDelayAction.d.ts.map +1 -1
  200. package/src/core/process/action/AsynchronousDelayAction.js +3 -0
  201. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  202. package/src/core/process/executor/ConcurrentExecutor.js +3 -2
  203. package/src/core/process/task/util/randomCountTask.d.ts.map +1 -1
  204. package/src/core/process/task/util/randomCountTask.js +3 -1
  205. package/src/core/process/undo/ActionProcessor.d.ts.map +1 -1
  206. package/src/core/process/undo/ActionProcessor.js +5 -3
  207. package/src/core/process/worker/WorkerBuilder.js +3 -3
  208. package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
  209. package/src/engine/animation/curve/AnimationCurve.js +4 -2
  210. package/src/engine/control/first-person/DESIGN.md +1 -1
  211. package/src/engine/control/first-person/FirstPersonMotionPhase.d.ts +55 -0
  212. package/src/engine/control/first-person/FirstPersonMotionPhase.d.ts.map +1 -0
  213. package/src/engine/control/first-person/FirstPersonMotionPhase.js +134 -0
  214. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +23 -2
  215. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  216. package/src/engine/control/first-person/FirstPersonPlayerController.js +1 -1
  217. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +168 -0
  218. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  219. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +115 -0
  220. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +71 -0
  221. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  222. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +255 -55
  223. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts +82 -43
  224. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
  225. package/src/engine/control/first-person/abilities/LedgeGrab.js +405 -213
  226. package/src/engine/control/first-person/abilities/Mantle.d.ts +6 -0
  227. package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -1
  228. package/src/engine/control/first-person/abilities/Mantle.js +104 -45
  229. package/src/engine/control/first-person/abilities/ScrambleUp.d.ts +61 -0
  230. package/src/engine/control/first-person/abilities/ScrambleUp.d.ts.map +1 -0
  231. package/src/engine/control/first-person/abilities/ScrambleUp.js +182 -0
  232. package/src/engine/control/first-person/math/jumpDynamics.d.ts +84 -0
  233. package/src/engine/control/first-person/math/jumpDynamics.d.ts.map +1 -0
  234. package/src/engine/control/first-person/math/jumpDynamics.js +108 -0
  235. package/src/engine/control/first-person/prototype_first_person_controller.js +45 -1
  236. package/src/engine/graphics/camera/testClippingPlaneComputation.js +1 -1
  237. package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.d.ts.map +1 -1
  238. package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.js +8 -0
  239. package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +1 -1
  240. package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +1 -1
  241. package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +1 -1
  242. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +1 -1
  243. package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +1 -1
  244. package/src/engine/graphics/sh3/path_tracer/texture/sample_material.js +1 -1
  245. package/src/engine/graphics/shadows/testShadowMapRendering.js +1 -1
  246. package/src/engine/physics/CONSTRAINT_SOLVER_BENCH_LOG.md +208 -0
  247. package/src/engine/physics/CONSTRAINT_SOLVER_IMPROVEMENTS_PLAN.md +364 -0
  248. package/src/engine/physics/PLAN.md +6 -5
  249. package/src/engine/physics/constraint/solve_constraints.d.ts +4 -1
  250. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  251. package/src/engine/physics/constraint/solve_constraints.js +147 -33
  252. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  253. package/src/engine/physics/ecs/PhysicsSystem.js +1750 -1747
  254. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
  255. package/src/engine/physics/gjk/gjk_epa_penetration.d.ts +12 -8
  256. package/src/engine/physics/gjk/gjk_epa_penetration.d.ts.map +1 -1
  257. package/src/engine/physics/gjk/gjk_epa_penetration.js +447 -158
  258. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
  259. package/src/engine/physics/narrowphase/convex_convex_manifold.js +22 -25
  260. package/src/engine/physics/narrowphase/convex_decomposition.d.ts +32 -13
  261. package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
  262. package/src/engine/physics/narrowphase/convex_decomposition.js +61 -65
  263. package/src/engine/physics/narrowphase/mesh_convex_hull.d.ts.map +1 -1
  264. package/src/engine/physics/narrowphase/mesh_convex_hull.js +13 -8
  265. package/src/engine/physics/narrowphase/refine_ray_concave.d.ts.map +1 -1
  266. package/src/engine/physics/narrowphase/refine_ray_concave.js +5 -3
  267. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
  268. package/src/engine/physics/narrowphase/refine_ray_hit.js +81 -78
  269. package/src/engine/sound/SoundEngine.d.ts.map +1 -1
  270. package/src/engine/sound/SoundEngine.js +28 -0
  271. package/src/engine/sound/dB2Volume.d.ts +1 -1
  272. package/src/engine/sound/dB2Volume.d.ts.map +1 -1
  273. package/src/engine/sound/dB2Volume.js +1 -1
  274. package/src/engine/sound/ecs/SoundController.d.ts +4 -0
  275. package/src/engine/sound/ecs/SoundController.d.ts.map +1 -1
  276. package/src/engine/sound/ecs/SoundController.js +4 -0
  277. package/src/engine/sound/ecs/SoundControllerSystem.d.ts +5 -0
  278. package/src/engine/sound/ecs/SoundControllerSystem.d.ts.map +1 -1
  279. package/src/engine/sound/ecs/SoundControllerSystem.js +5 -0
  280. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +69 -0
  281. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -0
  282. package/src/engine/sound/ecs/audio/AudioEmitter.js +83 -0
  283. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +97 -0
  284. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -0
  285. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +238 -0
  286. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +90 -0
  287. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -0
  288. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +324 -0
  289. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts +59 -0
  290. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts.map +1 -0
  291. package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +140 -0
  292. package/src/engine/sound/ecs/emitter/SoundEmitter.d.ts +16 -65
  293. package/src/engine/sound/ecs/emitter/SoundEmitter.d.ts.map +1 -1
  294. package/src/engine/sound/ecs/emitter/SoundEmitter.js +19 -224
  295. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.d.ts +26 -29
  296. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.d.ts.map +1 -1
  297. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.js +168 -135
  298. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.d.ts +36 -59
  299. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.d.ts.map +1 -1
  300. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.js +154 -390
  301. package/src/engine/sound/ecs/emitter/SoundTrack.d.ts +20 -23
  302. package/src/engine/sound/ecs/emitter/SoundTrack.d.ts.map +1 -1
  303. package/src/engine/sound/ecs/emitter/SoundTrack.js +34 -152
  304. package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +993 -0
  305. package/src/engine/sound/sopra/README.md +643 -7
  306. package/src/engine/sound/sopra/SopraEngine.d.ts +229 -0
  307. package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -0
  308. package/src/engine/sound/sopra/SopraEngine.js +423 -0
  309. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.d.ts +26 -0
  310. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.d.ts.map +1 -0
  311. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.js +71 -0
  312. package/src/engine/sound/sopra/asset/BufferProvider.d.ts +24 -0
  313. package/src/engine/sound/sopra/asset/BufferProvider.d.ts.map +1 -0
  314. package/src/engine/sound/sopra/asset/BufferProvider.js +29 -0
  315. package/src/engine/sound/sopra/asset/StubBufferProvider.d.ts +31 -0
  316. package/src/engine/sound/sopra/asset/StubBufferProvider.d.ts.map +1 -0
  317. package/src/engine/sound/sopra/asset/StubBufferProvider.js +58 -0
  318. package/src/engine/sound/sopra/definition/BusDefinition.d.ts +83 -0
  319. package/src/engine/sound/sopra/definition/BusDefinition.d.ts.map +1 -0
  320. package/src/engine/sound/sopra/definition/BusDefinition.js +142 -0
  321. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.d.ts +17 -0
  322. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.d.ts.map +1 -0
  323. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.js +54 -0
  324. package/src/engine/sound/sopra/definition/DuckingRule.d.ts +71 -0
  325. package/src/engine/sound/sopra/definition/DuckingRule.d.ts.map +1 -0
  326. package/src/engine/sound/sopra/definition/DuckingRule.js +106 -0
  327. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.d.ts +18 -0
  328. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.d.ts.map +1 -0
  329. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.js +31 -0
  330. package/src/engine/sound/sopra/definition/EventDescription.d.ts +132 -0
  331. package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -0
  332. package/src/engine/sound/sopra/definition/EventDescription.js +259 -0
  333. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +17 -0
  334. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -0
  335. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +71 -0
  336. package/src/engine/sound/sopra/definition/MixerSnapshot.d.ts +51 -0
  337. package/src/engine/sound/sopra/definition/MixerSnapshot.d.ts.map +1 -0
  338. package/src/engine/sound/sopra/definition/MixerSnapshot.js +83 -0
  339. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.d.ts +18 -0
  340. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.d.ts.map +1 -0
  341. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.js +39 -0
  342. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts +72 -0
  343. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts.map +1 -0
  344. package/src/engine/sound/sopra/definition/ParameterDefinition.js +117 -0
  345. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.d.ts +18 -0
  346. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.d.ts.map +1 -0
  347. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.js +31 -0
  348. package/src/engine/sound/sopra/definition/SopraPanningModel.d.ts +14 -0
  349. package/src/engine/sound/sopra/definition/SopraPanningModel.d.ts.map +1 -0
  350. package/src/engine/sound/sopra/definition/SopraPanningModel.js +20 -0
  351. package/src/engine/sound/sopra/definition/VoiceStealMode.d.ts +10 -0
  352. package/src/engine/sound/sopra/definition/VoiceStealMode.d.ts.map +1 -0
  353. package/src/engine/sound/sopra/definition/VoiceStealMode.js +18 -0
  354. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts +93 -0
  355. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts.map +1 -0
  356. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +109 -0
  357. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts +80 -0
  358. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -0
  359. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +181 -0
  360. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.d.ts +17 -0
  361. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  362. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.js +74 -0
  363. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.d.ts +34 -0
  364. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.d.ts.map +1 -0
  365. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +100 -0
  366. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +101 -0
  367. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -0
  368. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +230 -0
  369. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.d.ts +17 -0
  370. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  371. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.js +54 -0
  372. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts +103 -0
  373. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -0
  374. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +191 -0
  375. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.d.ts +18 -0
  376. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.d.ts.map +1 -0
  377. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.js +39 -0
  378. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts +40 -0
  379. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts.map +1 -0
  380. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.js +91 -0
  381. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.d.ts +17 -0
  382. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  383. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.js +42 -0
  384. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.d.ts +44 -0
  385. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.d.ts.map +1 -0
  386. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +77 -0
  387. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.d.ts +18 -0
  388. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.d.ts.map +1 -0
  389. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.js +27 -0
  390. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +65 -0
  391. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -0
  392. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +131 -0
  393. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.d.ts +17 -0
  394. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  395. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.js +41 -0
  396. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +24 -0
  397. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -0
  398. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +24 -0
  399. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +70 -0
  400. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -0
  401. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +120 -0
  402. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.d.ts +18 -0
  403. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.d.ts.map +1 -0
  404. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.js +31 -0
  405. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +74 -0
  406. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -0
  407. package/src/engine/sound/sopra/definition/effect/EqEffect.js +128 -0
  408. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.d.ts +18 -0
  409. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.d.ts.map +1 -0
  410. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.js +29 -0
  411. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +49 -0
  412. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -0
  413. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +101 -0
  414. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.d.ts +18 -0
  415. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.d.ts.map +1 -0
  416. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.js +25 -0
  417. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.d.ts +31 -0
  418. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.d.ts.map +1 -0
  419. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.js +106 -0
  420. package/src/engine/sound/sopra/runtime/BusGraph.d.ts +79 -0
  421. package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -0
  422. package/src/engine/sound/sopra/runtime/BusGraph.js +227 -0
  423. package/src/engine/sound/sopra/runtime/EventInstance.d.ts +144 -0
  424. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -0
  425. package/src/engine/sound/sopra/runtime/EventInstance.js +579 -0
  426. package/src/engine/sound/sopra/runtime/ParameterStore.d.ts +42 -0
  427. package/src/engine/sound/sopra/runtime/ParameterStore.d.ts.map +1 -0
  428. package/src/engine/sound/sopra/runtime/ParameterStore.js +98 -0
  429. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.d.ts +42 -0
  430. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.d.ts.map +1 -0
  431. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.js +68 -0
  432. package/src/engine/sound/sopra/runtime/Voice.d.ts +67 -0
  433. package/src/engine/sound/sopra/runtime/Voice.d.ts.map +1 -0
  434. package/src/engine/sound/sopra/runtime/Voice.js +145 -0
  435. package/src/engine/sound/sopra/runtime/VoiceManager.d.ts +38 -0
  436. package/src/engine/sound/sopra/runtime/VoiceManager.d.ts.map +1 -0
  437. package/src/engine/sound/sopra/runtime/VoiceManager.js +136 -0
  438. package/src/engine/sound/sopra/runtime/VoicePool.d.ts +12 -0
  439. package/src/engine/sound/sopra/runtime/VoicePool.d.ts.map +1 -0
  440. package/src/engine/sound/sopra/runtime/VoicePool.js +17 -0
  441. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +11 -0
  442. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -0
  443. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +42 -0
  444. package/src/engine/sound/sopra/serialization/sopraJSON.d.ts +33 -0
  445. package/src/engine/sound/sopra/serialization/sopraJSON.d.ts.map +1 -0
  446. package/src/engine/sound/sopra/serialization/sopraJSON.js +99 -0
  447. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +27 -0
  448. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -0
  449. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +49 -0
  450. package/src/engine/sound/sopra/util/MockAudioContext.d.ts +74 -0
  451. package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -0
  452. package/src/engine/sound/sopra/util/MockAudioContext.js +215 -0
  453. package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts +15 -0
  454. package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts.map +1 -0
  455. package/src/engine/sound/sopra/util/buildAttenuationCurve.js +40 -0
  456. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +34 -0
  457. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -0
  458. package/src/engine/sound/sopra/util/fadeOutAndStop.js +60 -0
  459. package/src/engine/sound/volume2dB.d.ts +1 -1
  460. package/src/engine/sound/volume2dB.d.ts.map +1 -1
  461. package/src/engine/sound/volume2dB.js +1 -1
  462. package/src/engine/graphics/sh3/path_tracer/sampling/v3_orthonormal_matrix_from_normal.d.ts.map +0 -1
  463. package/src/engine/physics/narrowphase/ray_shapes.d.ts +0 -66
  464. package/src/engine/physics/narrowphase/ray_shapes.d.ts.map +0 -1
  465. package/src/engine/physics/narrowphase/ray_shapes.js +0 -187
  466. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.d.ts +0 -23
  467. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.d.ts.map +0 -1
  468. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.js +0 -32
  469. package/src/engine/sound/ecs/emitter/SoundTrackNodes.d.ts +0 -18
  470. package/src/engine/sound/ecs/emitter/SoundTrackNodes.d.ts.map +0 -1
  471. package/src/engine/sound/ecs/emitter/SoundTrackNodes.js +0 -18
  472. package/src/engine/sound/sopra/AbstractAudioClip.d.ts +0 -26
  473. package/src/engine/sound/sopra/AbstractAudioClip.d.ts.map +0 -1
  474. package/src/engine/sound/sopra/AbstractAudioClip.js +0 -29
  475. package/src/engine/sound/sopra/ContainerAudioClip.d.ts +0 -12
  476. package/src/engine/sound/sopra/ContainerAudioClip.d.ts.map +0 -1
  477. package/src/engine/sound/sopra/ContainerAudioClip.js +0 -13
  478. package/src/engine/sound/sopra/RandomContainerAudioClip.d.ts +0 -12
  479. package/src/engine/sound/sopra/RandomContainerAudioClip.d.ts.map +0 -1
  480. package/src/engine/sound/sopra/RandomContainerAudioClip.js +0 -15
  481. package/src/engine/sound/sopra/SequenceContainerAudioClip.d.ts +0 -7
  482. package/src/engine/sound/sopra/SequenceContainerAudioClip.d.ts.map +0 -1
  483. package/src/engine/sound/sopra/SequenceContainerAudioClip.js +0 -8
  484. package/src/engine/sound/sopra/SilenceAudioClip.d.ts +0 -13
  485. package/src/engine/sound/sopra/SilenceAudioClip.d.ts.map +0 -1
  486. package/src/engine/sound/sopra/SilenceAudioClip.js +0 -15
  487. /package/src/{engine/graphics/sh3/path_tracer/sampling → core/geom/vec3}/v3_orthonormal_matrix_from_normal.d.ts +0 -0
@@ -1,253 +1,275 @@
1
- import { assert } from "../../assert.js";
2
- import { NULL_NODE } from "./BVH.js";
3
-
4
- /**
5
- * Karras 2012 — "Maximizing Parallelism in the Construction of BVHs, Octrees, and k-d Trees".
6
- *
7
- * For a sorted array of N Morton codes, build a binary radix tree of N-1 internal
8
- * nodes and N leaves. Each internal node corresponds to the longest common prefix
9
- * of a contiguous range of Morton codes; its split point is where the first bit
10
- * after that prefix flips from 0 to 1.
11
- *
12
- * The caller must pre-allocate:
13
- * - `leaf_count` leaf nodes in `bvh`, each with its AABB and user-data set;
14
- * their IDs are passed in `leaf_nodes`, sorted by `sorted_morton_codes`.
15
- * - `leaf_count - 1` internal nodes (when `leaf_count >= 2`); their IDs are
16
- * passed in `internal_nodes`, in arbitrary order.
17
- *
18
- * The returned root index is wired into the tree; internal-node bounds and
19
- * heights are filled in by a bottom-up refit after structural construction.
20
- *
21
- * @see "Thinking Parallel, Part III: Tree Construction on the GPU", 2012 by Tero Karras
22
- */
23
-
24
- /**
25
- * Compute the position of the first bit where the codes at `first` and `last`
26
- * differ in their longest-common-prefix sense — i.e. the split point for the
27
- * range [first, last]. Returns an index `s` such that all codes in [first, s]
28
- * share more leading bits with the firstCode than codes in [s+1, last] do.
29
- *
30
- * @param {number[]|Uint32Array} sortedMortonCodes
31
- * @param {number} first
32
- * @param {number} last
33
- * @return {number}
34
- */
35
- function find_split(sortedMortonCodes, first, last) {
36
- const firstCode = sortedMortonCodes[first];
37
- const lastCode = sortedMortonCodes[last];
38
-
39
- // Identical Morton codes (multiple leaves at the same point): split the
40
- // range in the middle so we still build a balanced subtree.
41
- if (firstCode === lastCode) {
42
- return (first + last) >>> 1;
43
- }
44
-
45
- // Number of highest bits that match between first and last.
46
- const commonPrefix = Math.clz32(firstCode ^ lastCode);
47
-
48
- // Binary search for the highest index that still shares more than
49
- // `commonPrefix` bits with the firstCode.
50
- let split = first;
51
- let step = last - first;
52
-
53
- do {
54
- step = (step + 1) >>> 1;
55
- const newSplit = split + step;
56
-
57
- if (newSplit < last) {
58
- const splitCode = sortedMortonCodes[newSplit];
59
- const splitPrefix = Math.clz32(firstCode ^ splitCode);
60
- if (splitPrefix > commonPrefix) {
61
- split = newSplit;
62
- }
63
- }
64
- } while (step > 1);
65
-
66
- return split;
67
- }
68
-
69
- /**
70
- * Determine the [first, last] code range covered by internal node `idx`.
71
- *
72
- * @see https://github.com/mbartling/cuda-bvh/blob/7f2f98d9d29956c3559632e59104ba66f31f80b8/kernels/bvh.cu#L276
73
- * @param {number[]|Uint32Array} output 2-element output [first, last]
74
- * @param {number[]|Uint32Array} sortedMortonCodes
75
- * @param {number} leaf_count
76
- * @param {number} idx
77
- */
78
- function determineRange(output, sortedMortonCodes, leaf_count, idx) {
79
- // For the root (idx === 0) the range is unambiguously [0, leaf_count - 1].
80
- // We short-circuit so callers don't have to special-case it.
81
- if (idx === 0) {
82
- output[0] = 0;
83
- output[1] = leaf_count - 1;
84
- return;
85
- }
86
-
87
- const codeIdx = sortedMortonCodes[idx];
88
- const prefixRight = Math.clz32(codeIdx ^ sortedMortonCodes[idx + 1]);
89
- const prefixLeft = Math.clz32(codeIdx ^ sortedMortonCodes[idx - 1]);
90
-
91
- const direction = (prefixRight - prefixLeft) > 0 ? 1 : -1;
92
-
93
- // Minimum prefix length we require to stay in this range anything that
94
- // shares fewer bits than this is "outside" the node's subtree.
95
- const min_prefix_range = Math.clz32(codeIdx ^ sortedMortonCodes[idx - direction]);
96
-
97
- // Expand maximum range with exponential growth, bounded by array.
98
- let lmax = 2;
99
- let next_key = idx + lmax * direction;
100
-
101
- while (
102
- next_key >= 0 &&
103
- next_key < leaf_count &&
104
- Math.clz32(codeIdx ^ sortedMortonCodes[next_key]) > min_prefix_range
105
- ) {
106
- lmax *= 2;
107
- next_key = idx + lmax * direction;
108
- }
109
-
110
- // Binary-search for the actual length within [0, lmax].
111
- let length = 0;
112
- do {
113
- lmax = (lmax + 1) >> 1;
114
- const new_val = idx + (length + lmax) * direction;
115
-
116
- if (new_val >= 0 && new_val < leaf_count) {
117
- const prefix = Math.clz32(codeIdx ^ sortedMortonCodes[new_val]);
118
- if (prefix > min_prefix_range) {
119
- length += lmax;
120
- }
121
- }
122
- } while (lmax > 1);
123
-
124
- const j = idx + length * direction;
125
-
126
- output[0] = Math.min(idx, j);
127
- output[1] = Math.max(idx, j);
128
- }
129
-
130
- /**
131
- * Bottom-up bounds and height refit for a radix-built tree.
132
- *
133
- * Walks the tree once in pre-order to collect every reachable node, then
134
- * processes them in reverse — which is post-order for trees — combining
135
- * each internal node's AABB from its children and updating its height.
136
- *
137
- * @param {BVH} bvh
138
- * @param {number} root
139
- */
140
- function refit_radix_tree(bvh, root) {
141
- if (root === NULL_NODE) {
142
- return;
143
- }
144
-
145
- const order = [];
146
- const stack = [root];
147
-
148
- while (stack.length > 0) {
149
- const node = stack.pop();
150
- order.push(node);
151
-
152
- if (!bvh.node_is_leaf(node)) {
153
- stack.push(bvh.node_get_child1(node));
154
- stack.push(bvh.node_get_child2(node));
155
- }
156
- }
157
-
158
- for (let i = order.length - 1; i >= 0; i--) {
159
- const node = order[i];
160
- if (bvh.node_is_leaf(node)) {
161
- continue;
162
- }
163
- const c1 = bvh.node_get_child1(node);
164
- const c2 = bvh.node_get_child2(node);
165
- bvh.node_set_combined_aabb(node, c1, c2);
166
- bvh.node_set_height(
167
- node,
168
- 1 + Math.max(bvh.node_get_height(c1), bvh.node_get_height(c2))
169
- );
170
- }
171
- }
172
-
173
- /**
174
- * Build a binary radix tree over the given leaves and Morton codes.
175
- *
176
- * @param {BVH} bvh
177
- * @param {number[]|Uint32Array} leaf_nodes
178
- * Pre-allocated leaf node IDs, ordered to match `sorted_morton_codes`
179
- * (i.e. leaf_nodes[i]'s code is sorted_morton_codes[i]).
180
- * @param {number[]|Uint32Array} sorted_morton_codes
181
- * Morton codes in non-decreasing order. May contain duplicates.
182
- * @param {number} leaf_count
183
- * Number of leaves (must equal the length of `leaf_nodes` and
184
- * `sorted_morton_codes` that the function will actually look at).
185
- * @param {number[]|Uint32Array} internal_nodes
186
- * Pre-allocated internal node IDs, of length at least `leaf_count - 1`.
187
- * Ignored when leaf_count < 2.
188
- * @returns {number} The root node id, or NULL_NODE if leaf_count is 0.
189
- */
190
- export function ebvh_build_hierarchy_radix(
191
- bvh,
192
- leaf_nodes,
193
- sorted_morton_codes,
194
- leaf_count,
195
- internal_nodes
196
- ) {
197
- assert.isNonNegativeInteger(leaf_count, 'leaf_count');
198
-
199
- // Empty input: nothing to build.
200
- if (leaf_count === 0) {
201
- return NULL_NODE;
202
- }
203
-
204
- // Single leaf is its own root; no internal node needed.
205
- if (leaf_count === 1) {
206
- const root = leaf_nodes[0];
207
- bvh.node_set_parent(root, NULL_NODE);
208
- return root;
209
- }
210
-
211
- // General case: build leaf_count - 1 internal nodes per Karras 2012.
212
- const range = new Uint32Array(2);
213
- const internal_node_count = leaf_count - 1;
214
-
215
- for (let idx = 0; idx < internal_node_count; idx++) {
216
- determineRange(range, sorted_morton_codes, leaf_count, idx);
217
-
218
- const first = range[0];
219
- const last = range[1];
220
-
221
- const split = find_split(sorted_morton_codes, first, last);
222
- assert.isNonNegativeInteger(split, 'split');
223
-
224
- // child A: the [first, split] subrange's owner. If that subrange is a
225
- // single element it's a leaf; otherwise it's the internal node at
226
- // index `split` (Karras's convention: internal node k owns the range
227
- // whose left boundary is at code-index k).
228
- const childA = (split === first)
229
- ? leaf_nodes[split]
230
- : internal_nodes[split];
231
-
232
- // child B: the [split+1, last] subrange's owner.
233
- const childB = (split + 1 === last)
234
- ? leaf_nodes[split + 1]
235
- : internal_nodes[split + 1];
236
-
237
- const parent = internal_nodes[idx];
238
- bvh.node_assign_children_only(parent, childA, childB);
239
- }
240
-
241
- // Internal node 0 covers [0, leaf_count - 1] — the whole tree — and is
242
- // therefore the root.
243
- const root = internal_nodes[0];
244
- bvh.node_set_parent(root, NULL_NODE);
245
-
246
- // Walk back up to fill in correct AABBs and heights for every internal
247
- // node. Heights set during construction by node_assign_children_only are
248
- // stale because children may not have been built yet at parent-creation
249
- // time.
250
- refit_radix_tree(bvh, root);
251
-
252
- return root;
253
- }
1
+ import { assert } from "../../assert.js";
2
+ import { NULL_NODE } from "./BVH.js";
3
+
4
+ /**
5
+ * Karras 2012 — "Maximizing Parallelism in the Construction of BVHs, Octrees, and k-d Trees".
6
+ *
7
+ * For a sorted array of N Morton codes, build a binary radix tree of N-1 internal
8
+ * nodes and N leaves. Each internal node corresponds to the longest common prefix
9
+ * of a contiguous range of Morton codes; its split point is where the first bit
10
+ * after that prefix flips from 0 to 1.
11
+ *
12
+ * The caller must pre-allocate:
13
+ * - `leaf_count` leaf nodes in `bvh`, each with its AABB and user-data set;
14
+ * their IDs are passed in `leaf_nodes`, sorted by `sorted_morton_codes`.
15
+ * - `leaf_count - 1` internal nodes (when `leaf_count >= 2`); their IDs are
16
+ * passed in `internal_nodes`, in arbitrary order.
17
+ *
18
+ * The returned root index is wired into the tree; internal-node bounds and
19
+ * heights are filled in by a bottom-up refit after structural construction.
20
+ *
21
+ * @see "Thinking Parallel, Part III: Tree Construction on the GPU", 2012 by Tero Karras
22
+ */
23
+
24
+ /**
25
+ * Compute the position of the first bit where the codes at `first` and `last`
26
+ * differ in their longest-common-prefix sense — i.e. the split point for the
27
+ * range [first, last]. Returns an index `s` such that all codes in [first, s]
28
+ * share more leading bits with the firstCode than codes in [s+1, last] do.
29
+ *
30
+ * @param {number[]|Uint32Array} sortedMortonCodes
31
+ * @param {number} first
32
+ * @param {number} last
33
+ * @return {number}
34
+ */
35
+ /**
36
+ * Karras longest-common-prefix length between the codes at indices `i` and `j`, with the standard
37
+ * index tiebreaker: identical Morton codes are disambiguated by their (distinct) indices, so a node's
38
+ * range never collapses to a degenerate single element. Returns -1 for `j` outside [0, n-1] (the
39
+ * canonical Karras "out of range" sentinel).
40
+ *
41
+ * @param {number[]|Uint32Array} codes
42
+ * @param {number} n number of codes
43
+ * @param {number} i
44
+ * @param {number} j
45
+ * @return {number}
46
+ */
47
+ function delta(codes, n, i, j) {
48
+ if (j < 0 || j >= n) {
49
+ return -1;
50
+ }
51
+
52
+ const ci = codes[i];
53
+ const cj = codes[j];
54
+
55
+ if (ci === cj) {
56
+ // identical codes: break the tie by index so every internal node still owns a >= 2-leaf range
57
+ return 32 + Math.clz32(i ^ j);
58
+ }
59
+
60
+ return Math.clz32(ci ^ cj);
61
+ }
62
+
63
+ function find_split(sortedMortonCodes, n, first, last) {
64
+ // NOTE: do not special-case identical Morton codes with a midpoint split. delta() breaks ties by index, so
65
+ // the binary search below finds a split that is consistent with determineRange's index-based ranges. A
66
+ // midpoint shortcut returns a different split, which makes a parent and its child both claim the same leaf
67
+ // (producing a shared node / non-tree) when duplicate codes appear mid-range.
68
+
69
+ // Number of highest bits that match between first and last (index-tiebroken).
70
+ const commonPrefix = delta(sortedMortonCodes, n, first, last);
71
+
72
+ // Binary search for the highest index that still shares more than
73
+ // `commonPrefix` bits with the firstCode.
74
+ let split = first;
75
+ let step = last - first;
76
+
77
+ do {
78
+ step = (step + 1) >>> 1;
79
+ const newSplit = split + step;
80
+
81
+ if (newSplit < last) {
82
+ const splitPrefix = delta(sortedMortonCodes, n, first, newSplit);
83
+ if (splitPrefix > commonPrefix) {
84
+ split = newSplit;
85
+ }
86
+ }
87
+ } while (step > 1);
88
+
89
+ return split;
90
+ }
91
+
92
+ /**
93
+ * Determine the [first, last] code range covered by internal node `idx`.
94
+ *
95
+ * @see https://github.com/mbartling/cuda-bvh/blob/7f2f98d9d29956c3559632e59104ba66f31f80b8/kernels/bvh.cu#L276
96
+ * @param {number[]|Uint32Array} output 2-element output [first, last]
97
+ * @param {number[]|Uint32Array} sortedMortonCodes
98
+ * @param {number} leaf_count
99
+ * @param {number} idx
100
+ */
101
+ function determineRange(output, sortedMortonCodes, leaf_count, idx) {
102
+ // For the root (idx === 0) the range is unambiguously [0, leaf_count - 1].
103
+ // We short-circuit so callers don't have to special-case it.
104
+ if (idx === 0) {
105
+ output[0] = 0;
106
+ output[1] = leaf_count - 1;
107
+ return;
108
+ }
109
+
110
+ const prefixRight = delta(sortedMortonCodes, leaf_count, idx, idx + 1);
111
+ const prefixLeft = delta(sortedMortonCodes, leaf_count, idx, idx - 1);
112
+
113
+ const direction = (prefixRight - prefixLeft) > 0 ? 1 : -1;
114
+
115
+ // Minimum prefix length we require to stay in this range — anything that
116
+ // shares fewer bits than this is "outside" the node's subtree.
117
+ const min_prefix_range = delta(sortedMortonCodes, leaf_count, idx, idx - direction);
118
+
119
+ // Expand maximum range with exponential growth, bounded by array.
120
+ let lmax = 2;
121
+ let next_key = idx + lmax * direction;
122
+
123
+ while (
124
+ next_key >= 0 &&
125
+ next_key < leaf_count &&
126
+ delta(sortedMortonCodes, leaf_count, idx, next_key) > min_prefix_range
127
+ ) {
128
+ lmax *= 2;
129
+ next_key = idx + lmax * direction;
130
+ }
131
+
132
+ // Binary-search for the actual length within [0, lmax].
133
+ let length = 0;
134
+ do {
135
+ lmax = (lmax + 1) >> 1;
136
+ const new_val = idx + (length + lmax) * direction;
137
+
138
+ if (new_val >= 0 && new_val < leaf_count) {
139
+ const prefix = delta(sortedMortonCodes, leaf_count, idx, new_val);
140
+ if (prefix > min_prefix_range) {
141
+ length += lmax;
142
+ }
143
+ }
144
+ } while (lmax > 1);
145
+
146
+ const j = idx + length * direction;
147
+
148
+ output[0] = Math.min(idx, j);
149
+ output[1] = Math.max(idx, j);
150
+ }
151
+
152
+ /**
153
+ * Bottom-up bounds and height refit for a radix-built tree.
154
+ *
155
+ * Walks the tree once in pre-order to collect every reachable node, then
156
+ * processes them in reverse — which is post-order for trees — combining
157
+ * each internal node's AABB from its children and updating its height.
158
+ *
159
+ * @param {BVH} bvh
160
+ * @param {number} root
161
+ */
162
+ function refit_radix_tree(bvh, root) {
163
+ if (root === NULL_NODE) {
164
+ return;
165
+ }
166
+
167
+ const order = [];
168
+ const stack = [root];
169
+
170
+ while (stack.length > 0) {
171
+ const node = stack.pop();
172
+ order.push(node);
173
+
174
+ if (!bvh.node_is_leaf(node)) {
175
+ stack.push(bvh.node_get_child1(node));
176
+ stack.push(bvh.node_get_child2(node));
177
+ }
178
+ }
179
+
180
+ for (let i = order.length - 1; i >= 0; i--) {
181
+ const node = order[i];
182
+ if (bvh.node_is_leaf(node)) {
183
+ continue;
184
+ }
185
+ const c1 = bvh.node_get_child1(node);
186
+ const c2 = bvh.node_get_child2(node);
187
+ bvh.node_set_combined_aabb(node, c1, c2);
188
+ bvh.node_set_height(
189
+ node,
190
+ 1 + Math.max(bvh.node_get_height(c1), bvh.node_get_height(c2))
191
+ );
192
+ }
193
+ }
194
+
195
+ /**
196
+ * Build a binary radix tree over the given leaves and Morton codes.
197
+ *
198
+ * @param {BVH} bvh
199
+ * @param {number[]|Uint32Array} leaf_nodes
200
+ * Pre-allocated leaf node IDs, ordered to match `sorted_morton_codes`
201
+ * (i.e. leaf_nodes[i]'s code is sorted_morton_codes[i]).
202
+ * @param {number[]|Uint32Array} sorted_morton_codes
203
+ * Morton codes in non-decreasing order. May contain duplicates.
204
+ * @param {number} leaf_count
205
+ * Number of leaves (must equal the length of `leaf_nodes` and
206
+ * `sorted_morton_codes` that the function will actually look at).
207
+ * @param {number[]|Uint32Array} internal_nodes
208
+ * Pre-allocated internal node IDs, of length at least `leaf_count - 1`.
209
+ * Ignored when leaf_count < 2.
210
+ * @returns {number} The root node id, or NULL_NODE if leaf_count is 0.
211
+ */
212
+ export function ebvh_build_hierarchy_radix(
213
+ bvh,
214
+ leaf_nodes,
215
+ sorted_morton_codes,
216
+ leaf_count,
217
+ internal_nodes
218
+ ) {
219
+ assert.isNonNegativeInteger(leaf_count, 'leaf_count');
220
+
221
+ // Empty input: nothing to build.
222
+ if (leaf_count === 0) {
223
+ return NULL_NODE;
224
+ }
225
+
226
+ // Single leaf is its own root; no internal node needed.
227
+ if (leaf_count === 1) {
228
+ const root = leaf_nodes[0];
229
+ bvh.node_set_parent(root, NULL_NODE);
230
+ return root;
231
+ }
232
+
233
+ // General case: build leaf_count - 1 internal nodes per Karras 2012.
234
+ const range = new Uint32Array(2);
235
+ const internal_node_count = leaf_count - 1;
236
+
237
+ for (let idx = 0; idx < internal_node_count; idx++) {
238
+ determineRange(range, sorted_morton_codes, leaf_count, idx);
239
+
240
+ const first = range[0];
241
+ const last = range[1];
242
+
243
+ const split = find_split(sorted_morton_codes, leaf_count, first, last);
244
+ assert.isNonNegativeInteger(split, 'split');
245
+
246
+ // child A: the [first, split] subrange's owner. If that subrange is a
247
+ // single element it's a leaf; otherwise it's the internal node at
248
+ // index `split` (Karras's convention: internal node k owns the range
249
+ // whose left boundary is at code-index k).
250
+ const childA = (split === first)
251
+ ? leaf_nodes[split]
252
+ : internal_nodes[split];
253
+
254
+ // child B: the [split+1, last] subrange's owner.
255
+ const childB = (split + 1 === last)
256
+ ? leaf_nodes[split + 1]
257
+ : internal_nodes[split + 1];
258
+
259
+ const parent = internal_nodes[idx];
260
+ bvh.node_assign_children_only(parent, childA, childB);
261
+ }
262
+
263
+ // Internal node 0 covers [0, leaf_count - 1] — the whole tree — and is
264
+ // therefore the root.
265
+ const root = internal_nodes[0];
266
+ bvh.node_set_parent(root, NULL_NODE);
267
+
268
+ // Walk back up to fill in correct AABBs and heights for every internal
269
+ // node. Heights set during construction by node_assign_children_only are
270
+ // stale because children may not have been built yet at parent-creation
271
+ // time.
272
+ refit_radix_tree(bvh, root);
273
+
274
+ return root;
275
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../../../src/core/cache/Cache.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IAgBI;;;;;;;;;;OAUG;IACH,sGARW,MAAM,EA2FhB;IAzDG;;;;OAIG;IACH,mBAA4B;IAE5B;;;;OAIG;IACH,qBAAgC;IAEhC;;;;OAIG;IACH,gBAAmB;IACnB;;;;OAIG;IACH,eAAkB;IAGlB;;;;OAIG;IACH,aAIE;IAEF;;;;OAIG;IACH,WAFU,OAAO,GAAG,EAAC,KAAK,CAAC,CAEE;IAE7B;;;OAGG;IACH,WAFU,OAAO,GAAG,EAAC,KAAK,CAAC,CAEE;IAE7B;;;OAGG;IACH,OAFU,OAAO,GAAG,EAAC,KAAK,CAAC,CAEF;IAG7B;;;;;OAKG;IACH,kBAyBC;IAED;;;OAGG;IACH,QAFa,MAAM,CAIlB;IAED;;OAEG;IACH,+BAEC;IAED;;;;;OAKG;IACH,qBAEC;IAED;;;OAGG;IACH,2BAeC;IAED,wBAEC;IAED;;;;OAIG;IACH,wBAaC;IAED;;;;;;OAMG;IACH,yBAHW,GAAG,GACD,OAAO,CAgCnB;IAED;;;;;OAKG;IACH,6BAUC;IAED;;;OAGG;IACH,sBAFa,aAAa,GAAG,EAAC,KAAK,CAAC,GAAC,IAAI,CAIxC;IAED;;;OAGG;IACH,YAFa,OAAO,CAkBnB;IAED;;;OAGG;IACH,gCAFW,MAAM,QAWhB;IAED;;;;OAIG;IACH,SAHW,GAAG,SACH,KAAK,QAwEf;IAED;;;;OAIG;IACH,cAHW,GAAG,GACD,OAAO,CAInB;IAED;;;;OAIG;IACH,SAHW,GAAG,GACD,KAAK,GAAC,IAAI,CAYtB;IAGD;;;;;;OAMG;IACH,kBALW,GAAG,kBACM,GAAG,KAAE,KAAK,0BAElB,KAAK,CAchB;IAED;;;;OAIG;IACH,wBAqBC;IAED;;;;OAIG;IACH,YAHW,GAAG,GACD,OAAO,CAgBnB;IAED;;;;;OAKG;IACH,kBAHW,GAAG,GACD,OAAO,CAanB;IAED;;;;OAIG;IACH,cAcC;IAED;;;OAGG;IACH,aAOC;IAED;;;;;OAKG;IACH,wCAFa,OAAO,CAMnB;IAGL;;;OAGG;IACH,6CAAmB;IAEnB;;;OAGG;IACH,+BA9FiB,OAAO,CA8FF;IAEtB;;;OAGG;IACH,4BAhLiB,OAAO,CAgLL;;CAlBlB;mBAtkBkB,4BAA4B;6BAKlB,mBAAmB"}
1
+ {"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../../../src/core/cache/Cache.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IAgBI;;;;;;;;;;OAUG;IACH,sGARW,MAAM,EA2FhB;IAzDG;;;;OAIG;IACH,mBAA4B;IAE5B;;;;OAIG;IACH,qBAAgC;IAEhC;;;;OAIG;IACH,gBAAmB;IACnB;;;;OAIG;IACH,eAAkB;IAGlB;;;;OAIG;IACH,aAIE;IAEF;;;;OAIG;IACH,WAFU,OAAO,GAAG,EAAC,KAAK,CAAC,CAEE;IAE7B;;;OAGG;IACH,WAFU,OAAO,GAAG,EAAC,KAAK,CAAC,CAEE;IAE7B;;;OAGG;IACH,OAFU,OAAO,GAAG,EAAC,KAAK,CAAC,CAEF;IAG7B;;;;;OAKG;IACH,kBAyBC;IAED;;;OAGG;IACH,QAFa,MAAM,CAIlB;IAED;;OAEG;IACH,+BAEC;IAED;;;;;OAKG;IACH,qBAEC;IAED;;;OAGG;IACH,2BAeC;IAED,wBAEC;IAED;;;;OAIG;IACH,wBAaC;IAED;;;;;;OAMG;IACH,yBAHW,GAAG,GACD,OAAO,CAgCnB;IAED;;;;;OAKG;IACH,6BAUC;IAED;;;OAGG;IACH,sBAFa,aAAa,GAAG,EAAC,KAAK,CAAC,GAAC,IAAI,CAIxC;IAED;;;OAGG;IACH,YAFa,OAAO,CAkBnB;IAED;;;OAGG;IACH,gCAFW,MAAM,QAWhB;IAED;;;;OAIG;IACH,SAHW,GAAG,SACH,KAAK,QA+Ef;IAED;;;;OAIG;IACH,cAHW,GAAG,GACD,OAAO,CAInB;IAED;;;;OAIG;IACH,SAHW,GAAG,GACD,KAAK,GAAC,IAAI,CAYtB;IAGD;;;;;;OAMG;IACH,kBALW,GAAG,kBACM,GAAG,KAAE,KAAK,0BAElB,KAAK,CAchB;IAED;;;;OAIG;IACH,wBAqBC;IAED;;;;OAIG;IACH,YAHW,GAAG,GACD,OAAO,CAgBnB;IAED;;;;;OAKG;IACH,kBAHW,GAAG,GACD,OAAO,CAanB;IAED;;;;OAIG;IACH,cAcC;IAED;;;OAGG;IACH,aAOC;IAED;;;;;OAKG;IACH,wCAFa,OAAO,CAMnB;IAGL;;;OAGG;IACH,6CAAmB;IAEnB;;;OAGG;IACH,+BA9FiB,OAAO,CA8FF;IAEtB;;;OAGG;IACH,4BAhLiB,OAAO,CAgLL;;CAlBlB;mBA7kBkB,4BAA4B;6BAKlB,mBAAmB"}
@@ -417,6 +417,13 @@ export class Cache {
417
417
 
418
418
  // element inserted again, promote it to the front of the access queue
419
419
  this.__promote(element);
420
+
421
+ // Replacing a key's value with a heavier one can push total weight over capacity; trim back down.
422
+ // The element was just promoted to the front (most-recently-used), so evictUntilWeight (which evicts
423
+ // from the LRU tail) won't evict it unless it alone exceeds maxWeight.
424
+ if (this.#weight > this.#maxWeight && element.weight <= this.#maxWeight) {
425
+ this.evictUntilWeight(this.#maxWeight);
426
+ }
420
427
  }
421
428
 
422
429
  this.onSet.send2(key, value);
@@ -1 +1 @@
1
- {"version":3,"file":"FrequencySketch.d.ts","sourceRoot":"","sources":["../../../../src/core/cache/FrequencySketch.js"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH;IACI;;;OAGG;IACH,YAFU,MAAM,CAED;IACf;;;OAGG;IACH,WAFU,MAAM,CAEF;IACd;;;OAGG;IACH,OAFU,WAAW,GAAC,IAAI,CAEb;IACb;;;OAGG;IACH,MAFU,MAAM,CAEP;IAET;;;;;;OAMG;IACH,4BAFW,MAAM,QAsBhB;IAED;;;;;OAKG;IACH,oBAFa,OAAO,CAInB;IAED;;;;;OAKG;IACH,sBAHW,MAAM,GACJ,MAAM,CAclB;IAED;;;;;;;OAOG;IACH,sBAFW,MAAM,QAoBhB;IAED;;;;;;OAMG;IACH,eAJW,MAAM,KACN,MAAM,GACJ,OAAO,CAgBnB;IAED;;OAEG;IACH,cAaC;IAED;;;;;OAKG;IACH,cAJW,MAAM,KACN,MAAM,GACJ,MAAM,CAOlB;IAED;;;;OAIG;IACH,UAHW,MAAM,GACJ,MAAM,CASlB;CACJ"}
1
+ {"version":3,"file":"FrequencySketch.d.ts","sourceRoot":"","sources":["../../../../src/core/cache/FrequencySketch.js"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH;IACI;;;OAGG;IACH,YAFU,MAAM,CAED;IACf;;;OAGG;IACH,WAFU,MAAM,CAEF;IACd;;;OAGG;IACH,OAFU,WAAW,GAAC,IAAI,CAEb;IACb;;;OAGG;IACH,MAFU,MAAM,CAEP;IAET;;;;;;OAMG;IACH,4BAFW,MAAM,QAsBhB;IAED;;;;;OAKG;IACH,oBAFa,OAAO,CAInB;IAED;;;;;OAKG;IACH,sBAHW,MAAM,GACJ,MAAM,CAclB;IAED;;;;;;;OAOG;IACH,sBAFW,MAAM,QAwBhB;IAED;;;;;;OAMG;IACH,eAJW,MAAM,KACN,MAAM,GACJ,OAAO,CAgBnB;IAED;;OAEG;IACH,cAaC;IAED;;;;;OAKG;IACH,cAJW,MAAM,KACN,MAAM,GACJ,MAAM,CAOlB;IAED;;;;OAIG;IACH,UAHW,MAAM,GACJ,MAAM,CASlB;CACJ"}
@@ -152,10 +152,14 @@ export class FrequencySketch {
152
152
  const index2 = this.indexOf(hash, 2);
153
153
  const index3 = this.indexOf(hash, 3);
154
154
 
155
- const added = this.incrementAt(index0, start)
156
- || this.incrementAt(index1, start + 1)
157
- || this.incrementAt(index2, start + 2)
158
- || this.incrementAt(index3, start + 3);
155
+ // Evaluate all four counters unconditionally; `||` would short-circuit and skip the remaining
156
+ // increments as soon as the first one returned true, so only one of the four counters would ever advance.
157
+ const added0 = this.incrementAt(index0, start);
158
+ const added1 = this.incrementAt(index1, start + 1);
159
+ const added2 = this.incrementAt(index2, start + 2);
160
+ const added3 = this.incrementAt(index3, start + 3);
161
+
162
+ const added = added0 || added1 || added2 || added3;
159
163
 
160
164
  if (added && (++this.size === this.sampleSize)) {
161
165
  this.reset();
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Resolves the platform clipboard, verifying read/write permissions are granted when necessary.
3
+ * @returns {Promise<Clipboard>}
4
+ */
5
+ export function obtainClipBoard(): Promise<Clipboard>;
6
+ //# sourceMappingURL=obtainClipBoard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obtainClipBoard.d.ts","sourceRoot":"","sources":["../../../../src/core/clipboard/obtainClipBoard.js"],"names":[],"mappings":"AAAA;;;GAGG;AACH,mCAFa,QAAQ,SAAS,CAAC,CA0B9B"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Resolves the platform clipboard, verifying read/write permissions are granted when necessary.
3
+ * @returns {Promise<Clipboard>}
4
+ */
5
+ export async function obtainClipBoard() {
6
+ const navigator = globalThis.navigator;
7
+
8
+ if (navigator.clipboard === undefined) {
9
+ const queries = [{
10
+ name: "clipboard-read"
11
+ }, {
12
+ name: "clipboard-write"
13
+ }];
14
+
15
+ const permission_queries = queries.map(q => navigator.permissions.query(q));
16
+
17
+ const statuses = await Promise.all(permission_queries);
18
+
19
+ for (let i = 0; i < statuses.length; i++) {
20
+ const permissionStatus = statuses[i];
21
+
22
+ if (permissionStatus.state !== "granted") {
23
+ throw new Error(`Permission for query not granted (actual state = ${permissionStatus.state}). Query:${JSON.stringify(queries[i])}`)
24
+ }
25
+ }
26
+ }
27
+
28
+ return navigator.clipboard;
29
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Reads text from the clipboard, falling back to a file picker prompt when no clipboard is available.
3
+ * @returns {Promise<string>}
4
+ */
5
+ export function safeClipboardReadText(): Promise<string>;
6
+ //# sourceMappingURL=safeClipboardReadText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeClipboardReadText.d.ts","sourceRoot":"","sources":["../../../../src/core/clipboard/safeClipboardReadText.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,yCAFa,QAAQ,MAAM,CAAC,CAkD3B"}