Working on getting the Object3DIterator working

This commit is contained in:
Lars Brubaker 2017-06-01 09:42:40 -07:00
parent 5a551e9fbe
commit 0e2b319348
2 changed files with 95 additions and 29 deletions

View file

@ -470,7 +470,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
};
buttonRightPanelHolder.Name = "buttonRightPanelHolder";
centerPartPreviewAndControls.AddChild(buttonRightPanelHolder);
buttonRightPanelDisabledCover = new GuiWidget()
{
HAnchor = HAnchor.ParentLeftRight,
@ -597,7 +597,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
public void SelectAll()
{
Scene.ClearSelection();
foreach(var child in Scene.Children)
foreach (var child in Scene.Children)
{
Scene.AddToSelection(child);
}
@ -606,7 +606,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
// TODO: Rename to DragDropItem
private IObject3D dragDropSource;
private IObject3D dragDropSource;
public IObject3D DragDropSource
{
get
@ -718,8 +718,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
UndoBuffer.Add(operation);
}
#region DoBooleanTest
Object3D booleanGroup;
#region DoBooleanTest
Object3D booleanGroup;
Vector3 offset = new Vector3();
Vector3 direction = new Vector3(.11, .12, .13);
Vector3 rotCurrent = new Vector3();
@ -757,7 +757,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
children.Add(booleanGroup);
});
}
catch(Exception e2)
catch (Exception e2)
{
string text = e2.Message;
int a = 0;
@ -801,14 +801,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
//offsetB = new Vector3(105.240172225344, 92.9716306394062, 18.4619570261172);
//rotCurrent = new Vector3(4.56890223673623, -2.67874102322035, 1.02768848238523);
//scaleCurrent = new Vector3(1.07853517569753, 0.964980885267323, 1.09290934544604);
Debug.WriteLine("t"+offsetB.ToString() + " r" + rotCurrent.ToString() + " s" + scaleCurrent.ToString() + " " + opp);
Debug.WriteLine("t" + offsetB.ToString() + " r" + rotCurrent.ToString() + " s" + scaleCurrent.ToString() + " " + opp);
Matrix4X4 transformB = Matrix4X4.CreateScale(scaleCurrent) * Matrix4X4.CreateRotation(rotCurrent) * Matrix4X4.CreateTranslation(offsetB);
boxB.Transform(transformB);
boxB.Transform(transformB);
Mesh meshToAdd = meshOpperation(boxA, boxB);
meshToAdd.CleanAndMergMesh();
if(aabbOpperation != null)
if (aabbOpperation != null)
{
AxisAlignedBoundingBox boundsA = boxA.GetAxisAlignedBoundingBox();
AxisAlignedBoundingBox boundsB = boxB.GetAxisAlignedBoundingBox();
@ -816,7 +816,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
AxisAlignedBoundingBox boundsResult = aabbOpperation(boundsA, boundsB);
if(!boundsAdd.Equals(boundsResult, .0001))
if (!boundsAdd.Equals(boundsResult, .0001))
{
int a = 0;
}
@ -833,13 +833,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
}
private void RemoveBooleanTestGeometry(object sender, DrawEventArgs e)
{
{
if (meshViewerWidget.Scene.Children.Contains(booleanGroup))
{
meshViewerWidget.Scene.Children.Remove(booleanGroup);
UiThread.RunOnIdle(() => Invalidate(), 1.0 / 30.0);
}
}
}
#endregion DoBooleanTest
public enum AutoRotate { Enabled, Disabled };
@ -918,7 +918,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
var meshViewerPosition = this.meshViewerWidget.TransformToScreenSpace(meshViewerWidget.LocalBounds);
// If the mouse is within this control
if (meshViewerPosition.Contains(screenSpaceMousePosition)
if (meshViewerPosition.Contains(screenSpaceMousePosition)
&& this.DragDropSource != null)
{
var localPosition = this.TransformFromParentSpace(topMostParent, screenSpaceMousePosition);
@ -1084,7 +1084,18 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
private void AfterDraw3DContent(object sender, DrawEventArgs e)
{
var xxx = new BvhIterator(Scene?.TraceData(), decentFilter: (x) =>
//RendereSceneTraceData(e);
//RenderSceneObjectData(e);
if (DragSelectionInProgress)
{
e.graphics2D.Rectangle(new RectangleDouble(DragSelectionStartPosition, DragSelectionEndPosition), RGBA_Bytes.Yellow);
}
}
private void RendereSceneTraceData(DrawEventArgs e)
{
var bvhIterator = new BvhIterator(Scene?.TraceData(), decentFilter: (x) =>
{
var center = x.Bvh.GetCenter();
var worldCenter = Vector3.Transform(center, x.TransformToWorld);
@ -1096,22 +1107,22 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
return false;
});
int count = xxx.Count();
int count = bvhIterator.Count();
foreach (var bvhAndTransform in xxx)
foreach (var subBvhIterator in bvhIterator)
{
for (int i = 0; i < 4; i++)
{
Vector3 bottomStartPosition = Vector3.Transform(bvhAndTransform.Bvh.GetAxisAlignedBoundingBox().GetBottomCorner(i), bvhAndTransform.TransformToWorld);
Vector3 bottomStartPosition = Vector3.Transform(subBvhIterator.Bvh.GetAxisAlignedBoundingBox().GetBottomCorner(i), subBvhIterator.TransformToWorld);
var bottomStartScreenPos = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(bottomStartPosition);
Vector3 bottomEndPosition = Vector3.Transform(bvhAndTransform.Bvh.GetAxisAlignedBoundingBox().GetBottomCorner((i + 1) % 4), bvhAndTransform.TransformToWorld);
Vector3 bottomEndPosition = Vector3.Transform(subBvhIterator.Bvh.GetAxisAlignedBoundingBox().GetBottomCorner((i + 1) % 4), subBvhIterator.TransformToWorld);
var bottomEndScreenPos = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(bottomEndPosition);
Vector3 topStartPosition = Vector3.Transform(bvhAndTransform.Bvh.GetAxisAlignedBoundingBox().GetTopCorner(i), bvhAndTransform.TransformToWorld);
Vector3 topStartPosition = Vector3.Transform(subBvhIterator.Bvh.GetAxisAlignedBoundingBox().GetTopCorner(i), subBvhIterator.TransformToWorld);
var topStartScreenPos = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(topStartPosition);
Vector3 topEndPosition = Vector3.Transform(bvhAndTransform.Bvh.GetAxisAlignedBoundingBox().GetTopCorner((i + 1) % 4), bvhAndTransform.TransformToWorld);
Vector3 topEndPosition = Vector3.Transform(subBvhIterator.Bvh.GetAxisAlignedBoundingBox().GetTopCorner((i + 1) % 4), subBvhIterator.TransformToWorld);
var topEndScreenPos = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(topEndPosition);
e.graphics2D.Line(bottomStartScreenPos, bottomEndScreenPos, RGBA_Bytes.Black);
@ -1119,13 +1130,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
e.graphics2D.Line(topStartScreenPos, bottomStartScreenPos, RGBA_Bytes.Black);
}
TriangleShape tri = bvhAndTransform.Bvh as TriangleShape;
TriangleShape tri = subBvhIterator.Bvh as TriangleShape;
if (tri != null)
{
for (int i = 0; i < 3; i++)
{
var vertexPos = tri.GetVertex(i);
var screenCenter = Vector3.Transform(vertexPos, bvhAndTransform.TransformToWorld);
var screenCenter = Vector3.Transform(vertexPos, subBvhIterator.TransformToWorld);
var screenPos = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(screenCenter);
e.graphics2D.Circle(screenPos, 3, RGBA_Bytes.Red);
@ -1133,17 +1144,72 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
}
else
{
var center = bvhAndTransform.Bvh.GetCenter();
var worldCenter = Vector3.Transform(center, bvhAndTransform.TransformToWorld);
var center = subBvhIterator.Bvh.GetCenter();
var worldCenter = Vector3.Transform(center, subBvhIterator.TransformToWorld);
var screenPos2 = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(worldCenter);
e.graphics2D.Circle(screenPos2, 3, RGBA_Bytes.Yellow);
e.graphics2D.DrawString($"{bvhAndTransform.Depth},", screenPos2.x + 12 * bvhAndTransform.Depth, screenPos2.y);
e.graphics2D.DrawString($"{subBvhIterator.Depth},", screenPos2.x + 12 * subBvhIterator.Depth, screenPos2.y);
}
}
}
if (DragSelectionInProgress)
private void RenderSceneObjectData(DrawEventArgs e)
{
var object3DIterator = new Object3DIterator(Scene, decentFilter: (x) =>
{
e.graphics2D.Rectangle(new RectangleDouble(DragSelectionStartPosition, DragSelectionEndPosition), RGBA_Bytes.Yellow);
var center = x.IObject3D.GetAxisAlignedBoundingBox(Matrix4X4.Identity).GetCenter();
var worldCenter = Vector3.Transform(center, Matrix4X4.Identity);
if (worldCenter.z > 0)
{
return true;
}
return false;
});
int count = object3DIterator.Count();
foreach (var subObject3DIterator in object3DIterator)
{
for (int i = 0; i < 4; i++)
{
Vector3 bottomStartPosition = Vector3.Transform(subObject3DIterator.IObject3D.GetAxisAlignedBoundingBox(Matrix4X4.Identity).GetBottomCorner(i), Matrix4X4.Identity);
var bottomStartScreenPos = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(bottomStartPosition);
Vector3 bottomEndPosition = Vector3.Transform(subObject3DIterator.IObject3D.GetAxisAlignedBoundingBox(Matrix4X4.Identity).GetBottomCorner((i + 1) % 4), Matrix4X4.Identity);
var bottomEndScreenPos = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(bottomEndPosition);
Vector3 topStartPosition = Vector3.Transform(subObject3DIterator.IObject3D.GetAxisAlignedBoundingBox(Matrix4X4.Identity).GetTopCorner(i), Matrix4X4.Identity);
var topStartScreenPos = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(topStartPosition);
Vector3 topEndPosition = Vector3.Transform(subObject3DIterator.IObject3D.GetAxisAlignedBoundingBox(Matrix4X4.Identity).GetTopCorner((i + 1) % 4), Matrix4X4.Identity);
var topEndScreenPos = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(topEndPosition);
e.graphics2D.Line(bottomStartScreenPos, bottomEndScreenPos, RGBA_Bytes.Black);
e.graphics2D.Line(topStartScreenPos, topEndScreenPos, RGBA_Bytes.Black);
e.graphics2D.Line(topStartScreenPos, bottomStartScreenPos, RGBA_Bytes.Black);
}
Mesh tri = subObject3DIterator.IObject3D.Mesh;
if (false)//tri != null)
{
for (int i = 0; i < 3; i++)
{
//var vertexPos = tri.GetVertex(i);
//var screenCenter = Vector3.Transform(vertexPos, bvhAndTransform.TransformToWorld);
//var screenPos = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(screenCenter);
//e.graphics2D.Circle(screenPos, 3, RGBA_Bytes.Red);
}
}
else
{
var center = subObject3DIterator.IObject3D.GetAxisAlignedBoundingBox(Matrix4X4.Identity).GetCenter();
var worldCenter = Vector3.Transform(center, Matrix4X4.Identity);
var screenPos2 = meshViewerWidget.TrackballTumbleWidget.GetScreenPosition(worldCenter);
e.graphics2D.Circle(screenPos2, 3, RGBA_Bytes.Yellow);
e.graphics2D.DrawString($"{subObject3DIterator.Depth},", screenPos2.x + 12 * subObject3DIterator.Depth, screenPos2.y);
}
}
}
@ -1218,7 +1284,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
// start a selection rect
DragSelectionStartPosition = mouseEvent.Position - OffsetToMeshViewerWidget();
DragSelectionEndPosition = DragSelectionStartPosition - OffsetToMeshViewerWidget();
DragSelectionEndPosition = DragSelectionStartPosition- OffsetToMeshViewerWidget();
DragSelectionInProgress = true;
}
else

@ -1 +1 @@
Subproject commit 58bc8a9c8237202efb94311c1e5a803e049cf15b
Subproject commit a2ae0372ea6c927eea97ea1344b0fd41b312dfe9