@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,266 +1,266 @@
|
|
|
1
|
-
# Correctness review — `core/process`, `core/graph`, `core/debug`, `core/time`, `core/clipboard`, `core/dom`, `core/assert.js`
|
|
2
|
-
|
|
3
|
-
Scope reviewed: every non-spec source file under the listed directories.
|
|
4
|
-
Every finding below was reproduced by executing the real module in Node (no mocks) unless marked otherwise.
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## core/debug
|
|
9
|
-
|
|
10
|
-
### PROC-1 `anything()` matches nothing and `nothing()` matches everything
|
|
11
|
-
- **Severity**: CRITICAL
|
|
12
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/debug/matchers/IsAnything.js:12`
|
|
13
|
-
- **Defect**: `IsAnything.matches()` returns `false` unconditionally. The matcher whose entire purpose is "accept any value" rejects every value, and `nothing()` (built as `not(anything())`) therefore accepts every value. Both public factories in `matchers.js` are logically inverted.
|
|
14
|
-
- **Failure scenario**: `anything().matches(42)` → `false` (verified). `assert.that(x, 'x', anything())` throws for *every* `x`. Conversely `nothing().matches(42)` → `true` (verified), so `assert.that(x, 'x', nothing())` never triggers — a guard that is supposed to be unreachable silently passes everything.
|
|
15
|
-
- **Fix**: `matches(item, mismatch_description) { return true; }`.
|
|
16
|
-
- **Confidence**: Confirmed
|
|
17
|
-
|
|
18
|
-
### PROC-2 `Matcher.matches(item)` — the documented single-argument form — throws in AllOf / IsIterableContaining / CombinableMatcher
|
|
19
|
-
- **Severity**: MAJOR
|
|
20
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/debug/matchers/AllOf.js:25` (also `IsIterableContaining.js:22`, `CombinableMatcher.js:25`)
|
|
21
|
-
- **Defect**: The base class declares `matches(item, mismatch_description = NullDescription.INSTANCE)` and documents the second parameter as optional. Subclass overrides re-declare the parameter *without* the default (default parameter values are not inherited), then dereference it on the mismatch path. `assert.that` calls `matcher.matches(value)` with one argument, so this is the primary in-repo call site.
|
|
22
|
-
- **Failure scenario**: `allOf(isIn([3,7]), not(equalTo(7))).matches(2)` → `TypeError: Cannot read properties of undefined (reading 'appendDescriptionOf')` instead of `false` (verified). `hasItem(1).matches([])` → `TypeError: ... (reading 'appendText')` (verified). Any `assert.that(v, 'v', allOf(...))` on a failing value surfaces a TypeError instead of the intended assertion message.
|
|
23
|
-
- **Fix**: Give every override the same default: `matches(item, mismatch_description = NullDescription.INSTANCE)`.
|
|
24
|
-
- **Confidence**: Confirmed
|
|
25
|
-
|
|
26
|
-
### PROC-3 `DescribeAs` never performs template substitution
|
|
27
|
-
- **Severity**: MAJOR
|
|
28
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/debug/matchers/DescribeAs.js:42`
|
|
29
|
-
- **Defect**: Three independent errors in `describeTo`. (a) `String.prototype.matchAll` returns an *iterator*, not an array, so `matches.length` is `undefined` and `for (let i = 0; i < undefined; i++)` never executes. (b) `match.groups[1]` reads a named-group bag that is `undefined` for this un-named-group regex — it would throw if the loop ever ran; it should be `match[1]`. (c) `textStart = match[0].length` should be `match.index + match[0].length`, otherwise the tail slice restarts from the wrong offset.
|
|
30
|
-
- **Failure scenario**: `new DescribeAs("value must be %0 or %1", equalTo(1), ["A","B"]).describeTo(d)` writes the literal `value must be %0 or %1` instead of `value must be "A" or "B"` (verified). Reached in production via `nothing(message)`, which routes through `describeAs`.
|
|
31
|
-
- **Fix**: `const matches = Array.from(this.template.matchAll(RX));`, use `match[1]`, and set `textStart = match.index + match[0].length`.
|
|
32
|
-
- **Confidence**: Confirmed
|
|
33
|
-
|
|
34
|
-
### PROC-4 `appendValue(undefined)` renders as `"null"`
|
|
35
|
-
- **Severity**: MINOR
|
|
36
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/debug/BaseDescription.js:39`
|
|
37
|
-
- **Defect**: `if (value == null)` (loose equality) is true for `undefined` as well as `null`, so the dedicated `else if (value === undefined)` branch on the next line is unreachable.
|
|
38
|
-
- **Failure scenario**: `new InMemoryDescriptor().appendValue(undefined).value` → `"null"` (verified). An assertion failure on an `undefined` value reports it as `null`, which is a different bug class for the reader.
|
|
39
|
-
- **Fix**: Use `value === null` on the first branch, or reorder so the `undefined` test comes first.
|
|
40
|
-
- **Confidence**: Confirmed
|
|
41
|
-
|
|
42
|
-
### PROC-5 `IsIterableContaining` mismatch text describes the collection, not its elements
|
|
43
|
-
- **Severity**: MINOR
|
|
44
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/debug/matchers/IsIterableContaining.js:41`
|
|
45
|
-
- **Defect**: The mismatch loop iterates `itemElement` but passes the whole collection `item` to `describeMismatch`. The element variable is never used.
|
|
46
|
-
- **Failure scenario**: `hasItem(9).matches([1,2,3], d)` produces `mismatches were: [was <1,2,3>, was <1,2,3>, was <1,2,3>]` instead of `was 1, was 2, was 3`.
|
|
47
|
-
- **Fix**: `this.#element_matcher.describeMismatch(itemElement, mismatch_description);`
|
|
48
|
-
- **Confidence**: Confirmed
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## core/process — task & executor
|
|
53
|
-
|
|
54
|
-
### PROC-6 A task blocked on a FAILED dependency is silently dropped: never fails, never resolves
|
|
55
|
-
- **Severity**: CRITICAL
|
|
56
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/executor/ConcurrentExecutor.js:286`
|
|
57
|
-
- **Defect**: `resolveTasks()`'s `ResolutionType.FAILED` branch splices the task out of `queueUnresolved` and does nothing else — it never sets `task.state` to `FAILED` and never dispatches `task.on.failed`. The task is left in `INITIAL` forever, invisible to the executor.
|
|
58
|
-
- **Failure scenario**: `A = failingTask(...)`, `B.addDependency(A)`, `executor.run(A); executor.run(B)`. Verified result: `A.state === FAILED (3)`, `B.state === INITIAL (0)`, no `on.failed`/`on.completed` dispatch on B, `executor.contains(B) === false`, `queueUnresolved.length === 0`. `await B.promise()` hangs forever. Worse, any task `C` depending on `B` sees `B.state === INITIAL` in `tryResolve` and returns `UNRESOLVED` forever — the whole downstream subgraph is permanently stuck while `executor.on.completed` still fires.
|
|
59
|
-
- **Fix**: In the FAILED branch, mirror `#fail_task`: set `unresolvedTask.state.set(TaskState.FAILED)` and `unresolvedTask.on.failed.send1(<dependency failure reason>)` before/after the splice, then restart the scan (`i = -1; l = queueUnresolved.length;`) because the dispatch can mutate the queue.
|
|
60
|
-
- **Confidence**: Confirmed
|
|
61
|
-
|
|
62
|
-
### PROC-7 `Task.executeSync()` never updates `Task.state`
|
|
63
|
-
- **Severity**: MAJOR
|
|
64
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/task/Task.js:214`
|
|
65
|
-
- **Defect**: `executeSync` runs the initializer, cycles to completion and fires `on.started`/`on.completed`/`on.failed`, but never assigns `this.state`. The task remains in `TaskState.INITIAL` after a successful synchronous run.
|
|
66
|
-
- **Failure scenario**: `const t = emptyTask(); t.executeSync();` → `t.state.getValue() === 0 (INITIAL)`, not `4 (SUCCEEDED)` (verified). Consequently `Task.join`/`t.promise()` takes the "not finished yet" branch and registers `on.completed.addOne(resolve)` on a signal that already fired — the promise never settles (verified: still `PENDING` after 20 ms). Feeding a sync-executed task as a dependency into a `ConcurrentExecutor` also blocks its dependents forever, because `tryResolve` reads `INITIAL` → `UNRESOLVED`.
|
|
67
|
-
- **Fix**: Set `this.state.set(TaskState.RUNNING)` before the cycle loop and `TaskState.SUCCEEDED` / `TaskState.FAILED` alongside the corresponding signal dispatch.
|
|
68
|
-
- **Confidence**: Confirmed
|
|
69
|
-
|
|
70
|
-
### PROC-8 `ignoreFailureTask` does not ignore a *thrown* failure
|
|
71
|
-
- **Severity**: MAJOR
|
|
72
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/task/util/ignoreFailureTask.js:38`
|
|
73
|
-
- **Defect**: The wrapper only converts an explicit `TaskSignal.EndFailure` return into `EndSuccess`. An exception thrown out of `task.cycle()` propagates through the wrapper unchanged, and `ConcurrentExecutor.#executeTimeSlice` treats a thrown exception as task failure (`#fail_task`) — so the wrapper fails too. Throwing is a first-class failure mode in this codebase: `failingTask(e)` (the repo's own canonical failing task) fails exclusively by throwing, and both `promiseTask` and `futureTask` `throw error` on rejection.
|
|
74
|
-
- **Failure scenario**: `ignoreFailureTask(failingTask(new Error("boom")))` — the wrapper propagates `Error: boom` (verified) instead of resolving in success as its JSDoc promises. Under `ConcurrentExecutor` the wrapper ends in `FAILED`.
|
|
75
|
-
- **Fix**: Wrap the `task.cycle()` call in try/catch and return `TaskSignal.EndSuccess` on a caught exception (matching the existing treatment of an initializer throw).
|
|
76
|
-
- **Confidence**: Confirmed
|
|
77
|
-
|
|
78
|
-
### PROC-9 `RemainingTimeEstimator.estimate` averages over unfilled sample slots
|
|
79
|
-
- **Severity**: MAJOR
|
|
80
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/task/RemainingTimeEstimator.js:39`
|
|
81
|
-
- **Defect**: `rates` is a zero-filled `Float32Array(sampleCount)`; `estimate` always divides the sum by the full `sampleCount` rather than by the number of `update()` calls actually recorded. The unwritten zeros drag the average rate down by a factor of `sampleCount / filled`.
|
|
82
|
-
- **Failure scenario**: `const e = new RemainingTimeEstimator(10); e.update(1000, 0.5); e.estimate(0.5)` → `10000` (verified) when the correct remaining time is `1000`. A 10× over-estimate persists until the ring buffer is fully populated — i.e. for the whole early phase of every task, which is exactly when an ETA is displayed.
|
|
83
|
-
- **Fix**: Track a `filled` counter (`Math.min(filled + 1, sampleCount)`) in `update` and divide by it in `estimate`; return `Infinity` when `filled === 0`.
|
|
84
|
-
- **Confidence**: Confirmed
|
|
85
|
-
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
## core/process — undo (`ActionProcessor`)
|
|
89
|
-
|
|
90
|
-
### PROC-10 undo → do → redo crashes: the future branch of history is truncated but its marks are not
|
|
91
|
-
- **Severity**: CRITICAL
|
|
92
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/undo/ActionProcessor.js:487`
|
|
93
|
-
- **Defect**: `__unsafe_do` discards the redo branch with `history.crop(0, this.cursor)` but leaves `this.marks` untouched (there is a `// TODO clear future marks` on line 489). Marks whose `index` now exceeds `history.length` become dangling, and `__unsafe_redo` uses those indices as a loop bound.
|
|
94
|
-
- **Failure scenario** (verified end-to-end): `await ap.do(A); await ap.do(B); await ap.mark("m1"); await ap.undo(); await ap.do(C);` leaves `history.length === 1`, `cursor === 1`, `marks === [index 2]`. The next `await ap.redo()` computes `mark = 2`, reads `history.get(1) === undefined` and throws `TypeError: Cannot read properties of undefined (reading 'apply')`. This is the ordinary editor sequence "undo, then do something else, then press redo".
|
|
95
|
-
- **Fix**: In `__unsafe_do`, before/alongside the crop, splice off every mark with `index > this.cursor` and dispatch `onMarkRemoved` for each.
|
|
96
|
-
- **Confidence**: Confirmed
|
|
97
|
-
|
|
98
|
-
### PROC-11 `doMany` with a failing action never settles and permanently deadlocks the processor
|
|
99
|
-
- **Severity**: CRITICAL
|
|
100
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/undo/ActionProcessor.js:439`
|
|
101
|
-
- **Defect**: `new Promise(async (resolve, reject) => { ... await this.__unsafe_do(action) ... resolve(); })` — the classic async-executor antipattern. When `__unsafe_do` rejects, the rejection escapes into the async executor function's own (discarded) promise; `reject` is never called, so the constructed promise `p` stays pending forever. `p` is then stored in `this.__last_promise`, and every subsequent `do`/`undo`/`redo`/`mark`/`navigateTo` starts with `await this.__barrier()` on that never-settling promise.
|
|
102
|
-
- **Failure scenario** (verified): `ap.doMany([goodAction, throwingAction])` — the returned promise is still `PENDING` after 60 ms and an `unhandledRejection` is emitted (fatal in Node ≥ 15 / reported by Jest). A following `await ap.do(anotherAction)` is also still `PENDING` and `history.length` stays at 1: the ActionProcessor is bricked for the remainder of the session.
|
|
103
|
-
- **Fix**: Drop the wrapper — make the body a plain `async` helper (`const p = (async () => { for (...) await this.__unsafe_do(actions[i]); })()`), matching how `do`/`undo`/`redo` already build `p`.
|
|
104
|
-
- **Confidence**: Confirmed
|
|
105
|
-
|
|
106
|
-
### PROC-12 `cleanupHistory` compares a mark *count* against a *byte* limit — neither history limit is ever enforced
|
|
107
|
-
- **Severity**: MAJOR
|
|
108
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/undo/ActionProcessor.js:204`
|
|
109
|
-
- **Defect**: `let lastMark = min2(marks.length, this.historyMemoryLimit) - 1;` mixes a mark count with a byte budget (default 268435456), so `lastMark` is always `marks.length - 1` and the subsequent `if (lastMark + 1 < marks.length)` is always false. `historyMarkLimit` is never consulted at all. The memory branch is equally dead: it decrements while `marks[lastMark].memoryUsage > this.historyMemoryUsage`, but a mark's recorded usage is a *past* snapshot and therefore never exceeds the current total. Separately, if the guard ever did fire, `const marksToDrop = lastMark - this.historyMarkLimit` is negative for any realistic history and `marks[marksToDrop]` would be `undefined` → `TypeError` on `.index`.
|
|
110
|
-
- **Failure scenario** (verified): with `ap.historyMarkLimit = 2`, doing 6 actions each followed by a mark leaves `marks.length === 6` and `history.length === 6` — nothing dropped. With `ap.historyMemoryLimit = 3000` and 10 actions of 1000 bytes each, `historyMemoryUsage === 10000` and `history.length === 10`. Both documented caps are inert, so undo history grows without bound for the process lifetime.
|
|
111
|
-
- **Fix**: Compute the mark cut-off from `historyMarkLimit` (`const marksToDrop = marks.length - this.historyMarkLimit`) and, separately, walk marks from the oldest while `historyMemoryUsage - marks[i].memoryUsage > historyMemoryLimit` for the byte cap. Guard `marksToDrop > 0` before indexing.
|
|
112
|
-
- **Confidence**: Confirmed
|
|
113
|
-
|
|
114
|
-
### PROC-13 `dropHistory` destroys the boundary mark that should survive at index 0
|
|
115
|
-
- **Severity**: MINOR
|
|
116
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/undo/ActionProcessor.js:134`
|
|
117
|
-
- **Defect**: The cut-off scan uses `marks[i].index <= recordsToDrop`. Records `[0, recordsToDrop)` are removed, so a mark at exactly `index === recordsToDrop` still points at a surviving record (it becomes index 0) and must be kept. The condition should be `<`. `cleanupHistory`'s own `assert.equal(newFirstMark.index, 0, ...)` on line 224 documents that this mark is expected to survive — the two sites contradict each other.
|
|
118
|
-
- **Failure scenario**: history `[A,B,C,D]`, one mark at `index 2`. `dropHistory(2)` leaves history `[C,D]` but removes the mark, so the caller loses the only navigable point in the surviving history.
|
|
119
|
-
- **Fix**: `for (; i < markCount && marks[i].index < recordsToDrop; i++)`.
|
|
120
|
-
- **Confidence**: Confirmed (by reading; the runtime check is blocked by PROC-14's arity issue in dev builds)
|
|
121
|
-
|
|
122
|
-
### PROC-14 `onMarkAdded` and `onMarkRemoved` emit different payload types
|
|
123
|
-
- **Severity**: MINOR
|
|
124
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/undo/ActionProcessor.js:196` and `:154`
|
|
125
|
-
- **Defect**: `mark()` dispatches `this.onMarkAdded.send1(description)` (the raw description, verified) while `dropHistory` dispatches `Mark` instances (`dropped_marks.forEach(this.onMarkRemoved.send1, ...)`) and `mark()`'s own eviction path does `this.onMarkRemoved.send1(mark)`. Both signals are typed `Signal<M>` (description) in the field JSDoc. Additionally, `Array.prototype.forEach` invokes the callback with `(element, index, array)`, so `send1` is called with three arguments.
|
|
126
|
-
- **Failure scenario**: A UI keeping an undo-stack list keyed by description adds `"m1"` on `onMarkAdded` but receives `Mark { index: 0, description: "m1" }` on `onMarkRemoved`; the lookup misses and the entry is never removed from the list.
|
|
127
|
-
- **Fix**: Dispatch `mark.description` from both removal sites, and replace the `forEach(send1, signal)` with an explicit loop so exactly one argument is passed.
|
|
128
|
-
- **Confidence**: Confirmed
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## core/process — other
|
|
133
|
-
|
|
134
|
-
### PROC-15 `Future` can reach a terminal state twice; a rejected future can flip to resolved
|
|
135
|
-
- **Severity**: MAJOR
|
|
136
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/Future.js:80`
|
|
137
|
-
- **Defect**: `__handleResolution` and `__handleRejection` set `state` unconditionally with no already-settled guard. The `resolve`/`reject` callbacks handed to the resolver can therefore both fire, and the last one wins — violating the settle-once contract that `Future` advertises by mirroring the Promise API (`then`/`catch`, `@extends Promise<T>`).
|
|
138
|
-
- **Failure scenario** (verified): `const f = new Future((res, rej) => { rej(new Error("nope")); res(42); }); f.resolve();` → `f.state === RESOLVED (2)`, and `f.then(onOk, onErr)` invokes `onOk(42)`. A real Promise stays rejected and runs `onErr`. Downstream, `futureTask` polls `resolved`/`rejected` flags set by exactly this `then` registration, so a resolver that rejects-then-resolves turns a failed task into a successful one.
|
|
139
|
-
- **Fix**: Early-return from both handlers unless `this.state === FutureStates.PENDING`.
|
|
140
|
-
- **Confidence**: Confirmed
|
|
141
|
-
|
|
142
|
-
### PROC-16 `WatchDog.bark` disarms a watchdog that its own action re-armed
|
|
143
|
-
- **Severity**: MAJOR
|
|
144
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/WatchDog.js:52`
|
|
145
|
-
- **Defect**: `bark()` runs `this.action.call(...)` *first* and only then sets `this.timeoutId = -1`. During the action `isActive()` still reports `true`, so a re-arm from inside the action is either ignored (`start()` no-ops) or scheduled and then orphaned (`kick()` installs a fresh timer whose id is immediately overwritten with `-1`).
|
|
146
|
-
- **Failure scenario** (verified): a watchdog whose action calls `wd.start()` to re-arm itself — the canonical "handle the stall, then keep watching" pattern. After the first bark `isActive() === false` and no second bark ever occurs: the watchdog is silently dead. With `kick()` instead, a timer is left running that `stop()` can no longer cancel (`isActive()` is false), so the action fires again unexpectedly and the `kick()` inside it throws `WatchDog is not active`.
|
|
147
|
-
- **Fix**: Set `this.timeoutId = -1` *before* invoking the action.
|
|
148
|
-
- **Confidence**: Confirmed
|
|
149
|
-
|
|
150
|
-
### PROC-17 `.finally()` chains create unhandled promise rejections
|
|
151
|
-
- **Severity**: MAJOR
|
|
152
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/PromiseWatcher.js:45` and `H:/git/moh/app/src/mir-engine/meep/src/core/process/worker/OnDemandWorkerManager.js:135`
|
|
153
|
-
- **Defect**: Both sites call `promise.finally(cb)` and discard the returned promise. `p.finally(cb)` produces a *new* promise that adopts `p`'s rejection; because nothing attaches a handler to it, a rejecting `p` always produces an unhandled rejection — even when the original caller handled `p` correctly.
|
|
154
|
-
- **Failure scenario**: `watcher.add(somePromise)` where `somePromise` later rejects → `unhandledrejection` in the browser; in Node/Jest (Node ≥ 15 default) the process aborts. For `OnDemandWorkerManager.request`, `WorkerProxy.__failAllPending` rejects every in-flight request on worker error, so a single failing worker script turns each queued request into an unhandled rejection on top of the (correctly handled) rejection the caller sees.
|
|
155
|
-
- **Fix**: Suppress the derived promise: `promise.then(cb, cb)`, or `promise.finally(cb).catch(() => {})`.
|
|
156
|
-
- **Confidence**: Confirmed
|
|
157
|
-
|
|
158
|
-
### PROC-18 `CompositeProcess.finalize()` on a running composite leaves children in `Stopped`, not `Finalized`
|
|
159
|
-
- **Severity**: MAJOR
|
|
160
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/CompositeProcess.js:27`
|
|
161
|
-
- **Defect**: `finalize()` finalizes children first, then calls `super.finalize()`. `BaseProcess.finalize` sees the composite still in `Running` and calls `this.shutdown()`, which is the *overridden* `CompositeProcess.shutdown` — so every child is shut down a second time, and `BaseProcess.shutdown` unconditionally writes `ProcessState.Stopped` over the child's `Finalized` state.
|
|
162
|
-
- **Failure scenario** (verified): a `CompositeProcess([a, b])` taken through `initialize(); startup(); finalize()` ends with composite = `finalized` but `a` and `b` = `stopped`. Any subsequent lifecycle check that requires children to be `Finalized`, or a second `finalize()`, sees corrupt state; children that release resources in `finalize` are also asked to shut down after they have already torn themselves down.
|
|
163
|
-
- **Failure path**: `finalize()` → children `Finalized` → `super.finalize()` sees `Running` → `this.shutdown()` → `children.forEach(c => c.shutdown())` → children forced back to `Stopped`.
|
|
164
|
-
- **Fix**: Have `CompositeProcess.finalize` shut itself down first (`if (this.__state.getValue() === ProcessState.Running) super.shutdown();`) before finalizing children, or make `BaseProcess.finalize` call `BaseProcess.prototype.shutdown` on itself only.
|
|
165
|
-
- **Confidence**: Confirmed
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## core/process — worker
|
|
170
|
-
|
|
171
|
-
### PROC-19 `extractTransferables(null)` throws
|
|
172
|
-
- **Severity**: CRITICAL
|
|
173
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/worker/extractTransferables.js:24`
|
|
174
|
-
- **Defect**: `typeof null === "object"`, so a `null` value falls past the "not an object, skip" branch, fails `instanceof ArrayBuffer`, and reaches `value.buffer` → TypeError. The inline duplicate of this exact function generated inside `WorkerBuilder.build()` (line 121) *does* have the `obj === null` guard, which shows the omission is unintentional.
|
|
175
|
-
- **Failure scenario** (verified): `extractTransferables({ a: null }, [])` → `TypeError: Cannot read properties of null (reading 'buffer')`. Any worker payload containing a null field — extremely common in serialized game objects — crashes before the message is ever posted. The spec file covers `{}`, buffers, typed arrays and nesting, but never a null.
|
|
176
|
-
- **Fix**: Change the first branch to `if (value === null || typeof value !== "object")`.
|
|
177
|
-
- **Confidence**: Confirmed
|
|
178
|
-
|
|
179
|
-
### PROC-20 A failed `postMessage` drops the request without ever rejecting its promise
|
|
180
|
-
- **Severity**: CRITICAL
|
|
181
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/worker/WorkerProxy.js:154`
|
|
182
|
-
- **Defect**: When `trySendMessage` returns `false` (it swallows the `postMessage` exception and logs it), the request is removed from the pending queue but neither `resolve` nor `reject` is invoked. The promise handed to the caller can never settle: it is no longer in the queue, so `__handleMessage` and `__failAllPending` will never find it either.
|
|
183
|
-
- **Failure scenario**: `workerProxy.someMethod(objectContainingAFunctionOrDomNode)` — `postMessage` throws `DataCloneError`, the console shows `failed to send message:`, and `await` on the returned promise hangs for the lifetime of the page. PROC-21 makes this reachable in ordinary use, since the `toJSON` sanitisation that was meant to prevent non-cloneable payloads never runs.
|
|
184
|
-
- **Fix**: Reject the promise on send failure: `reject(new Error(...))` in place of (or alongside) the `array_remove_first`.
|
|
185
|
-
- **Confidence**: Confirmed
|
|
186
|
-
|
|
187
|
-
### PROC-21 `needsSerialization` compares a function against the string `"function"` — `toJSON` is never applied
|
|
188
|
-
- **Severity**: MAJOR
|
|
189
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/worker/WorkerProxy.js:40`
|
|
190
|
-
- **Defect**: `value.toJSON === "function"` should be `typeof value.toJSON === "function"`. As written the branch is unreachable, so `$submitRequest` always posts the raw argument and the documented `toJSON` sanitisation path is dead. (`hasOwnProperty('toJSON')` additionally excludes the normal case where `toJSON` lives on the class prototype.)
|
|
191
|
-
- **Failure scenario** (verified with the exact predicate): `needsSerialization({ toJSON() { return { plain: 1 }; } })` → `false`. Passing any engine object that relies on `toJSON` to strip non-cloneable members (signals, DOM handles, functions) to a worker method posts the raw object, which `postMessage` rejects with `DataCloneError` → the request silently disappears per PROC-20.
|
|
192
|
-
- **Fix**: `if (typeof value.toJSON === "function") { return true; }` (drop the `hasOwnProperty` gate so prototype-defined `toJSON` is honoured).
|
|
193
|
-
- **Confidence**: Confirmed
|
|
194
|
-
|
|
195
|
-
---
|
|
196
|
-
|
|
197
|
-
## core/graph
|
|
198
|
-
|
|
199
|
-
### PROC-22 `colorizeGraph` builds an asymmetric adjacency matrix from directed edges and returns invalid colourings
|
|
200
|
-
- **Severity**: MAJOR
|
|
201
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/graph/coloring/colorizeGraph.js:38`
|
|
202
|
-
- **Defect**: `graphToMatrix` writes `data[i][other] = 1` only when `edge.validateTransition(node, otherNode)` succeeds. For a `Forward` edge `P → Q` this sets `data[P][Q] = 1` but leaves `data[Q][P] = 0`. Graph colouring is an inherently undirected constraint, and the downstream `colorizing`/`updateNN` conflict elimination reads the matrix by row only, so a conflict recorded in just one direction is missed whenever the *other* endpoint is coloured first.
|
|
203
|
-
- **Failure scenario** (verified): nodes `X, P, Q, R` with `Forward` edges `P→X`, `X→Q`, `X→R`. `colorizeGraph` returns `[1, 1, 2, 2]` — `X` and `P` are adjacent yet share colour 1. `validateGraphColoring(colors, graph)` (which uses undirected `getNeighbours`) returns `false` on the library's own output.
|
|
204
|
-
- **Fix**: Make the matrix symmetric: set both `data[i * V + otherIdx]` and `data[otherIdx * V + i]` for every attached edge, and drop the `validateTransition` gate (or keep it only for genuinely directed colouring variants, which this algorithm is not).
|
|
205
|
-
- **Confidence**: Confirmed
|
|
206
|
-
|
|
207
|
-
### PROC-23 `convert_graph_to_dot_string` silently omits every `Backward` edge
|
|
208
|
-
- **Severity**: MAJOR
|
|
209
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/graph/convert_graph_to_dot_string.js:59`
|
|
210
|
-
- **Defect**: The emission guard is `(direction === Forward || direction === Undirected) && edge.first === node`. `EdgeDirectionType.Backward` satisfies neither disjunct, so a backward edge is skipped when visiting `first` and also skipped when visiting `second` (because `edge.first !== node` there). It is never written out.
|
|
211
|
-
- **Failure scenario** (verified): a graph with nodes `A`, `B` and `graph.createEdge("A", "B", EdgeDirectionType.Backward)` produces DOT containing both node declarations and **zero** `->` lines. The rendered diagram shows two isolated nodes; the edge is invisible.
|
|
212
|
-
- **Fix**: Add a `Backward` case that emits the reversed arrow `nodeId(secondIndex) -> nodeId(i)` once (guarded on `edge.first === node` so it is emitted exactly once).
|
|
213
|
-
- **Confidence**: Confirmed
|
|
214
|
-
|
|
215
|
-
### PROC-24 Laplacian is inconsistent on multigraphs: degree counts parallel edges, adjacency saturates at 1
|
|
216
|
-
- **Severity**: MAJOR
|
|
217
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/graph/graph_compute_adjacency_matrix.js:23` (surfaces in `graph_compute_laplacian_matrix.js:22`)
|
|
218
|
-
- **Defect**: `graph_compute_adjacency_matrix` writes a literal `1` per edge, so parallel edges collapse to a single 1. `graph_compute_degree_matrix` uses `graph.getNodeDegree`, which returns `NodeContainer.getEdgeCount()` and *does* count each parallel edge. `L = D - A` therefore has rows that don't sum to zero — the defining property of a graph Laplacian. Multi-edges are a first-class supported state of `Graph` (`NodeContainer.__neighbors` is explicitly documented as "number of edges to that node").
|
|
219
|
-
- **Failure scenario** (verified): nodes `A`, `B` joined by two parallel edges. `graph_compute_laplacian_matrix` yields `[[2, -1], [-1, 2]]`; row sums are `1`, not `0`. The correct Laplacian is `[[2, -2], [-2, 2]]`. Any spectral use (Fiedler vector, spectral clustering, connectivity count via the zero-eigenvalue multiplicity) reads the wrong matrix.
|
|
220
|
-
- **Fix**: Accumulate instead of assigning in `graph_compute_adjacency_matrix` — `result.setCellValue(a, b, result.getCellValue(a, b) + 1)` for both `(a,b)` and `(b,a)` — and document that the matrix must be zero-filled by the caller (the JSDoc already states it does not zero-fill).
|
|
221
|
-
- **Confidence**: Confirmed
|
|
222
|
-
|
|
223
|
-
### PROC-25 Heap invariant broken after merging edge weights: `bubbleDown` used where the element must bubble **up**
|
|
224
|
-
- **Severity**: MAJOR
|
|
225
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/graph/mn_graph_collapse_weighted_edge.js:69`
|
|
226
|
-
- **Defect**: `mn_graph_coarsen` builds `new BinaryHeap(WeightedEdge.extractNegativeWeight)`. `BinaryHeap` is a min-heap on the score function (`bubbleUp` swaps while `score < parentScore`, `pop` returns `data[0]`), so score `-weight` makes it a max-heap on weight. In the merge branch, `target_edge.weight += b_edge.weight` **increases** the weight, i.e. **decreases** the score, so the element must move toward the root. The code calls only `heap.bubbleDown(heap_index)`, which is a no-op for a decreased score, leaving the element parked below lighter edges.
|
|
227
|
-
- **Failure scenario**: heap contains edges of weight 10 (root) and 3 (a leaf). Collapsing merges 8 into the weight-3 edge, making it weight 11 while it stays at a leaf position. `bubbleDown` finds no smaller child and returns. The next `open_set.pop()` returns the weight-10 edge instead of the weight-11 edge, so `mn_graph_coarsen` no longer collapses heaviest-edge-first — the coarsening order the algorithm is defined by is violated and the resulting partition differs from the specified one.
|
|
228
|
-
- **Fix**: Call the purpose-built `heap.updateElementScore(target_edge)` (it does `bubbleUp` then `bubbleDown` and already handles the not-found case), replacing the manual `indexOf` + `bubbleDown` pair.
|
|
229
|
-
- **Confidence**: Confirmed
|
|
230
|
-
|
|
231
|
-
---
|
|
232
|
-
|
|
233
|
-
## core/clipboard
|
|
234
|
-
|
|
235
|
-
### PROC-26 `obtainClipBoard` has an inverted guard and resolves with `undefined` when there is no clipboard
|
|
236
|
-
- **Severity**: MAJOR
|
|
237
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/clipboard/obtainClipBoard.js:8`
|
|
238
|
-
- **Defect**: The permission check runs only `if (navigator.clipboard === undefined)` — i.e. only when there is no clipboard to permit — and the function then returns `navigator.clipboard` regardless, which in that branch is `undefined`. The condition is backwards: permissions should be verified when a clipboard *is* present, and the absence of `navigator.clipboard` should reject so callers can fall back.
|
|
239
|
-
- **Failure scenario**: a context where `navigator.clipboard` is undefined but `navigator.permissions.query({name:"clipboard-read"})` resolves `"granted"` (Chromium exposes the Permissions API independently of the Async Clipboard API). `obtainClipBoard()` **resolves** with `undefined`; `safeClipboardReadText` then takes its success branch and evaluates `navigator.clipboard.readText()` → `TypeError: Cannot read properties of undefined`. The file-picker fallback — the entire reason `safeClipboardReadText`/`safeClipboardWriteText` exist — is never reached, because it is wired to the rejection handler.
|
|
240
|
-
- **Fix**: Invert to `if (navigator.clipboard === undefined) { throw new Error("Clipboard API unavailable"); }` and perform the permission queries afterwards on the clipboard-present path.
|
|
241
|
-
- **Confidence**: Confirmed (by reading; requires a browser to execute)
|
|
242
|
-
|
|
243
|
-
### PROC-27 `safeClipboardReadText` fallback never settles when the user cancels the file picker
|
|
244
|
-
- **Severity**: MINOR
|
|
245
|
-
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/clipboard/safeClipboardReadText.js:29`
|
|
246
|
-
- **Defect**: The fallback returns `new Promise((resolve, reject) => openFile(resolve))`. `resolve` is only reachable from `reader.onload`. Cancelling the dialog fires no `change` event at all; a `change` with no file hits `if (!file) { return; }`; and `reader.onerror` is not wired. `reject` is never called on any path. The hidden `<input>` is also left attached to `document.body`.
|
|
247
|
-
- **Failure scenario**: `await safeClipboardReadText()` in a browser without an Async Clipboard API; the user presses Cancel in the file dialog. The awaiting code hangs forever with no error surfaced.
|
|
248
|
-
- **Fix**: Reject on `reader.onerror` and on the `!file` path, and listen for the `cancel` event on the file input (or a window `focus` fallback) to reject; remove the input element in a `finally`.
|
|
249
|
-
- **Confidence**: Confirmed (by reading; requires a browser to execute)
|
|
250
|
-
|
|
251
|
-
---
|
|
252
|
-
|
|
253
|
-
## Areas reviewed and found clean
|
|
254
|
-
|
|
255
|
-
- `core/assert.js` — no correctness defects found.
|
|
256
|
-
- `core/time/current_time_in_seconds.js` — correct ms→s scaling, correct monotonic-source selection.
|
|
257
|
-
- `core/dom/isImageBitmap.js` — correct.
|
|
258
|
-
- `core/process/matcher/*` (the function-style matchers) — all correct.
|
|
259
|
-
- `core/graph/csr/*` — `csr_graph_find_shortest_path` and `csr_graph_build_distance_field` Dijkstra relaxation, lazy-deletion handling and the `out_exit` inheritance chain are correct (a predecessor is always finalised before the vertex that names it, including under zero-weight edges). `CSRGraph` buffer arithmetic, `truncate_adjacency`, `equals` and `hash` all check out.
|
|
260
|
-
- `core/graph/v2/Graph.js` / `NodeContainer.js` — add/remove edge bookkeeping, neighbour reference counting, self-loop handling and the snapshot-based `traverseEdges` are all consistent; `removeNode` correctly avoids mutation-during-iteration.
|
|
261
|
-
- `core/graph/graph_compute_disconnected_clusters.js`, `layout/computeDisconnectedSubGraphs.js` — no double-visits, no missed nodes, multi-edge safe.
|
|
262
|
-
- `core/graph/coloring/colorizeGraphGreedy.js`, `colorizeGraphMCS.js`, `colorizeGraphGreedyWeight.js`, `validateGraphColoring.js` — correct (the greedy comparator is explicit, not a bare `.sort()`).
|
|
263
|
-
- `core/graph/format/graphviz/graphviz_escape_string.js` — escape ordering is correct (backslashes before quotes).
|
|
264
|
-
- `core/graph/metis/native/coarsen/*` — `match_shem` renumbering contract and `create_coarse_graph`'s merge / self-loop-drop / position-reset logic are consistent with each other and with the worst-case sizing.
|
|
265
|
-
- `core/process/filter/*`, `core/process/executor/profile/*`, `core/process/buildPromiseChain.js`, `core/process/delay.js`, `core/process/SimpleLifecycle.js` — no correctness defects found.
|
|
266
|
-
- `WorkerBuilder`'s function-rename regex was suspected of renaming nested `function` declarations; verified it does not (`[^\]]*` spans newlines, so the nested definition is captured verbatim in group 3).
|
|
1
|
+
# Correctness review — `core/process`, `core/graph`, `core/debug`, `core/time`, `core/clipboard`, `core/dom`, `core/assert.js`
|
|
2
|
+
|
|
3
|
+
Scope reviewed: every non-spec source file under the listed directories.
|
|
4
|
+
Every finding below was reproduced by executing the real module in Node (no mocks) unless marked otherwise.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## core/debug
|
|
9
|
+
|
|
10
|
+
### PROC-1 `anything()` matches nothing and `nothing()` matches everything
|
|
11
|
+
- **Severity**: CRITICAL
|
|
12
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/debug/matchers/IsAnything.js:12`
|
|
13
|
+
- **Defect**: `IsAnything.matches()` returns `false` unconditionally. The matcher whose entire purpose is "accept any value" rejects every value, and `nothing()` (built as `not(anything())`) therefore accepts every value. Both public factories in `matchers.js` are logically inverted.
|
|
14
|
+
- **Failure scenario**: `anything().matches(42)` → `false` (verified). `assert.that(x, 'x', anything())` throws for *every* `x`. Conversely `nothing().matches(42)` → `true` (verified), so `assert.that(x, 'x', nothing())` never triggers — a guard that is supposed to be unreachable silently passes everything.
|
|
15
|
+
- **Fix**: `matches(item, mismatch_description) { return true; }`.
|
|
16
|
+
- **Confidence**: Confirmed
|
|
17
|
+
|
|
18
|
+
### PROC-2 `Matcher.matches(item)` — the documented single-argument form — throws in AllOf / IsIterableContaining / CombinableMatcher
|
|
19
|
+
- **Severity**: MAJOR
|
|
20
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/debug/matchers/AllOf.js:25` (also `IsIterableContaining.js:22`, `CombinableMatcher.js:25`)
|
|
21
|
+
- **Defect**: The base class declares `matches(item, mismatch_description = NullDescription.INSTANCE)` and documents the second parameter as optional. Subclass overrides re-declare the parameter *without* the default (default parameter values are not inherited), then dereference it on the mismatch path. `assert.that` calls `matcher.matches(value)` with one argument, so this is the primary in-repo call site.
|
|
22
|
+
- **Failure scenario**: `allOf(isIn([3,7]), not(equalTo(7))).matches(2)` → `TypeError: Cannot read properties of undefined (reading 'appendDescriptionOf')` instead of `false` (verified). `hasItem(1).matches([])` → `TypeError: ... (reading 'appendText')` (verified). Any `assert.that(v, 'v', allOf(...))` on a failing value surfaces a TypeError instead of the intended assertion message.
|
|
23
|
+
- **Fix**: Give every override the same default: `matches(item, mismatch_description = NullDescription.INSTANCE)`.
|
|
24
|
+
- **Confidence**: Confirmed
|
|
25
|
+
|
|
26
|
+
### PROC-3 `DescribeAs` never performs template substitution
|
|
27
|
+
- **Severity**: MAJOR
|
|
28
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/debug/matchers/DescribeAs.js:42`
|
|
29
|
+
- **Defect**: Three independent errors in `describeTo`. (a) `String.prototype.matchAll` returns an *iterator*, not an array, so `matches.length` is `undefined` and `for (let i = 0; i < undefined; i++)` never executes. (b) `match.groups[1]` reads a named-group bag that is `undefined` for this un-named-group regex — it would throw if the loop ever ran; it should be `match[1]`. (c) `textStart = match[0].length` should be `match.index + match[0].length`, otherwise the tail slice restarts from the wrong offset.
|
|
30
|
+
- **Failure scenario**: `new DescribeAs("value must be %0 or %1", equalTo(1), ["A","B"]).describeTo(d)` writes the literal `value must be %0 or %1` instead of `value must be "A" or "B"` (verified). Reached in production via `nothing(message)`, which routes through `describeAs`.
|
|
31
|
+
- **Fix**: `const matches = Array.from(this.template.matchAll(RX));`, use `match[1]`, and set `textStart = match.index + match[0].length`.
|
|
32
|
+
- **Confidence**: Confirmed
|
|
33
|
+
|
|
34
|
+
### PROC-4 `appendValue(undefined)` renders as `"null"`
|
|
35
|
+
- **Severity**: MINOR
|
|
36
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/debug/BaseDescription.js:39`
|
|
37
|
+
- **Defect**: `if (value == null)` (loose equality) is true for `undefined` as well as `null`, so the dedicated `else if (value === undefined)` branch on the next line is unreachable.
|
|
38
|
+
- **Failure scenario**: `new InMemoryDescriptor().appendValue(undefined).value` → `"null"` (verified). An assertion failure on an `undefined` value reports it as `null`, which is a different bug class for the reader.
|
|
39
|
+
- **Fix**: Use `value === null` on the first branch, or reorder so the `undefined` test comes first.
|
|
40
|
+
- **Confidence**: Confirmed
|
|
41
|
+
|
|
42
|
+
### PROC-5 `IsIterableContaining` mismatch text describes the collection, not its elements
|
|
43
|
+
- **Severity**: MINOR
|
|
44
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/debug/matchers/IsIterableContaining.js:41`
|
|
45
|
+
- **Defect**: The mismatch loop iterates `itemElement` but passes the whole collection `item` to `describeMismatch`. The element variable is never used.
|
|
46
|
+
- **Failure scenario**: `hasItem(9).matches([1,2,3], d)` produces `mismatches were: [was <1,2,3>, was <1,2,3>, was <1,2,3>]` instead of `was 1, was 2, was 3`.
|
|
47
|
+
- **Fix**: `this.#element_matcher.describeMismatch(itemElement, mismatch_description);`
|
|
48
|
+
- **Confidence**: Confirmed
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## core/process — task & executor
|
|
53
|
+
|
|
54
|
+
### PROC-6 A task blocked on a FAILED dependency is silently dropped: never fails, never resolves
|
|
55
|
+
- **Severity**: CRITICAL
|
|
56
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/executor/ConcurrentExecutor.js:286`
|
|
57
|
+
- **Defect**: `resolveTasks()`'s `ResolutionType.FAILED` branch splices the task out of `queueUnresolved` and does nothing else — it never sets `task.state` to `FAILED` and never dispatches `task.on.failed`. The task is left in `INITIAL` forever, invisible to the executor.
|
|
58
|
+
- **Failure scenario**: `A = failingTask(...)`, `B.addDependency(A)`, `executor.run(A); executor.run(B)`. Verified result: `A.state === FAILED (3)`, `B.state === INITIAL (0)`, no `on.failed`/`on.completed` dispatch on B, `executor.contains(B) === false`, `queueUnresolved.length === 0`. `await B.promise()` hangs forever. Worse, any task `C` depending on `B` sees `B.state === INITIAL` in `tryResolve` and returns `UNRESOLVED` forever — the whole downstream subgraph is permanently stuck while `executor.on.completed` still fires.
|
|
59
|
+
- **Fix**: In the FAILED branch, mirror `#fail_task`: set `unresolvedTask.state.set(TaskState.FAILED)` and `unresolvedTask.on.failed.send1(<dependency failure reason>)` before/after the splice, then restart the scan (`i = -1; l = queueUnresolved.length;`) because the dispatch can mutate the queue.
|
|
60
|
+
- **Confidence**: Confirmed
|
|
61
|
+
|
|
62
|
+
### PROC-7 `Task.executeSync()` never updates `Task.state`
|
|
63
|
+
- **Severity**: MAJOR
|
|
64
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/task/Task.js:214`
|
|
65
|
+
- **Defect**: `executeSync` runs the initializer, cycles to completion and fires `on.started`/`on.completed`/`on.failed`, but never assigns `this.state`. The task remains in `TaskState.INITIAL` after a successful synchronous run.
|
|
66
|
+
- **Failure scenario**: `const t = emptyTask(); t.executeSync();` → `t.state.getValue() === 0 (INITIAL)`, not `4 (SUCCEEDED)` (verified). Consequently `Task.join`/`t.promise()` takes the "not finished yet" branch and registers `on.completed.addOne(resolve)` on a signal that already fired — the promise never settles (verified: still `PENDING` after 20 ms). Feeding a sync-executed task as a dependency into a `ConcurrentExecutor` also blocks its dependents forever, because `tryResolve` reads `INITIAL` → `UNRESOLVED`.
|
|
67
|
+
- **Fix**: Set `this.state.set(TaskState.RUNNING)` before the cycle loop and `TaskState.SUCCEEDED` / `TaskState.FAILED` alongside the corresponding signal dispatch.
|
|
68
|
+
- **Confidence**: Confirmed
|
|
69
|
+
|
|
70
|
+
### PROC-8 `ignoreFailureTask` does not ignore a *thrown* failure
|
|
71
|
+
- **Severity**: MAJOR
|
|
72
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/task/util/ignoreFailureTask.js:38`
|
|
73
|
+
- **Defect**: The wrapper only converts an explicit `TaskSignal.EndFailure` return into `EndSuccess`. An exception thrown out of `task.cycle()` propagates through the wrapper unchanged, and `ConcurrentExecutor.#executeTimeSlice` treats a thrown exception as task failure (`#fail_task`) — so the wrapper fails too. Throwing is a first-class failure mode in this codebase: `failingTask(e)` (the repo's own canonical failing task) fails exclusively by throwing, and both `promiseTask` and `futureTask` `throw error` on rejection.
|
|
74
|
+
- **Failure scenario**: `ignoreFailureTask(failingTask(new Error("boom")))` — the wrapper propagates `Error: boom` (verified) instead of resolving in success as its JSDoc promises. Under `ConcurrentExecutor` the wrapper ends in `FAILED`.
|
|
75
|
+
- **Fix**: Wrap the `task.cycle()` call in try/catch and return `TaskSignal.EndSuccess` on a caught exception (matching the existing treatment of an initializer throw).
|
|
76
|
+
- **Confidence**: Confirmed
|
|
77
|
+
|
|
78
|
+
### PROC-9 `RemainingTimeEstimator.estimate` averages over unfilled sample slots
|
|
79
|
+
- **Severity**: MAJOR
|
|
80
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/task/RemainingTimeEstimator.js:39`
|
|
81
|
+
- **Defect**: `rates` is a zero-filled `Float32Array(sampleCount)`; `estimate` always divides the sum by the full `sampleCount` rather than by the number of `update()` calls actually recorded. The unwritten zeros drag the average rate down by a factor of `sampleCount / filled`.
|
|
82
|
+
- **Failure scenario**: `const e = new RemainingTimeEstimator(10); e.update(1000, 0.5); e.estimate(0.5)` → `10000` (verified) when the correct remaining time is `1000`. A 10× over-estimate persists until the ring buffer is fully populated — i.e. for the whole early phase of every task, which is exactly when an ETA is displayed.
|
|
83
|
+
- **Fix**: Track a `filled` counter (`Math.min(filled + 1, sampleCount)`) in `update` and divide by it in `estimate`; return `Infinity` when `filled === 0`.
|
|
84
|
+
- **Confidence**: Confirmed
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## core/process — undo (`ActionProcessor`)
|
|
89
|
+
|
|
90
|
+
### PROC-10 undo → do → redo crashes: the future branch of history is truncated but its marks are not
|
|
91
|
+
- **Severity**: CRITICAL
|
|
92
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/undo/ActionProcessor.js:487`
|
|
93
|
+
- **Defect**: `__unsafe_do` discards the redo branch with `history.crop(0, this.cursor)` but leaves `this.marks` untouched (there is a `// TODO clear future marks` on line 489). Marks whose `index` now exceeds `history.length` become dangling, and `__unsafe_redo` uses those indices as a loop bound.
|
|
94
|
+
- **Failure scenario** (verified end-to-end): `await ap.do(A); await ap.do(B); await ap.mark("m1"); await ap.undo(); await ap.do(C);` leaves `history.length === 1`, `cursor === 1`, `marks === [index 2]`. The next `await ap.redo()` computes `mark = 2`, reads `history.get(1) === undefined` and throws `TypeError: Cannot read properties of undefined (reading 'apply')`. This is the ordinary editor sequence "undo, then do something else, then press redo".
|
|
95
|
+
- **Fix**: In `__unsafe_do`, before/alongside the crop, splice off every mark with `index > this.cursor` and dispatch `onMarkRemoved` for each.
|
|
96
|
+
- **Confidence**: Confirmed
|
|
97
|
+
|
|
98
|
+
### PROC-11 `doMany` with a failing action never settles and permanently deadlocks the processor
|
|
99
|
+
- **Severity**: CRITICAL
|
|
100
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/undo/ActionProcessor.js:439`
|
|
101
|
+
- **Defect**: `new Promise(async (resolve, reject) => { ... await this.__unsafe_do(action) ... resolve(); })` — the classic async-executor antipattern. When `__unsafe_do` rejects, the rejection escapes into the async executor function's own (discarded) promise; `reject` is never called, so the constructed promise `p` stays pending forever. `p` is then stored in `this.__last_promise`, and every subsequent `do`/`undo`/`redo`/`mark`/`navigateTo` starts with `await this.__barrier()` on that never-settling promise.
|
|
102
|
+
- **Failure scenario** (verified): `ap.doMany([goodAction, throwingAction])` — the returned promise is still `PENDING` after 60 ms and an `unhandledRejection` is emitted (fatal in Node ≥ 15 / reported by Jest). A following `await ap.do(anotherAction)` is also still `PENDING` and `history.length` stays at 1: the ActionProcessor is bricked for the remainder of the session.
|
|
103
|
+
- **Fix**: Drop the wrapper — make the body a plain `async` helper (`const p = (async () => { for (...) await this.__unsafe_do(actions[i]); })()`), matching how `do`/`undo`/`redo` already build `p`.
|
|
104
|
+
- **Confidence**: Confirmed
|
|
105
|
+
|
|
106
|
+
### PROC-12 `cleanupHistory` compares a mark *count* against a *byte* limit — neither history limit is ever enforced
|
|
107
|
+
- **Severity**: MAJOR
|
|
108
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/undo/ActionProcessor.js:204`
|
|
109
|
+
- **Defect**: `let lastMark = min2(marks.length, this.historyMemoryLimit) - 1;` mixes a mark count with a byte budget (default 268435456), so `lastMark` is always `marks.length - 1` and the subsequent `if (lastMark + 1 < marks.length)` is always false. `historyMarkLimit` is never consulted at all. The memory branch is equally dead: it decrements while `marks[lastMark].memoryUsage > this.historyMemoryUsage`, but a mark's recorded usage is a *past* snapshot and therefore never exceeds the current total. Separately, if the guard ever did fire, `const marksToDrop = lastMark - this.historyMarkLimit` is negative for any realistic history and `marks[marksToDrop]` would be `undefined` → `TypeError` on `.index`.
|
|
110
|
+
- **Failure scenario** (verified): with `ap.historyMarkLimit = 2`, doing 6 actions each followed by a mark leaves `marks.length === 6` and `history.length === 6` — nothing dropped. With `ap.historyMemoryLimit = 3000` and 10 actions of 1000 bytes each, `historyMemoryUsage === 10000` and `history.length === 10`. Both documented caps are inert, so undo history grows without bound for the process lifetime.
|
|
111
|
+
- **Fix**: Compute the mark cut-off from `historyMarkLimit` (`const marksToDrop = marks.length - this.historyMarkLimit`) and, separately, walk marks from the oldest while `historyMemoryUsage - marks[i].memoryUsage > historyMemoryLimit` for the byte cap. Guard `marksToDrop > 0` before indexing.
|
|
112
|
+
- **Confidence**: Confirmed
|
|
113
|
+
|
|
114
|
+
### PROC-13 `dropHistory` destroys the boundary mark that should survive at index 0
|
|
115
|
+
- **Severity**: MINOR
|
|
116
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/undo/ActionProcessor.js:134`
|
|
117
|
+
- **Defect**: The cut-off scan uses `marks[i].index <= recordsToDrop`. Records `[0, recordsToDrop)` are removed, so a mark at exactly `index === recordsToDrop` still points at a surviving record (it becomes index 0) and must be kept. The condition should be `<`. `cleanupHistory`'s own `assert.equal(newFirstMark.index, 0, ...)` on line 224 documents that this mark is expected to survive — the two sites contradict each other.
|
|
118
|
+
- **Failure scenario**: history `[A,B,C,D]`, one mark at `index 2`. `dropHistory(2)` leaves history `[C,D]` but removes the mark, so the caller loses the only navigable point in the surviving history.
|
|
119
|
+
- **Fix**: `for (; i < markCount && marks[i].index < recordsToDrop; i++)`.
|
|
120
|
+
- **Confidence**: Confirmed (by reading; the runtime check is blocked by PROC-14's arity issue in dev builds)
|
|
121
|
+
|
|
122
|
+
### PROC-14 `onMarkAdded` and `onMarkRemoved` emit different payload types
|
|
123
|
+
- **Severity**: MINOR
|
|
124
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/undo/ActionProcessor.js:196` and `:154`
|
|
125
|
+
- **Defect**: `mark()` dispatches `this.onMarkAdded.send1(description)` (the raw description, verified) while `dropHistory` dispatches `Mark` instances (`dropped_marks.forEach(this.onMarkRemoved.send1, ...)`) and `mark()`'s own eviction path does `this.onMarkRemoved.send1(mark)`. Both signals are typed `Signal<M>` (description) in the field JSDoc. Additionally, `Array.prototype.forEach` invokes the callback with `(element, index, array)`, so `send1` is called with three arguments.
|
|
126
|
+
- **Failure scenario**: A UI keeping an undo-stack list keyed by description adds `"m1"` on `onMarkAdded` but receives `Mark { index: 0, description: "m1" }` on `onMarkRemoved`; the lookup misses and the entry is never removed from the list.
|
|
127
|
+
- **Fix**: Dispatch `mark.description` from both removal sites, and replace the `forEach(send1, signal)` with an explicit loop so exactly one argument is passed.
|
|
128
|
+
- **Confidence**: Confirmed
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## core/process — other
|
|
133
|
+
|
|
134
|
+
### PROC-15 `Future` can reach a terminal state twice; a rejected future can flip to resolved
|
|
135
|
+
- **Severity**: MAJOR
|
|
136
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/Future.js:80`
|
|
137
|
+
- **Defect**: `__handleResolution` and `__handleRejection` set `state` unconditionally with no already-settled guard. The `resolve`/`reject` callbacks handed to the resolver can therefore both fire, and the last one wins — violating the settle-once contract that `Future` advertises by mirroring the Promise API (`then`/`catch`, `@extends Promise<T>`).
|
|
138
|
+
- **Failure scenario** (verified): `const f = new Future((res, rej) => { rej(new Error("nope")); res(42); }); f.resolve();` → `f.state === RESOLVED (2)`, and `f.then(onOk, onErr)` invokes `onOk(42)`. A real Promise stays rejected and runs `onErr`. Downstream, `futureTask` polls `resolved`/`rejected` flags set by exactly this `then` registration, so a resolver that rejects-then-resolves turns a failed task into a successful one.
|
|
139
|
+
- **Fix**: Early-return from both handlers unless `this.state === FutureStates.PENDING`.
|
|
140
|
+
- **Confidence**: Confirmed
|
|
141
|
+
|
|
142
|
+
### PROC-16 `WatchDog.bark` disarms a watchdog that its own action re-armed
|
|
143
|
+
- **Severity**: MAJOR
|
|
144
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/WatchDog.js:52`
|
|
145
|
+
- **Defect**: `bark()` runs `this.action.call(...)` *first* and only then sets `this.timeoutId = -1`. During the action `isActive()` still reports `true`, so a re-arm from inside the action is either ignored (`start()` no-ops) or scheduled and then orphaned (`kick()` installs a fresh timer whose id is immediately overwritten with `-1`).
|
|
146
|
+
- **Failure scenario** (verified): a watchdog whose action calls `wd.start()` to re-arm itself — the canonical "handle the stall, then keep watching" pattern. After the first bark `isActive() === false` and no second bark ever occurs: the watchdog is silently dead. With `kick()` instead, a timer is left running that `stop()` can no longer cancel (`isActive()` is false), so the action fires again unexpectedly and the `kick()` inside it throws `WatchDog is not active`.
|
|
147
|
+
- **Fix**: Set `this.timeoutId = -1` *before* invoking the action.
|
|
148
|
+
- **Confidence**: Confirmed
|
|
149
|
+
|
|
150
|
+
### PROC-17 `.finally()` chains create unhandled promise rejections
|
|
151
|
+
- **Severity**: MAJOR
|
|
152
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/PromiseWatcher.js:45` and `H:/git/moh/app/src/mir-engine/meep/src/core/process/worker/OnDemandWorkerManager.js:135`
|
|
153
|
+
- **Defect**: Both sites call `promise.finally(cb)` and discard the returned promise. `p.finally(cb)` produces a *new* promise that adopts `p`'s rejection; because nothing attaches a handler to it, a rejecting `p` always produces an unhandled rejection — even when the original caller handled `p` correctly.
|
|
154
|
+
- **Failure scenario**: `watcher.add(somePromise)` where `somePromise` later rejects → `unhandledrejection` in the browser; in Node/Jest (Node ≥ 15 default) the process aborts. For `OnDemandWorkerManager.request`, `WorkerProxy.__failAllPending` rejects every in-flight request on worker error, so a single failing worker script turns each queued request into an unhandled rejection on top of the (correctly handled) rejection the caller sees.
|
|
155
|
+
- **Fix**: Suppress the derived promise: `promise.then(cb, cb)`, or `promise.finally(cb).catch(() => {})`.
|
|
156
|
+
- **Confidence**: Confirmed
|
|
157
|
+
|
|
158
|
+
### PROC-18 `CompositeProcess.finalize()` on a running composite leaves children in `Stopped`, not `Finalized`
|
|
159
|
+
- **Severity**: MAJOR
|
|
160
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/CompositeProcess.js:27`
|
|
161
|
+
- **Defect**: `finalize()` finalizes children first, then calls `super.finalize()`. `BaseProcess.finalize` sees the composite still in `Running` and calls `this.shutdown()`, which is the *overridden* `CompositeProcess.shutdown` — so every child is shut down a second time, and `BaseProcess.shutdown` unconditionally writes `ProcessState.Stopped` over the child's `Finalized` state.
|
|
162
|
+
- **Failure scenario** (verified): a `CompositeProcess([a, b])` taken through `initialize(); startup(); finalize()` ends with composite = `finalized` but `a` and `b` = `stopped`. Any subsequent lifecycle check that requires children to be `Finalized`, or a second `finalize()`, sees corrupt state; children that release resources in `finalize` are also asked to shut down after they have already torn themselves down.
|
|
163
|
+
- **Failure path**: `finalize()` → children `Finalized` → `super.finalize()` sees `Running` → `this.shutdown()` → `children.forEach(c => c.shutdown())` → children forced back to `Stopped`.
|
|
164
|
+
- **Fix**: Have `CompositeProcess.finalize` shut itself down first (`if (this.__state.getValue() === ProcessState.Running) super.shutdown();`) before finalizing children, or make `BaseProcess.finalize` call `BaseProcess.prototype.shutdown` on itself only.
|
|
165
|
+
- **Confidence**: Confirmed
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## core/process — worker
|
|
170
|
+
|
|
171
|
+
### PROC-19 `extractTransferables(null)` throws
|
|
172
|
+
- **Severity**: CRITICAL
|
|
173
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/worker/extractTransferables.js:24`
|
|
174
|
+
- **Defect**: `typeof null === "object"`, so a `null` value falls past the "not an object, skip" branch, fails `instanceof ArrayBuffer`, and reaches `value.buffer` → TypeError. The inline duplicate of this exact function generated inside `WorkerBuilder.build()` (line 121) *does* have the `obj === null` guard, which shows the omission is unintentional.
|
|
175
|
+
- **Failure scenario** (verified): `extractTransferables({ a: null }, [])` → `TypeError: Cannot read properties of null (reading 'buffer')`. Any worker payload containing a null field — extremely common in serialized game objects — crashes before the message is ever posted. The spec file covers `{}`, buffers, typed arrays and nesting, but never a null.
|
|
176
|
+
- **Fix**: Change the first branch to `if (value === null || typeof value !== "object")`.
|
|
177
|
+
- **Confidence**: Confirmed
|
|
178
|
+
|
|
179
|
+
### PROC-20 A failed `postMessage` drops the request without ever rejecting its promise
|
|
180
|
+
- **Severity**: CRITICAL
|
|
181
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/worker/WorkerProxy.js:154`
|
|
182
|
+
- **Defect**: When `trySendMessage` returns `false` (it swallows the `postMessage` exception and logs it), the request is removed from the pending queue but neither `resolve` nor `reject` is invoked. The promise handed to the caller can never settle: it is no longer in the queue, so `__handleMessage` and `__failAllPending` will never find it either.
|
|
183
|
+
- **Failure scenario**: `workerProxy.someMethod(objectContainingAFunctionOrDomNode)` — `postMessage` throws `DataCloneError`, the console shows `failed to send message:`, and `await` on the returned promise hangs for the lifetime of the page. PROC-21 makes this reachable in ordinary use, since the `toJSON` sanitisation that was meant to prevent non-cloneable payloads never runs.
|
|
184
|
+
- **Fix**: Reject the promise on send failure: `reject(new Error(...))` in place of (or alongside) the `array_remove_first`.
|
|
185
|
+
- **Confidence**: Confirmed
|
|
186
|
+
|
|
187
|
+
### PROC-21 `needsSerialization` compares a function against the string `"function"` — `toJSON` is never applied
|
|
188
|
+
- **Severity**: MAJOR
|
|
189
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/process/worker/WorkerProxy.js:40`
|
|
190
|
+
- **Defect**: `value.toJSON === "function"` should be `typeof value.toJSON === "function"`. As written the branch is unreachable, so `$submitRequest` always posts the raw argument and the documented `toJSON` sanitisation path is dead. (`hasOwnProperty('toJSON')` additionally excludes the normal case where `toJSON` lives on the class prototype.)
|
|
191
|
+
- **Failure scenario** (verified with the exact predicate): `needsSerialization({ toJSON() { return { plain: 1 }; } })` → `false`. Passing any engine object that relies on `toJSON` to strip non-cloneable members (signals, DOM handles, functions) to a worker method posts the raw object, which `postMessage` rejects with `DataCloneError` → the request silently disappears per PROC-20.
|
|
192
|
+
- **Fix**: `if (typeof value.toJSON === "function") { return true; }` (drop the `hasOwnProperty` gate so prototype-defined `toJSON` is honoured).
|
|
193
|
+
- **Confidence**: Confirmed
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## core/graph
|
|
198
|
+
|
|
199
|
+
### PROC-22 `colorizeGraph` builds an asymmetric adjacency matrix from directed edges and returns invalid colourings
|
|
200
|
+
- **Severity**: MAJOR
|
|
201
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/graph/coloring/colorizeGraph.js:38`
|
|
202
|
+
- **Defect**: `graphToMatrix` writes `data[i][other] = 1` only when `edge.validateTransition(node, otherNode)` succeeds. For a `Forward` edge `P → Q` this sets `data[P][Q] = 1` but leaves `data[Q][P] = 0`. Graph colouring is an inherently undirected constraint, and the downstream `colorizing`/`updateNN` conflict elimination reads the matrix by row only, so a conflict recorded in just one direction is missed whenever the *other* endpoint is coloured first.
|
|
203
|
+
- **Failure scenario** (verified): nodes `X, P, Q, R` with `Forward` edges `P→X`, `X→Q`, `X→R`. `colorizeGraph` returns `[1, 1, 2, 2]` — `X` and `P` are adjacent yet share colour 1. `validateGraphColoring(colors, graph)` (which uses undirected `getNeighbours`) returns `false` on the library's own output.
|
|
204
|
+
- **Fix**: Make the matrix symmetric: set both `data[i * V + otherIdx]` and `data[otherIdx * V + i]` for every attached edge, and drop the `validateTransition` gate (or keep it only for genuinely directed colouring variants, which this algorithm is not).
|
|
205
|
+
- **Confidence**: Confirmed
|
|
206
|
+
|
|
207
|
+
### PROC-23 `convert_graph_to_dot_string` silently omits every `Backward` edge
|
|
208
|
+
- **Severity**: MAJOR
|
|
209
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/graph/convert_graph_to_dot_string.js:59`
|
|
210
|
+
- **Defect**: The emission guard is `(direction === Forward || direction === Undirected) && edge.first === node`. `EdgeDirectionType.Backward` satisfies neither disjunct, so a backward edge is skipped when visiting `first` and also skipped when visiting `second` (because `edge.first !== node` there). It is never written out.
|
|
211
|
+
- **Failure scenario** (verified): a graph with nodes `A`, `B` and `graph.createEdge("A", "B", EdgeDirectionType.Backward)` produces DOT containing both node declarations and **zero** `->` lines. The rendered diagram shows two isolated nodes; the edge is invisible.
|
|
212
|
+
- **Fix**: Add a `Backward` case that emits the reversed arrow `nodeId(secondIndex) -> nodeId(i)` once (guarded on `edge.first === node` so it is emitted exactly once).
|
|
213
|
+
- **Confidence**: Confirmed
|
|
214
|
+
|
|
215
|
+
### PROC-24 Laplacian is inconsistent on multigraphs: degree counts parallel edges, adjacency saturates at 1
|
|
216
|
+
- **Severity**: MAJOR
|
|
217
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/graph/graph_compute_adjacency_matrix.js:23` (surfaces in `graph_compute_laplacian_matrix.js:22`)
|
|
218
|
+
- **Defect**: `graph_compute_adjacency_matrix` writes a literal `1` per edge, so parallel edges collapse to a single 1. `graph_compute_degree_matrix` uses `graph.getNodeDegree`, which returns `NodeContainer.getEdgeCount()` and *does* count each parallel edge. `L = D - A` therefore has rows that don't sum to zero — the defining property of a graph Laplacian. Multi-edges are a first-class supported state of `Graph` (`NodeContainer.__neighbors` is explicitly documented as "number of edges to that node").
|
|
219
|
+
- **Failure scenario** (verified): nodes `A`, `B` joined by two parallel edges. `graph_compute_laplacian_matrix` yields `[[2, -1], [-1, 2]]`; row sums are `1`, not `0`. The correct Laplacian is `[[2, -2], [-2, 2]]`. Any spectral use (Fiedler vector, spectral clustering, connectivity count via the zero-eigenvalue multiplicity) reads the wrong matrix.
|
|
220
|
+
- **Fix**: Accumulate instead of assigning in `graph_compute_adjacency_matrix` — `result.setCellValue(a, b, result.getCellValue(a, b) + 1)` for both `(a,b)` and `(b,a)` — and document that the matrix must be zero-filled by the caller (the JSDoc already states it does not zero-fill).
|
|
221
|
+
- **Confidence**: Confirmed
|
|
222
|
+
|
|
223
|
+
### PROC-25 Heap invariant broken after merging edge weights: `bubbleDown` used where the element must bubble **up**
|
|
224
|
+
- **Severity**: MAJOR
|
|
225
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/graph/mn_graph_collapse_weighted_edge.js:69`
|
|
226
|
+
- **Defect**: `mn_graph_coarsen` builds `new BinaryHeap(WeightedEdge.extractNegativeWeight)`. `BinaryHeap` is a min-heap on the score function (`bubbleUp` swaps while `score < parentScore`, `pop` returns `data[0]`), so score `-weight` makes it a max-heap on weight. In the merge branch, `target_edge.weight += b_edge.weight` **increases** the weight, i.e. **decreases** the score, so the element must move toward the root. The code calls only `heap.bubbleDown(heap_index)`, which is a no-op for a decreased score, leaving the element parked below lighter edges.
|
|
227
|
+
- **Failure scenario**: heap contains edges of weight 10 (root) and 3 (a leaf). Collapsing merges 8 into the weight-3 edge, making it weight 11 while it stays at a leaf position. `bubbleDown` finds no smaller child and returns. The next `open_set.pop()` returns the weight-10 edge instead of the weight-11 edge, so `mn_graph_coarsen` no longer collapses heaviest-edge-first — the coarsening order the algorithm is defined by is violated and the resulting partition differs from the specified one.
|
|
228
|
+
- **Fix**: Call the purpose-built `heap.updateElementScore(target_edge)` (it does `bubbleUp` then `bubbleDown` and already handles the not-found case), replacing the manual `indexOf` + `bubbleDown` pair.
|
|
229
|
+
- **Confidence**: Confirmed
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## core/clipboard
|
|
234
|
+
|
|
235
|
+
### PROC-26 `obtainClipBoard` has an inverted guard and resolves with `undefined` when there is no clipboard
|
|
236
|
+
- **Severity**: MAJOR
|
|
237
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/clipboard/obtainClipBoard.js:8`
|
|
238
|
+
- **Defect**: The permission check runs only `if (navigator.clipboard === undefined)` — i.e. only when there is no clipboard to permit — and the function then returns `navigator.clipboard` regardless, which in that branch is `undefined`. The condition is backwards: permissions should be verified when a clipboard *is* present, and the absence of `navigator.clipboard` should reject so callers can fall back.
|
|
239
|
+
- **Failure scenario**: a context where `navigator.clipboard` is undefined but `navigator.permissions.query({name:"clipboard-read"})` resolves `"granted"` (Chromium exposes the Permissions API independently of the Async Clipboard API). `obtainClipBoard()` **resolves** with `undefined`; `safeClipboardReadText` then takes its success branch and evaluates `navigator.clipboard.readText()` → `TypeError: Cannot read properties of undefined`. The file-picker fallback — the entire reason `safeClipboardReadText`/`safeClipboardWriteText` exist — is never reached, because it is wired to the rejection handler.
|
|
240
|
+
- **Fix**: Invert to `if (navigator.clipboard === undefined) { throw new Error("Clipboard API unavailable"); }` and perform the permission queries afterwards on the clipboard-present path.
|
|
241
|
+
- **Confidence**: Confirmed (by reading; requires a browser to execute)
|
|
242
|
+
|
|
243
|
+
### PROC-27 `safeClipboardReadText` fallback never settles when the user cancels the file picker
|
|
244
|
+
- **Severity**: MINOR
|
|
245
|
+
- **File**: `H:/git/moh/app/src/mir-engine/meep/src/core/clipboard/safeClipboardReadText.js:29`
|
|
246
|
+
- **Defect**: The fallback returns `new Promise((resolve, reject) => openFile(resolve))`. `resolve` is only reachable from `reader.onload`. Cancelling the dialog fires no `change` event at all; a `change` with no file hits `if (!file) { return; }`; and `reader.onerror` is not wired. `reject` is never called on any path. The hidden `<input>` is also left attached to `document.body`.
|
|
247
|
+
- **Failure scenario**: `await safeClipboardReadText()` in a browser without an Async Clipboard API; the user presses Cancel in the file dialog. The awaiting code hangs forever with no error surfaced.
|
|
248
|
+
- **Fix**: Reject on `reader.onerror` and on the `!file` path, and listen for the `cancel` event on the file input (or a window `focus` fallback) to reject; remove the input element in a `finally`.
|
|
249
|
+
- **Confidence**: Confirmed (by reading; requires a browser to execute)
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Areas reviewed and found clean
|
|
254
|
+
|
|
255
|
+
- `core/assert.js` — no correctness defects found.
|
|
256
|
+
- `core/time/current_time_in_seconds.js` — correct ms→s scaling, correct monotonic-source selection.
|
|
257
|
+
- `core/dom/isImageBitmap.js` — correct.
|
|
258
|
+
- `core/process/matcher/*` (the function-style matchers) — all correct.
|
|
259
|
+
- `core/graph/csr/*` — `csr_graph_find_shortest_path` and `csr_graph_build_distance_field` Dijkstra relaxation, lazy-deletion handling and the `out_exit` inheritance chain are correct (a predecessor is always finalised before the vertex that names it, including under zero-weight edges). `CSRGraph` buffer arithmetic, `truncate_adjacency`, `equals` and `hash` all check out.
|
|
260
|
+
- `core/graph/v2/Graph.js` / `NodeContainer.js` — add/remove edge bookkeeping, neighbour reference counting, self-loop handling and the snapshot-based `traverseEdges` are all consistent; `removeNode` correctly avoids mutation-during-iteration.
|
|
261
|
+
- `core/graph/graph_compute_disconnected_clusters.js`, `layout/computeDisconnectedSubGraphs.js` — no double-visits, no missed nodes, multi-edge safe.
|
|
262
|
+
- `core/graph/coloring/colorizeGraphGreedy.js`, `colorizeGraphMCS.js`, `colorizeGraphGreedyWeight.js`, `validateGraphColoring.js` — correct (the greedy comparator is explicit, not a bare `.sort()`).
|
|
263
|
+
- `core/graph/format/graphviz/graphviz_escape_string.js` — escape ordering is correct (backslashes before quotes).
|
|
264
|
+
- `core/graph/metis/native/coarsen/*` — `match_shem` renumbering contract and `create_coarse_graph`'s merge / self-loop-drop / position-reset logic are consistent with each other and with the worst-case sizing.
|
|
265
|
+
- `core/process/filter/*`, `core/process/executor/profile/*`, `core/process/buildPromiseChain.js`, `core/process/delay.js`, `core/process/SimpleLifecycle.js` — no correctness defects found.
|
|
266
|
+
- `WorkerBuilder`'s function-rename regex was suspected of renaming nested `function` declarations; verified it does not (`[^\]]*` spans newlines, so the nested definition is captured verbatim in group 3).
|