Merge pull request #2384 from larsbrubaker/design_tools

Better selection rendering
This commit is contained in:
johnlewin 2017-08-23 23:15:46 -07:00 committed by GitHub
commit acd53dc114
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();

@ -1 +1 @@
Subproject commit 85e2df1ab9985343453f3e0753c1e1fa3f3e19cc
Subproject commit 09c71c0d02dfa3af6871fe18f57c4fd07a104e61