From cfe0edd1ef6931ac1ccb15acb608df5e680908cf Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Wed, 18 Oct 2017 11:56:37 -0700 Subject: [PATCH 1/2] VisibleMeshes returns IObject3D now (fixing) --- .../View3D/DifferenceObject3D.cs | 16 +++---- PartPreviewWindow/View3D/MeshViewerWidget.cs | 43 ++++++++++--------- PartPreviewWindow/View3D/View3DWidget.cs | 6 +-- Queue/OptionsMenu/PartsSheetCreator.cs | 6 +-- Submodules/agg-sharp | 2 +- 5 files changed, 36 insertions(+), 37 deletions(-) diff --git a/PartPreviewWindow/View3D/DifferenceObject3D.cs b/PartPreviewWindow/View3D/DifferenceObject3D.cs index 7faf86731..fc6cd756d 100644 --- a/PartPreviewWindow/View3D/DifferenceObject3D.cs +++ b/PartPreviewWindow/View3D/DifferenceObject3D.cs @@ -68,17 +68,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D { } - public DifferenceItem(IObject3D child, string ownerId, bool keep) + public DifferenceItem(IObject3D child, string ownerId, bool makeHole) : base(child, ownerId) { - this.Keep = keep; - if (!keep) + if (makeHole) { OutputType = PrintOutputTypes.Hole; } } - - public bool Keep { get; set; } = true; } public class DifferenceGroup : Object3D @@ -94,15 +91,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D }); bool first = true; - // now wrap every decendant that has a mesh + // now wrap every first decendant that has a mesh foreach (var child in this.Descendants().Where((o) => o.Mesh != null)) { // wrap the child in a DifferenceItem child.Parent.Children.Modify((list) => { list.Remove(child); - list.Add(new DifferenceItem(child, this.ID, first)); - first = false; + list.Add(new DifferenceItem(child, this.ID, !first)); }); } @@ -116,8 +112,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D { var container = this; var participants = this.Descendants().Where((obj) => obj.OwnerID == this.ID); - var removeObjects = participants.Where((obj) => ((DifferenceItem)obj).Keep == false); - var keepObjects = participants.Where((obj) => ((DifferenceItem)obj).Keep == true); + var removeObjects = participants.Where((obj) => ((DifferenceItem)obj).OutputType == PrintOutputTypes.Hole); + var keepObjects = participants.Where((obj) => ((DifferenceItem)obj).OutputType != PrintOutputTypes.Hole); if (removeObjects.Any() && keepObjects.Any()) diff --git a/PartPreviewWindow/View3D/MeshViewerWidget.cs b/PartPreviewWindow/View3D/MeshViewerWidget.cs index f63fd5fd9..e7aa6cc90 100644 --- a/PartPreviewWindow/View3D/MeshViewerWidget.cs +++ b/PartPreviewWindow/View3D/MeshViewerWidget.cs @@ -318,7 +318,7 @@ namespace MatterHackers.MeshVisualizer public bool IsActive { get; set; } = true; - private void DrawObject(IObject3D object3D, List transparentMeshes, bool parentSelected, DrawEventArgs e) + private void DrawObject(IObject3D object3D, List transparentMeshes, bool parentSelected, DrawEventArgs e) { var totalVertices = 0; @@ -349,12 +349,12 @@ namespace MatterHackers.MeshVisualizer bool isSelected = parentSelected || scene.HasSelection && (object3D == scene.SelectedItem || scene.SelectedItem.Children.Contains(object3D)); - RGBA_Bytes drawColor = renderData.Color; - if (renderData.OutputType == PrintOutputTypes.Support) + RGBA_Bytes drawColor = renderData.WorldColor(); + if (renderData.WorldOutputType() == PrintOutputTypes.Support) { drawColor = new RGBA_Bytes(RGBA_Bytes.Yellow, 120); } - else if (renderData.OutputType == PrintOutputTypes.Hole) + else if (renderData.WorldOutputType() == PrintOutputTypes.Hole) { drawColor = new RGBA_Bytes(RGBA_Bytes.Gray, 120); } @@ -362,20 +362,23 @@ namespace MatterHackers.MeshVisualizer // check if we should be rendering materials (this overrides the other colors) if (this.RenderType == RenderTypes.Materials) { - drawColor = MatterialRendering.Color(renderData.MaterialIndex); + drawColor = MatterialRendering.Color(renderData.WorldMaterialIndex()); } if (drawColor.alpha == 255) { - GLHelper.Render(renderData.Mesh, drawColor, renderData.Matrix, RenderType, renderData.Matrix * World.ModelviewMatrix); + GLHelper.Render(renderData.Mesh, drawColor, renderData.WorldMatrix(), RenderType, renderData.WorldMatrix() * World.ModelviewMatrix); } else { - transparentMeshes.Add(new MeshRenderData(renderData.Mesh, - renderData.Matrix, - drawColor, - renderData.MaterialIndex, - renderData.OutputType)); + transparentMeshes.Add(new Object3D() + { + Mesh = renderData.Mesh, + Matrix = renderData.WorldMatrix(), + Color = drawColor, + MaterialIndex = renderData.WorldMaterialIndex(), + OutputType = renderData.WorldOutputType() + }); } if (isSelected && !tooBigForComplexSelection) @@ -390,7 +393,7 @@ namespace MatterHackers.MeshVisualizer } } - private void RenderNormals(MeshRenderData renderData) + private void RenderNormals(IObject3D renderData) { var frustum = World.GetClippingFrustum(); @@ -412,7 +415,7 @@ namespace MatterHackers.MeshVisualizer } } - private void RenderSelection(MeshRenderData renderData, Frustum frustum) + private void RenderSelection(IObject3D renderData, Frustum frustum) { var screenPosition = new Vector3[3]; GLHelper.PrepareFor3DLineRender(true); @@ -423,7 +426,7 @@ namespace MatterHackers.MeshVisualizer { if (meshEdge.GetNumFacesSharingEdge() == 2) { - var meshToView = renderData.Matrix * World.ModelviewMatrix; + var meshToView = renderData.WorldMatrix() * World.ModelviewMatrix; FaceEdge firstFaceEdge = meshEdge.firstFaceEdge; FaceEdge nextFaceEdge = meshEdge.firstFaceEdge.radialNextFaceEdge; @@ -438,8 +441,8 @@ namespace MatterHackers.MeshVisualizer if (firstTowards != nextTowards) { - var transformed1 = Vector3.Transform(meshEdge.VertexOnEnd[0].Position, renderData.Matrix); - var transformed2 = Vector3.Transform(meshEdge.VertexOnEnd[1].Position, renderData.Matrix); + var transformed1 = Vector3.Transform(meshEdge.VertexOnEnd[0].Position, renderData.WorldMatrix()); + var transformed2 = Vector3.Transform(meshEdge.VertexOnEnd[1].Position, renderData.WorldMatrix()); GLHelper.Render3DLineNoPrep(frustum, World, transformed1, transformed2, RGBA_Bytes.White, selectionHighlightWidth); } @@ -448,7 +451,7 @@ namespace MatterHackers.MeshVisualizer } else // just render the bounding box { - RenderAABB(frustum, renderData.Mesh.GetAxisAlignedBoundingBox(), renderData.Matrix, RGBA_Bytes.White, selectionHighlightWidth); + RenderAABB(frustum, renderData.Mesh.GetAxisAlignedBoundingBox(), renderData.WorldMatrix(), RGBA_Bytes.White, selectionHighlightWidth); } } @@ -471,7 +474,7 @@ namespace MatterHackers.MeshVisualizer public EditorType EditorMode { get; set; } = EditorType.Part; - private int BackToFrontXY(MeshRenderData a, MeshRenderData b) + private int BackToFrontXY(IObject3D a, IObject3D b) { var aCenterWorld = Vector3.Transform(a.Mesh.GetAxisAlignedBoundingBox().Center, a.Matrix); aCenterWorld.z = 0; // we only want to look at the distance on xy in world space @@ -486,7 +489,7 @@ namespace MatterHackers.MeshVisualizer private void Draw_GlOpaqueContent(object sender, DrawEventArgs e) { - List transparentMeshes = new List(); + List transparentMeshes = new List(); foreach (var object3D in scene.Children) { DrawObject(object3D, transparentMeshes, false, e); @@ -495,7 +498,7 @@ namespace MatterHackers.MeshVisualizer private void Draw_GlTransparentContent(object sender, DrawEventArgs e) { - List transparentMeshes = new List(); + List transparentMeshes = new List(); foreach (var object3D in scene.Children) { if (object3D.Visible) diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index 6e37f2af5..ae95e952c 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -2020,7 +2020,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow IVertex lowestVertex = null; Vector3 lowestVertexPosition = Vector3.Zero; - MeshRenderData itemToLayFlat = null; + IObject3D itemToLayFlat = null; // Process each child, checking for the lowest vertex var objectsToCheck = objectToLayFlat.VisibleMeshes(); @@ -2030,7 +2030,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow for (int testIndex = 0; testIndex < itemToCheck.Mesh.Vertices.Count; testIndex++) { var vertex = itemToCheck.Mesh.Vertices[testIndex]; - Vector3 vertexPosition = Vector3.Transform(vertex.Position, itemToCheck.Matrix); + Vector3 vertexPosition = Vector3.Transform(vertex.Position, itemToCheck.WorldMatrix()); if(firstVertex) { lowestVertex = itemToCheck.Mesh.Vertices[testIndex]; @@ -2459,7 +2459,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow GLMeshTrianglePlugin glMeshPlugin = GLMeshTrianglePlugin.Get(meshRenderData.Mesh, (faceEdge) => { Vector3 normal = faceEdge.ContainingFace.Normal; - normal = Vector3.TransformVector(normal, meshRenderData.Matrix).GetNormal(); + normal = Vector3.TransformVector(normal, meshRenderData.WorldMatrix()).GetNormal(); VertexColorData colorData = new VertexColorData(); double startColor = 223.0 / 360.0; diff --git a/Queue/OptionsMenu/PartsSheetCreator.cs b/Queue/OptionsMenu/PartsSheetCreator.cs index ed4da81a8..713b0ed2b 100644 --- a/Queue/OptionsMenu/PartsSheetCreator.cs +++ b/Queue/OptionsMenu/PartsSheetCreator.cs @@ -138,11 +138,11 @@ namespace MatterHackers.MatterControl var loadedMeshGroups = object3D.VisibleMeshes().ToList(); if (loadedMeshGroups?.Count > 0) { - AxisAlignedBoundingBox aabb = loadedMeshGroups[0].Mesh.GetAxisAlignedBoundingBox(loadedMeshGroups[0].Matrix); + AxisAlignedBoundingBox aabb = loadedMeshGroups[0].Mesh.GetAxisAlignedBoundingBox(loadedMeshGroups[0].WorldMatrix()); for (int i = 1; i < loadedMeshGroups.Count; i++) { - aabb = AxisAlignedBoundingBox.Union(aabb, loadedMeshGroups[i].Mesh.GetAxisAlignedBoundingBox(loadedMeshGroups[i].Matrix)); + aabb = AxisAlignedBoundingBox.Union(aabb, loadedMeshGroups[i].Mesh.GetAxisAlignedBoundingBox(loadedMeshGroups[i].WorldMatrix())); } RectangleDouble bounds2D = new RectangleDouble(aabb.minXYZ.x, aabb.minXYZ.y, aabb.maxXYZ.x, aabb.maxXYZ.y); @@ -169,7 +169,7 @@ namespace MatterHackers.MatterControl foreach (var meshGroup in loadedMeshGroups) { - PolygonMesh.Rendering.OrthographicZProjection.DrawTo(partGraphics2D, meshGroup.Mesh, meshGroup.Matrix, new Vector2(-bounds2D.Left + PartMarginMM, -bounds2D.Bottom + textSpaceMM + PartMarginMM), PixelPerMM, RGBA_Bytes.Black); + PolygonMesh.Rendering.OrthographicZProjection.DrawTo(partGraphics2D, meshGroup.Mesh, meshGroup.WorldMatrix(), new Vector2(-bounds2D.Left + PartMarginMM, -bounds2D.Bottom + textSpaceMM + PartMarginMM), PixelPerMM, RGBA_Bytes.Black); } partGraphics2D.Render(typeFacePrinter, RGBA_Bytes.Black); diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 0a95f55e7..9bde045b2 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 0a95f55e75773792ee7d9e5be709d73e6a615b35 +Subproject commit 9bde045b2a0b3de636833d29dc585440b16e55ec From 4d36657766e41ff1f6173c5d25291c94728bccd9 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Wed, 18 Oct 2017 12:09:33 -0700 Subject: [PATCH 2/2] Made difference use visible meshes --- PartPreviewWindow/View3D/DifferenceObject3D.cs | 5 +++-- Submodules/agg-sharp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/PartPreviewWindow/View3D/DifferenceObject3D.cs b/PartPreviewWindow/View3D/DifferenceObject3D.cs index fc6cd756d..ee1882c62 100644 --- a/PartPreviewWindow/View3D/DifferenceObject3D.cs +++ b/PartPreviewWindow/View3D/DifferenceObject3D.cs @@ -92,13 +92,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D bool first = true; // now wrap every first decendant that has a mesh - foreach (var child in this.Descendants().Where((o) => o.Mesh != null)) + foreach (var child in this.VisibleMeshes().Where((o) => o.Mesh != null)) { // wrap the child in a DifferenceItem child.Parent.Children.Modify((list) => { list.Remove(child); list.Add(new DifferenceItem(child, this.ID, !first)); + first = false; }); } @@ -111,7 +112,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D await Task.Run(() => { var container = this; - var participants = this.Descendants().Where((obj) => obj.OwnerID == this.ID); + var participants = this.VisibleMeshes().Where((obj) => obj.OwnerID == this.ID); var removeObjects = participants.Where((obj) => ((DifferenceItem)obj).OutputType == PrintOutputTypes.Hole); var keepObjects = participants.Where((obj) => ((DifferenceItem)obj).OutputType != PrintOutputTypes.Hole); diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 9bde045b2..44f6c6295 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 9bde045b2a0b3de636833d29dc585440b16e55ec +Subproject commit 44f6c62951eee2cd1e6140c37b6a005fe08cd01b