Have transparency working on subtract again

Fixed problem with objects moving during subtract
This commit is contained in:
Lars Brubaker 2018-06-04 09:55:54 -07:00
parent 362c238686
commit 18e8453b10
4 changed files with 61 additions and 29 deletions

View file

@ -94,18 +94,17 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
double amountPerOperation = 1.0 / totalOperations;
double percentCompleted = 0;
foreach (var paint in paintObjects)
foreach (var paint in paintObjects.Select((r) => (obj3D: r, matrix: r.WorldMatrix())).ToList())
{
var transformedPaint = Mesh.Copy(paint.Mesh, cancellationToken);
transformedPaint.Transform(paint.WorldMatrix());
var inverseRemove = paint.WorldMatrix();
inverseRemove.Invert();
var transformedPaint = Mesh.Copy(paint.obj3D.Mesh, cancellationToken);
transformedPaint.Transform(paint.matrix);
var inverseRemove = paint.matrix.Inverted;
Mesh paintMesh = null;
foreach (var keep in keepObjects)
foreach (var keep in keepObjects.Select((r) => (obj3D: r, matrix: r.WorldMatrix())).ToList())
{
var transformedKeep = Mesh.Copy(keep.Mesh, cancellationToken);
transformedKeep.Transform(keep.WorldMatrix());
var transformedKeep = Mesh.Copy(keep.obj3D.Mesh, cancellationToken);
transformedKeep.Transform(keep.matrix);
// remove the paint from the original
var intersectAndSubtract = PolygonMesh.Csg.CsgOperations.IntersectAndSubtract(transformedKeep, transformedPaint, (status, progress0To1) =>
@ -117,10 +116,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
progressStatus.Progress0To1 = percentCompleted + amountPerOperation * progress0To1;
reporter?.Report(progressStatus);
}, cancellationToken);
var inverseKeep = keep.WorldMatrix();
inverseKeep.Invert();
var inverseKeep = keep.matrix.Inverted;
intersectAndSubtract.subtract.Transform(inverseKeep);
keep.Mesh = intersectAndSubtract.subtract;
keep.obj3D.Mesh = intersectAndSubtract.subtract;
// keep all the intersections together
if (paintMesh == null)
@ -141,12 +139,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
// move the paint mesh back to its original coordinates
paintMesh.Transform(inverseRemove);
paint.Mesh = paintMesh;
paint.obj3D.Mesh = paintMesh;
paint.Color = paint.WorldColor().AdjustContrast(keepObjects.First().WorldColor(), 2).ToColor();
// now set it to the new solid color
paint.OutputType = PrintOutputTypes.Solid;
paint.obj3D.Color = paint.obj3D.WorldColor().AdjustContrast(keepObjects.First().WorldColor(), 2).ToColor();
}
}

View file

@ -33,6 +33,7 @@ using MatterHackers.DataConverters3D;
using MatterHackers.Localizations;
using MatterHackers.MatterControl.DesignTools;
using MatterHackers.PolygonMesh;
using MatterHackers.VectorMath;
using System;
using System.Collections.Generic;
using System.Linq;
@ -65,19 +66,19 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
double percentCompleted = 0;
ProgressStatus progressStatus = new ProgressStatus();
foreach (var remove in removeObjects)
foreach (var remove in removeObjects.Select((r) => (obj3D: r, matrix: r.WorldMatrix())).ToList())
{
foreach (var keep in keepObjects)
foreach (var keep in keepObjects.Select((r) => (obj3D: r, matrix: r.WorldMatrix())).ToList())
{
progressStatus.Status = "Copy Remove";
reporter?.Report(progressStatus);
var transformedRemove = Mesh.Copy(remove.Mesh, cancellationToken);
transformedRemove.Transform(remove.WorldMatrix());
var transformedRemove = Mesh.Copy(remove.obj3D.Mesh, cancellationToken);
transformedRemove.Transform(remove.matrix);
progressStatus.Status = "Copy Keep";
reporter?.Report(progressStatus);
var transformedKeep = Mesh.Copy(keep.Mesh, cancellationToken);
transformedKeep.Transform(keep.WorldMatrix());
var transformedKeep = Mesh.Copy(keep.obj3D.Mesh, cancellationToken);
transformedKeep.Transform(keep.matrix);
progressStatus.Status = "Do CSG";
reporter?.Report(progressStatus);
@ -90,20 +91,19 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
progressStatus.Progress0To1 = percentCompleted + amountPerOperation * progress0To1;
reporter?.Report(progressStatus);
}, cancellationToken);
var inverse = keep.WorldMatrix();
inverse.Invert();
var inverse = keep.matrix.Inverted;
transformedKeep.Transform(inverse);
keep.SuspendRebuild();
keep.Mesh = transformedKeep;
keep.ResumeRebuild();
keep.obj3D.SuspendRebuild();
keep.obj3D.Mesh = transformedKeep;
keep.obj3D.ResumeRebuild();
percentCompleted += amountPerOperation;
progressStatus.Progress0To1 = percentCompleted;
reporter?.Report(progressStatus);
}
remove.Visible = false;
remove.obj3D.Visible = false;
}
}
}