diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index 916390505..b09ce3835 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -57,6 +57,7 @@ namespace MatterHackers.MatterControl using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling; using MatterHackers.MatterControl.Library; using MatterHackers.MatterControl.PartPreviewWindow; + using MatterHackers.MeshVisualizer; using MatterHackers.SerialPortCommunication; using MatterHackers.VectorMath; using PrintHistory; @@ -122,6 +123,8 @@ namespace MatterHackers.MatterControl private int activeLayerIndex; + public InteractiveScene Scene { get; } = new InteractiveScene(); + public GCodeRenderInfo RenderInfo { get; set; } internal void Render3DLayerFeatures() diff --git a/PartPreviewWindow/View3D/InteractionLayer.cs b/PartPreviewWindow/View3D/InteractionLayer.cs index dfb9f7948..3ef5e9610 100644 --- a/PartPreviewWindow/View3D/InteractionLayer.cs +++ b/PartPreviewWindow/View3D/InteractionLayer.cs @@ -43,7 +43,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public WorldView World { get; } - public InteractiveScene Scene { get; set; } + public InteractiveScene Scene { get; } // TODO: Collapse into auto-property private List interactionVolumes = new List(); @@ -57,8 +57,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private string progressReportingPrimaryTask = ""; - public InteractionLayer(WorldView world, UndoBuffer undoBuffer, Action notifyPartChanged) + public InteractionLayer(WorldView world, UndoBuffer undoBuffer, Action notifyPartChanged, InteractiveScene scene) { + this.Scene = scene; this.World = world; this.InteractionVolumes = interactionVolumes; this.undoBuffer = undoBuffer; diff --git a/PartPreviewWindow/View3D/MeshViewerWidget.cs b/PartPreviewWindow/View3D/MeshViewerWidget.cs index 3e01bf675..40f26c463 100644 --- a/PartPreviewWindow/View3D/MeshViewerWidget.cs +++ b/PartPreviewWindow/View3D/MeshViewerWidget.cs @@ -92,22 +92,22 @@ namespace MatterHackers.MeshVisualizer private InteractionLayer interactionLayer; - public MeshViewerWidget(Vector3 displayVolume, Vector2 bedCenter, BedShape bedShape, TrackballTumbleWidget trackballTumbleWidget, InteractionLayer interactionLayer, string startingTextMessage = "") + public MeshViewerWidget(Vector3 displayVolume, Vector2 bedCenter, BedShape bedShape, TrackballTumbleWidget trackballTumbleWidget, InteractionLayer interactionLayer, InteractiveScene _scene, string startingTextMessage = "") { - interactionLayer.Scene = Scene; + this.scene = _scene; var activePrintItem = ApplicationController.Instance.ActivePrintItem; if (activePrintItem != null && File.Exists(activePrintItem.FileLocation)) { - Scene.Load(activePrintItem.FileLocation); + scene.Load(activePrintItem.FileLocation); } this.interactionLayer = interactionLayer; this.World = interactionLayer.World; - Scene.SelectionChanged += (sender, e) => + scene.SelectionChanged += (sender, e) => { Invalidate(); }; @@ -169,7 +169,7 @@ namespace MatterHackers.MeshVisualizer { AfterDraw += (sender, e) => { - foreach (var child in Scene.Children) + foreach (var child in scene.Children) { this.World.RenderDebugAABB(e.graphics2D, child.TraceData().GetAxisAlignedBoundingBox()); this.World.RenderDebugAABB(e.graphics2D, child.GetAxisAlignedBoundingBox(Matrix4X4.Identity)); @@ -182,7 +182,7 @@ namespace MatterHackers.MeshVisualizer public override void FindNamedChildrenRecursive(string nameToSearchFor, List foundChildren, RectangleDouble touchingBounds, SearchType seachType, bool allowInvalidItems = true) { - foreach (var child in Scene.Children) + foreach (var child in scene.Children) { string object3DName = child.Name; if (object3DName == null && child.MeshPath != null) @@ -233,7 +233,7 @@ namespace MatterHackers.MeshVisualizer base.FindNamedChildrenRecursive(nameToSearchFor, foundChildren, touchingBounds, seachType, allowInvalidItems); } - public InteractiveScene Scene { get; } = new InteractiveScene(); + protected InteractiveScene scene { get; } public Mesh PrinterBed { get { return printerBed; } } @@ -249,7 +249,7 @@ namespace MatterHackers.MeshVisualizer if (renderType != value) { renderType = value; - foreach(var renderTransfrom in Scene.VisibleMeshes(Matrix4X4.Identity)) + foreach(var renderTransfrom in scene.VisibleMeshes(Matrix4X4.Identity)) { renderTransfrom.Mesh.MarkAsChanged(); } @@ -401,7 +401,7 @@ namespace MatterHackers.MeshVisualizer } // SetMeshAfterLoad - Scene.ModifyChildren(children => + scene.ModifyChildren(children => { if (loadedItem.Mesh != null) { @@ -549,7 +549,7 @@ namespace MatterHackers.MeshVisualizer foreach(MeshRenderData renderData in object3D.VisibleMeshes(transform)) { bool isSelected = parentSelected || - Scene.HasSelection && (object3D == Scene.SelectedItem || Scene.SelectedItem.Children.Contains(object3D)); + scene.HasSelection && (object3D == scene.SelectedItem || scene.SelectedItem.Children.Contains(object3D)); RGBA_Bytes drawColor = renderData.Color; if(object3D.OutputType == PrintOutputTypes.Support) @@ -634,7 +634,7 @@ namespace MatterHackers.MeshVisualizer private void trackballTumbleWidget_DrawGlContent(object sender, EventArgs e) { - foreach(var object3D in Scene.Children) + foreach(var object3D in scene.Children) { DrawObject(object3D, Matrix4X4.Identity, false); } @@ -650,7 +650,7 @@ namespace MatterHackers.MeshVisualizer } // we don't want to render the bed or build volume before we load a model. - if (Scene.HasChildren || AllowBedRenderingWhenEmpty) + if (scene.HasChildren || AllowBedRenderingWhenEmpty) { if (false) // this is code to draw a small axis indicator { diff --git a/PartPreviewWindow/View3D/PrinterActionsBar.cs b/PartPreviewWindow/View3D/PrinterActionsBar.cs index c666883fe..ef96fa0c8 100644 --- a/PartPreviewWindow/View3D/PrinterActionsBar.cs +++ b/PartPreviewWindow/View3D/PrinterActionsBar.cs @@ -83,7 +83,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public PrinterActionsBar(View3DWidget modelViewer, PrinterTabPage printerTabPage) { - UndoBuffer undoBuffer = modelViewer.UndoBuffer; + UndoBuffer undoBuffer = modelViewer.Scene.UndoBuffer; var defaultMargin = ApplicationController.Instance.Theme.ButtonSpacing; var buttonFactory = ApplicationController.Instance.Theme.ButtonFactory; diff --git a/PartPreviewWindow/View3D/SceneActions.cs b/PartPreviewWindow/View3D/SceneActions.cs index 90681bf39..966306e2d 100644 --- a/PartPreviewWindow/View3D/SceneActions.cs +++ b/PartPreviewWindow/View3D/SceneActions.cs @@ -92,7 +92,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow operation.Do(); // Store the operation for undo/redo - view3DWidget.UndoBuffer.Add(operation); + view3DWidget.Scene.UndoBuffer.Add(operation); } }); @@ -237,7 +237,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow operation.Do(); // Store the operation for undo/redo - view3DWidget.UndoBuffer.Add(operation); + view3DWidget.Scene.UndoBuffer.Add(operation); } }); @@ -322,7 +322,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow insertOperation.Do(); // Store the operation for undo/redo - view3DWidget.UndoBuffer.Add(insertOperation); + view3DWidget.Scene.UndoBuffer.Add(insertOperation); } public static void DeleteSelection(this InteractiveScene Scene, View3DWidget view3DWidget) @@ -334,7 +334,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow deleteOperation.Do(); // Store the operation for undo/redo - view3DWidget.UndoBuffer.Add(deleteOperation); + view3DWidget.Scene.UndoBuffer.Add(deleteOperation); } } diff --git a/PartPreviewWindow/View3D/SideBar/MirrorControls.cs b/PartPreviewWindow/View3D/SideBar/MirrorControls.cs index e125a231d..58aa5d0d4 100644 --- a/PartPreviewWindow/View3D/SideBar/MirrorControls.cs +++ b/PartPreviewWindow/View3D/SideBar/MirrorControls.cs @@ -61,7 +61,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { if (view3DWidget.Scene.HasSelection) { - view3DWidget.UndoBuffer.AddAndDo(new UndoRedoActions(() => MirrorOnAxis(0), () => MirrorOnAxis(0))); + view3DWidget.Scene.UndoBuffer.AddAndDo(new UndoRedoActions(() => MirrorOnAxis(0), () => MirrorOnAxis(0))); throw new NotImplementedException(); @@ -81,7 +81,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { if (view3DWidget.Scene.HasSelection) { - view3DWidget.UndoBuffer.AddAndDo(new UndoRedoActions(() => MirrorOnAxis(1), () => MirrorOnAxis(1))); + view3DWidget.Scene.UndoBuffer.AddAndDo(new UndoRedoActions(() => MirrorOnAxis(1), () => MirrorOnAxis(1))); throw new NotImplementedException(); @@ -101,7 +101,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { if (view3DWidget.Scene.HasSelection) { - view3DWidget.UndoBuffer.AddAndDo(new UndoRedoActions(() => MirrorOnAxis(2), () => MirrorOnAxis(2))); + view3DWidget.Scene.UndoBuffer.AddAndDo(new UndoRedoActions(() => MirrorOnAxis(2), () => MirrorOnAxis(2))); throw new NotImplementedException(); diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index 261063803..7d995ecc9 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -67,7 +67,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private bool deferEditorTillMouseUp = false; public FlowLayoutWidget selectionActionBar; - public UndoBuffer UndoBuffer { get; } = new UndoBuffer(); public readonly int EditButtonHeight = 44; private ObservableCollection extruderButtons = new ObservableCollection(); @@ -138,6 +137,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public View3DWidget(PrintItemWrapper printItemWrapper, Vector3 viewerVolume, Vector2 bedCenter, BedShape bedShape, WindowMode windowType, AutoRotate autoRotate, ViewControls3D viewControls3D, ThemeConfig theme, OpenMode openMode = OpenMode.Viewing) { this.printer = ApplicationController.Instance.Printer; + this.Scene = this.printer.BedPlate.Scene; this.bedCenter = bedCenter; this.TrackballTumbleWidget = new TrackballTumbleWidget(ApplicationController.Instance.Printer.BedPlate.World) @@ -146,7 +146,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }; this.TrackballTumbleWidget.AnchorAll(); - this.InteractionLayer = new InteractionLayer(this.World, this.UndoBuffer, this.PartHasBeenChanged) + this.InteractionLayer = new InteractionLayer(this.World, this.Scene.UndoBuffer, this.PartHasBeenChanged, this.Scene) { Name = "InteractionLayer", }; @@ -156,7 +156,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.theme = theme; this.openMode = openMode; allowAutoRotate = (autoRotate == AutoRotate.Enabled); - meshViewerWidget = new MeshViewerWidget(viewerVolume, bedCenter, bedShape, this.TrackballTumbleWidget, this.InteractionLayer); + meshViewerWidget = new MeshViewerWidget(viewerVolume, bedCenter, bedShape, this.TrackballTumbleWidget, this.InteractionLayer, this.Scene); this.printItemWrapper = printItemWrapper; ActiveSliceSettings.SettingChanged.RegisterEvent(CheckSettingChanged, ref unregisterEvents); @@ -552,7 +552,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow case Keys.Z: if (keyEvent.Control) { - UndoBuffer.Undo(); + this.Scene.UndoBuffer.Undo(); keyEvent.Handled = true; keyEvent.SuppressKeyPress = true; } @@ -561,7 +561,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow case Keys.Y: if (keyEvent.Control) { - UndoBuffer.Redo(); + this.Scene.UndoBuffer.Redo(); keyEvent.Handled = true; keyEvent.SuppressKeyPress = true; } @@ -596,7 +596,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public void AddUndoOperation(IUndoRedoCommand operation) { - UndoBuffer.Add(operation); + this.Scene.UndoBuffer.Add(operation); } #region DoBooleanTest @@ -703,9 +703,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private void RemoveBooleanTestGeometry(object sender, DrawEventArgs e) { - if (meshViewerWidget.Scene.Children.Contains(booleanGroup)) + if (this.Scene.Children.Contains(booleanGroup)) { - meshViewerWidget.Scene.Children.Remove(booleanGroup); + this.Scene.Children.Remove(booleanGroup); UiThread.RunOnIdle(() => Invalidate(), 1.0 / 30.0); } } @@ -1250,7 +1250,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Invalidate(); CurrentSelectInfo.DownOnPart = true; - AxisAlignedBoundingBox selectedBounds = meshViewerWidget.Scene.SelectedItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity); + AxisAlignedBoundingBox selectedBounds = this.Scene.SelectedItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity); if (info.HitPosition.x < selectedBounds.Center.x) { @@ -1320,7 +1320,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (snapGridDistance > 0) { // snap this position to the grid - AxisAlignedBoundingBox selectedBounds = meshViewerWidget.Scene.SelectedItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity); + AxisAlignedBoundingBox selectedBounds = this.Scene.SelectedItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity); double xSnapOffset = selectedBounds.minXYZ.x; // snap the x position @@ -2405,7 +2405,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public MeshViewerWidget meshViewerWidget; // Proxy to MeshViewerWidget - public InteractiveScene Scene => meshViewerWidget.Scene; + public InteractiveScene Scene { get; } protected ViewControls3D viewControls3D { get; } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 119cb3592..a4d49aa36 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 119cb3592fabfe1377cd045841cbe76289ee95b6 +Subproject commit a4d49aa36f6e5bfd4214287c350de746b41a6bab