コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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);
        }