Better selection rendering

refactoring
This commit is contained in:
Lars Brubaker 2017-08-23 17:51:38 -07:00
parent 6c7d341139
commit 0d728dc522
5 changed files with 41 additions and 12 deletions

View file

@ -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())

View file

@ -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();
};

View file

@ -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
{

View file

@ -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();