@woosh/meep-engine 2.155.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.
- package/README.md +1 -1
- package/build/bundle-worker-image-decoder.js +1 -1
- package/build/bundle-worker-terrain.js +1 -1
- package/editor/view/ecs/ComponentControlView.d.ts +0 -9
- package/editor/view/ecs/ComponentControlView.js +2 -98
- package/package.json +1 -1
- package/src/core/binary/32BitEncoder.js +1 -1
- package/src/core/binary/to_half_float_uint16.js +3 -3
- package/src/core/bvh2/bvh3/ebvh_build_hierarchy_radix.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/ebvh_build_hierarchy_radix.js +275 -253
- package/src/core/cache/Cache.d.ts.map +1 -1
- package/src/core/cache/Cache.js +7 -0
- package/src/core/cache/FrequencySketch.d.ts.map +1 -1
- package/src/core/cache/FrequencySketch.js +8 -4
- package/src/core/clipboard/obtainClipBoard.d.ts +6 -0
- package/src/core/clipboard/obtainClipBoard.d.ts.map +1 -0
- package/src/core/clipboard/obtainClipBoard.js +29 -0
- package/src/core/clipboard/safeClipboardReadText.d.ts +6 -0
- package/src/core/clipboard/safeClipboardReadText.d.ts.map +1 -0
- package/src/core/clipboard/safeClipboardReadText.js +55 -0
- package/src/core/clipboard/safeClipboardWriteText.d.ts +8 -0
- package/src/core/clipboard/safeClipboardWriteText.d.ts.map +1 -0
- package/src/core/clipboard/safeClipboardWriteText.js +23 -0
- package/src/core/collection/array/array_quick_sort_by_lookup_map.js +1 -1
- package/src/core/collection/array/array_set_diff_sorting.d.ts.map +1 -1
- package/src/core/collection/array/array_set_diff_sorting.js +4 -1
- package/src/core/collection/array/array_shuffle.d.ts.map +1 -1
- package/src/core/collection/array/array_shuffle.js +30 -27
- package/src/core/collection/array/binarySearchLowIndex.d.ts.map +1 -1
- package/src/core/collection/array/binarySearchLowIndex.js +4 -3
- package/src/core/collection/array/typed/array_buffer_hash.js +1 -1
- package/src/core/collection/array/typed/is_typed_array_equals.d.ts.map +1 -1
- package/src/core/collection/array/typed/is_typed_array_equals.js +12 -2
- package/src/core/collection/heap/BinaryHeap.d.ts.map +1 -1
- package/src/core/collection/heap/BinaryHeap.js +12 -2
- package/src/core/collection/queue/Deque.d.ts.map +1 -1
- package/src/core/collection/queue/Deque.js +10 -8
- package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
- package/src/core/collection/table/RowFirstTable.js +4 -2
- package/src/core/collection/table/RowFirstTableSpec.js +2 -2
- package/src/core/color/operations/color_lerp.d.ts.map +1 -1
- package/src/core/color/operations/color_lerp.js +10 -3
- package/src/core/color/rgb2uint32.js +1 -1
- package/src/core/color/rgbe9995_to_rgb.js +1 -1
- package/src/core/function/objectsEqual.d.ts.map +1 -1
- package/src/core/function/objectsEqual.js +2 -1
- package/src/core/geom/2d/aabb/AABB2.d.ts.map +1 -1
- package/src/core/geom/2d/aabb/AABB2.js +12 -11
- package/src/core/geom/2d/convex-hull/convex_hull_jarvis_2d.d.ts.map +1 -1
- package/src/core/geom/2d/convex-hull/convex_hull_jarvis_2d.js +30 -4
- package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.d.ts.map +1 -1
- package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.js +6 -2
- package/src/core/geom/2d/hash-grid/SpatialHashGrid.d.ts.map +1 -1
- package/src/core/geom/2d/hash-grid/SpatialHashGrid.js +388 -386
- package/src/core/geom/2d/hash-grid/shg_query_elements_line.d.ts.map +1 -1
- package/src/core/geom/2d/hash-grid/shg_query_elements_line.js +8 -3
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +9 -1
- package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts +3 -1
- package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts.map +1 -1
- package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.js +3 -1
- package/src/core/geom/2d/quad-tree-binary/QuadTree.js +714 -714
- package/src/core/geom/2d/r-tree/StaticR2Tree.d.ts.map +1 -1
- package/src/core/geom/2d/r-tree/StaticR2Tree.js +5 -4
- package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +33 -29
- package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js +3 -1
- package/src/core/geom/3d/aabb/aabb3_signed_distance_to_aabb3.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_signed_distance_to_aabb3.js +10 -7
- package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.js +30 -9
- package/src/core/geom/3d/aabb/compute_aabb_from_points.js +3 -3
- package/src/core/geom/3d/box/box3_raycast.d.ts +37 -0
- package/src/core/geom/3d/box/box3_raycast.d.ts.map +1 -0
- package/src/core/geom/3d/box/box3_raycast.js +81 -0
- package/src/core/geom/3d/capsule/capsule_raycast.d.ts +35 -0
- package/src/core/geom/3d/capsule/capsule_raycast.d.ts.map +1 -0
- package/src/core/geom/3d/capsule/capsule_raycast.js +93 -0
- package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.d.ts.map +1 -1
- package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js +4 -0
- package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
- package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.d.ts.map +1 -1
- package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js +3 -2
- package/src/core/geom/3d/mat4/decompose_matrix_4_array.d.ts.map +1 -1
- package/src/core/geom/3d/mat4/decompose_matrix_4_array.js +12 -2
- package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.js +2 -2
- package/src/core/geom/3d/mat4/m4_multiply_alphatensor.d.ts +1 -1
- package/src/core/geom/3d/mat4/m4_multiply_alphatensor.d.ts.map +1 -1
- package/src/core/geom/3d/mat4/m4_multiply_alphatensor.js +19 -13
- package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.d.ts.map +1 -1
- package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.js +3 -2
- package/src/core/geom/3d/plane/plane3_compute_plane_intersection.js +3 -2
- package/src/core/geom/3d/shape/MeshShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/MeshShape3D.js +7 -0
- package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/UnionShape3D.js +3 -2
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +1 -1
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +153 -148
- package/src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.d.ts.map +1 -1
- package/src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js +7 -0
- package/src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.d.ts.map +1 -1
- package/src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.js +13 -10
- package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts +1 -1
- package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js +2 -2
- package/src/core/geom/3d/sphere/sphere_raycast.d.ts +33 -0
- package/src/core/geom/3d/sphere/sphere_raycast.d.ts.map +1 -0
- package/src/core/geom/3d/sphere/sphere_raycast.js +47 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts +24 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js +39 -0
- package/src/core/geom/3d/tetrahedra/triangle/trace_triangular_depth_map.d.ts.map +1 -1
- package/src/core/geom/3d/tetrahedra/triangle/trace_triangular_depth_map.js +4 -2
- package/src/core/geom/3d/topology/bounds/computeTriangleClusterNormalBoundingCone.js +3 -3
- package/src/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js +1 -1
- package/src/core/geom/3d/topology/tm_vertex_compute_normal.d.ts.map +1 -1
- package/src/core/geom/3d/topology/tm_vertex_compute_normal.js +4 -2
- package/src/core/geom/3d/util/make_justified_point_grid.d.ts.map +1 -1
- package/src/core/geom/3d/util/make_justified_point_grid.js +18 -10
- package/src/core/geom/ConicRay.d.ts.map +1 -1
- package/src/core/geom/ConicRay.js +11 -13
- package/src/core/geom/packing/max-rect/removeRedundantBoxes.d.ts.map +1 -1
- package/src/core/geom/packing/max-rect/removeRedundantBoxes.js +19 -4
- package/src/core/geom/vec3/v3_orthonormal_matrix_from_normal.d.ts.map +1 -0
- package/src/{engine/graphics/sh3/path_tracer/sampling → core/geom/vec3}/v3_orthonormal_matrix_from_normal.js +1 -1
- package/src/core/graph/coloring/colorizeGraph.js +2 -2
- package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
- package/src/core/graph/csr/CSRGraph.js +325 -319
- package/src/core/graph/layout/CircleLayout.d.ts.map +1 -1
- package/src/core/graph/layout/CircleLayout.js +8 -6
- package/src/core/graph/metis/native/refine/compute_kway_params.d.ts.map +1 -1
- package/src/core/graph/metis/native/refine/compute_kway_params.js +139 -138
- package/src/core/graph/mn_graph_coarsen.d.ts.map +1 -1
- package/src/core/graph/mn_graph_coarsen.js +4 -2
- package/src/core/graph/v2/NodeContainer.js +7 -7
- package/src/core/localization/LocalizationEngine.js +1 -1
- package/src/core/math/bell_membership_function.d.ts.map +1 -1
- package/src/core/math/bell_membership_function.js +3 -1
- package/src/core/math/complex/complex_add.d.ts +4 -4
- package/src/core/math/complex/complex_add.d.ts.map +1 -1
- package/src/core/math/complex/complex_add.js +3 -3
- package/src/core/math/complex/complex_div.d.ts +4 -4
- package/src/core/math/complex/complex_div.d.ts.map +1 -1
- package/src/core/math/complex/complex_div.js +3 -3
- package/src/core/math/complex/complex_mul.d.ts +4 -4
- package/src/core/math/complex/complex_mul.d.ts.map +1 -1
- package/src/core/math/complex/complex_mul.js +3 -3
- package/src/core/math/complex/complex_sub.d.ts +4 -4
- package/src/core/math/complex/complex_sub.d.ts.map +1 -1
- package/src/core/math/complex/complex_sub.js +3 -3
- package/src/core/math/idct_1d.d.ts +4 -4
- package/src/core/math/idct_1d.d.ts.map +1 -1
- package/src/core/math/idct_1d.js +3 -3
- package/src/core/math/noise/create_simplex_noise_2d.d.ts.map +1 -1
- package/src/core/math/noise/create_simplex_noise_2d.js +4 -2
- package/src/core/math/noise/sdnoise.d.ts.map +1 -1
- package/src/core/math/noise/sdnoise.js +12 -9
- package/src/core/math/physics/mie/compute_bhmie_optical_properties.d.ts.map +1 -1
- package/src/core/math/physics/mie/compute_bhmie_optical_properties.js +94 -50
- package/src/core/math/physics/mie/lorenz_mie_coefs.d.ts +3 -6
- package/src/core/math/physics/mie/lorenz_mie_coefs.d.ts.map +1 -1
- package/src/core/math/physics/mie/lorenz_mie_coefs.js +180 -157
- package/src/core/math/physics/mie/mie_ab_to_optical_properties.d.ts +3 -4
- package/src/core/math/physics/mie/mie_ab_to_optical_properties.d.ts.map +1 -1
- package/src/core/math/physics/mie/mie_ab_to_optical_properties.js +47 -21
- package/src/core/math/random/randomIntegerBetween.d.ts.map +1 -1
- package/src/core/math/random/randomIntegerBetween.js +4 -1
- package/src/core/math/solveCubic.d.ts.map +1 -1
- package/src/core/math/solveCubic.js +95 -82
- package/src/core/math/spline/computeCatmullRomSplineUniformDistance.d.ts.map +1 -1
- package/src/core/math/spline/computeCatmullRomSplineUniformDistance.js +13 -0
- package/src/core/math/statistics/softmax.js +1 -1
- package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +1 -0
- package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/NodeGraphVisualData.js +2 -1
- package/src/core/model/node-graph/visual/NodeVisualData.js +1 -1
- package/src/core/model/object/ImmutableObjectPool.d.ts +7 -0
- package/src/core/model/object/ImmutableObjectPool.d.ts.map +1 -1
- package/src/core/model/object/ImmutableObjectPool.js +20 -10
- package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.d.ts.map +1 -1
- package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.js +39 -2
- package/src/core/model/reactive/model/terminal/ReactiveReference.d.ts.map +1 -1
- package/src/core/model/reactive/model/terminal/ReactiveReference.js +2 -0
- package/src/core/parser/simple/readHexToken.d.ts.map +1 -1
- package/src/core/parser/simple/readHexToken.js +6 -0
- package/src/core/primitives/numbers/number_pretty_print.d.ts.map +1 -1
- package/src/core/primitives/numbers/number_pretty_print.js +4 -1
- package/src/core/primitives/strings/string_jaro_winkler.js +1 -1
- package/src/core/process/CompositeProcess.js +1 -1
- package/src/core/process/action/AsynchronousDelayAction.d.ts.map +1 -1
- package/src/core/process/action/AsynchronousDelayAction.js +3 -0
- package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
- package/src/core/process/executor/ConcurrentExecutor.js +3 -2
- package/src/core/process/task/util/randomCountTask.d.ts.map +1 -1
- package/src/core/process/task/util/randomCountTask.js +3 -1
- package/src/core/process/undo/ActionProcessor.d.ts.map +1 -1
- package/src/core/process/undo/ActionProcessor.js +5 -3
- package/src/core/process/worker/WorkerBuilder.js +3 -3
- package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
- package/src/engine/animation/curve/AnimationCurve.js +4 -2
- package/src/engine/control/first-person/DESIGN.md +1 -1
- package/src/engine/control/first-person/FirstPersonMotionPhase.d.ts +55 -0
- package/src/engine/control/first-person/FirstPersonMotionPhase.d.ts.map +1 -0
- package/src/engine/control/first-person/FirstPersonMotionPhase.js +134 -0
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +23 -2
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerController.js +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +168 -0
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +115 -0
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +71 -0
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +255 -55
- package/src/engine/control/first-person/abilities/LedgeGrab.d.ts +82 -43
- package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/LedgeGrab.js +405 -213
- package/src/engine/control/first-person/abilities/Mantle.d.ts +6 -0
- package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/Mantle.js +104 -45
- package/src/engine/control/first-person/abilities/ScrambleUp.d.ts +61 -0
- package/src/engine/control/first-person/abilities/ScrambleUp.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/ScrambleUp.js +182 -0
- package/src/engine/control/first-person/math/jumpDynamics.d.ts +84 -0
- package/src/engine/control/first-person/math/jumpDynamics.d.ts.map +1 -0
- package/src/engine/control/first-person/math/jumpDynamics.js +108 -0
- package/src/engine/control/first-person/prototype_first_person_controller.js +45 -1
- package/src/engine/graphics/camera/testClippingPlaneComputation.js +1 -1
- package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +1 -1
- package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +1 -1
- package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +1 -1
- package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +1 -1
- package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +1 -1
- package/src/engine/graphics/sh3/path_tracer/texture/sample_material.js +1 -1
- package/src/engine/graphics/shadows/testShadowMapRendering.js +1 -1
- package/src/engine/physics/CONSTRAINT_SOLVER_BENCH_LOG.md +208 -0
- package/src/engine/physics/CONSTRAINT_SOLVER_IMPROVEMENTS_PLAN.md +364 -0
- package/src/engine/physics/PLAN.md +6 -5
- package/src/engine/physics/constraint/solve_constraints.d.ts +4 -1
- package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
- package/src/engine/physics/constraint/solve_constraints.js +147 -33
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +1750 -1747
- package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
- package/src/engine/physics/gjk/gjk_epa_penetration.d.ts.map +1 -1
- package/src/engine/physics/gjk/gjk_epa_penetration.js +5 -9
- package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/convex_convex_manifold.js +22 -25
- package/src/engine/physics/narrowphase/convex_decomposition.d.ts +32 -13
- package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/convex_decomposition.js +61 -65
- package/src/engine/physics/narrowphase/mesh_convex_hull.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/mesh_convex_hull.js +13 -8
- package/src/engine/physics/narrowphase/refine_ray_concave.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/refine_ray_concave.js +5 -3
- package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/refine_ray_hit.js +81 -78
- package/src/engine/sound/SoundEngine.d.ts.map +1 -1
- package/src/engine/sound/SoundEngine.js +28 -0
- package/src/engine/sound/dB2Volume.d.ts +1 -1
- package/src/engine/sound/dB2Volume.d.ts.map +1 -1
- package/src/engine/sound/dB2Volume.js +1 -1
- package/src/engine/sound/ecs/SoundController.d.ts +4 -0
- package/src/engine/sound/ecs/SoundController.d.ts.map +1 -1
- package/src/engine/sound/ecs/SoundController.js +4 -0
- package/src/engine/sound/ecs/SoundControllerSystem.d.ts +5 -0
- package/src/engine/sound/ecs/SoundControllerSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/SoundControllerSystem.js +5 -0
- package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +69 -0
- package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -0
- package/src/engine/sound/ecs/audio/AudioEmitter.js +83 -0
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +97 -0
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -0
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +238 -0
- package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +90 -0
- package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -0
- package/src/engine/sound/ecs/audio/LiveEmitterSet.js +324 -0
- package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts +59 -0
- package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts.map +1 -0
- package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +140 -0
- package/src/engine/sound/ecs/emitter/SoundEmitter.d.ts +16 -65
- package/src/engine/sound/ecs/emitter/SoundEmitter.d.ts.map +1 -1
- package/src/engine/sound/ecs/emitter/SoundEmitter.js +19 -224
- package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.d.ts +26 -29
- package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.d.ts.map +1 -1
- package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.js +168 -135
- package/src/engine/sound/ecs/emitter/SoundEmitterSystem.d.ts +36 -59
- package/src/engine/sound/ecs/emitter/SoundEmitterSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/emitter/SoundEmitterSystem.js +154 -390
- package/src/engine/sound/ecs/emitter/SoundTrack.d.ts +20 -23
- package/src/engine/sound/ecs/emitter/SoundTrack.d.ts.map +1 -1
- package/src/engine/sound/ecs/emitter/SoundTrack.js +34 -152
- package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +993 -0
- package/src/engine/sound/sopra/README.md +643 -7
- package/src/engine/sound/sopra/SopraEngine.d.ts +229 -0
- package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -0
- package/src/engine/sound/sopra/SopraEngine.js +423 -0
- package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.d.ts +26 -0
- package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.d.ts.map +1 -0
- package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.js +71 -0
- package/src/engine/sound/sopra/asset/BufferProvider.d.ts +24 -0
- package/src/engine/sound/sopra/asset/BufferProvider.d.ts.map +1 -0
- package/src/engine/sound/sopra/asset/BufferProvider.js +29 -0
- package/src/engine/sound/sopra/asset/StubBufferProvider.d.ts +31 -0
- package/src/engine/sound/sopra/asset/StubBufferProvider.d.ts.map +1 -0
- package/src/engine/sound/sopra/asset/StubBufferProvider.js +58 -0
- package/src/engine/sound/sopra/definition/BusDefinition.d.ts +83 -0
- package/src/engine/sound/sopra/definition/BusDefinition.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/BusDefinition.js +142 -0
- package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.d.ts +17 -0
- package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.js +54 -0
- package/src/engine/sound/sopra/definition/DuckingRule.d.ts +71 -0
- package/src/engine/sound/sopra/definition/DuckingRule.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/DuckingRule.js +106 -0
- package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.d.ts +18 -0
- package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.js +31 -0
- package/src/engine/sound/sopra/definition/EventDescription.d.ts +132 -0
- package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/EventDescription.js +259 -0
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +17 -0
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +71 -0
- package/src/engine/sound/sopra/definition/MixerSnapshot.d.ts +51 -0
- package/src/engine/sound/sopra/definition/MixerSnapshot.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/MixerSnapshot.js +83 -0
- package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.d.ts +18 -0
- package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.js +39 -0
- package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts +72 -0
- package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/ParameterDefinition.js +117 -0
- package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.d.ts +18 -0
- package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.js +31 -0
- package/src/engine/sound/sopra/definition/SopraPanningModel.d.ts +14 -0
- package/src/engine/sound/sopra/definition/SopraPanningModel.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/SopraPanningModel.js +20 -0
- package/src/engine/sound/sopra/definition/VoiceStealMode.d.ts +10 -0
- package/src/engine/sound/sopra/definition/VoiceStealMode.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/VoiceStealMode.js +18 -0
- package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts +93 -0
- package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +109 -0
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts +80 -0
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +181 -0
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.d.ts +17 -0
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.js +74 -0
- package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.d.ts +34 -0
- package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +100 -0
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +101 -0
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +230 -0
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.d.ts +17 -0
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.js +54 -0
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts +103 -0
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +191 -0
- package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.d.ts +18 -0
- package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.js +39 -0
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts +40 -0
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.js +91 -0
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.d.ts +17 -0
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.js +42 -0
- package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.d.ts +44 -0
- package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +77 -0
- package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.d.ts +18 -0
- package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.js +27 -0
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +65 -0
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +131 -0
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.d.ts +17 -0
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.js +41 -0
- package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +24 -0
- package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +24 -0
- package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +70 -0
- package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +120 -0
- package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.d.ts +18 -0
- package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.js +31 -0
- package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +74 -0
- package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/effect/EqEffect.js +128 -0
- package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.d.ts +18 -0
- package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.js +29 -0
- package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +49 -0
- package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +101 -0
- package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.d.ts +18 -0
- package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.js +25 -0
- package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.d.ts +31 -0
- package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.d.ts.map +1 -0
- package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.js +106 -0
- package/src/engine/sound/sopra/runtime/BusGraph.d.ts +79 -0
- package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -0
- package/src/engine/sound/sopra/runtime/BusGraph.js +227 -0
- package/src/engine/sound/sopra/runtime/EventInstance.d.ts +144 -0
- package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -0
- package/src/engine/sound/sopra/runtime/EventInstance.js +579 -0
- package/src/engine/sound/sopra/runtime/ParameterStore.d.ts +42 -0
- package/src/engine/sound/sopra/runtime/ParameterStore.d.ts.map +1 -0
- package/src/engine/sound/sopra/runtime/ParameterStore.js +98 -0
- package/src/engine/sound/sopra/runtime/SopraPlaybackContext.d.ts +42 -0
- package/src/engine/sound/sopra/runtime/SopraPlaybackContext.d.ts.map +1 -0
- package/src/engine/sound/sopra/runtime/SopraPlaybackContext.js +68 -0
- package/src/engine/sound/sopra/runtime/Voice.d.ts +67 -0
- package/src/engine/sound/sopra/runtime/Voice.d.ts.map +1 -0
- package/src/engine/sound/sopra/runtime/Voice.js +145 -0
- package/src/engine/sound/sopra/runtime/VoiceManager.d.ts +38 -0
- package/src/engine/sound/sopra/runtime/VoiceManager.d.ts.map +1 -0
- package/src/engine/sound/sopra/runtime/VoiceManager.js +136 -0
- package/src/engine/sound/sopra/runtime/VoicePool.d.ts +12 -0
- package/src/engine/sound/sopra/runtime/VoicePool.d.ts.map +1 -0
- package/src/engine/sound/sopra/runtime/VoicePool.js +17 -0
- package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +11 -0
- package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -0
- package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +42 -0
- package/src/engine/sound/sopra/serialization/sopraJSON.d.ts +33 -0
- package/src/engine/sound/sopra/serialization/sopraJSON.d.ts.map +1 -0
- package/src/engine/sound/sopra/serialization/sopraJSON.js +99 -0
- package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +27 -0
- package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -0
- package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +49 -0
- package/src/engine/sound/sopra/util/MockAudioContext.d.ts +74 -0
- package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -0
- package/src/engine/sound/sopra/util/MockAudioContext.js +215 -0
- package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts +15 -0
- package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts.map +1 -0
- package/src/engine/sound/sopra/util/buildAttenuationCurve.js +40 -0
- package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +34 -0
- package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -0
- package/src/engine/sound/sopra/util/fadeOutAndStop.js +60 -0
- package/src/engine/sound/volume2dB.d.ts +1 -1
- package/src/engine/sound/volume2dB.d.ts.map +1 -1
- package/src/engine/sound/volume2dB.js +1 -1
- package/src/engine/graphics/sh3/path_tracer/sampling/v3_orthonormal_matrix_from_normal.d.ts.map +0 -1
- package/src/engine/physics/narrowphase/ray_shapes.d.ts +0 -66
- package/src/engine/physics/narrowphase/ray_shapes.d.ts.map +0 -1
- package/src/engine/physics/narrowphase/ray_shapes.js +0 -187
- package/src/engine/sound/ecs/emitter/SoundEmitterChannel.d.ts +0 -23
- package/src/engine/sound/ecs/emitter/SoundEmitterChannel.d.ts.map +0 -1
- package/src/engine/sound/ecs/emitter/SoundEmitterChannel.js +0 -32
- package/src/engine/sound/ecs/emitter/SoundTrackNodes.d.ts +0 -18
- package/src/engine/sound/ecs/emitter/SoundTrackNodes.d.ts.map +0 -1
- package/src/engine/sound/ecs/emitter/SoundTrackNodes.js +0 -18
- package/src/engine/sound/sopra/AbstractAudioClip.d.ts +0 -26
- package/src/engine/sound/sopra/AbstractAudioClip.d.ts.map +0 -1
- package/src/engine/sound/sopra/AbstractAudioClip.js +0 -29
- package/src/engine/sound/sopra/ContainerAudioClip.d.ts +0 -12
- package/src/engine/sound/sopra/ContainerAudioClip.d.ts.map +0 -1
- package/src/engine/sound/sopra/ContainerAudioClip.js +0 -13
- package/src/engine/sound/sopra/RandomContainerAudioClip.d.ts +0 -12
- package/src/engine/sound/sopra/RandomContainerAudioClip.d.ts.map +0 -1
- package/src/engine/sound/sopra/RandomContainerAudioClip.js +0 -15
- package/src/engine/sound/sopra/SequenceContainerAudioClip.d.ts +0 -7
- package/src/engine/sound/sopra/SequenceContainerAudioClip.d.ts.map +0 -1
- package/src/engine/sound/sopra/SequenceContainerAudioClip.js +0 -8
- package/src/engine/sound/sopra/SilenceAudioClip.d.ts +0 -13
- package/src/engine/sound/sopra/SilenceAudioClip.d.ts.map +0 -1
- package/src/engine/sound/sopra/SilenceAudioClip.js +0 -15
- /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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
60
|
-
A[M + 1] =
|
|
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
|
-
|
|
63
|
-
|
|
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
|
|
69
|
-
function
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
*
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
*
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
*
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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 {
|
|
168
|
-
* @param {
|
|
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
|
-
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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
|
|
201
|
+
const M = terms_to_sum(_x);
|
|
199
202
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
|
208
|
+
const e_term = Math.exp(2.0 * _x[1]);
|
|
205
209
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
214
|
-
prev_B = ab_n.old_B;
|
|
215
|
-
prev_R = ab_n.old_R;
|
|
217
|
+
const ab = new Float64Array(M * 4);
|
|
216
218
|
|
|
217
|
-
|
|
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 {
|
|
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:
|
|
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":"
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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 =
|
|
44
|
-
const bn_mag_sq =
|
|
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(
|
|
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(
|
|
65
|
-
const term_bn_bn1 = v2_dot(
|
|
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)) *
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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"}
|