@woosh/meep-engine 3.14.4 → 3.14.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/editor/Editor.d.ts +162 -0
- package/editor/Editor.d.ts.map +1 -0
- package/editor/EditorCameraNavigation.d.ts +22 -0
- package/editor/EditorCameraNavigation.d.ts.map +1 -0
- package/editor/EditorKeyMap.d.ts +28 -0
- package/editor/EditorKeyMap.d.ts.map +1 -0
- package/editor/SelectionVisualizer.d.ts +37 -0
- package/editor/SelectionVisualizer.d.ts.map +1 -0
- package/editor/actions/concrete/ActionInvalidateSampler.d.ts +18 -0
- package/editor/actions/concrete/ActionInvalidateSampler.d.ts.map +1 -0
- package/editor/actions/concrete/ActionUpdateTexture.d.ts +12 -0
- package/editor/actions/concrete/ActionUpdateTexture.d.ts.map +1 -0
- package/editor/actions/concrete/ActionUpdateTexture.js +1 -1
- package/editor/actions/concrete/ArrayCopyAction.d.ts +20 -0
- package/editor/actions/concrete/ArrayCopyAction.d.ts.map +1 -0
- package/editor/actions/concrete/ComponentAddAction.d.ts +15 -0
- package/editor/actions/concrete/ComponentAddAction.d.ts.map +1 -0
- package/editor/actions/concrete/ComponentRemoveAction.d.ts +11 -0
- package/editor/actions/concrete/ComponentRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/EntityCreateAction.d.ts +18 -0
- package/editor/actions/concrete/EntityCreateAction.d.ts.map +1 -0
- package/editor/actions/concrete/EntityRemoveAction.d.ts +11 -0
- package/editor/actions/concrete/EntityRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts +47 -0
- package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts.map +1 -0
- package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts +38 -0
- package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts.map +1 -0
- package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts +23 -0
- package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts.map +1 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.d.ts +32 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionAddAction.d.ts +19 -0
- package/editor/actions/concrete/SelectionAddAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionClearAction.d.ts +9 -0
- package/editor/actions/concrete/SelectionClearAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionRemoveAction.d.ts +10 -0
- package/editor/actions/concrete/SelectionRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/TransformModifyAction.d.ts +17 -0
- package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -0
- package/editor/actions/concrete/WriteGridValueAction.d.ts +14 -0
- package/editor/actions/concrete/WriteGridValueAction.d.ts.map +1 -0
- package/editor/camera/camera_framing.d.ts +33 -0
- package/editor/camera/camera_framing.d.ts.map +1 -0
- package/editor/clipboard.d.ts +19 -0
- package/editor/clipboard.d.ts.map +1 -0
- package/editor/ecs/EditorEntity.d.ts +16 -0
- package/editor/ecs/EditorEntity.d.ts.map +1 -0
- package/editor/ecs/EditorEntitySystem.d.ts +8 -0
- package/editor/ecs/EditorEntitySystem.d.ts.map +1 -0
- package/editor/ecs/component/TypeEditor.d.ts +7 -1
- package/editor/ecs/component/TypeEditor.d.ts.map +1 -1
- package/editor/ecs/component/TypeEditor.js +5 -0
- package/editor/ecs/component/editors/ColorEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ColorEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/HTMLElementEditor.d.ts +7 -0
- package/editor/ecs/component/editors/HTMLElementEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ImagePathEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ImagePathEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/LargeStringEditor.d.ts +16 -0
- package/editor/ecs/component/editors/LargeStringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/NumericIntervalEditor.d.ts +7 -0
- package/editor/ecs/component/editors/NumericIntervalEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedEnumEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedEnumEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedStringEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedStringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/Sampler2DEditor.d.ts +7 -0
- package/editor/ecs/component/editors/Sampler2DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/collection/ListEditor.d.ts +8 -0
- package/editor/ecs/component/editors/collection/ListEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts +12 -0
- package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/EnumEditor.d.ts +8 -0
- package/editor/ecs/component/editors/common/EnumEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/makeV3_editor.d.ts +15 -0
- package/editor/ecs/component/editors/common/makeV3_editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/noEditor.d.ts +3 -0
- package/editor/ecs/component/editors/common/noEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/two_way_sync.d.ts +22 -0
- package/editor/ecs/component/editors/common/two_way_sync.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts +14 -0
- package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts +20 -0
- package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts +12 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts +14 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts +52 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts +47 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts +21 -0
- package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts +26 -0
- package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts +16 -0
- package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts +15 -0
- package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +42 -0
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/TransformEditor.d.ts +20 -0
- package/editor/ecs/component/editors/ecs/TransformEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts +8 -0
- package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts +19 -0
- package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts +27 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts +16 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts +19 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts +18 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector1Editor.d.ts +7 -0
- package/editor/ecs/component/editors/geom/Vector1Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector2Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector2Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector3Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector3Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector4Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector4Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts +8 -0
- package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/NumberEditor.d.ts +8 -0
- package/editor/ecs/component/editors/primitive/NumberEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/StringEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/StringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts +28 -0
- package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts +29 -0
- package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts +28 -0
- package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts +41 -0
- package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts +31 -0
- package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts.map +1 -0
- package/editor/ecs/component/prototypeObjectEditor.d.ts +2 -0
- package/editor/ecs/component/prototypeObjectEditor.d.ts.map +1 -0
- package/editor/ecs/component/registerBasicTypeEditors.d.ts +11 -0
- package/editor/ecs/component/registerBasicTypeEditors.d.ts.map +1 -0
- package/editor/ecs/component/registerEngineComponentEditors.d.ts +8 -0
- package/editor/ecs/component/registerEngineComponentEditors.d.ts.map +1 -0
- package/editor/enableEditor.d.ts +14 -0
- package/editor/enableEditor.d.ts.map +1 -0
- package/editor/entity_world_bounds.d.ts +17 -0
- package/editor/entity_world_bounds.d.ts.map +1 -0
- package/editor/library/MeshLibrary.d.ts +13 -0
- package/editor/library/MeshLibrary.d.ts.map +1 -0
- package/editor/particles/lut_ops.d.ts +34 -0
- package/editor/particles/lut_ops.d.ts.map +1 -0
- package/editor/particles/particleEditEvents.d.ts +11 -0
- package/editor/particles/particleEditEvents.d.ts.map +1 -0
- package/editor/particles/rebuildParticleEmitter.d.ts +11 -0
- package/editor/particles/rebuildParticleEmitter.d.ts.map +1 -0
- package/editor/persistence/EditorLayoutStore.d.ts +30 -0
- package/editor/persistence/EditorLayoutStore.d.ts.map +1 -0
- package/editor/persistence/SceneMetadata.d.ts +38 -0
- package/editor/persistence/SceneMetadata.d.ts.map +1 -0
- package/editor/persistence/SceneSlotManager.d.ts +40 -0
- package/editor/persistence/SceneSlotManager.d.ts.map +1 -0
- package/editor/persistence/buildNewSceneDataset.d.ts +10 -0
- package/editor/persistence/buildNewSceneDataset.d.ts.map +1 -0
- package/editor/persistence/files.d.ts +24 -0
- package/editor/persistence/files.d.ts.map +1 -0
- package/editor/persistence/scene_import.d.ts +45 -0
- package/editor/persistence/scene_import.d.ts.map +1 -0
- package/editor/persistence/scene_serialization.d.ts +36 -0
- package/editor/persistence/scene_serialization.d.ts.map +1 -0
- package/editor/persistence/string_buffer_codec.d.ts +20 -0
- package/editor/persistence/string_buffer_codec.d.ts.map +1 -0
- package/editor/process/DisableGameUIProcess.d.ts +8 -0
- package/editor/process/DisableGameUIProcess.d.ts.map +1 -0
- package/editor/process/EditorProcess.d.ts +19 -0
- package/editor/process/EditorProcess.d.ts.map +1 -0
- package/editor/process/GridDisplayProcess.d.ts +35 -0
- package/editor/process/GridDisplayProcess.d.ts.map +1 -0
- package/editor/process/ObstacleGridDisplayProcess.d.ts +13 -0
- package/editor/process/ObstacleGridDisplayProcess.d.ts.map +1 -0
- package/editor/process/ParticleEmitterRebuildProcess.d.ts +66 -0
- package/editor/process/ParticleEmitterRebuildProcess.d.ts.map +1 -0
- package/editor/process/ProcessEngine.d.ts +30 -0
- package/editor/process/ProcessEngine.d.ts.map +1 -0
- package/editor/process/SymbolicDisplayProcess.d.ts +23 -0
- package/editor/process/SymbolicDisplayProcess.d.ts.map +1 -0
- package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts +17 -0
- package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/CameraSymbolicDisplay.d.ts +25 -0
- package/editor/process/symbolic/CameraSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts +19 -0
- package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/LightSymbolicDisplay.d.ts +19 -0
- package/editor/process/symbolic/LightSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts +18 -0
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/PathSymbolicDisplay.d.ts +20 -0
- package/editor/process/symbolic/PathSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts +25 -0
- package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/SymbolicDisplay.d.ts +48 -0
- package/editor/process/symbolic/SymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts +13 -0
- package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts.map +1 -0
- package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts +18 -0
- package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts.map +1 -0
- package/editor/prototypeEditorShell.d.ts +13 -0
- package/editor/prototypeEditorShell.d.ts.map +1 -0
- package/editor/selection/editor_pick.d.ts +43 -0
- package/editor/selection/editor_pick.d.ts.map +1 -0
- package/editor/selection/screen_rect_frustum.d.ts +32 -0
- package/editor/selection/screen_rect_frustum.d.ts.map +1 -0
- package/editor/templates/entity_templates.d.ts +19 -0
- package/editor/templates/entity_templates.d.ts.map +1 -0
- package/editor/tools/GridPaintTool.d.ts +18 -0
- package/editor/tools/GridPaintTool.d.ts.map +1 -0
- package/editor/tools/SelectionTool.d.ts +38 -0
- package/editor/tools/SelectionTool.d.ts.map +1 -0
- package/editor/tools/SelectionTool.js +2 -2
- package/editor/tools/TransformToolV2.d.ts +70 -0
- package/editor/tools/TransformToolV2.d.ts.map +1 -0
- package/editor/tools/engine/Tool.d.ts +88 -0
- package/editor/tools/engine/Tool.d.ts.map +1 -0
- package/editor/tools/engine/ToolEngine.d.ts +22 -0
- package/editor/tools/engine/ToolEngine.d.ts.map +1 -0
- package/editor/tools/engine/ToolState.d.ts +7 -0
- package/editor/tools/engine/ToolState.d.ts.map +1 -0
- package/editor/tools/paint/TerrainHeightPaintTool.d.ts +18 -0
- package/editor/tools/paint/TerrainHeightPaintTool.d.ts.map +1 -0
- package/editor/tools/paint/TerrainPaintTool.d.ts +82 -0
- package/editor/tools/paint/TerrainPaintTool.d.ts.map +1 -0
- package/editor/tools/paint/TerrainTexturePaintTool.d.ts +19 -0
- package/editor/tools/paint/TerrainTexturePaintTool.d.ts.map +1 -0
- package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts +139 -0
- package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts.map +1 -0
- package/editor/tools/v2/GizmoNode.d.ts +21 -0
- package/editor/tools/v2/GizmoNode.d.ts.map +1 -0
- package/editor/tools/v2/TransformControls.d.ts +219 -0
- package/editor/tools/v2/TransformControls.d.ts.map +1 -0
- package/editor/tools/v2/TransformMode.d.ts +7 -0
- package/editor/tools/v2/TransformMode.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts +37 -0
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_draw.d.ts +14 -0
- package/editor/tools/v2/handle/gizmo_draw.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_handles.d.ts +160 -0
- package/editor/tools/v2/handle/gizmo_handles.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts +103 -0
- package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts.map +1 -0
- package/editor/view/GridPickCoordinateView.d.ts +22 -0
- package/editor/view/GridPickCoordinateView.d.ts.map +1 -0
- package/editor/view/ecs/ComponentControlView.d.ts +24 -0
- package/editor/view/ecs/ComponentControlView.d.ts.map +1 -0
- package/editor/view/ecs/EntityEditor.d.ts +25 -0
- package/editor/view/ecs/EntityEditor.d.ts.map +1 -0
- package/editor/view/ecs/EntityList.d.ts +22 -0
- package/editor/view/ecs/EntityList.d.ts.map +1 -0
- package/editor/view/ecs/HierarchicalEntityListView.d.ts +25 -0
- package/editor/view/ecs/HierarchicalEntityListView.d.ts.map +1 -0
- package/editor/view/ecs/components/DatGuiController.d.ts +2 -0
- package/editor/view/ecs/components/DatGuiController.d.ts.map +1 -0
- package/editor/view/ecs/components/color/GaugeView.d.ts +9 -5
- package/editor/view/ecs/components/color/GaugeView.d.ts.map +1 -1
- package/editor/view/ecs/components/color/GaugeView.js +4 -4
- package/editor/view/ecs/components/common/NumberController.d.ts +9 -5
- package/editor/view/ecs/components/common/NumberController.d.ts.map +1 -1
- package/editor/view/ecs/components/common/NumberController.js +4 -4
- package/editor/view/ecs/components/common/NumericIntervalController.d.ts +10 -0
- package/editor/view/ecs/components/common/NumericIntervalController.d.ts.map +1 -0
- package/editor/view/ecs/components/common/TextController.d.ts.map +1 -1
- package/editor/view/library/MeshLibraryView.d.ts +16 -0
- package/editor/view/library/MeshLibraryView.d.ts.map +1 -0
- package/editor/view/library/mesh_library_drag.d.ts +21 -0
- package/editor/view/library/mesh_library_drag.d.ts.map +1 -0
- package/editor/view/library/model_thumbnail_source.d.ts +12 -0
- package/editor/view/library/model_thumbnail_source.d.ts.map +1 -0
- package/editor/view/makeEntityDecorators.d.ts +6 -0
- package/editor/view/makeEntityDecorators.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphCamera.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphSelection.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeView.d.ts.map +1 -1
- package/editor/view/node-graph/PortView.d.ts.map +1 -1
- package/editor/view/node-graph/actions/ConnectionCreateAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodeParameterSetAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodesMoveAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/SelectionSetAction.d.ts.map +1 -1
- package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
- package/editor/view/particles/ColorLutGradientView.d.ts +19 -0
- package/editor/view/particles/ColorLutGradientView.d.ts.map +1 -0
- package/editor/view/particles/ScalarLutCurveView.d.ts +19 -0
- package/editor/view/particles/ScalarLutCurveView.d.ts.map +1 -0
- package/editor/view/prepareMeshLibrary.d.ts +7 -0
- package/editor/view/prepareMeshLibrary.d.ts.map +1 -0
- package/editor/view/process/ProcessView.d.ts +14 -0
- package/editor/view/process/ProcessView.d.ts.map +1 -0
- package/editor/view/shell/EditorShellView.d.ts +18 -0
- package/editor/view/shell/EditorShellView.d.ts.map +1 -0
- package/editor/view/shell/SceneTreePanelView.d.ts +17 -0
- package/editor/view/shell/SceneTreePanelView.d.ts.map +1 -0
- package/editor/view/shell/ViewportPanelView.d.ts +18 -0
- package/editor/view/shell/ViewportPanelView.d.ts.map +1 -0
- package/editor/view/tools/ToolSettingsView.d.ts +22 -0
- package/editor/view/tools/ToolSettingsView.d.ts.map +1 -0
- package/editor/view/tools/ToolView.d.ts +13 -0
- package/editor/view/tools/ToolView.d.ts.map +1 -0
- package/editor/view/v2/SplitView.d.ts +2 -0
- package/editor/view/v2/SplitView.d.ts.map +1 -0
- package/package.json +9 -11
- package/samples/engine/README.md +113 -0
- package/samples/engine/first-scene/index.html +32 -0
- package/samples/engine/first-scene/main.js +152 -0
- package/src/core/assert.d.ts +2 -2
- package/src/core/binary/BitSet.d.ts +2 -2
- package/src/core/binary/BitSet.d.ts.map +1 -1
- package/src/core/binary/BitSet.js +1 -1
- package/src/core/bvh2/bvh3/BVH.d.ts +4 -0
- package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/BVH.js +4 -0
- package/src/core/bvh2/bvh3/BvhClient.d.ts +4 -0
- package/src/core/bvh2/bvh3/BvhClient.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/BvhClient.js +4 -0
- package/src/core/collection/array/array_sort_quick.d.ts +1 -1
- package/src/core/collection/list/List.d.ts +7 -3
- package/src/core/collection/list/List.d.ts.map +1 -1
- package/src/core/collection/list/List.js +6 -2
- package/src/core/collection/table/RowFirstTableSpec.d.ts.map +1 -1
- package/src/core/collection/table/RowFirstTableSpec.js +0 -4
- package/src/core/color/Color.d.ts +1 -0
- package/src/core/color/Color.d.ts.map +1 -1
- package/src/core/color/Color.js +4 -0
- package/src/core/events/signal/SignalBinding.d.ts +4 -0
- package/src/core/events/signal/SignalBinding.d.ts.map +1 -1
- package/src/core/events/signal/SignalBinding.js +4 -0
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts +5 -1
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +4 -0
- package/src/core/geom/3d/SurfacePoint3.d.ts +2 -2
- package/src/core/geom/3d/SurfacePoint3.d.ts.map +1 -1
- package/src/core/geom/3d/SurfacePoint3.js +1 -1
- package/src/core/geom/3d/aabb/AABB3.d.ts +63 -7
- package/src/core/geom/3d/aabb/AABB3.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/AABB3.js +17 -3
- package/src/core/geom/3d/mat4/m4_rigidity_defect.d.ts +30 -0
- package/src/core/geom/3d/mat4/m4_rigidity_defect.d.ts.map +1 -0
- package/src/core/geom/3d/mat4/m4_rigidity_defect.js +71 -0
- package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +2 -2
- package/src/core/geom/3d/ray/Ray3.d.ts +4 -4
- package/src/core/geom/3d/shape/AbstractShape3D.d.ts +10 -3
- package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/AbstractShape3D.js +9 -2
- package/src/core/geom/3d/shape/TransformedShape3D.d.ts +2 -2
- package/src/core/geom/3d/sphere/harmonics/sh3_rotate.d.ts +1 -1
- package/src/core/geom/Vector1.d.ts +4 -0
- package/src/core/geom/Vector1.d.ts.map +1 -1
- package/src/core/geom/Vector1.js +4 -0
- package/src/core/geom/Vector2.d.ts +4 -0
- package/src/core/geom/Vector2.d.ts.map +1 -1
- package/src/core/geom/Vector2.js +4 -0
- package/src/core/geom/Vector3.d.ts +4 -0
- package/src/core/geom/Vector3.d.ts.map +1 -1
- package/src/core/geom/Vector3.js +4 -0
- package/src/core/geom/Vector4.d.ts +4 -0
- package/src/core/geom/Vector4.d.ts.map +1 -1
- package/src/core/geom/Vector4.js +4 -0
- package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts +6 -2
- package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts.map +1 -1
- package/src/core/geom/packing/max-rect/MaxRectanglesPacker.js +4 -0
- package/src/core/geom/packing/miniball/Subspan.d.ts +4 -4
- package/src/core/geom/packing/miniball/Subspan.d.ts.map +1 -1
- package/src/core/geom/packing/miniball/Subspan.js +2 -2
- package/src/core/math/interval/NumericInterval.d.ts +4 -0
- package/src/core/math/interval/NumericInterval.d.ts.map +1 -1
- package/src/core/math/interval/NumericInterval.js +4 -0
- package/src/core/math/random/roundFair.d.ts +2 -2
- package/src/core/math/random/roundFair.d.ts.map +1 -1
- package/src/core/math/random/roundFair.js +1 -1
- package/src/core/model/BoundedValue.d.ts +4 -0
- package/src/core/model/BoundedValue.d.ts.map +1 -1
- package/src/core/model/BoundedValue.js +4 -0
- package/src/core/model/ObservedBoolean.d.ts +4 -0
- package/src/core/model/ObservedBoolean.d.ts.map +1 -1
- package/src/core/model/ObservedBoolean.js +4 -0
- package/src/core/model/ObservedInteger.d.ts +4 -0
- package/src/core/model/ObservedInteger.d.ts.map +1 -1
- package/src/core/model/ObservedInteger.js +4 -0
- package/src/core/model/ObservedString.d.ts +4 -0
- package/src/core/model/ObservedString.d.ts.map +1 -1
- package/src/core/model/ObservedString.js +4 -0
- package/src/core/model/stat/Stat.d.ts +7 -3
- package/src/core/model/stat/Stat.d.ts.map +1 -1
- package/src/core/model/stat/Stat.js +4 -0
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +65 -0
- package/src/engine/EngineHarness.d.ts +8 -1
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +10 -14
- package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts +2 -2
- package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
- package/src/engine/animation/clip/ecd_bind_animation_curve.js +4 -4
- package/src/engine/asset/loaders/async_traverse_three_object.d.ts +2 -2
- package/src/engine/asset/loaders/async_traverse_three_object.d.ts.map +1 -1
- package/src/engine/asset/loaders/async_traverse_three_object.js +1 -1
- package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts +7 -3
- package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts.map +1 -1
- package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.js +33 -3
- package/src/engine/control/first-person/DESIGN.md +20 -2
- package/src/engine/control/first-person/DESIGN_COLLISION.md +17 -0
- package/src/engine/control/first-person/collision/KinematicMover.d.ts +58 -11
- package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
- package/src/engine/control/first-person/collision/KinematicMover.js +97 -20
- package/src/engine/ecs/Entity.js +1 -1
- package/src/engine/ecs/EntityComponentDataset.d.ts +2 -2
- package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
- package/src/engine/ecs/EntityComponentDataset.js +1 -1
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +27 -3
- package/src/engine/ecs/animation/Animation.d.ts +17 -3
- package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
- package/src/engine/ecs/animation/Animation.js +26 -6
- package/src/engine/ecs/terrain/TerrainPreview.d.ts +4 -0
- package/src/engine/ecs/terrain/TerrainPreview.d.ts.map +1 -1
- package/src/engine/ecs/terrain/TerrainPreview.js +4 -0
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +4 -4
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +2 -2
- package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts +3 -2
- package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.js +25 -2
- package/src/engine/ecs/transform/Transform64.d.ts +4 -4
- package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
- package/src/engine/ecs/transform/Transform64.js +2 -2
- package/src/engine/graphics/ecs/decal/v2/Decal.d.ts +26 -0
- package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
- package/src/engine/graphics/ecs/decal/v2/Decal.js +26 -0
- package/src/engine/graphics/ecs/light/Light.d.ts +38 -1
- package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
- package/src/engine/graphics/ecs/light/Light.js +51 -1
- package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts +3 -3
- package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh/copyToVector3.js +2 -2
- package/src/engine/graphics/ecs/mesh/setMesh.d.ts +2 -2
- package/src/engine/graphics/ecs/mesh/setMesh.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh/setMesh.js +1 -1
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +2 -2
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +1 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +3 -3
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +2 -2
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +2 -2
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +1 -1
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +2 -2
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +1 -1
- package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts +2 -2
- package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts.map +1 -1
- package/src/engine/graphics/geometry/compute_geometry_polycount.js +1 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +3 -3
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +2 -2
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +4 -4
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +3 -3
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +3 -3
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +2 -2
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +4 -4
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +3 -3
- package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts +2 -2
- package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts.map +1 -1
- package/src/engine/graphics/geometry/scaleGeometryToBox.js +1 -1
- package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts +2 -2
- package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts.map +1 -1
- package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.js +1 -1
- package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts +2 -2
- package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts.map +1 -1
- package/src/engine/graphics/impostors/octahedral/ImpostorDescription.js +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +4 -12
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +2 -2
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts +5 -20
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts +24 -24
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +16 -16
- package/src/engine/graphics/render/layers/RenderLayer.d.ts +4 -4
- package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +1 -1
- package/src/engine/graphics/render/layers/RenderLayer.js +2 -2
- package/src/engine/graphics/render/make_bvh_visibility_builder.js +1 -1
- package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +1 -1
- package/src/engine/graphics/render/visibility/VisibilityComputer.js +1 -1
- package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts +2 -2
- package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts.map +1 -1
- package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.js +1 -1
- package/src/engine/graphics3/DecalSystem.d.ts +8 -0
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +8 -0
- package/src/engine/graphics3/GraphicsEngine.d.ts +19 -8
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +22 -11
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +11 -1
- package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts +4 -0
- package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts.map +1 -1
- package/src/engine/input/devices/gamepad/GamepadStickCalibration.js +4 -0
- package/src/engine/navigation/mesh/NavigationMesh.d.ts +90 -9
- package/src/engine/navigation/mesh/NavigationMesh.d.ts.map +1 -1
- package/src/engine/navigation/mesh/NavigationMesh.js +80 -8
- package/src/engine/network/NetworkSession.d.ts +60 -0
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +141 -1
- package/src/engine/network/orchestrator/NetworkPeer.d.ts +56 -8
- package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/NetworkPeer.js +263 -67
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +6 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +6 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +13 -7
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +103 -138
- package/src/engine/network/replication/Replicator.d.ts +47 -6
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +362 -107
- package/src/engine/network/sim/ActionLog.d.ts +2 -0
- package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
- package/src/engine/network/sim/ActionLog.js +2 -0
- package/src/engine/network/sim/ActionRecordCursor.d.ts +82 -0
- package/src/engine/network/sim/ActionRecordCursor.d.ts.map +1 -0
- package/src/engine/network/sim/ActionRecordCursor.js +120 -0
- package/src/engine/network/sim/RewindEngine.d.ts.map +1 -1
- package/src/engine/network/sim/RewindEngine.js +13 -29
- package/src/engine/network/sim/SimActionExecutor.d.ts +2 -3
- package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
- package/src/engine/network/sim/SimActionExecutor.js +10 -11
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +27 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +27 -0
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/sound/SoundEngine.d.ts +24 -0
- package/src/engine/sound/SoundEngine.d.ts.map +1 -1
- package/src/engine/sound/SoundEngine.js +29 -11
- package/src/engine/sound/simulation/configureAcousticSimulation.d.ts +12 -4
- package/src/engine/sound/simulation/configureAcousticSimulation.d.ts.map +1 -1
- package/src/engine/sound/simulation/configureAcousticSimulation.js +10 -4
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts +3 -1
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +27 -1
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +34 -0
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +61 -2
- package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/reverbImpulseResponse.js +9 -0
- package/src/shade/playground/particle_system/README.md +14 -3
- package/src/shade/playground/particle_system/index.html +1 -0
- package/src/shade/playground/particle_system/main.js +15 -2
- package/src/shade/playground/particle_system/particle_scene.d.ts +11 -2
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +164 -46
- package/src/shade/playground/skinned_mesh_soup/README.md +39 -18
- package/src/shade/playground/skinned_mesh_soup/index.html +9 -6
- package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/main.js +16 -13
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +8 -2
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +23 -4
- package/src/shade/renderer/GraphicsContext.d.ts +1 -0
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +4 -0
- package/src/shade/renderer/Renderer.d.ts +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +1958 -1796
- package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +357 -0
- package/src/shade/renderer/animation/skin_bind_transform.d.ts +25 -0
- package/src/shade/renderer/animation/skin_bind_transform.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_bind_transform.js +33 -0
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +67 -0
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +199 -0
- package/src/shade/renderer/animation/skin_frame_defect.d.ts +34 -0
- package/src/shade/renderer/animation/skin_frame_defect.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_frame_defect.js +132 -0
- package/src/shade/renderer/animation/skin_joint_matrix.d.ts +24 -0
- package/src/shade/renderer/animation/skin_joint_matrix.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_joint_matrix.js +46 -0
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts +70 -0
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +216 -0
- package/src/shade/renderer/animation/skin_test_fixtures.d.ts +86 -0
- package/src/shade/renderer/animation/skin_test_fixtures.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_test_fixtures.js +250 -0
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +18 -4
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +18 -4
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +13 -0
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +13 -0
- package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts +18 -0
- package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +18 -0
- package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts +4 -0
- package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.js +4 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +12 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +13 -0
- package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/DESIGN.md +71 -20
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +29 -5
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +61 -6
- package/src/shade/renderer/particles/ParticleConstants.d.ts +31 -0
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +33 -0
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +61 -0
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -0
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +179 -0
- package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts +63 -0
- package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts.map +1 -0
- package/src/shade/renderer/particles/coherence/particle_program_buckets.js +116 -0
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +59 -0
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -0
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +344 -0
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +27 -5
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +27 -5
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +13 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +15 -1
- package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/chunk_particle_emitter.js +3 -0
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +43 -0
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +44 -0
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +33 -59
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +185 -118
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +15 -10
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/compile_particle_graph.js +205 -170
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +44 -0
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_graph_authoring.js +108 -0
- package/src/shade/renderer/particles/graph_particles.d.ts +39 -11
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +60 -20
- package/src/shade/renderer/particles/particle_prototype.d.ts.map +1 -1
- package/src/shade/renderer/particles/particle_prototype.js +181 -180
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +8 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +8 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +22 -2
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.js +54 -3
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +4 -4
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/create_particle_effect.js +19 -19
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +32 -14
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +2 -23
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +40 -11
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +6 -17
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.js +60 -9
- package/src/shade/renderer/particles/vm/chunk_particle_vm.js +1 -1
- package/src/shade/renderer/scene/SkinnedMesh.d.ts +11 -0
- package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +1 -1
- package/src/shade/renderer/scene/SkinnedMesh.js +11 -0
- package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.d.ts +33 -3
- package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.js +58 -37
- package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +1 -1
- package/src/view/DOM.d.ts +69 -0
- package/src/view/DOM.d.ts.map +1 -0
- package/src/view/DOM.js +2 -1
- package/src/view/common/LocalizedLabelView.d.ts +50 -0
- package/src/view/common/LocalizedLabelView.d.ts.map +1 -0
- package/src/view/controller/controls/GuiControl.d.ts +19 -0
- package/src/view/controller/controls/GuiControl.d.ts.map +1 -0
- package/src/view/elements/FrameRateView.d.ts +45 -0
- package/src/view/elements/FrameRateView.d.ts.map +1 -0
- package/src/view/elements/FrameRateView.js +131 -0
- package/src/view/elements/SliderView.d.ts +37 -0
- package/src/view/elements/SliderView.d.ts.map +1 -0
- package/src/view/elements/SliderView.js +71 -0
- package/src/view/elements/navigation/ViewStack.d.ts +1 -1
- package/src/view/elements/navigation/ViewStack.js +1 -1
- package/src/view/elements/notify/NotificationView.d.ts +22 -0
- package/src/view/elements/notify/NotificationView.d.ts.map +1 -0
- package/src/view/tooltip/TooltipView.d.ts +5 -1
- package/src/view/tooltip/TooltipView.d.ts.map +1 -1
- package/src/view/tooltip/TooltipView.js +4 -0
- package/src/shade/renderer/particles/graph/ParticleGraph.d.ts +0 -54
- package/src/shade/renderer/particles/graph/ParticleGraph.d.ts.map +0 -1
- package/src/shade/renderer/particles/graph/ParticleGraph.js +0 -99
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { BinaryBuffer } from "../../../core/binary/BinaryBuffer.js";
|
|
2
3
|
import Signal from "../../../core/events/signal/Signal.js";
|
|
3
4
|
import { MalformedPacketError } from "../core/MalformedPacketError.js";
|
|
5
|
+
import { ActionRecordCursor } from "../sim/ActionRecordCursor.js";
|
|
4
6
|
|
|
5
7
|
// Bytes of fixed per-action framing that always precede the variable payload:
|
|
6
8
|
// uint8 action_type_id + uint32 action_payload_len.
|
|
7
9
|
const ACTION_HEADER_BYTES = 5;
|
|
8
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Most slices {@link Replicator#unpack_from_peer} holds per peer while waiting
|
|
13
|
+
* for an earlier slice to land. A sender bursts at most `max_packets_per_tick`
|
|
14
|
+
* slices a tick and re-sends the missing one every tick, so a legitimate
|
|
15
|
+
* backlog is a burst or two; this is a backstop against a sender that never
|
|
16
|
+
* fills the gap. Beyond it the farthest slice is dropped — those frames were
|
|
17
|
+
* acked at the channel level, so the sender will credit them and not re-send
|
|
18
|
+
* them, which is a loss, and the reason the cap is generous.
|
|
19
|
+
*/
|
|
20
|
+
const MAX_HELD_SLICES = 256;
|
|
21
|
+
|
|
9
22
|
/**
|
|
10
23
|
* Forwards action records between peers.
|
|
11
24
|
*
|
|
@@ -33,33 +46,126 @@ const ACTION_HEADER_BYTES = 5;
|
|
|
33
46
|
* uint32: action_payload_len
|
|
34
47
|
* bytes: action_payload
|
|
35
48
|
* ```
|
|
49
|
+
* {@link NetworkPeer} prefixes each packet of this with a slice header — the
|
|
50
|
+
* frame range the packet covers and whether it is the first of the sender's
|
|
51
|
+
* tick — which it parses itself and hands to {@link unpack_from_peer} as
|
|
52
|
+
* `slice`, so the receiver can apply the sender's packets in frame order.
|
|
36
53
|
*
|
|
37
54
|
* @author Alex Goldring
|
|
38
55
|
* @copyright Company Named Limited (c) 2026
|
|
39
56
|
*/
|
|
40
57
|
export class Replicator {
|
|
41
58
|
/**
|
|
42
|
-
* Pre-allocated scratch for
|
|
43
|
-
*
|
|
44
|
-
* Grown on demand.
|
|
59
|
+
* Pre-allocated scratch for the in-scope actions of the current pack
|
|
60
|
+
* pass: `(action_type_id, payload_start, payload_len)` per action,
|
|
61
|
+
* interleaved. Grown on demand.
|
|
45
62
|
* @type {Int32Array}
|
|
46
63
|
* @private
|
|
47
64
|
*/
|
|
48
|
-
#
|
|
65
|
+
#in_scope_actions = new Int32Array(64 * 3);
|
|
49
66
|
/**
|
|
50
|
-
* Per-peer
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* frame
|
|
58
|
-
*
|
|
59
|
-
*
|
|
67
|
+
* Per-peer state of {@link unpack_from_peer}'s execute-on-arrival path:
|
|
68
|
+
* `next_frame`, the frame after the newest applied, and `held`, later
|
|
69
|
+
* slices of a sender's tick waiting for an earlier slice still in flight,
|
|
70
|
+
* sorted by `frame_start`.
|
|
71
|
+
*
|
|
72
|
+
* `next_frame` is what keeps each frame applied exactly once. The action
|
|
73
|
+
* stream re-sends every unconfirmed frame each tick (back-fill for loss
|
|
74
|
+
* tolerance), so a frame arrives several times before its ack round-trips,
|
|
75
|
+
* and re-running it would recycle its action-log slot and re-capture prior
|
|
76
|
+
* state from the already-mutated world — corrupting the rewind baseline.
|
|
77
|
+
* Frames below `next_frame` are skipped.
|
|
78
|
+
*
|
|
79
|
+
* One watermark is sound only because frames are applied in order. The
|
|
80
|
+
* sender may split a tick's owed range across several packets
|
|
81
|
+
* ({@link NetworkPeer#flush_outbound}), and when the first is lost the
|
|
82
|
+
* later ones land first. Applied on arrival they would put their frames
|
|
83
|
+
* ahead of the re-sent earlier ones — an absolute-state action from the
|
|
84
|
+
* older frame would then overwrite the newer, a despawn could precede its
|
|
85
|
+
* spawn — and the watermark would take them as proof of everything before,
|
|
86
|
+
* so the re-send would be skipped for good while the sender, seeing it
|
|
87
|
+
* acked, credited those frames as delivered. So a later slice is held
|
|
88
|
+
* until the slices before it have landed. Only the execute-on-arrival path
|
|
89
|
+
* keeps this; the deferred path ({@link on_pending_action}) orders and
|
|
90
|
+
* dedups downstream.
|
|
91
|
+
* @type {Map<number, {next_frame: number, held: Array<{frame_start: number, frame_end: number, buffer: BinaryBuffer, length: number}>}>}
|
|
92
|
+
* @private
|
|
93
|
+
*/
|
|
94
|
+
#inbound = new Map();
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Frames that arrived and were never applied, per peer, and the ones that were.
|
|
98
|
+
*
|
|
99
|
+
* **A skipped frame is not the same thing as a lost one, and until now neither was counted.**
|
|
100
|
+
* The action stream re-sends every unconfirmed frame each tick, so a frame arrives several
|
|
101
|
+
* times before its ack round-trips and every arrival after the first is skipped — correctly,
|
|
102
|
+
* and constantly. That is the normal case and it must not be counted as loss.
|
|
103
|
+
*
|
|
104
|
+
* What must be counted is the other one: a slice that arrives *after* a newer slice has raised
|
|
105
|
+
* the watermark past it, whose frames were therefore never applied and never will be, because
|
|
106
|
+
* its channel-level ack tells the sender they were delivered and nothing re-sends them. That is
|
|
107
|
+
* the failure `fb116d3a4` fixed for the default configuration and which
|
|
108
|
+
* `max_packets_per_tick: 1` still reproduces exactly — and the thing that made it expensive to
|
|
109
|
+
* find is that it is *silent*: a missing explosion looks like a rendering bug and nothing
|
|
110
|
+
* anywhere reports a shortfall.
|
|
111
|
+
*
|
|
112
|
+
* Telling the two apart needs one bit per frame in the window. `applied` is a ring of frame
|
|
113
|
+
* numbers indexed by `frame % capacity`, holding the frame that last wrote each slot, so a
|
|
114
|
+
* skipped frame can ask "was I ever applied?" in constant time and constant memory. A frame
|
|
115
|
+
* older than the window answers "no", which is right: it is beyond recovery either way.
|
|
116
|
+
*
|
|
117
|
+
* @type {Map<number, {applied: Int32Array, skipped_unapplied: number, skipped_duplicate: number}>}
|
|
60
118
|
* @private
|
|
61
119
|
*/
|
|
62
|
-
#
|
|
120
|
+
#delivery = new Map();
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Per-peer delivery accounting. Read it, log it, put it on a HUD, fail a test on it.
|
|
124
|
+
*
|
|
125
|
+
* `skipped_unapplied` is the one that matters: frames that reached this receiver and were
|
|
126
|
+
* dropped below the watermark without ever being applied. It should be zero. It is not zero
|
|
127
|
+
* when slices reorder on a sender pinned to the ring floor, which is what
|
|
128
|
+
* `max_packets_per_tick: 1` produces under jitter.
|
|
129
|
+
*
|
|
130
|
+
* `skipped_duplicate` is the healthy counterpart — the action stream's own redundancy arriving
|
|
131
|
+
* and being correctly ignored — and is expected to be large.
|
|
132
|
+
*
|
|
133
|
+
* @param {number} peer_id
|
|
134
|
+
* @returns {{skipped_unapplied: number, skipped_duplicate: number}}
|
|
135
|
+
*/
|
|
136
|
+
delivery_stats(peer_id) {
|
|
137
|
+
const d = this.#delivery.get(peer_id);
|
|
138
|
+
|
|
139
|
+
if (d === undefined) {
|
|
140
|
+
return { skipped_unapplied: 0, skipped_duplicate: 0 };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return { skipped_unapplied: d.skipped_unapplied, skipped_duplicate: d.skipped_duplicate };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* @param {number} peer_id
|
|
148
|
+
* @returns {{applied: Int32Array, skipped_unapplied: number, skipped_duplicate: number}}
|
|
149
|
+
* @private
|
|
150
|
+
*/
|
|
151
|
+
#delivery_state(peer_id) {
|
|
152
|
+
let d = this.#delivery.get(peer_id);
|
|
153
|
+
|
|
154
|
+
if (d === undefined) {
|
|
155
|
+
const capacity = this.action_log.frame_capacity;
|
|
156
|
+
|
|
157
|
+
d = {
|
|
158
|
+
// -1 is "no frame has occupied this slot"; frame numbers are non-negative
|
|
159
|
+
applied: new Int32Array(capacity).fill(-1),
|
|
160
|
+
skipped_unapplied: 0,
|
|
161
|
+
skipped_duplicate: 0
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
this.#delivery.set(peer_id, d);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return d;
|
|
168
|
+
}
|
|
63
169
|
|
|
64
170
|
/**
|
|
65
171
|
* Fired after each per-frame action group is fully applied via
|
|
@@ -69,8 +175,9 @@ export class Replicator {
|
|
|
69
175
|
* or anything else that needs to know "frame N from peer P has just
|
|
70
176
|
* been applied to the local world."
|
|
71
177
|
*
|
|
72
|
-
* Fires in frame
|
|
73
|
-
*
|
|
178
|
+
* Fires in frame order — within a packet, which encodes its frames
|
|
179
|
+
* ascending, and across packets, because a later slice of a sender's tick
|
|
180
|
+
* is held until the slices before it have landed.
|
|
74
181
|
*
|
|
75
182
|
* @type {Signal}
|
|
76
183
|
*/
|
|
@@ -96,6 +203,13 @@ export class Replicator {
|
|
|
96
203
|
*/
|
|
97
204
|
on_pending_action = null;
|
|
98
205
|
|
|
206
|
+
/**
|
|
207
|
+
* Walks a frame's records for {@link pack_for_peer}.
|
|
208
|
+
* @type {ActionRecordCursor}
|
|
209
|
+
* @private
|
|
210
|
+
*/
|
|
211
|
+
#cursor = new ActionRecordCursor();
|
|
212
|
+
|
|
99
213
|
/**
|
|
100
214
|
* @param {{
|
|
101
215
|
* action_log: ActionLog,
|
|
@@ -175,24 +289,20 @@ export class Replicator {
|
|
|
175
289
|
continue;
|
|
176
290
|
}
|
|
177
291
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
292
|
+
// First pass: walk the records, remembering where the action of
|
|
293
|
+
// each in-scope one sits.
|
|
294
|
+
const cursor = this.#cursor;
|
|
295
|
+
cursor.open(this.action_log, frame);
|
|
182
296
|
let in_scope_count = 0;
|
|
183
|
-
while (
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
if (in_scope) {
|
|
189
|
-
if ((in_scope_count + 1) * 2 > this.#record_bounds.length) {
|
|
190
|
-
this.#grow_record_bounds();
|
|
191
|
-
}
|
|
192
|
-
this.#record_bounds[in_scope_count * 2] = record_start;
|
|
193
|
-
this.#record_bounds[in_scope_count * 2 + 1] = record_end;
|
|
194
|
-
in_scope_count++;
|
|
297
|
+
while (cursor.next()) {
|
|
298
|
+
if (!this.#record_in_scope(cursor, peer_id)) continue;
|
|
299
|
+
if ((in_scope_count + 1) * 3 > this.#in_scope_actions.length) {
|
|
300
|
+
this.#grow_in_scope_actions();
|
|
195
301
|
}
|
|
302
|
+
this.#in_scope_actions[in_scope_count * 3] = cursor.action_type_id;
|
|
303
|
+
this.#in_scope_actions[in_scope_count * 3 + 1] = cursor.payload_start;
|
|
304
|
+
this.#in_scope_actions[in_scope_count * 3 + 2] = cursor.payload_len;
|
|
305
|
+
in_scope_count++;
|
|
196
306
|
}
|
|
197
307
|
|
|
198
308
|
if (in_scope_count === 0) {
|
|
@@ -207,10 +317,17 @@ export class Replicator {
|
|
|
207
317
|
out_buffer.writeUintVar(frame);
|
|
208
318
|
out_buffer.writeUintVar(in_scope_count);
|
|
209
319
|
|
|
320
|
+
// Wire format per action is (type_id, len, payload). The record's
|
|
321
|
+
// local-only sender_id byte is NOT copied: the receiver derives the
|
|
322
|
+
// sender from the packet's peer_id, and carrying it on the wire
|
|
323
|
+
// would let a hostile peer impersonate other peers' actions.
|
|
324
|
+
const raw_bytes = cursor.buffer.raw_bytes;
|
|
210
325
|
for (let i = 0; i < in_scope_count; i++) {
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
this.#
|
|
326
|
+
const payload_start = this.#in_scope_actions[i * 3 + 1];
|
|
327
|
+
const payload_len = this.#in_scope_actions[i * 3 + 2];
|
|
328
|
+
out_buffer.writeUint8(this.#in_scope_actions[i * 3]);
|
|
329
|
+
out_buffer.writeUint32(payload_len);
|
|
330
|
+
out_buffer.writeBytes(raw_bytes, payload_start, payload_len);
|
|
214
331
|
}
|
|
215
332
|
|
|
216
333
|
if (wrote_any_group && out_buffer.position > budget_end) {
|
|
@@ -234,11 +351,23 @@ export class Replicator {
|
|
|
234
351
|
* sender's frame number, ensuring the rewind/replay machinery sees consistent
|
|
235
352
|
* frame indexing across peers.
|
|
236
353
|
*
|
|
354
|
+
* `slice` is the sender's description of the packet, from the
|
|
355
|
+
* {@link NetworkPeer} slice header: the frame range it covers and whether
|
|
356
|
+
* it is the first packet of the sender's tick. Frames are applied in frame
|
|
357
|
+
* order. A slice that starts past the frames applied so far and is not a
|
|
358
|
+
* head is a later slice of a burst whose earlier slice has not landed; it
|
|
359
|
+
* is held and applied once the gap before it fills. A head is applied as
|
|
360
|
+
* soon as it arrives, because nothing the sender can still send lies
|
|
361
|
+
* before it — that is also how the receiver moves past frames lost for
|
|
362
|
+
* good. Without `slice` (callers that pack and unpack directly) the packet
|
|
363
|
+
* is taken as a head covering the frames it carries.
|
|
364
|
+
*
|
|
237
365
|
* @param {number} peer_id
|
|
238
366
|
* @param {BinaryBuffer} in_buffer
|
|
239
367
|
* @param {number} in_buffer_end byte position to stop reading at
|
|
368
|
+
* @param {{frame_start: number, frame_end: number, head: boolean}|null} [slice]
|
|
240
369
|
*/
|
|
241
|
-
unpack_from_peer(peer_id, in_buffer, in_buffer_end) {
|
|
370
|
+
unpack_from_peer(peer_id, in_buffer, in_buffer_end, slice = null) {
|
|
242
371
|
assert.isNonNegativeInteger(peer_id, 'peer_id');
|
|
243
372
|
assert.isNonNegativeInteger(in_buffer_end, 'in_buffer_end');
|
|
244
373
|
|
|
@@ -275,19 +404,91 @@ export class Replicator {
|
|
|
275
404
|
return;
|
|
276
405
|
}
|
|
277
406
|
|
|
278
|
-
|
|
407
|
+
let state = this.#inbound.get(peer_id);
|
|
408
|
+
if (state === undefined) {
|
|
409
|
+
state = { next_frame: 0, held: [] };
|
|
410
|
+
this.#inbound.set(peer_id, state);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
if (slice !== null && !slice.head && slice.frame_start > state.next_frame) {
|
|
414
|
+
this.#hold_slice(peer_id, state, slice, in_buffer, in_buffer_end);
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
if (slice !== null && slice.head) {
|
|
419
|
+
// Nothing before a head will be sent again. Whatever was held from
|
|
420
|
+
// before it is as complete as it will ever be, so apply it first,
|
|
421
|
+
// in order, rather than letting the head jump past it.
|
|
422
|
+
this.#apply_held_before(peer_id, state, slice.frame_start);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
const last_frame = this.#apply_groups(
|
|
426
|
+
peer_id, in_buffer, in_buffer_end, state.next_frame,
|
|
427
|
+
slice !== null ? slice.frame_start : 0,
|
|
428
|
+
slice !== null ? slice.frame_end : Infinity,
|
|
429
|
+
);
|
|
430
|
+
const covered_through = slice !== null ? slice.frame_end : last_frame;
|
|
431
|
+
if (covered_through + 1 > state.next_frame) {
|
|
432
|
+
state.next_frame = covered_through + 1;
|
|
433
|
+
}
|
|
434
|
+
this.#apply_held_contiguous(peer_id, state);
|
|
435
|
+
}
|
|
279
436
|
|
|
280
|
-
|
|
437
|
+
/**
|
|
438
|
+
* Apply the frame groups in `[in_buffer.position, in_buffer_end)`, skipping
|
|
439
|
+
* any frame below `min_frame` — already applied, or, when `min_frame` is
|
|
440
|
+
* `Infinity`, every frame, which is how a packet is validated before it is
|
|
441
|
+
* held. A skipped group is still walked, so a malformed one throws here
|
|
442
|
+
* rather than later. A group outside `[frame_start, frame_end]`, the range
|
|
443
|
+
* the slice header declared, is malformed too: the watermark is raised to
|
|
444
|
+
* the header's end, so a frame beyond it would be applied again by the
|
|
445
|
+
* slice that genuinely carries it.
|
|
446
|
+
*
|
|
447
|
+
* @param {number} peer_id
|
|
448
|
+
* @param {BinaryBuffer} in_buffer
|
|
449
|
+
* @param {number} in_buffer_end
|
|
450
|
+
* @param {number} min_frame
|
|
451
|
+
* @param {number} frame_start
|
|
452
|
+
* @param {number} frame_end
|
|
453
|
+
* @returns {number} the highest frame number the packet carries, or -1 if none
|
|
454
|
+
* @private
|
|
455
|
+
*/
|
|
456
|
+
#apply_groups(peer_id, in_buffer, in_buffer_end, min_frame, frame_start, frame_end) {
|
|
457
|
+
const registry = this.action_registry;
|
|
458
|
+
let last_frame = -1;
|
|
281
459
|
|
|
282
460
|
while (in_buffer.position < in_buffer_end) {
|
|
283
461
|
const frame_number = in_buffer.readUintVar();
|
|
284
462
|
const action_count = in_buffer.readUintVar();
|
|
463
|
+
if (frame_number < frame_start || frame_number > frame_end) {
|
|
464
|
+
throw new MalformedPacketError(`Replicator.unpack_from_peer: frame ${frame_number} lies outside the slice [${frame_start}, ${frame_end}]`);
|
|
465
|
+
}
|
|
466
|
+
if (frame_number > last_frame) last_frame = frame_number;
|
|
285
467
|
|
|
286
468
|
// Skip frames already applied from this peer — the action stream
|
|
287
|
-
// re-sends every
|
|
288
|
-
// corrupt the action-log prior-state capture (see #
|
|
469
|
+
// re-sends every unconfirmed frame each tick, and re-applying would
|
|
470
|
+
// corrupt the action-log prior-state capture (see #inbound).
|
|
289
471
|
// The read cursor must still advance past this frame's actions.
|
|
290
|
-
if (
|
|
472
|
+
if (frame_number < min_frame) {
|
|
473
|
+
/*
|
|
474
|
+
Was this one already applied, or is it being lost right now?
|
|
475
|
+
|
|
476
|
+
Both look identical here — a frame below the watermark, walked past to keep the
|
|
477
|
+
read cursor aligned — and the difference is the whole of GAP-043's residual. The
|
|
478
|
+
ring says which: a slot still holding this frame number means it was applied and
|
|
479
|
+
this is the action stream's own redundancy doing its job; anything else means the
|
|
480
|
+
watermark moved past a frame that never ran, and nothing will re-send it because
|
|
481
|
+
its channel-level ack already told the sender it arrived.
|
|
482
|
+
*/
|
|
483
|
+
const delivery = this.#delivery_state(peer_id);
|
|
484
|
+
const slot = frame_number % delivery.applied.length;
|
|
485
|
+
|
|
486
|
+
if (delivery.applied[slot] === frame_number) {
|
|
487
|
+
delivery.skipped_duplicate++;
|
|
488
|
+
} else {
|
|
489
|
+
delivery.skipped_unapplied++;
|
|
490
|
+
}
|
|
491
|
+
|
|
291
492
|
for (let i = 0; i < action_count; i++) {
|
|
292
493
|
if (in_buffer.position + ACTION_HEADER_BYTES > in_buffer_end) {
|
|
293
494
|
throw new MalformedPacketError(`Replicator.unpack_from_peer: action header overruns packet (skip; frame ${frame_number}, action ${i}/${action_count})`);
|
|
@@ -335,44 +536,140 @@ export class Replicator {
|
|
|
335
536
|
this.action_log.end_frame();
|
|
336
537
|
}
|
|
337
538
|
|
|
338
|
-
//
|
|
339
|
-
//
|
|
340
|
-
|
|
341
|
-
|
|
539
|
+
// Record that it ran, so a later arrival of the same frame is counted as the action
|
|
540
|
+
// stream's redundancy rather than as a loss. See #delivery.
|
|
541
|
+
const delivery = this.#delivery_state(peer_id);
|
|
542
|
+
delivery.applied[frame_number % delivery.applied.length] = frame_number;
|
|
342
543
|
|
|
343
544
|
// Fire AFTER end_frame so handlers see consistent state and can
|
|
344
545
|
// safely query the action log for the just-applied frame.
|
|
345
546
|
this.onFrameApplied.send2(peer_id, frame_number);
|
|
346
547
|
}
|
|
548
|
+
|
|
549
|
+
return last_frame;
|
|
347
550
|
}
|
|
348
551
|
|
|
349
552
|
/**
|
|
350
|
-
*
|
|
351
|
-
*
|
|
352
|
-
*
|
|
553
|
+
* Keep a slice that arrived ahead of the slices before it, to be applied
|
|
554
|
+
* once they land. The bytes are copied — the inbound buffer is shared
|
|
555
|
+
* scratch — after a validation walk, so a malformed slice is rejected now,
|
|
556
|
+
* by the packet that carried it, and not during a later drain inside some
|
|
557
|
+
* other packet's handling.
|
|
558
|
+
*
|
|
559
|
+
* @param {number} peer_id
|
|
560
|
+
* @param {{next_frame: number, held: Array<{frame_start: number, frame_end: number, buffer: BinaryBuffer, length: number}>}} state
|
|
561
|
+
* @param {{frame_start: number, frame_end: number}} slice
|
|
562
|
+
* @param {BinaryBuffer} in_buffer
|
|
563
|
+
* @param {number} in_buffer_end
|
|
564
|
+
* @private
|
|
565
|
+
*/
|
|
566
|
+
#hold_slice(peer_id, state, slice, in_buffer, in_buffer_end) {
|
|
567
|
+
const start = in_buffer.position;
|
|
568
|
+
this.#apply_groups(peer_id, in_buffer, in_buffer_end, Infinity, slice.frame_start, slice.frame_end);
|
|
569
|
+
|
|
570
|
+
const held = state.held;
|
|
571
|
+
let i = 0;
|
|
572
|
+
while (i < held.length && held[i].frame_start < slice.frame_start) i++;
|
|
573
|
+
|
|
574
|
+
// Slice boundaries move between ticks: the last slice of a burst grows
|
|
575
|
+
// by a frame a tick until it fills a packet, a frame that packs to
|
|
576
|
+
// nothing lets the next one in, a rollback that grows a frame pushes
|
|
577
|
+
// the next one out. So a re-send with the same start is not the same
|
|
578
|
+
// slice. Every copy was acked, and the sender credits every frame any
|
|
579
|
+
// copy covered, so a frame only one copy covers is never sent again:
|
|
580
|
+
// keep the copy that reaches further, and between equals the newer,
|
|
581
|
+
// which carries the sender's latest content for those frames.
|
|
582
|
+
const same_start = i < held.length && held[i].frame_start === slice.frame_start;
|
|
583
|
+
if (same_start && held[i].frame_end > slice.frame_end) return;
|
|
584
|
+
if (!same_start && held.length >= MAX_HELD_SLICES) {
|
|
585
|
+
// Keep the slices nearest the gap — the ones the next head is most
|
|
586
|
+
// likely to release — and drop the farthest.
|
|
587
|
+
if (i === held.length) return;
|
|
588
|
+
held.pop();
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
const length = in_buffer_end - start;
|
|
592
|
+
const buffer = new BinaryBuffer();
|
|
593
|
+
buffer.setCapacity(length);
|
|
594
|
+
buffer.writeBytes(in_buffer.raw_bytes, start, length);
|
|
595
|
+
const entry = { frame_start: slice.frame_start, frame_end: slice.frame_end, buffer, length };
|
|
596
|
+
if (same_start) {
|
|
597
|
+
held[i] = entry;
|
|
598
|
+
} else {
|
|
599
|
+
held.splice(i, 0, entry);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* Apply, in order, every held slice that starts before `frame` — the start
|
|
605
|
+
* of a head, before which nothing will be sent again.
|
|
606
|
+
* @private
|
|
607
|
+
*/
|
|
608
|
+
#apply_held_before(peer_id, state, frame) {
|
|
609
|
+
const held = state.held;
|
|
610
|
+
while (held.length > 0 && held[0].frame_start < frame) {
|
|
611
|
+
const h = held.shift();
|
|
612
|
+
if (h.frame_end >= state.next_frame) this.#apply_held(peer_id, state, h);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/**
|
|
617
|
+
* Apply held slices for as long as the next one starts at or before the
|
|
618
|
+
* watermark, dropping any the watermark has already passed.
|
|
619
|
+
* @private
|
|
620
|
+
*/
|
|
621
|
+
#apply_held_contiguous(peer_id, state) {
|
|
622
|
+
const held = state.held;
|
|
623
|
+
while (held.length > 0) {
|
|
624
|
+
const h = held[0];
|
|
625
|
+
if (h.frame_end < state.next_frame) {
|
|
626
|
+
held.shift();
|
|
627
|
+
continue;
|
|
628
|
+
}
|
|
629
|
+
if (h.frame_start > state.next_frame) break;
|
|
630
|
+
held.shift();
|
|
631
|
+
this.#apply_held(peer_id, state, h);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/** @private */
|
|
636
|
+
#apply_held(peer_id, state, h) {
|
|
637
|
+
h.buffer.position = 0;
|
|
638
|
+
this.#apply_groups(peer_id, h.buffer, h.length, state.next_frame, h.frame_start, h.frame_end);
|
|
639
|
+
if (h.frame_end + 1 > state.next_frame) {
|
|
640
|
+
state.next_frame = h.frame_end + 1;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Forget a peer's inbound state — its apply watermark and any slices held
|
|
646
|
+
* for it. Call when a peer disconnects so a later peer reusing the same id
|
|
647
|
+
* (or the same peer resuming a session whose frame numbering restarts) is
|
|
648
|
+
* not wrongly deduped against stale state.
|
|
353
649
|
*
|
|
354
650
|
* @param {number} peer_id
|
|
355
651
|
*/
|
|
356
652
|
forget_peer(peer_id) {
|
|
357
653
|
assert.isNonNegativeInteger(peer_id, 'peer_id');
|
|
358
|
-
this.#
|
|
654
|
+
this.#inbound.delete(peer_id);
|
|
359
655
|
}
|
|
360
656
|
|
|
361
657
|
/**
|
|
362
|
-
*
|
|
363
|
-
*
|
|
364
|
-
*
|
|
658
|
+
* Is the record under `cursor` in scope for `peer_id` — does it touch an
|
|
659
|
+
* entity the peer should see? A record with no affected components (an
|
|
660
|
+
* event-style action) is always in scope.
|
|
365
661
|
*
|
|
366
|
-
* @param {
|
|
662
|
+
* @param {ActionRecordCursor} cursor
|
|
367
663
|
* @param {number} peer_id
|
|
368
664
|
* @returns {boolean}
|
|
369
665
|
* @private
|
|
370
666
|
*/
|
|
371
|
-
#
|
|
372
|
-
|
|
667
|
+
#record_in_scope(cursor, peer_id) {
|
|
668
|
+
if (cursor.prior_count === 0) return true;
|
|
373
669
|
|
|
374
|
-
|
|
375
|
-
|
|
670
|
+
const buffer = cursor.buffer;
|
|
671
|
+
buffer.position = cursor.prior_start;
|
|
672
|
+
for (let i = 0; i < cursor.prior_count; i++) {
|
|
376
673
|
const entity_id = buffer.readUintVar();
|
|
377
674
|
// Translate local entity_id to network_id for the scope filter, which
|
|
378
675
|
// operates on peer-shared identifiers. If `network_for` returns -1,
|
|
@@ -383,64 +680,22 @@ export class Replicator {
|
|
|
383
680
|
// safely apply.
|
|
384
681
|
const network_id = this.slot_table.network_for(entity_id);
|
|
385
682
|
if (network_id >= 0 && this.scope_filter.is_entity_in_scope(peer_id, network_id)) {
|
|
386
|
-
|
|
683
|
+
return true;
|
|
387
684
|
}
|
|
388
685
|
buffer.readUint8(); // component_type_id
|
|
389
|
-
const
|
|
390
|
-
buffer.position +=
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
// Skip the action payload too.
|
|
394
|
-
buffer.readUint8(); // action_type_id
|
|
395
|
-
buffer.readUint8(); // sender_id (local-only metadata, not sent)
|
|
396
|
-
const action_payload_len = buffer.readUint32();
|
|
397
|
-
buffer.position += action_payload_len;
|
|
398
|
-
|
|
399
|
-
// Event-style actions (no affected components) are always in scope.
|
|
400
|
-
return prior_count === 0 ? true : any_in_scope;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
/**
|
|
404
|
-
* Buffer's current position is the start of an action record. Skip the
|
|
405
|
-
* prior_state section, then copy the action portion (type_id + len + payload)
|
|
406
|
-
* to `out_buffer`. Buffer position advances to the end of the record.
|
|
407
|
-
*
|
|
408
|
-
* @param {BinaryBuffer} buffer source action-log frame
|
|
409
|
-
* @param {BinaryBuffer} out_buffer destination packet
|
|
410
|
-
* @private
|
|
411
|
-
*/
|
|
412
|
-
#copy_action_to(buffer, out_buffer) {
|
|
413
|
-
// Skip prior_state.
|
|
414
|
-
const prior_count = buffer.readUintVar();
|
|
415
|
-
for (let i = 0; i < prior_count; i++) {
|
|
416
|
-
buffer.readUintVar(); // entity_id
|
|
417
|
-
buffer.readUint8(); // component_type_id
|
|
418
|
-
const len = buffer.readUint32();
|
|
419
|
-
buffer.position += len; // skip prior payload
|
|
686
|
+
const prior_len = buffer.readUint32();
|
|
687
|
+
buffer.position += prior_len; // skip prior payload
|
|
420
688
|
}
|
|
421
|
-
|
|
422
|
-
// Copy action portion: type_id + len + payload. The local-only
|
|
423
|
-
// sender_id byte is STRIPPED here — over-the-wire format stays
|
|
424
|
-
// (type_id, len, payload) and the receiver derives sender from
|
|
425
|
-
// the packet's peer_id. Including sender_id on the wire would
|
|
426
|
-
// let a hostile peer impersonate other peers' actions.
|
|
427
|
-
const action_type_id = buffer.readUint8();
|
|
428
|
-
buffer.readUint8(); // sender_id — discarded, not sent on the wire
|
|
429
|
-
const action_payload_len = buffer.readUint32();
|
|
430
|
-
|
|
431
|
-
out_buffer.writeUint8(action_type_id);
|
|
432
|
-
out_buffer.writeUint32(action_payload_len);
|
|
433
|
-
out_buffer.writeBytes(buffer.raw_bytes, buffer.position, action_payload_len);
|
|
434
|
-
buffer.position += action_payload_len;
|
|
689
|
+
return false;
|
|
435
690
|
}
|
|
436
691
|
|
|
437
692
|
/**
|
|
438
693
|
* @private
|
|
439
694
|
*/
|
|
440
|
-
#
|
|
441
|
-
const old = this.#
|
|
695
|
+
#grow_in_scope_actions() {
|
|
696
|
+
const old = this.#in_scope_actions;
|
|
442
697
|
const next = new Int32Array(old.length * 2);
|
|
443
698
|
next.set(old);
|
|
444
|
-
this.#
|
|
699
|
+
this.#in_scope_actions = next;
|
|
445
700
|
}
|
|
446
701
|
}
|
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
* Self-describing: records can be skipped without consulting the action registry,
|
|
22
22
|
* which means rewind code can walk records forward to find boundaries, then
|
|
23
23
|
* iterate backward to apply prior states — no need to instantiate any actions.
|
|
24
|
+
* {@link ActionRecordCursor} is that walk; readers use it rather than parsing
|
|
25
|
+
* the layout themselves.
|
|
24
26
|
*
|
|
25
27
|
* `sender_id` says where the record came from, which is what a rollback replay
|
|
26
28
|
* needs in order to decide what to do with it:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionLog.d.ts","sourceRoot":"","sources":["../../../../../src/engine/network/sim/ActionLog.js"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"ActionLog.d.ts","sourceRoot":"","sources":["../../../../../src/engine/network/sim/ActionLog.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH;IAoBI;;OAEG;IACH,qDAFW;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,EAIlE;IAED;;;;OAIG;IACH,sCAEC;IAED;;;;OAIG;IACH,mBAFW,MAAM,QAShB;IAED;;OAEG;IACH,kBASC;IAED;;;;;;OAMG;IACH,kBAFa,OAAO,CAInB;IAED;;;;OAIG;IACH,+BAMC;IAED;;;;;OAKG;IACH,iBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;;;;;;;;OAWG;IACH,kBAHW,MAAM,gBAKhB;IAED;;;;OAIG;IACH,qBAHW,MAAM,GACJ,MAAM,CAIlB;;CACJ"}
|
|
@@ -23,6 +23,8 @@ import { FrameBufferRing } from "../state/FrameBufferRing.js";
|
|
|
23
23
|
* Self-describing: records can be skipped without consulting the action registry,
|
|
24
24
|
* which means rewind code can walk records forward to find boundaries, then
|
|
25
25
|
* iterate backward to apply prior states — no need to instantiate any actions.
|
|
26
|
+
* {@link ActionRecordCursor} is that walk; readers use it rather than parsing
|
|
27
|
+
* the layout themselves.
|
|
26
28
|
*
|
|
27
29
|
* `sender_id` says where the record came from, which is what a rollback replay
|
|
28
30
|
* needs in order to decide what to do with it:
|