@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
@@ -5,47 +5,52 @@ import { complex_div } from "../../complex/complex_div.js";
5
5
  import { complex_mul } from "../../complex/complex_mul.js";
6
6
  import { complex_sub } from "../../complex/complex_sub.js";
7
7
 
8
+ // Kept for compute_mie_phase.js. The complex algebra below is allocation-free (it calls the meep
9
+ // complex primitives directly into reused scratch), so the old allocating cadd/cmult/cdiv wrappers
10
+ // are gone.
8
11
  export function vec2(x, y) {
9
12
  return new Float64Array([x, y]);
10
13
  }
11
14
 
12
- function vec4(x, y, z, w) {
13
- return new Float64Array([x, y, z, w]);
14
- }
15
-
16
- export function cadd(a, b) {
17
- const r = vec2(0, 0);
18
-
19
- complex_add(r, a, b);
20
-
21
- return r;
22
- }
23
-
24
- function csub(a, b) {
25
- const r = vec2(0, 0);
26
-
27
-
28
- complex_sub(r, a, b);
29
-
30
- return r;
31
- }
32
-
33
- export function cmult(a, b) {
34
- const r = vec2(0, 0);
35
-
36
-
37
- complex_mul(r, a, b);
38
-
39
- return r;
40
- }
41
-
42
- export function cdiv(a, b) {
43
- const r = vec2(0, 0);
44
-
45
-
46
- complex_div(r, a, b);
47
-
48
- return r;
15
+ // ---------------------------------------------------------------------------------------------
16
+ // Allocation-free complex algebra.
17
+ //
18
+ // The recurrences below call the non-allocating meep complex primitives (complex_add/sub/mul/div,
19
+ // which write their result into a caller-provided 2-vector) directly, routing every temporary
20
+ // through these module-static scratch buffers instead of allocating a fresh result per operation.
21
+ // lorenz_mie_coefs is single-threaded and non-reentrant (no await, no recursion), so reusing the
22
+ // scratch across the whole computation is safe. Only the returned coefficient array is allocated.
23
+ //
24
+ // IMPORTANT: complex_mul / complex_div are NOT aliasing-safe (they write result[0] then read it
25
+ // when computing result[1]). Their output buffer must therefore differ from both inputs. (add/sub
26
+ // are aliasing-safe.) Every call below respects this.
27
+ // ---------------------------------------------------------------------------------------------
28
+ const _t0 = new Float64Array(2);
29
+ const _t1 = new Float64Array(2);
30
+ const _t2 = new Float64Array(2);
31
+ const _t3 = new Float64Array(2);
32
+ const _t4 = new Float64Array(2);
33
+ const _t5 = new Float64Array(2);
34
+ const _t6 = new Float64Array(2);
35
+
36
+ const _x = new Float64Array(2); // size parameter in the host medium
37
+ const _y = new Float64Array(2); // size parameter in the particle
38
+ const _prev_psi_zeta = new Float64Array(2);
39
+ const _prev_B = new Float64Array(2);
40
+ const _prev_R = new Float64Array(2);
41
+ const _cur_psi_zeta = new Float64Array(2);
42
+ const _cur_B = new Float64Array(2);
43
+ const _cur_R = new Float64Array(2);
44
+
45
+ // Reused pools for the log-derivative arrays A_n(x) and A_n(y); grown on demand. They are alive
46
+ // at the same time (medium vs particle), hence two separate pools.
47
+ const _A_med = [];
48
+ const _A_p = [];
49
+
50
+ function ensure_vec2_pool(pool, count) {
51
+ for (let i = pool.length; i < count; ++i) {
52
+ pool.push(new Float64Array(2));
53
+ }
49
54
  }
50
55
 
51
56
  // Number of terms to include in infinite sums (truncation)
@@ -54,108 +59,83 @@ function terms_to_sum(z) {
54
59
  return Math.ceil(size + 4.3 * Math.cbrt(size) + 1.0);
55
60
  }
56
61
 
57
- // Downward recurrence for A
58
- function A_all_n(z, M) {
59
- const A = new Array(M + 2);
60
- A[M + 1] = vec2(0.0, 0.0);
62
+ // Downward recurrence for A_n(z) = psi'_n(z)/psi_n(z). Fills A[0..M+1] (A is a reused vec2 pool).
63
+ function A_all_n(z, M, A) {
64
+ A[M + 1][0] = 0.0;
65
+ A[M + 1][1] = 0.0;
61
66
  for (let n = M; n >= 0; --n) {
62
- const tmp = cdiv(vec2(n + 1.0, 0.0), z);
63
- A[n] = csub(tmp, cdiv(vec2(1.0, 0.0), cadd(tmp, A[n + 1])));
67
+ // tmp = (n + 1) / z
68
+ _t0[0] = n + 1.0;
69
+ _t0[1] = 0.0;
70
+ complex_div(_t1, _t0, z);
71
+ // A[n] = tmp - 1 / (tmp + A[n + 1])
72
+ complex_add(_t2, _t1, A[n + 1]);
73
+ _t0[0] = 1.0;
74
+ _t0[1] = 0.0;
75
+ complex_div(_t3, _t0, _t2);
76
+ complex_sub(A[n], _t1, _t3);
64
77
  }
65
- return A;
66
78
  }
67
79
 
68
- // Upward recurrences for B, psi_zeta, and R
69
- function psi_zeta(n, z, A, old_B, old_psi_zeta) {
70
- if (n > 0) {
71
- const n_z = cdiv(vec2(n, 0.0), z);
72
- const tmp = cmult(csub(n_z, A[n - 1]), csub(n_z, old_B));
73
- old_psi_zeta = cmult(old_psi_zeta, tmp);
74
- }
75
- return old_psi_zeta;
80
+ // Upward recurrence (Frisvad et al. 2007, Eq. 17) for psi_n(z)*zeta_n(z), n > 0. Writes into out.
81
+ function psi_zeta_step(n, z, A, old_B, old_psi_zeta, out) {
82
+ // n_z = n / z
83
+ _t0[0] = n;
84
+ _t0[1] = 0.0;
85
+ complex_div(_t1, _t0, z);
86
+ // tmp = (n_z - A[n-1]) * (n_z - old_B)
87
+ complex_sub(_t2, _t1, A[n - 1]);
88
+ complex_sub(_t3, _t1, old_B);
89
+ complex_mul(_t0, _t2, _t3);
90
+ // out = old_psi_zeta * tmp
91
+ complex_mul(out, old_psi_zeta, _t0);
76
92
  }
77
93
 
78
- /**
79
- * Calculates the B_n(z) coefficient for term 'n' via upward recurrence.
80
- * This is a helper function for LorenzMie_ab.
81
- *
82
- * @param {number} n - The current recurrence term index (n >= 0).
83
- * @param {vec2} z - The complex size parameter (x or y).
84
- * @param {Array<vec2>} A - Pre-computed log-derivatives A_n(z).
85
- * @param {vec2} old_B - The previous B coefficient (B_{n-1}).
86
- * @param {vec2} old_psi_zeta - The previous psi_zeta product term.
87
- * @returns {vec2} The new B_n coefficient (complex number).
88
- * @ignore
89
- */
90
- function B(n, z, A, old_B, old_psi_zeta) {
91
-
92
- if (n > 0) {
93
- old_B.psi_zeta = psi_zeta(n, z, A, old_B, old_psi_zeta);
94
- old_B = cadd(A[n], cdiv(vec2(0.0, 1.0), old_B.psi_zeta));
95
- }
96
-
97
- return old_B;
94
+ // B_n(z) = A_n(z) + i / (psi_n(z)*zeta_n(z)) (Mackowski, Eq. 16), n > 0. Writes into out.
95
+ function B_step(A_n, psi_zeta_n, out) {
96
+ _t0[0] = 0.0;
97
+ _t0[1] = 1.0;
98
+ complex_div(_t1, _t0, psi_zeta_n);
99
+ complex_add(out, A_n, _t1);
98
100
  }
99
101
 
100
- /**
101
- * Calculates the R_n(z) coefficient (ratio psi_n / zeta_n) for term 'n'.
102
- * This is a helper function for LorenzMie_ab.
103
- *
104
- * @param {number} n - The current recurrence term index (n >= 0).
105
- * @param {vec2} z - The complex size parameter (x).
106
- * @param {Array<vec2>} A - Pre-computed log-derivatives A_n(z).
107
- * @param {vec2} B_n - The current B_n(z) coefficient.
108
- * @param {vec2} old_R - The previous R coefficient (R_{n-1}).
109
- * @returns {vec2} The new R_n coefficient (complex number).
110
- * @ignore
111
- */
112
- function R(n, z, A, B_n, old_R) {
113
- if (n > 0) {
114
- const n_z = cdiv(vec2(n, 0.0), z);
115
- const tmp = cdiv(cadd(B_n, n_z), cadd(A[n], n_z));
116
- old_R = cmult(old_R, tmp);
117
- }
118
- return old_R;
102
+ // R_n(z) = psi_n(z)/zeta_n(z) via upward recurrence (Eq. 18), n > 0. Writes into out.
103
+ function R_step(n, z, A_n, B_n, old_R, out) {
104
+ // n_z = n / z
105
+ _t0[0] = n;
106
+ _t0[1] = 0.0;
107
+ complex_div(_t1, _t0, z);
108
+ // ratio = (B_n + n_z) / (A_n + n_z)
109
+ complex_add(_t2, B_n, _t1);
110
+ complex_add(_t3, A_n, _t1);
111
+ complex_div(_t0, _t2, _t3);
112
+ // out = old_R * ratio
113
+ complex_mul(out, old_R, _t0);
119
114
  }
120
115
 
121
- /**
122
- * Calculates the Lorenz-Mie scattering coefficients a_n and b_n for a single term 'n'.
123
- * This implements the formulas from Figure 3 of Frisvad et al. 2007.
124
- *
125
- * @param {number} n - The current recurrence term index (n >= 0).
126
- * @param {number} size - Unitless size parameter x_vac = 2*pi*r / lambda_vac.
127
- * @param {vec2} n_p - Complex refractive index of the particle.
128
- * @param {vec2} n_med - Complex refractive index of the medium.
129
- * @param {Array<vec2>} A_p - Pre-computed log-derivatives A_n(y) for the particle.
130
- * @param {Array<vec2>} A_med - Pre-computed log-derivatives A_n(x) for the medium.
131
- * @param {vec2} old_B - The previous B_{n-1}(x) coefficient.
132
- * @param {vec2} old_R - The previous R_{n-1}(x) coefficient.
133
- * @param {vec2} old_psi_zeta - The previous psi_zeta product.
134
- * @returns {vec4} A vec4 [Re(a_n), Im(a_n), Re(b_n), Im(b_n)] with state properties (.old_B, .old_R, .old_psi_zeta) attached for the next iteration.
135
- * @ignore
136
- */
137
- function LorenzMie_ab(n, size, n_p, n_med, A_p, A_med, old_B, old_R, old_psi_zeta) {
138
-
139
- const x = vec2(size * n_med[0], size * n_med[1]);
140
- const B_n = B(n, x, A_med, old_B, old_psi_zeta);
141
- const R_n = R(n, x, A_med, B_n, old_R);
142
- const n_med_A_p = cmult(n_med, A_p[n]);
143
- const n_p_A_med = cmult(n_p, A_med[n]);
144
- const n_p_A_p = cmult(n_p, A_p[n]);
145
- const n_med_A_med = cmult(n_med, A_med[n]);
146
- const n_p_B_n = cmult(n_p, B_n);
147
- const n_med_B_n = cmult(n_med, B_n);
148
- const a = cmult(R_n, cdiv(csub(n_med_A_p, n_p_A_med), csub(n_med_A_p, n_p_B_n)));
149
- const b = cmult(R_n, cdiv(csub(n_p_A_p, n_med_A_med), csub(n_p_A_p, n_med_B_n)));
150
-
151
-
152
- const ab = vec4(a[0], a[1], b[0], b[1]);
153
-
154
- ab.old_psi_zeta = n > 0 ? old_B.psi_zeta : old_psi_zeta;
155
- ab.old_B = B_n;
156
- ab.old_R = R_n;
157
-
158
- return ab;
116
+ // Lorenz-Mie coefficients a_n, b_n (Frisvad et al. 2007, Eq. 12-13). Writes 4 doubles at ab[off..].
117
+ function ab_step(ab, off, n_p, n_med, A_p_n, A_med_n, B_n, R_n) {
118
+ // a_n = R_n * (n_med*A_p - n_p*A_med) / (n_med*A_p - n_p*B_n)
119
+ complex_mul(_t0, n_med, A_p_n); // n_med * A_p
120
+ complex_mul(_t1, n_p, A_med_n); // n_p * A_med
121
+ complex_mul(_t2, n_p, B_n); // n_p * B_n
122
+ complex_sub(_t3, _t0, _t1); // numerator
123
+ complex_sub(_t4, _t0, _t2); // denominator
124
+ complex_div(_t5, _t3, _t4);
125
+ complex_mul(_t6, R_n, _t5);
126
+ ab[off] = _t6[0];
127
+ ab[off + 1] = _t6[1];
128
+
129
+ // b_n = R_n * (n_p*A_p - n_med*A_med) / (n_p*A_p - n_med*B_n)
130
+ complex_mul(_t0, n_p, A_p_n); // n_p * A_p
131
+ complex_mul(_t1, n_med, A_med_n); // n_med * A_med
132
+ complex_mul(_t2, n_med, B_n); // n_med * B_n
133
+ complex_sub(_t3, _t0, _t1); // numerator
134
+ complex_sub(_t4, _t0, _t2); // denominator
135
+ complex_div(_t5, _t3, _t4);
136
+ complex_mul(_t6, R_n, _t5);
137
+ ab[off + 2] = _t6[0];
138
+ ab[off + 3] = _t6[1];
159
139
  }
160
140
 
161
141
  /**
@@ -164,8 +144,8 @@ function LorenzMie_ab(n, size, n_p, n_med, A_p, A_med, old_B, old_R, old_psi_zet
164
144
  *
165
145
  * @param {number} radius_m - Particle radius (in meters).
166
146
  * @param {number} wavelength_m - Wavelength of light in vacuum (in meters).
167
- * @param {vec2} n_p - Complex refractive index of the particle
168
- * @param {vec2} n_med - Complex refractive index of the medium (e.g., [1.0, 0.0] for air).
147
+ * @param {number[]|Float32Array|Float64Array} n_p - Complex refractive index of the particle
148
+ * @param {number[]|Float32Array|Float64Array} n_med - Complex refractive index of the medium (e.g., [1.0, 0.0] for air).
169
149
  * @returns {Float64Array} Mie coefficients a_n and b_n in form [a_n0.r, a_n0.i, b_n0.r, b_n0.i, ... a_nN.r, a_nN.i, b_nN.r, b_nN.i]
170
150
  *
171
151
  * @see "Computing the Scattering Properties of Participating Media Using Lorenz-Mie Theory", SIGGRAPH 2007 by Frisvad et al.
@@ -187,40 +167,83 @@ export function lorenz_mie_coefs(
187
167
  assert.isFinite(radius_m, 'radius_m');
188
168
  assert.greaterThan(radius_m, 0, 'radius_m');
189
169
 
190
- const psize = 2.0 * Math.PI * radius_m / wavelength_m;
170
+ let psize = 2.0 * Math.PI * radius_m / wavelength_m;
171
+
172
+ // Remove the removable singularity at x0 = k*pi (k >= 1), where x0 = psize*Re(n_med).
173
+ // The recurrence initialisation (Frisvad et al. 2007, Eq. 20) seeds
174
+ // psi_0/zeta_0 = 0.5*(1 - e^{-i2x0}) and psi_0*zeta_0 = 0.5*(1 - e^{i2x0}),
175
+ // both of which vanish when x0 is an integer multiple of pi (psi_0 = sin(x0) = 0). That
176
+ // zeroes every a_n,b_n and collapses the cross sections. The true cross sections are smooth
177
+ // across x0 = k*pi, so we step the size parameter just off the singular grid by NUDGE radians.
178
+ // NUDGE sits far outside the ill-conditioned zone (|x0 - k*pi| < ~1e-8) yet far below the
179
+ // method's far-field accuracy, so the value returned is the correct smooth one (validated to
180
+ // <1e-4 relative against the OMLC benchmark, which lands exactly on x0 = 10*pi). k = 0 (the
181
+ // r -> 0 limit) is intentionally excluded: there the vanishing seed yields the physically
182
+ // correct ~0 cross section. Inputs not within NUDGE of k*pi are left bit-for-bit unchanged.
183
+ {
184
+ const reMed = n_med[0];
185
+ const x0 = psize * reMed;
186
+ const k = Math.round(x0 / Math.PI);
187
+ if (k >= 1) {
188
+ const NUDGE = 1e-4; // radians, in x0 units
189
+ const rem = x0 - k * Math.PI;
190
+ if (Math.abs(rem) < NUDGE) {
191
+ psize = (k * Math.PI + (rem < 0 ? -NUDGE : NUDGE)) / reMed;
192
+ }
193
+ }
194
+ }
191
195
 
192
- const x = vec2(psize * n_med[0], psize * n_med[1]);
193
- const y = vec2(psize * n_p[0], psize * n_p[1]);
194
- const M = terms_to_sum(x);
195
- const A_med = A_all_n(x, M);
196
- const A_p = A_all_n(y, M);
196
+ _x[0] = psize * n_med[0];
197
+ _x[1] = psize * n_med[1];
198
+ _y[0] = psize * n_p[0];
199
+ _y[1] = psize * n_p[1];
197
200
 
198
- const e_term = Math.exp(2.0 * x[1]);
201
+ const M = terms_to_sum(_x);
199
202
 
200
- let prev_psi_zeta = vec2(0.5 * (1.0 - Math.cos(2.0 * x[0]) / e_term), -0.5 * Math.sin(2.0 * x[0]) / e_term);
201
- let prev_B = vec2(0.0, 1.0);
202
- let prev_R = vec2(0.5 * (1.0 - Math.cos(2.0 * x[0]) * e_term), 0.5 * Math.sin(2.0 * x[0]) * e_term);
203
+ ensure_vec2_pool(_A_med, M + 2);
204
+ ensure_vec2_pool(_A_p, M + 2);
205
+ A_all_n(_x, M, _A_med);
206
+ A_all_n(_y, M, _A_p);
203
207
 
204
- const ab = new Float64Array(M * 4);
208
+ const e_term = Math.exp(2.0 * _x[1]);
205
209
 
206
- for (let n = 0; n < M; ++n) {
207
-
208
- const ab_n = LorenzMie_ab(
209
- n, psize, n_p, n_med, A_p, A_med,
210
- prev_B, prev_R, prev_psi_zeta
211
- );
210
+ _prev_psi_zeta[0] = 0.5 * (1.0 - Math.cos(2.0 * _x[0]) / e_term);
211
+ _prev_psi_zeta[1] = -0.5 * Math.sin(2.0 * _x[0]) / e_term;
212
+ _prev_B[0] = 0.0;
213
+ _prev_B[1] = 1.0;
214
+ _prev_R[0] = 0.5 * (1.0 - Math.cos(2.0 * _x[0]) * e_term);
215
+ _prev_R[1] = 0.5 * Math.sin(2.0 * _x[0]) * e_term;
212
216
 
213
- prev_psi_zeta = ab_n.old_psi_zeta;
214
- prev_B = ab_n.old_B;
215
- prev_R = ab_n.old_R;
217
+ const ab = new Float64Array(M * 4);
216
218
 
217
- // plug the data in
218
- ab[4 * n] = ab_n[0];
219
- ab[4 * n + 1] = ab_n[1];
220
- ab[4 * n + 2] = ab_n[2];
221
- ab[4 * n + 3] = ab_n[3];
219
+ for (let n = 0; n < M; ++n) {
222
220
 
221
+ // For n = 0 the upward recurrences return their seed unchanged, so B_n/R_n are the seeds
222
+ // and the state is left untouched (matching the original termwise formulation).
223
+ let B_n;
224
+ let R_n;
225
+ if (n === 0) {
226
+ B_n = _prev_B;
227
+ R_n = _prev_R;
228
+ } else {
229
+ psi_zeta_step(n, _x, _A_med, _prev_B, _prev_psi_zeta, _cur_psi_zeta);
230
+ B_step(_A_med[n], _cur_psi_zeta, _cur_B);
231
+ R_step(n, _x, _A_med[n], _cur_B, _prev_R, _cur_R);
232
+ B_n = _cur_B;
233
+ R_n = _cur_R;
234
+ }
235
+
236
+ ab_step(ab, 4 * n, n_p, n_med, _A_p[n], _A_med[n], B_n, R_n);
237
+
238
+ if (n > 0) {
239
+ _prev_psi_zeta[0] = _cur_psi_zeta[0];
240
+ _prev_psi_zeta[1] = _cur_psi_zeta[1];
241
+ _prev_B[0] = _cur_B[0];
242
+ _prev_B[1] = _cur_B[1];
243
+ _prev_R[0] = _cur_R[0];
244
+ _prev_R[1] = _cur_R[1];
245
+ }
223
246
  }
224
247
 
225
248
  return ab;
226
- }
249
+ }
@@ -3,12 +3,11 @@
3
3
  * This function implements Equations (2) and (3) from the 2007 paper
4
4
  * "Computing the Scattering Properties of Participating Media..."
5
5
  *
6
- * @param {Float32Array} ab - The flat array of a_n, b_n coefficients from LorenzMie_coefs.
6
+ * @param {number[]|Float32Array|Float64Array} ab - The flat array of a_n, b_n coefficients from LorenzMie_coefs.
7
7
  * @param {number} radius - Particle radius (in meters).
8
8
  * @param {number} wavelength - Wavelength of light in vacuum (in meters).
9
- * @param {vec2} n_med - Complex refractive index of the medium (e.g., [1.0, 0.0] for air).
9
+ * @param {number[]|Float32Array|Float64Array} n_med - Complex refractive index of the medium (e.g., [1.0, 0.0] for air).
10
10
  * @returns {object} An object with Q_e, Q_s, albedo, C_ext, and C_sca.
11
11
  */
12
- export function mie_ab_to_optical_properties(ab: Float32Array, wavelength: number, radius: number, n_med: typeof vec2): object;
13
- import { vec2 } from "./lorenz_mie_coefs.js";
12
+ export function mie_ab_to_optical_properties(ab: number[] | Float32Array | Float64Array, wavelength: number, radius: number, n_med: number[] | Float32Array | Float64Array): object;
14
13
  //# sourceMappingURL=mie_ab_to_optical_properties.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mie_ab_to_optical_properties.d.ts","sourceRoot":"","sources":["../../../../../../src/core/math/physics/mie/mie_ab_to_optical_properties.js"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,iDANW,YAAY,cAEZ,MAAM,UADN,MAAM,uBAGJ,MAAM,CAgGlB;qBA3GuC,uBAAuB"}
1
+ {"version":3,"file":"mie_ab_to_optical_properties.d.ts","sourceRoot":"","sources":["../../../../../../src/core/math/physics/mie/mie_ab_to_optical_properties.js"],"names":[],"mappings":"AAmBA;;;;;;;;;;GAUG;AACH,iDANW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAElC,MAAM,UADN,MAAM,SAEN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,GAChC,MAAM,CA0GlB"}
@@ -1,15 +1,31 @@
1
1
  import { v2_dot } from "../../../geom/vec2/v2_dot.js";
2
- import { cadd, cdiv, cmult, vec2 } from "./lorenz_mie_coefs.js";
2
+ import { complex_add } from "../../complex/complex_add.js";
3
+ import { complex_div } from "../../complex/complex_div.js";
4
+ import { complex_mul } from "../../complex/complex_mul.js";
5
+
6
+ // Allocation-free complex scratch (see lorenz_mie_coefs.js for the rationale): mie_ab is
7
+ // single-threaded and non-reentrant, so the extinction sum routes its complex temporaries through
8
+ // these reused buffers instead of allocating a fresh result per operation. complex_add is
9
+ // aliasing-safe (used for the in-place accumulation of _sum_t); complex_mul/div are not, so their
10
+ // output buffers differ from their inputs.
11
+ const _an = new Float64Array(2);
12
+ const _bn = new Float64Array(2);
13
+ const _n_med_sq = new Float64Array(2);
14
+ const _apb = new Float64Array(2);
15
+ const _term_t = new Float64Array(2);
16
+ const _mult = new Float64Array(2);
17
+ const _scaled = new Float64Array(2);
18
+ const _sum_t = new Float64Array(2);
3
19
 
4
20
  /**
5
21
  * Calculates the final optical properties by summing the Mie coefficients.
6
22
  * This function implements Equations (2) and (3) from the 2007 paper
7
23
  * "Computing the Scattering Properties of Participating Media..."
8
24
  *
9
- * @param {Float32Array} ab - The flat array of a_n, b_n coefficients from LorenzMie_coefs.
25
+ * @param {number[]|Float32Array|Float64Array} ab - The flat array of a_n, b_n coefficients from LorenzMie_coefs.
10
26
  * @param {number} radius - Particle radius (in meters).
11
27
  * @param {number} wavelength - Wavelength of light in vacuum (in meters).
12
- * @param {vec2} n_med - Complex refractive index of the medium (e.g., [1.0, 0.0] for air).
28
+ * @param {number[]|Float32Array|Float64Array} n_med - Complex refractive index of the medium (e.g., [1.0, 0.0] for air).
13
29
  * @returns {object} An object with Q_e, Q_s, albedo, C_ext, and C_sca.
14
30
  */
15
31
  export function mie_ab_to_optical_properties(
@@ -20,7 +36,11 @@ export function mie_ab_to_optical_properties(
20
36
  ) {
21
37
  const M = ab.length / 4;
22
38
 
23
- let sum_t = vec2(0, 0); // Complex sum for Ct
39
+ // n_med^2 is loop-invariant; compute it once.
40
+ complex_mul(_n_med_sq, n_med, n_med);
41
+
42
+ _sum_t[0] = 0.0; // Complex sum for Ct
43
+ _sum_t[1] = 0.0;
24
44
  let sum_s = 0; // Real sum for Cs
25
45
  let sum_g = 0; // Real sum for Asymmetry (g)
26
46
 
@@ -29,26 +49,29 @@ export function mie_ab_to_optical_properties(
29
49
  const multiplier = 2 * n + 1;
30
50
 
31
51
  // Get an and bn from your flat array
32
- const an = vec2(ab[4 * n], ab[4 * n + 1]);
33
- const bn = vec2(ab[4 * n + 2], ab[4 * n + 3]);
34
-
35
- // 1. For Extinction (Ct)
36
- const an_plus_bn = cadd(an, bn);
37
- // You need complex math functions cadd, cdiv
38
- const n_med_sq = cmult(n_med, n_med);
39
- const term_t = cdiv(an_plus_bn, n_med_sq);
40
- sum_t = cadd(sum_t, cmult(vec2(multiplier, 0), term_t));
52
+ _an[0] = ab[4 * n];
53
+ _an[1] = ab[4 * n + 1];
54
+ _bn[0] = ab[4 * n + 2];
55
+ _bn[1] = ab[4 * n + 3];
56
+
57
+ // 1. For Extinction (Ct): sum_t += (2n+1) * (an + bn) / n_med^2
58
+ complex_add(_apb, _an, _bn);
59
+ complex_div(_term_t, _apb, _n_med_sq);
60
+ _mult[0] = multiplier;
61
+ _mult[1] = 0.0;
62
+ complex_mul(_scaled, _mult, _term_t);
63
+ complex_add(_sum_t, _sum_t, _scaled);
41
64
 
42
65
  // 2. For Scattering (Cs)
43
- const an_mag_sq = an[0] * an[0] + an[1] * an[1];
44
- const bn_mag_sq = bn[0] * bn[0] + bn[1] * bn[1];
66
+ const an_mag_sq = _an[0] * _an[0] + _an[1] * _an[1];
67
+ const bn_mag_sq = _bn[0] * _bn[0] + _bn[1] * _bn[1];
45
68
  sum_s += multiplier * (an_mag_sq + bn_mag_sq);
46
69
 
47
70
  // 3. Asymmetry Accumulation (New)
48
71
  // Term A: Interference of an and bn
49
72
  // Formula: (2n+1) / (n(n+1)) * Re(an * bn*)
50
73
  const factor_A = (2 * n + 1) / (n * (n + 1));
51
- sum_g += factor_A * v2_dot(an[0], an[1], bn[0], bn[1]);
74
+ sum_g += factor_A * v2_dot(_an[0], _an[1], _bn[0], _bn[1]);
52
75
 
53
76
  // Term B: Interference of n and n+1
54
77
  // Formula: (n(n+2)) / (n+1) * Re(an * an+1* + bn * bn+1*)
@@ -61,8 +84,8 @@ export function mie_ab_to_optical_properties(
61
84
 
62
85
  const factor_B = (n * (n + 2)) / (n + 1);
63
86
 
64
- const term_an_an1 = v2_dot(an[0], an[1], an1_r, an1_i);
65
- const term_bn_bn1 = v2_dot(bn[0], bn[1], bn1_r, bn1_i);
87
+ const term_an_an1 = v2_dot(_an[0], _an[1], an1_r, an1_i);
88
+ const term_bn_bn1 = v2_dot(_bn[0], _bn[1], bn1_r, bn1_i);
66
89
 
67
90
  sum_g += factor_B * (term_an_an1 + term_bn_bn1);
68
91
  }
@@ -78,7 +101,7 @@ export function mie_ab_to_optical_properties(
78
101
  }
79
102
 
80
103
  // Extinction (Ct from Eq. 22)
81
- const C_t = (Math.pow(wavelength, 2) / (2 * Math.PI)) * sum_t[0]; //
104
+ const C_t = (Math.pow(wavelength, 2) / (2 * Math.PI)) * _sum_t[0]; //
82
105
 
83
106
  // Scattering (Cs from Eq. 23)
84
107
  const alpha = (4 * Math.PI * radius * n_med[1]) / wavelength;
@@ -87,7 +110,10 @@ export function mie_ab_to_optical_properties(
87
110
  // avoid division by 0
88
111
  gamma = 1;
89
112
  } else {
90
- gamma = (2 * (1 + (alpha - 1) * Math.exp(alpha))) / Math.pow(alpha, 2);
113
+ // Algebraically identical to 2*(1 + (alpha-1)*exp(alpha))/alpha^2, but using expm1 removes the
114
+ // catastrophic cancellation in `1 + (alpha-1)*exp(alpha)` for small alpha (which otherwise loses all
115
+ // precision and can yield a wrong C_sca or Infinity).
116
+ gamma = (2 * (alpha + (alpha - 1) * Math.expm1(alpha))) / (alpha * alpha);
91
117
  }
92
118
  const n_med_mag_sq = n_med[0] * n_med[0] + n_med[1] * n_med[1];
93
119
  const C_s_factor = (Math.pow(wavelength, 2) * Math.exp(-alpha)) / (2 * Math.PI * gamma * n_med_mag_sq);
@@ -106,4 +132,4 @@ export function mie_ab_to_optical_properties(
106
132
  C_sca: C_s,
107
133
  g, // Anisotropy parameter
108
134
  }
109
- }
135
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"randomIntegerBetween.d.ts","sourceRoot":"","sources":["../../../../../src/core/math/random/randomIntegerBetween.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,4DAJW,MAAM,OACN,MAAM,GACJ,MAAM,CAclB"}
1
+ {"version":3,"file":"randomIntegerBetween.d.ts","sourceRoot":"","sources":["../../../../../src/core/math/random/randomIntegerBetween.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,4DAJW,MAAM,OACN,MAAM,GACJ,MAAM,CAiBlB"}
@@ -18,5 +18,8 @@ export function randomIntegerBetween(random, min, max) {
18
18
  assert.greaterThanOrEqual(roll, 0, 'random should return value between 0 and 1');
19
19
  assert.lessThanOrEqual(roll, 1, 'random should return value between 0 and 1');
20
20
 
21
- return Math.round(roll * span) + min;
21
+ // Inclusive AND uniform: give each of the (span + 1) integers an equal-width slice of [0, 1).
22
+ // Math.round(roll * span) would halve the probability of the two endpoints. random() may return
23
+ // exactly 1.0, which would overshoot by one, so clamp the top.
24
+ return Math.min(max, min + Math.floor(roll * (span + 1)));
22
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"solveCubic.d.ts","sourceRoot":"","sources":["../../../../src/core/math/solveCubic.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;GAYG;AACH,mCARW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CA+DlB"}
1
+ {"version":3,"file":"solveCubic.d.ts","sourceRoot":"","sources":["../../../../src/core/math/solveCubic.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;GAYG;AACH,mCARW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CA4ElB"}