@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
|
@@ -7,7 +7,13 @@
|
|
|
7
7
|
* @param {number[]|Float32Array} b
|
|
8
8
|
* @returns {number[]|Float32Array} `out` parameter
|
|
9
9
|
*/
|
|
10
|
-
export function m4_multiply_alphatensor(out,
|
|
10
|
+
export function m4_multiply_alphatensor(out, a_in, b_in) {
|
|
11
|
+
// The AlphaTensor factorization transcribed below computes the transpose of (b_in * a_in). To return
|
|
12
|
+
// out = a_in * b_in we feed the operands swapped (the a* locals read b_in, the b* locals read a_in) and
|
|
13
|
+
// write each computed element to its transposed output slot.
|
|
14
|
+
const a = b_in;
|
|
15
|
+
const b = a_in;
|
|
16
|
+
|
|
11
17
|
// read out matricies
|
|
12
18
|
const a11 = a[0];
|
|
13
19
|
const a13 = a[2];
|
|
@@ -112,38 +118,38 @@ export function m4_multiply_alphatensor(out, a, b) {
|
|
|
112
118
|
const c14 = -h16 + h17 - h20 - h21 + h22 - h23 + h25 + h26 - h29 - h32 - h33 + h34 + h38 - h41 + h42 + h43
|
|
113
119
|
|
|
114
120
|
out[0] = c11;
|
|
115
|
-
out[
|
|
116
|
-
out[
|
|
117
|
-
out[
|
|
121
|
+
out[4] = c12;
|
|
122
|
+
out[8] = c13;
|
|
123
|
+
out[12] = c14;
|
|
118
124
|
|
|
119
125
|
const c21 = -h7 + h8 - h10 + h11 - h14 + h15 + h16 - h17 + h18 + h21 - h31 + h33 - h35 - h36
|
|
120
126
|
const c22 = h7 - h8 + h10 - h11 - h15 - h16 + h17 - h18 - h21 + h22 - h23 + h26 - h33 + h44
|
|
121
127
|
const c23 = -h7 + h8 + h11 + h12 - h16 + h17 - h20 - h21 - h29 - h33 + h34 + h36 + h38 + h46
|
|
122
128
|
const c24 = -h7 + h8 + h11 + h12 - h16 + h17 - h20 - h21 + h22 - h23 + h25 + h26 - h29 - h33 + h34 + h38
|
|
123
129
|
|
|
124
|
-
out[
|
|
130
|
+
out[1] = c21;
|
|
125
131
|
out[5] = c22;
|
|
126
|
-
out[
|
|
127
|
-
out[
|
|
132
|
+
out[9] = c23;
|
|
133
|
+
out[13] = c24;
|
|
128
134
|
|
|
129
135
|
const c31 = h1 - h2 + h3 - h5 + h33 - h34 + h37 - h40
|
|
130
136
|
const c32 = h17 - h18 - h19 - h21 - h23 + h24 + h26 - h33 + h34 - h37 + h40 - h43 + h44 + h45 - h47 + h49
|
|
131
137
|
const c33 = h4 + h5 - h29 - h33 + h34 + h40
|
|
132
138
|
const c34 = -h21 + h26 - h27 + h28 - h29 - h32 - h33 + h34 + h40 - h47
|
|
133
139
|
|
|
134
|
-
out[
|
|
135
|
-
out[
|
|
140
|
+
out[2] = c31;
|
|
141
|
+
out[6] = c32;
|
|
136
142
|
out[10] = c33;
|
|
137
|
-
out[
|
|
143
|
+
out[14] = c34;
|
|
138
144
|
|
|
139
145
|
const c41 = h8 - h10 + h11 - h13 + h17 - h18 - h19 - h21 + h31 - h33 + h34 + h35 + h36 - h37 - h39 + h40
|
|
140
146
|
const c42 = -h8 + h10 - h11 + h13 - h17 + h18 + h19 + h21 + h23 - h24 - h26 + h33 - h34 + h37 - h40 - h44
|
|
141
147
|
const c43 = h11 + h21 - h28 + h29 + h30 + h33 - h34 - h35 - h36 + h39 - h40 + h48
|
|
142
148
|
const c44 = h11 + h21 - h26 + h27 - h28 + h29 + h33 - h34 - h40 + h48
|
|
143
149
|
|
|
144
|
-
out[
|
|
145
|
-
out[
|
|
146
|
-
out[
|
|
150
|
+
out[3] = c41;
|
|
151
|
+
out[7] = c42;
|
|
152
|
+
out[11] = c43;
|
|
147
153
|
out[15] = c44;
|
|
148
154
|
|
|
149
155
|
return out;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"octahedral_direction_to_uv.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/octahedra/octahedral_direction_to_uv.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,mDALW,MAAM,EAAE,cACR,MAAM,gBACN,MAAM,EAAE,aACR,MAAM,
|
|
1
|
+
{"version":3,"file":"octahedral_direction_to_uv.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/octahedra/octahedral_direction_to_uv.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,mDALW,MAAM,EAAE,cACR,MAAM,gBACN,MAAM,EAAE,aACR,MAAM,QAuChB"}
|
|
@@ -43,6 +43,7 @@ export function octahedral_direction_to_uv(
|
|
|
43
43
|
octahedron_z = octant_z * (1 - absolute_x);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
out_uv[out_offset +
|
|
46
|
+
// map octahedron coordinates from [-1,1] into [0,1] UV space; this exactly inverts the decode's `*2 - 1`.
|
|
47
|
+
out_uv[out_offset + 0] = octahedron_x * 0.5 + 0.5;
|
|
48
|
+
out_uv[out_offset + 1] = octahedron_z * 0.5 + 0.5;
|
|
48
49
|
}
|
|
@@ -64,13 +64,14 @@ function solveIntersectingPoint(zeroCoord, A, B, p1, p2, result) {
|
|
|
64
64
|
|
|
65
65
|
const a1 = nP1[A];
|
|
66
66
|
const b1 = nP1[B];
|
|
67
|
-
|
|
67
|
+
// plane equation is dot(normal, p) + constant = 0, so the linear-system RHS is -constant
|
|
68
|
+
const d1 = -p1.constant;
|
|
68
69
|
|
|
69
70
|
const nP2 = p2.normal;
|
|
70
71
|
|
|
71
72
|
const a2 = nP2[A];
|
|
72
73
|
const b2 = nP2[B];
|
|
73
|
-
const d2 = p2.constant;
|
|
74
|
+
const d2 = -p2.constant;
|
|
74
75
|
|
|
75
76
|
const A0 = ((b2 * d1) - (b1 * d2)) / ((a1 * b2 - a2 * b1));
|
|
76
77
|
const B0 = ((a1 * d2) - (a2 * d1)) / ((a1 * b2 - a2 * b1));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MeshShape3D.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/shape/MeshShape3D.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH;IAKQ;;;;;OAKG;IACH,WAFU,YAAY,CAEc;IAEpC;;;;OAIG;IACH,SAFU,WAAW,CAEY;IAEjC;;;;;;;OAOG;IACH,UAFU,eAAe,CAEY;IAErC;;;;;;;;OAQG;IACH,eAFU,YAAY,CAEkB;IAExC;;;;;;OAMG;IACH,SAFU,GAAG,CAEW;IAExB;;;;;OAKG;IACH,eAAkD;IAElD;;;;;OAKG;IACH,iBAAiB;IAEjB;;;;OAIG;IACH,uBAAuB;IAW3B,wCAIC;IAED;;;;;OAKG;IACH,yBAmDC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,gBANW,MAAM,EAAE,GAAC,YAAY,iBACrB,MAAM,eACN,MAAM,eACN,MAAM,eACN,MAAM,QA0BhB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,sBAHW,MAAM,EAAE,GAAC,YAAY,GACnB,OAAO,
|
|
1
|
+
{"version":3,"file":"MeshShape3D.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/shape/MeshShape3D.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH;IAKQ;;;;;OAKG;IACH,WAFU,YAAY,CAEc;IAEpC;;;;OAIG;IACH,SAFU,WAAW,CAEY;IAEjC;;;;;;;OAOG;IACH,UAFU,eAAe,CAEY;IAErC;;;;;;;;OAQG;IACH,eAFU,YAAY,CAEkB;IAExC;;;;;;OAMG;IACH,SAFU,GAAG,CAEW;IAExB;;;;;OAKG;IACH,eAAkD;IAElD;;;;;OAKG;IACH,iBAAiB;IAEjB;;;;OAIG;IACH,uBAAuB;IAW3B,wCAIC;IAED;;;;;OAKG;IACH,yBAmDC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,gBANW,MAAM,EAAE,GAAC,YAAY,iBACrB,MAAM,eACN,MAAM,eACN,MAAM,eACN,MAAM,QA0BhB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,sBAHW,MAAM,EAAE,GAAC,YAAY,GACnB,OAAO,CAyCnB;IAED;;;;;;;;;OASG;IACH,iCAHW,MAAM,EAAE,GAAC,YAAY,aACrB,MAAM,EAAE,GAAC,YAAY,QA4C/B;IAED;;;;;;;;OAQG;IACH,gCAHW,MAAM,EAAE,GAAC,YAAY,GACnB,MAAM,CAsClB;IAED;;;;;;;;;OASG;IACH,sCAJW,MAAM,EAAE,GAAC,YAAY,iBACrB,MAAM,gBACK,MAAM,QAuB3B;IAED;;;;;;OAMG;IACH,0CAJW,MAAM,EAAE,GAAC,YAAY,SACrB,MAAM,EAAE,GAAC,YAAY,GACnB,MAAM,CAiBlB;IAED;;;;;;OAMG;IACH,cAHW,WAAW,GACT,OAAO,CAanB;IAkBL;;;;OAIG;IACH,wBAFU,OAAO,CAEkB;CAPlC;gCAxe+B,sBAAsB;gCADtB,kCAAkC;oBAJ9C,2BAA2B"}
|
|
@@ -273,6 +273,13 @@ export class MeshShape3D extends AbstractShape3D {
|
|
|
273
273
|
scratch_query_aabb[0] = px; scratch_query_aabb[1] = py; scratch_query_aabb[2] = pz;
|
|
274
274
|
scratch_query_aabb[3] = px; scratch_query_aabb[4] = py; scratch_query_aabb[5] = pz;
|
|
275
275
|
|
|
276
|
+
// Ensure the shared (module-static) candidate buffer can hold every possible hit. A single point can
|
|
277
|
+
// overlap at most `count` tet AABBs, so this is a guaranteed-safe upper bound; without it the query
|
|
278
|
+
// silently truncates at the fixed 64-slot size and contains_point can miss the containing tet.
|
|
279
|
+
if (scratch_candidates.length < this.tet_mesh.count) {
|
|
280
|
+
scratch_candidates = new Uint32Array(this.tet_mesh.count);
|
|
281
|
+
}
|
|
282
|
+
|
|
276
283
|
const n = bvh_query_user_data_overlaps_aabb(
|
|
277
284
|
scratch_candidates, 0, this.tet_bvh, scratch_query_aabb
|
|
278
285
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnionShape3D.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/shape/UnionShape3D.js"],"names":[],"mappings":"AA2BA;
|
|
1
|
+
{"version":3,"file":"UnionShape3D.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/shape/UnionShape3D.js"],"names":[],"mappings":"AA2BA;IAsII;;;;OAIG;IACH,sBAHW,eAAe,EAAE,GACf,YAAY,CAYxB;IAjJG;;;OAGG;IACH,UAFU,eAAe,EAAE,CAET;IAElB;;;;;OAKG;IACH,kCAAmC;IAEnC,qBAAsB;IACtB,qBAAuB;IACvB,uBAAyB;IAG7B,wCAgCC;IAED;;;OAGG;IACH,mCAkBC;IAED;;;OAGG;IACH,2CA+CC;IA2DD,mEAEC;IAED,6CAaC;IAED,oCAYC;IAED,kFAoDC;IAED,qGAyBC;IAED;;;;OAIG;IACH,cAHW,YAAY,GACV,OAAO,CAKnB;CAcJ;gCAzV+B,sBAAsB"}
|
|
@@ -135,7 +135,7 @@ export class UnionShape3D extends AbstractShape3D {
|
|
|
135
135
|
|
|
136
136
|
const child_0 = children[target_child_index];
|
|
137
137
|
|
|
138
|
-
for (j = 0; j < VOLUME_OVERLAP_ESTIMATION_SUB_TAPS; j
|
|
138
|
+
for (j = 0; j < VOLUME_OVERLAP_ESTIMATION_SUB_TAPS; j++) {
|
|
139
139
|
|
|
140
140
|
child_0.sample_random_point_in_volume(scratch_array, 0, random);
|
|
141
141
|
|
|
@@ -155,7 +155,8 @@ export class UnionShape3D extends AbstractShape3D {
|
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
// total samples taken = outer taps * sub-taps (the inner loop no longer corrupts the outer counter)
|
|
159
|
+
this.__volume_overlap_fraction = tap_overlaps / (VOLUME_OVERLAP_ESTIMATION_TAPS * VOLUME_OVERLAP_ESTIMATION_SUB_TAPS);
|
|
159
160
|
}
|
|
160
161
|
|
|
161
162
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shape3d_voxelize_to_grid.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,gFAVW,YAAY,GAAC,MAAM,EAAE,iBAErB,YAAY,GAAC,MAAM,EAAE,QAErB,UAAU,MAEV,MAAM,MACN,MAAM,MACN,MAAM,
|
|
1
|
+
{"version":3,"file":"shape3d_voxelize_to_grid.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,gFAVW,YAAY,GAAC,MAAM,EAAE,iBAErB,YAAY,GAAC,MAAM,EAAE,QAErB,UAAU,MAEV,MAAM,MACN,MAAM,MACN,MAAM,QAkFhB"}
|
|
@@ -1,148 +1,153 @@
|
|
|
1
|
-
import { assert } from "../../../../assert.js";
|
|
2
|
-
import { v3_length } from "../../../vec3/v3_length.js";
|
|
3
|
-
import { v3_matrix4_multiply } from "../../../vec3/v3_matrix4_multiply.js";
|
|
4
|
-
import { aabb3_matrix4_project } from "../../aabb/aabb3_matrix4_project.js";
|
|
5
|
-
|
|
6
|
-
// Reusable per-call scratch — keeps the function allocation-free under repeat
|
|
7
|
-
// invocations (which is the expected pattern: re-voxelize the scene every frame
|
|
8
|
-
// before stepping a simulation).
|
|
9
|
-
const _scratch_aabb_world = new Float32Array(6);
|
|
10
|
-
const _scratch_aabb_grid = new Float32Array(6);
|
|
11
|
-
const _scratch_grid_pt = new Float32Array(3);
|
|
12
|
-
const _scratch_world_pt = new Float32Array(3);
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Rasterize an {@link AbstractShape3D} into a cell-centered Uint8 grid mask.
|
|
16
|
-
*
|
|
17
|
-
* For each integer cell `(i, j, k)` in `[0, rx) × [0, ry) × [0, rz)`, the cell's
|
|
18
|
-
* center is recovered as the world-space point `grid_to_world * (i, j, k)`. If
|
|
19
|
-
* that point lies inside the shape — or close enough to its surface (see below)
|
|
20
|
-
* — the corresponding cell in `grid` is written as `1`.
|
|
21
|
-
*
|
|
22
|
-
* The grid is **not** cleared first. Cells outside the shape (and outside its
|
|
23
|
-
* proximity band) are left exactly as they were, which lets the caller compose
|
|
24
|
-
* multiple shapes into the same buffer by calling this function repeatedly. The
|
|
25
|
-
* caller is responsible for `grid.fill(0)` if a fresh mask is desired.
|
|
26
|
-
*
|
|
27
|
-
* **Proximity test.** A cell whose centre is outside the shape is still marked
|
|
28
|
-
* solid if `signed_distance_at_point(centre) < half_cell_diagonal`. This catches
|
|
29
|
-
* features that pass through a cell without containing its centre — e.g. a thin
|
|
30
|
-
* sheet bisecting a cubic cell at 45°. The threshold is the largest possible
|
|
31
|
-
* distance from a cell's centre to any point inside the cell, so any shape that
|
|
32
|
-
* intersects the cell at all is captured. Cheap fast path: `contains_point` is
|
|
33
|
-
* tested first (no sqrt for most shapes); the more expensive signed-distance
|
|
34
|
-
* call only runs for cells whose centre is outside.
|
|
35
|
-
*
|
|
36
|
-
* **Volume guard.** If the shape's total volume is less than half the volume of
|
|
37
|
-
* a single cell, the function returns immediately without writing anything. A
|
|
38
|
-
* shape that small can't be meaningfully represented as a unit-cell solid — the
|
|
39
|
-
* obstacle would end up perceptibly larger than the shape itself. Callers with
|
|
40
|
-
* sub-cell shapes should either refine the grid or use a different
|
|
41
|
-
* representation (e.g. a point-velocity effector).
|
|
42
|
-
*
|
|
43
|
-
* **Coord space.** `shape.contains_point` / `signed_distance_at_point` are
|
|
44
|
-
* called with **world** coordinates. For shapes that have their own local frame
|
|
45
|
-
* (e.g. `UnitSphereShape3D` centred at the origin), wrap them in a
|
|
46
|
-
* {@link TransformedShape3D} so they sit at the right world position before
|
|
47
|
-
* passing in. The voxelizer is otherwise agnostic to how the shape interprets
|
|
48
|
-
* its inputs.
|
|
49
|
-
*
|
|
50
|
-
* **Grid orientation.** `world_to_grid` and `grid_to_world` are full 4×4
|
|
51
|
-
* column-major affines, so the grid can be translated, scaled, or rotated in
|
|
52
|
-
* world space; the algorithm makes no axis-aligned assumption. Cell size per
|
|
53
|
-
* axis is recovered from the column lengths of `grid_to_world`, which is exact
|
|
54
|
-
* for orthogonal grids and an overestimate of cell volume for skewed ones — the
|
|
55
|
-
* latter only widens the volume-guard threshold, which is conservative.
|
|
56
|
-
*
|
|
57
|
-
* Designed to feed e.g. a fluid simulator's solid mask, but lives outside any
|
|
58
|
-
* specific package: anything that needs "rasterize a shape into a cell-centered
|
|
59
|
-
* boolean grid" can use it.
|
|
60
|
-
*
|
|
61
|
-
* @param {AbstractShape3D} shape shape to voxelize; `contains_point` and
|
|
62
|
-
* `signed_distance_at_point` are invoked with world-space points.
|
|
63
|
-
* @param {Float32Array|number[]} world_to_grid column-major 4×4 affine;
|
|
64
|
-
* world point → grid (cell-index) coords.
|
|
65
|
-
* @param {Float32Array|number[]} grid_to_world column-major 4×4 affine;
|
|
66
|
-
* grid (cell-index) coords → world cell center.
|
|
67
|
-
* @param {Uint8Array} grid output mask, length must be ≥ `rx * ry * rz`.
|
|
68
|
-
* Cells that don't pass the test are left untouched.
|
|
69
|
-
* @param {number} rx positive integer.
|
|
70
|
-
* @param {number} ry positive integer.
|
|
71
|
-
* @param {number} rz positive integer.
|
|
72
|
-
*/
|
|
73
|
-
export function shape3d_voxelize_to_grid(shape, world_to_grid, grid_to_world, grid, rx, ry, rz) {
|
|
74
|
-
assert.defined(shape, "shape");
|
|
75
|
-
assert.isArrayLike(world_to_grid, "world_to_grid");
|
|
76
|
-
assert.greaterThanOrEqual(world_to_grid.length, 16, "world_to_grid.length");
|
|
77
|
-
assert.isArrayLike(grid_to_world, "grid_to_world");
|
|
78
|
-
assert.greaterThanOrEqual(grid_to_world.length, 16, "grid_to_world.length");
|
|
79
|
-
assert.defined(grid, "grid");
|
|
80
|
-
assert.isPositiveInteger(rx, "rx");
|
|
81
|
-
assert.isPositiveInteger(ry, "ry");
|
|
82
|
-
assert.isPositiveInteger(rz, "rz");
|
|
83
|
-
assert.greaterThanOrEqual(grid.length, rx * ry * rz, "grid.length");
|
|
84
|
-
|
|
85
|
-
// Recover per-axis cell size from the column lengths of grid_to_world. For
|
|
86
|
-
// an axis-aligned uniform grid these are just the cell spacings; for an
|
|
87
|
-
// oriented grid they're the post-rotation lengths, which still bound the
|
|
88
|
-
// cell extent correctly.
|
|
89
|
-
const cs_x = v3_length(grid_to_world[0], grid_to_world[1], grid_to_world[2]);
|
|
90
|
-
const cs_y = v3_length(grid_to_world[4], grid_to_world[5], grid_to_world[6]);
|
|
91
|
-
const cs_z = v3_length(grid_to_world[8], grid_to_world[9], grid_to_world[10]);
|
|
92
|
-
const cell_volume = cs_x * cs_y * cs_z;
|
|
93
|
-
|
|
94
|
-
// Volume guard. See docstring — sub-cell shapes are skipped wholesale.
|
|
95
|
-
if (shape.volume < cell_volume * 0.5) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Proximity threshold = half the cell diagonal in world units. Any shape
|
|
100
|
-
// whose surface comes within this radius of a cell centre might intersect
|
|
101
|
-
// the cell; this is the tightest threshold that won't miss grazing
|
|
102
|
-
// features.
|
|
103
|
-
const proximity_threshold = Math.sqrt(cs_x * cs_x + cs_y * cs_y + cs_z * cs_z) * 0.5;
|
|
104
|
-
|
|
105
|
-
// Restrict iteration to the shape's bounding box transformed into grid
|
|
106
|
-
//
|
|
107
|
-
//
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
1
|
+
import { assert } from "../../../../assert.js";
|
|
2
|
+
import { v3_length } from "../../../vec3/v3_length.js";
|
|
3
|
+
import { v3_matrix4_multiply } from "../../../vec3/v3_matrix4_multiply.js";
|
|
4
|
+
import { aabb3_matrix4_project } from "../../aabb/aabb3_matrix4_project.js";
|
|
5
|
+
|
|
6
|
+
// Reusable per-call scratch — keeps the function allocation-free under repeat
|
|
7
|
+
// invocations (which is the expected pattern: re-voxelize the scene every frame
|
|
8
|
+
// before stepping a simulation).
|
|
9
|
+
const _scratch_aabb_world = new Float32Array(6);
|
|
10
|
+
const _scratch_aabb_grid = new Float32Array(6);
|
|
11
|
+
const _scratch_grid_pt = new Float32Array(3);
|
|
12
|
+
const _scratch_world_pt = new Float32Array(3);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Rasterize an {@link AbstractShape3D} into a cell-centered Uint8 grid mask.
|
|
16
|
+
*
|
|
17
|
+
* For each integer cell `(i, j, k)` in `[0, rx) × [0, ry) × [0, rz)`, the cell's
|
|
18
|
+
* center is recovered as the world-space point `grid_to_world * (i, j, k)`. If
|
|
19
|
+
* that point lies inside the shape — or close enough to its surface (see below)
|
|
20
|
+
* — the corresponding cell in `grid` is written as `1`.
|
|
21
|
+
*
|
|
22
|
+
* The grid is **not** cleared first. Cells outside the shape (and outside its
|
|
23
|
+
* proximity band) are left exactly as they were, which lets the caller compose
|
|
24
|
+
* multiple shapes into the same buffer by calling this function repeatedly. The
|
|
25
|
+
* caller is responsible for `grid.fill(0)` if a fresh mask is desired.
|
|
26
|
+
*
|
|
27
|
+
* **Proximity test.** A cell whose centre is outside the shape is still marked
|
|
28
|
+
* solid if `signed_distance_at_point(centre) < half_cell_diagonal`. This catches
|
|
29
|
+
* features that pass through a cell without containing its centre — e.g. a thin
|
|
30
|
+
* sheet bisecting a cubic cell at 45°. The threshold is the largest possible
|
|
31
|
+
* distance from a cell's centre to any point inside the cell, so any shape that
|
|
32
|
+
* intersects the cell at all is captured. Cheap fast path: `contains_point` is
|
|
33
|
+
* tested first (no sqrt for most shapes); the more expensive signed-distance
|
|
34
|
+
* call only runs for cells whose centre is outside.
|
|
35
|
+
*
|
|
36
|
+
* **Volume guard.** If the shape's total volume is less than half the volume of
|
|
37
|
+
* a single cell, the function returns immediately without writing anything. A
|
|
38
|
+
* shape that small can't be meaningfully represented as a unit-cell solid — the
|
|
39
|
+
* obstacle would end up perceptibly larger than the shape itself. Callers with
|
|
40
|
+
* sub-cell shapes should either refine the grid or use a different
|
|
41
|
+
* representation (e.g. a point-velocity effector).
|
|
42
|
+
*
|
|
43
|
+
* **Coord space.** `shape.contains_point` / `signed_distance_at_point` are
|
|
44
|
+
* called with **world** coordinates. For shapes that have their own local frame
|
|
45
|
+
* (e.g. `UnitSphereShape3D` centred at the origin), wrap them in a
|
|
46
|
+
* {@link TransformedShape3D} so they sit at the right world position before
|
|
47
|
+
* passing in. The voxelizer is otherwise agnostic to how the shape interprets
|
|
48
|
+
* its inputs.
|
|
49
|
+
*
|
|
50
|
+
* **Grid orientation.** `world_to_grid` and `grid_to_world` are full 4×4
|
|
51
|
+
* column-major affines, so the grid can be translated, scaled, or rotated in
|
|
52
|
+
* world space; the algorithm makes no axis-aligned assumption. Cell size per
|
|
53
|
+
* axis is recovered from the column lengths of `grid_to_world`, which is exact
|
|
54
|
+
* for orthogonal grids and an overestimate of cell volume for skewed ones — the
|
|
55
|
+
* latter only widens the volume-guard threshold, which is conservative.
|
|
56
|
+
*
|
|
57
|
+
* Designed to feed e.g. a fluid simulator's solid mask, but lives outside any
|
|
58
|
+
* specific package: anything that needs "rasterize a shape into a cell-centered
|
|
59
|
+
* boolean grid" can use it.
|
|
60
|
+
*
|
|
61
|
+
* @param {AbstractShape3D} shape shape to voxelize; `contains_point` and
|
|
62
|
+
* `signed_distance_at_point` are invoked with world-space points.
|
|
63
|
+
* @param {Float32Array|number[]} world_to_grid column-major 4×4 affine;
|
|
64
|
+
* world point → grid (cell-index) coords.
|
|
65
|
+
* @param {Float32Array|number[]} grid_to_world column-major 4×4 affine;
|
|
66
|
+
* grid (cell-index) coords → world cell center.
|
|
67
|
+
* @param {Uint8Array} grid output mask, length must be ≥ `rx * ry * rz`.
|
|
68
|
+
* Cells that don't pass the test are left untouched.
|
|
69
|
+
* @param {number} rx positive integer.
|
|
70
|
+
* @param {number} ry positive integer.
|
|
71
|
+
* @param {number} rz positive integer.
|
|
72
|
+
*/
|
|
73
|
+
export function shape3d_voxelize_to_grid(shape, world_to_grid, grid_to_world, grid, rx, ry, rz) {
|
|
74
|
+
assert.defined(shape, "shape");
|
|
75
|
+
assert.isArrayLike(world_to_grid, "world_to_grid");
|
|
76
|
+
assert.greaterThanOrEqual(world_to_grid.length, 16, "world_to_grid.length");
|
|
77
|
+
assert.isArrayLike(grid_to_world, "grid_to_world");
|
|
78
|
+
assert.greaterThanOrEqual(grid_to_world.length, 16, "grid_to_world.length");
|
|
79
|
+
assert.defined(grid, "grid");
|
|
80
|
+
assert.isPositiveInteger(rx, "rx");
|
|
81
|
+
assert.isPositiveInteger(ry, "ry");
|
|
82
|
+
assert.isPositiveInteger(rz, "rz");
|
|
83
|
+
assert.greaterThanOrEqual(grid.length, rx * ry * rz, "grid.length");
|
|
84
|
+
|
|
85
|
+
// Recover per-axis cell size from the column lengths of grid_to_world. For
|
|
86
|
+
// an axis-aligned uniform grid these are just the cell spacings; for an
|
|
87
|
+
// oriented grid they're the post-rotation lengths, which still bound the
|
|
88
|
+
// cell extent correctly.
|
|
89
|
+
const cs_x = v3_length(grid_to_world[0], grid_to_world[1], grid_to_world[2]);
|
|
90
|
+
const cs_y = v3_length(grid_to_world[4], grid_to_world[5], grid_to_world[6]);
|
|
91
|
+
const cs_z = v3_length(grid_to_world[8], grid_to_world[9], grid_to_world[10]);
|
|
92
|
+
const cell_volume = cs_x * cs_y * cs_z;
|
|
93
|
+
|
|
94
|
+
// Volume guard. See docstring — sub-cell shapes are skipped wholesale.
|
|
95
|
+
if (shape.volume < cell_volume * 0.5) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Proximity threshold = half the cell diagonal in world units. Any shape
|
|
100
|
+
// whose surface comes within this radius of a cell centre might intersect
|
|
101
|
+
// the cell; this is the tightest threshold that won't miss grazing
|
|
102
|
+
// features.
|
|
103
|
+
const proximity_threshold = Math.sqrt(cs_x * cs_x + cs_y * cs_y + cs_z * cs_z) * 0.5;
|
|
104
|
+
|
|
105
|
+
// Restrict iteration to the shape's bounding box transformed into grid space, expanded by the proximity
|
|
106
|
+
// band. The band is `proximity_threshold` WORLD units wide, which is a different number of cells along each
|
|
107
|
+
// axis when the grid is anisotropic/skewed, so pad per-axis by ceil(threshold / cell_size). A fixed +1 cell
|
|
108
|
+
// under-covers the band along thin axes and would miss grazing features there.
|
|
109
|
+
shape.compute_bounding_box(_scratch_aabb_world);
|
|
110
|
+
aabb3_matrix4_project(_scratch_aabb_grid, _scratch_aabb_world, world_to_grid);
|
|
111
|
+
|
|
112
|
+
const pad_i = Math.ceil(proximity_threshold / cs_x);
|
|
113
|
+
const pad_j = Math.ceil(proximity_threshold / cs_y);
|
|
114
|
+
const pad_k = Math.ceil(proximity_threshold / cs_z);
|
|
115
|
+
|
|
116
|
+
const i_min = Math.max(0, Math.floor(_scratch_aabb_grid[0]) - pad_i);
|
|
117
|
+
const j_min = Math.max(0, Math.floor(_scratch_aabb_grid[1]) - pad_j);
|
|
118
|
+
const k_min = Math.max(0, Math.floor(_scratch_aabb_grid[2]) - pad_k);
|
|
119
|
+
const i_max = Math.min(rx - 1, Math.ceil(_scratch_aabb_grid[3]) + pad_i);
|
|
120
|
+
const j_max = Math.min(ry - 1, Math.ceil(_scratch_aabb_grid[4]) + pad_j);
|
|
121
|
+
const k_max = Math.min(rz - 1, Math.ceil(_scratch_aabb_grid[5]) + pad_k);
|
|
122
|
+
|
|
123
|
+
// Bounding box lies entirely outside the grid → nothing to do.
|
|
124
|
+
if (i_min > i_max || j_min > j_max || k_min > k_max) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const rx_ry = rx * ry;
|
|
129
|
+
const grid_pt = _scratch_grid_pt;
|
|
130
|
+
const world_pt = _scratch_world_pt;
|
|
131
|
+
|
|
132
|
+
for (let k = k_min; k <= k_max; k++) {
|
|
133
|
+
grid_pt[2] = k;
|
|
134
|
+
const k_offset = k * rx_ry;
|
|
135
|
+
for (let j = j_min; j <= j_max; j++) {
|
|
136
|
+
grid_pt[1] = j;
|
|
137
|
+
const j_offset = k_offset + j * rx;
|
|
138
|
+
for (let i = i_min; i <= i_max; i++) {
|
|
139
|
+
grid_pt[0] = i;
|
|
140
|
+
v3_matrix4_multiply(world_pt, 0, grid_pt, 0, grid_to_world);
|
|
141
|
+
|
|
142
|
+
// contains_point is the cheap fast path (no sqrt for most
|
|
143
|
+
// shapes). Only fall through to signed_distance for cells whose
|
|
144
|
+
// centre is outside the shape, where we still might mark them
|
|
145
|
+
// for the proximity rule.
|
|
146
|
+
if (shape.contains_point(world_pt)
|
|
147
|
+
|| shape.signed_distance_at_point(world_pt) < proximity_threshold) {
|
|
148
|
+
grid[j_offset + i] = 1;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sh3_dering_optimize_positive.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sh3_dering_optimize_positive.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js"],"names":[],"mappings":"AAiTA;;;;;;;GAOG;AACH,qDANW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,aACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,oBAClC,MAAM,oBACN,MAAM,QAIhB"}
|
|
@@ -249,6 +249,13 @@ function windowSH(
|
|
|
249
249
|
|
|
250
250
|
const m = 0.5 * (l + r);
|
|
251
251
|
|
|
252
|
+
// Re-window the ORIGINAL coefficients on every iteration. windowing() mutates scratch_sh3 in
|
|
253
|
+
// place, so without re-filling we would cumulatively window an already-windowed buffer; the
|
|
254
|
+
// reference (Filament) windows a fresh copy each time (pass-by-value).
|
|
255
|
+
for (let b = 0; b < numBands * numBands; b++) {
|
|
256
|
+
scratch_sh3[b] = input[input_offset + b * channel_count + channel];
|
|
257
|
+
}
|
|
258
|
+
|
|
252
259
|
windowing(scratch_sh3, m, numBands);
|
|
253
260
|
|
|
254
261
|
if (sh3_min(scratch_sh3) < 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sh3_sample_by_direction.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,gDARW,MAAM,EAAE,iBACR,MAAM,aACN,MAAM,EAAE,oBACR,MAAM,mBACN,MAAM,aACN,MAAM,EAAE,oBACR,MAAM,
|
|
1
|
+
{"version":3,"file":"sh3_sample_by_direction.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,gDARW,MAAM,EAAE,iBACR,MAAM,aACN,MAAM,EAAE,oBACR,MAAM,mBACN,MAAM,aACN,MAAM,EAAE,oBACR,MAAM,QAsChB"}
|
|
@@ -27,22 +27,25 @@ export function sh3_sample_by_direction(
|
|
|
27
27
|
let channel_value;
|
|
28
28
|
|
|
29
29
|
for (let i = 0; i < dimension_count; i++) {
|
|
30
|
-
|
|
30
|
+
// coefficients are interleaved by band: the value for (band k, dimension i) lives at
|
|
31
|
+
// harmonics_offset + dimension_count * k + i (matching sh3_sample_irradiance_by_direction /
|
|
32
|
+
// sh3_vector_accumulate). The previous `dimension_count * i + band` indexing overlapped channels.
|
|
33
|
+
const base = harmonics_offset + i;
|
|
31
34
|
|
|
32
35
|
// band 0
|
|
33
|
-
channel_value = harmonics[
|
|
36
|
+
channel_value = harmonics[base] * SH3_COEFFICIENTS[0];
|
|
34
37
|
|
|
35
38
|
// band 1
|
|
36
|
-
channel_value += harmonics[
|
|
37
|
-
channel_value += harmonics[
|
|
38
|
-
channel_value += harmonics[
|
|
39
|
+
channel_value += harmonics[base + dimension_count] * SH3_COEFFICIENTS[1] * y;
|
|
40
|
+
channel_value += harmonics[base + dimension_count * 2] * SH3_COEFFICIENTS[2] * z;
|
|
41
|
+
channel_value += harmonics[base + dimension_count * 3] * SH3_COEFFICIENTS[3] * x;
|
|
39
42
|
|
|
40
43
|
// band 2
|
|
41
|
-
channel_value += harmonics[
|
|
42
|
-
channel_value += harmonics[
|
|
43
|
-
channel_value += harmonics[
|
|
44
|
-
channel_value += harmonics[
|
|
45
|
-
channel_value += harmonics[
|
|
44
|
+
channel_value += harmonics[base + dimension_count * 4] * SH3_COEFFICIENTS[4] * (x * y);
|
|
45
|
+
channel_value += harmonics[base + dimension_count * 5] * SH3_COEFFICIENTS[5] * (y * z);
|
|
46
|
+
channel_value += harmonics[base + dimension_count * 6] * SH3_COEFFICIENTS[6] * (3.0 * z * z - 1.0);
|
|
47
|
+
channel_value += harmonics[base + dimension_count * 7] * SH3_COEFFICIENTS[7] * (x * z);
|
|
48
|
+
channel_value += harmonics[base + dimension_count * 8] * SH3_COEFFICIENTS[8] * (x * x - y * y);
|
|
46
49
|
|
|
47
50
|
// write out
|
|
48
51
|
result[result_offset + i] = channel_value;
|
|
@@ -3,7 +3,7 @@ import { v4_multiply_mat4 } from "../../vec4/v4_multiply_mat4.js";
|
|
|
3
3
|
|
|
4
4
|
const v4 = [];
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* @see sphere_project
|
|
7
7
|
* @param {number} fl
|
|
8
8
|
* @param {number[]} matrix
|
|
9
9
|
* @param {number[]} sph
|
|
@@ -31,7 +31,7 @@ export function sphere_projected_sphere_radius_sqr(fl, matrix, sph) {
|
|
|
31
31
|
const y = v4_y;
|
|
32
32
|
const z = v4_z;
|
|
33
33
|
|
|
34
|
-
const z2 = z *
|
|
34
|
+
const z2 = z * z;
|
|
35
35
|
|
|
36
36
|
const l2 = v3_dot(x, y, z, x, y, z);
|
|
37
37
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ray ↔ sphere intersection in the sphere's LOCAL frame: the sphere is centred
|
|
3
|
+
* at the origin with radius `r`, and the ray is expressed in that frame. Returns
|
|
4
|
+
* the hit distance `t` along the ray and writes the outward unit surface normal
|
|
5
|
+
* into `outNormal[outOffset .. outOffset+2]`.
|
|
6
|
+
*
|
|
7
|
+
* Conventions (shared with {@link box3_raycast} / {@link capsule_raycast}):
|
|
8
|
+
* - the ray direction is assumed UNIT length, so `t` is a true distance;
|
|
9
|
+
* - the first surface crossing at or after the origin within `tMax` is
|
|
10
|
+
* returned; a ray starting INSIDE the sphere returns its exit crossing;
|
|
11
|
+
* - on a miss the function returns `Infinity` and leaves `outNormal` untouched.
|
|
12
|
+
*
|
|
13
|
+
* Distinct from {@link sphere_intersects_ray}, which is a boolean predicate;
|
|
14
|
+
* this yields the distance and the surface normal — what a raycast query /
|
|
15
|
+
* narrowphase needs.
|
|
16
|
+
*
|
|
17
|
+
* @param {Float64Array|number[]} outNormal destination for the unit normal
|
|
18
|
+
* @param {number} outOffset offset into `outNormal` (3 floats are written)
|
|
19
|
+
* @param {number} ox ray origin x (local)
|
|
20
|
+
* @param {number} oy ray origin y (local)
|
|
21
|
+
* @param {number} oz ray origin z (local)
|
|
22
|
+
* @param {number} dx ray direction x (local, unit)
|
|
23
|
+
* @param {number} dy ray direction y (local, unit)
|
|
24
|
+
* @param {number} dz ray direction z (local, unit)
|
|
25
|
+
* @param {number} tMax maximum ray distance
|
|
26
|
+
* @param {number} r sphere radius
|
|
27
|
+
* @returns {number} hit distance `t`, or `Infinity` on a miss
|
|
28
|
+
*
|
|
29
|
+
* @author Alex Goldring
|
|
30
|
+
* @copyright Company Named Limited (c) 2026
|
|
31
|
+
*/
|
|
32
|
+
export function sphere_raycast(outNormal: Float64Array | number[], outOffset: number, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, tMax: number, r: number): number;
|
|
33
|
+
//# sourceMappingURL=sphere_raycast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sphere_raycast.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/sphere/sphere_raycast.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,0CAfW,YAAY,GAAC,MAAM,EAAE,aACrB,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QACN,MAAM,KACN,MAAM,GACJ,MAAM,CAoBlB"}
|