Have transparency working on subtract again
Fixed problem with objects moving during subtract
This commit is contained in:
parent
362c238686
commit
18e8453b10
4 changed files with 61 additions and 29 deletions
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue