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