Merge pull request #2565 from larsbrubaker/design_tools

Made difference use visible meshes
This commit is contained in:
Lars Brubaker 2017-10-18 13:47:05 -07:00 committed by GitHub
commit b4b3dfea9d
5 changed files with 38 additions and 38 deletions

View file

@ -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,14 +91,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
});
bool first = true;
// now wrap every decendant that has a mesh
foreach (var child in this.Descendants().Where((o) => o.Mesh != null))
// now wrap every first decendant that has a mesh
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));
list.Add(new DifferenceItem(child, this.ID, !first));
first = false;
});
}
@ -115,9 +112,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
await Task.Run(() =>
{
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 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);
if (removeObjects.Any()
&& keepObjects.Any())

View file

@ -318,7 +318,7 @@ namespace MatterHackers.MeshVisualizer
public bool IsActive { get; set; } = true;
private void DrawObject(IObject3D object3D, List<MeshRenderData> transparentMeshes, bool parentSelected, DrawEventArgs e)
private void DrawObject(IObject3D object3D, List<IObject3D> 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<MeshRenderData> transparentMeshes = new List<MeshRenderData>();
List<IObject3D> transparentMeshes = new List<IObject3D>();
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<MeshRenderData> transparentMeshes = new List<MeshRenderData>();
List<IObject3D> transparentMeshes = new List<IObject3D>();
foreach (var object3D in scene.Children)
{
if (object3D.Visible)

View file

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

View file

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

@ -1 +1 @@
Subproject commit 0a95f55e75773792ee7d9e5be709d73e6a615b35
Subproject commit 44f6c62951eee2cd1e6140c37b6a005fe08cd01b