diff --git a/MatterControlLib/DesignTools/EditorTools/ScaleControls/ScaleDiameterControl.cs b/MatterControlLib/DesignTools/EditorTools/ScaleControls/ScaleDiameterControl.cs index f74f7571e..11f597d95 100644 --- a/MatterControlLib/DesignTools/EditorTools/ScaleControls/ScaleDiameterControl.cs +++ b/MatterControlLib/DesignTools/EditorTools/ScaleControls/ScaleDiameterControl.cs @@ -46,19 +46,12 @@ namespace MatterHackers.Plugins.EditorTools { public class ScaleDiameterControl : Object3DControl { - public enum Placement - { - Bottom, - Center, - Top, - } - /// /// Edge starting from the back (+y) going ccw /// - private readonly Mesh minXminYMesh; + private readonly Mesh grabControlMesh; - private readonly double selectCubeSize = 7 * GuiWidget.DeviceScale; + private readonly double grabControlSize = 15 * GuiWidget.DeviceScale; private readonly ThemeConfig theme; @@ -73,9 +66,9 @@ namespace MatterHackers.Plugins.EditorTools private ScaleController scaleController; private Func getDiameter; private Action setDiameter; - private readonly Placement placement; + private readonly ObjectSpace.Placement placement; - public ScaleDiameterControl(IObject3DControlContext context, Func getDiameter, Action setDiameter, Placement placement = Placement.Bottom) + public ScaleDiameterControl(IObject3DControlContext context, Func getDiameter, Action setDiameter, ObjectSpace.Placement placement = ObjectSpace.Placement.Bottom) : base(context) { this.getDiameter = getDiameter; @@ -100,11 +93,11 @@ namespace MatterHackers.Plugins.EditorTools return; } - Vector3 lockedEdge = ObjectSpace.GetBottomCenterPosition(ActiveSelectedItem); + Vector3 lockedEdge = ObjectSpace.GetCenterPosition(ActiveSelectedItem, placement); scaleController.ScaleDiameter(newDiameter); await ActiveSelectedItem.Rebuild(); // and keep the locked edge in place - Vector3 newLockedEdge = ObjectSpace.GetBottomCenterPosition(ActiveSelectedItem); + Vector3 newLockedEdge = ObjectSpace.GetCenterPosition(ActiveSelectedItem, placement); ActiveSelectedItem.Translate(lockedEdge - newLockedEdge); scaleController.EditComplete(); @@ -122,9 +115,9 @@ namespace MatterHackers.Plugins.EditorTools DrawOnTop = true; - minXminYMesh = PlatonicSolids.CreateCube(selectCubeSize, selectCubeSize, selectCubeSize); + grabControlMesh = SphereObject3D.CreateSphere(grabControlSize, 15, 10); - CollisionVolume = minXminYMesh.CreateBVHData(); + CollisionVolume = grabControlMesh.CreateBVHData(); Object3DControlContext.GuiSurface.BeforeDraw += Object3DControl_BeforeDraw; } @@ -176,11 +169,11 @@ namespace MatterHackers.Plugins.EditorTools // don't draw if any other control is dragging if (MouseIsOver || MouseDownOnControl) { - GLHelper.Render(minXminYMesh, theme.PrimaryAccentColor.WithAlpha(e.Alpha0to255), TotalTransform, RenderTypes.Shaded); + GLHelper.Render(grabControlMesh, theme.PrimaryAccentColor.WithAlpha(e.Alpha0to255), TotalTransform, RenderTypes.Shaded); } else { - GLHelper.Render(minXminYMesh, theme.TextColor.Blend(theme.BackgroundColor, .35).WithAlpha(e.Alpha0to255), TotalTransform, RenderTypes.Shaded); + GLHelper.Render(grabControlMesh, theme.TextColor.Blend(theme.BackgroundColor, .35).WithAlpha(e.Alpha0to255), TotalTransform, RenderTypes.Shaded); } } @@ -253,7 +246,7 @@ namespace MatterHackers.Plugins.EditorTools { var delta = info.HitPosition - initialHitPosition; - var lockedBottomCenter = ObjectSpace.GetBottomCenterPosition(selectedItem); + var lockedBottomCenter = ObjectSpace.GetCenterPosition(selectedItem, placement); var grabPositionEdge = ObjectSpace.GetEdgePosition(selectedItem, 2); var stretchDirection = (ObjectSpace.GetEdgePosition(selectedItem, 0) - grabPositionEdge).GetNormal(); @@ -261,7 +254,7 @@ namespace MatterHackers.Plugins.EditorTools // scale it var newSize = scaleController.InitialState.Diameter; - newSize += deltaAlongStretch; + newSize += deltaAlongStretch * 2; newSize = Math.Max(Math.Max(newSize, .001), Object3DControlContext.SnapGridDistance); if (Object3DControlContext.SnapGridDistance > 0) @@ -278,7 +271,7 @@ namespace MatterHackers.Plugins.EditorTools await selectedItem.Rebuild(); // and keep the locked edge in place - Vector3 newBottomCenter = ObjectSpace.GetBottomCenterPosition(selectedItem); + Vector3 newBottomCenter = ObjectSpace.GetCenterPosition(selectedItem, placement); selectedItem.Matrix *= Matrix4X4.CreateTranslation(lockedBottomCenter - newBottomCenter); @@ -305,14 +298,14 @@ namespace MatterHackers.Plugins.EditorTools public override void SetPosition(IObject3D selectedItem, MeshSelectInfo selectInfo) { - // create the transform for the box - Vector3 edgePosition = ObjectSpace.GetEdgePosition(selectedItem, 0); + // create the transform for the grab control + Vector3 edgePosition = ObjectSpace.GetEdgePosition(selectedItem, 0, placement); Vector3 boxCenter = edgePosition; double distBetweenPixelsWorldSpace = Object3DControlContext.World.GetWorldUnitsPerScreenPixelAtPosition(edgePosition); - boxCenter.Y += selectCubeSize / 2 * distBetweenPixelsWorldSpace; - boxCenter.Z += selectCubeSize / 2 * distBetweenPixelsWorldSpace; + boxCenter.Y += grabControlSize / 2 * distBetweenPixelsWorldSpace; + boxCenter.Z += grabControlSize / 2 * distBetweenPixelsWorldSpace; var rotation = Matrix4X4.CreateRotation(new Quaternion(selectedItem.Matrix)); diff --git a/MatterControlLib/DesignTools/EditorTools/ScaleControls/ScaleWidthDepthEdgeControl.cs b/MatterControlLib/DesignTools/EditorTools/ScaleControls/ScaleWidthDepthEdgeControl.cs index 2fda619a3..f8e2906e2 100644 --- a/MatterControlLib/DesignTools/EditorTools/ScaleControls/ScaleWidthDepthEdgeControl.cs +++ b/MatterControlLib/DesignTools/EditorTools/ScaleControls/ScaleWidthDepthEdgeControl.cs @@ -530,35 +530,68 @@ namespace MatterHackers.Plugins.EditorTools return cornerPosition.Transform(item.Matrix); } - public static Vector3 GetBottomCenterPosition(IObject3D item) + public static Vector3 GetCenterPosition(IObject3D item, Placement placement) { - var originalSelectedBounds = item.GetAxisAlignedBoundingBox(item.Matrix.Inverted); - var cornerPosition = originalSelectedBounds.GetBottomCenter(); + var aabb = item.GetAxisAlignedBoundingBox(item.Matrix.Inverted); + var cornerPosition = aabb.Center; + switch (placement) + { + case Placement.Bottom: + cornerPosition.Z = aabb.MinXYZ.Z; + break; + case Placement.Center: + cornerPosition.Z = aabb.Center.Z; + break; + case Placement.Top: + cornerPosition.Z = aabb.MaxXYZ.Z; + break; + } return cornerPosition.Transform(item.Matrix); } - public static Vector3 GetEdgePosition(IObject3D item, int edegIndex) + public enum Placement + { + Bottom, + Center, + Top, + } + + public static Vector3 GetEdgePosition(IObject3D item, int edegIndex, Placement placement = Placement.Bottom) { edegIndex %= 4; var aabb = item.GetAxisAlignedBoundingBox(item.Matrix.Inverted); var edgePosition = default(Vector3); + double z = 0; + switch (placement) + { + case Placement.Bottom: + z = aabb.MinXYZ.Z; + break; + case Placement.Center: + z = aabb.Center.Z; + break; + case Placement.Top: + z = aabb.MaxXYZ.Z; + break; + } + switch (edegIndex) { case 0: - edgePosition = new Vector3(aabb.Center.X, aabb.MaxXYZ.Y, aabb.MinXYZ.Z); + edgePosition = new Vector3(aabb.Center.X, aabb.MaxXYZ.Y, z); break; case 1: - edgePosition = new Vector3(aabb.MinXYZ.X, aabb.Center.Y, aabb.MinXYZ.Z); + edgePosition = new Vector3(aabb.MinXYZ.X, aabb.Center.Y, z); break; case 2: - edgePosition = new Vector3(aabb.Center.X, aabb.MinXYZ.Y, aabb.MinXYZ.Z); + edgePosition = new Vector3(aabb.Center.X, aabb.MinXYZ.Y, z); break; case 3: - edgePosition = new Vector3(aabb.MaxXYZ.X, aabb.Center.Y, aabb.MinXYZ.Z); + edgePosition = new Vector3(aabb.MaxXYZ.X, aabb.Center.Y, z); break; } diff --git a/MatterControlLib/DesignTools/Primitives/SphereObject3D.cs b/MatterControlLib/DesignTools/Primitives/SphereObject3D.cs index db8a15318..81618e433 100644 --- a/MatterControlLib/DesignTools/Primitives/SphereObject3D.cs +++ b/MatterControlLib/DesignTools/Primitives/SphereObject3D.cs @@ -165,7 +165,7 @@ namespace MatterHackers.MatterControl.DesignTools object3DControlsLayer.Object3DControls.Add(new ScaleDiameterControl(object3DControlsLayer, () => Diameter, (diameter) => Diameter = diameter, - ScaleDiameterControl.Placement.Center)); + ObjectSpace.Placement.Center)); object3DControlsLayer.AddControls(ControlTypes.MoveInZ); object3DControlsLayer.AddControls(ControlTypes.RotateXYZ); } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index ebdf76132..a84eb08d2 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit ebdf76132f897aacd7f887004da54ce3709e89a7 +Subproject commit a84eb08d2799b1b3ba6796b36eb45eae5b44fcfe