@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,169 +1,169 @@
|
|
|
1
|
-
# Domain K — cross-cutting reuse failures
|
|
2
|
-
|
|
3
|
-
Scope: concerns that cut across packages. Every count below comes from a grep/AST census run over
|
|
4
|
-
`H:/git/moh/app/src/mir-engine/meep/src/` excluding `*.spec.js`, `prototype*.js`, `test*.js`.
|
|
5
|
-
Census scripts are in the scratchpad (`grow.mjs`, `sys.mjs`, `sys2.mjs`, `census.mjs`).
|
|
6
|
-
|
|
7
|
-
## Findings
|
|
8
|
-
|
|
9
|
-
| # | Severity | Concept | # of independent impls | Representative sites | Existing primitive (if any) | Verdict | Proposed common path | Effort/Risk |
|
|
10
|
-
|---|---|---|---|---|---|---|---|---|
|
|
11
|
-
| K1 | **HIGH** ⚠ **INCONSISTENT** | 32-bit hash *combine* (`h*31 + v`) | **33 files** hand-roll the mix (74 mix statements) while **62 files** import the primitive | `engine/physics/ecs/Joint.js:444`, `engine/physics/ecs/RigidBody.js:281`, `engine/physics/ecs/Collider.js:159`, `core/geom/3d/shape/HeightMapShape3D.js:461`, `core/model/BoundedValue.js:180`, `core/geom/Vector2.js:640`, `core/graph/csr/CSRGraph.js:281` | `core/collection/array/combine_hash.js:9` (variadic); `core/math/hash/lowbias32.js`, `murmur3_32.js`, `squirrel3.js` | **UNJUSTIFIED** — but see K1a: the mixes are not the same function | Add a non-variadic, allocation-free `hash_combine(h, v)` in `core/math/hash/` (2 args, `|0`-truncating) and route both `combine_hash` and the 33 hand-rolled chains through it | M / M — every changed `hash()` changes its value; any persisted hash must be re-baselined |
|
|
12
|
-
| K1a | **HIGH** ⚠ **INCONSISTENT** | integer-domain discipline of the *same* hash | **4 mutually-incompatible disciplines** across 5 sibling functions | `core/collection/array/computeHashArray.js:24` (`hash \|= 0` every iteration) vs `core/collection/array/typed/uint32_array_hash.js:15` (**never truncates**) vs `core/collection/array/computeStridedIntegerArrayHash.js:27` (`>>> 0` at the end only) vs `core/primitives/strings/computeStringHash.js:40` (`>>> 0`) vs `core/geom/Vector2.js:640` (no truncation, returns a non-int32) | — | **UNJUSTIFIED / correctness hazard** | One truncation rule (`\| 0` per step) applied by the shared `hash_combine`; `uint32_array_hash` currently returns an ever-widening float (its accumulator escapes int32 on the first ≥2³¹ element and drifts as a ±random walk — the exact workload `CSRGraph.hash()` feeds it at `CSRGraph.js:285-292`) | S / M |
|
|
13
|
-
| K2 | **HIGH** ⚠ **INCONSISTENT** | `(array, offset, length)` array-hash contract | latent off-by-semantics replicated into **5** clones | `core/collection/array/typed/uint32_array_hash.js:11`, `uint8_array_hash.js:19`, `uint16_array_hash.js:17`, `core/collection/array/computeStridedIntegerArrayHash.js:14`, `computeStridedArrayHash.js:23` — all loop `i < length` while the JSDoc and `array_buffer_hash.js:12` treat `length` as a **count**, so any `offset > 0` silently hashes the wrong (short) range | — | **UNJUSTIFIED** — copy-paste propagated the defect into every clone | Fix once in a shared `hash_combine`-based loop; `uint8_array_hash.js:15` is even self-contradictory (head loop `i < offset + overflow`, body loop `i < length`). All current callers pass `offset === 0`, so nothing is broken **today**, but `offset` is public library surface | S / L |
|
|
14
|
-
| K3 | LOW ⚠ **INCONSISTENT** | word packing in sibling array hashes | 2 | `core/collection/array/typed/uint8_array_hash.js:26-29` packs **little-endian** (`v0 \| v1<<8 \| v2<<16 \| v3<<24`); `uint16_array_hash.js:22` packs **big-endian** (`(v0 << 16) \| v1`) | — | UNJUSTIFIED (cosmetic) | Pick one byte order across the family | S / L |
|
|
15
|
-
| K4 | **HIGH** ⚠ **INCONSISTENT** | explicit-stack quicksort partition | **9** (4 in `core`, 5 hand-rolled) | core: `core/collection/array/array_sort_quick.js:45`, `array_quick_sort_by_comparator.js:36`, `array_quick_sort_by_lookup_map.js:39`, `array_quick_sort_by_lookup_uint.js:38`; hand-rolled: `engine/graphics/render/forward_plus/sort_decal_data.js:65`, `view/minimap/gl/MinimapMarkersGL.js:165`, `engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js:756`, `core/bvh2/binary/2/BinaryUint32BVH.js:364`, `core/geom/2d/r-tree/StaticR2Tree.js:250` | `core/collection/array/array_quick_sort_by_comparator.js` | **UNJUSTIFIED for `sort_decal_data`; JUSTIFIED for the 4 others** (BVH/R-Tree/particles partition a *parallel* index array by a derived key with an inline swap — no existing signature covers that) | Give `core/collection/array/` a `quick_sort_indices(lookup, count, less_fn)` that partitions an index array; port `sort_decal_data` + `MinimapMarkersGL` onto it | M / M |
|
|
16
|
-
| K4a | **HIGH** | pivot capture in the copied quicksort | 1 divergent copy of 9 | `engine/graphics/render/forward_plus/sort_decal_data.js:70,74` compares `compare_decals(i, pivotIndex, …)` against the **live pivot index**; every other copy captures the pivot **value** first (`array_quick_sort_by_comparator.js:38`, `ParticleEmitter.js:758`, `MinimapMarkersGL.js:168`) | — | **UNJUSTIFIED / correctness hazard** | Once the element at `pivotIndex` is swapped the partition invariant breaks and decals come out in a wrong blend order. Fix by capturing the pivot's encoded value before the partition loop | S / L |
|
|
17
|
-
| K5 | **MED** ⚠ **INCONSISTENT** | binary search / lower bound | **6** (2 in `core`, 4 hand-rolled) with **4 different miss/tie semantics** | `core/collection/array/binarySearchLowIndex.js:10` (floor index, `-1` if below range, arbitrary index inside an equal run); `binarySearchHighIndex.js:10` (exact index, else insertion point `min`); `engine/animation/async/table_find_min_index_in_ordered_column.js:14` (returns `min2(minIndex,maxIndex)`; its JSDoc claims "low index of matching value" but it returns an **arbitrary** index of an equal run); `engine/animation/curve/AnimationCurve.js:233` (last index with `time ≤ t`, then explicitly fast-forwards over duplicates); `engine/graphics/sh3/lpg/bake_probe_sh3_resampled.js:61` (true `lower_bound`: `low < high`, `> value → high = mid`); `engine/sound/simulation/probe/probe_visibility_augment.js:170` (membership only) | `core/collection/array/binarySearch{Low,High}Index.js` | **UNJUSTIFIED for the semantics; JUSTIFIED for the typed-array/CSR ones** (`probe_visibility_augment` searches a `Uint32Array` slice, the core helpers take a comparator closure) | Document + name the two semantics explicitly (`array_lower_bound` = first index with `arr[i] >= v`, `array_upper_bound` = first index with `arr[i] > v`), fix `table_find_min_index_in_ordered_column`'s JSDoc-vs-behaviour mismatch, and give `core/graph/csr/` a `csr_adjacency_contains(adj, addr, u, v)` for the CSR case | M / M |
|
|
18
|
-
| K6 | **MED** | typed-array capacity growth (`new T(newCap)` + `.set(old)`) | **22** independent implementations, **5 different growth policies** | `core/collection/heap/Uint32Heap.js:103` (`max(cap*F, cap+MIN)`), `engine/physics/broadphase/PairList.js:91` (`cap << 1`), `engine/physics/events/ContactEventBuffer.js:65` (`cap << 1`, inlined in `push`), `engine/network/state/ReplicationSlotTable.js:198` (`max(cap*2, cap+64)`), `engine/sound/simulation/probe/AcousticProbeField.js:160` (`do{cap = max(cap*2, DEFAULT)}while`), `core/geom/2d/packing/skyline.js:90` (`while(cap<n) cap*=2`), plus `core/graph/csr/CSRGraph.js:191`, `core/collection/table/RowFirstTable.js:185`, `engine/graphics/sh3/lpv/LightProbeVolume.js:137`, `engine/physics/contact/ManifoldStore.js:742`, `engine/physics/body/BodyStorage.js:400`, `core/binary/BitSet.js:152` … | **none** — `core/collection/array/typed/` has copy/hash/convert helpers but no grow | **PROMOTION** | Add `core/collection/array/typed/typed_array_grow(array, min_capacity)` returning a new array of the same constructor with the old contents copied, using one geometric policy. Callers that keep several parallel arrays (CSRGraph, ManifoldStore, LightProbeVolume) call it once per array | M / L — pure refactor, growth policy change is a perf-only delta |
|
|
19
|
-
| K7 | LOW | defensive byte-slice copy (`new Uint8Array(len)` + `.set(src.subarray(0,len))`) | **6**, byte-identical | `engine/network/diagnostics/ReplayLog.js:42`, `engine/network/transport/LoopbackTransport.js:95`, `engine/network/transport/adapters/SimulatedTransport.js:157`, `engine/network/transport/fragments/FragmentAssembler.js:188`, `engine/network/transport/fragments/FragmentRetention.js:108`, `engine/network/transport/ReliableCommandPipeline.js:226` | `core/collection/array/typed/typed_array_copy.js` (copies into an *existing* destination, doesn't allocate) | **PROMOTION** | `core/collection/array/typed/typed_array_slice_copy(source, length)` → fresh same-type array. 6 call sites, 2 lines each | S / L |
|
|
20
|
-
| K8 | **HIGH** | ECS per-entity link/unlink bookkeeping | **17** hand-rolled vs **7** using the existing base class | hand-rolled: `engine/sound/simulation/ecs/AcousticVolumeSystem.js:40/55`, `engine/sound/simulation/ecs/AcousticSimulationSystem.js:45/62`, `engine/grid/grid2transform/GridPosition2TransformSystem.js:40/79`, `engine/graphics/ecs/mesh/MeshSystem.js:256/296`, `engine/interpolation/InterpolationSystem.js:119/132`, `engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js:307/356`, `engine/sound/ecs/audio/AudioEmitterSystem.js:129/162` (+10 more) | `engine/ecs/system/AbstractContextSystem.js` (+ `SystemEntityContext`), used by `LightSystem`, `FPDecalSystem`, `PathDisplaySystem`, `SpriteSystemPE`, `VoiceSystem`, `ParentEntitySystem`, `DynamicActorSystem` | **UNJUSTIFIED at the census level** — the shape is identical: build a record in `link`, store at `this.data[entity]`, subscribe signals, `delete this.data[entity]` + unsubscribe in `unlink` | See notes: the blocker is that `AbstractContextSystem.link()` dispatches through `arguments` (`AbstractContextSystem.js:69-90`), which is exactly the "magic" the house style rejects. Propose typed arity-specific bases (`ContextSystem1`/`ContextSystem2`/`ContextSystem3` with real named parameters) and migrate the 17 | L / M |
|
|
21
|
-
| K8a | LOW | `delete this.data[entity]` on a dense array | 17 (same files as K8) | `engine/sound/simulation/ecs/AcousticVolumeSystem.js:60`, `engine/grid/grid2transform/GridPosition2TransformSystem.js:85`, `engine/graphics/ecs/mesh/MeshSystem.js` unlink | — | UNJUSTIFIED (perf, folds into K8) | `delete` on an array index forces the backing store to dictionary mode. Whatever K8 lands should store contexts in a `Uint32Map`/plain array + tombstone instead | folds into K8 |
|
|
22
|
-
| K9 | **MED** ⚠ **INCONSISTENT** | linear scan for an element by `.id`/`.name` | **22** explicit loops (plus ~20 more using `Array.prototype.find`) | `core/binary/type/Type.js:44` (returns **`null`**), `engine/graphics/geometry/AttributeGroupSpec.js:56` (returns **`undefined`**), `generation/grid/GridData.js:82` (returns **`undefined`**), `engine/scene/SceneManager.js:101` (returns **`-1`**), `core/model/node-graph/node/NodeDescription.js:169`, `engine/graphics/particles/particular/group/ParticleSpecification.js:26`, `engine/plugin/EnginePluginManager.js:311` | `core/collection/array/array_index_by_equality.js` | **JUSTIFIED for the loop; UNJUSTIFIED for the sentinel** — a generic `find_by(array, key, value)` would be a **string-keyed** lookup, which the house style forbids; the closure form is already `Array.prototype.find`. The real defect is that the "not found" answer is three different values across sibling APIs | Do **not** extract a helper. Instead standardise the miss sentinel per return kind (element-returning → `undefined`, index-returning → `-1`) and drop the `null` returns (`Type.js:50`) per the no-null house rule | S / L |
|
|
23
|
-
| K10 | **HIGH** | raw `Math.random()` on paths that must be deterministic | **11** sites; 2 are simulation-authoritative | `engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js:31` (**seeds an AI behaviour tree** — `actor_seed ^ computeHashFloat(Math.random())`), `engine/intelligence/behavior/util/RandomDelayBehavior.js:9` (**seeds behaviour-tree delays** — `Date.now() ^ Math.random()*UINT32_MAX`), `engine/physics/mls-mpm/MLS_MPM.js:388`, `engine/sound/sopra/definition/effect/ReverbEffect.js:59` (reverb IR differs every session), `engine/animation/removeEntityWithMeshParticlesEffect.js:167`, `view/minimap/dom/MinimapCameraView.js:110`, `engine/ecs/terrain/tiles/TerrainTileManager.js:208` (debug-only), `engine/sound/ecs/SoundControllerSystem.js:15` (`@deprecated`) | `core/math/random/seededRandom.js`, `randomSeed.js`, `randomFromArray.js` (63 files already use them) | **UNJUSTIFIED for the top 4; JUSTIFIED (cosmetic) for minimap jitter, VFX seed, debug tile colour** | Route the two behaviour-tree seeds off a run-level seeded stream (the engine already threads seeds — `MarkerNodeActionSelectWeighted.js:92` shows the pattern). `MLS_MPM.add_rnd_square` should take a `random` argument like every other `sample_random_point_in_volume` in `core/geom/3d/shape/`. `ReverbEffect` should hash its own parameters into a `seededRandom` | M / M |
|
|
24
|
-
| K11 | — | seeded RNG algorithm count | **2** (`seededRandom_Mulberry32.js`, `seededRandom_MersenneTwister.js`; `seededRandom.js` is an alias for the former) | `core/math/random/seededRandom.js:4` | — | **CLEAN — no finding.** There are *not* several competing RNGs. Stateless mixers (`lowbias32`, `murmur3_32`, `squirrel3`) are a different concept and each has one implementation | — | — |
|
|
25
|
-
| K12 | LOW ⚠ **INCONSISTENT** | weighted (cumulative) random selection | **3 core entry points + 1 hand-rolled** | `core/math/random/random_pick_weighted_index.js:12`, `core/collection/array/weightedRandomFromArray.js:21`, `core/geom/3d/shape/UnionShape3D.js:131,257` (both call the core `binarySearchHighIndex`), hand-rolled: `engine/graphics/sh3/lpg/bake_probe_sh3_resampled.js:53` (`pick_candidate`, a true `lower_bound`) | `core/math/random/random_pick_weighted_index.js` | **JUSTIFIED (`pick_candidate` works on a module-static `Float64Array` with no comparator closure, in a per-probe inner loop) — but the tie-break disagrees** | `binarySearchHighIndex` returns an **arbitrary** index inside an equal cumulative run, so `random_pick_weighted_index` can select a **zero-weight** entry when `random()*total` lands exactly on a boundary (reachable: Mulberry32 returns exact `0`). `pick_candidate` cannot. Make the shared path use `lower_bound` semantics | S / L |
|
|
26
|
-
| K13 | **MED** ⚠ **INCONSISTENT** | three.js material `transform()` / `onBeforeCompile` marker injection | **3** near-identical copies with **3 different clone semantics** | `engine/graphics/render/forward_plus/plugin/MaterialTransformer.js:91` (`result = source.clone()` — clones, source untouched), `engine/graphics/sh3/gi/material/MaterialTransformer.js:294` (**`result.clone();` — return value discarded**, then mutates `source` in place: a dead statement, clear copy-paste artifact), `engine/graphics/sh3/lpg/material/LightProbeGridMaterialTransformer.js:207` (no clone at all, mutates `source`) | `engine/graphics/material/composeCompile.js`, `…/forward_plus/plugin/isLitMaterial.js` — the *pieces* are already shared; the ~25-line guard/clone/mark envelope is not | **UNJUSTIFIED / correctness hazard** | Extract `material_transform_once(source, marker, on_before_compile, {clone})` — or, house-style, a small `AbstractMaterialTransformer` base with an explicit `clone` policy decided once. Also: two of the three declare a **module-local `const PROPERTY_TRANSFORMER_MARKER`** with *different values* (`MaterialTransformer.js:19` vs `LightProbeGridMaterialTransformer.js:15`) — same identifier, different meaning | M / M |
|
|
27
|
-
| K14 | LOW ⚠ **INCONSISTENT** | the identifier `EPSILON` | **5 different values** live under one name | `core/math/EPSILON.js:5` = `1e-7` (imported by 21 files) vs module-local `const EPSILON` = `1e-10` in `core/math/linalg/eigen/matrix_qr_in_place.js:1` and `matrix_householder_in_place.js:1`, `1e-9` in `engine/animation/curve/animation_curve_optimize.js:106`, `1e-17` in `core/geom/3d/topology/struct/binary/io/bt_mesh_face_island_erode.js:427` | `core/math/EPSILON.js`, `FLT_EPSILON_{16,32,64}.js` | **JUSTIFIED (the tolerances are algorithm-specific) / UNJUSTIFIED (the name is not)** | Rename the locals to domain names, as ~20 other files already do (`MPR_EPSILON`, `PLANE_EPS`, `BARY_EPS`, `EPA_EPS`, `STALE_EPSILON`) | S / L |
|
|
28
|
-
| K15 | LOW | `Math.abs(a - b) < eps` inline | 23 sites; `epsilonEquals` used by 10 files | `core/geom/mat2/m2_is_orthogonal.js:18`, `engine/sound/simulation/render/ProbeReverbRenderer.js:198-200`, `engine/physics/fluid/ecs/FluidSystem.js:232-234`, `core/math/spline/spline3_hermite_nearest_point.js:103` | `core/math/epsilonEquals.js:11` | **JUSTIFIED** — every site passes its own domain tolerance; `epsilonEquals(a,b,tol)` adds only asserts, and half the sites are `>` (not-equal) tests that `epsilonEquals` cannot express without a negation. `roughlyEquals`/`_roughlyEquals` on `Vector2/3/Quaternion/ConicRay` is already the shared vector-level primitive | — | — |
|
|
29
|
-
| K16 | LOW | AABB accumulation over a point set (`x0 = Infinity` … min/max) | **10** hand-rolled + 4 primitives | hand-rolled: `core/bvh8/build/TriangleCluster.js:13`, `core/geom/2d/quad-tree-binary/QuadTree.js:142`, `core/geom/3d/shape/MeshShape3D.js:251`, `core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.js:24`, `engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js:158`, `engine/sound/simulation/probe/probe_delaunay_edges.js:156`, `engine/sound/simulation/probe/probe_visibility_bridge_components.js` | `core/geom/3d/aabb/aabb3_from_v3_array.js`, `aabb3_from_v3_array_transformed.js`, `aabb_nd_from_points.js`, `core/geom/2d/aabb/aabb2_from_v2_buffer.js` | **PARTIALLY JUSTIFIED** — the *iteration source* genuinely differs (flat float buffer vs accessor methods vs half-edge loop walk), so one function cannot cover all. The reusable part is the 6-line accumulate step | Add `aabb3_array_expand_by_point(aabb, x, y, z)` next to the existing `aabb3_expand_array.js` and use it as the inner step; `probe_delaunay_edges` and `TriangleCluster` can call `aabb3_from_v3_array` outright | S / L |
|
|
30
|
-
| K17 | LOW | `traverseThreeObject` | 1 helper that reimplements `THREE.Object3D.prototype.traverse` | `engine/graphics/ecs/highlight/renderer/traverseThreeObject.js:7`; imported by `engine/asset/loaders/GLTFAssetLoader.js:9` and `engine/graphics/material/optimization/MaterialOptimizationContext.js:25`, while ~28 other sites call three's native `.traverse()` | `THREE.Object3D.traverse` | **JUSTIFIED (it adds a `thisArg`, which three's does not) / but misplaced** | Move it to `engine/graphics/three/` — the package's declared three-adapter boundary — rather than living under `highlight/renderer/` and being reached by a 4-level relative import from the asset loader | S / L |
|
|
31
|
-
| K18 | LOW | `WebGLRenderTarget` option bags | 15 construction sites, each repeating `depthBuffer/stencilBuffer/generateMipmaps/minFilter/magFilter` | `engine/graphics/ecs/highlight/renderer/OutlineRenderer.js:232,241,250,259,268`, `engine/graphics/render/visibility/hiz/query/BatchOcclusionQuery.js:41`, `engine/graphics/texture/virtual/VirtualTextureUsageUpdater.js:105`, `engine/graphics/render/visibility/hiz/buffer/HierarchicalZBuffer.js:94` | — | **JUSTIFIED** — three's constructor *is* the primitive; a wrapper would need per-field override sentinels, which the "uniform control flow" rule forbids. Only `OutlineRenderer`'s 5 adjacent near-identical bags are worth a local named-constant pair | — | — |
|
|
32
|
-
| K19 | — | three.js texture format / type / wrap translation | 1 composed family, no duplicates | `engine/graphics/texture/channelCountToThreeTextureFormat.js:9`, `computeThreeTextureFormat.js:10`, `attribute_spec_to_three_format.js:12`, `formatToChannelCount.js:19`, `computeThreeTextureFormatFromDataType.js` (`@deprecated`, delegates) | — | **CLEAN — no finding**, and the counter-example that proves the pattern works: one `switch`, everything else composes onto it | — | — |
|
|
33
|
-
| K20 | LOW | `document.createElement('canvas')` + size + `getContext` | 10 production sites | `engine/graphics/GraphicsEngine.js:492`, `engine/graphics/makeModelView.js:15`, `engine/graphics/render/RendererPool.js:9`, `engine/graphics/texture/sampler/sampler2d_to_data_url.js:14`, `engine/graphics/texture/sampler/convertTexture2Sampler2D.js:57`, `engine/asset/loaders/image/codec/NativeImageDecoder.js:14`, `engine/asset/loaders/material/computeImageBitmapEquality.js:61` | — | **JUSTIFIED** — 3 lines, and the contexts requested differ (`2d` vs `webgl2` vs none) | — | — |
|
|
34
|
-
| K21 | — | `clamp` / `lerp` / `DEG_TO_RAD` adoption | 1 inline clamp in the whole tree | only `core/graph/metis/native/bisection/fm_2way.js:50` nests `Math.min(Math.max(…))`; `Math.PI/180` appears inline 3× and all 3 are named constants for a fixed angle | `core/math/clamp.js`, `lerp.js`, `DEG_TO_RAD.js` | **CLEAN — no finding.** The 129 "inline lerp" pattern hits are flat-array vector math (`a + (b-a)*t` on `Float32Array` offsets), where a scalar `lerp` call is not the same operation | — | — |
|
|
35
|
-
| K22 | — | grid index ↔ coordinate (`y*width + x`) | ~25 inline sites | `engine/graphics/texture/sampler/Sampler2D.js:488`, `engine/graphics/sh3/lightmap/lightmap_denoise.js:60`, `engine/physics/fluid/ecs/FluidObstacleSystem.js:335` | — | **JUSTIFIED** — one arithmetic expression in hot per-texel loops; extracting it is a pure pessimisation with no correctness payoff | — | — |
|
|
36
|
-
|
|
37
|
-
## Per-concern detail
|
|
38
|
-
|
|
39
|
-
### 1. Hash combination
|
|
40
|
-
`core/collection/array/combine_hash.js` is the house primitive and is **well adopted — 62 importing files**.
|
|
41
|
-
Against that, **33 files** still hand-roll `h = h*31 + v` (74 statements). The worst concentrations are
|
|
42
|
-
`engine/physics/ecs` (Joint 13, RigidBody 12, Collider 4) and `core/geom/3d/shape` (7 files). These are
|
|
43
|
-
determinism/dedup hashes, called at checkpoints, not in inner loops — `combine_hash` is variadic (rest-arg
|
|
44
|
-
allocation), which is a fair reason to avoid it *there*, but not a reason to hand-inline a mix: the fix is a
|
|
45
|
-
2-arg `hash_combine(h, v)`. The mixes are **not** the same function once you account for truncation
|
|
46
|
-
(K1a): `|0` per step, `>>>0` at the end, or never — four disciplines in five sibling functions, and
|
|
47
|
-
`uint32_array_hash` leaks out of int32 entirely. Two further shared defects (K2 `offset` handling, K3
|
|
48
|
-
endianness) were copied into every clone, which is the clearest evidence in this audit that duplication here
|
|
49
|
-
propagates bugs rather than merely wasting lines.
|
|
50
|
-
|
|
51
|
-
### 2. `equals()` / epsilon comparison
|
|
52
|
-
`core/math/epsilonEquals.js` exists (10 importers) and `EPSILON = 1e-7`, `FLT_EPSILON_{16,32,64}` are all
|
|
53
|
-
provided. 23 inline `Math.abs(a-b) < eps` sites remain, but **every one passes a domain tolerance** chosen for
|
|
54
|
-
its algorithm (`PLANE_EPS = 1e-3`, `BARY_EPS = 1e-6`, `SEGMENT_EPS = 1e-12`, `DIR_EPS = 1e-18`), and about
|
|
55
|
-
half are `>` not-equal tests. This is **not** a reuse failure. The one real hazard is K14: four modules declare
|
|
56
|
-
a local `const EPSILON` with values from `1e-9` to `1e-17`, colliding with the imported `1e-7` name. Vector-level
|
|
57
|
-
tolerant comparison is already consolidated on `roughlyEquals`/`_roughlyEquals` (`Vector2.js:696`,
|
|
58
|
-
`Vector3.js:867`, `Quaternion.js:1479`, `ConicRay.js:83`).
|
|
59
|
-
|
|
60
|
-
### 3. Linear scan by id
|
|
61
|
-
**22** explicit for-loops that scan for `.id`/`.name`/`.key` and return the match, plus ~20 more written as
|
|
62
|
-
`Array.prototype.find`. Verdict is deliberately **not** "extract a helper": the only generic form is either
|
|
63
|
-
string-keyed (`find_by(array, 'name', x)` — forbidden by the typed-over-magic rule) or a closure, which
|
|
64
|
-
`Array.prototype.find` and `core/collection/array/array_index_by_equality.js` already are. The finding that
|
|
65
|
-
survives is the **miss sentinel**: `Type.getFieldByName` returns `null`, `AttributeGroupSpec.getAttribute` and
|
|
66
|
-
`GridData.getLayerById` return `undefined`, index-returning variants return `-1`. Three conventions for the
|
|
67
|
-
same question, and the `null` returns contradict the no-null-defaults house rule.
|
|
68
|
-
|
|
69
|
-
### 4. Binary search / lower bound
|
|
70
|
-
Six real implementations (the 30 `binary_search_inline` pattern hits are mostly `>> 1` bit arithmetic and
|
|
71
|
-
quicksort pivots — false positives). `core` provides two, `engine` hand-rolls four. They disagree on the two
|
|
72
|
-
questions that matter: what is returned on a **miss**, and which index is returned inside an **equal run**.
|
|
73
|
-
`AnimationCurve.js:238` is the only one that explicitly handles duplicate keys (it fast-forwards past the equal
|
|
74
|
-
run at `:249`) — and it had to, because the shared `binarySearchHighIndex` would have handed it an arbitrary
|
|
75
|
-
one. `table_find_min_index_in_ordered_column`'s JSDoc claims "low index of matching value"; the code does not
|
|
76
|
-
deliver that. `bake_probe_sh3_resampled.pick_candidate` is the only correct `lower_bound` in the tree.
|
|
77
|
-
|
|
78
|
-
### 5. Seeded vs unseeded randomness
|
|
79
|
-
Two questions, two different answers. **How many RNGs?** Only two (Mulberry32, Mersenne Twister), with
|
|
80
|
-
`seededRandom` aliasing the former — this is clean, no finding. **How many raw `Math.random()`?** Eleven, of
|
|
81
|
-
which four matter. `WeightedRandomActionDescription.js:31` and `RandomDelayBehavior.js:9` seed *behaviour trees*
|
|
82
|
-
from wall-clock/`Math.random()`, which defeats replay, rewind (`engine/network/sim/RewindEngine.js`) and the
|
|
83
|
-
action-log replication model. `MLS_MPM.add_rnd_square` (`:388`) is the only shape-sampling function in the tree
|
|
84
|
-
that does not take a `random` argument — every `sample_random_point_in_volume` in `core/geom/3d/shape/` does.
|
|
85
|
-
`ReverbEffect.js:59` bakes a fresh noise impulse response each session, so the same event sounds different run
|
|
86
|
-
to run. The remaining seven (minimap jitter, VFX seed, debug tile colour, a `@deprecated` sound picker) are
|
|
87
|
-
cosmetic and fine.
|
|
88
|
-
|
|
89
|
-
### 6. Weighted random selection
|
|
90
|
-
Better consolidated than the brief suggested: `random_pick_weighted_index`, `weightedRandomFromArray` and the
|
|
91
|
-
two `UnionShape3D` sites all funnel into `binarySearchHighIndex`, and `MarkerNodeActionSelectWeighted.js:92`
|
|
92
|
-
already uses the core helper. Only one hand-rolled selector remains — `pick_candidate` in
|
|
93
|
-
`bake_probe_sh3_resampled.js:53` — and it is justified (module-static `Float64Array`, no comparator closure, per-probe
|
|
94
|
-
inner loop). The finding is not duplication but disagreement: `pick_candidate` is a true `lower_bound` and so can
|
|
95
|
-
never select a zero-weight entry; the shared path can, because `binarySearchHighIndex` returns an arbitrary index
|
|
96
|
-
inside an equal cumulative run.
|
|
97
|
-
|
|
98
|
-
### 7. Typed-array growth
|
|
99
|
-
**22 independent grow implementations, 5 distinct growth policies**, and `core/collection/array/typed/` has no
|
|
100
|
-
grow helper despite holding copy/hash/convert/normalise helpers. Policies range from `cap << 1` (unbounded
|
|
101
|
-
doubling from a possibly-zero start — `PairList.js:91` would loop forever at `cap === 0`) to
|
|
102
|
-
`max(cap*1.5, cap+64)`. This is the cleanest **PROMOTION** in the audit: one function, no semantic choice to
|
|
103
|
-
make, and every call site is already isolated inside a private `#grow`/`__grow_capacity`/`ensureCapacity`.
|
|
104
|
-
Six further sites in `engine/network/transport` do exact-size defensive byte-slice copies (K7) — a different,
|
|
105
|
-
equally trivial promotion.
|
|
106
|
-
|
|
107
|
-
### 8. Object pooling
|
|
108
|
-
`core/model/object/ObjectPoolFactory.js` has 6 importers. Applying the brief's own distinction: the
|
|
109
|
-
module-static scratch objects (`weightedRandomFromArray.js:10`, `sort_decal_data.js:1`,
|
|
110
|
-
`bake_probe_sh3_resampled.js:37`) are idiomatic and **not** findings. The free-list allocators
|
|
111
|
-
(`core/bvh2/bvh3/BVH.js:156`, `core/geom/2d/bvh/BVH2D.js:111`, `core/geom/3d/tetrahedra/TetrahedralMesh.js:127`,
|
|
112
|
-
`core/geom/3d/topology/struct/binary/BinaryElementPool.js:40`) are **slot** allocators over typed arrays —
|
|
113
|
-
a different concept from `ObjectPoolFactory`'s object recycling, and three of them already delegate to
|
|
114
|
-
`BinaryElementPool`. **No genuine hand-rolled duplicate of `ObjectPoolFactory` was found.** The one soft spot
|
|
115
|
-
is `core/cache/wtinylfu/CacheWTinylfu.js:757` (`pool.length > 0 ? pool.pop() : new CacheElementWTinylfu()`),
|
|
116
|
-
a 1-line inline pool in a hot cache path — justified.
|
|
117
|
-
|
|
118
|
-
### 9. three.js translation at non-boundary sites
|
|
119
|
-
The 208 `from 'three'` imports are *not* the story: 26 of them are in `engine/graphics/ecs`, which is a
|
|
120
|
-
rendering-binding layer by design. Checking the four candidate translations named in the brief:
|
|
121
|
-
texture format/type/wrap enum mapping is **cleanly factored** (K19) — one `switch`, everything composes;
|
|
122
|
-
`WebGLRenderTarget` construction is 15 vendor option bags with no shared logic to extract (K18);
|
|
123
|
-
`BufferGeometry` attribute setup (179 `setAttribute`/`BufferAttribute` sites) is genuinely per-geometry;
|
|
124
|
-
`Object3D` traversal has one helper that duplicates three's own but adds `thisArg`, merely misplaced (K17).
|
|
125
|
-
The one real repeat is **material `onBeforeCompile` marker injection** (K13): three copies of a 25-line
|
|
126
|
-
guard/clone/mark envelope that disagree on whether they clone, one of which contains a dead `result.clone();`.
|
|
127
|
-
|
|
128
|
-
### 10. ECS System lifecycle boilerplate
|
|
129
|
-
58 `extends System` classes tree-wide: 44 define `link`, 43 `unlink`, 23 `startup`, 18 `shutdown`.
|
|
130
|
-
Signal subscribe/unsubscribe is **balanced in all 17 systems that subscribe** — no leak pattern at the census
|
|
131
|
-
level. The duplication is the per-entity record: **17 systems** build a record in `link`, store it at
|
|
132
|
-
`this.data[entity]`, and `delete this.data[entity]` in `unlink`, while **7 systems** get exactly that from
|
|
133
|
-
`engine/ecs/system/AbstractContextSystem.js`. A typed shared helper is viable, but the existing one is not the
|
|
134
|
-
one to spread: its `link()` reads `arguments` positionally and copies components into `ctx.components[i]`
|
|
135
|
-
(`AbstractContextSystem.js:69-90`), i.e. untyped variadic dispatch — the house style's stated objection. The
|
|
136
|
-
honest recommendation is arity-specific typed bases with named parameters, then migrate.
|
|
137
|
-
|
|
138
|
-
### 11. Other systemic patterns checked
|
|
139
|
-
Checked and **clean, no finding**: `clamp` (1 inline site tree-wide), `lerp`, `smoothStep`,
|
|
140
|
-
`DEG_TO_RAD`/`RAD_TO_DEG` (3 inline `Math.PI/180`, all named angle constants), dB↔linear
|
|
141
|
-
(`engine/sound/dB2Volume.js` + `volume2dB.js` are the single pair; `EventInstance.js:34` and
|
|
142
|
-
`echogram_band_rt60.js:49` are distinct formulas, not copies), sRGB↔linear (`core/color/sRGB/`, one impl;
|
|
143
|
-
the shader-side uses three's own), string padding/`toFixed` (no repeated formatter), grid index↔coord (K22),
|
|
144
|
-
`Object.assign` shallow clone (9 sites, all genuinely different objects), `JSON.parse(JSON.stringify())`
|
|
145
|
-
deep clone (3 sites, all in cold paths).
|
|
146
|
-
|
|
147
|
-
## Notes — what structurally causes cross-cutting reuse failure here
|
|
148
|
-
|
|
149
|
-
1. **The primitives exist and are known; the gap is at the *last mile*.** `combine_hash` has 62 importers,
|
|
150
|
-
`seededRandom` 63, `clamp`/`lerp` are near-universal. Reuse failure is not ignorance of `core/` — it
|
|
151
|
-
concentrates in the last two lines of an otherwise-reusing function (`h = h*31 + v` written inline inside a
|
|
152
|
-
`hash()` that already imports three other core helpers).
|
|
153
|
-
2. **The missing primitives are the ones nobody thought to name.** Typed-array growth (22 impls) and
|
|
154
|
-
defensive byte-slice copy (6 impls) have no `core/` home at all — and both are single-signature functions
|
|
155
|
-
with zero design choices. Where `core/` names a concept, the codebase converges on it; where it does not,
|
|
156
|
-
it diverges 22 ways.
|
|
157
|
-
3. **Copy-paste is the propagation vector for defects, not just for lines.** The `offset`/`length` confusion
|
|
158
|
-
(K2) exists identically in five hash functions; the four-way truncation disagreement (K1a) exists because
|
|
159
|
-
each was typed fresh; the live-pivot quicksort (K4a) is a copy that dropped one line
|
|
160
|
-
(`const pivot = data[pivotIndex]`); the dead `result.clone();` in the GI material transformer (K13) is a
|
|
161
|
-
copy that dropped an assignment. Every ⚠ in this report is a *divergence introduced by copying*, not an
|
|
162
|
-
independently-invented alternative.
|
|
163
|
-
4. **When a shared abstraction violates the house style, adoption stalls and the duplication grows around it.**
|
|
164
|
-
`AbstractContextSystem` is the correct abstraction for 24 systems and has 7 users; the other 17 hand-roll it.
|
|
165
|
-
Its `link()` is `arguments`-based magic. This is the codebase telling you which rule wins.
|
|
166
|
-
5. **Family functions written as siblings rather than as one function plus adapters drift.** The five array-hash
|
|
167
|
-
functions, the four quicksorts in `core/collection/array/`, the two binary searches — each family was written
|
|
168
|
-
as N parallel files, and each family now disagrees internally. The texture-format family (K19), written as
|
|
169
|
-
one `switch` plus composing wrappers, is the counter-example and has no drift at all.
|
|
1
|
+
# Domain K — cross-cutting reuse failures
|
|
2
|
+
|
|
3
|
+
Scope: concerns that cut across packages. Every count below comes from a grep/AST census run over
|
|
4
|
+
`H:/git/moh/app/src/mir-engine/meep/src/` excluding `*.spec.js`, `prototype*.js`, `test*.js`.
|
|
5
|
+
Census scripts are in the scratchpad (`grow.mjs`, `sys.mjs`, `sys2.mjs`, `census.mjs`).
|
|
6
|
+
|
|
7
|
+
## Findings
|
|
8
|
+
|
|
9
|
+
| # | Severity | Concept | # of independent impls | Representative sites | Existing primitive (if any) | Verdict | Proposed common path | Effort/Risk |
|
|
10
|
+
|---|---|---|---|---|---|---|---|---|
|
|
11
|
+
| K1 | **HIGH** ⚠ **INCONSISTENT** | 32-bit hash *combine* (`h*31 + v`) | **33 files** hand-roll the mix (74 mix statements) while **62 files** import the primitive | `engine/physics/ecs/Joint.js:444`, `engine/physics/ecs/RigidBody.js:281`, `engine/physics/ecs/Collider.js:159`, `core/geom/3d/shape/HeightMapShape3D.js:461`, `core/model/BoundedValue.js:180`, `core/geom/Vector2.js:640`, `core/graph/csr/CSRGraph.js:281` | `core/collection/array/combine_hash.js:9` (variadic); `core/math/hash/lowbias32.js`, `murmur3_32.js`, `squirrel3.js` | **UNJUSTIFIED** — but see K1a: the mixes are not the same function | Add a non-variadic, allocation-free `hash_combine(h, v)` in `core/math/hash/` (2 args, `|0`-truncating) and route both `combine_hash` and the 33 hand-rolled chains through it | M / M — every changed `hash()` changes its value; any persisted hash must be re-baselined |
|
|
12
|
+
| K1a | **HIGH** ⚠ **INCONSISTENT** | integer-domain discipline of the *same* hash | **4 mutually-incompatible disciplines** across 5 sibling functions | `core/collection/array/computeHashArray.js:24` (`hash \|= 0` every iteration) vs `core/collection/array/typed/uint32_array_hash.js:15` (**never truncates**) vs `core/collection/array/computeStridedIntegerArrayHash.js:27` (`>>> 0` at the end only) vs `core/primitives/strings/computeStringHash.js:40` (`>>> 0`) vs `core/geom/Vector2.js:640` (no truncation, returns a non-int32) | — | **UNJUSTIFIED / correctness hazard** | One truncation rule (`\| 0` per step) applied by the shared `hash_combine`; `uint32_array_hash` currently returns an ever-widening float (its accumulator escapes int32 on the first ≥2³¹ element and drifts as a ±random walk — the exact workload `CSRGraph.hash()` feeds it at `CSRGraph.js:285-292`) | S / M |
|
|
13
|
+
| K2 | **HIGH** ⚠ **INCONSISTENT** | `(array, offset, length)` array-hash contract | latent off-by-semantics replicated into **5** clones | `core/collection/array/typed/uint32_array_hash.js:11`, `uint8_array_hash.js:19`, `uint16_array_hash.js:17`, `core/collection/array/computeStridedIntegerArrayHash.js:14`, `computeStridedArrayHash.js:23` — all loop `i < length` while the JSDoc and `array_buffer_hash.js:12` treat `length` as a **count**, so any `offset > 0` silently hashes the wrong (short) range | — | **UNJUSTIFIED** — copy-paste propagated the defect into every clone | Fix once in a shared `hash_combine`-based loop; `uint8_array_hash.js:15` is even self-contradictory (head loop `i < offset + overflow`, body loop `i < length`). All current callers pass `offset === 0`, so nothing is broken **today**, but `offset` is public library surface | S / L |
|
|
14
|
+
| K3 | LOW ⚠ **INCONSISTENT** | word packing in sibling array hashes | 2 | `core/collection/array/typed/uint8_array_hash.js:26-29` packs **little-endian** (`v0 \| v1<<8 \| v2<<16 \| v3<<24`); `uint16_array_hash.js:22` packs **big-endian** (`(v0 << 16) \| v1`) | — | UNJUSTIFIED (cosmetic) | Pick one byte order across the family | S / L |
|
|
15
|
+
| K4 | **HIGH** ⚠ **INCONSISTENT** | explicit-stack quicksort partition | **9** (4 in `core`, 5 hand-rolled) | core: `core/collection/array/array_sort_quick.js:45`, `array_quick_sort_by_comparator.js:36`, `array_quick_sort_by_lookup_map.js:39`, `array_quick_sort_by_lookup_uint.js:38`; hand-rolled: `engine/graphics/render/forward_plus/sort_decal_data.js:65`, `view/minimap/gl/MinimapMarkersGL.js:165`, `engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js:756`, `core/bvh2/binary/2/BinaryUint32BVH.js:364`, `core/geom/2d/r-tree/StaticR2Tree.js:250` | `core/collection/array/array_quick_sort_by_comparator.js` | **UNJUSTIFIED for `sort_decal_data`; JUSTIFIED for the 4 others** (BVH/R-Tree/particles partition a *parallel* index array by a derived key with an inline swap — no existing signature covers that) | Give `core/collection/array/` a `quick_sort_indices(lookup, count, less_fn)` that partitions an index array; port `sort_decal_data` + `MinimapMarkersGL` onto it | M / M |
|
|
16
|
+
| K4a | **HIGH** | pivot capture in the copied quicksort | 1 divergent copy of 9 | `engine/graphics/render/forward_plus/sort_decal_data.js:70,74` compares `compare_decals(i, pivotIndex, …)` against the **live pivot index**; every other copy captures the pivot **value** first (`array_quick_sort_by_comparator.js:38`, `ParticleEmitter.js:758`, `MinimapMarkersGL.js:168`) | — | **UNJUSTIFIED / correctness hazard** | Once the element at `pivotIndex` is swapped the partition invariant breaks and decals come out in a wrong blend order. Fix by capturing the pivot's encoded value before the partition loop | S / L |
|
|
17
|
+
| K5 | **MED** ⚠ **INCONSISTENT** | binary search / lower bound | **6** (2 in `core`, 4 hand-rolled) with **4 different miss/tie semantics** | `core/collection/array/binarySearchLowIndex.js:10` (floor index, `-1` if below range, arbitrary index inside an equal run); `binarySearchHighIndex.js:10` (exact index, else insertion point `min`); `engine/animation/async/table_find_min_index_in_ordered_column.js:14` (returns `min2(minIndex,maxIndex)`; its JSDoc claims "low index of matching value" but it returns an **arbitrary** index of an equal run); `engine/animation/curve/AnimationCurve.js:233` (last index with `time ≤ t`, then explicitly fast-forwards over duplicates); `engine/graphics/sh3/lpg/bake_probe_sh3_resampled.js:61` (true `lower_bound`: `low < high`, `> value → high = mid`); `engine/sound/simulation/probe/probe_visibility_augment.js:170` (membership only) | `core/collection/array/binarySearch{Low,High}Index.js` | **UNJUSTIFIED for the semantics; JUSTIFIED for the typed-array/CSR ones** (`probe_visibility_augment` searches a `Uint32Array` slice, the core helpers take a comparator closure) | Document + name the two semantics explicitly (`array_lower_bound` = first index with `arr[i] >= v`, `array_upper_bound` = first index with `arr[i] > v`), fix `table_find_min_index_in_ordered_column`'s JSDoc-vs-behaviour mismatch, and give `core/graph/csr/` a `csr_adjacency_contains(adj, addr, u, v)` for the CSR case | M / M |
|
|
18
|
+
| K6 | **MED** | typed-array capacity growth (`new T(newCap)` + `.set(old)`) | **22** independent implementations, **5 different growth policies** | `core/collection/heap/Uint32Heap.js:103` (`max(cap*F, cap+MIN)`), `engine/physics/broadphase/PairList.js:91` (`cap << 1`), `engine/physics/events/ContactEventBuffer.js:65` (`cap << 1`, inlined in `push`), `engine/network/state/ReplicationSlotTable.js:198` (`max(cap*2, cap+64)`), `engine/sound/simulation/probe/AcousticProbeField.js:160` (`do{cap = max(cap*2, DEFAULT)}while`), `core/geom/2d/packing/skyline.js:90` (`while(cap<n) cap*=2`), plus `core/graph/csr/CSRGraph.js:191`, `core/collection/table/RowFirstTable.js:185`, `engine/graphics/sh3/lpv/LightProbeVolume.js:137`, `engine/physics/contact/ManifoldStore.js:742`, `engine/physics/body/BodyStorage.js:400`, `core/binary/BitSet.js:152` … | **none** — `core/collection/array/typed/` has copy/hash/convert helpers but no grow | **PROMOTION** | Add `core/collection/array/typed/typed_array_grow(array, min_capacity)` returning a new array of the same constructor with the old contents copied, using one geometric policy. Callers that keep several parallel arrays (CSRGraph, ManifoldStore, LightProbeVolume) call it once per array | M / L — pure refactor, growth policy change is a perf-only delta |
|
|
19
|
+
| K7 | LOW | defensive byte-slice copy (`new Uint8Array(len)` + `.set(src.subarray(0,len))`) | **6**, byte-identical | `engine/network/diagnostics/ReplayLog.js:42`, `engine/network/transport/LoopbackTransport.js:95`, `engine/network/transport/adapters/SimulatedTransport.js:157`, `engine/network/transport/fragments/FragmentAssembler.js:188`, `engine/network/transport/fragments/FragmentRetention.js:108`, `engine/network/transport/ReliableCommandPipeline.js:226` | `core/collection/array/typed/typed_array_copy.js` (copies into an *existing* destination, doesn't allocate) | **PROMOTION** | `core/collection/array/typed/typed_array_slice_copy(source, length)` → fresh same-type array. 6 call sites, 2 lines each | S / L |
|
|
20
|
+
| K8 | **HIGH** | ECS per-entity link/unlink bookkeeping | **17** hand-rolled vs **7** using the existing base class | hand-rolled: `engine/sound/simulation/ecs/AcousticVolumeSystem.js:40/55`, `engine/sound/simulation/ecs/AcousticSimulationSystem.js:45/62`, `engine/grid/grid2transform/GridPosition2TransformSystem.js:40/79`, `engine/graphics/ecs/mesh/MeshSystem.js:256/296`, `engine/interpolation/InterpolationSystem.js:119/132`, `engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js:307/356`, `engine/sound/ecs/audio/AudioEmitterSystem.js:129/162` (+10 more) | `engine/ecs/system/AbstractContextSystem.js` (+ `SystemEntityContext`), used by `LightSystem`, `FPDecalSystem`, `PathDisplaySystem`, `SpriteSystemPE`, `VoiceSystem`, `ParentEntitySystem`, `DynamicActorSystem` | **UNJUSTIFIED at the census level** — the shape is identical: build a record in `link`, store at `this.data[entity]`, subscribe signals, `delete this.data[entity]` + unsubscribe in `unlink` | See notes: the blocker is that `AbstractContextSystem.link()` dispatches through `arguments` (`AbstractContextSystem.js:69-90`), which is exactly the "magic" the house style rejects. Propose typed arity-specific bases (`ContextSystem1`/`ContextSystem2`/`ContextSystem3` with real named parameters) and migrate the 17 | L / M |
|
|
21
|
+
| K8a | LOW | `delete this.data[entity]` on a dense array | 17 (same files as K8) | `engine/sound/simulation/ecs/AcousticVolumeSystem.js:60`, `engine/grid/grid2transform/GridPosition2TransformSystem.js:85`, `engine/graphics/ecs/mesh/MeshSystem.js` unlink | — | UNJUSTIFIED (perf, folds into K8) | `delete` on an array index forces the backing store to dictionary mode. Whatever K8 lands should store contexts in a `Uint32Map`/plain array + tombstone instead | folds into K8 |
|
|
22
|
+
| K9 | **MED** ⚠ **INCONSISTENT** | linear scan for an element by `.id`/`.name` | **22** explicit loops (plus ~20 more using `Array.prototype.find`) | `core/binary/type/Type.js:44` (returns **`null`**), `engine/graphics/geometry/AttributeGroupSpec.js:56` (returns **`undefined`**), `generation/grid/GridData.js:82` (returns **`undefined`**), `engine/scene/SceneManager.js:101` (returns **`-1`**), `core/model/node-graph/node/NodeDescription.js:169`, `engine/graphics/particles/particular/group/ParticleSpecification.js:26`, `engine/plugin/EnginePluginManager.js:311` | `core/collection/array/array_index_by_equality.js` | **JUSTIFIED for the loop; UNJUSTIFIED for the sentinel** — a generic `find_by(array, key, value)` would be a **string-keyed** lookup, which the house style forbids; the closure form is already `Array.prototype.find`. The real defect is that the "not found" answer is three different values across sibling APIs | Do **not** extract a helper. Instead standardise the miss sentinel per return kind (element-returning → `undefined`, index-returning → `-1`) and drop the `null` returns (`Type.js:50`) per the no-null house rule | S / L |
|
|
23
|
+
| K10 | **HIGH** | raw `Math.random()` on paths that must be deterministic | **11** sites; 2 are simulation-authoritative | `engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js:31` (**seeds an AI behaviour tree** — `actor_seed ^ computeHashFloat(Math.random())`), `engine/intelligence/behavior/util/RandomDelayBehavior.js:9` (**seeds behaviour-tree delays** — `Date.now() ^ Math.random()*UINT32_MAX`), `engine/physics/mls-mpm/MLS_MPM.js:388`, `engine/sound/sopra/definition/effect/ReverbEffect.js:59` (reverb IR differs every session), `engine/animation/removeEntityWithMeshParticlesEffect.js:167`, `view/minimap/dom/MinimapCameraView.js:110`, `engine/ecs/terrain/tiles/TerrainTileManager.js:208` (debug-only), `engine/sound/ecs/SoundControllerSystem.js:15` (`@deprecated`) | `core/math/random/seededRandom.js`, `randomSeed.js`, `randomFromArray.js` (63 files already use them) | **UNJUSTIFIED for the top 4; JUSTIFIED (cosmetic) for minimap jitter, VFX seed, debug tile colour** | Route the two behaviour-tree seeds off a run-level seeded stream (the engine already threads seeds — `MarkerNodeActionSelectWeighted.js:92` shows the pattern). `MLS_MPM.add_rnd_square` should take a `random` argument like every other `sample_random_point_in_volume` in `core/geom/3d/shape/`. `ReverbEffect` should hash its own parameters into a `seededRandom` | M / M |
|
|
24
|
+
| K11 | — | seeded RNG algorithm count | **2** (`seededRandom_Mulberry32.js`, `seededRandom_MersenneTwister.js`; `seededRandom.js` is an alias for the former) | `core/math/random/seededRandom.js:4` | — | **CLEAN — no finding.** There are *not* several competing RNGs. Stateless mixers (`lowbias32`, `murmur3_32`, `squirrel3`) are a different concept and each has one implementation | — | — |
|
|
25
|
+
| K12 | LOW ⚠ **INCONSISTENT** | weighted (cumulative) random selection | **3 core entry points + 1 hand-rolled** | `core/math/random/random_pick_weighted_index.js:12`, `core/collection/array/weightedRandomFromArray.js:21`, `core/geom/3d/shape/UnionShape3D.js:131,257` (both call the core `binarySearchHighIndex`), hand-rolled: `engine/graphics/sh3/lpg/bake_probe_sh3_resampled.js:53` (`pick_candidate`, a true `lower_bound`) | `core/math/random/random_pick_weighted_index.js` | **JUSTIFIED (`pick_candidate` works on a module-static `Float64Array` with no comparator closure, in a per-probe inner loop) — but the tie-break disagrees** | `binarySearchHighIndex` returns an **arbitrary** index inside an equal cumulative run, so `random_pick_weighted_index` can select a **zero-weight** entry when `random()*total` lands exactly on a boundary (reachable: Mulberry32 returns exact `0`). `pick_candidate` cannot. Make the shared path use `lower_bound` semantics | S / L |
|
|
26
|
+
| K13 | **MED** ⚠ **INCONSISTENT** | three.js material `transform()` / `onBeforeCompile` marker injection | **3** near-identical copies with **3 different clone semantics** | `engine/graphics/render/forward_plus/plugin/MaterialTransformer.js:91` (`result = source.clone()` — clones, source untouched), `engine/graphics/sh3/gi/material/MaterialTransformer.js:294` (**`result.clone();` — return value discarded**, then mutates `source` in place: a dead statement, clear copy-paste artifact), `engine/graphics/sh3/lpg/material/LightProbeGridMaterialTransformer.js:207` (no clone at all, mutates `source`) | `engine/graphics/material/composeCompile.js`, `…/forward_plus/plugin/isLitMaterial.js` — the *pieces* are already shared; the ~25-line guard/clone/mark envelope is not | **UNJUSTIFIED / correctness hazard** | Extract `material_transform_once(source, marker, on_before_compile, {clone})` — or, house-style, a small `AbstractMaterialTransformer` base with an explicit `clone` policy decided once. Also: two of the three declare a **module-local `const PROPERTY_TRANSFORMER_MARKER`** with *different values* (`MaterialTransformer.js:19` vs `LightProbeGridMaterialTransformer.js:15`) — same identifier, different meaning | M / M |
|
|
27
|
+
| K14 | LOW ⚠ **INCONSISTENT** | the identifier `EPSILON` | **5 different values** live under one name | `core/math/EPSILON.js:5` = `1e-7` (imported by 21 files) vs module-local `const EPSILON` = `1e-10` in `core/math/linalg/eigen/matrix_qr_in_place.js:1` and `matrix_householder_in_place.js:1`, `1e-9` in `engine/animation/curve/animation_curve_optimize.js:106`, `1e-17` in `core/geom/3d/topology/struct/binary/io/bt_mesh_face_island_erode.js:427` | `core/math/EPSILON.js`, `FLT_EPSILON_{16,32,64}.js` | **JUSTIFIED (the tolerances are algorithm-specific) / UNJUSTIFIED (the name is not)** | Rename the locals to domain names, as ~20 other files already do (`MPR_EPSILON`, `PLANE_EPS`, `BARY_EPS`, `EPA_EPS`, `STALE_EPSILON`) | S / L |
|
|
28
|
+
| K15 | LOW | `Math.abs(a - b) < eps` inline | 23 sites; `epsilonEquals` used by 10 files | `core/geom/mat2/m2_is_orthogonal.js:18`, `engine/sound/simulation/render/ProbeReverbRenderer.js:198-200`, `engine/physics/fluid/ecs/FluidSystem.js:232-234`, `core/math/spline/spline3_hermite_nearest_point.js:103` | `core/math/epsilonEquals.js:11` | **JUSTIFIED** — every site passes its own domain tolerance; `epsilonEquals(a,b,tol)` adds only asserts, and half the sites are `>` (not-equal) tests that `epsilonEquals` cannot express without a negation. `roughlyEquals`/`_roughlyEquals` on `Vector2/3/Quaternion/ConicRay` is already the shared vector-level primitive | — | — |
|
|
29
|
+
| K16 | LOW | AABB accumulation over a point set (`x0 = Infinity` … min/max) | **10** hand-rolled + 4 primitives | hand-rolled: `core/bvh8/build/TriangleCluster.js:13`, `core/geom/2d/quad-tree-binary/QuadTree.js:142`, `core/geom/3d/shape/MeshShape3D.js:251`, `core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.js:24`, `engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js:158`, `engine/sound/simulation/probe/probe_delaunay_edges.js:156`, `engine/sound/simulation/probe/probe_visibility_bridge_components.js` | `core/geom/3d/aabb/aabb3_from_v3_array.js`, `aabb3_from_v3_array_transformed.js`, `aabb_nd_from_points.js`, `core/geom/2d/aabb/aabb2_from_v2_buffer.js` | **PARTIALLY JUSTIFIED** — the *iteration source* genuinely differs (flat float buffer vs accessor methods vs half-edge loop walk), so one function cannot cover all. The reusable part is the 6-line accumulate step | Add `aabb3_array_expand_by_point(aabb, x, y, z)` next to the existing `aabb3_expand_array.js` and use it as the inner step; `probe_delaunay_edges` and `TriangleCluster` can call `aabb3_from_v3_array` outright | S / L |
|
|
30
|
+
| K17 | LOW | `traverseThreeObject` | 1 helper that reimplements `THREE.Object3D.prototype.traverse` | `engine/graphics/ecs/highlight/renderer/traverseThreeObject.js:7`; imported by `engine/asset/loaders/GLTFAssetLoader.js:9` and `engine/graphics/material/optimization/MaterialOptimizationContext.js:25`, while ~28 other sites call three's native `.traverse()` | `THREE.Object3D.traverse` | **JUSTIFIED (it adds a `thisArg`, which three's does not) / but misplaced** | Move it to `engine/graphics/three/` — the package's declared three-adapter boundary — rather than living under `highlight/renderer/` and being reached by a 4-level relative import from the asset loader | S / L |
|
|
31
|
+
| K18 | LOW | `WebGLRenderTarget` option bags | 15 construction sites, each repeating `depthBuffer/stencilBuffer/generateMipmaps/minFilter/magFilter` | `engine/graphics/ecs/highlight/renderer/OutlineRenderer.js:232,241,250,259,268`, `engine/graphics/render/visibility/hiz/query/BatchOcclusionQuery.js:41`, `engine/graphics/texture/virtual/VirtualTextureUsageUpdater.js:105`, `engine/graphics/render/visibility/hiz/buffer/HierarchicalZBuffer.js:94` | — | **JUSTIFIED** — three's constructor *is* the primitive; a wrapper would need per-field override sentinels, which the "uniform control flow" rule forbids. Only `OutlineRenderer`'s 5 adjacent near-identical bags are worth a local named-constant pair | — | — |
|
|
32
|
+
| K19 | — | three.js texture format / type / wrap translation | 1 composed family, no duplicates | `engine/graphics/texture/channelCountToThreeTextureFormat.js:9`, `computeThreeTextureFormat.js:10`, `attribute_spec_to_three_format.js:12`, `formatToChannelCount.js:19`, `computeThreeTextureFormatFromDataType.js` (`@deprecated`, delegates) | — | **CLEAN — no finding**, and the counter-example that proves the pattern works: one `switch`, everything else composes onto it | — | — |
|
|
33
|
+
| K20 | LOW | `document.createElement('canvas')` + size + `getContext` | 10 production sites | `engine/graphics/GraphicsEngine.js:492`, `engine/graphics/makeModelView.js:15`, `engine/graphics/render/RendererPool.js:9`, `engine/graphics/texture/sampler/sampler2d_to_data_url.js:14`, `engine/graphics/texture/sampler/convertTexture2Sampler2D.js:57`, `engine/asset/loaders/image/codec/NativeImageDecoder.js:14`, `engine/asset/loaders/material/computeImageBitmapEquality.js:61` | — | **JUSTIFIED** — 3 lines, and the contexts requested differ (`2d` vs `webgl2` vs none) | — | — |
|
|
34
|
+
| K21 | — | `clamp` / `lerp` / `DEG_TO_RAD` adoption | 1 inline clamp in the whole tree | only `core/graph/metis/native/bisection/fm_2way.js:50` nests `Math.min(Math.max(…))`; `Math.PI/180` appears inline 3× and all 3 are named constants for a fixed angle | `core/math/clamp.js`, `lerp.js`, `DEG_TO_RAD.js` | **CLEAN — no finding.** The 129 "inline lerp" pattern hits are flat-array vector math (`a + (b-a)*t` on `Float32Array` offsets), where a scalar `lerp` call is not the same operation | — | — |
|
|
35
|
+
| K22 | — | grid index ↔ coordinate (`y*width + x`) | ~25 inline sites | `engine/graphics/texture/sampler/Sampler2D.js:488`, `engine/graphics/sh3/lightmap/lightmap_denoise.js:60`, `engine/physics/fluid/ecs/FluidObstacleSystem.js:335` | — | **JUSTIFIED** — one arithmetic expression in hot per-texel loops; extracting it is a pure pessimisation with no correctness payoff | — | — |
|
|
36
|
+
|
|
37
|
+
## Per-concern detail
|
|
38
|
+
|
|
39
|
+
### 1. Hash combination
|
|
40
|
+
`core/collection/array/combine_hash.js` is the house primitive and is **well adopted — 62 importing files**.
|
|
41
|
+
Against that, **33 files** still hand-roll `h = h*31 + v` (74 statements). The worst concentrations are
|
|
42
|
+
`engine/physics/ecs` (Joint 13, RigidBody 12, Collider 4) and `core/geom/3d/shape` (7 files). These are
|
|
43
|
+
determinism/dedup hashes, called at checkpoints, not in inner loops — `combine_hash` is variadic (rest-arg
|
|
44
|
+
allocation), which is a fair reason to avoid it *there*, but not a reason to hand-inline a mix: the fix is a
|
|
45
|
+
2-arg `hash_combine(h, v)`. The mixes are **not** the same function once you account for truncation
|
|
46
|
+
(K1a): `|0` per step, `>>>0` at the end, or never — four disciplines in five sibling functions, and
|
|
47
|
+
`uint32_array_hash` leaks out of int32 entirely. Two further shared defects (K2 `offset` handling, K3
|
|
48
|
+
endianness) were copied into every clone, which is the clearest evidence in this audit that duplication here
|
|
49
|
+
propagates bugs rather than merely wasting lines.
|
|
50
|
+
|
|
51
|
+
### 2. `equals()` / epsilon comparison
|
|
52
|
+
`core/math/epsilonEquals.js` exists (10 importers) and `EPSILON = 1e-7`, `FLT_EPSILON_{16,32,64}` are all
|
|
53
|
+
provided. 23 inline `Math.abs(a-b) < eps` sites remain, but **every one passes a domain tolerance** chosen for
|
|
54
|
+
its algorithm (`PLANE_EPS = 1e-3`, `BARY_EPS = 1e-6`, `SEGMENT_EPS = 1e-12`, `DIR_EPS = 1e-18`), and about
|
|
55
|
+
half are `>` not-equal tests. This is **not** a reuse failure. The one real hazard is K14: four modules declare
|
|
56
|
+
a local `const EPSILON` with values from `1e-9` to `1e-17`, colliding with the imported `1e-7` name. Vector-level
|
|
57
|
+
tolerant comparison is already consolidated on `roughlyEquals`/`_roughlyEquals` (`Vector2.js:696`,
|
|
58
|
+
`Vector3.js:867`, `Quaternion.js:1479`, `ConicRay.js:83`).
|
|
59
|
+
|
|
60
|
+
### 3. Linear scan by id
|
|
61
|
+
**22** explicit for-loops that scan for `.id`/`.name`/`.key` and return the match, plus ~20 more written as
|
|
62
|
+
`Array.prototype.find`. Verdict is deliberately **not** "extract a helper": the only generic form is either
|
|
63
|
+
string-keyed (`find_by(array, 'name', x)` — forbidden by the typed-over-magic rule) or a closure, which
|
|
64
|
+
`Array.prototype.find` and `core/collection/array/array_index_by_equality.js` already are. The finding that
|
|
65
|
+
survives is the **miss sentinel**: `Type.getFieldByName` returns `null`, `AttributeGroupSpec.getAttribute` and
|
|
66
|
+
`GridData.getLayerById` return `undefined`, index-returning variants return `-1`. Three conventions for the
|
|
67
|
+
same question, and the `null` returns contradict the no-null-defaults house rule.
|
|
68
|
+
|
|
69
|
+
### 4. Binary search / lower bound
|
|
70
|
+
Six real implementations (the 30 `binary_search_inline` pattern hits are mostly `>> 1` bit arithmetic and
|
|
71
|
+
quicksort pivots — false positives). `core` provides two, `engine` hand-rolls four. They disagree on the two
|
|
72
|
+
questions that matter: what is returned on a **miss**, and which index is returned inside an **equal run**.
|
|
73
|
+
`AnimationCurve.js:238` is the only one that explicitly handles duplicate keys (it fast-forwards past the equal
|
|
74
|
+
run at `:249`) — and it had to, because the shared `binarySearchHighIndex` would have handed it an arbitrary
|
|
75
|
+
one. `table_find_min_index_in_ordered_column`'s JSDoc claims "low index of matching value"; the code does not
|
|
76
|
+
deliver that. `bake_probe_sh3_resampled.pick_candidate` is the only correct `lower_bound` in the tree.
|
|
77
|
+
|
|
78
|
+
### 5. Seeded vs unseeded randomness
|
|
79
|
+
Two questions, two different answers. **How many RNGs?** Only two (Mulberry32, Mersenne Twister), with
|
|
80
|
+
`seededRandom` aliasing the former — this is clean, no finding. **How many raw `Math.random()`?** Eleven, of
|
|
81
|
+
which four matter. `WeightedRandomActionDescription.js:31` and `RandomDelayBehavior.js:9` seed *behaviour trees*
|
|
82
|
+
from wall-clock/`Math.random()`, which defeats replay, rewind (`engine/network/sim/RewindEngine.js`) and the
|
|
83
|
+
action-log replication model. `MLS_MPM.add_rnd_square` (`:388`) is the only shape-sampling function in the tree
|
|
84
|
+
that does not take a `random` argument — every `sample_random_point_in_volume` in `core/geom/3d/shape/` does.
|
|
85
|
+
`ReverbEffect.js:59` bakes a fresh noise impulse response each session, so the same event sounds different run
|
|
86
|
+
to run. The remaining seven (minimap jitter, VFX seed, debug tile colour, a `@deprecated` sound picker) are
|
|
87
|
+
cosmetic and fine.
|
|
88
|
+
|
|
89
|
+
### 6. Weighted random selection
|
|
90
|
+
Better consolidated than the brief suggested: `random_pick_weighted_index`, `weightedRandomFromArray` and the
|
|
91
|
+
two `UnionShape3D` sites all funnel into `binarySearchHighIndex`, and `MarkerNodeActionSelectWeighted.js:92`
|
|
92
|
+
already uses the core helper. Only one hand-rolled selector remains — `pick_candidate` in
|
|
93
|
+
`bake_probe_sh3_resampled.js:53` — and it is justified (module-static `Float64Array`, no comparator closure, per-probe
|
|
94
|
+
inner loop). The finding is not duplication but disagreement: `pick_candidate` is a true `lower_bound` and so can
|
|
95
|
+
never select a zero-weight entry; the shared path can, because `binarySearchHighIndex` returns an arbitrary index
|
|
96
|
+
inside an equal cumulative run.
|
|
97
|
+
|
|
98
|
+
### 7. Typed-array growth
|
|
99
|
+
**22 independent grow implementations, 5 distinct growth policies**, and `core/collection/array/typed/` has no
|
|
100
|
+
grow helper despite holding copy/hash/convert/normalise helpers. Policies range from `cap << 1` (unbounded
|
|
101
|
+
doubling from a possibly-zero start — `PairList.js:91` would loop forever at `cap === 0`) to
|
|
102
|
+
`max(cap*1.5, cap+64)`. This is the cleanest **PROMOTION** in the audit: one function, no semantic choice to
|
|
103
|
+
make, and every call site is already isolated inside a private `#grow`/`__grow_capacity`/`ensureCapacity`.
|
|
104
|
+
Six further sites in `engine/network/transport` do exact-size defensive byte-slice copies (K7) — a different,
|
|
105
|
+
equally trivial promotion.
|
|
106
|
+
|
|
107
|
+
### 8. Object pooling
|
|
108
|
+
`core/model/object/ObjectPoolFactory.js` has 6 importers. Applying the brief's own distinction: the
|
|
109
|
+
module-static scratch objects (`weightedRandomFromArray.js:10`, `sort_decal_data.js:1`,
|
|
110
|
+
`bake_probe_sh3_resampled.js:37`) are idiomatic and **not** findings. The free-list allocators
|
|
111
|
+
(`core/bvh2/bvh3/BVH.js:156`, `core/geom/2d/bvh/BVH2D.js:111`, `core/geom/3d/tetrahedra/TetrahedralMesh.js:127`,
|
|
112
|
+
`core/geom/3d/topology/struct/binary/BinaryElementPool.js:40`) are **slot** allocators over typed arrays —
|
|
113
|
+
a different concept from `ObjectPoolFactory`'s object recycling, and three of them already delegate to
|
|
114
|
+
`BinaryElementPool`. **No genuine hand-rolled duplicate of `ObjectPoolFactory` was found.** The one soft spot
|
|
115
|
+
is `core/cache/wtinylfu/CacheWTinylfu.js:757` (`pool.length > 0 ? pool.pop() : new CacheElementWTinylfu()`),
|
|
116
|
+
a 1-line inline pool in a hot cache path — justified.
|
|
117
|
+
|
|
118
|
+
### 9. three.js translation at non-boundary sites
|
|
119
|
+
The 208 `from 'three'` imports are *not* the story: 26 of them are in `engine/graphics/ecs`, which is a
|
|
120
|
+
rendering-binding layer by design. Checking the four candidate translations named in the brief:
|
|
121
|
+
texture format/type/wrap enum mapping is **cleanly factored** (K19) — one `switch`, everything composes;
|
|
122
|
+
`WebGLRenderTarget` construction is 15 vendor option bags with no shared logic to extract (K18);
|
|
123
|
+
`BufferGeometry` attribute setup (179 `setAttribute`/`BufferAttribute` sites) is genuinely per-geometry;
|
|
124
|
+
`Object3D` traversal has one helper that duplicates three's own but adds `thisArg`, merely misplaced (K17).
|
|
125
|
+
The one real repeat is **material `onBeforeCompile` marker injection** (K13): three copies of a 25-line
|
|
126
|
+
guard/clone/mark envelope that disagree on whether they clone, one of which contains a dead `result.clone();`.
|
|
127
|
+
|
|
128
|
+
### 10. ECS System lifecycle boilerplate
|
|
129
|
+
58 `extends System` classes tree-wide: 44 define `link`, 43 `unlink`, 23 `startup`, 18 `shutdown`.
|
|
130
|
+
Signal subscribe/unsubscribe is **balanced in all 17 systems that subscribe** — no leak pattern at the census
|
|
131
|
+
level. The duplication is the per-entity record: **17 systems** build a record in `link`, store it at
|
|
132
|
+
`this.data[entity]`, and `delete this.data[entity]` in `unlink`, while **7 systems** get exactly that from
|
|
133
|
+
`engine/ecs/system/AbstractContextSystem.js`. A typed shared helper is viable, but the existing one is not the
|
|
134
|
+
one to spread: its `link()` reads `arguments` positionally and copies components into `ctx.components[i]`
|
|
135
|
+
(`AbstractContextSystem.js:69-90`), i.e. untyped variadic dispatch — the house style's stated objection. The
|
|
136
|
+
honest recommendation is arity-specific typed bases with named parameters, then migrate.
|
|
137
|
+
|
|
138
|
+
### 11. Other systemic patterns checked
|
|
139
|
+
Checked and **clean, no finding**: `clamp` (1 inline site tree-wide), `lerp`, `smoothStep`,
|
|
140
|
+
`DEG_TO_RAD`/`RAD_TO_DEG` (3 inline `Math.PI/180`, all named angle constants), dB↔linear
|
|
141
|
+
(`engine/sound/dB2Volume.js` + `volume2dB.js` are the single pair; `EventInstance.js:34` and
|
|
142
|
+
`echogram_band_rt60.js:49` are distinct formulas, not copies), sRGB↔linear (`core/color/sRGB/`, one impl;
|
|
143
|
+
the shader-side uses three's own), string padding/`toFixed` (no repeated formatter), grid index↔coord (K22),
|
|
144
|
+
`Object.assign` shallow clone (9 sites, all genuinely different objects), `JSON.parse(JSON.stringify())`
|
|
145
|
+
deep clone (3 sites, all in cold paths).
|
|
146
|
+
|
|
147
|
+
## Notes — what structurally causes cross-cutting reuse failure here
|
|
148
|
+
|
|
149
|
+
1. **The primitives exist and are known; the gap is at the *last mile*.** `combine_hash` has 62 importers,
|
|
150
|
+
`seededRandom` 63, `clamp`/`lerp` are near-universal. Reuse failure is not ignorance of `core/` — it
|
|
151
|
+
concentrates in the last two lines of an otherwise-reusing function (`h = h*31 + v` written inline inside a
|
|
152
|
+
`hash()` that already imports three other core helpers).
|
|
153
|
+
2. **The missing primitives are the ones nobody thought to name.** Typed-array growth (22 impls) and
|
|
154
|
+
defensive byte-slice copy (6 impls) have no `core/` home at all — and both are single-signature functions
|
|
155
|
+
with zero design choices. Where `core/` names a concept, the codebase converges on it; where it does not,
|
|
156
|
+
it diverges 22 ways.
|
|
157
|
+
3. **Copy-paste is the propagation vector for defects, not just for lines.** The `offset`/`length` confusion
|
|
158
|
+
(K2) exists identically in five hash functions; the four-way truncation disagreement (K1a) exists because
|
|
159
|
+
each was typed fresh; the live-pivot quicksort (K4a) is a copy that dropped one line
|
|
160
|
+
(`const pivot = data[pivotIndex]`); the dead `result.clone();` in the GI material transformer (K13) is a
|
|
161
|
+
copy that dropped an assignment. Every ⚠ in this report is a *divergence introduced by copying*, not an
|
|
162
|
+
independently-invented alternative.
|
|
163
|
+
4. **When a shared abstraction violates the house style, adoption stalls and the duplication grows around it.**
|
|
164
|
+
`AbstractContextSystem` is the correct abstraction for 24 systems and has 7 users; the other 17 hand-roll it.
|
|
165
|
+
Its `link()` is `arguments`-based magic. This is the codebase telling you which rule wins.
|
|
166
|
+
5. **Family functions written as siblings rather than as one function plus adapters drift.** The five array-hash
|
|
167
|
+
functions, the four quicksorts in `core/collection/array/`, the two binary searches — each family was written
|
|
168
|
+
as N parallel files, and each family now disagrees internally. The texture-format family (K19), written as
|
|
169
|
+
one `switch` plus composing wrappers, is the counter-example and has no drift at all.
|