From ca24a67706e85fea5cbedae84fe2f35c35cef834 Mon Sep 17 00:00:00 2001 From: LarsBrubaker Date: Fri, 10 May 2019 08:30:36 -0700 Subject: [PATCH] Improving twist object fixed draw normals and added it --- .../ApplicationView/ApplicationController.cs | 2 +- .../DesignTools/Operations/TwistObject3D.cs | 76 +++++++++++++++--- .../SceneViewer/NormalsDrawable.cs | 17 ++-- .../View3D/MeshViewerWidget.cs | 8 +- StaticData/Icons/twist.png | Bin 0 -> 1028 bytes 5 files changed, 77 insertions(+), 26 deletions(-) create mode 100644 StaticData/Icons/twist.png diff --git a/MatterControlLib/ApplicationView/ApplicationController.cs b/MatterControlLib/ApplicationView/ApplicationController.cs index 56f110b9d..17f55e0b9 100644 --- a/MatterControlLib/ApplicationView/ApplicationController.cs +++ b/MatterControlLib/ApplicationView/ApplicationController.cs @@ -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() diff --git a/MatterControlLib/DesignTools/Operations/TwistObject3D.cs b/MatterControlLib/DesignTools/Operations/TwistObject3D.cs index 8148896c1..4494aa334 100644 --- a/MatterControlLib/DesignTools/Operations/TwistObject3D.cs +++ b/MatterControlLib/DesignTools/Operations/TwistObject3D.cs @@ -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 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(); - 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(); + 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) { diff --git a/MatterControlLib/PartPreviewWindow/SceneViewer/NormalsDrawable.cs b/MatterControlLib/PartPreviewWindow/SceneViewer/NormalsDrawable.cs index 8c4df31e6..18bab8014 100644 --- a/MatterControlLib/PartPreviewWindow/SceneViewer/NormalsDrawable.cs +++ b/MatterControlLib/PartPreviewWindow/SceneViewer/NormalsDrawable.cs @@ -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 } } } \ No newline at end of file diff --git a/MatterControlLib/PartPreviewWindow/View3D/MeshViewerWidget.cs b/MatterControlLib/PartPreviewWindow/View3D/MeshViewerWidget.cs index e1db8981c..0562ebe4a 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/MeshViewerWidget.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/MeshViewerWidget.cs @@ -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); diff --git a/StaticData/Icons/twist.png b/StaticData/Icons/twist.png new file mode 100644 index 0000000000000000000000000000000000000000..dd46e0198248794f1934bc777e027d3696a9b1e9 GIT binary patch literal 1028 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7r87e!N+NuHtdjF{^%7I^ zlT!66atjzhz{b9!ATc>RwL~E)H9a%WR_Xoj{Yna%DYi=CroINg16w1-Ypui3%0DIeEoa6}C!XbFK1lpi<;HsXMd|v6mX?*7iAWdWaj57fXqxx$}cUkRZ`LiS)vaT z3373>;5MC*2OuAG(Y=jJZrb?djToOxXNuB~44e_ziMD~)FMU;1G|T9o8N!-t(y zdtQE;RAOG~{O_9y{`Fhb_DI9yg9%`%*Jl+-I9if?6X}NY~ zO4#qc{l6zg+1koZy`glk$G0W$5Q{|m48>nBRaJ`Z=d!$&rB^T!7Y_wgP4 z&hY%D)4xx4JbOClX=kjheh}Y&xw}d1cH3s&j9uoT-hU_7Jc>KqFgZyz&!wu)oT zBR=7a^A4#_TQz~RGX9~?t>hVNz1}U5Z@=+VcVfWDz%!49-CYmZR literal 0 HcmV?d00001