diff --git a/PartPreviewWindow/View3D/BedMeshGenerator.cs b/PartPreviewWindow/View3D/BedMeshGenerator.cs index 7a941f4ff..7c6b261e7 100644 --- a/PartPreviewWindow/View3D/BedMeshGenerator.cs +++ b/PartPreviewWindow/View3D/BedMeshGenerator.cs @@ -122,7 +122,7 @@ namespace MatterHackers.MatterControl { foreach (Face face in printerBed.Faces) { - if (face.normal.z > 0) + if (face.Normal.z > 0) { face.SetTexture(0, bedplateImage); foreach (FaceEdge faceEdge in face.FaceEdges()) diff --git a/PartPreviewWindow/View3D/GeneralObject3DEditor.cs b/PartPreviewWindow/View3D/GeneralObject3DEditor.cs index d4de1987f..d9891548f 100644 --- a/PartPreviewWindow/View3D/GeneralObject3DEditor.cs +++ b/PartPreviewWindow/View3D/GeneralObject3DEditor.cs @@ -32,6 +32,7 @@ using MatterHackers.Agg; using MatterHackers.Agg.UI; using MatterHackers.DataConverters3D; using MatterHackers.Localizations; +using MatterHackers.PolygonMesh; namespace MatterHackers.MatterControl.PartPreviewWindow { @@ -91,6 +92,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow holeBehaviorButton.Click += (s, e) => { item.OutputType = PrintOutputTypes.Hole; + if(item.Mesh != null) + { + item.Mesh.FaceBspTree = FaceBspTree.Create(item.Mesh); + } + view3DWidget.Invalidate(); }; diff --git a/PartPreviewWindow/View3D/MeshViewerWidget.cs b/PartPreviewWindow/View3D/MeshViewerWidget.cs index ab9149465..0a36713f3 100644 --- a/PartPreviewWindow/View3D/MeshViewerWidget.cs +++ b/PartPreviewWindow/View3D/MeshViewerWidget.cs @@ -413,25 +413,48 @@ namespace MatterHackers.MeshVisualizer FaceEdge firstFaceEdge = meshEdge.firstFaceEdge; FaceEdge nextFaceEdge = meshEdge.firstFaceEdge.radialNextFaceEdge; // find out if one face is facing the camera and one is facing away - var vertexPosition = World.GetScreenSpace(Vector3.Transform(firstFaceEdge.FirstVertex.Position, renderData.Matrix)); - var firstNormal = World.GetScreenSpace(Vector3.Transform(firstFaceEdge.FirstVertex.Position + firstFaceEdge.ContainingFace.normal, renderData.Matrix)); - var nextNormal = World.GetScreenSpace(Vector3.Transform(firstFaceEdge.FirstVertex.Position + nextFaceEdge.ContainingFace.normal, renderData.Matrix)); + var worldVertexPosition = Vector3.Transform(firstFaceEdge.FirstVertex.Position, renderData.Matrix); + var worldFirstNormal = Vector3.TransformNormal(firstFaceEdge.ContainingFace.Normal, renderData.Matrix).GetNormal(); + var worldNextNormal = Vector3.TransformNormal(nextFaceEdge.ContainingFace.Normal, renderData.Matrix).GetNormal(); - var firstTowards = (firstNormal - vertexPosition).z < 0; - var nextTowards = (nextNormal - vertexPosition).z < 0; + var screenVertexPosition = World.GetScreenSpace(worldVertexPosition); + var screenFirstNormalEnd = World.GetScreenSpace(worldVertexPosition + worldFirstNormal); + var screenNextNormalEnd = World.GetScreenSpace(worldVertexPosition + worldNextNormal); + + var firstTowards = (screenFirstNormalEnd - screenVertexPosition).z < 0; + var nextTowards = (screenNextNormalEnd - screenVertexPosition).z < 0; if (firstTowards != nextTowards) { var transformed1 = Vector3.Transform(meshEdge.VertexOnEnd[0].Position, renderData.Matrix); var transformed2 = Vector3.Transform(meshEdge.VertexOnEnd[1].Position, renderData.Matrix); - for (int i = 0; i < 3; i++) - { - GLHelper.Render3DLineNoPrep(frustum, World, transformed1, transformed2, RGBA_Bytes.White, selectionHighlightWidth); - } + GLHelper.Render3DLineNoPrep(frustum, World, transformed1, transformed2, RGBA_Bytes.White, selectionHighlightWidth); } } } + + // render debug normals + bool renderNormal = false; + if (renderNormal) + { + foreach (var face in renderData.Mesh.Faces) + { + int vertexCount = 0; + Vector3 faceCenter = Vector3.Zero; + foreach (var vertex in face.Vertices()) + { + faceCenter += vertex.Position; + vertexCount++; + } + faceCenter /= vertexCount; + + var transformed1 = Vector3.Transform(faceCenter, renderData.Matrix); + var normal = Vector3.TransformNormal(face.Normal, renderData.Matrix).GetNormal(); + + GLHelper.Render3DLineNoPrep(frustum, World, transformed1, transformed1 + normal, RGBA_Bytes.Red, selectionHighlightWidth); + } + } } else // just render the bounding box { diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index 6f0051a48..1dd5a0526 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -2557,7 +2557,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow // change the color to be the right thing GLMeshTrianglePlugin glMeshPlugin = GLMeshTrianglePlugin.Get(meshRenderData.Mesh, (faceEdge) => { - Vector3 normal = faceEdge.ContainingFace.normal; + Vector3 normal = faceEdge.ContainingFace.Normal; normal = Vector3.TransformVector(normal, meshRenderData.Matrix).GetNormal(); VertexColorData colorData = new VertexColorData(); diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 85e2df1ab..09c71c0d0 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 85e2df1ab9985343453f3e0753c1e1fa3f3e19cc +Subproject commit 09c71c0d02dfa3af6871fe18f57c4fd07a104e61