Improving twist object

fixed draw normals and added it
This commit is contained in:
LarsBrubaker 2019-05-10 08:30:36 -07:00 committed by Lars Brubaker
parent a9577e9a35
commit ca24a67706
5 changed files with 77 additions and 26 deletions

View file

@ -822,7 +822,7 @@ namespace MatterHackers.MatterControl
var curve = new TwistObject3D();
curve.WrapSelectedItemAndSelect(sceneContext.Scene);
},
Icon = AggContext.StaticData.LoadIcon("curve.png", 16, 16, theme.InvertIcons),
Icon = AggContext.StaticData.LoadIcon("twist.png", 16, 16, theme.InvertIcons),
IsEnabled = (scene) => scene.SelectedItem != null,
},
new SceneSelectionOperation()

View file

@ -55,17 +55,28 @@ namespace MatterHackers.MatterControl.DesignTools
Name = "Twist".Localize();
}
[DisplayName("Twist Right")]
public bool TwistCw { get; set; } = true;
[Description("The angle to rotate the top of the part")]
public double Angle { get; set; } = double.MaxValue;
public Vector2 RotationOffset { get; set; }
[Range(3, 360, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
[Description("Ensures the rotated part has a minimum number of sides per complete rotation")]
public double MinCutsPerRotation { get; set; } = 30;
[DisplayName("Twist Right")]
public bool TwistCw { get; set; } = true;
public bool Advanced { get; set; }
public Easing.EaseType EasingType { get; set; } = Easing.EaseType.Linear;
public Easing.EaseOption EasingOption { get; set; } = Easing.EaseOption.In;
public double EndHeightPercent { get; set; } = 100;
public double StartHeightPercent { get; set; } = 0;
[Description("Allows for the repositioning of the rotation origin")]
public Vector2 RotationOffset { get; set; }
public void DrawEditor(InteractionLayer layer, List<Object3DView> transparentMeshes, DrawEventArgs e, ref bool suppressNormalDraw)
{
@ -104,6 +115,18 @@ namespace MatterHackers.MatterControl.DesignTools
valuesChanged = true;
}
if (EndHeightPercent < 1 || EndHeightPercent > 100)
{
EndHeightPercent = Math.Min(100, Math.Max(1, EndHeightPercent));
valuesChanged = true;
}
if (StartHeightPercent < 0 || StartHeightPercent > EndHeightPercent - 1)
{
StartHeightPercent = Math.Min(EndHeightPercent - 1, Math.Max(0, StartHeightPercent));
valuesChanged = true;
}
var rebuildLocks = this.RebuilLockAll();
return ApplicationController.Instance.Tasks.Execute(
@ -113,14 +136,21 @@ namespace MatterHackers.MatterControl.DesignTools
{
var sourceAabb = this.SourceContainer.GetAxisAlignedBoundingBox();
double numberOfCuts = MinCutsPerRotation * (Angle / 360.0);
double cutSize = sourceAabb.XSize / numberOfCuts;
double cutPosition = sourceAabb.MinXYZ.Z + cutSize;
var cuts = new List<double>();
for (int i = 0; i < numberOfCuts; i++)
var bottom = sourceAabb.MinXYZ.Z;
var top = sourceAabb.ZSize * EndHeightPercent / 100.0;
var size = sourceAabb.ZSize;
if (Advanced)
{
cuts.Add(cutPosition);
cutPosition += cutSize;
bottom += sourceAabb.ZSize * StartHeightPercent / 100.0;
size = top - bottom;
}
double numberOfCuts = MinCutsPerRotation * (Angle / 360.0);
double cutSize = size / numberOfCuts;
var cuts = new List<double>();
for (int i = 0; i < numberOfCuts + 1; i++)
{
cuts.Add(bottom - cutSize + i * size / numberOfCuts);
}
var rotationCenter = new Vector2(sourceAabb.Center) + RotationOffset;
@ -143,7 +173,27 @@ namespace MatterHackers.MatterControl.DesignTools
{
var position = transformedMesh.Vertices[i];
var angleToRotate = ((position.Z - sourceAabb.MinXYZ.Z) / sourceAabb.ZSize) * Angle / 360.0 * MathHelper.Tau;
var ratio = (position.Z - bottom) / size;
if (Advanced)
{
if (position.Z < bottom)
{
ratio = 0;
}
else if (position.Z > top)
{
ratio = 1;
}
else
{
ratio = (position.Z - bottom) / size;
ratio = Easing.Specify(EasingType, EasingOption, ratio);
}
}
var angleToRotate = ratio * Angle / 360.0 * MathHelper.Tau;
if (!TwistCw)
{

View file

@ -27,8 +27,7 @@ of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
using System;
using System.Drawing;
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D;
using MatterHackers.RenderOpenGl;
@ -57,8 +56,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
public void Draw(GuiWidget sender, IObject3D item, bool isSelected, DrawEventArgs e, Matrix4X4 itemMaxtrix, WorldView world)
{
throw new NotImplementedException();
#if false
if (item.Mesh?.Faces.Count <= 0)
{
return;
@ -71,24 +68,24 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
foreach (var face in mesh.Faces)
{
int vertexCount = 0;
Vector3 faceCenter = Vector3.Zero;
foreach (var v in new[] { face.v0, face.v1, face.v2 })
Vector3Float faceCenter = Vector3Float.Zero;
foreach (var v in new[] { face.v0, face.v1, face.v2 })
{
var vertex = mesh.Vertices[v];
faceCenter += vertex.Position;
faceCenter += vertex;
vertexCount++;
}
faceCenter /= vertexCount;
var matrix = item.WorldMatrix();
var transformed1 = Vector3Ex.Transform(faceCenter, matrix);
var normal = Vector3Ex.TransformNormal(face.Normal, matrix).GetNormal();
var transformed1 = faceCenter.Transform(matrix);
var normal = face.normal.TransformNormal(matrix).GetNormal();
world.Render3DLineNoPrep(frustum, transformed1, transformed1 + normal, Color.Red, 2);
}
#endif
}
}
}

View file

@ -82,7 +82,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
new AxisIndicatorDrawable(),
new SceneTraceDataDrawable(sceneContext),
new AABBDrawable(sceneContext),
new LevelingDataDrawable(sceneContext)
new LevelingDataDrawable(sceneContext),
});
#endif
itemDrawables.AddRange(new IDrawableItem[]
@ -92,7 +92,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
});
#if DEBUG
itemDrawables.Add(new InspectedItemDrawable(sceneContext));
itemDrawables.AddRange(new IDrawableItem[]
{
new InspectedItemDrawable(sceneContext),
new NormalsDrawable(sceneContext)
});
#endif
base.OnLoad(args);

BIN
StaticData/Icons/twist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB