@woosh/meep-engine 3.0.2 → 3.2.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/LICENSE +188 -188
- package/README.md +152 -145
- package/editor/Editor.js +598 -598
- package/editor/EditorCameraNavigation.js +205 -205
- package/editor/EditorKeyMap.js +182 -182
- package/editor/SelectionVisualizer.js +127 -127
- package/editor/actions/concrete/ActionInvalidateSampler.js +27 -27
- package/editor/actions/concrete/PatchTerrainHeightAction.js +85 -85
- package/editor/camera/camera_framing.js +104 -104
- package/editor/clipboard.js +184 -184
- package/editor/ecs/component/editors/ObservedIntegerEditor.js +22 -22
- package/editor/ecs/component/editors/ObservedStringEditor.js +34 -34
- package/editor/ecs/component/editors/common/two_way_sync.js +50 -50
- package/editor/ecs/component/editors/ecs/GridObstacleEditor.js +19 -19
- package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.js +35 -35
- package/editor/ecs/component/editors/ecs/ParameterTrackEditor.js +17 -17
- package/editor/ecs/component/editors/ecs/SGMeshEditor.js +24 -24
- package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.js +33 -33
- package/editor/ecs/component/editors/ecs/Trail3DEditor.js +45 -45
- package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.js +19 -19
- package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.js +72 -72
- package/editor/ecs/component/editors/shade/MeshletGeometryEditor.js +30 -30
- package/editor/ecs/component/editors/shade/ShadeImageEditor.js +70 -70
- package/editor/ecs/component/editors/shade/ShadeMaterialEditor.js +34 -34
- package/editor/ecs/component/editors/shade/ShadeTextureEditor.js +46 -46
- package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.js +24 -24
- package/editor/ecs/component/prototypeObjectEditor.js +265 -265
- package/editor/ecs/component/registerBasicTypeEditors.js +100 -100
- package/editor/ecs/component/registerEngineComponentEditors.js +95 -95
- package/editor/entity_world_bounds.js +27 -27
- package/editor/particles/lut_ops.js +148 -148
- package/editor/particles/particleEditEvents.js +12 -12
- package/editor/particles/rebuildParticleEmitter.js +31 -31
- package/editor/persistence/EditorLayoutStore.js +71 -71
- package/editor/persistence/SceneMetadata.js +52 -52
- package/editor/persistence/SceneSlotManager.js +144 -144
- package/editor/persistence/buildNewSceneDataset.js +67 -67
- package/editor/persistence/files.js +68 -68
- package/editor/persistence/scene_import.js +143 -143
- package/editor/persistence/scene_serialization.js +79 -79
- package/editor/persistence/string_buffer_codec.js +41 -41
- package/editor/process/GridDisplayProcess.js +125 -125
- package/editor/process/SymbolicDisplayProcess.js +106 -108
- package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
- package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
- package/editor/process/symbolic/PathSymbolicDisplay.js +118 -118
- package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.js +79 -79
- package/editor/process/symbolic/SoundEmitterSymbolicDisplay.js +57 -57
- package/editor/process/symbolic/SymbolicDisplay.js +62 -62
- package/editor/process/symbolic/gizmo_draw_wire_box_oriented.js +85 -85
- package/editor/process/symbolic/gizmo_draw_wire_circle.js +53 -53
- package/editor/prototypeEditorShell.js +156 -156
- package/editor/selection/editor_pick.js +130 -130
- package/editor/selection/screen_rect_frustum.js +119 -119
- package/editor/style/controls.scss +168 -168
- package/editor/style/inspector.scss +223 -223
- package/editor/templates/entity_templates.js +167 -167
- package/editor/tools/GridPaintTool.js +273 -273
- package/editor/tools/SelectionTool.js +307 -307
- package/editor/tools/TransformToolV2.js +378 -378
- package/editor/tools/engine/ToolEngine.js +188 -188
- package/editor/tools/paint/TerrainTexturePaintTool.js +250 -250
- package/editor/tools/v2/BlenderCameraOrientationGizmo.js +501 -501
- package/editor/tools/v2/TransformControls.js +971 -971
- package/editor/tools/v2/handle/gizmo_drag_plane.js +141 -141
- package/editor/tools/v2/handle/gizmo_draw.js +399 -399
- package/editor/tools/v2/handle/gizmo_handles.js +364 -364
- package/editor/tools/v2/handle/gizmo_ray_shapes.js +239 -239
- package/editor/view/ecs/HierarchicalEntityListView.js +339 -339
- package/editor/view/ecs/components/DatGuiController.js +2 -2
- package/editor/view/ecs/components/common/AutoCanvasView.js +100 -100
- package/editor/view/ecs/components/common/TextController.js +59 -59
- package/editor/view/library/MeshLibraryView.js +175 -175
- package/editor/view/library/mesh_library_drag.js +63 -63
- package/editor/view/library/model_thumbnail_source.js +86 -86
- package/editor/view/makeEntityDecorators.js +125 -125
- package/editor/view/node-graph/NodeGraphSelection.js +89 -89
- package/editor/view/node-graph/NodeView.js +211 -211
- package/editor/view/node-graph/actions/ConnectionDeleteAction.js +36 -36
- package/editor/view/node-graph/actions/NodesMoveAction.js +41 -41
- package/editor/view/node-graph/connection_wire_geometry.js +107 -107
- package/editor/view/particles/ColorLutGradientView.js +291 -291
- package/editor/view/particles/ScalarLutCurveView.js +279 -279
- package/editor/view/prepareMeshLibrary.js +188 -188
- package/editor/view/shell/SceneTreePanelView.js +119 -119
- package/editor/view/v2/SplitView.js +2 -2
- package/package.json +94 -94
- package/samples/generation/generators/interactive/mir_generator_place_buff_objects.js +362 -362
- package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +738 -738
- package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +79 -79
- package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +93 -93
- package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +80 -80
- package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +164 -164
- package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +69 -69
- package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +102 -102
- package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +129 -129
- package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +72 -72
- package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +74 -74
- package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +169 -169
- package/src/DUPLICATION_AUDIT_2026_08_07.md +254 -254
- package/src/DUPLICATION_AUDIT_REMEDIATION.md +250 -250
- package/src/REVIEW_2026_08_06/adv-core.md +511 -511
- package/src/REVIEW_2026_08_06/adv-gfx.md +480 -480
- package/src/REVIEW_2026_08_06/adv-view.md +446 -446
- package/src/REVIEW_2026_08_06/api-core.md +296 -296
- package/src/REVIEW_2026_08_06/api-engine.md +195 -195
- package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +507 -507
- package/src/REVIEW_2026_08_06/core-binary.md +348 -348
- package/src/REVIEW_2026_08_06/core-collection.md +376 -376
- package/src/REVIEW_2026_08_06/core-math.md +221 -221
- package/src/REVIEW_2026_08_06/core-process.md +266 -266
- package/src/REVIEW_2026_08_06/core-science.md +223 -223
- package/src/REVIEW_2026_08_06/engine-ai-nav.md +279 -279
- package/src/REVIEW_2026_08_06/engine-animation.md +167 -167
- package/src/REVIEW_2026_08_06/engine-asset.md +166 -166
- package/src/REVIEW_2026_08_06/engine-ecs.md +920 -920
- package/src/REVIEW_2026_08_06/engine-input.md +197 -197
- package/src/REVIEW_2026_08_06/engine-misc.md +248 -248
- package/src/REVIEW_2026_08_06/engine-terrain.md +52 -52
- package/src/REVIEW_2026_08_06/generation.md +176 -176
- package/src/REVIEW_2026_08_06/geom-2d.md +434 -434
- package/src/REVIEW_2026_08_06/geom-3d.md +117 -117
- package/src/REVIEW_2026_08_06/gfx-gi.md +143 -143
- package/src/REVIEW_2026_08_06/gfx-render.md +740 -740
- package/src/REVIEW_2026_08_06/gfx-texture.md +690 -690
- package/src/REVIEW_2026_08_06/prior-criticals.md +49 -49
- package/src/REVIEW_2026_08_06/prior-highs.md +138 -138
- package/src/REVIEW_2026_08_06/test-gaps.md +364 -364
- package/src/REVIEW_2026_08_06/view.md +667 -667
- package/src/REVIEW_2026_08_06.md +610 -610
- package/src/avif/codec/dec/avif_dec.cpp +233 -233
- package/src/avif/codec/dec/avif_dec.js +16 -16
- package/src/core/binary/BitImage2.js +246 -246
- package/src/core/binary/align_32.js +21 -21
- package/src/core/binary/data_view/DataType2DataViewReaders.js +23 -23
- package/src/core/binary/data_view/DataType2DataViewWriters.js +25 -25
- package/src/core/binary/hash/XXH128Hash.js +55 -55
- package/src/core/binary/hash/XXH3_SECRET.js +25 -25
- package/src/core/binary/hash/xxh3_128.js +341 -341
- package/src/core/binary/hash/xxh3_64.js +241 -241
- package/src/core/binary/hash/xxh3_common.js +476 -476
- package/src/core/binary/lz4/LZ4_MAX_INPUT_SIZE.js +9 -9
- package/src/core/binary/lz4/lz4_compress_block.js +385 -385
- package/src/core/binary/lz4/lz4_compress_bound.js +25 -25
- package/src/core/binary/lz4/lz4_decompress_block.js +139 -139
- package/src/core/binary/lz4/lz4_decompress_bound.js +30 -30
- package/src/core/binary/meshopt/MESHOPT_GROUP_SIZE.js +18 -18
- package/src/core/binary/meshopt/MeshoptCompressionFilter.js +30 -30
- package/src/core/binary/meshopt/MeshoptCompressionMode.js +21 -21
- package/src/core/binary/meshopt/__meshopt_test_streams.js +237 -237
- package/src/core/binary/meshopt/meshopt_decode.js +73 -73
- package/src/core/binary/meshopt/meshopt_decode_byte_group.js +67 -67
- package/src/core/binary/meshopt/meshopt_decode_data_block.js +59 -59
- package/src/core/binary/meshopt/meshopt_decode_filter_color.js +69 -69
- package/src/core/binary/meshopt/meshopt_decode_filter_exponential.js +43 -43
- package/src/core/binary/meshopt/meshopt_decode_filter_octahedral.js +60 -60
- package/src/core/binary/meshopt/meshopt_decode_filter_quaternion.js +71 -71
- package/src/core/binary/meshopt/meshopt_decode_index_buffer.js +294 -294
- package/src/core/binary/meshopt/meshopt_decode_index_sequence.js +115 -115
- package/src/core/binary/meshopt/meshopt_decode_vertex_buffer.js +381 -381
- package/src/core/binary/meshopt/meshopt_read_uint_var.js +59 -59
- package/src/core/binary/reinterpret_float32_as_uint32.js +13 -13
- package/src/core/binary/reinterpret_uint32_as_float32.js +14 -14
- package/src/core/binary/type/DataType2TypedArrayConstructorMapping.js +35 -35
- package/src/core/bvh2/bvh3/ebvh_geometry_query_any_triangle_ray.js +149 -149
- package/src/core/bvh2/bvh3/ebvh_sort_for_traversal_depth_first.js +96 -96
- package/src/core/bvh2/bvh3/query/bvh_query_depth_range_in_frustum.js +101 -101
- package/src/core/bvh2/bvh3/query/bvh_query_leaves_generic.js +77 -77
- package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray.js +90 -90
- package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray_segment.js +94 -94
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.js +86 -86
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_capsule.js +101 -101
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_sphere.js +92 -92
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_ray.js +96 -96
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_ray_segment.js +100 -100
- package/src/core/bvh2/visual/BVHGeometry.js +131 -131
- package/src/core/bvh8/BVH8.js +436 -436
- package/src/core/bvh8/aabb3_round_to_float32.js +22 -22
- package/src/core/bvh8/build/BVH8Converter.js +588 -588
- package/src/core/bvh8/build/TriangleCluster.js +122 -122
- package/src/core/bvh8/build/aabb3_compute_merge_cost.js +28 -28
- package/src/core/bvh8/build/aabb3_from_triangle_by_index.js +17 -17
- package/src/core/bvh8/build/bvh8_build_for_geometry.js +303 -303
- package/src/core/bvh8/build/bvh8_from_proxy.js +256 -256
- package/src/core/bvh8/build/byte.js +9 -9
- package/src/core/bvh8/build/encode_bounds_e.js +11 -11
- package/src/core/bvh8/bvh8_convert_to_dot.js +132 -132
- package/src/core/bvh8/bvh8_count_primitives.js +98 -98
- package/src/core/bvh8/bvh8_geometry_validate.js +138 -138
- package/src/core/bvh8/bvh8_geometry_validate_indirect.js +166 -166
- package/src/core/bvh8/bvh8_get_node_bounds.js +34 -34
- package/src/core/bvh8/bvh8_get_node_child_bounds.js +52 -52
- package/src/core/bvh8/bvh8_node_child_surface_area.js +18 -18
- package/src/core/bvh8/bvh8_node_count_triangles.js +27 -27
- package/src/core/bvh8/bvh8_quality.js +72 -72
- package/src/core/bvh8/bvh8_validate_structure.js +87 -87
- package/src/core/clipboard/obtainClipBoard.js +29 -29
- package/src/core/clipboard/safeClipboardReadText.js +55 -55
- package/src/core/clipboard/safeClipboardWriteText.js +23 -23
- package/src/core/collection/array/typed/typed_array_value_denormalize.js +52 -52
- package/src/core/collection/array/typed/typed_array_value_normalize.js +51 -51
- package/src/core/collection/union-find/union_find.js +79 -79
- package/src/core/color/YCoCg/rgb_to_ycocg.js +20 -20
- package/src/core/color/YCoCg/ycocg_to_rgb.js +17 -17
- package/src/core/color/colormap/MAGMA_LUT.js +26 -26
- package/src/core/color/illuminant/D65_TRISTIMULUS_XYZ.js +19 -19
- package/src/core/color/lab/lab_apply_hunt_adjustment.js +27 -27
- package/src/core/color/lab/lab_distance_hyab.js +23 -23
- package/src/core/color/lab/xyz_to_lab.js +62 -62
- package/src/core/color/operations/color_darken.js +24 -24
- package/src/core/color/operations/color_desaturate.js +24 -24
- package/src/core/color/operations/color_lighten.js +24 -24
- package/src/core/color/operations/color_saturate.js +24 -24
- package/src/core/color/operations/color_scale_okhsv_channel.js +45 -45
- package/src/core/color/tonemap/tonemap_aces.js +41 -41
- package/src/core/color/ycxcz/xyz_to_ycxcz.js +28 -28
- package/src/core/color/ycxcz/ycxcz_to_xyz.js +19 -19
- package/src/core/dom/isImageBitmap.js +12 -12
- package/src/core/function/frameThrottle.js +23 -23
- package/src/core/geom/2d/aabb/aabb2_array_combine.js +7 -7
- package/src/core/geom/2d/aabb/aabb2_compute_area.js +7 -7
- package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.js +7 -7
- package/src/core/geom/2d/aabb/aabb2_compute_overlap.js +7 -7
- package/src/core/geom/2d/aabb/aabb2_from_v2_array.js +7 -7
- package/src/core/geom/2d/aabb/aabb2_intersects_point.js +7 -7
- package/src/core/geom/2d/aabb/aabb2_overlap_exists.js +7 -7
- package/src/core/geom/2d/circle/circle_compute_circle_intersection.js +7 -7
- package/src/core/geom/2d/circle/circle_compute_circle_penetration.js +7 -7
- package/src/core/geom/2d/circle/circle_intersects_point.js +7 -7
- package/src/core/geom/2d/compute_polygon_area_2d.js +7 -7
- package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.js +7 -7
- package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.js +7 -7
- package/src/core/geom/2d/convex-hull/orientation3_array.js +7 -7
- package/src/core/geom/2d/intersect_ray_2d.js +7 -7
- package/src/core/geom/2d/line/line2_distance_to_point_sqr.js +7 -7
- package/src/core/geom/2d/line/line2_segment_intersection_fraction_2d.js +44 -44
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.js +7 -7
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.js +7 -7
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.js +7 -7
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.js +7 -7
- package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.js +7 -7
- package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.js +7 -7
- package/src/core/geom/2d/line/segment2_intersects_segment2_2d.js +25 -25
- package/src/core/geom/2d/line/segment2_segment_compute_intersection_array_2d.js +46 -46
- package/src/core/geom/2d/line/segment2_segment_intersection_fractions.js +52 -52
- package/src/core/geom/2d/oriented-box/min_area_rect_2d.js +69 -69
- package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +433 -433
- package/src/core/geom/2d/polygon/polygon2_clip_axis_halfplane.js +51 -51
- package/src/core/geom/2d/polygon/polygon2_clip_halfplane.js +50 -50
- package/src/core/geom/2d/polygon/polygon2_is_counter_clockwise.js +84 -84
- package/src/core/geom/2d/polygon/polygon2_signed_area.js +52 -52
- package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +86 -86
- package/src/core/geom/2d/polygon/polygon2_triangulate.js +1280 -1280
- package/src/core/geom/2d/polygon/polygon2_triangulation_deviation.js +77 -77
- package/src/core/geom/2d/quad-tree/qt_collect_by_circle.js +39 -39
- package/src/core/geom/2d/quad-tree/qt_match_data_by_circle.js +101 -101
- package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.js +7 -7
- package/src/core/geom/2d/rectangle_to_aabb.js +7 -7
- package/src/core/geom/2d/spline_bezier2_2d.js +7 -7
- package/src/core/geom/2d/triangle/tri2_rasterize_conservative.js +99 -99
- package/src/core/geom/2d/triangle/tri2_signed_area.js +35 -35
- package/src/core/geom/2d/triangle2d_compute_area.js +7 -7
- package/src/core/geom/2d/triangle2d_contains_point.js +7 -7
- package/src/core/geom/2d/triangle2d_get_barycentric.js +7 -7
- package/src/core/geom/2d/v2_morton_encode.js +23 -23
- package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_build_frustum.js +5 -5
- package/src/core/geom/3d/aabb/aabb3_closest_point_on_surface.js +57 -57
- package/src/core/geom/3d/aabb/aabb3_combined_surface_area.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_compute_projected_area.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_compute_surface_area.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_from_threejs_geometry.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_from_triangle_group.js +46 -46
- package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_ray_segment_entry_distance.js +95 -95
- package/src/core/geom/3d/aabb/aabb3_raycast.js +7 -7
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +93 -93
- package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.js +82 -82
- package/src/core/geom/3d/aabb/compute_aabb_from_points.js +7 -7
- package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.js +7 -7
- package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +486 -486
- package/src/core/geom/3d/atlas/BFF_PLAN.md +174 -174
- package/src/core/geom/3d/atlas/Chart.js +77 -77
- package/src/core/geom/3d/atlas/REVIEW_02.md +392 -392
- package/src/core/geom/3d/atlas/atlas_bench_lib.js +315 -315
- package/src/core/geom/3d/atlas/atlas_chart_type.js +16 -16
- package/src/core/geom/3d/atlas/atlas_compute_charts.js +188 -188
- package/src/core/geom/3d/atlas/atlas_extract_chart.js +107 -107
- package/src/core/geom/3d/atlas/atlas_generate.js +50 -50
- package/src/core/geom/3d/atlas/atlas_test_fixtures.js +266 -266
- package/src/core/geom/3d/atlas/atlas_write_chart_uvs.js +36 -36
- package/src/core/geom/3d/atlas/data/atlas_build_edge_dihedrals.js +62 -62
- package/src/core/geom/3d/atlas/data/atlas_build_edge_lengths.js +33 -33
- package/src/core/geom/3d/atlas/data/atlas_build_face_areas.js +50 -50
- package/src/core/geom/3d/atlas/io/atlas_mesh_weld_colocals.js +39 -39
- package/src/core/geom/3d/atlas/io/bt_loop_uv.js +35 -35
- package/src/core/geom/3d/atlas/pack/ChartPlacement.js +46 -46
- package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.js +269 -269
- package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.js +209 -209
- package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_ortho.js +38 -38
- package/src/core/geom/3d/atlas/param/atlas_chart_stretch_metric.js +86 -86
- package/src/core/geom/3d/atlas/param/atlas_piecewise_resegment.js +183 -183
- package/src/core/geom/3d/atlas/param/fit_plane_basis.js +66 -66
- package/src/core/geom/3d/atlas/segment/RegionGraph.js +40 -40
- package/src/core/geom/3d/atlas/segment/atlas_build_region_graph.js +136 -136
- package/src/core/geom/3d/atlas/segment/atlas_chart_roundness_delta.js +30 -30
- package/src/core/geom/3d/atlas/segment/atlas_compute_planar_regions.js +77 -77
- package/src/core/geom/3d/atlas/segment/atlas_merge_charts.js +116 -116
- package/src/core/geom/3d/atlas/segment/atlas_segment_charts.js +271 -271
- package/src/core/geom/3d/atlas/segment/atlas_segment_charts_atomic.js +191 -191
- package/src/core/geom/3d/box/box3_projected_half_extent.js +35 -35
- package/src/core/geom/3d/capsule/capsule_intersects_aabb3_closed.js +67 -67
- package/src/core/geom/3d/capsule/capsule_intersects_aabb3_iterative.js +137 -137
- package/src/core/geom/3d/compute_circle_bounding_box.js +7 -7
- package/src/core/geom/3d/cone/computeConeBoundingBox.js +7 -7
- package/src/core/geom/3d/cone/computeConePlaneSide.js +7 -7
- package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js +7 -7
- package/src/core/geom/3d/cylinder/cylinder3_raycast.d.ts +38 -0
- package/src/core/geom/3d/cylinder/cylinder3_raycast.d.ts.map +1 -0
- package/src/core/geom/3d/cylinder/cylinder3_raycast.js +105 -0
- package/src/core/geom/3d/equirectangular/equirectangular_direction_to_uv.js +18 -18
- package/src/core/geom/3d/equirectangular/equirectangular_uv_to_direction.js +24 -24
- package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.js +7 -7
- package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +7 -7
- package/src/core/geom/3d/frustum/frustum3_compute_closest_point.js +117 -117
- package/src/core/geom/3d/frustum/frustum_matrix4_project.js +7 -7
- package/src/core/geom/3d/frustum/hexahedron_from_aabb.js +7 -7
- package/src/core/geom/3d/frustum/read_frustum_corner.js +17 -17
- package/src/core/geom/3d/frustum/read_three_planes_to_array.js +7 -7
- package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.js +7 -7
- package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +146 -146
- package/src/core/geom/3d/gjk/gjk.js +430 -430
- package/src/core/geom/3d/gjk/gjk_epa_penetration.js +520 -520
- package/src/core/geom/3d/gjk/minkowski_support.js +71 -71
- package/src/core/geom/3d/gjk/mpr.js +368 -368
- package/src/core/geom/3d/line/line3_closest_points_segment_segment.js +7 -7
- package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.js +7 -7
- package/src/core/geom/3d/line/line3_compute_point_segment_point_distance_unfolded.js +64 -64
- package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.js +153 -153
- package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.js +7 -7
- package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.js +7 -7
- package/src/core/geom/3d/line/line3_compute_segment_segment_closest_points.js +88 -88
- package/src/core/geom/3d/line/line3_segment_segment_closest_point_pair.js +71 -71
- package/src/core/geom/3d/line/segment3_point_distance_to_segments.js +25 -25
- package/src/core/geom/3d/mat4/allocate_m4.js +7 -7
- package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.js +7 -7
- package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.js +7 -7
- package/src/core/geom/3d/mat4/compose_matrix4_array.js +7 -7
- package/src/core/geom/3d/mat4/decompose_matrix_4_array.js +7 -7
- package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.js +7 -7
- package/src/core/geom/3d/mat4/m4_compose.js +22 -22
- package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.js +7 -7
- package/src/core/geom/3d/mat4/m4_decompose.js +64 -64
- package/src/core/geom/3d/mat4/m4_decompose_array.js +157 -157
- package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.js +32 -32
- package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.js +67 -67
- package/src/core/geom/3d/mat4/m4_linear_matrix3.js +29 -29
- package/src/core/geom/3d/mat4/m4_look_at.js +96 -96
- package/src/core/geom/3d/mat4/m4_make_rotation_x.js +47 -47
- package/src/core/geom/3d/mat4/m4_make_rotation_y.js +47 -47
- package/src/core/geom/3d/mat4/m4_make_rotation_z.js +47 -47
- package/src/core/geom/3d/mat4/m4_normal_matrix3.js +39 -39
- package/src/core/geom/3d/mat4/m4_perspective.js +66 -66
- package/src/core/geom/3d/mat4/m4_transpose.js +48 -48
- package/src/core/geom/3d/morton/mortonEncode_LUT.js +7 -7
- package/src/core/geom/3d/morton/mortonEncode_magicbits.js +7 -7
- package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.js +5 -5
- package/src/core/geom/3d/normal/hemioct/encode_unit_to_hemioct.js +28 -28
- package/src/core/geom/3d/normal/lambert_azimuth/decode_azimuth_to_unit.js +30 -30
- package/src/core/geom/3d/normal/lambert_azimuth/encode_unit_to_azimuth.js +19 -19
- package/src/core/geom/3d/normal/spherical/decode_spheremap_to_unit.js +38 -38
- package/src/core/geom/3d/normal/spherical/encode_unit_to_spheremap.js +30 -30
- package/src/core/geom/3d/plane/is_point_within_planes.js +7 -7
- package/src/core/geom/3d/plane/orient3d_fast_point.js +47 -47
- package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.js +7 -7
- package/src/core/geom/3d/plane/plane3_compute_plane_intersection.js +7 -7
- package/src/core/geom/3d/plane/plane3_intersect_plane.js +7 -7
- package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.js +7 -7
- package/src/core/geom/3d/point/point3_raycast.d.ts +33 -0
- package/src/core/geom/3d/point/point3_raycast.d.ts.map +1 -0
- package/src/core/geom/3d/point/point3_raycast.js +47 -0
- package/src/core/geom/3d/polygon/polygon3_compute_normal.js +60 -60
- package/src/core/geom/3d/polygon/polygon3_triangulate.js +94 -94
- package/src/core/geom/3d/polyhedron/convex_polyhedron3_raycast.d.ts +40 -0
- package/src/core/geom/3d/polyhedron/convex_polyhedron3_raycast.d.ts.map +1 -0
- package/src/core/geom/3d/polyhedron/convex_polyhedron3_raycast.js +94 -0
- package/src/core/geom/3d/quadric/QUADRIC3_SIZE.js +14 -14
- package/src/core/geom/3d/quadric/Quadric3.js +282 -282
- package/src/core/geom/3d/quadric/quadric3_add.js +33 -33
- package/src/core/geom/3d/quadric/quadric3_clear.js +25 -25
- package/src/core/geom/3d/quadric/quadric3_copy.js +27 -27
- package/src/core/geom/3d/quadric/quadric3_distance.js +36 -36
- package/src/core/geom/3d/quadric/quadric3_evaluate.js +25 -25
- package/src/core/geom/3d/quadric/quadric3_optimize.js +45 -45
- package/src/core/geom/3d/quadric/quadric3_scale.js +32 -32
- package/src/core/geom/3d/quadric/quadric3_set_from_plane_through_point.js +30 -30
- package/src/core/geom/3d/quadric/quadric3_set_from_vector4.js +35 -35
- package/src/core/geom/3d/quadric/quadric3_sub.js +36 -36
- package/src/core/geom/3d/quadric/quadric3_to_tensor_m3.js +28 -28
- package/src/core/geom/3d/quadric/quadric3_to_tensor_m3_inverse.js +56 -56
- package/src/core/geom/3d/quadric/quadric3_to_vector3.js +19 -19
- package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.js +7 -7
- package/src/core/geom/3d/quaternion/quat3_integrate.js +62 -62
- package/src/core/geom/3d/quaternion/quat3_multiply.js +31 -31
- package/src/core/geom/3d/quaternion/quat3_nlerp.js +72 -72
- package/src/core/geom/3d/quaternion/quat3_to_matrix3.js +69 -69
- package/src/core/geom/3d/quaternion/quat_decode_from_uint32.js +7 -7
- package/src/core/geom/3d/quaternion/quat_encode_to_uint32.js +7 -7
- package/src/core/geom/3d/ray/ray3_array_compose.js +7 -7
- package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.js +7 -7
- package/src/core/geom/3d/ray/ray3_distance_to_point.js +7 -7
- package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.js +7 -7
- package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts +17 -0
- package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/ConvexHullShape3D.js +43 -0
- package/src/core/geom/3d/shape/CylinderShape3D.d.ts +1 -0
- package/src/core/geom/3d/shape/CylinderShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/CylinderShape3D.js +21 -0
- package/src/core/geom/3d/shape/PointShape3D.d.ts +7 -0
- package/src/core/geom/3d/shape/PointShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/PointShape3D.js +88 -63
- package/src/core/geom/3d/shape/PosedShape3D.d.ts +6 -0
- package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/PosedShape3D.js +27 -0
- package/src/core/geom/3d/shape/TransformedShape3D.d.ts +10 -0
- package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/TransformedShape3D.js +13 -0
- package/src/core/geom/3d/shape/Triangle3D.d.ts +1 -0
- package/src/core/geom/3d/shape/Triangle3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/Triangle3D.js +26 -0
- package/src/core/geom/3d/shape/UnionShape3D.d.ts +6 -0
- package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/UnionShape3D.js +7 -0
- package/src/core/geom/3d/shape/UnitCubeShape3D.js +45 -45
- package/src/core/geom/3d/shape/UnitSphereShape3D.js +44 -44
- package/src/core/geom/3d/shape/shape3_mesh_from_geometry.js +64 -64
- package/src/core/geom/3d/shape/shape_mesh_from_geometry.js +7 -7
- package/src/core/geom/3d/shape/util/compute_signed_distance_gradient_by_sampling.js +51 -51
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +7 -7
- package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.js +7 -7
- package/src/core/geom/3d/sphere/harmonics/sh3_convolve_with_zh.js +53 -53
- package/src/core/geom/3d/sphere/harmonics/sh3_ggx_zh.js +30 -30
- package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.js +7 -7
- package/src/core/geom/3d/sphere/harmonics/sh_compute_K.js +7 -7
- package/src/core/geom/3d/sphere/sphere_array_intersects_point.js +7 -7
- package/src/core/geom/3d/sphere/sphere_array_intersects_ray.js +7 -7
- package/src/core/geom/3d/sphere/sphere_intersects_point.js +7 -7
- package/src/core/geom/3d/sphere/sphere_matrix4_transform.js +5 -5
- package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js +7 -7
- package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.js +7 -7
- package/src/core/geom/3d/sphere/spherical_from_cartesian.js +7 -7
- package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.js +174 -174
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.js +7 -7
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.js +7 -7
- package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.js +7 -7
- package/src/core/geom/3d/tetrahedra/graphics/build_tetrahedral_mesh_geometry.js +39 -39
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_build_vertex_to_tets_map.js +48 -48
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +173 -173
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_compute_tet_quality.js +22 -22
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.js +146 -146
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.js +232 -232
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.js +255 -255
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.js +387 -387
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.js +140 -140
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js +7 -7
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.js +97 -97
- package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.js +66 -66
- package/src/core/geom/3d/tetrahedra/triangle/triangle_decode_depth.js +59 -59
- package/src/core/geom/3d/tetrahedra/triangle/triangle_rasterized_depth_sample_index.js +54 -54
- package/src/core/geom/3d/tetrahedra/validate_neighbour.js +70 -70
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js +314 -314
- package/src/core/geom/3d/topology/struct/binary/BinaryDataLayer.js +364 -364
- package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.js +567 -567
- package/src/core/geom/3d/topology/struct/binary/BinaryTopology.js +1085 -1085
- package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.js +73 -73
- package/src/core/geom/3d/topology/struct/binary/io/bt_loop_kill.js +35 -35
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_append.js +119 -119
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +84 -84
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.js +172 -172
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.js +56 -56
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.js +7 -7
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +227 -227
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js +161 -161
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_island_erode.js +490 -490
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.js +120 -120
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.js +120 -120
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_collapse.js +52 -52
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +115 -115
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_flip.js +142 -142
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.js +21 -21
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.js +92 -92
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_split.js +179 -179
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_swap_vertex_slots.js +28 -28
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_kill_only_edge.js +8 -8
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.js +83 -83
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.js +89 -89
- package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_kill.js +25 -25
- package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.js +127 -127
- package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_triangulate.js +268 -268
- package/src/core/geom/3d/topology/struct/binary/io/face/bt_kill_only_face.js +8 -8
- package/src/core/geom/3d/topology/struct/binary/io/face/bt_mesh_kill_degenerate_faces.js +72 -72
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.js +7 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.js +7 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_relative_merge_distance.js +48 -48
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_split_pinched_vertices.js +256 -256
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_vertex_merge_distance.js +77 -77
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.js +7 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.js +7 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.js +148 -148
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_kill_only.js +7 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_collect_boundary_segments.js +29 -29
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_breaks_link_condition.js +107 -107
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_flip_is_legal.js +41 -41
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_flip_would_fold.js +120 -120
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.js +42 -42
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_is_boundary.js +20 -20
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_read_diamond.js +96 -96
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_compute_newell_normal.js +72 -72
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.js +7 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_edge_adjacent_faces.js +39 -39
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_edge_adjacent_faces_weighted.js +93 -93
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.js +7 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_shared_loop.js +48 -48
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_island_flood_fill.js +45 -45
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.js +66 -66
- package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.js +7 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_assert_valid.js +44 -44
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_euclidean_distance_field.js +32 -32
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_compute_face_islands.js +53 -53
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.js +703 -703
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +181 -181
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.js +133 -133
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +82 -82
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js +599 -599
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.js +108 -108
- package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.js +7 -7
- package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.js +7 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersection.js +7 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.js +7 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js +7 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.js +7 -7
- package/src/core/geom/3d/triangle/compute_triangle_area_3d.js +7 -7
- package/src/core/geom/3d/triangle/compute_triangle_normal.js +7 -7
- package/src/core/geom/3d/triangle/rayTriangleIntersection.js +7 -7
- package/src/core/geom/3d/triangle/tri3_closest_point.js +65 -65
- package/src/core/geom/3d/triangle/tri3_closest_point_barycentric.js +171 -171
- package/src/core/geom/3d/triangle/tri3_flatten_isometric.js +79 -79
- package/src/core/geom/3d/triangle/tri3_ray_intersection.js +160 -160
- package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric.js +96 -96
- package/src/core/geom/3d/triangle/tri3_raycast.d.ts +42 -0
- package/src/core/geom/3d/triangle/tri3_raycast.d.ts.map +1 -0
- package/src/core/geom/3d/triangle/tri3_raycast.js +94 -0
- package/src/core/geom/3d/triangle/triangle3_incenter.js +7 -7
- package/src/core/geom/3d/triangle/triangle_compute_plane_side.js +7 -7
- package/src/core/geom/3d/triangle/triangle_compute_signed_volume.js +7 -7
- package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.js +7 -7
- package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.js +7 -7
- package/src/core/geom/3d/triangle/v3_compute_triangle_normal.js +7 -7
- package/src/core/geom/3d/util/make_justified_point_grid.js +7 -7
- package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +381 -381
- package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +684 -684
- package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +554 -554
- package/src/core/geom/mat3/m3_cm_from_translation.js +7 -7
- package/src/core/geom/mat3/m3_cm_invert.js +7 -7
- package/src/core/geom/mat3/m3_make_rotation.js +5 -5
- package/src/core/geom/mat3/m3_make_rotation_TBN.js +31 -31
- package/src/core/geom/mat3/m3_multiply_vec3.js +7 -7
- package/src/core/geom/packing/computeBoundingSphereOfSpheres.js +7 -7
- package/src/core/geom/packing/max-rect/cost/costByBestShortSide.js +7 -7
- package/src/core/geom/packing/max-rect/cost/costByRemainingArea.js +7 -7
- package/src/core/geom/packing/max-rect/cutArea.js +7 -7
- package/src/core/geom/packing/max-rect/findBestContainer.js +7 -7
- package/src/core/geom/packing/max-rect/packMaxRectangles.js +7 -7
- package/src/core/geom/packing/max-rect/packOneBox.js +7 -7
- package/src/core/geom/packing/max-rect/removeRedundantBoxes.js +7 -7
- package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.js +7 -7
- package/src/core/geom/random/randomPointInBox.js +7 -7
- package/src/core/geom/random/randomPointInCircle.js +7 -7
- package/src/core/geom/random/randomPointInPoint.js +7 -7
- package/src/core/geom/random/randomPointInSphere.js +7 -7
- package/src/core/geom/random/randomPointOnBox.js +7 -7
- package/src/core/geom/random/randomPointOnSphere.js +7 -7
- package/src/core/geom/random/random_orthonormal_basis.js +31 -31
- package/src/core/geom/vec/vector_axpy.js +15 -15
- package/src/core/geom/vec/vector_axpy_offset.js +20 -20
- package/src/core/geom/vec/vector_copy.js +7 -7
- package/src/core/geom/vec/vector_dot_offset.js +25 -25
- package/src/core/geom/vec/vector_scale_array.js +7 -7
- package/src/core/geom/vec2/v2_rotate.js +21 -21
- package/src/core/geom/vec2/v2_rotate_cos_sin.js +21 -21
- package/src/core/geom/vec3/v3_angle_atan2_between.js +7 -7
- package/src/core/geom/vec3/v3_angle_between.js +7 -7
- package/src/core/geom/vec3/v3_angle_cos_between.js +7 -7
- package/src/core/geom/vec3/v3_array_add_in_place.js +7 -7
- package/src/core/geom/vec3/v3_array_centroid.js +7 -7
- package/src/core/geom/vec3/v3_array_copy.js +7 -7
- package/src/core/geom/vec3/v3_array_displace_in_direction.js +7 -7
- package/src/core/geom/vec3/v3_array_equals.js +7 -7
- package/src/core/geom/vec3/v3_array_immediate_add.js +7 -7
- package/src/core/geom/vec3/v3_array_matrix4_rotate.js +7 -7
- package/src/core/geom/vec3/v3_array_normalize.js +7 -7
- package/src/core/geom/vec3/v3_array_scale.js +7 -7
- package/src/core/geom/vec3/v3_compute_interior_angle.js +7 -7
- package/src/core/geom/vec3/v3_cotangent.js +33 -33
- package/src/core/geom/vec3/v3_dot_array_array.js +7 -7
- package/src/core/geom/vec3/v3_matrix3_multiply.js +30 -30
- package/src/core/geom/vec3/v3_matrix3_rotate.js +49 -49
- package/src/core/geom/vec3/v3_matrix4_rotate.js +7 -7
- package/src/core/geom/vec3/v3_multiply.js +23 -23
- package/src/core/geom/vec3/v3_multiply_scalar.js +7 -7
- package/src/core/geom/vec3/v3_orthonormal_matrix_from_normal.js +49 -49
- package/src/core/geom/vec3/v3_quat3_apply.js +7 -7
- package/src/core/geom/vec3/v3_quat3_apply_inverse.js +7 -7
- package/src/core/geom/vec3/v3_quaternion_apply.js +39 -39
- package/src/core/geom/vec3/v3_quaternion_apply_inverse.js +41 -41
- package/src/core/geom/vec3/v3_reflect.js +24 -24
- package/src/core/geom/vec3/v3_scale_array.js +18 -18
- package/src/core/geom/vec3/v3_triple_cross.js +45 -45
- package/src/core/geom/vec3/v3_triple_cross_product.js +7 -7
- package/src/core/geom/vec3/v3_uniform_sample_cone.js +21 -21
- package/src/core/geom/vec4/v4_multiply_mat4.js +7 -7
- package/src/core/graph/csr/csr_graph_build_distance_field.js +112 -112
- package/src/core/graph/csr/csr_graph_find_edge.js +25 -25
- package/src/core/graph/csr/csr_graph_find_shortest_path.js +105 -105
- package/src/core/graph/csr/csr_graph_from_undirected_edge_list.js +94 -94
- package/src/core/graph/graph_k_means_cluster.js +250 -250
- package/src/core/graph/layout/CircleLayout.js +1 -1
- package/src/core/graph/layout/box/BoxLayouter.js +1 -1
- package/src/core/graph/layout/graph_peel_topological_layer.js +45 -45
- package/src/core/graph/metis/BinaryTopologyFaceGraph.js +49 -49
- package/src/core/graph/metis/bt_mesh_build_face_graph.js +111 -111
- package/src/core/graph/metis/cluster_mesh_metis.js +137 -137
- package/src/core/graph/metis/native/bisection/bisect_graph.js +100 -100
- package/src/core/graph/metis/native/bisection/compute_2way_params.js +86 -86
- package/src/core/graph/metis/native/bisection/fm_2way.js +297 -297
- package/src/core/graph/metis/native/bisection/grow_bisection.js +137 -137
- package/src/core/graph/metis/native/bisection/split_graph_two_way.js +119 -119
- package/src/core/graph/metis/native/coarsen/coarsen_graph.js +94 -94
- package/src/core/graph/metis/native/coarsen/create_coarse_graph.js +158 -158
- package/src/core/graph/metis/native/coarsen/match_shem.js +175 -175
- package/src/core/graph/metis/native/initial/initial_kway_bfs.js +122 -122
- package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.js +170 -170
- package/src/core/graph/metis/native/metis_partition_kway.js +126 -126
- package/src/core/graph/metis/native/refine/RefinementScratch.js +53 -53
- package/src/core/graph/metis/native/refine/fm_kway.js +487 -487
- package/src/core/graph/metis/native/refine/project_kway.js +43 -43
- package/src/core/graph/metis/native/refine/refine_kway.js +43 -43
- package/src/core/lang/reactive/pegjs/parser.js +3458 -3458
- package/src/core/math/complex/complex_horner_eval.js +31 -31
- package/src/core/math/computeWholeDivisorLow.js +33 -33
- package/src/core/math/f32_next_down.js +24 -24
- package/src/core/math/f32_next_up.js +27 -27
- package/src/core/math/hash/hash_mix2.js +22 -22
- package/src/core/math/hash/hash_mix3.js +19 -19
- package/src/core/math/linalg/cg/cg_solve.js +106 -106
- package/src/core/math/linalg/cg/cg_solve_normal_equations.js +59 -59
- package/src/core/math/linalg/cubic_residual_times_derivative_accumulate.js +43 -43
- package/src/core/math/linalg/eigen/matrix_householder_in_place.js +122 -122
- package/src/core/math/linalg/eigen/matrix_qr_in_place.js +190 -190
- package/src/core/math/linalg/eigen/matrix_symmetric_3x3_eigen.js +117 -117
- package/src/core/math/linalg/givens/givens_apply_rows.js +28 -28
- package/src/core/math/linalg/givens/givens_apply_rows_offset.js +30 -30
- package/src/core/math/linalg/givens/givens_rotation_coefficients.js +39 -39
- package/src/core/math/linalg/lu_factor_linear_system.js +108 -108
- package/src/core/math/linalg/lu_solve_linear_system.js +53 -53
- package/src/core/math/linalg/polynomial_add_into.js +29 -29
- package/src/core/math/linalg/polynomial_complex_roots_aberth_ehrlich.js +159 -159
- package/src/core/math/linalg/polynomial_cubic_derivative_eval.js +16 -16
- package/src/core/math/linalg/polynomial_cubic_horner_eval.js +19 -19
- package/src/core/math/linalg/polynomial_cubic_second_derivative_eval.js +14 -14
- package/src/core/math/linalg/polynomial_multiply.js +41 -41
- package/src/core/math/linalg/polynomial_real_roots_in_interval.js +211 -211
- package/src/core/math/linalg/polynomial_root_bound_cauchy.js +30 -30
- package/src/core/math/linalg/polynomial_scale_into.js +17 -17
- package/src/core/math/linalg/polynomial_sub_into.js +29 -29
- package/src/core/math/linalg/solve_linear_system_GEPP_2x2.js +96 -96
- package/src/core/math/linalg/sor_optimal_omega.js +42 -42
- package/src/core/math/linalg/sparse/SparseMatrixCSR.js +88 -88
- package/src/core/math/linalg/sparse/spm_matvec.js +22 -22
- package/src/core/math/linalg/sparse/spm_matvec_transpose.js +29 -29
- package/src/core/math/lookup/LUT_HEATMAP.js +30 -30
- package/src/core/math/lookup/ParameterLookupTable.js +495 -495
- package/src/core/math/lookup/ParameterLookupTableFlags.js +6 -6
- package/src/core/math/noise/curl_noise_3d.js +18 -18
- package/src/core/math/physics/brdf/cone_cosine_from_roughness.js +28 -28
- package/src/core/math/physics/brdf/reflection_sample_weight.js +48 -48
- package/src/core/math/physics/kinematics/computeInterceptPoint.js +79 -79
- package/src/core/math/random/randomSeed.js +16 -16
- package/src/core/math/random/random_pick_weighted_index.js +26 -26
- package/src/core/math/round_half_away_from_zero.js +13 -13
- package/src/core/math/spline/spline3_hermite_apply_transform.js +107 -107
- package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_1d.js +125 -125
- package/src/core/math/spline/spline3_hermite_intersects_spline3_hermite.js +50 -50
- package/src/core/math/spline/spline3_hermite_reverse.js +49 -49
- package/src/core/math/spline/spline3_hermite_to_monomial.js +37 -37
- package/src/core/math/statistics/hammersley_sequence.js +53 -53
- package/src/core/model/reactive/model/util/createRandomReactiveExpression.js +185 -185
- package/src/core/path/convertPathToURL.js +107 -107
- package/src/core/process/delay.js +16 -16
- package/src/core/science/units/MEASUREMENT_UNITS_SCIENTIFIC.js +87 -87
- package/src/core/science/units/MEASUREMENT_UNITS_SI.js +17 -17
- package/src/core/science/units/NamedUnit.js +48 -48
- package/src/core/science/units/UNIT_DIMENSION_MAPPING.js +29 -29
- package/src/core/science/units/UnitDimension.js +28 -28
- package/src/core/science/units/format_quantity.js +74 -74
- package/src/core/science/units/magnitude_prefix.js +127 -127
- package/src/core/science/units/si/AMPERE.js +13 -13
- package/src/core/science/units/si/CANDELA.js +13 -13
- package/src/core/science/units/si/DIMENSIONLESS.js +14 -14
- package/src/core/science/units/si/KELVIN.js +13 -13
- package/src/core/science/units/si/KILOGRAM.js +13 -13
- package/src/core/science/units/si/METER.js +13 -13
- package/src/core/science/units/si/MOLE.js +13 -13
- package/src/core/science/units/si/SECOND.js +13 -13
- package/src/core/science/units/si/derived/BECQUEREL.js +16 -16
- package/src/core/science/units/si/derived/COULOMB.js +13 -13
- package/src/core/science/units/si/derived/FARAD.js +13 -13
- package/src/core/science/units/si/derived/GRAY.js +16 -16
- package/src/core/science/units/si/derived/HENRY.js +13 -13
- package/src/core/science/units/si/derived/HERTZ.js +16 -16
- package/src/core/science/units/si/derived/JOULE.js +13 -13
- package/src/core/science/units/si/derived/KATAL.js +13 -13
- package/src/core/science/units/si/derived/LUMEN.js +14 -14
- package/src/core/science/units/si/derived/LUX.js +13 -13
- package/src/core/science/units/si/derived/NEWTON.js +13 -13
- package/src/core/science/units/si/derived/OHM.js +13 -13
- package/src/core/science/units/si/derived/PASCAL.js +13 -13
- package/src/core/science/units/si/derived/SIEMENS.js +13 -13
- package/src/core/science/units/si/derived/SIEVERT.js +16 -16
- package/src/core/science/units/si/derived/TESLA.js +13 -13
- package/src/core/science/units/si/derived/VOLT.js +13 -13
- package/src/core/science/units/si/derived/WATT.js +13 -13
- package/src/core/science/units/si/derived/WEBER.js +13 -13
- package/src/core/science/units/unit_matrix_to_string.js +403 -403
- package/src/engine/Engine.js +726 -726
- package/src/engine/EngineHarness.js +590 -590
- package/src/engine/REVIEW_2026_07_03.md +211 -211
- package/src/engine/animation/AnimatedActions.js +81 -81
- package/src/engine/animation/AnimationUtils.js +252 -252
- package/src/engine/animation/async/TimeSeries.js +300 -300
- package/src/engine/animation/curve/animation_curve_binary_codec.js +60 -60
- package/src/engine/animation/curve/draw/canvas_point_to_curve.js +22 -22
- package/src/engine/animation/curve/draw/curve_point_to_canvas.js +38 -38
- package/src/engine/animation/curve/draw/position_canvas_to_curve.js +22 -22
- package/src/engine/animation/curve/draw/position_curve_to_canvas.js +22 -22
- package/src/engine/asset/GameAssetType.d.ts +0 -1
- package/src/engine/asset/GameAssetType.js +0 -1
- package/src/engine/asset/load_model_scene_bundle.js +27 -27
- package/src/engine/asset/loaders/font/FontAsset.js +21 -21
- package/src/engine/asset/loaders/font/FontAssetLoader.js +20 -20
- package/src/engine/asset/loaders/gltf_test_fixtures.js +358 -358
- package/src/engine/asset/loaders/image/ImageBitmapAssetLoader.js +52 -52
- package/src/engine/asset/loaders/image/ImageRGBADataLoader.js +94 -94
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterAverage.js +59 -59
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.js +55 -55
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterPaeth.js +74 -74
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.js +34 -34
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.js +46 -46
- package/src/engine/control/first-person/DESIGN.md +640 -640
- package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +563 -563
- package/src/engine/control/first-person/FirstPersonMotionPhase.js +134 -134
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2045 -2045
- package/src/engine/control/first-person/mastery/DecisionPoint.js +30 -30
- package/src/engine/control/first-person/math/Spring.js +71 -71
- package/src/engine/control/first-person/math/computeJumpFromApex.js +23 -23
- package/src/engine/control/first-person/math/computeLRCBreathRate.js +41 -41
- package/src/engine/control/first-person/math/computeMassRatios.js +44 -44
- package/src/engine/control/first-person/math/criticallyDampedSpring.js +34 -34
- package/src/engine/control/first-person/math/dampedSpringStep.js +72 -72
- package/src/engine/control/first-person/math/jumpDynamics.js +108 -108
- package/src/engine/control/first-person/math/stepTowards.js +20 -20
- package/src/engine/control/first-person/pose/FirstPersonPose.js +137 -137
- package/src/engine/control/first-person/pose/FirstPersonPosture.js +27 -27
- package/src/engine/control/first-person/test/buildTestPlayer.js +36 -36
- package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +531 -531
- package/src/engine/ecs/EntityManager.d.ts +7 -3
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +10 -5
- package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
- package/src/engine/ecs/async/SystemWorkerHost.js +329 -329
- package/src/engine/ecs/async/SystemWorkerLoopback.js +143 -143
- package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +246 -246
- package/src/engine/ecs/async/WorkerSystem.js +702 -702
- package/src/engine/ecs/async/WorkerSystemProtocol.js +150 -150
- package/src/engine/ecs/fow/FogOfWar.js +707 -707
- package/src/engine/ecs/fow/FogOfWarEdgeMode.js +40 -40
- package/src/engine/ecs/fow/fog_of_war_mask_world_bounds.js +24 -24
- package/src/engine/ecs/fow/fog_of_war_uv_transform.js +30 -30
- package/src/engine/ecs/gui/hud/testHudEdgeStick.js +132 -134
- package/src/engine/ecs/hierarchy/EntityChildIndex.js +140 -140
- package/src/engine/ecs/ik/IKProblem.js +42 -42
- package/src/engine/ecs/ik/InverseKinematicsSystem.js +193 -193
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +134 -134
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +97 -97
- package/src/engine/ecs/ik/ik_bone_chain.js +85 -85
- package/src/engine/ecs/ik/ik_probe_terrain_contact.js +119 -119
- package/src/engine/ecs/parent/EntityNode.d.ts +1 -1
- package/src/engine/ecs/parent/EntityNode.js +2 -2
- package/src/engine/ecs/parent/ParentEntitySystem.js +255 -255
- package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/speaker/VoiceSystem.js +13 -7
- package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +269 -269
- package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.js +315 -315
- package/src/engine/ecs/storage/binary/object-v2/BinaryObjectSerializer.js +331 -331
- package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +199 -199
- package/src/engine/ecs/storage/binary/object-v2/ObjectBinaryFormat.js +57 -57
- package/src/engine/ecs/storage/binary/object-v2/ObjectSerializationAdapter.js +56 -56
- package/src/engine/ecs/storage/binary/object-v2/README.md +110 -110
- package/src/engine/ecs/storage/binary/object-v2/objectStringCodec.js +48 -48
- package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +44 -44
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +265 -265
- package/src/engine/ecs/terrain/TerrainClouds.js +97 -97
- package/src/engine/ecs/terrain/ecs/StubTerrainBuildWorker.js +65 -65
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts +4 -0
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
- package/src/engine/ecs/terrain/ecs/TerrainSystem.js +209 -209
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +316 -316
- package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +416 -416
- package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +525 -525
- package/src/engine/ecs/terrain/overlay/TerrainOverlay.js +302 -302
- package/src/engine/ecs/terrain/tiles/TerrainTile.js +561 -561
- package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +896 -896
- package/src/engine/ecs/terrain/tiles/tile_geometry_to_meshlets.js +36 -36
- package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
- package/src/engine/ecs/transform/Transform64.js +814 -814
- package/src/engine/ecs/transform/t64_copy_from_transform.js +35 -35
- package/src/engine/ecs/transform/t64_equals_transform.js +55 -55
- package/src/engine/ecs/transform/t64_look_rotation.js +36 -36
- package/src/engine/ecs/transform/t64_transform_direction.js +25 -25
- package/src/engine/ecs/transform/transform_copy_from_t64.js +28 -28
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +345 -345
- package/src/engine/ecs/transform-attachment/transform_attachment_find_descendant_by_name.js +65 -65
- package/src/engine/ecs/transform-attachment/transform_attachment_parent_of.js +24 -24
- package/src/engine/ecs/util/hideEntityGracefully.js +208 -208
- package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +446 -446
- package/src/engine/graphics/FULL_SCREEN_QUAD_VERTEX_SHADER.js +14 -14
- package/src/engine/graphics/FrameThrottle.js +2 -2
- package/src/engine/graphics/ecs/animation/animator/graph/AnimationState.js +207 -207
- package/src/engine/graphics/ecs/animation/animator/graph/AnimationTransition.js +151 -151
- package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.js +22 -22
- package/src/engine/graphics/ecs/camera/Camera.js +165 -165
- package/src/engine/graphics/ecs/camera/camera_active_frustum.js +25 -25
- package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
- package/src/engine/graphics/ecs/camera/camera_traverse_active.js +18 -18
- package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +170 -170
- package/src/engine/graphics/ecs/camera/serialization/CameraSerializationAdapter.js +68 -68
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +296 -296
- package/src/engine/graphics/ecs/decal/v2/Decal.js +220 -220
- package/src/engine/graphics/ecs/decal/v2/DecalSerializationAdapter.js +56 -56
- package/src/engine/graphics/ecs/decal/v2/DecalSerializationUpgrader_0_1.js +38 -38
- package/src/engine/graphics/ecs/light/shadow/compute_view_frustum_aabb_in_space.js +62 -62
- package/src/engine/graphics/ecs/light/shadow/extend_shadow_camera_near_for_casters.js +77 -77
- package/src/engine/graphics/ecs/make_bvh_depth_range_computer.js +33 -33
- package/src/engine/graphics/ecs/mesh-v2/DeferredBoundsQueue.js +88 -88
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMesh.js +303 -303
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshSystem.d.ts +1 -1
- package/src/engine/graphics/ecs/mesh-v2/aggregate/serialization/SGMeshSerializationAdapter.js +39 -39
- package/src/engine/graphics/ecs/mesh-v2/sg_hierarchy_compute_bounding_box_via_parent_entity.js +36 -36
- package/src/engine/graphics/ecs/path/tube/build/GeometryStream.js +94 -94
- package/src/engine/graphics/ecs/path/tube/build/build_stream_catmullrom.js +310 -310
- package/src/engine/graphics/ecs/path/tube/build/build_stream_linear.js +73 -73
- package/src/engine/graphics/ecs/path/tube/build/computeFrenetFrames.js +199 -199
- package/src/engine/graphics/ecs/path/tube/build/makeTubeStream.js +217 -217
- package/src/engine/graphics/ecs/path/tube/build/make_cap.js +340 -340
- package/src/engine/graphics/ecs/path/tube/build/make_ring_faces.js +40 -40
- package/src/engine/graphics/ecs/path/tube/build/make_ring_vertices.js +153 -153
- package/src/engine/graphics/ecs/render_layers_compute_depth_range.js +64 -64
- package/src/engine/graphics/ecs/trail3d/Trail3D.js +483 -483
- package/src/engine/graphics/ecs/trail3d/Trail3DFlags.js +26 -26
- package/src/engine/graphics/ecs/trail3d/advance_trail.js +42 -42
- package/src/engine/graphics/ecs/trail3d/make_gradient_stroke.js +58 -58
- package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +90 -90
- package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +75 -75
- package/src/engine/graphics/ecs/trail3d/trail_head_position.js +19 -19
- package/src/engine/graphics/ecs/water/Water.js +104 -104
- package/src/engine/graphics/geometry/AttributeData.js +84 -84
- package/src/engine/graphics/geometry/buffered/geometry_compute_vertex_normals_indexed.js +49 -49
- package/src/engine/graphics/geometry/buffered/query/GeometrySpatialQueryAccelerator.js +288 -288
- package/src/engine/graphics/geometry/buffered/query/nearest_point_on_triangle_record.js +87 -87
- package/src/engine/graphics/geometry/buffered/read_triangle_vertices.js +102 -102
- package/src/engine/graphics/geometry/bvh/buffered/bvh32_from_buffered_geometry.js +52 -52
- package/src/engine/graphics/geometry/bvh/buffered/bvh32_from_indexed_geometry.js +20 -20
- package/src/engine/graphics/geometry/bvh/buffered/bvh32_from_unindexed_geometry.js +19 -19
- package/src/engine/graphics/geometry/optimization/geometry_optimize_uv_tension.js +135 -135
- package/src/engine/graphics/impostors/voxel/README.md +149 -149
- package/src/engine/graphics/impostors/voxel/VoxelImpostorDescription.js +141 -141
- package/src/engine/graphics/particles/node-based/codegen/glsl/getTypeByteSize.js +20 -20
- package/src/engine/graphics/particles/node-based/nodes/FloatConstant.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/FloatConstant.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/ReadFloatUniform.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/ReadFloatUniform.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/ReadVelocity.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/ReadVelocity.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/ShaderNode.d.ts +1 -2
- package/src/engine/graphics/particles/node-based/nodes/ShaderNode.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/Vector3Constant.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/Vector3Constant.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/Vector3Merge.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/Vector3Merge.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/Vector3Split.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/Vector3Split.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/WriteVelocity.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/WriteVelocity.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/attribute/ReadVector3Attribute.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/attribute/ReadVector3Attribute.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/attribute/WriteVector3Attribute.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/attribute/WriteVector3Attribute.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/math/AddFloatNode.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/math/AddFloatNode.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/math/Vector3Add.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/math/Vector3Add.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/math/Vector3Divide.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/math/Vector3Divide.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/math/Vector3Multiply.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/math/Vector3Multiply.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/math/Vector3Subtract.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/math/Vector3Subtract.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/noise/CurlNoiseNode.d.ts +2 -0
- package/src/engine/graphics/particles/node-based/nodes/noise/CurlNoiseNode.d.ts.map +1 -1
- package/src/engine/graphics/particles/node-based/nodes/particle_data_type_component_count.js +45 -45
- package/src/engine/graphics/particles/particular/engine/ParticularEngine.js +229 -229
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +2 -10
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1149 -1149
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +472 -472
- package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -2
- package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.js +2 -2
- package/src/engine/graphics/particles/particular/engine/parameter/ParameterSet.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/parameter/ParameterSet.js +3 -5
- package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.js +135 -135
- package/src/engine/graphics/particles/particular/engine/utils/distribute_points_on_indexed_triangles.js +168 -168
- package/src/engine/graphics/render/forward_plus/plugin/forwardPlusMaterialMarker.js +18 -18
- package/src/engine/graphics/render/forward_plus/read_frustum_corner.js +2 -2
- package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +219 -219
- package/src/engine/graphics/render/frame_graph/FrameGraph.js +900 -900
- package/src/engine/graphics/render/frame_graph/FrameGraphScope.js +72 -72
- package/src/engine/graphics/render/frame_graph/FrameGraphState.js +39 -39
- package/src/engine/graphics/render/frame_graph/ResourceEntry.js +96 -96
- package/src/engine/graphics/render/gizmo/GizmoShapeBuffer.js +105 -105
- package/src/engine/graphics/render/gizmo/GizmoShapeRenderingInterface.js +162 -162
- package/src/engine/graphics/render/layers/RenderLayer.js +95 -95
- package/src/engine/graphics/sh3/build_injected_shader.js +56 -56
- package/src/engine/graphics/sh3/grid_dilate_average.js +175 -175
- package/src/engine/graphics/sh3/path_tracer/BufferedGeometryBVH.js +506 -506
- package/src/engine/graphics/sh3/path_tracer/PathTracedMesh.js +161 -161
- package/src/engine/graphics/sh3/path_tracer/PathTracedRenderer.js +205 -205
- package/src/engine/graphics/sh3/path_tracer/PathTracedScene.js +698 -698
- package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +490 -490
- package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.js +2 -2
- package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.js +45 -45
- package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +73 -73
- package/src/engine/graphics/sh3/path_tracer/ray_hit_apply_transform.js +32 -32
- package/src/engine/graphics/sh3/path_tracer/texture/apply_texture_clamping_to_coordinate.js +28 -28
- package/src/engine/graphics/sh3/path_tracer/texture/sample_material.js +142 -142
- package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.js +70 -70
- package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.js +388 -388
- package/src/engine/graphics/shaders/chunks/glsl_octahedral_impostor.js +277 -277
- package/src/engine/graphics/shaders/chunks/glsl_voxel_impostor_splat.js +57 -57
- package/src/engine/graphics/shadows/vsm.glsl.js +43 -43
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +81 -81
- package/src/engine/graphics/texture/EnvironmentTextureProjection.js +15 -15
- package/src/engine/graphics/texture/channel_count_to_format_prefix.js +26 -26
- package/src/engine/graphics/texture/isImageBitmap.js +2 -2
- package/src/engine/graphics/texture/reflection/convolve_equirectangular_reflection.js +189 -189
- package/src/engine/graphics/texture/reflection/equirectangular_reflection_roughness.js +51 -51
- package/src/engine/graphics/texture/sampler/HarmonicDiffusionGrid.js +145 -145
- package/src/engine/graphics/texture/sampler/Sampler2DArray.js +172 -172
- package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +466 -466
- package/src/engine/graphics/texture/sampler/compare/flip/FlipParameters.js +18 -18
- package/src/engine/graphics/texture/sampler/compare/flip/FlipPooling.js +33 -33
- package/src/engine/graphics/texture/sampler/compare/flip/flip_build_feature_kernel.js +147 -147
- package/src/engine/graphics/texture/sampler/compare/flip/flip_build_spatial_kernel.js +177 -177
- package/src/engine/graphics/texture/sampler/compare/flip/flip_compute_color_difference.js +104 -104
- package/src/engine/graphics/texture/sampler/compare/flip/flip_compute_feature_difference.js +76 -76
- package/src/engine/graphics/texture/sampler/compare/flip/flip_compute_pixels_per_degree.js +34 -34
- package/src/engine/graphics/texture/sampler/compare/flip/flip_constants.js +77 -77
- package/src/engine/graphics/texture/sampler/compare/flip/flip_filter_feature.js +48 -48
- package/src/engine/graphics/texture/sampler/compare/flip/flip_filter_spatial.js +86 -86
- package/src/engine/graphics/texture/sampler/compare/flip/flip_pool.js +71 -71
- package/src/engine/graphics/texture/sampler/compare/flip/flip_srgb_to_ycxcz.js +55 -55
- package/src/engine/graphics/texture/sampler/compare/flip/sampler2d_flip_ldr.js +80 -80
- package/src/engine/graphics/texture/sampler/filter/SeparableKernel.js +82 -82
- package/src/engine/graphics/texture/sampler/filter/sampler2d_convolve_separable.js +122 -122
- package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_lanczos.js +148 -148
- package/src/engine/graphics/texture/sampler/sampler2d_channel_apply_lut.js +82 -82
- package/src/engine/graphics/texture/sampler/sampler2d_combine.js +67 -67
- package/src/engine/graphics/texture/sampler/sampler2d_linear_f16_to_srgb_u8.js +54 -54
- package/src/engine/graphics/texture/sampler/sampler2d_sample_equirectangular_direction.js +63 -63
- package/src/engine/graphics/texture/sampler/sampler2d_srgb_to_linear.js +33 -33
- package/src/engine/graphics/texture/sampler/sampler2d_srgb_u8_to_linear_f16.js +68 -68
- package/src/engine/graphics/texture/shade_image_preview.js +103 -103
- package/src/engine/graphics/trail/TrailSpawnMode.js +20 -20
- package/src/engine/graphics/trail/tube/TubeX.js +573 -573
- package/src/engine/graphics/trail/tube/TubeXMaterialSpec.js +58 -58
- package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +34 -34
- package/src/engine/graphics/trail/tube/tube_attributes_spec.js +69 -69
- package/src/engine/graphics/trail/tube/tube_frame.js +83 -83
- package/src/engine/graphics3/AnimationGraphSystem3.js +329 -329
- package/src/engine/graphics3/AnimationSystem3.js +352 -352
- package/src/engine/graphics3/CameraSystem3.js +170 -170
- package/src/engine/graphics3/DecalSystem3.js +441 -441
- package/src/engine/graphics3/FogOfWarSystem3.js +265 -265
- package/src/engine/graphics3/GraphicsEngine3.js +776 -776
- package/src/engine/graphics3/HighlightSystem3.js +241 -241
- package/src/engine/graphics3/LightSystem3.js +211 -211
- package/src/engine/graphics3/MeshSystem3.js +646 -646
- package/src/engine/graphics3/ParticleEmitterSystem3.js +289 -289
- package/src/engine/graphics3/PathDisplaySystem3.js +309 -309
- package/src/engine/graphics3/PickingQuery.js +48 -48
- package/src/engine/graphics3/PickingResult.js +47 -47
- package/src/engine/graphics3/PickingSystem3.js +273 -273
- package/src/engine/graphics3/ShadeCameraAdapter.js +55 -55
- package/src/engine/graphics3/ShadedGeometrySystem3.js +169 -169
- package/src/engine/graphics3/TerrainSystem3.js +566 -566
- package/src/engine/graphics3/TooltipComponentSystem3.js +328 -328
- package/src/engine/graphics3/Trail3DSystem3.js +221 -221
- package/src/engine/graphics3/WaterSystem3.js +293 -293
- package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
- package/src/engine/graphics3/animation/wrap_clip_time.js +23 -23
- package/src/engine/graphics3/animation/write_graph_playback.js +48 -48
- package/src/engine/graphics3/camera_sync_from_transform.js +29 -29
- package/src/engine/graphics3/debug/gizmo_view_from_camera.js +48 -48
- package/src/engine/graphics3/decal/DECAL_CLUSTER.js +61 -61
- package/src/engine/graphics3/decal/DECAL_GPU_RECORD.js +117 -117
- package/src/engine/graphics3/decal/DecalAtlas.js +194 -194
- package/src/engine/graphics3/decal/DecalAtlasFill.js +32 -32
- package/src/engine/graphics3/decal/GPUDecalRenderer.js +360 -360
- package/src/engine/graphics3/decal/chunk_decal_intersects_frustum.js +59 -59
- package/src/engine/graphics3/decal/chunk_decal_sampling_info.js +57 -57
- package/src/engine/graphics3/decal/chunk_decal_surface_frame.js +54 -54
- package/src/engine/graphics3/decal/decal_atlas_border.js +69 -69
- package/src/engine/graphics3/decal/decal_gpu_records.js +120 -120
- package/src/engine/graphics3/decal/decal_material_samplers.js +109 -109
- package/src/engine/graphics3/decal/graph_build_decal_clusters.js +212 -212
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +207 -207
- package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +108 -108
- package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +151 -151
- package/src/engine/graphics3/highlight/HIGHLIGHT_OUTLINE.js +23 -23
- package/src/engine/graphics3/highlight/chunk_highlight_lookup.js +53 -53
- package/src/engine/graphics3/highlight/pack_highlight_color.js +44 -44
- package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
- package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
- package/src/engine/graphics3/load_cube_environment.js +68 -68
- package/src/engine/graphics3/make_default_environment.js +107 -107
- package/src/engine/graphics3/particles/particle_gpu_records.js +221 -221
- package/src/engine/graphics3/path/build_tube_path_streams.js +98 -98
- package/src/engine/graphics3/path/tube_stream_write_geometry.js +90 -90
- package/src/engine/graphics3/preview/ModelPreviewFraming.js +35 -35
- package/src/engine/graphics3/preview/make_model_preview_scene.js +154 -154
- package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
- package/src/engine/graphics3/preview/model_preview_framing.js +70 -70
- package/src/engine/graphics3/shade_bundle_bounds.js +55 -55
- package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
- package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
- package/src/engine/graphics3/terrain/GPUTerrainSplatRenderer.js +481 -481
- package/src/engine/graphics3/terrain/chunk_terrain_grid_overlay.js +61 -61
- package/src/engine/graphics3/terrain/chunk_terrain_splat_mix.js +66 -66
- package/src/engine/graphics3/terrain/pack_terrain_row_table.js +53 -53
- package/src/engine/graphics3/terrain/shader_terrain_splat.js +215 -215
- package/src/engine/graphics3/trail/trail_tube_write_geometry.js +158 -158
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +2 -2
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
- package/src/engine/input/GAMEPAD_API_PROPOSAL.md +717 -717
- package/src/engine/input/analog/apply_radial_dead_zone.js +38 -38
- package/src/engine/input/devices/GamepadDevice.js +466 -466
- package/src/engine/input/devices/ManualInputDevice.js +152 -152
- package/src/engine/input/devices/PointerCoordinates.js +26 -26
- package/src/engine/input/devices/events/GamepadEvents.js +10 -10
- package/src/engine/input/devices/gamepad/GamepadAxes.js +19 -19
- package/src/engine/input/devices/gamepad/GamepadButtons.js +29 -29
- package/src/engine/input/devices/gamepad/GamepadCoordinates.js +17 -17
- package/src/engine/input/devices/gamepad/GamepadDeviceLayout.js +323 -323
- package/src/engine/input/devices/gamepad/GamepadHandle.js +286 -286
- package/src/engine/input/devices/gamepad/GamepadLayout.js +160 -160
- package/src/engine/input/devices/gamepad/GamepadStandardMapping.js +31 -31
- package/src/engine/input/devices/gamepad/GamepadStick.js +169 -169
- package/src/engine/input/devices/gamepad/GamepadStickCalibration.js +119 -119
- package/src/engine/input/devices/gamepad/GamepadStickCalibrator.js +250 -250
- package/src/engine/input/devices/gamepad/gamepad_layout_database.js +144 -144
- package/src/engine/input/devices/gamepad/gamepad_read_hat_axis.js +61 -61
- package/src/engine/input/devices/gamepad/gamepad_write_dpad_vector.js +30 -30
- package/src/engine/input/devices/gamepad/prototypeGamepadTester.js +2124 -2124
- package/src/engine/input/devices/mouse/MouseButtons.js +22 -22
- package/src/engine/input/ecs/components/Input.js +118 -118
- package/src/engine/input/ecs/components/InputController.js +78 -78
- package/src/engine/input/ecs/ism/ISM_DESIGN.md +1523 -1523
- package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +627 -627
- package/src/engine/input/ecs/ism/InputActionEvent.js +40 -40
- package/src/engine/input/ecs/ism/InputBinding.js +71 -71
- package/src/engine/input/ecs/ism/InputCoordinateKind.js +25 -25
- package/src/engine/input/ecs/ism/InputCoordinateSource.js +86 -86
- package/src/engine/input/ecs/ism/InputDirection.js +33 -33
- package/src/engine/input/ecs/ism/InputMapProgram.js +236 -236
- package/src/engine/input/ecs/ism/InputMapSystem.js +976 -976
- package/src/engine/input/ecs/ism/InputOcclusion.js +31 -31
- package/src/engine/input/ecs/ism/InputSource.js +67 -67
- package/src/engine/input/ecs/ism/InputSourceTable.js +107 -107
- package/src/engine/input/ecs/ism/coordinate/InputCoordinateChannel.js +93 -93
- package/src/engine/input/ecs/ism/coordinate/InputCoordinateChannelType.js +11 -11
- package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.js +153 -153
- package/src/engine/input/ecs/ism/coordinate/InputCoordinateSwitches.js +160 -160
- package/src/engine/input/ecs/ism/device/GAMEPAD_INPUT_DEVICE_ID.js +9 -9
- package/src/engine/input/ecs/ism/device/GamepadInputDeviceAdapter.js +88 -88
- package/src/engine/input/ecs/ism/device/InputDeviceAdapter.js +72 -72
- package/src/engine/input/ecs/ism/device/KEYBOARD_INPUT_DEVICE_ID.js +9 -9
- package/src/engine/input/ecs/ism/device/KeyboardInputDeviceAdapter.js +63 -63
- package/src/engine/input/ecs/ism/device/ManualInputDeviceAdapter.js +55 -55
- package/src/engine/input/ecs/ism/device/POINTER_INPUT_DEVICE_ID.js +9 -9
- package/src/engine/input/ecs/ism/device/PointerInputDeviceAdapter.js +160 -160
- package/src/engine/input/ecs/ism/map/InputBinding.js +88 -88
- package/src/engine/input/ecs/ism/map/InputCoordinateBinding.js +102 -102
- package/src/engine/input/ecs/ism/map/InputLayer.js +220 -220
- package/src/engine/input/ecs/ism/map/InputMap.js +331 -331
- package/src/engine/input/ecs/ism/prototypeInputMap.js +309 -309
- package/src/engine/input/ecs/ism/trigger/InputTrigger.js +148 -148
- package/src/engine/input/ecs/ism/trigger/InputTriggerChord.js +173 -173
- package/src/engine/input/ecs/ism/trigger/InputTriggerGamepadButton.js +37 -37
- package/src/engine/input/ecs/ism/trigger/InputTriggerHold.js +176 -176
- package/src/engine/input/ecs/ism/trigger/InputTriggerKey.js +39 -39
- package/src/engine/input/ecs/ism/trigger/InputTriggerMouseButton.js +38 -38
- package/src/engine/input/ecs/ism/trigger/InputTriggerRelease.js +120 -120
- package/src/engine/input/ecs/ism/trigger/InputTriggerSequence.js +315 -315
- package/src/engine/input/ecs/ism/trigger/InputTriggerSwitch.js +105 -105
- package/src/engine/input/ecs/ism/trigger/InputTriggerType.js +17 -17
- package/src/engine/input/ecs/systems/InputControllerSystem.js +253 -253
- package/src/engine/input/ecs/systems/InputSystem.js +162 -162
- package/src/engine/intelligence/behavior/primitive/FailingBehaviorSerializationAdapter.js +25 -25
- package/src/engine/intelligence/behavior/primitive/SucceedingBehaviorSerializationAdapter.js +26 -26
- package/src/engine/intelligence/behavior/util/AsynchronousDelayAction.js +55 -55
- package/src/engine/interpolation/BinaryInterpolationAdapter.js +56 -56
- package/src/engine/interpolation/Interpoland.js +49 -49
- package/src/engine/interpolation/Interpolated.js +149 -149
- package/src/engine/interpolation/PoseInterpolationAdapter.js +61 -61
- package/src/engine/interpolation/TransformPoseSerializationAdapter.js +57 -57
- package/src/engine/interpolation/pose_interpoland.js +27 -27
- package/src/engine/navigation/ecs/path_following/PathFollower.js +222 -222
- package/src/engine/navigation/mesh/NavigationMesh.js +145 -145
- package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +661 -0
- package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +229 -229
- package/src/engine/navigation/mesh/build/clip_soup_against_overhangs.d.ts.map +1 -1
- package/src/engine/navigation/mesh/build/clip_soup_against_overhangs.js +628 -520
- package/src/engine/network/CONGESTION_CONTROL.md +87 -87
- package/src/engine/network/README.md +52 -52
- package/src/engine/network/adapters/QuaternionInterpolationAdapter.js +43 -43
- package/src/engine/network/adapters/TransformInterpolationAdapter.js +84 -84
- package/src/engine/network/adapters/TransformReplicationAdapter.js +87 -87
- package/src/engine/network/adapters/Vector3InterpolationAdapter.js +46 -46
- package/src/engine/network/convertPathToURL.js +2 -2
- package/src/engine/network/core/MalformedPacketError.js +26 -26
- package/src/engine/network/core/quantize/quantize_float.js +73 -73
- package/src/engine/network/core/quantize/quantize_position.js +65 -65
- package/src/engine/network/core/sequence/ack_bitfield.js +77 -77
- package/src/engine/network/core/sequence/seq16.js +69 -69
- package/src/engine/network/core/sequence/seq32.js +73 -73
- package/src/engine/network/ecs/NetworkSystem.js +84 -84
- package/src/engine/network/ecs/components/NetworkIdentity.js +73 -73
- package/src/engine/network/ecs/owner_authorization.js +55 -55
- package/src/engine/network/ecs/serialization/NetworkIdentitySerializationAdapter.js +64 -64
- package/src/engine/network/replication/ScopeFilter.js +71 -71
- package/src/engine/network/sim/ActionLog.js +152 -152
- package/src/engine/network/sim/SimAction.js +273 -273
- package/src/engine/network/sim/Snapshotter.js +222 -222
- package/src/engine/network/state/FrameBufferRing.js +168 -168
- package/src/engine/network/state/InputRing.js +134 -134
- package/src/engine/network/state/PriorityAccumulator.js +180 -180
- package/src/engine/network/time/TimeDilation.js +62 -62
- package/src/engine/network/transport/Channel.js +336 -336
- package/src/engine/network/transport/Transport.js +203 -203
- package/src/engine/network/transport/adapters/NodeUDPTransport.js +186 -186
- package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +105 -105
- package/src/engine/network/transport/fragments/fragment_send.js +147 -147
- package/src/engine/network/transport/fragments/packet_size.js +101 -101
- package/src/engine/network/xhr.js +23 -23
- package/src/engine/physics/BULLET_REVIEW.md +945 -945
- package/src/engine/physics/CANNON_REVIEW.md +1300 -1300
- package/src/engine/physics/CONSTRAINT_SOLVER_BENCH_LOG.md +208 -208
- package/src/engine/physics/CONSTRAINT_SOLVER_IMPROVEMENTS_PLAN.md +364 -364
- package/src/engine/physics/INTEPOLATION_SYSTEM_PLAN.md +287 -287
- package/src/engine/physics/JOLT_REVIEW.md +913 -913
- package/src/engine/physics/PLAN.md +1120 -1094
- package/src/engine/physics/RAPIER_REVIEW.md +934 -934
- package/src/engine/physics/REVIEW_001_ACTION_PLAN.md +642 -642
- package/src/engine/physics/REVIEW_002.md +151 -151
- package/src/engine/physics/REVIEW_003.md +166 -166
- package/src/engine/physics/broadphase/compute_fat_world_aabb.js +97 -97
- package/src/engine/physics/constraint/DofMode.js +35 -35
- package/src/engine/physics/constraint/solve_constraints.js +1 -1
- package/src/engine/physics/contact/combine_material.js +35 -35
- package/src/engine/physics/ecs/BodyKind.js +29 -29
- package/src/engine/physics/ecs/Collider.js +177 -177
- package/src/engine/physics/ecs/ColliderFlags.js +15 -15
- package/src/engine/physics/ecs/ColliderSerializationAdapter.js +37 -37
- package/src/engine/physics/ecs/Joint.js +475 -475
- package/src/engine/physics/ecs/JointSerializationAdapter.js +72 -72
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +3 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +7 -2
- package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.js +37 -37
- package/src/engine/physics/ecs/SleepState.js +12 -12
- package/src/engine/physics/ecs/find_non_finite_physics_state.js +76 -76
- package/src/engine/physics/fluid/FluidField.js +867 -867
- package/src/engine/physics/fluid/FluidSimulator.js +832 -832
- package/src/engine/physics/fluid/REVIEW_02_PLAN.md +243 -243
- package/src/engine/physics/fluid/SliceVisualiser.js +190 -190
- package/src/engine/physics/fluid/ecs/FluidComponent.js +239 -239
- package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.js +89 -89
- package/src/engine/physics/fluid/ecs/FluidObstacle.js +97 -97
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +348 -348
- package/src/engine/physics/fluid/ecs/FluidSystem.js +142 -142
- package/src/engine/physics/fluid/ecs/FluidWorkerCore.js +123 -123
- package/src/engine/physics/fluid/ecs/WorkerFluidSystem.js +395 -395
- package/src/engine/physics/fluid/ecs/fluid.worker.js +12 -12
- package/src/engine/physics/fluid/ecs/fluid_build_world_to_grid.js +32 -32
- package/src/engine/physics/fluid/ecs/fluid_gather_visible_effectors.js +47 -47
- package/src/engine/physics/fluid/ecs/fluid_reanchor_field.js +85 -85
- package/src/engine/physics/fluid/ecs/fluid_sync_effectors_from_transform.js +16 -16
- package/src/engine/physics/fluid/ecs/fluid_worker_protocol.js +111 -111
- package/src/engine/physics/fluid/ecs/makeFluidWorker.js +18 -18
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +81 -81
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +202 -202
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +257 -257
- package/src/engine/physics/fluid/effector/WakeFluidEffector.js +405 -405
- package/src/engine/physics/fluid/prototype.js +126 -126
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.js +143 -143
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +162 -162
- package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +107 -107
- package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.js +131 -131
- package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +90 -90
- package/src/engine/physics/fluid/solver/v3_grid_limit8_at_indices.js +38 -38
- package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.js +77 -77
- package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.js +113 -113
- package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js +92 -92
- package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.js +107 -107
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +135 -135
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +511 -511
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +108 -108
- package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.js +317 -317
- package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +236 -236
- package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js +217 -217
- package/src/engine/physics/fluid/solver/v3_mac_apply_vorticity_confinement.js +174 -174
- package/src/engine/physics/fluid/solver/v3_mac_clip_trace.js +95 -95
- package/src/engine/physics/fluid/solver/v3_mac_compute_divergence.js +77 -77
- package/src/engine/physics/fluid/solver/v3_mac_compute_face_solid.js +131 -131
- package/src/engine/physics/fluid/solver/v3_mac_subtract_pressure_gradient.js +104 -104
- package/src/engine/physics/inertia/world_inverse_inertia.js +160 -160
- package/src/engine/physics/integration/integrate_position.js +97 -97
- package/src/engine/physics/narrowphase/box_box_manifold.js +681 -681
- package/src/engine/physics/narrowphase/box_triangle_contact.js +906 -906
- package/src/engine/physics/narrowphase/capsule_triangle_contact.js +395 -395
- package/src/engine/physics/narrowphase/compute_penetration.js +369 -369
- package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.js +55 -55
- package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.js +37 -37
- package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +117 -117
- package/src/engine/physics/narrowphase/narrowphase_step.js +1738 -1738
- package/src/engine/physics/narrowphase/reduce_manifold_contacts.js +74 -74
- package/src/engine/physics/narrowphase/refine_ray_hit.d.ts +12 -11
- package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/refine_ray_hit.js +228 -36
- package/src/engine/physics/narrowphase/sphere_sphere_contact.js +52 -52
- package/src/engine/physics/narrowphase/sphere_triangle_contact.js +138 -138
- package/src/engine/physics/persistence/solver_caches.js +309 -309
- package/src/engine/physics/queries/overlap_shape.js +187 -187
- package/src/engine/physics/queries/raycast.d.ts +7 -4
- package/src/engine/physics/queries/raycast.d.ts.map +1 -1
- package/src/engine/physics/queries/raycast.js +11 -5
- package/src/engine/physics/queries/shape_cast.js +417 -417
- package/src/engine/physics/solver/apply_impulse_to_body.js +86 -86
- package/src/engine/physics/solver/friction_cone.js +37 -37
- package/src/engine/physics/solver/solve_contacts.js +1 -1
- package/src/engine/platform/WebEnginePlatform.d.ts.map +1 -1
- package/src/engine/platform/WebEnginePlatform.js +1 -2
- package/src/engine/scene/SerializedScene.d.ts +2 -2
- package/src/engine/scene/SerializedScene.d.ts.map +1 -1
- package/src/engine/scene/transitionToScene.js +121 -121
- package/src/engine/simulation/Ticker.d.ts.map +1 -1
- package/src/engine/simulation/Ticker.js +33 -0
- package/src/engine/sound/ecs/audio/LiveEmitterSet.js +345 -345
- package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +140 -140
- package/src/engine/sound/simulation/AcousticSimulator.js +646 -646
- package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +432 -432
- package/src/engine/sound/simulation/PROBE_PLACEMENT.md +250 -250
- package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +322 -322
- package/src/engine/sound/simulation/README.md +277 -277
- package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +261 -261
- package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +121 -121
- package/src/engine/sound/simulation/configureAcousticSimulation.js +48 -48
- package/src/engine/sound/simulation/core/AcousticMedium.js +113 -113
- package/src/engine/sound/simulation/core/AcousticMediumSerializationAdapter.js +27 -27
- package/src/engine/sound/simulation/core/AcousticOccluderIndex.js +312 -312
- package/src/engine/sound/simulation/core/AcousticRegionIndex.js +159 -159
- package/src/engine/sound/simulation/core/AcousticSolution.js +90 -90
- package/src/engine/sound/simulation/core/AcousticSourceState.js +109 -109
- package/src/engine/sound/simulation/core/AcousticVolumeRegion.js +73 -73
- package/src/engine/sound/simulation/core/OcclusionSolver.js +112 -112
- package/src/engine/sound/simulation/core/RayHit.js +50 -50
- package/src/engine/sound/simulation/core/VolumeField.js +149 -149
- package/src/engine/sound/simulation/definition/AcousticDirectivity.js +114 -114
- package/src/engine/sound/simulation/definition/AcousticDirectivitySerializationAdapter.js +30 -30
- package/src/engine/sound/simulation/definition/AcousticMaterial.js +122 -122
- package/src/engine/sound/simulation/definition/AcousticMaterialSerializationAdapter.js +32 -32
- package/src/engine/sound/simulation/ecs/AcousticBody.js +48 -48
- package/src/engine/sound/simulation/ecs/AcousticBodySerializationAdapter.js +34 -34
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +64 -64
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +75 -75
- package/src/engine/sound/simulation/ecs/AcousticVolume.js +74 -74
- package/src/engine/sound/simulation/ecs/AcousticVolumeSerializationAdapter.js +37 -37
- package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.js +66 -66
- package/src/engine/sound/simulation/probe/AcousticProbeField.js +578 -578
- package/src/engine/sound/simulation/probe/AcousticProbeFieldSerializationAdapter.js +60 -60
- package/src/engine/sound/simulation/probe/ProbeFieldPathingSolution.js +64 -64
- package/src/engine/sound/simulation/probe/ProbeVisibilityRecheck.js +132 -132
- package/src/engine/sound/simulation/probe/acoustic_probe_transfer.js +103 -103
- package/src/engine/sound/simulation/probe/acoustic_trace_energy.js +136 -136
- package/src/engine/sound/simulation/probe/bakeProbeField.js +169 -169
- package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +110 -110
- package/src/engine/sound/simulation/probe/bakeReverbBands.js +110 -110
- package/src/engine/sound/simulation/probe/bakeVisibility.js +148 -148
- package/src/engine/sound/simulation/probe/echogram_band_rt60.js +83 -83
- package/src/engine/sound/simulation/probe/probe_delaunay_edges.js +215 -215
- package/src/engine/sound/simulation/probe/probe_densify_portals.js +140 -140
- package/src/engine/sound/simulation/probe/probe_detect_portals.js +196 -196
- package/src/engine/sound/simulation/probe/probe_edge_key.js +38 -38
- package/src/engine/sound/simulation/probe/probe_edge_visible.js +41 -41
- package/src/engine/sound/simulation/probe/probe_place_sdf_cover.js +82 -82
- package/src/engine/sound/simulation/probe/probe_refine_connectivity.js +181 -181
- package/src/engine/sound/simulation/probe/probe_sdf_grid.js +171 -171
- package/src/engine/sound/simulation/probe/probe_visibility_augment.js +146 -146
- package/src/engine/sound/simulation/probe/probe_visibility_bridge_components.js +167 -167
- package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +354 -354
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +231 -231
- package/src/engine/sound/simulation/render/foaReverbImpulseResponse.js +105 -105
- package/src/engine/sound/simulation/render/reverbImpulseResponse.js +66 -66
- package/src/engine/sound/simulation/render/reverb_band_tails.js +93 -93
- package/src/engine/sound/simulation/serialization/populateAcousticSerializationRegistry.js +25 -25
- package/src/engine/sound/sopra/README.md +643 -643
- package/src/engine/sound/sopra/SopraEngine.js +432 -432
- package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.js +71 -71
- package/src/engine/sound/sopra/asset/BufferProvider.js +29 -29
- package/src/engine/sound/sopra/asset/StubBufferProvider.js +58 -58
- package/src/engine/sound/sopra/definition/BusDefinition.js +142 -142
- package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.js +54 -54
- package/src/engine/sound/sopra/definition/DuckingRule.js +106 -106
- package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.js +31 -31
- package/src/engine/sound/sopra/definition/EventDescription.js +262 -262
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +55 -55
- package/src/engine/sound/sopra/definition/MixerSnapshot.js +83 -83
- package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.js +39 -39
- package/src/engine/sound/sopra/definition/ParameterDefinition.js +117 -117
- package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.js +31 -31
- package/src/engine/sound/sopra/definition/VoiceStealMode.js +18 -18
- package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +109 -109
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +185 -185
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.js +59 -59
- package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +128 -128
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +226 -226
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.js +54 -54
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +191 -191
- package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.js +39 -39
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.js +79 -79
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.js +42 -42
- package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +77 -77
- package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.js +27 -27
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +5 -0
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +125 -125
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.js +41 -41
- package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +24 -24
- package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +120 -120
- package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.js +31 -31
- package/src/engine/sound/sopra/definition/effect/EqEffect.js +128 -128
- package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.js +29 -29
- package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +113 -113
- package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.js +25 -25
- package/src/engine/sound/sopra/runtime/BusGraph.js +231 -231
- package/src/engine/sound/sopra/runtime/ParameterStore.js +98 -98
- package/src/engine/sound/sopra/runtime/SopraPlaybackContext.js +68 -68
- package/src/engine/sound/sopra/runtime/Voice.js +145 -145
- package/src/engine/sound/sopra/runtime/VoiceManager.js +136 -136
- package/src/engine/sound/sopra/runtime/VoicePool.js +17 -17
- package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +42 -42
- package/src/engine/sound/sopra/serialization/sopraJSON.js +99 -99
- package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +49 -49
- package/src/engine/sound/sopra/util/MockAudioContext.js +224 -224
- package/src/engine/sound/sopra/util/fadeOutAndStop.js +60 -60
- package/src/engine/ui/DraggableAspect.js +115 -115
- package/src/engine/ui/apply_pointer_tilt_3d.js +50 -50
- package/src/generation/COORDINATES.md +54 -54
- package/src/generation/GridGenerationResource.js +24 -24
- package/src/generation/GridTaskGroup.js +214 -214
- package/src/generation/REVIEW_01_ACTION_PLAN.md +628 -628
- package/src/generation/automata/CaveGeneratorCellularAutomata.js +79 -79
- package/src/generation/automata/CellularAutomata.js +22 -22
- package/src/generation/compute_writes_union.js +25 -25
- package/src/generation/filtering/CellFilter.js +117 -117
- package/src/generation/filtering/core/CellFilterBinaryOperation.js +37 -37
- package/src/generation/filtering/core/CellFilterOperationTertiary.js +43 -43
- package/src/generation/filtering/core/CellFilterUnaryOperation.js +29 -29
- package/src/generation/filtering/numeric/process/computeCellFilterSobel.js +36 -36
- package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.js +42 -42
- package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.js +18 -18
- package/src/generation/filtering/numeric/util/write_cell_filter_to_sampler2d.js +47 -47
- package/src/generation/filtering/util/cell_filter_weights_pick.js +54 -54
- package/src/generation/grid/GridData.js +233 -233
- package/src/generation/grid/coords/grid_to_texel.js +10 -10
- package/src/generation/grid/coords/texel_to_grid.js +10 -10
- package/src/generation/grid/generation/GridTaskApplyActionToCells.js +90 -90
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +388 -388
- package/src/generation/grid/generation/GridTaskExecuteRuleTimes.js +127 -127
- package/src/generation/grid/generation/GridTaskSequence.js +58 -58
- package/src/generation/grid/generation/NoopGridTaskGenerator.js +12 -12
- package/src/generation/grid/generation/discrete/GridTaskActionRuleSet.js +48 -48
- package/src/generation/grid/generation/discrete/GridTaskCellularAutomata.js +146 -146
- package/src/generation/grid/generation/discrete/GridTaskConnectRooms.js +540 -540
- package/src/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +222 -222
- package/src/generation/grid/generation/grid/GridTaskAddNodesFixed.js +44 -44
- package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +614 -614
- package/src/generation/markers/GridCellActionPlaceMarker.js +244 -244
- package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +86 -86
- package/src/generation/markers/actions/terrain/MarkerNodeActionPaintTerrain.js +266 -266
- package/src/generation/markers/emitter/MarkerNodeEmitterGridCellAction.js +49 -49
- package/src/generation/placement/GridCellActionTransformNearbyMarkers.js +120 -120
- package/src/generation/placement/action/GridCellAction.js +45 -45
- package/src/generation/placement/action/GridCellActionPlaceTags.js +140 -140
- package/src/generation/placement/action/GridCellActionWriteFilterToLayer.js +89 -89
- package/src/generation/placement/action/random/CellActionSelectRandom.js +69 -69
- package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +91 -91
- package/src/generation/placement/action/util/GridCellActionSequence.js +61 -61
- package/src/generation/placement/action/util/GridCellDisplacedAction.js +61 -61
- package/src/generation/rules/cell/CellMatcherRemovalPreservesConnectivity.js +183 -183
- package/src/generation/theme/ThemeEngine.js +666 -666
- package/src/shade/RENDERER_CONTRACT.md +568 -0
- package/src/shade/descriptor/texture/format/gpu_texture_format_info.js +267 -267
- package/src/shade/device/ShadeDeviceFailure.js +104 -104
- package/src/shade/device/ShadeDeviceFailureReason.js +41 -41
- package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +255 -255
- package/src/shade/device/mock/REVIEW_2026_08_22.md +527 -527
- package/src/shade/device/mock/SoftwareGPUBindGroup.js +23 -23
- package/src/shade/device/mock/SoftwareGPUBindGroupLayout.js +22 -22
- package/src/shade/device/mock/SoftwareGPUError.js +63 -63
- package/src/shade/device/mock/SoftwareGPUPipeline.js +75 -75
- package/src/shade/device/mock/SoftwareGPUQuerySet.js +113 -113
- package/src/shade/device/mock/SoftwareGPUSampler.js +30 -30
- package/src/shade/device/mock/SoftwareGPUShaderModule.js +32 -32
- package/src/shade/device/mock/SoftwareGPUTextureView.js +22 -22
- package/src/shade/device/mock/SoftwareGPUUncapturedErrorEvent.js +23 -23
- package/src/shade/device/mock/normalize_dynamic_offsets.js +26 -26
- package/src/shade/device/mock/texture_copy.js +287 -287
- package/src/shade/device/timing/GPUTimer.js +285 -285
- package/src/shade/device/timing/GPUTimerArray.js +205 -205
- package/src/shade/playground/add_random_lights.js +49 -49
- package/src/shade/playground/add_random_meshes.js +83 -83
- package/src/shade/playground/animation_prototype.js +508 -508
- package/src/shade/playground/animation_prototype_skinning.js +647 -647
- package/src/shade/playground/animation_prototype_stress.js +765 -765
- package/src/shade/playground/enable_picker.js +59 -59
- package/src/shade/playground/gltf_skinned_prototype.js +560 -560
- package/src/shade/playground/gltf_skinned_stress_prototype.js +387 -387
- package/src/shade/playground/gltf_viewer.js +282 -282
- package/src/shade/playground/load_default_environment.js +19 -19
- package/src/shade/playground/main.js +2727 -2727
- package/src/shade/playground/make_animated_instances.js +117 -117
- package/src/shade/playground/prototype_virtual_texture.js +274 -274
- package/src/shade/playground/prototype_volumetrics_01.js +206 -206
- package/src/shade/playground/sample.js +234 -234
- package/src/shade/playground/sample_load_gltf.js +102 -102
- package/src/shade/playground/spread_node3d_grid.js +19 -19
- package/src/shade/renderer/Renderer.js +2436 -2436
- package/src/shade/renderer/ShadeIndirectLightingMode.js +14 -14
- package/src/shade/renderer/animation/ShadeAnimationChannel.js +414 -414
- package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +531 -531
- package/src/shade/renderer/animation/pose/PosePlayback.js +55 -55
- package/src/shade/renderer/animation/pose/pose_evaluate_local.js +179 -179
- package/src/shade/renderer/animation/pose/pose_evaluate_world.js +76 -76
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +1024 -1024
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +79 -79
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +56 -56
- package/src/shade/renderer/binding/BindGroupManager.js +282 -282
- package/src/shade/renderer/binding/adapt_cache_capacity.js +25 -25
- package/src/shade/renderer/buffer/GPUBufferAllocator.js +116 -116
- package/src/shade/renderer/buffer/buffer_pool_ops.js +123 -123
- package/src/shade/renderer/buffer/table/GPU_DATABASE_PAGE_SIZE.js +9 -9
- package/src/shade/renderer/buffer/table/GPU_DATABASE_UPLOAD_BUFFER_LIMIT.js +8 -8
- package/src/shade/renderer/buffer/table/PageBufferPool.js +71 -71
- package/src/shade/renderer/buffer/table/PageSlotAllocator.js +95 -95
- package/src/shade/renderer/camera/Camera.js +281 -281
- package/src/shade/renderer/camera/GPUCameraContext.js +233 -233
- package/src/shade/renderer/camera/orbital/README.md +84 -84
- package/src/shade/renderer/deferred/shader_composite_volumetrics.js +75 -75
- package/src/shade/renderer/dynamic/DYNAMIC_MESH_VERTEX.js +25 -25
- package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.js +342 -342
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +170 -170
- package/src/shade/renderer/extension/FrameContext.js +263 -263
- package/src/shade/renderer/extension/FramePhase.js +104 -104
- package/src/shade/renderer/extension/FrameRecord.js +126 -126
- package/src/shade/renderer/extension/GBufferTextures.js +83 -83
- package/src/shade/renderer/extension/PresentTarget.js +34 -34
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
- package/src/shade/renderer/extension/RenderExtension.js +69 -69
- package/src/shade/renderer/extension/RenderExtensionRegistry.js +319 -319
- package/src/shade/renderer/extension/SceneColor.js +40 -40
- package/src/shade/renderer/extension/ViewTextures.js +78 -78
- package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +182 -182
- package/src/shade/renderer/geometry/Geometry.js +608 -608
- package/src/shade/renderer/geometry/geometry_build_from_meshlet_geometry.js +342 -342
- package/src/shade/renderer/geometry/meshlet_geometry_transfer.js +41 -41
- package/src/shade/renderer/geometry/primitives/make_box_geometry.js +153 -153
- package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +240 -240
- package/src/shade/renderer/geometry/primitives/make_plane_geometry.js +145 -145
- package/src/shade/renderer/geometry/primitives/make_polyhedron_geometry.js +327 -327
- package/src/shade/renderer/geometry/primitives/make_torus_geometry.js +107 -107
- package/src/shade/renderer/geometry/primitives/make_torus_knot_geometry.js +165 -165
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +607 -607
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +66 -66
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildResult.js +32 -32
- package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.js +103 -103
- package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.js +25 -25
- package/src/shade/renderer/geometry/virtual/build/VGeoLevel.js +33 -33
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.js +62 -62
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.js +49 -49
- package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.js +20 -20
- package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.js +214 -214
- package/src/shade/renderer/geometry/virtual/build/gltf/GltfByteSource.js +122 -122
- package/src/shade/renderer/geometry/virtual/build/gltf/GltfCollectReport.js +29 -29
- package/src/shade/renderer/geometry/virtual/build/gltf/GltfDocument.js +210 -210
- package/src/shade/renderer/geometry/virtual/build/gltf/GltfGeometry.js +48 -48
- package/src/shade/renderer/geometry/virtual/build/gltf/GltfGeometryInstance.js +25 -25
- package/src/shade/renderer/geometry/virtual/build/gltf/GltfGeometrySelection.js +28 -28
- package/src/shade/renderer/geometry/virtual/build/gltf/gltf_collect_geometries.js +296 -296
- package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +166 -166
- package/src/shade/renderer/geometry/virtual/build/gltf/gltf_read_geometry.js +199 -199
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.js +173 -173
- package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.js +28 -28
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +200 -200
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.js +1786 -1786
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.js +157 -157
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.js +26 -26
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.js +75 -75
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.js +143 -143
- package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.js +44 -44
- package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.js +41 -41
- package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.js +71 -71
- package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.js +123 -123
- package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.js +26 -26
- package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.js +112 -112
- package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.js +56 -56
- package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.js +70 -70
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.js +187 -187
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.js +207 -207
- package/src/shade/renderer/geometry/virtual/format/VGEO_DEFECT.js +18 -18
- package/src/shade/renderer/geometry/virtual/format/VGeoDefect.js +38 -38
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +64 -64
- package/src/shade/renderer/geometry/virtual/format/attribute/VGEO_ATTRIBUTE.js +13 -13
- package/src/shade/renderer/geometry/virtual/format/attribute/VGEO_ATTRIBUTES.js +50 -50
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attribute_allocate.js +28 -28
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attribute_mask.js +23 -23
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js +31 -31
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.js +32 -32
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js +46 -46
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.js +19 -19
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_test_fixtures.js +27 -27
- package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_asset_id_preimage.js +62 -62
- package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_asset_id.js +13 -13
- package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_directory_block_checksum.js +41 -41
- package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_frame_checksum.js +41 -41
- package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_header_checksum.js +25 -25
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.js +20 -20
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_RECORD_SIZE.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_MAX_CHILD_REF.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_MAX_CLUSTER_TRIANGLE_COUNT.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_MAX_CLUSTER_VERTEX_COUNT.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_NO_CHILD.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_NO_GROUP.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_SAME_PAGE.js +6 -6
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +81 -81
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryGroup.js +37 -37
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryPageNode.js +55 -55
- package/src/shade/renderer/geometry/virtual/format/directory/VGEO_DIRECTORY_BLOCK_RECORDS.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/directory/VGEO_DIRECTORY_FLAG_ROOT_PAGE.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/directory/VGEO_DIRECTORY_RECORD_SIZE.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/directory/vgeo_directory_block_count.js +12 -12
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CHILD_OFFSET.js +11 -11
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CHILD_TABLE_ENTRY_SIZE.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.js +11 -11
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_RAW.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_FRAME_ALIGNMENT.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_FRAME_HEADER_SIZE.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_FRAME_OFFSET.js +13 -13
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_PAGE_MAGIC.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/frame/VGeoFrameBlob.js +21 -21
- package/src/shade/renderer/geometry/virtual/format/frame/VGeoFrameExtent.js +59 -59
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.js +27 -27
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.js +84 -84
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +56 -56
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.js +35 -35
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_scan_frames.js +74 -74
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +6 -6
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_HASH_ALGO_XXH3.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_OFFSET.js +31 -31
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_SIZE.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_LEVEL_OFFSET.js +20 -20
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_LEVEL_RECORD_SIZE.js +9 -9
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAGIC.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_PAYLOAD_ENCODING_SHADE_MESHLET_V1.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/header/VGeoLevelRecord.js +41 -41
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_RECORD_SIZE.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_GROUP_CLUSTER_COUNT.js +6 -6
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_METRIC_OFFSET.js +21 -21
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_METRIC_SIZE.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_FANOUT.js +9 -9
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_FLAG_LEAF.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_OFFSET.js +10 -10
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_RECORD_SIZE.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_HEADER_SIZE.js +5 -5
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +16 -16
- package/src/shade/renderer/geometry/virtual/format/payload/VGEO_ENCODING_FLAGS_MASK.js +6 -6
- package/src/shade/renderer/geometry/virtual/format/payload/VGeoEncodedPayload.js +18 -18
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +200 -200
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_payload_attribute_offset.js +39 -39
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_payload_size.js +20 -20
- package/src/shade/renderer/geometry/virtual/format/prototypeVGEOFormatViewer.js +2063 -2063
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +1622 -1622
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +485 -485
- package/src/shade/renderer/gpu_primitive/sort/ffx/graph_radix_sort.js +115 -115
- package/src/shade/renderer/gpu_primitive/sort/one_sweep/verify_radix_sort_one_sweep.js +110 -110
- package/src/shade/renderer/light/environment/octahedral_resample_kernel.js +50 -50
- package/src/shade/renderer/light/environment/octahedral_uv_to_direction.js +30 -30
- package/src/shade/renderer/light/environment/resample_cube_to_octahedral.js +157 -157
- package/src/shade/renderer/light/make_sunlight.js +35 -35
- package/src/shade/renderer/light/model/io/light_record_point.js +39 -39
- package/src/shade/renderer/loader/gltf/GLTF_PRIMITIVE_MODE.js +23 -23
- package/src/shade/renderer/loader/gltf/MESHOPT_COMPRESSION_PLAN.md +793 -793
- package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtension.js +54 -54
- package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtensionSet.js +109 -109
- package/src/shade/renderer/loader/gltf/ext/gltf_apply_buffer_view_extensions.js +69 -69
- package/src/shade/renderer/loader/gltf/ext/gltf_buffer_view_extensions.js +22 -22
- package/src/shade/renderer/loader/gltf/ext/gltf_geometry_extensions.js +39 -39
- package/src/shade/renderer/loader/gltf/ext/meshopt/MeshoptBufferViewExtension.js +301 -301
- package/src/shade/renderer/loader/gltf/gltf_component_type.js +223 -223
- package/src/shade/renderer/loader/gltf/gltf_node_world_matrices.js +137 -137
- package/src/shade/renderer/loader/gltf/gltf_parse_container.js +241 -241
- package/src/shade/renderer/loader/gltf/gltf_read_accessor.js +294 -294
- package/src/shade/renderer/loader/gltf/gltf_used_image_indices.js +49 -49
- package/src/shade/renderer/loader/gltf/load_gltf.js +1253 -1253
- package/src/shade/renderer/loader/gltf/tiny-gltf.js +646 -646
- package/src/shade/renderer/loader/usd/UsdError.js +33 -33
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.js +69 -69
- package/src/shade/renderer/loader/usd/load_usd.js +226 -226
- package/src/shade/renderer/loader/usd/parse_usda.js +931 -931
- package/src/shade/renderer/loader/usd/unpack_usdz.js +106 -106
- package/src/shade/renderer/loader/usd/usd_build_scene.js +658 -658
- package/src/shade/renderer/loader/usd/usd_compose_transform.js +258 -258
- package/src/shade/renderer/loader/usd/usd_decode_image.js +384 -384
- package/src/shade/renderer/loader/usd/usd_lz4.js +182 -182
- package/src/shade/renderer/loader/usd/usd_triangulate.js +159 -159
- package/src/shade/renderer/material/ShadeMaterial.d.ts +2 -2
- package/src/shade/renderer/material/ShadeMaterial.js +2 -2
- package/src/shade/renderer/material/standard/fragment_gbuffer.js +334 -334
- package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
- package/src/shade/renderer/material/standard/material_gbuffer_vertex.js +45 -45
- package/src/shade/renderer/material/standard_material_to_struct.js +23 -23
- package/src/shade/renderer/particles/prototypeParticleSystem.js +450 -450
- package/src/shade/renderer/particles/runtime/spawn_request_encoding.js +52 -52
- package/src/shade/renderer/pool/TransientResourcePool.js +392 -392
- package/src/shade/renderer/postprocess/bloom/bloom_chain_resolution.js +29 -29
- package/src/shade/renderer/postprocess/bloom/graph_bloom_downsample.js +109 -109
- package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.js +155 -155
- package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +114 -114
- package/src/shade/renderer/postprocess/dof/DOF_AUTOFOCUS_PARAMS_STRUCT.js +25 -25
- package/src/shade/renderer/postprocess/dof/DOF_FOCUS_STATE_STRUCT.js +23 -23
- package/src/shade/renderer/postprocess/dof/DOF_PRESETS.js +27 -27
- package/src/shade/renderer/postprocess/dof/chunk_dof_coc_band_diameter.js +41 -41
- package/src/shade/renderer/postprocess/dof/chunk_dof_coc_band_radius.js +32 -32
- package/src/shade/renderer/postprocess/dof/chunk_dof_coc_coefficient.js +26 -26
- package/src/shade/renderer/postprocess/dof/compute_dof_autofocus_params.js +64 -64
- package/src/shade/renderer/postprocess/dof/compute_dof_uniform.js +54 -54
- package/src/shade/renderer/postprocess/dof/gather/DOF2_CONFIG.js +91 -91
- package/src/shade/renderer/postprocess/dof/gather/DOF2_PRESETS.js +9 -9
- package/src/shade/renderer/postprocess/dof/gather/DOF2_SETTINGS_STRUCT.js +66 -66
- package/src/shade/renderer/postprocess/dof/gather/DOF2_TEXTURE_FORMAT.js +22 -22
- package/src/shade/renderer/postprocess/dof/gather/DepthOfFieldU.js +292 -292
- package/src/shade/renderer/postprocess/dof/gather/chunk_dof2_coc_to_near_far.js +25 -25
- package/src/shade/renderer/postprocess/dof/gather/chunk_dof2_gather_weight.js +30 -30
- package/src/shade/renderer/postprocess/dof/gather/compute_dof2_uniform.js +54 -54
- package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +194 -194
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_fill.js +68 -68
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +140 -140
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +142 -142
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +99 -99
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +102 -102
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_tile_dilate.js +75 -75
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_tile_max.js +73 -73
- package/src/shade/renderer/postprocess/dof/raymarch/DOF_SETTINGS_STRUCT.js +49 -49
- package/src/shade/renderer/postprocess/dof/raymarch/DepthOfField.js +298 -298
- package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +244 -244
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +91 -91
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_firefly_cleanup.js +61 -61
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +90 -90
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +267 -267
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +271 -271
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_tile_dilate.js +70 -70
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_tile_max.js +72 -72
- package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +99 -99
- package/src/shade/renderer/postprocess/gtao/generate_magic_square_noise.js +51 -51
- package/src/shade/renderer/postprocess/motion_blur/MotionBlur.js +56 -56
- package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +78 -78
- package/src/shade/renderer/postprocess/upscale-dither/UpscaleDither.js +95 -95
- package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +204 -204
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +58 -58
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +230 -230
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +278 -278
- package/src/shade/renderer/rasterize/native/oit/chunk_material_side_should_draw.js +26 -26
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +235 -235
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +208 -208
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +206 -206
- package/src/shade/renderer/scene/DynamicMesh.js +70 -70
- package/src/shade/renderer/scene/DynamicMeshBatch.js +90 -90
- package/src/shade/renderer/scene/GPUSceneContext.js +901 -901
- package/src/shade/renderer/scene/SceneNodeBinding.js +56 -56
- package/src/shade/renderer/scene/SkinnedMesh.js +55 -55
- package/src/shade/renderer/scene/TransformAuthority.js +33 -33
- package/src/shade/renderer/scene/optimization/deduplicate_geometries.js +38 -38
- package/src/shade/renderer/scene/optimization/deduplicate_images.js +93 -93
- package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.js +127 -127
- package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.js +492 -492
- package/src/shade/renderer/scene/optimization/optimize_texture_set.js +81 -81
- package/src/shade/renderer/scene/optimization/source_to_sampler2d.js +21 -21
- package/src/shade/renderer/scene/serialization/STANDARD_MATERIAL_SERIALIZED_BYTE_SIZE.js +12 -12
- package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_transform_point.js +26 -26
- package/src/shade/renderer/shader/chunk/noise/chunk_interleaved_gradient_noise.js +20 -20
- package/src/shade/renderer/shader/chunk/spherical_harmonics/dering/chunk_sh2_dering_optimize_positive.js +61 -61
- package/src/shade/renderer/shader/chunk/texture/chunk_texture_filter_fxaa_lite.js +225 -225
- package/src/shade/renderer/shader/chunk/texture/dither/chunk_dither_color_8bit_gradient_noise.js +25 -25
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +384 -384
- package/src/shade/renderer/shadow/map/PointLightShadowmap.js +105 -105
- package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +63 -63
- package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +89 -89
- package/src/shade/renderer/shadow/map/shadowmap_update_score.js +232 -232
- package/src/shade/renderer/texture/GPUTextureAllocator.js +85 -85
- package/src/shade/renderer/texture/texture_pool_ops.js +171 -171
- package/src/shade/renderer/texture/virtual/PageTableQuadAllocator.js +253 -253
- package/src/shade/renderer/texture/virtual/README.md +276 -276
- package/src/shade/renderer/texture/virtual/VTPageTable.js +330 -330
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +349 -349
- package/src/shade/renderer/texture/virtual/VT_CONSTANTS.js +154 -154
- package/src/shade/renderer/texture/virtual/VT_STACK_INFO_STRUCT.js +20 -20
- package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +1276 -1276
- package/src/shade/renderer/texture/virtual/VirtualTextureStack.js +106 -106
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +150 -150
- package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +232 -232
- package/src/shade/renderer/texture/virtual/chunk_vt_request_key.js +28 -28
- package/src/shade/renderer/texture/virtual/source/VTSourceImage.js +207 -207
- package/src/shade/renderer/texture/virtual/source/VTSourceProcedural.js +135 -135
- package/src/shade/renderer/texture/virtual/source/VTSourceTiled.js +132 -132
- package/src/shade/renderer/water/GPUWaterRenderer.js +167 -167
- package/src/shade/renderer/water/shader_water.js +246 -246
- package/src/shade/renderer/water/water_height_texture_from_sampler.js +56 -56
- package/src/shade/vitest.setup.mjs +89 -89
- package/src/shade/wgsl/validate_wgsl_source.js +316 -316
- package/src/view/controller/controls/NumericIntervalControl.js +90 -90
- package/src/view/controller/controls/Vector2Control.js +83 -83
- package/src/view/controller/controls/Vector3Control.js +90 -90
- package/src/view/elements/Group.js +56 -56
- package/src/view/elements/drawCheckers.js +33 -33
- package/src/view/elements/windrose/WindRoseDiagram.js +369 -369
- package/src/view/graphics/WebGLContextFailureView.js +76 -76
- package/src/view/layout/DockPanel.js +51 -51
- package/src/view/layout/SplitView.js +365 -365
- package/src/view/layout/show_popup_menu.js +81 -81
- package/src/view/minimap/MinimapCanvasView.js +411 -411
- package/src/view/minimap/MinimapImageCache.js +88 -88
- package/src/view/minimap/MinimapMarkerCollection.d.ts +0 -1
- package/src/view/minimap/MinimapMarkerCollection.d.ts.map +1 -1
- package/src/view/minimap/MinimapMarkerCollection.js +180 -180
- package/src/view/minimap/dom/MinimapCameraView.js +206 -206
- package/src/view/minimap/minimap_focus_area.js +97 -97
- package/editor/process/symbolic/SocketsSymbolicDisplay.js +0 -192
- package/src/core/geom/3d/topology/struct/binary/io/moved_tests.txt +0 -37
- package/src/engine/ecs/attachment/Attachment.d.ts +0 -40
- package/src/engine/ecs/attachment/Attachment.d.ts.map +0 -1
- package/src/engine/ecs/attachment/Attachment.js +0 -57
- package/src/engine/ecs/attachment/AttachmentBinding.d.ts +0 -28
- package/src/engine/ecs/attachment/AttachmentBinding.d.ts.map +0 -1
- package/src/engine/ecs/attachment/AttachmentBinding.js +0 -41
- package/src/engine/ecs/attachment/AttachmentSystem.d.ts +0 -61
- package/src/engine/ecs/attachment/AttachmentSystem.d.ts.map +0 -1
- package/src/engine/ecs/attachment/AttachmentSystem.js +0 -307
- package/src/engine/ecs/attachment/BoneAttachmentBinding.d.ts +0 -27
- package/src/engine/ecs/attachment/BoneAttachmentBinding.d.ts.map +0 -1
- package/src/engine/ecs/attachment/BoneAttachmentBinding.js +0 -69
- package/src/engine/ecs/attachment/TransformAttachmentBinding.d.ts +0 -4
- package/src/engine/ecs/attachment/TransformAttachmentBinding.d.ts.map +0 -1
- package/src/engine/ecs/attachment/TransformAttachmentBinding.js +0 -51
- package/src/engine/ecs/sockets/AttachmentSocket.d.ts +0 -32
- package/src/engine/ecs/sockets/AttachmentSocket.d.ts.map +0 -1
- package/src/engine/ecs/sockets/AttachmentSocket.js +0 -60
- package/src/engine/ecs/sockets/AttachmentSocketType.d.ts +0 -6
- package/src/engine/ecs/sockets/AttachmentSocketType.d.ts.map +0 -1
- package/src/engine/ecs/sockets/AttachmentSocketType.js +0 -8
- package/src/engine/ecs/sockets/AttachmentSockets.d.ts +0 -57
- package/src/engine/ecs/sockets/AttachmentSockets.d.ts.map +0 -1
- package/src/engine/ecs/sockets/AttachmentSockets.js +0 -130
- package/src/engine/ecs/sockets/BoneAttachmentSocket.d.ts +0 -29
- package/src/engine/ecs/sockets/BoneAttachmentSocket.d.ts.map +0 -1
- package/src/engine/ecs/sockets/BoneAttachmentSocket.js +0 -56
- package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts +0 -6
- package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts.map +0 -1
- package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.js +0 -19
- package/src/shade/renderer/animation/_dump_resolve.d.mts +0 -2
- package/src/shade/renderer/animation/_dump_resolve.d.mts.map +0 -1
- package/src/shade/renderer/animation/_dump_resolve.mjs +0 -5
|
@@ -1,646 +1,646 @@
|
|
|
1
|
-
import { BinaryElementPool } from "../../../core/geom/3d/topology/struct/binary/BinaryElementPool.js";
|
|
2
|
-
import { Vector3 } from "../../../core/geom/Vector3.js";
|
|
3
|
-
import { seededRandom } from "../../../core/math/random/seededRandom.js";
|
|
4
|
-
import { INVALID_NODE } from "../../../core/graph/csr/csr_graph_build_distance_field.js";
|
|
5
|
-
import { line3_compute_segment_closest_point_t } from "../../../core/geom/3d/line/line3_compute_segment_closest_point_t.js";
|
|
6
|
-
import { v3_length } from "../../../core/geom/vec3/v3_length.js";
|
|
7
|
-
import { AcousticMedium } from "./core/AcousticMedium.js";
|
|
8
|
-
import { AcousticOccluderIndex } from "./core/AcousticOccluderIndex.js";
|
|
9
|
-
import { AcousticRegionIndex } from "./core/AcousticRegionIndex.js";
|
|
10
|
-
import { AcousticSolution } from "./core/AcousticSolution.js";
|
|
11
|
-
import { ACOUSTIC_SOURCE_STATE_FLOATS, AcousticSourceState } from "./core/AcousticSourceState.js";
|
|
12
|
-
import { OcclusionSolver } from "./core/OcclusionSolver.js";
|
|
13
|
-
import { VolumeField } from "./core/VolumeField.js";
|
|
14
|
-
import { ProbeFieldPathingSolution } from "./probe/ProbeFieldPathingSolution.js";
|
|
15
|
-
import { ProbeVisibilityRecheck } from "./probe/ProbeVisibilityRecheck.js";
|
|
16
|
-
|
|
17
|
-
// module-static scratch solution reused across every instance in apply()
|
|
18
|
-
const SOLUTION = new AcousticSolution();
|
|
19
|
-
|
|
20
|
-
// module-static scratch for the source's world-space forward vector during directivity
|
|
21
|
-
const FORWARD = new Vector3();
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Default ambient atmospheric absorption (dB per metre, per band low/mid/high) for space outside every
|
|
25
|
-
* authored `AcousticVolume`. Anchored at the low band (lows carry any distance), rising toward the highs so
|
|
26
|
-
* distant sources progressively lose their top end. A modest, tunable default — pass your own
|
|
27
|
-
* `defaultMedium` to dial the air thicker/thinner (or zero it for vacuum-clean falloff).
|
|
28
|
-
* @type {number[]}
|
|
29
|
-
*/
|
|
30
|
-
const DEFAULT_AIR_ABSORPTION = [0, 0.03, 0.1];
|
|
31
|
-
|
|
32
|
-
// default RNG seed for deterministic ray jitter (override via the `random_seed` field)
|
|
33
|
-
const DEFAULT_RANDOM_SEED = 1;
|
|
34
|
-
|
|
35
|
-
// module-static scratch for one leg's air absorption while integrating along the leaked polyline
|
|
36
|
-
const PATH_AIRLOSS_LEG = new Float32Array(3);
|
|
37
|
-
|
|
38
|
-
// scratch — per-band directional transfer at a probe (the corner-leak turn gate)
|
|
39
|
-
const TURN_TRANSFER = new Float32Array(3);
|
|
40
|
-
// below this squared leg length an attachment/edge direction is undefined → no directional gate
|
|
41
|
-
const TURN_EPS = 1e-12;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* The acoustic simulation engine: owns the occluder index, the medium volume regions, the solvers, and
|
|
45
|
-
* the per-instance temporal state, and turns a source position into an {@link AcousticSolution} the
|
|
46
|
-
* render seam consumes. ECS-agnostic and WebAudio-agnostic — the ECS systems feed its geometry and the
|
|
47
|
-
* `AudioEmitterSystem` drives {@link apply}; both inject real objects, so it is unit-testable on bare
|
|
48
|
-
* geometry.
|
|
49
|
-
*
|
|
50
|
-
* Tunables are plain settable fields (not an opaque config bag): construct with no arguments, then set
|
|
51
|
-
* `rayCount`, `smoothing`, `random_seed`, `medium`, `pathing`, … after construction to taste.
|
|
52
|
-
*/
|
|
53
|
-
export class AcousticSimulator {
|
|
54
|
-
/**
|
|
55
|
-
* Rays cast per source per tick. Lower + temporal smoothing = cheaper, integrated over frames.
|
|
56
|
-
* @type {number}
|
|
57
|
-
*/
|
|
58
|
-
rayCount = 16;
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* EMA factor for temporal smoothing, (0, 1]. Smaller = smoother / slower to react.
|
|
62
|
-
* @type {number}
|
|
63
|
-
*/
|
|
64
|
-
smoothing = 0.4;
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Engine-wide corner-leakage toggle. Off (default) = zero cost (no path branch, no graph search).
|
|
68
|
-
* On = occluded sources route a leaked send spatialized from their propagation exit point. Requires
|
|
69
|
-
* a probe field with a baked visibility graph ({@link setProbeField}).
|
|
70
|
-
* @type {boolean}
|
|
71
|
-
*/
|
|
72
|
-
pathing = false;
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Re-verify the visibility edges leaks traverse against LIVE geometry (dynamic-geometry policy — a door
|
|
76
|
-
* that closes after the bake re-blocks the leak). Off (default) = the baked graph is trusted as-is.
|
|
77
|
-
* Requires {@link pathing}. The recheck is budgeted ({@link recheckBudget}); a blocked edge is disabled
|
|
78
|
-
* by weight (no topology change), restored when it re-opens.
|
|
79
|
-
* @type {boolean}
|
|
80
|
-
*/
|
|
81
|
-
pathingRecheck = false;
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Max visibility edges re-verified per tick when {@link pathingRecheck} is on (one `anyHit` ray each).
|
|
85
|
-
* Bounds the recheck cost; leftover dirty edges round-robin to later ticks.
|
|
86
|
-
* @type {number}
|
|
87
|
-
*/
|
|
88
|
-
recheckBudget = 8;
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* @type {AcousticOccluderIndex}
|
|
92
|
-
*/
|
|
93
|
-
#occluder_index = new AcousticOccluderIndex();
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Medium regions behind a BVH — blend queries resolve in O(log n) (re-fit each frame for moving volumes).
|
|
97
|
-
* @type {AcousticRegionIndex}
|
|
98
|
-
*/
|
|
99
|
-
#region_index = new AcousticRegionIndex();
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Ambient medium field — its default medium (settable via {@link medium}) fills space outside every
|
|
103
|
-
* authored region.
|
|
104
|
-
* @type {VolumeField}
|
|
105
|
-
*/
|
|
106
|
-
#volumeField = new VolumeField(AcousticMedium.from(DEFAULT_AIR_ABSORPTION));
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* @type {OcclusionSolver}
|
|
110
|
-
*/
|
|
111
|
-
#occlusionSolver = new OcclusionSolver();
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Live-instance → its temporal-state record id in {@link #statePool}. The state DATA lives in the
|
|
115
|
-
* pool (flat floats); this map only holds the id relation. Audio events are highly transient (a
|
|
116
|
-
* burst of one-shots), so pooling the records avoids per-source object churn — freed slots are
|
|
117
|
-
* recycled, not GC'd.
|
|
118
|
-
* @type {Map<EventInstance, number>}
|
|
119
|
-
*/
|
|
120
|
-
#stateIds = new Map();
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Backing store for per-source {@link AcousticSourceState} records (one record =
|
|
124
|
-
* {@link ACOUSTIC_SOURCE_STATE_FLOATS} float32s).
|
|
125
|
-
* @type {BinaryElementPool}
|
|
126
|
-
*/
|
|
127
|
-
#statePool = new BinaryElementPool(ACOUSTIC_SOURCE_STATE_FLOATS * Float32Array.BYTES_PER_ELEMENT);
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* One reusable cursor, re-pointed at each live instance's pool record per tick (zero-alloc).
|
|
131
|
-
* @type {AcousticSourceState}
|
|
132
|
-
*/
|
|
133
|
-
#stateCursor = new AcousticSourceState();
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Seeded RNG for deterministic ray jitter. Re-created when {@link random_seed} is set.
|
|
137
|
-
* @type {function():number}
|
|
138
|
-
*/
|
|
139
|
-
#random = seededRandom(DEFAULT_RANDOM_SEED);
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* The current RNG seed (backs {@link random_seed}).
|
|
143
|
-
* @type {number}
|
|
144
|
-
*/
|
|
145
|
-
#randomSeed = DEFAULT_RANDOM_SEED;
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Reused scratch set for pruning ended-instance state in {@link apply} (allocation-free).
|
|
149
|
-
* @type {Set<EventInstance>}
|
|
150
|
-
*/
|
|
151
|
-
#liveScratch = new Set();
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Baked probe field whose visibility graph drives pathing (corner-leakage). Null until
|
|
155
|
-
* {@link setProbeField}.
|
|
156
|
-
* @type {AcousticProbeField|null}
|
|
157
|
-
*/
|
|
158
|
-
#probeField = null;
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Budgeted incremental visibility recheck over the probe-visibility graph (dynamic geometry — a door
|
|
162
|
-
* that closes after the bake). Null unless {@link pathingRecheck} is on and a field is set; created
|
|
163
|
-
* alongside the pathing solution. Edges traversed by leaks are marked here and re-verified within budget.
|
|
164
|
-
* @type {ProbeVisibilityRecheck|null}
|
|
165
|
-
*/
|
|
166
|
-
#visibilityRecheck = null;
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Per-frame exit-field solver over {@link #probeField}'s visibility graph (corner-leakage). Lazily
|
|
170
|
-
* (re)created the first time pathing runs against the current field, then reused across frames.
|
|
171
|
-
* @type {ProbeFieldPathingSolution|null}
|
|
172
|
-
*/
|
|
173
|
-
#pathingSolution = null;
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* RNG seed for deterministic ray jitter. Setting it re-seeds the generator (resets the jitter stream).
|
|
177
|
-
* Default {@link DEFAULT_RANDOM_SEED}.
|
|
178
|
-
* @returns {number}
|
|
179
|
-
*/
|
|
180
|
-
get random_seed() {
|
|
181
|
-
return this.#randomSeed;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
set random_seed(seed) {
|
|
185
|
-
this.#randomSeed = seed;
|
|
186
|
-
this.#random = seededRandom(seed);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* The default medium for space outside every authored `AcousticVolume` region (ambient air). Default: a
|
|
191
|
-
* modest atmospheric absorption ({@link DEFAULT_AIR_ABSORPTION}); set it to dial the air thicker/thinner
|
|
192
|
-
* (or zero it for vacuum-clean falloff).
|
|
193
|
-
* @returns {AcousticMedium}
|
|
194
|
-
*/
|
|
195
|
-
get medium() {
|
|
196
|
-
return this.#volumeField.defaultMedium;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
set medium(medium) {
|
|
200
|
-
this.#volumeField.defaultMedium = medium;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* The occluder index, for offline baking (reverb / visibility) against the same scene geometry the
|
|
205
|
-
* runtime occludes with.
|
|
206
|
-
* @returns {AcousticOccluderIndex}
|
|
207
|
-
*/
|
|
208
|
-
get occluderIndex() {
|
|
209
|
-
return this.#occluder_index;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Register an occluder shape, placed by `matrix` (its canonical frame is local; the matrix is the
|
|
214
|
-
* world transform).
|
|
215
|
-
* @param {AbstractShape3D} shape
|
|
216
|
-
* @param {AcousticMaterial} material
|
|
217
|
-
* @param {Float32Array|number[]} [matrix]
|
|
218
|
-
* @returns {number} occluder handle
|
|
219
|
-
*/
|
|
220
|
-
addOccluder(shape, material, matrix) {
|
|
221
|
-
return this.#occluder_index.addBody(shape, material, matrix);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* @param {number} handle
|
|
226
|
-
* @param {Float32Array|number[]} matrix
|
|
227
|
-
*/
|
|
228
|
-
setOccluderTransform(handle, matrix) {
|
|
229
|
-
this.#occluder_index.setTransform(handle, matrix);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* @param {number} handle
|
|
234
|
-
*/
|
|
235
|
-
removeOccluder(handle) {
|
|
236
|
-
this.#occluder_index.removeBody(handle);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* @param {AcousticVolumeRegion} region
|
|
241
|
-
* @returns {AcousticVolumeRegion} the same region (for handle-keeping)
|
|
242
|
-
*/
|
|
243
|
-
addRegion(region) {
|
|
244
|
-
return this.#region_index.add(region);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* @param {AcousticVolumeRegion} region
|
|
249
|
-
*/
|
|
250
|
-
removeRegion(region) {
|
|
251
|
-
this.#region_index.remove(region);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* The baked probe field currently wired in (for pathing + probe reverb), or null if none. Paired with the
|
|
256
|
-
* {@link occluderIndex} it is what an offline re-bake (e.g. after deserialization) runs against.
|
|
257
|
-
* @returns {AcousticProbeField|null}
|
|
258
|
-
*/
|
|
259
|
-
get probeField() {
|
|
260
|
-
return this.#probeField;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Provide the baked probe field (with a visibility graph) that pathing routes through, or `null` to
|
|
265
|
-
* clear it. Required before {@link pathing} has any effect. The exit-field solver is dropped and lazily
|
|
266
|
-
* rebuilt for the new field.
|
|
267
|
-
* @param {AcousticProbeField|null} field a field with a baked visibility graph ({@link bakeVisibility})
|
|
268
|
-
*/
|
|
269
|
-
setProbeField(field) {
|
|
270
|
-
this.#probeField = field;
|
|
271
|
-
this.#pathingSolution = null;
|
|
272
|
-
this.#visibilityRecheck = null; // rebuilt against the new field (and its graph) on the next tick
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Compute the full acoustic solution for a source at `source`, given `listener`, into `out`.
|
|
277
|
-
* @param {Vector3} listener
|
|
278
|
-
* @param {Vector3} source
|
|
279
|
-
* @param {number} sourceRadius apparent radius of the source (per-source; 0 = point source). For
|
|
280
|
-
* volumetric (fractional) occlusion.
|
|
281
|
-
* @param {AcousticSourceState} state per-source temporal accumulation (mutated)
|
|
282
|
-
* @param {AcousticSolution} out
|
|
283
|
-
*/
|
|
284
|
-
solveFor(listener, source, sourceRadius, state, out) {
|
|
285
|
-
out.reset();
|
|
286
|
-
|
|
287
|
-
// air absorption integrated over the actual source→listener path (distance-dependent, per band)
|
|
288
|
-
this.#volumeField.integrateAbsorption(
|
|
289
|
-
this.#region_index,
|
|
290
|
-
source.x, source.y, source.z,
|
|
291
|
-
listener.x, listener.y, listener.z,
|
|
292
|
-
out.airLoss
|
|
293
|
-
);
|
|
294
|
-
|
|
295
|
-
this.#occlusionSolver.solve(
|
|
296
|
-
listener, source, sourceRadius,
|
|
297
|
-
this.#occluder_index, this.rayCount, this.smoothing, this.#random,
|
|
298
|
-
state, out
|
|
299
|
-
);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
* Solve + push the result to every live instance. Each instance must expose a `position` (Vector3)
|
|
304
|
-
* and `setAcoustic(solution)`. Called once per frame by the `AudioEmitterSystem`, between the live-set
|
|
305
|
-
* refresh and the sopra tick.
|
|
306
|
-
* @param {EventInstance[]} liveInstances bounded set (≤ voice budget)
|
|
307
|
-
* @param {Vector3} listener
|
|
308
|
-
*/
|
|
309
|
-
apply(liveInstances, listener) {
|
|
310
|
-
const live = this.#liveScratch;
|
|
311
|
-
live.clear();
|
|
312
|
-
|
|
313
|
-
// re-fit moving volumes' BVH leaves once per frame (regions track Transform.position by reference),
|
|
314
|
-
// so this frame's blend queries see current positions.
|
|
315
|
-
this.#region_index.refit();
|
|
316
|
-
|
|
317
|
-
// pathing (corner-leakage): one single-source pass from the listener serves every source's exit
|
|
318
|
-
const pathing = this.pathing && this.#probeField !== null && this.#probeField.hasVisibility;
|
|
319
|
-
// The exit field is usable only once the listener has snapped to a VISIBLE probe + solved this frame;
|
|
320
|
-
// if the listener can see no probe, pathing is off for every source this frame (no stale field).
|
|
321
|
-
let exitFieldReady = false;
|
|
322
|
-
if (pathing) {
|
|
323
|
-
if (this.#pathingSolution === null) {
|
|
324
|
-
this.#pathingSolution = new ProbeFieldPathingSolution(this.#probeField.size);
|
|
325
|
-
}
|
|
326
|
-
if (this.pathingRecheck && this.#visibilityRecheck === null) {
|
|
327
|
-
this.#visibilityRecheck = new ProbeVisibilityRecheck(this.#probeField, this.#occluder_index);
|
|
328
|
-
}
|
|
329
|
-
// Snap to the nearest probe the listener can SEE — never one occluded by a wall/floor (a different
|
|
330
|
-
// acoustic region), which would route a spurious cross-occluder detour or none at all.
|
|
331
|
-
const listenerProbe = this.#probeField.nearestVisibleIndex(listener.x, listener.y, listener.z, this.#occluder_index);
|
|
332
|
-
if (listenerProbe >= 0) {
|
|
333
|
-
this.#pathingSolution.computeExitField(this.#probeField.visibilityGraph, listenerProbe);
|
|
334
|
-
exitFieldReady = true;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
const pool = this.#statePool;
|
|
339
|
-
const cursor = this.#stateCursor;
|
|
340
|
-
|
|
341
|
-
for (let i = 0; i < liveInstances.length; i++) {
|
|
342
|
-
const instance = liveInstances[i];
|
|
343
|
-
|
|
344
|
-
live.add(instance);
|
|
345
|
-
|
|
346
|
-
let id = this.#stateIds.get(instance);
|
|
347
|
-
|
|
348
|
-
if (id === undefined) {
|
|
349
|
-
id = pool.allocate();
|
|
350
|
-
this.#stateIds.set(instance, id);
|
|
351
|
-
// the pool view may have grown during allocate — bind the current one, then clear the
|
|
352
|
-
// (possibly recycled) record to its cold state before the first solve.
|
|
353
|
-
cursor.rebind(pool.data_float32, pool.element_word(id));
|
|
354
|
-
cursor.reset();
|
|
355
|
-
} else {
|
|
356
|
-
cursor.rebind(pool.data_float32, pool.element_word(id));
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
this.solveFor(listener, instance.position, instance.sourceRadius, cursor, SOLUTION);
|
|
360
|
-
|
|
361
|
-
if (exitFieldReady) {
|
|
362
|
-
this.#applyPath(SOLUTION, instance, listener);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// source radiation directivity (skipped for omni sources — the common case, zero cost)
|
|
366
|
-
const directivity = instance.directivity;
|
|
367
|
-
if (directivity && !directivity.isOmni) {
|
|
368
|
-
this.#applyDirectivity(SOLUTION, instance, listener);
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
instance.setAcoustic(SOLUTION);
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
// release pool records for instances no longer live (ended / demoted) — keeps the live set
|
|
375
|
-
// bounded without per-instance lifecycle wiring; freed ids are recycled by the next allocate.
|
|
376
|
-
if (this.#stateIds.size > live.size) {
|
|
377
|
-
for (const instance of this.#stateIds.keys()) {
|
|
378
|
-
if (!live.has(instance)) {
|
|
379
|
-
pool.release(this.#stateIds.get(instance));
|
|
380
|
-
this.#stateIds.delete(instance);
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// dynamic-geometry policy: re-verify (within budget) the visibility edges the leaks just traversed,
|
|
386
|
-
// disabling/restoring them against live geometry. The updated weights take effect next frame's solve.
|
|
387
|
-
// Gated on the LIVE flag (not just the object), so toggling pathingRecheck off stops marking + rechecking
|
|
388
|
-
// immediately; the object persists for cheap re-enable.
|
|
389
|
-
if (this.pathingRecheck && this.#visibilityRecheck !== null) {
|
|
390
|
-
this.#visibilityRecheck.update(this.recheckBudget);
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
live.clear();
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* Fill the path (corner-leakage) fields of `solution` for a source, using the exit field computed this
|
|
398
|
-
* frame. The leaked level grows with occlusion (more blocked → more of the sound arrives via the path) and
|
|
399
|
-
* falls with routed length; no path → fields left cleared.
|
|
400
|
-
*
|
|
401
|
-
* The source and listener are not graph vertices: each is VIRTUALIZED onto its adjacent corridor edge (the
|
|
402
|
-
* nearest point via line3 closest-point), so the attachment legs are the true geometry rather than a dart to
|
|
403
|
-
* the probe centre — a probe sitting just past an endpoint no longer folds a there-and-back bend into the
|
|
404
|
-
* route, and a standoff/oblique endpoint attenuates instead of under-counting. The distance falloff is the
|
|
405
|
-
* SOURCE's own authored attenuation curve evaluated at the routed length = source-leg + corridor span +
|
|
406
|
-
* listener-leg (the corridor span is the graph distance, less the partial first/last edges the virtual
|
|
407
|
-
* points cut off). The curve — with its `distanceMax` — is where a source's audible range legitimately
|
|
408
|
-
* lives; the simulator carries no presumptuous global scale of its own.
|
|
409
|
-
*
|
|
410
|
-
* Once the leak is known audible, a single walk of the polyline (source-probe → … → listener-probe, via
|
|
411
|
-
* `nextProbe`) integrates AIR ABSORPTION per leg (the longer route darkens more than the direct line) and
|
|
412
|
-
* marks each traversed edge for the budgeted visibility recheck — an out-of-range leak returns BEFORE the
|
|
413
|
-
* walk, so it spends no recheck budget. DIRECTIVITY-on-leak scales the gain by the source's radiation toward
|
|
414
|
-
* the first hop (the corner it leaks through), not the blocked listener.
|
|
415
|
-
* @param {AcousticSolution} solution (occlusion already solved)
|
|
416
|
-
* @param {EventInstance} instance the source (position + attenuation + orientation + directivity)
|
|
417
|
-
* @param {Vector3} listener the listener world position (the leak's far endpoint)
|
|
418
|
-
*/
|
|
419
|
-
#applyPath(solution, instance, listener) {
|
|
420
|
-
const field = this.#probeField;
|
|
421
|
-
const pathingSolution = this.#pathingSolution;
|
|
422
|
-
const source = instance.position;
|
|
423
|
-
|
|
424
|
-
const sourceProbe = field.nearestVisibleIndex(source.x, source.y, source.z, this.#occluder_index);
|
|
425
|
-
|
|
426
|
-
if (sourceProbe < 0) {
|
|
427
|
-
return;
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
const exit = pathingSolution.exit[sourceProbe];
|
|
431
|
-
|
|
432
|
-
if (exit === INVALID_NODE) {
|
|
433
|
-
return;
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
// The corridor endpoints, derivable WITHOUT walking: `firstHop` is the source-probe's first hop toward
|
|
437
|
-
// the listener; the gateway `exit` is the probe adjacent to the listener's probe (the last hop); and the
|
|
438
|
-
// listener's probe — the exit-field root — is one hop past the gateway. All valid here: exit and next go
|
|
439
|
-
// INVALID together (both only at the root / an unreachable source) and exit===INVALID already returned,
|
|
440
|
-
// and `exit` is a NEIGHBOUR of the root, so next[exit] IS the root.
|
|
441
|
-
const firstHop = pathingSolution.next[sourceProbe];
|
|
442
|
-
const listenerProbe = pathingSolution.next[exit];
|
|
443
|
-
|
|
444
|
-
const spx = field.probeX(sourceProbe), spy = field.probeY(sourceProbe), spz = field.probeZ(sourceProbe);
|
|
445
|
-
const fhx = field.probeX(firstHop), fhy = field.probeY(firstHop), fhz = field.probeZ(firstHop);
|
|
446
|
-
const lhx = field.probeX(exit), lhy = field.probeY(exit), lhz = field.probeZ(exit);
|
|
447
|
-
const lpx = field.probeX(listenerProbe), lpy = field.probeY(listenerProbe), lpz = field.probeZ(listenerProbe);
|
|
448
|
-
|
|
449
|
-
// Virtualize the dynamic endpoints onto their adjacent edges (line3 closest point) rather than darting
|
|
450
|
-
// to the probe vertex: (a) avoids the spurious there-and-back bend a probe sitting just past the
|
|
451
|
-
// endpoint would fold into the route (the transfer gate would wrongly refuse it), and (b) lets the
|
|
452
|
-
// attachment legs count toward the routed distance, so a standoff / oblique endpoint attenuates.
|
|
453
|
-
const tS = line3_compute_segment_closest_point_t(spx, spy, spz, fhx, fhy, fhz, source.x, source.y, source.z);
|
|
454
|
-
const sX = spx + (fhx - spx) * tS, sY = spy + (fhy - spy) * tS, sZ = spz + (fhz - spz) * tS;
|
|
455
|
-
const sourceLeg = Math.hypot(source.x - sX, source.y - sY, source.z - sZ);
|
|
456
|
-
const firstEdgeLen = Math.hypot(fhx - spx, fhy - spy, fhz - spz);
|
|
457
|
-
|
|
458
|
-
const tL = line3_compute_segment_closest_point_t(lhx, lhy, lhz, lpx, lpy, lpz, listener.x, listener.y, listener.z);
|
|
459
|
-
const lX = lhx + (lpx - lhx) * tL, lY = lhy + (lpy - lhy) * tL, lZ = lhz + (lpz - lhz) * tL;
|
|
460
|
-
const listenerLeg = Math.hypot(listener.x - lX, listener.y - lY, listener.z - lZ);
|
|
461
|
-
const lastEdgeLen = Math.hypot(lpx - lhx, lpy - lhy, lpz - lhz);
|
|
462
|
-
|
|
463
|
-
// Corridor span between the two virtual attach points. A SINGLE-edge route (firstHop IS the listener's
|
|
464
|
-
// probe) projects both endpoints onto that ONE edge, so the span is just their |arc| gap. The
|
|
465
|
-
// graph-distance subtraction (the general case) assumes DISTINCT first/last edges — for one shared edge
|
|
466
|
-
// it would mis-sign a tS>tL crossing; for distinct edges it is exactly (1−tS)·first + middle + tL·last,
|
|
467
|
-
// which is ≥ 0 by construction (the partial edges sum to ≤ dist).
|
|
468
|
-
const corridor = firstHop === listenerProbe
|
|
469
|
-
? Math.abs(tL - tS) * firstEdgeLen
|
|
470
|
-
: pathingSolution.dist[sourceProbe] - tS * firstEdgeLen - (1 - tL) * lastEdgeLen;
|
|
471
|
-
|
|
472
|
-
const falloff = Math.max(0, instance.description.attenuation.evaluate(sourceLeg + corridor + listenerLeg));
|
|
473
|
-
|
|
474
|
-
if (falloff <= 0) {
|
|
475
|
-
return; // out of audible range — bail BEFORE the walk, so an inaudible leak spends no recheck budget
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
// pathGain is the BROADBAND geometric leak strength (occlusion × distance falloff × directivity × turn
|
|
479
|
-
// gates). The per-band material split — (1 − transmission[b]), the energy that did NOT transmit through a
|
|
480
|
-
// band leaks AROUND it (vs THROUGH it on the direct send) — is applied per band at the render seam, so
|
|
481
|
-
// direct + leak stay energy-consistent for a band-selective wall.
|
|
482
|
-
let pathGain = solution.occlusion * falloff;
|
|
483
|
-
|
|
484
|
-
// directivity-on-leak: the source radiates toward the FIRST hop (the corner it leaks through), not the
|
|
485
|
-
// listener it cannot reach directly
|
|
486
|
-
const directivity = instance.directivity;
|
|
487
|
-
if (directivity && !directivity.isOmni) {
|
|
488
|
-
pathGain *= this.#directivityGainToward(instance, fhx, fhy, fhz);
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
// Directional TRANSFER gate (only with baked reflector lobes — otherwise behaves exactly as before).
|
|
492
|
-
// With the endpoints virtualized, each endpoint bend is the attachment leg vs the corridor edge: an
|
|
493
|
-
// endpoint ON the corridor passes straight through (degenerate leg → gain 1), one off to the side or
|
|
494
|
-
// behind it bends and attenuates. (Interior turns: Phase 0b.)
|
|
495
|
-
if (field.hasTransfer) {
|
|
496
|
-
pathGain *= this.#turnGain(sourceProbe, sX - source.x, sY - source.y, sZ - source.z, fhx - spx, fhy - spy, fhz - spz);
|
|
497
|
-
pathGain *= this.#turnGain(listenerProbe, lpx - lhx, lpy - lhy, lpz - lhz, listener.x - lX, listener.y - lY, listener.z - lZ);
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
// Walk the leaked polyline (source-probe → … → listener-probe) once, now that the leak is audible:
|
|
501
|
-
// integrate air per leg + mark each edge for the budgeted recheck.
|
|
502
|
-
const leg = PATH_AIRLOSS_LEG;
|
|
503
|
-
let airLow = 0;
|
|
504
|
-
let airMid = 0;
|
|
505
|
-
let airHigh = 0;
|
|
506
|
-
let prevCur = -1; // the probe before `cur`; gates the INTERIOR turn at `cur`
|
|
507
|
-
let cur = sourceProbe;
|
|
508
|
-
let next = firstHop;
|
|
509
|
-
while (next !== INVALID_NODE) {
|
|
510
|
-
this.#volumeField.integrateAbsorption(
|
|
511
|
-
this.#region_index,
|
|
512
|
-
field.probeX(cur), field.probeY(cur), field.probeZ(cur),
|
|
513
|
-
field.probeX(next), field.probeY(next), field.probeZ(next),
|
|
514
|
-
leg
|
|
515
|
-
);
|
|
516
|
-
airLow += leg[0];
|
|
517
|
-
airMid += leg[1];
|
|
518
|
-
airHigh += leg[2];
|
|
519
|
-
|
|
520
|
-
if (this.pathingRecheck && this.#visibilityRecheck !== null) {
|
|
521
|
-
this.#visibilityRecheck.markEdge(cur, next);
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
// INTERIOR turn gate: charge the bend from the incoming edge to the outgoing edge through every
|
|
525
|
-
// corridor probe BETWEEN the endpoints, so a leak that diffracts around several corners pays
|
|
526
|
-
// per-corner loss, not just distance (a far-side wrap-around dies off). The source/listener ENDPOINT
|
|
527
|
-
// bends are gated above; this gates the interior ones. Only when reflector lobes are baked (else
|
|
528
|
-
// unchanged). The route is still the DISTANCE-shortest path — turn-AWARE routing (an edge-based
|
|
529
|
-
// Dijkstra that picks the max-energy route) is the further refinement; this charges the route taken.
|
|
530
|
-
if (field.hasTransfer && prevCur >= 0) {
|
|
531
|
-
pathGain *= this.#turnGain(cur,
|
|
532
|
-
field.probeX(cur) - field.probeX(prevCur), field.probeY(cur) - field.probeY(prevCur), field.probeZ(cur) - field.probeZ(prevCur),
|
|
533
|
-
field.probeX(next) - field.probeX(cur), field.probeY(next) - field.probeY(cur), field.probeZ(next) - field.probeZ(cur));
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
prevCur = cur;
|
|
537
|
-
cur = next;
|
|
538
|
-
next = pathingSolution.next[cur];
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
solution.hasPath = true;
|
|
542
|
-
solution.exit[0] = lhx; // leak emerges from the gateway probe (the last corner before the listener)
|
|
543
|
-
solution.exit[1] = lhy;
|
|
544
|
-
solution.exit[2] = lhz;
|
|
545
|
-
solution.pathGain = pathGain;
|
|
546
|
-
solution.pathAirLoss[0] = airLow;
|
|
547
|
-
solution.pathAirLoss[1] = airMid;
|
|
548
|
-
solution.pathAirLoss[2] = airHigh;
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
/**
|
|
552
|
-
* Directional-transfer gain at probe `p` for a routed BEND with incoming propagation direction
|
|
553
|
-
* (inx,iny,inz) and outgoing (outx,outy,outz) — neither need be unit. The band-mean of the probe's
|
|
554
|
-
* transfer T(in, out): a turn the probe's local reflectors cannot support → ~0; straight-through → 1; a
|
|
555
|
-
* degenerate (zero-length) direction → 1 (no gate). See {@link AcousticProbeField#probeTransfer} /
|
|
556
|
-
* PROBE_TRANSFER_RESEARCH.md §3.
|
|
557
|
-
* @param {number} p probe index
|
|
558
|
-
* @param {number} inx incoming propagation direction x; need not be unit
|
|
559
|
-
* @param {number} iny incoming propagation direction y
|
|
560
|
-
* @param {number} inz incoming propagation direction z
|
|
561
|
-
* @param {number} outx outgoing propagation direction x; need not be unit
|
|
562
|
-
* @param {number} outy outgoing propagation direction y
|
|
563
|
-
* @param {number} outz outgoing propagation direction z
|
|
564
|
-
* @returns {number} gain in [0, 1]
|
|
565
|
-
*/
|
|
566
|
-
#turnGain(p, inx, iny, inz, outx, outy, outz) {
|
|
567
|
-
const il2 = inx * inx + iny * iny + inz * inz;
|
|
568
|
-
const ol2 = outx * outx + outy * outy + outz * outz;
|
|
569
|
-
|
|
570
|
-
if (il2 < TURN_EPS || ol2 < TURN_EPS) {
|
|
571
|
-
return 1; // a coincident endpoint leaves the bend undefined — don't gate
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
const ii = 1 / Math.sqrt(il2);
|
|
575
|
-
const oi = 1 / Math.sqrt(ol2);
|
|
576
|
-
|
|
577
|
-
this.#probeField.probeTransfer(
|
|
578
|
-
TURN_TRANSFER, p,
|
|
579
|
-
inx * ii, iny * ii, inz * ii,
|
|
580
|
-
outx * oi, outy * oi, outz * oi
|
|
581
|
-
);
|
|
582
|
-
|
|
583
|
-
return (TURN_TRANSFER[0] + TURN_TRANSFER[1] + TURN_TRANSFER[2]) / 3;
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
/**
|
|
587
|
-
* The source's radiation gain toward a target point `(tx, ty, tz)`: the {@link AcousticDirectivity}
|
|
588
|
-
* pattern at the angle between the source's world forward (local {@link Vector3.forward} rotated by its
|
|
589
|
-
* orientation) and the source→target direction. A coincident source/target leaves the direction
|
|
590
|
-
* undefined → gain 1 (no attenuation).
|
|
591
|
-
* PRECONDITION: only called for a non-omni `instance.directivity`, which (being authored on the source)
|
|
592
|
-
* always travels with the source's `orientation`.
|
|
593
|
-
* @param {EventInstance} instance the source — position + orientation + directivity
|
|
594
|
-
* @param {number} tx target point x
|
|
595
|
-
* @param {number} ty target point y
|
|
596
|
-
* @param {number} tz target point z
|
|
597
|
-
* @returns {number} radiation gain ≥ 0
|
|
598
|
-
*/
|
|
599
|
-
#directivityGainToward(instance, tx, ty, tz) {
|
|
600
|
-
const source = instance.position;
|
|
601
|
-
|
|
602
|
-
let dx = tx - source.x;
|
|
603
|
-
let dy = ty - source.y;
|
|
604
|
-
let dz = tz - source.z;
|
|
605
|
-
|
|
606
|
-
const len = v3_length(dx, dy, dz);
|
|
607
|
-
|
|
608
|
-
if (len === 0) {
|
|
609
|
-
return 1; // target at the source — radiation direction undefined
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
const inv = 1 / len;
|
|
613
|
-
dx *= inv;
|
|
614
|
-
dy *= inv;
|
|
615
|
-
dz *= inv;
|
|
616
|
-
|
|
617
|
-
// source forward in world space = local forward rotated by the source's orientation
|
|
618
|
-
FORWARD.copy(Vector3.forward);
|
|
619
|
-
FORWARD.applyQuaternion(instance.orientation);
|
|
620
|
-
|
|
621
|
-
return instance.directivity.gain(FORWARD.x * dx + FORWARD.y * dy + FORWARD.z * dz);
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
/**
|
|
625
|
-
* Fill `solution.directivityGain` — the source's radiation toward the LISTENER (the direct path).
|
|
626
|
-
* @param {AcousticSolution} solution (occlusion already solved; `directivityGain` written)
|
|
627
|
-
* @param {EventInstance} instance the source — position + orientation + directivity
|
|
628
|
-
* @param {Vector3} listener
|
|
629
|
-
*/
|
|
630
|
-
#applyDirectivity(solution, instance, listener) {
|
|
631
|
-
solution.directivityGain = this.#directivityGainToward(instance, listener.x, listener.y, listener.z);
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
/**
|
|
635
|
-
* Drop a live instance's accumulated state (call when the instance ends).
|
|
636
|
-
* @param {EventInstance} instance
|
|
637
|
-
*/
|
|
638
|
-
forget(instance) {
|
|
639
|
-
const id = this.#stateIds.get(instance);
|
|
640
|
-
|
|
641
|
-
if (id !== undefined) {
|
|
642
|
-
this.#statePool.release(id);
|
|
643
|
-
this.#stateIds.delete(instance);
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
}
|
|
1
|
+
import { BinaryElementPool } from "../../../core/geom/3d/topology/struct/binary/BinaryElementPool.js";
|
|
2
|
+
import { Vector3 } from "../../../core/geom/Vector3.js";
|
|
3
|
+
import { seededRandom } from "../../../core/math/random/seededRandom.js";
|
|
4
|
+
import { INVALID_NODE } from "../../../core/graph/csr/csr_graph_build_distance_field.js";
|
|
5
|
+
import { line3_compute_segment_closest_point_t } from "../../../core/geom/3d/line/line3_compute_segment_closest_point_t.js";
|
|
6
|
+
import { v3_length } from "../../../core/geom/vec3/v3_length.js";
|
|
7
|
+
import { AcousticMedium } from "./core/AcousticMedium.js";
|
|
8
|
+
import { AcousticOccluderIndex } from "./core/AcousticOccluderIndex.js";
|
|
9
|
+
import { AcousticRegionIndex } from "./core/AcousticRegionIndex.js";
|
|
10
|
+
import { AcousticSolution } from "./core/AcousticSolution.js";
|
|
11
|
+
import { ACOUSTIC_SOURCE_STATE_FLOATS, AcousticSourceState } from "./core/AcousticSourceState.js";
|
|
12
|
+
import { OcclusionSolver } from "./core/OcclusionSolver.js";
|
|
13
|
+
import { VolumeField } from "./core/VolumeField.js";
|
|
14
|
+
import { ProbeFieldPathingSolution } from "./probe/ProbeFieldPathingSolution.js";
|
|
15
|
+
import { ProbeVisibilityRecheck } from "./probe/ProbeVisibilityRecheck.js";
|
|
16
|
+
|
|
17
|
+
// module-static scratch solution reused across every instance in apply()
|
|
18
|
+
const SOLUTION = new AcousticSolution();
|
|
19
|
+
|
|
20
|
+
// module-static scratch for the source's world-space forward vector during directivity
|
|
21
|
+
const FORWARD = new Vector3();
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Default ambient atmospheric absorption (dB per metre, per band low/mid/high) for space outside every
|
|
25
|
+
* authored `AcousticVolume`. Anchored at the low band (lows carry any distance), rising toward the highs so
|
|
26
|
+
* distant sources progressively lose their top end. A modest, tunable default — pass your own
|
|
27
|
+
* `defaultMedium` to dial the air thicker/thinner (or zero it for vacuum-clean falloff).
|
|
28
|
+
* @type {number[]}
|
|
29
|
+
*/
|
|
30
|
+
const DEFAULT_AIR_ABSORPTION = [0, 0.03, 0.1];
|
|
31
|
+
|
|
32
|
+
// default RNG seed for deterministic ray jitter (override via the `random_seed` field)
|
|
33
|
+
const DEFAULT_RANDOM_SEED = 1;
|
|
34
|
+
|
|
35
|
+
// module-static scratch for one leg's air absorption while integrating along the leaked polyline
|
|
36
|
+
const PATH_AIRLOSS_LEG = new Float32Array(3);
|
|
37
|
+
|
|
38
|
+
// scratch — per-band directional transfer at a probe (the corner-leak turn gate)
|
|
39
|
+
const TURN_TRANSFER = new Float32Array(3);
|
|
40
|
+
// below this squared leg length an attachment/edge direction is undefined → no directional gate
|
|
41
|
+
const TURN_EPS = 1e-12;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The acoustic simulation engine: owns the occluder index, the medium volume regions, the solvers, and
|
|
45
|
+
* the per-instance temporal state, and turns a source position into an {@link AcousticSolution} the
|
|
46
|
+
* render seam consumes. ECS-agnostic and WebAudio-agnostic — the ECS systems feed its geometry and the
|
|
47
|
+
* `AudioEmitterSystem` drives {@link apply}; both inject real objects, so it is unit-testable on bare
|
|
48
|
+
* geometry.
|
|
49
|
+
*
|
|
50
|
+
* Tunables are plain settable fields (not an opaque config bag): construct with no arguments, then set
|
|
51
|
+
* `rayCount`, `smoothing`, `random_seed`, `medium`, `pathing`, … after construction to taste.
|
|
52
|
+
*/
|
|
53
|
+
export class AcousticSimulator {
|
|
54
|
+
/**
|
|
55
|
+
* Rays cast per source per tick. Lower + temporal smoothing = cheaper, integrated over frames.
|
|
56
|
+
* @type {number}
|
|
57
|
+
*/
|
|
58
|
+
rayCount = 16;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* EMA factor for temporal smoothing, (0, 1]. Smaller = smoother / slower to react.
|
|
62
|
+
* @type {number}
|
|
63
|
+
*/
|
|
64
|
+
smoothing = 0.4;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Engine-wide corner-leakage toggle. Off (default) = zero cost (no path branch, no graph search).
|
|
68
|
+
* On = occluded sources route a leaked send spatialized from their propagation exit point. Requires
|
|
69
|
+
* a probe field with a baked visibility graph ({@link setProbeField}).
|
|
70
|
+
* @type {boolean}
|
|
71
|
+
*/
|
|
72
|
+
pathing = false;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Re-verify the visibility edges leaks traverse against LIVE geometry (dynamic-geometry policy — a door
|
|
76
|
+
* that closes after the bake re-blocks the leak). Off (default) = the baked graph is trusted as-is.
|
|
77
|
+
* Requires {@link pathing}. The recheck is budgeted ({@link recheckBudget}); a blocked edge is disabled
|
|
78
|
+
* by weight (no topology change), restored when it re-opens.
|
|
79
|
+
* @type {boolean}
|
|
80
|
+
*/
|
|
81
|
+
pathingRecheck = false;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Max visibility edges re-verified per tick when {@link pathingRecheck} is on (one `anyHit` ray each).
|
|
85
|
+
* Bounds the recheck cost; leftover dirty edges round-robin to later ticks.
|
|
86
|
+
* @type {number}
|
|
87
|
+
*/
|
|
88
|
+
recheckBudget = 8;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* @type {AcousticOccluderIndex}
|
|
92
|
+
*/
|
|
93
|
+
#occluder_index = new AcousticOccluderIndex();
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Medium regions behind a BVH — blend queries resolve in O(log n) (re-fit each frame for moving volumes).
|
|
97
|
+
* @type {AcousticRegionIndex}
|
|
98
|
+
*/
|
|
99
|
+
#region_index = new AcousticRegionIndex();
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Ambient medium field — its default medium (settable via {@link medium}) fills space outside every
|
|
103
|
+
* authored region.
|
|
104
|
+
* @type {VolumeField}
|
|
105
|
+
*/
|
|
106
|
+
#volumeField = new VolumeField(AcousticMedium.from(DEFAULT_AIR_ABSORPTION));
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @type {OcclusionSolver}
|
|
110
|
+
*/
|
|
111
|
+
#occlusionSolver = new OcclusionSolver();
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Live-instance → its temporal-state record id in {@link #statePool}. The state DATA lives in the
|
|
115
|
+
* pool (flat floats); this map only holds the id relation. Audio events are highly transient (a
|
|
116
|
+
* burst of one-shots), so pooling the records avoids per-source object churn — freed slots are
|
|
117
|
+
* recycled, not GC'd.
|
|
118
|
+
* @type {Map<EventInstance, number>}
|
|
119
|
+
*/
|
|
120
|
+
#stateIds = new Map();
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Backing store for per-source {@link AcousticSourceState} records (one record =
|
|
124
|
+
* {@link ACOUSTIC_SOURCE_STATE_FLOATS} float32s).
|
|
125
|
+
* @type {BinaryElementPool}
|
|
126
|
+
*/
|
|
127
|
+
#statePool = new BinaryElementPool(ACOUSTIC_SOURCE_STATE_FLOATS * Float32Array.BYTES_PER_ELEMENT);
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* One reusable cursor, re-pointed at each live instance's pool record per tick (zero-alloc).
|
|
131
|
+
* @type {AcousticSourceState}
|
|
132
|
+
*/
|
|
133
|
+
#stateCursor = new AcousticSourceState();
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Seeded RNG for deterministic ray jitter. Re-created when {@link random_seed} is set.
|
|
137
|
+
* @type {function():number}
|
|
138
|
+
*/
|
|
139
|
+
#random = seededRandom(DEFAULT_RANDOM_SEED);
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* The current RNG seed (backs {@link random_seed}).
|
|
143
|
+
* @type {number}
|
|
144
|
+
*/
|
|
145
|
+
#randomSeed = DEFAULT_RANDOM_SEED;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Reused scratch set for pruning ended-instance state in {@link apply} (allocation-free).
|
|
149
|
+
* @type {Set<EventInstance>}
|
|
150
|
+
*/
|
|
151
|
+
#liveScratch = new Set();
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Baked probe field whose visibility graph drives pathing (corner-leakage). Null until
|
|
155
|
+
* {@link setProbeField}.
|
|
156
|
+
* @type {AcousticProbeField|null}
|
|
157
|
+
*/
|
|
158
|
+
#probeField = null;
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Budgeted incremental visibility recheck over the probe-visibility graph (dynamic geometry — a door
|
|
162
|
+
* that closes after the bake). Null unless {@link pathingRecheck} is on and a field is set; created
|
|
163
|
+
* alongside the pathing solution. Edges traversed by leaks are marked here and re-verified within budget.
|
|
164
|
+
* @type {ProbeVisibilityRecheck|null}
|
|
165
|
+
*/
|
|
166
|
+
#visibilityRecheck = null;
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Per-frame exit-field solver over {@link #probeField}'s visibility graph (corner-leakage). Lazily
|
|
170
|
+
* (re)created the first time pathing runs against the current field, then reused across frames.
|
|
171
|
+
* @type {ProbeFieldPathingSolution|null}
|
|
172
|
+
*/
|
|
173
|
+
#pathingSolution = null;
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* RNG seed for deterministic ray jitter. Setting it re-seeds the generator (resets the jitter stream).
|
|
177
|
+
* Default {@link DEFAULT_RANDOM_SEED}.
|
|
178
|
+
* @returns {number}
|
|
179
|
+
*/
|
|
180
|
+
get random_seed() {
|
|
181
|
+
return this.#randomSeed;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
set random_seed(seed) {
|
|
185
|
+
this.#randomSeed = seed;
|
|
186
|
+
this.#random = seededRandom(seed);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* The default medium for space outside every authored `AcousticVolume` region (ambient air). Default: a
|
|
191
|
+
* modest atmospheric absorption ({@link DEFAULT_AIR_ABSORPTION}); set it to dial the air thicker/thinner
|
|
192
|
+
* (or zero it for vacuum-clean falloff).
|
|
193
|
+
* @returns {AcousticMedium}
|
|
194
|
+
*/
|
|
195
|
+
get medium() {
|
|
196
|
+
return this.#volumeField.defaultMedium;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
set medium(medium) {
|
|
200
|
+
this.#volumeField.defaultMedium = medium;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* The occluder index, for offline baking (reverb / visibility) against the same scene geometry the
|
|
205
|
+
* runtime occludes with.
|
|
206
|
+
* @returns {AcousticOccluderIndex}
|
|
207
|
+
*/
|
|
208
|
+
get occluderIndex() {
|
|
209
|
+
return this.#occluder_index;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Register an occluder shape, placed by `matrix` (its canonical frame is local; the matrix is the
|
|
214
|
+
* world transform).
|
|
215
|
+
* @param {AbstractShape3D} shape
|
|
216
|
+
* @param {AcousticMaterial} material
|
|
217
|
+
* @param {Float32Array|number[]} [matrix]
|
|
218
|
+
* @returns {number} occluder handle
|
|
219
|
+
*/
|
|
220
|
+
addOccluder(shape, material, matrix) {
|
|
221
|
+
return this.#occluder_index.addBody(shape, material, matrix);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* @param {number} handle
|
|
226
|
+
* @param {Float32Array|number[]} matrix
|
|
227
|
+
*/
|
|
228
|
+
setOccluderTransform(handle, matrix) {
|
|
229
|
+
this.#occluder_index.setTransform(handle, matrix);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* @param {number} handle
|
|
234
|
+
*/
|
|
235
|
+
removeOccluder(handle) {
|
|
236
|
+
this.#occluder_index.removeBody(handle);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* @param {AcousticVolumeRegion} region
|
|
241
|
+
* @returns {AcousticVolumeRegion} the same region (for handle-keeping)
|
|
242
|
+
*/
|
|
243
|
+
addRegion(region) {
|
|
244
|
+
return this.#region_index.add(region);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @param {AcousticVolumeRegion} region
|
|
249
|
+
*/
|
|
250
|
+
removeRegion(region) {
|
|
251
|
+
this.#region_index.remove(region);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* The baked probe field currently wired in (for pathing + probe reverb), or null if none. Paired with the
|
|
256
|
+
* {@link occluderIndex} it is what an offline re-bake (e.g. after deserialization) runs against.
|
|
257
|
+
* @returns {AcousticProbeField|null}
|
|
258
|
+
*/
|
|
259
|
+
get probeField() {
|
|
260
|
+
return this.#probeField;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Provide the baked probe field (with a visibility graph) that pathing routes through, or `null` to
|
|
265
|
+
* clear it. Required before {@link pathing} has any effect. The exit-field solver is dropped and lazily
|
|
266
|
+
* rebuilt for the new field.
|
|
267
|
+
* @param {AcousticProbeField|null} field a field with a baked visibility graph ({@link bakeVisibility})
|
|
268
|
+
*/
|
|
269
|
+
setProbeField(field) {
|
|
270
|
+
this.#probeField = field;
|
|
271
|
+
this.#pathingSolution = null;
|
|
272
|
+
this.#visibilityRecheck = null; // rebuilt against the new field (and its graph) on the next tick
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Compute the full acoustic solution for a source at `source`, given `listener`, into `out`.
|
|
277
|
+
* @param {Vector3} listener
|
|
278
|
+
* @param {Vector3} source
|
|
279
|
+
* @param {number} sourceRadius apparent radius of the source (per-source; 0 = point source). For
|
|
280
|
+
* volumetric (fractional) occlusion.
|
|
281
|
+
* @param {AcousticSourceState} state per-source temporal accumulation (mutated)
|
|
282
|
+
* @param {AcousticSolution} out
|
|
283
|
+
*/
|
|
284
|
+
solveFor(listener, source, sourceRadius, state, out) {
|
|
285
|
+
out.reset();
|
|
286
|
+
|
|
287
|
+
// air absorption integrated over the actual source→listener path (distance-dependent, per band)
|
|
288
|
+
this.#volumeField.integrateAbsorption(
|
|
289
|
+
this.#region_index,
|
|
290
|
+
source.x, source.y, source.z,
|
|
291
|
+
listener.x, listener.y, listener.z,
|
|
292
|
+
out.airLoss
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
this.#occlusionSolver.solve(
|
|
296
|
+
listener, source, sourceRadius,
|
|
297
|
+
this.#occluder_index, this.rayCount, this.smoothing, this.#random,
|
|
298
|
+
state, out
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Solve + push the result to every live instance. Each instance must expose a `position` (Vector3)
|
|
304
|
+
* and `setAcoustic(solution)`. Called once per frame by the `AudioEmitterSystem`, between the live-set
|
|
305
|
+
* refresh and the sopra tick.
|
|
306
|
+
* @param {EventInstance[]} liveInstances bounded set (≤ voice budget)
|
|
307
|
+
* @param {Vector3} listener
|
|
308
|
+
*/
|
|
309
|
+
apply(liveInstances, listener) {
|
|
310
|
+
const live = this.#liveScratch;
|
|
311
|
+
live.clear();
|
|
312
|
+
|
|
313
|
+
// re-fit moving volumes' BVH leaves once per frame (regions track Transform.position by reference),
|
|
314
|
+
// so this frame's blend queries see current positions.
|
|
315
|
+
this.#region_index.refit();
|
|
316
|
+
|
|
317
|
+
// pathing (corner-leakage): one single-source pass from the listener serves every source's exit
|
|
318
|
+
const pathing = this.pathing && this.#probeField !== null && this.#probeField.hasVisibility;
|
|
319
|
+
// The exit field is usable only once the listener has snapped to a VISIBLE probe + solved this frame;
|
|
320
|
+
// if the listener can see no probe, pathing is off for every source this frame (no stale field).
|
|
321
|
+
let exitFieldReady = false;
|
|
322
|
+
if (pathing) {
|
|
323
|
+
if (this.#pathingSolution === null) {
|
|
324
|
+
this.#pathingSolution = new ProbeFieldPathingSolution(this.#probeField.size);
|
|
325
|
+
}
|
|
326
|
+
if (this.pathingRecheck && this.#visibilityRecheck === null) {
|
|
327
|
+
this.#visibilityRecheck = new ProbeVisibilityRecheck(this.#probeField, this.#occluder_index);
|
|
328
|
+
}
|
|
329
|
+
// Snap to the nearest probe the listener can SEE — never one occluded by a wall/floor (a different
|
|
330
|
+
// acoustic region), which would route a spurious cross-occluder detour or none at all.
|
|
331
|
+
const listenerProbe = this.#probeField.nearestVisibleIndex(listener.x, listener.y, listener.z, this.#occluder_index);
|
|
332
|
+
if (listenerProbe >= 0) {
|
|
333
|
+
this.#pathingSolution.computeExitField(this.#probeField.visibilityGraph, listenerProbe);
|
|
334
|
+
exitFieldReady = true;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
const pool = this.#statePool;
|
|
339
|
+
const cursor = this.#stateCursor;
|
|
340
|
+
|
|
341
|
+
for (let i = 0; i < liveInstances.length; i++) {
|
|
342
|
+
const instance = liveInstances[i];
|
|
343
|
+
|
|
344
|
+
live.add(instance);
|
|
345
|
+
|
|
346
|
+
let id = this.#stateIds.get(instance);
|
|
347
|
+
|
|
348
|
+
if (id === undefined) {
|
|
349
|
+
id = pool.allocate();
|
|
350
|
+
this.#stateIds.set(instance, id);
|
|
351
|
+
// the pool view may have grown during allocate — bind the current one, then clear the
|
|
352
|
+
// (possibly recycled) record to its cold state before the first solve.
|
|
353
|
+
cursor.rebind(pool.data_float32, pool.element_word(id));
|
|
354
|
+
cursor.reset();
|
|
355
|
+
} else {
|
|
356
|
+
cursor.rebind(pool.data_float32, pool.element_word(id));
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
this.solveFor(listener, instance.position, instance.sourceRadius, cursor, SOLUTION);
|
|
360
|
+
|
|
361
|
+
if (exitFieldReady) {
|
|
362
|
+
this.#applyPath(SOLUTION, instance, listener);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// source radiation directivity (skipped for omni sources — the common case, zero cost)
|
|
366
|
+
const directivity = instance.directivity;
|
|
367
|
+
if (directivity && !directivity.isOmni) {
|
|
368
|
+
this.#applyDirectivity(SOLUTION, instance, listener);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
instance.setAcoustic(SOLUTION);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// release pool records for instances no longer live (ended / demoted) — keeps the live set
|
|
375
|
+
// bounded without per-instance lifecycle wiring; freed ids are recycled by the next allocate.
|
|
376
|
+
if (this.#stateIds.size > live.size) {
|
|
377
|
+
for (const instance of this.#stateIds.keys()) {
|
|
378
|
+
if (!live.has(instance)) {
|
|
379
|
+
pool.release(this.#stateIds.get(instance));
|
|
380
|
+
this.#stateIds.delete(instance);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// dynamic-geometry policy: re-verify (within budget) the visibility edges the leaks just traversed,
|
|
386
|
+
// disabling/restoring them against live geometry. The updated weights take effect next frame's solve.
|
|
387
|
+
// Gated on the LIVE flag (not just the object), so toggling pathingRecheck off stops marking + rechecking
|
|
388
|
+
// immediately; the object persists for cheap re-enable.
|
|
389
|
+
if (this.pathingRecheck && this.#visibilityRecheck !== null) {
|
|
390
|
+
this.#visibilityRecheck.update(this.recheckBudget);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
live.clear();
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Fill the path (corner-leakage) fields of `solution` for a source, using the exit field computed this
|
|
398
|
+
* frame. The leaked level grows with occlusion (more blocked → more of the sound arrives via the path) and
|
|
399
|
+
* falls with routed length; no path → fields left cleared.
|
|
400
|
+
*
|
|
401
|
+
* The source and listener are not graph vertices: each is VIRTUALIZED onto its adjacent corridor edge (the
|
|
402
|
+
* nearest point via line3 closest-point), so the attachment legs are the true geometry rather than a dart to
|
|
403
|
+
* the probe centre — a probe sitting just past an endpoint no longer folds a there-and-back bend into the
|
|
404
|
+
* route, and a standoff/oblique endpoint attenuates instead of under-counting. The distance falloff is the
|
|
405
|
+
* SOURCE's own authored attenuation curve evaluated at the routed length = source-leg + corridor span +
|
|
406
|
+
* listener-leg (the corridor span is the graph distance, less the partial first/last edges the virtual
|
|
407
|
+
* points cut off). The curve — with its `distanceMax` — is where a source's audible range legitimately
|
|
408
|
+
* lives; the simulator carries no presumptuous global scale of its own.
|
|
409
|
+
*
|
|
410
|
+
* Once the leak is known audible, a single walk of the polyline (source-probe → … → listener-probe, via
|
|
411
|
+
* `nextProbe`) integrates AIR ABSORPTION per leg (the longer route darkens more than the direct line) and
|
|
412
|
+
* marks each traversed edge for the budgeted visibility recheck — an out-of-range leak returns BEFORE the
|
|
413
|
+
* walk, so it spends no recheck budget. DIRECTIVITY-on-leak scales the gain by the source's radiation toward
|
|
414
|
+
* the first hop (the corner it leaks through), not the blocked listener.
|
|
415
|
+
* @param {AcousticSolution} solution (occlusion already solved)
|
|
416
|
+
* @param {EventInstance} instance the source (position + attenuation + orientation + directivity)
|
|
417
|
+
* @param {Vector3} listener the listener world position (the leak's far endpoint)
|
|
418
|
+
*/
|
|
419
|
+
#applyPath(solution, instance, listener) {
|
|
420
|
+
const field = this.#probeField;
|
|
421
|
+
const pathingSolution = this.#pathingSolution;
|
|
422
|
+
const source = instance.position;
|
|
423
|
+
|
|
424
|
+
const sourceProbe = field.nearestVisibleIndex(source.x, source.y, source.z, this.#occluder_index);
|
|
425
|
+
|
|
426
|
+
if (sourceProbe < 0) {
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const exit = pathingSolution.exit[sourceProbe];
|
|
431
|
+
|
|
432
|
+
if (exit === INVALID_NODE) {
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// The corridor endpoints, derivable WITHOUT walking: `firstHop` is the source-probe's first hop toward
|
|
437
|
+
// the listener; the gateway `exit` is the probe adjacent to the listener's probe (the last hop); and the
|
|
438
|
+
// listener's probe — the exit-field root — is one hop past the gateway. All valid here: exit and next go
|
|
439
|
+
// INVALID together (both only at the root / an unreachable source) and exit===INVALID already returned,
|
|
440
|
+
// and `exit` is a NEIGHBOUR of the root, so next[exit] IS the root.
|
|
441
|
+
const firstHop = pathingSolution.next[sourceProbe];
|
|
442
|
+
const listenerProbe = pathingSolution.next[exit];
|
|
443
|
+
|
|
444
|
+
const spx = field.probeX(sourceProbe), spy = field.probeY(sourceProbe), spz = field.probeZ(sourceProbe);
|
|
445
|
+
const fhx = field.probeX(firstHop), fhy = field.probeY(firstHop), fhz = field.probeZ(firstHop);
|
|
446
|
+
const lhx = field.probeX(exit), lhy = field.probeY(exit), lhz = field.probeZ(exit);
|
|
447
|
+
const lpx = field.probeX(listenerProbe), lpy = field.probeY(listenerProbe), lpz = field.probeZ(listenerProbe);
|
|
448
|
+
|
|
449
|
+
// Virtualize the dynamic endpoints onto their adjacent edges (line3 closest point) rather than darting
|
|
450
|
+
// to the probe vertex: (a) avoids the spurious there-and-back bend a probe sitting just past the
|
|
451
|
+
// endpoint would fold into the route (the transfer gate would wrongly refuse it), and (b) lets the
|
|
452
|
+
// attachment legs count toward the routed distance, so a standoff / oblique endpoint attenuates.
|
|
453
|
+
const tS = line3_compute_segment_closest_point_t(spx, spy, spz, fhx, fhy, fhz, source.x, source.y, source.z);
|
|
454
|
+
const sX = spx + (fhx - spx) * tS, sY = spy + (fhy - spy) * tS, sZ = spz + (fhz - spz) * tS;
|
|
455
|
+
const sourceLeg = Math.hypot(source.x - sX, source.y - sY, source.z - sZ);
|
|
456
|
+
const firstEdgeLen = Math.hypot(fhx - spx, fhy - spy, fhz - spz);
|
|
457
|
+
|
|
458
|
+
const tL = line3_compute_segment_closest_point_t(lhx, lhy, lhz, lpx, lpy, lpz, listener.x, listener.y, listener.z);
|
|
459
|
+
const lX = lhx + (lpx - lhx) * tL, lY = lhy + (lpy - lhy) * tL, lZ = lhz + (lpz - lhz) * tL;
|
|
460
|
+
const listenerLeg = Math.hypot(listener.x - lX, listener.y - lY, listener.z - lZ);
|
|
461
|
+
const lastEdgeLen = Math.hypot(lpx - lhx, lpy - lhy, lpz - lhz);
|
|
462
|
+
|
|
463
|
+
// Corridor span between the two virtual attach points. A SINGLE-edge route (firstHop IS the listener's
|
|
464
|
+
// probe) projects both endpoints onto that ONE edge, so the span is just their |arc| gap. The
|
|
465
|
+
// graph-distance subtraction (the general case) assumes DISTINCT first/last edges — for one shared edge
|
|
466
|
+
// it would mis-sign a tS>tL crossing; for distinct edges it is exactly (1−tS)·first + middle + tL·last,
|
|
467
|
+
// which is ≥ 0 by construction (the partial edges sum to ≤ dist).
|
|
468
|
+
const corridor = firstHop === listenerProbe
|
|
469
|
+
? Math.abs(tL - tS) * firstEdgeLen
|
|
470
|
+
: pathingSolution.dist[sourceProbe] - tS * firstEdgeLen - (1 - tL) * lastEdgeLen;
|
|
471
|
+
|
|
472
|
+
const falloff = Math.max(0, instance.description.attenuation.evaluate(sourceLeg + corridor + listenerLeg));
|
|
473
|
+
|
|
474
|
+
if (falloff <= 0) {
|
|
475
|
+
return; // out of audible range — bail BEFORE the walk, so an inaudible leak spends no recheck budget
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// pathGain is the BROADBAND geometric leak strength (occlusion × distance falloff × directivity × turn
|
|
479
|
+
// gates). The per-band material split — (1 − transmission[b]), the energy that did NOT transmit through a
|
|
480
|
+
// band leaks AROUND it (vs THROUGH it on the direct send) — is applied per band at the render seam, so
|
|
481
|
+
// direct + leak stay energy-consistent for a band-selective wall.
|
|
482
|
+
let pathGain = solution.occlusion * falloff;
|
|
483
|
+
|
|
484
|
+
// directivity-on-leak: the source radiates toward the FIRST hop (the corner it leaks through), not the
|
|
485
|
+
// listener it cannot reach directly
|
|
486
|
+
const directivity = instance.directivity;
|
|
487
|
+
if (directivity && !directivity.isOmni) {
|
|
488
|
+
pathGain *= this.#directivityGainToward(instance, fhx, fhy, fhz);
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// Directional TRANSFER gate (only with baked reflector lobes — otherwise behaves exactly as before).
|
|
492
|
+
// With the endpoints virtualized, each endpoint bend is the attachment leg vs the corridor edge: an
|
|
493
|
+
// endpoint ON the corridor passes straight through (degenerate leg → gain 1), one off to the side or
|
|
494
|
+
// behind it bends and attenuates. (Interior turns: Phase 0b.)
|
|
495
|
+
if (field.hasTransfer) {
|
|
496
|
+
pathGain *= this.#turnGain(sourceProbe, sX - source.x, sY - source.y, sZ - source.z, fhx - spx, fhy - spy, fhz - spz);
|
|
497
|
+
pathGain *= this.#turnGain(listenerProbe, lpx - lhx, lpy - lhy, lpz - lhz, listener.x - lX, listener.y - lY, listener.z - lZ);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// Walk the leaked polyline (source-probe → … → listener-probe) once, now that the leak is audible:
|
|
501
|
+
// integrate air per leg + mark each edge for the budgeted recheck.
|
|
502
|
+
const leg = PATH_AIRLOSS_LEG;
|
|
503
|
+
let airLow = 0;
|
|
504
|
+
let airMid = 0;
|
|
505
|
+
let airHigh = 0;
|
|
506
|
+
let prevCur = -1; // the probe before `cur`; gates the INTERIOR turn at `cur`
|
|
507
|
+
let cur = sourceProbe;
|
|
508
|
+
let next = firstHop;
|
|
509
|
+
while (next !== INVALID_NODE) {
|
|
510
|
+
this.#volumeField.integrateAbsorption(
|
|
511
|
+
this.#region_index,
|
|
512
|
+
field.probeX(cur), field.probeY(cur), field.probeZ(cur),
|
|
513
|
+
field.probeX(next), field.probeY(next), field.probeZ(next),
|
|
514
|
+
leg
|
|
515
|
+
);
|
|
516
|
+
airLow += leg[0];
|
|
517
|
+
airMid += leg[1];
|
|
518
|
+
airHigh += leg[2];
|
|
519
|
+
|
|
520
|
+
if (this.pathingRecheck && this.#visibilityRecheck !== null) {
|
|
521
|
+
this.#visibilityRecheck.markEdge(cur, next);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// INTERIOR turn gate: charge the bend from the incoming edge to the outgoing edge through every
|
|
525
|
+
// corridor probe BETWEEN the endpoints, so a leak that diffracts around several corners pays
|
|
526
|
+
// per-corner loss, not just distance (a far-side wrap-around dies off). The source/listener ENDPOINT
|
|
527
|
+
// bends are gated above; this gates the interior ones. Only when reflector lobes are baked (else
|
|
528
|
+
// unchanged). The route is still the DISTANCE-shortest path — turn-AWARE routing (an edge-based
|
|
529
|
+
// Dijkstra that picks the max-energy route) is the further refinement; this charges the route taken.
|
|
530
|
+
if (field.hasTransfer && prevCur >= 0) {
|
|
531
|
+
pathGain *= this.#turnGain(cur,
|
|
532
|
+
field.probeX(cur) - field.probeX(prevCur), field.probeY(cur) - field.probeY(prevCur), field.probeZ(cur) - field.probeZ(prevCur),
|
|
533
|
+
field.probeX(next) - field.probeX(cur), field.probeY(next) - field.probeY(cur), field.probeZ(next) - field.probeZ(cur));
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
prevCur = cur;
|
|
537
|
+
cur = next;
|
|
538
|
+
next = pathingSolution.next[cur];
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
solution.hasPath = true;
|
|
542
|
+
solution.exit[0] = lhx; // leak emerges from the gateway probe (the last corner before the listener)
|
|
543
|
+
solution.exit[1] = lhy;
|
|
544
|
+
solution.exit[2] = lhz;
|
|
545
|
+
solution.pathGain = pathGain;
|
|
546
|
+
solution.pathAirLoss[0] = airLow;
|
|
547
|
+
solution.pathAirLoss[1] = airMid;
|
|
548
|
+
solution.pathAirLoss[2] = airHigh;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Directional-transfer gain at probe `p` for a routed BEND with incoming propagation direction
|
|
553
|
+
* (inx,iny,inz) and outgoing (outx,outy,outz) — neither need be unit. The band-mean of the probe's
|
|
554
|
+
* transfer T(in, out): a turn the probe's local reflectors cannot support → ~0; straight-through → 1; a
|
|
555
|
+
* degenerate (zero-length) direction → 1 (no gate). See {@link AcousticProbeField#probeTransfer} /
|
|
556
|
+
* PROBE_TRANSFER_RESEARCH.md §3.
|
|
557
|
+
* @param {number} p probe index
|
|
558
|
+
* @param {number} inx incoming propagation direction x; need not be unit
|
|
559
|
+
* @param {number} iny incoming propagation direction y
|
|
560
|
+
* @param {number} inz incoming propagation direction z
|
|
561
|
+
* @param {number} outx outgoing propagation direction x; need not be unit
|
|
562
|
+
* @param {number} outy outgoing propagation direction y
|
|
563
|
+
* @param {number} outz outgoing propagation direction z
|
|
564
|
+
* @returns {number} gain in [0, 1]
|
|
565
|
+
*/
|
|
566
|
+
#turnGain(p, inx, iny, inz, outx, outy, outz) {
|
|
567
|
+
const il2 = inx * inx + iny * iny + inz * inz;
|
|
568
|
+
const ol2 = outx * outx + outy * outy + outz * outz;
|
|
569
|
+
|
|
570
|
+
if (il2 < TURN_EPS || ol2 < TURN_EPS) {
|
|
571
|
+
return 1; // a coincident endpoint leaves the bend undefined — don't gate
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
const ii = 1 / Math.sqrt(il2);
|
|
575
|
+
const oi = 1 / Math.sqrt(ol2);
|
|
576
|
+
|
|
577
|
+
this.#probeField.probeTransfer(
|
|
578
|
+
TURN_TRANSFER, p,
|
|
579
|
+
inx * ii, iny * ii, inz * ii,
|
|
580
|
+
outx * oi, outy * oi, outz * oi
|
|
581
|
+
);
|
|
582
|
+
|
|
583
|
+
return (TURN_TRANSFER[0] + TURN_TRANSFER[1] + TURN_TRANSFER[2]) / 3;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
/**
|
|
587
|
+
* The source's radiation gain toward a target point `(tx, ty, tz)`: the {@link AcousticDirectivity}
|
|
588
|
+
* pattern at the angle between the source's world forward (local {@link Vector3.forward} rotated by its
|
|
589
|
+
* orientation) and the source→target direction. A coincident source/target leaves the direction
|
|
590
|
+
* undefined → gain 1 (no attenuation).
|
|
591
|
+
* PRECONDITION: only called for a non-omni `instance.directivity`, which (being authored on the source)
|
|
592
|
+
* always travels with the source's `orientation`.
|
|
593
|
+
* @param {EventInstance} instance the source — position + orientation + directivity
|
|
594
|
+
* @param {number} tx target point x
|
|
595
|
+
* @param {number} ty target point y
|
|
596
|
+
* @param {number} tz target point z
|
|
597
|
+
* @returns {number} radiation gain ≥ 0
|
|
598
|
+
*/
|
|
599
|
+
#directivityGainToward(instance, tx, ty, tz) {
|
|
600
|
+
const source = instance.position;
|
|
601
|
+
|
|
602
|
+
let dx = tx - source.x;
|
|
603
|
+
let dy = ty - source.y;
|
|
604
|
+
let dz = tz - source.z;
|
|
605
|
+
|
|
606
|
+
const len = v3_length(dx, dy, dz);
|
|
607
|
+
|
|
608
|
+
if (len === 0) {
|
|
609
|
+
return 1; // target at the source — radiation direction undefined
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
const inv = 1 / len;
|
|
613
|
+
dx *= inv;
|
|
614
|
+
dy *= inv;
|
|
615
|
+
dz *= inv;
|
|
616
|
+
|
|
617
|
+
// source forward in world space = local forward rotated by the source's orientation
|
|
618
|
+
FORWARD.copy(Vector3.forward);
|
|
619
|
+
FORWARD.applyQuaternion(instance.orientation);
|
|
620
|
+
|
|
621
|
+
return instance.directivity.gain(FORWARD.x * dx + FORWARD.y * dy + FORWARD.z * dz);
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* Fill `solution.directivityGain` — the source's radiation toward the LISTENER (the direct path).
|
|
626
|
+
* @param {AcousticSolution} solution (occlusion already solved; `directivityGain` written)
|
|
627
|
+
* @param {EventInstance} instance the source — position + orientation + directivity
|
|
628
|
+
* @param {Vector3} listener
|
|
629
|
+
*/
|
|
630
|
+
#applyDirectivity(solution, instance, listener) {
|
|
631
|
+
solution.directivityGain = this.#directivityGainToward(instance, listener.x, listener.y, listener.z);
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* Drop a live instance's accumulated state (call when the instance ends).
|
|
636
|
+
* @param {EventInstance} instance
|
|
637
|
+
*/
|
|
638
|
+
forget(instance) {
|
|
639
|
+
const id = this.#stateIds.get(instance);
|
|
640
|
+
|
|
641
|
+
if (id !== undefined) {
|
|
642
|
+
this.#statePool.release(id);
|
|
643
|
+
this.#stateIds.delete(instance);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
}
|