From 230839bd538f2a446f741ecc53446524894c928c Mon Sep 17 00:00:00 2001 From: LarsBrubaker Date: Sun, 13 Sep 2020 19:09:09 -0700 Subject: [PATCH] Don't invalidate if can't see the temp graph fixing warnings better measure tool drawing --- .../CustomWidgets/DataViewGraph.cs | 82 +++++++++++-------- .../Primitives/MeasureToolObject3D.cs | 49 ++++++++++- .../DesignTools/Primitives/SphereObject3D.cs | 46 +++++++---- .../TracedPositionObject3DControl.cs | 38 +++++++-- ...ntrolLayer.cs => Object3DControlsLayer.cs} | 36 ++++---- .../PartPreviewWindow/View3D/View3DWidget.cs | 17 ++-- .../TerminalWindow/TextScrollWidget.cs | 5 +- Submodules/agg-sharp | 2 +- 8 files changed, 184 insertions(+), 91 deletions(-) rename MatterControlLib/PartPreviewWindow/View3D/{Object3DControlLayer.cs => Object3DControlsLayer.cs} (96%) diff --git a/MatterControlLib/CustomWidgets/DataViewGraph.cs b/MatterControlLib/CustomWidgets/DataViewGraph.cs index ad73c1052..de28f029a 100644 --- a/MatterControlLib/CustomWidgets/DataViewGraph.cs +++ b/MatterControlLib/CustomWidgets/DataViewGraph.cs @@ -19,10 +19,15 @@ namespace MatterHackers.MatterControl.CustomWidgets public bool DynamicallyScaleRange { get; set; } = true; - Color _goalColor = Color.Yellow; + private Color _goalColor = Color.Yellow; + public Color GoalColor { - get { return _goalColor; } + get + { + return _goalColor; + } + set { _goalColor = value; @@ -30,10 +35,15 @@ namespace MatterHackers.MatterControl.CustomWidgets } } - double _goalValue; + private double _goalValue; + public double GoalValue { - get { return _goalValue; } + get + { + return _goalValue; + } + set { _goalValue = value; @@ -45,29 +55,35 @@ namespace MatterHackers.MatterControl.CustomWidgets { get => base.LocalBounds; set { - dataHistoryArray = new HistoryData(Math.Min(1000, Math.Max(1, (int)(value.Width)))); + dataHistoryArray = new HistoryData(Math.Min(1000, Math.Max(1, (int)value.Width))); base.LocalBounds = value; } } public double MaxValue { get; set; } = double.MinValue; + public double MinValue { get; set; } = double.MaxValue; + public bool ShowGoal { get; set; } + public int TotalAdds { get; private set; } - public void AddData(double NewData) + public void AddData(double newData) { if (DynamicallyScaleRange) { - MaxValue = System.Math.Max(MaxValue, NewData); - MinValue = System.Math.Min(MinValue, NewData); + MaxValue = System.Math.Max(MaxValue, newData); + MinValue = System.Math.Min(MinValue, newData); } - dataHistoryArray.Add(NewData); + dataHistoryArray.Add(newData); TotalAdds++; - Invalidate(); + if (this.ActuallyVisibleOnScreen()) + { + Invalidate(); + } } public double GetAverageValue() @@ -78,17 +94,16 @@ namespace MatterHackers.MatterControl.CustomWidgets public override void OnDraw(Graphics2D graphics2D) { var linesToDrawStorage = new VertexStorage(); - double Range = (MaxValue - MinValue); + double range = MaxValue - MinValue; if (ShowGoal) { - var yPos = (GoalValue - MinValue) * Height / Range; + var yPos = (GoalValue - MinValue) * Height / range; graphics2D.Line(0, yPos, Width, yPos, GoalColor); } Color backgroundGridColor = Color.Gray; - double pixelSkip = Height; for (int i = 0; i < Width / pixelSkip; i++) { @@ -101,11 +116,11 @@ namespace MatterHackers.MatterControl.CustomWidgets { if (i == 0) { - linesToDrawStorage.MoveTo(i + Width - dataHistoryArray.Count, ((dataHistoryArray.GetItem(i) - MinValue) * Height / Range)); + linesToDrawStorage.MoveTo(i + Width - dataHistoryArray.Count, (dataHistoryArray.GetItem(i) - MinValue) * Height / range); } else { - linesToDrawStorage.LineTo(i + Width - dataHistoryArray.Count, ((dataHistoryArray.GetItem(i) - MinValue) * Height / Range)); + linesToDrawStorage.LineTo(i + Width - dataHistoryArray.Count, (dataHistoryArray.GetItem(i) - MinValue) * Height / range); } } @@ -122,8 +137,8 @@ namespace MatterHackers.MatterControl.CustomWidgets internal class HistoryData { internal double currentDataSum; - private int capacity; - private List data; + private readonly int capacity; + private readonly List data; internal HistoryData(int capacity) { @@ -140,16 +155,17 @@ namespace MatterHackers.MatterControl.CustomWidgets } } - internal void Add(double Value) + internal void Add(double value) { if (data.Count == capacity) { currentDataSum -= data[0]; data.RemoveAt(0); } - data.Add(Value); - currentDataSum += Value; + data.Add(value); + + currentDataSum += value; } internal double GetAverageValue() @@ -157,11 +173,11 @@ namespace MatterHackers.MatterControl.CustomWidgets return currentDataSum / data.Count; } - internal double GetItem(int ItemIndex) + internal double GetItem(int itemIndex) { - if (ItemIndex < data.Count) + if (itemIndex < data.Count) { - return data[ItemIndex]; + return data[itemIndex]; } else { @@ -171,30 +187,30 @@ namespace MatterHackers.MatterControl.CustomWidgets internal double GetMaxValue() { - double Max = -double.MinValue; + double max = -double.MinValue; for (int i = 0; i < data.Count; i++) { - if (data[i] > Max) + if (data[i] > max) { - Max = data[i]; + max = data[i]; } } - return Max; + return max; } internal double GetMinValue() { - double Min = double.MaxValue; + double min = double.MaxValue; for (int i = 0; i < data.Count; i++) { - if (data[i] < Min) + if (data[i] < min) { - Min = data[i]; + min = data[i]; } } - return Min; + return min; } internal void Reset() @@ -202,6 +218,6 @@ namespace MatterHackers.MatterControl.CustomWidgets currentDataSum = 0; data.Clear(); } - }; - }; + } + } } \ No newline at end of file diff --git a/MatterControlLib/DesignTools/Primitives/MeasureToolObject3D.cs b/MatterControlLib/DesignTools/Primitives/MeasureToolObject3D.cs index 7d8a2742a..789d4db6e 100644 --- a/MatterControlLib/DesignTools/Primitives/MeasureToolObject3D.cs +++ b/MatterControlLib/DesignTools/Primitives/MeasureToolObject3D.cs @@ -33,6 +33,7 @@ using System.ComponentModel; using System.Threading.Tasks; using MatterHackers.Agg; using MatterHackers.Agg.UI; +using MatterHackers.Agg.VertexSource; using MatterHackers.DataConverters3D; using MatterHackers.Localizations; using MatterHackers.MatterControl.PartPreviewWindow; @@ -50,6 +51,16 @@ namespace MatterHackers.MatterControl.DesignTools { Name = "Measure Tool".Localize(); Color = Color.FromHSL(.11, .98, .76); + + var height = 10; + var diameter = 20; + var path = new VertexStorage(); + path.MoveTo(0, 0); + path.LineTo(diameter / 2, 0); + path.LineTo(diameter / 3, height); + path.LineTo(0, height); + + Mesh = VertexSourceToMesh.Revolve(path, 30); } public static async Task Create() @@ -68,19 +79,48 @@ namespace MatterHackers.MatterControl.DesignTools [ReadOnly(true)] public double Distance { get; set; } = 10; + [HideFromEditor] + public bool PositionsHaveBeenSet { get; set; } = false; + public List GetObject3DControls(Object3DControlsLayer object3DControlsLayer) { return new List { - new TracedPositionObject3DControl(object3DControlsLayer, this, () => StartPosition, (position) => + new TracedPositionObject3DControl(object3DControlsLayer, + this, + () => { + return PositionsHaveBeenSet ? StartPosition : StartPosition.Transform(Matrix); + }, + (position) => + { + if (!PositionsHaveBeenSet) + { + PositionsHaveBeenSet = true; + EndPosition = EndPosition.Transform(this.Matrix); + } + StartPosition = position; Distance = (StartPosition - EndPosition).Length; + UiThread.RunOnIdle(() => Invalidate(InvalidateType.DisplayValues)); }), - new TracedPositionObject3DControl(object3DControlsLayer, this, () => EndPosition, (position) => + new TracedPositionObject3DControl(object3DControlsLayer, + this, + () => { + return PositionsHaveBeenSet ? EndPosition : EndPosition.Transform(Matrix); + }, + (position) => + { + if (!PositionsHaveBeenSet) + { + PositionsHaveBeenSet = true; + StartPosition = StartPosition.Transform(this.Matrix); + } + EndPosition = position; Distance = (StartPosition - EndPosition).Length; + UiThread.RunOnIdle(() => Invalidate(InvalidateType.DisplayValues)); }), }; } @@ -106,7 +146,6 @@ namespace MatterHackers.MatterControl.DesignTools { using (new CenterAndHeightMaintainer(this)) { - Mesh = PlatonicSolids.CreateCube(20, 20, 10); } } @@ -116,7 +155,9 @@ namespace MatterHackers.MatterControl.DesignTools public void DrawEditor(Object3DControlsLayer object3DControlLayer, List transparentMeshes, DrawEventArgs e, ref bool suppressNormalDraw) { - object3DControlLayer.World.Render3DLine(StartPosition.Transform(Matrix), EndPosition.Transform(Matrix), Color.Black, width: GuiWidget.DeviceScale); + var start = PositionsHaveBeenSet ? StartPosition : StartPosition.Transform(Matrix); + var end = PositionsHaveBeenSet ? EndPosition : EndPosition.Transform(Matrix); + object3DControlLayer.World.Render3DLine(start, end, Color.Black, width: GuiWidget.DeviceScale); } } } \ No newline at end of file diff --git a/MatterControlLib/DesignTools/Primitives/SphereObject3D.cs b/MatterControlLib/DesignTools/Primitives/SphereObject3D.cs index 106b8bd95..d0a96f602 100644 --- a/MatterControlLib/DesignTools/Primitives/SphereObject3D.cs +++ b/MatterControlLib/DesignTools/Primitives/SphereObject3D.cs @@ -33,6 +33,7 @@ using MatterHackers.Agg; using MatterHackers.Agg.VertexSource; using MatterHackers.DataConverters3D; using MatterHackers.Localizations; +using MatterHackers.PolygonMesh; using MatterHackers.VectorMath; namespace MatterHackers.MatterControl.DesignTools @@ -63,11 +64,15 @@ namespace MatterHackers.MatterControl.DesignTools } public double Diameter { get; set; } = 20; + public int Sides { get; set; } = 40; public bool Advanced { get; set; } = false; + public double StartingAngle { get; set; } = 0; + public double EndingAngle { get; set; } = 360; + public int LatitudeSides { get; set; } = 30; public override async void OnInvalidate(InvalidateArgs invalidateType) @@ -104,24 +109,7 @@ namespace MatterHackers.MatterControl.DesignTools latitudeSides = Sides; } - var path = new VertexStorage(); - var angleDelta = MathHelper.Tau / 2 / latitudeSides; - var angle = -MathHelper.Tau / 4; - var radius = Diameter / 2; - path.MoveTo(new Vector2(radius * Math.Cos(angle), radius * Math.Sin(angle))); - for (int i = 0; i < latitudeSides; i++) - { - angle += angleDelta; - path.LineTo(new Vector2(radius * Math.Cos(angle), radius * Math.Sin(angle))); - } - - var startAngle = MathHelper.Range0ToTau(MathHelper.DegreesToRadians(startingAngle)); - var endAngle = MathHelper.Range0ToTau(MathHelper.DegreesToRadians(endingAngle)); - var steps = Math.Max(1, (int)(Sides * MathHelper.Tau / Math.Abs(MathHelper.GetDeltaAngle(startAngle, endAngle)) + .5)); - Mesh = VertexSourceToMesh.Revolve(path, - steps, - startAngle, - endAngle); + Mesh = CreateSphere(Diameter, Sides, latitudeSides, startingAngle, endingAngle); } } @@ -134,6 +122,28 @@ namespace MatterHackers.MatterControl.DesignTools return Task.CompletedTask; } + public static Mesh CreateSphere(double diameter = 1, int sides = 30, int latitudeSides = 30, double startingAngle = 0, double endingAngle = MathHelper.Tau) + { + var path = new VertexStorage(); + var angleDelta = MathHelper.Tau / 2 / latitudeSides; + var angle = -MathHelper.Tau / 4; + var radius = diameter / 2; + path.MoveTo(new Vector2(radius * Math.Cos(angle), radius * Math.Sin(angle))); + for (int i = 0; i < latitudeSides; i++) + { + angle += angleDelta; + path.LineTo(new Vector2(radius * Math.Cos(angle), radius * Math.Sin(angle))); + } + + var startAngle = MathHelper.Range0ToTau(MathHelper.DegreesToRadians(startingAngle)); + var endAngle = MathHelper.Range0ToTau(MathHelper.DegreesToRadians(endingAngle)); + var steps = Math.Max(1, (int)(sides * MathHelper.Tau / Math.Abs(MathHelper.GetDeltaAngle(startAngle, endAngle)) + .5)); + return VertexSourceToMesh.Revolve(path, + steps, + startAngle, + endAngle); + } + public void UpdateControls(PublicPropertyChange change) { change.SetRowVisible(nameof(StartingAngle), () => Advanced); diff --git a/MatterControlLib/DesignTools/Primitives/TracedPositionObject3DControl.cs b/MatterControlLib/DesignTools/Primitives/TracedPositionObject3DControl.cs index 611b7b1b9..6ab6cbcfe 100644 --- a/MatterControlLib/DesignTools/Primitives/TracedPositionObject3DControl.cs +++ b/MatterControlLib/DesignTools/Primitives/TracedPositionObject3DControl.cs @@ -43,7 +43,7 @@ namespace MatterHackers.MatterControl.DesignTools { public class TracedPositionObject3DControl : IObject3DControl { - private readonly double blockSize = 7 * GuiWidget.DeviceScale; + private readonly double blockSize = 9 * GuiWidget.DeviceScale; private ITraceable collisionVolume; private ThemeConfig theme; @@ -57,6 +57,7 @@ namespace MatterHackers.MatterControl.DesignTools private Mesh shape; private bool mouseOver; + private bool downOnControl; public TracedPositionObject3DControl(IObject3DControlContext context, IObject3D owner, Func getPosition, Action setPosition) { @@ -64,12 +65,12 @@ namespace MatterHackers.MatterControl.DesignTools this.context = context; this.getPosition = getPosition; this.setPosition = setPosition; - this.shape = PlatonicSolids.CreateCube(); - this.owner = owner; + this.shape = PlatonicSolids.CreateCube(); // SphereObject3D.CreateSphere(); collisionVolume = shape.CreateBVHData(); + this.owner = owner; } - public bool DrawOnTop => false; + public bool DrawOnTop => true; public string Name => "Traced Position"; @@ -96,12 +97,12 @@ namespace MatterHackers.MatterControl.DesignTools private Matrix4X4 ShapeMatrix() { - var worldPosition = getPosition().Transform(owner.Matrix); + var worldPosition = getPosition(); double distBetweenPixelsWorldSpace = context.World.GetWorldUnitsPerScreenPixelAtPosition(worldPosition); var scale = Matrix4X4.CreateScale(distBetweenPixelsWorldSpace * blockSize); var offset = Matrix4X4.CreateTranslation(getPosition()); - var cubeMatrix = scale * owner.Matrix * offset; + var cubeMatrix = scale * offset; return cubeMatrix; } @@ -112,6 +113,7 @@ namespace MatterHackers.MatterControl.DesignTools public void OnMouseDown(Mouse3DEventArgs mouseEvent3D) { + downOnControl = true; } public void OnMouseMove(Mouse3DEventArgs mouseEvent3D, bool mouseIsOver) @@ -121,10 +123,34 @@ namespace MatterHackers.MatterControl.DesignTools mouseOver = mouseIsOver; context.GuiSurface.Invalidate(); } + + if (downOnControl) + { + var ray = context.World.GetRayForLocalBounds(mouseEvent3D.MouseEvent2D.Position); + var scene = context.Scene; + var intersectionInfo = scene.GetBVHData().GetClosestIntersection(ray); + if (intersectionInfo != null) + { + foreach (var object3D in scene.Children) + { + if (object3D.GetBVHData().Contains(intersectionInfo.HitPosition)) + { + var newPosition = intersectionInfo.HitPosition; + if (newPosition != getPosition()) + { + setPosition(newPosition); + context.GuiSurface.Invalidate(); + break; + } + } + } + } + } } public void OnMouseUp(Mouse3DEventArgs mouseEvent3D) { + downOnControl = false; } public void SetPosition(IObject3D selectedItem, MeshSelectInfo selectInfo) diff --git a/MatterControlLib/PartPreviewWindow/View3D/Object3DControlLayer.cs b/MatterControlLib/PartPreviewWindow/View3D/Object3DControlsLayer.cs similarity index 96% rename from MatterControlLib/PartPreviewWindow/View3D/Object3DControlLayer.cs rename to MatterControlLib/PartPreviewWindow/View3D/Object3DControlsLayer.cs index 023257f04..a29cd9cc8 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/Object3DControlLayer.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/Object3DControlsLayer.cs @@ -76,14 +76,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } - private LightingData lighting = new LightingData(); + private readonly LightingData lighting = new LightingData(); private GuiWidget renderSource; public Object3DControlsLayer(ISceneContext sceneContext, ThemeConfig theme, EditorType editorType = EditorType.Part) { this.sceneContext = sceneContext; this.EditorMode = editorType; - this.theme = theme; scene = sceneContext.Scene; @@ -93,17 +92,17 @@ namespace MatterHackers.MatterControl.PartPreviewWindow floorDrawable = new FloorDrawable(editorType, sceneContext, this.BuildVolumeColor, theme); - if (ViewOnlyTexture == null) + if (viewOnlyTexture == null) { // TODO: What is the ViewOnlyTexture??? UiThread.RunOnIdle(() => { - ViewOnlyTexture = new ImageBuffer(32, 32, 32); - var graphics2D = ViewOnlyTexture.NewGraphics2D(); + viewOnlyTexture = new ImageBuffer(32, 32, 32); + var graphics2D = viewOnlyTexture.NewGraphics2D(); graphics2D.Clear(Color.White); - graphics2D.FillRectangle(0, 0, ViewOnlyTexture.Width / 2, ViewOnlyTexture.Height, Color.LightGray); + graphics2D.FillRectangle(0, 0, viewOnlyTexture.Width / 2, viewOnlyTexture.Height, Color.LightGray); // request the texture so we can set it to repeat - ImageGlPlugin.GetImageGlPlugin(ViewOnlyTexture, true, true, false); + ImageGlPlugin.GetImageGlPlugin(viewOnlyTexture, true, true, false); }); } @@ -295,11 +294,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } else { - this.FindHitObject3DControl(ray, out IObject3DControl hitObject3DControl, out info); + _ = this.FindHitObject3DControl(ray, out IObject3DControl hitObject3DControl, out _); var object3DControls = this.Object3DControls; - foreach (var object3DControl in object3DControls.OfType()) + foreach (var object3DControl in object3DControls) { if (hitObject3DControl == object3DControl) { @@ -425,7 +424,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (info != null) { // we hit some part of the collection of controls, figure out which one - foreach (var object3DControlBase in object3DControls.OfType()) + foreach (var object3DControlBase in object3DControls) { var insideBounds = new List(); var traceable = object3DControlBase.GetTraceable(); @@ -473,7 +472,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public GuiWidget GuiSurface => this; - private static ImageBuffer ViewOnlyTexture; + private static ImageBuffer viewOnlyTexture; private Color lightWireframe = new Color("#aaa4"); private Color darkWireframe = new Color("#3334"); @@ -483,7 +482,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private readonly ISceneContext sceneContext; - private readonly ThemeConfig theme; private readonly FloorDrawable floorDrawable; private ModelRenderStyle modelRenderStyle = ModelRenderStyle.Wireframe; @@ -687,7 +685,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private static void ValidateViewOnlyTexturing(IObject3D item) { // if there is no view only texture or the item is locked - if (Object3DControlsLayer.ViewOnlyTexture == null + if (Object3DControlsLayer.viewOnlyTexture == null || item.Mesh.Faces.Count == 0) { return; @@ -697,7 +695,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (!item.RebuildLocked) { item.Mesh.FaceTextures.TryGetValue(0, out FaceTextureData faceTexture); - bool viewOnlyTexture = faceTexture?.image == Object3DControlsLayer.ViewOnlyTexture; + bool viewOnlyTexture = faceTexture?.image == Object3DControlsLayer.viewOnlyTexture; // if not persistable and has view only texture, remove the view only texture if it has it if (item.WorldPersistable() @@ -706,7 +704,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow // make sure it does not have the view only texture using (item.RebuildLock()) { - item.Mesh.RemoveTexture(ViewOnlyTexture, 0); + item.Mesh.RemoveTexture(Object3DControlsLayer.viewOnlyTexture, 0); } } else if (!item.WorldPersistable() @@ -725,7 +723,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow using (item.RebuildLock()) { item.Mesh = item.Mesh.Copy(CancellationToken.None); - item.Mesh.PlaceTexture(ViewOnlyTexture, matrix); + item.Mesh.PlaceTexture(Object3DControlsLayer.viewOnlyTexture, matrix); } }); } @@ -1036,7 +1034,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private void DrawObject3DControlVolumes(DrawEventArgs e) { - foreach (var item in this.Object3DControls.OfType()) + foreach (var item in this.Object3DControls) { item.Visible = !SuppressObject3DControls; } @@ -1049,7 +1047,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow // draw on top of anything that is already drawn GL.Disable(EnableCap.DepthTest); - foreach (var object3DControl in this.Object3DControls.OfType()) + foreach (var object3DControl in this.Object3DControls) { if (object3DControl.DrawOnTop) { @@ -1061,7 +1059,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow GL.Enable(EnableCap.DepthTest); // Draw again setting the depth buffer and ensuring that all the interaction objects are sorted as well as we can - foreach (var object3DVolume in this.Object3DControls.OfType()) + foreach (var object3DVolume in this.Object3DControls) { object3DVolume.Draw(new DrawGlContentEventArgs(true, e)); } diff --git a/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs b/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs index 6f4da14c6..abcaab035 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs @@ -1047,11 +1047,10 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (TrackballTumbleWidget.UnderMouseState == UnderMouseState.FirstUnderMouse && sceneContext.ViewState.ModelView) { - if (mouseEvent.Button == MouseButtons.Left + if ((mouseEvent.Button == MouseButtons.Left && viewControls3D.ActiveButton == ViewControls3DButtons.PartSelect - && ModifierKeys == Keys.Shift - || ( - TrackballTumbleWidget.TransformState == TrackBallTransformType.None + && ModifierKeys == Keys.Shift) + || (TrackballTumbleWidget.TransformState == TrackBallTransformType.None && ModifierKeys != Keys.Control && ModifierKeys != Keys.Alt)) { @@ -1061,7 +1060,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var info = new IntersectInfo(); - IObject3D hitObject = FindHitObject3D(mouseEvent.Position, ref info); + IObject3D hitObject = FindHitObject3D(mouseEvent.Position, out info); if (hitObject == null) { if (selectedItem != null) @@ -1440,7 +1439,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { // find the think we clicked on var info = new IntersectInfo(); - var hitObject = FindHitObject3D(mouseEvent.Position, ref info); + var hitObject = FindHitObject3D(mouseEvent.Position, out info); if (hitObject != null) { if (selectedItem == hitObject @@ -1494,7 +1493,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { var info = new IntersectInfo(); - if (FindHitObject3D(mouseEvent.Position, ref info) is IObject3D hitObject + if (FindHitObject3D(mouseEvent.Position, out info) is IObject3D hitObject && (this.Printer == null // Allow Model -> Right Click in Part view || this.Printer?.ViewState.ViewMode == PartViewMode.Model)) // Disallow Model -> Right Click in GCode views { @@ -1692,7 +1691,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public MeshSelectInfo CurrentSelectInfo { get; } = new MeshSelectInfo(); - protected IObject3D FindHitObject3D(Vector2 screenPosition, ref IntersectInfo intersectionInfo) + private IObject3D FindHitObject3D(Vector2 screenPosition, out IntersectInfo intersectionInfo) { Vector2 meshViewerWidgetScreenPosition = this.Object3DControlLayer.TransformFromParentSpace(this, screenPosition); Ray ray = sceneContext.World.GetRayForLocalBounds(meshViewerWidgetScreenPosition); @@ -1700,7 +1699,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow intersectionInfo = Scene.GetBVHData().GetClosestIntersection(ray); if (intersectionInfo != null) { - foreach (Object3D object3D in Scene.Children) + foreach (var object3D in Scene.Children) { if (object3D.GetBVHData().Contains(intersectionInfo.HitPosition)) { diff --git a/MatterControlLib/PrinterControls/TerminalWindow/TextScrollWidget.cs b/MatterControlLib/PrinterControls/TerminalWindow/TextScrollWidget.cs index 1d8d9303b..22387ac2d 100644 --- a/MatterControlLib/PrinterControls/TerminalWindow/TextScrollWidget.cs +++ b/MatterControlLib/PrinterControls/TerminalWindow/TextScrollWidget.cs @@ -127,7 +127,10 @@ namespace MatterHackers.MatterControl private void TerminalLog_LineAdded(object sender, TerminalLine terminalLine) { this.ConditionalyAddToVisible(terminalLine); - this.Invalidate(); + if (this.ActuallyVisibleOnScreen()) + { + this.Invalidate(); + } } private void TerminalLog_LogCleared(object sender, EventArgs e) diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 2319f6f3e..0ef5b33cf 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 2319f6f3e6458151701c1e2f2ed176421afc9b6d +Subproject commit 0ef5b33cfe0d98e549c67ec8567140c30735c21e