private SliceResult SliceMesh(Material sectionViewMaterial) { Profiler.BeginSample("SliceMesh"); var planeInverted = new Plane(-_plane.normal, -_plane.distance); bool skipIfNotClosed = Configuration == null ? false : Configuration.SkipIfNotClosed; BzMeshDataEditor meshEditorNeg = new BzMeshDataEditor(_meshDataNeg, _plane, _adapter, skipIfNotClosed); BzMeshDataEditor meshEditorPos = new BzMeshDataEditor(_meshDataPos, planeInverted, _adapter, skipIfNotClosed); for (int subMeshIndex = 0; subMeshIndex < _subMeshes.Length; ++subMeshIndex) { int[] newTriangles = _subMeshes[subMeshIndex]; int trCount = newTriangles.Length / 3; var trianglesNeg = new List <BzTriangle>(trCount); var trianglesPos = new List <BzTriangle>(trCount); var trianglesNegSliced = new List <BzTriangle>(trCount / 10); var trianglesPosSliced = new List <BzTriangle>(trCount / 10); for (int i = 0; i < trCount; ++i) { int trIndex = i * 3; var bzTriangle = new BzTriangle( newTriangles[trIndex + 0], newTriangles[trIndex + 1], newTriangles[trIndex + 2]); Vector3 v1 = _adapter.GetWorldPos(bzTriangle.i1); Vector3 v2 = _adapter.GetWorldPos(bzTriangle.i2); Vector3 v3 = _adapter.GetWorldPos(bzTriangle.i3); bool side1 = _plane.GetSide(v1); bool side2 = _plane.GetSide(v2); bool side3 = _plane.GetSide(v3); bool PosSide = side1 | side2 | side3; bool NegSide = !side1 | !side2 | !side3; if (NegSide & PosSide) { bzTriangle.DivideByPlane( meshEditorNeg, meshEditorPos, trianglesNegSliced, trianglesPosSliced, side1, side2, side3); } else if (NegSide) { trianglesNeg.Add(bzTriangle); } else if (PosSide) { trianglesPos.Add(bzTriangle); } else { throw new InvalidOperationException(); } } MeshTriangleOptimizer.OptimizeEdgeTriangles(meshEditorNeg.GetEdgeLoopsByIndex(), _meshDataNeg, trianglesNegSliced); MeshTriangleOptimizer.OptimizeEdgeTriangles(meshEditorPos.GetEdgeLoopsByIndex(), _meshDataPos, trianglesPosSliced); _meshDataNeg.SubMeshes[subMeshIndex] = MakeTriangleToList(trianglesNeg, trianglesNegSliced); _meshDataPos.SubMeshes[subMeshIndex] = MakeTriangleToList(trianglesPos, trianglesPosSliced); } CapsNeg = meshEditorNeg.CapSlice(sectionViewMaterial); CapsPos = meshEditorPos.CapSlice(sectionViewMaterial); meshEditorNeg.DeleteUnusedVertices(); meshEditorPos.DeleteUnusedVertices(); Profiler.EndSample(); if (!CheckNewMesh(_meshDataNeg)) { return(SliceResult.Pos); } if (!CheckNewMesh(_meshDataPos)) { return(SliceResult.Neg); } return(SliceResult.Sliced); }
public void BigAngle(bool mirror) { // 0 1 2 // --|-----|.-------------------------|-- // \ \ *._ / // \ \ *._ / // \ \ *._ / // \ \ *._ / // \ \ *._ / // \ \ *_ / // \ \ | 3 // \ \ | // \ \ | // \ \ | // \ \ | // \ \ | // \\| // -----*----- // 4 //Arrange float m = mirror ? -1f : 1f; var vertices = new Vector3[] { new Vector3(m * -10, 0, 0), new Vector3(m * -5, 0, 0), new Vector3(m * 10, 0, 0), new Vector3(0, -1, 0), new Vector3(0, -5, 0), }; List <BzTriangle> trianglesSliced = new List <BzTriangle>(); trianglesSliced.Add(GetOrder(new BzTriangle(0, 1, 4), mirror)); trianglesSliced.Add(GetOrder(new BzTriangle(1, 3, 4), mirror)); trianglesSliced.Add(GetOrder(new BzTriangle(1, 2, 3), mirror)); var mesh = new Mesh(); mesh.vertices = vertices; var meshData = new BzMeshData(mesh, null); var linkedLoops = new LinkedList <LinkedLoop <int> >(); var linkedLoop = new LinkedLoop <int>(); linkedLoops.AddLast(linkedLoop); if (mirror) { linkedLoop.AddLast(0); linkedLoop.AddLast(1); linkedLoop.AddLast(2); } else { linkedLoop.AddLast(2); linkedLoop.AddLast(1); linkedLoop.AddLast(0); } //Act MeshTriangleOptimizer.OptimizeEdgeTriangles(linkedLoops, meshData, trianglesSliced); //Assert Assert.AreEqual(2, trianglesSliced.Count); var tr1 = trianglesSliced[0]; var tr2 = trianglesSliced[1]; bool case1 = TrAreEqual(tr1, GetOrder(new BzTriangle(0, 2, 3), mirror)) && TrAreEqual(tr2, GetOrder(new BzTriangle(0, 3, 4), mirror)); bool case2 = TrAreEqual(tr1, GetOrder(new BzTriangle(0, 3, 4), mirror)) && TrAreEqual(tr2, GetOrder(new BzTriangle(0, 2, 3), mirror)); Assert.That(case1 ^ case2); }
public void DiffDirections(bool diffDir) { // 1 4 2 // |--------|--------| // | |\ | // | t0 | | t3 | // | || \ | // | / | | | // | / | \ | // | | | | | // | / | \ | // | / | | | // | | | \ | // | / t1| t2 | | // | / | \ | // | | | | | // |/_______|_ | | // 0 5 `"--..\| // 3 //Arrange var vertices = new Vector3[] { new Vector3(-10, -10, 0), new Vector3(-10, 10, 0), new Vector3(10, 10, 0), new Vector3(10, diffDir ? -15 : -10, 0), new Vector3(0, 10, 0), // 4 new Vector3(0, -10, 0), // 5 }; List <BzTriangle> trianglesSliced = new List <BzTriangle>(); trianglesSliced.Add(new BzTriangle(1, 4, 0)); trianglesSliced.Add(new BzTriangle(4, 5, 0)); trianglesSliced.Add(new BzTriangle(4, 3, 5)); trianglesSliced.Add(new BzTriangle(4, 2, 3)); var mesh = new Mesh(); mesh.vertices = vertices; var meshData = new BzMeshData(mesh, null); var linkedLoops = new LinkedList <LinkedLoop <int> >(); var linkedLoop = new LinkedLoop <int>(); linkedLoops.AddLast(linkedLoop); linkedLoop.AddLast(2); linkedLoop.AddLast(4); linkedLoop.AddLast(1); //Act MeshTriangleOptimizer.OptimizeEdgeTriangles(linkedLoops, meshData, trianglesSliced); //Assert if (diffDir) { Assert.That(trianglesSliced.Count >= 3); } else { Assert.AreEqual(2, trianglesSliced.Count); } }
public void Optimize() { // 1 4 5 2 // |--------*-----------|--------| // | | \ \ | // | t0 / \ t3 | t4 | // | | | \ \ | // | / | \ \ | // | / \ \ | | // | | | \ \ | // | / | \ \ | // | / \ \ | | // | | | \ \ | // | / t1 | t2 \ \ | // | / \ \ | | // | | | \\ | // |/___________|_______________\| // 0 6 3 //Arrange var vertices = new Vector3[] { new Vector3(-10, -10, 0), new Vector3(-10, 10, 0), new Vector3(10, 10, 0), new Vector3(10, -10, 0), new Vector3(-5, 10, 0), // 4 new Vector3(5, 10, 0), // 5 new Vector3(0, -10, 0), // 6 }; List <BzTriangle> trianglesSliced = new List <BzTriangle>(); trianglesSliced.Add(new BzTriangle(1, 4, 0)); trianglesSliced.Add(new BzTriangle(4, 6, 0)); trianglesSliced.Add(new BzTriangle(4, 3, 6)); trianglesSliced.Add(new BzTriangle(4, 5, 3)); trianglesSliced.Add(new BzTriangle(5, 2, 3)); var mesh = new Mesh(); mesh.vertices = vertices; var meshData = new BzMeshData(mesh, null); var linkedLoops = new LinkedList <LinkedLoop <int> >(); var linkedLoop = new LinkedLoop <int>(); linkedLoops.AddLast(linkedLoop); linkedLoop.AddLast(2); linkedLoop.AddLast(5); linkedLoop.AddLast(4); linkedLoop.AddLast(1); //Act MeshTriangleOptimizer.OptimizeEdgeTriangles(linkedLoops, meshData, trianglesSliced); //Assert Assert.AreEqual(2, trianglesSliced.Count); var tr1 = trianglesSliced[0]; var tr2 = trianglesSliced[1]; bool case1 = TrAreEqual(tr1, new BzTriangle(1, 2, 0)) && TrAreEqual(tr2, new BzTriangle(1, 3, 0)); bool case2 = TrAreEqual(tr1, new BzTriangle(1, 2, 0)) && TrAreEqual(tr2, new BzTriangle(2, 3, 0)); Assert.That(case1 ^ case2); }