Exemplo n.º 1
0
        protected MyNavigationTriangle AddTriangle(ref Vector3 A, ref Vector3 B, ref Vector3 C, ref int edgeAB, ref int edgeBC, ref int edgeCA)
        {
            MyNavigationTriangle userData = this.m_triPool.Allocate();
            int num           = ((0 + ((edgeAB == -1) ? 1 : 0)) + ((edgeBC == -1) ? 1 : 0)) + ((edgeCA == -1) ? 1 : 0);
            int triangleIndex = -1;

            if (num == 3)
            {
                triangleIndex = this.m_mesh.MakeNewTriangle(userData, ref A, ref B, ref C, out edgeAB, out edgeBC, out edgeCA);
            }
            else if (num == 2)
            {
                triangleIndex = (edgeAB == -1) ? ((edgeBC == -1) ? this.m_mesh.ExtrudeTriangleFromEdge(ref B, edgeCA, userData, out edgeAB, out edgeBC) : this.m_mesh.ExtrudeTriangleFromEdge(ref A, edgeBC, userData, out edgeCA, out edgeAB)) : this.m_mesh.ExtrudeTriangleFromEdge(ref C, edgeAB, userData, out edgeBC, out edgeCA);
            }
            else if (num == 1)
            {
                triangleIndex = (edgeAB != -1) ? ((edgeBC != -1) ? this.GetTriangleOneNewEdge(ref edgeCA, ref edgeAB, ref edgeBC, userData) : this.GetTriangleOneNewEdge(ref edgeBC, ref edgeCA, ref edgeAB, userData)) : this.GetTriangleOneNewEdge(ref edgeAB, ref edgeBC, ref edgeCA, userData);
            }
            else
            {
                MyWingedEdgeMesh.Edge other = this.m_mesh.GetEdge(edgeAB);
                MyWingedEdgeMesh.Edge edge  = this.m_mesh.GetEdge(edgeBC);
                MyWingedEdgeMesh.Edge edge3 = this.m_mesh.GetEdge(edgeCA);
                int sharedB = edge3.TryGetSharedVertex(ref other);
                int sharedC = other.TryGetSharedVertex(ref edge);
                int num5    = edge.TryGetSharedVertex(ref edge3);
                int num6    = ((0 + ((sharedB == -1) ? 0 : 1)) + ((sharedC == -1) ? 0 : 1)) + ((num5 == -1) ? 0 : 1);
                if (num6 == 3)
                {
                    triangleIndex = this.m_mesh.MakeFace(userData, edgeAB);
                }
                else if (num6 == 2)
                {
                    triangleIndex = (sharedB != -1) ? ((sharedC != -1) ? this.GetTriangleTwoSharedVertices(edgeCA, edgeAB, ref edgeBC, sharedB, sharedC, userData) : this.GetTriangleTwoSharedVertices(edgeBC, edgeCA, ref edgeAB, num5, sharedB, userData)) : this.GetTriangleTwoSharedVertices(edgeAB, edgeBC, ref edgeCA, sharedC, num5, userData);
                }
                else if (num6 == 1)
                {
                    triangleIndex = (sharedB == -1) ? ((sharedC == -1) ? this.GetTriangleOneSharedVertex(edgeBC, edgeCA, ref edgeAB, num5, userData) : this.GetTriangleOneSharedVertex(edgeAB, edgeBC, ref edgeCA, sharedC, userData)) : this.GetTriangleOneSharedVertex(edgeCA, edgeAB, ref edgeBC, sharedB, userData);
                }
                else
                {
                    int num7;
                    int num8;
                    triangleIndex = this.m_mesh.ExtrudeTriangleFromEdge(ref C, edgeAB, userData, out num7, out num8);
                    this.m_mesh.MergeEdges(num8, edgeCA);
                    this.m_mesh.MergeEdges(num7, edgeBC);
                }
            }
            userData.Init(this, triangleIndex);
            return(userData);
        }
Exemplo n.º 2
0
        private int GetTriangleOneNewEdge(ref int newEdge, ref int succ, ref int pred, MyNavigationTriangle newTri)
        {
            MyWingedEdgeMesh.Edge edge  = this.m_mesh.GetEdge(pred);
            MyWingedEdgeMesh.Edge other = this.m_mesh.GetEdge(succ);
            int vertex = edge.TryGetSharedVertex(ref other);

            if (vertex != -1)
            {
                int num3 = edge.OtherVertex(vertex);
                return(this.m_mesh.MakeEdgeFace(num3, other.OtherVertex(vertex), pred, succ, newTri, out newEdge));
            }
            int     num2           = succ;
            Vector3 vertexPosition = this.m_mesh.GetVertexPosition(other.GetFacePredVertex(-1));

            this.m_mesh.MergeEdges(num2, succ);
            return(this.m_mesh.ExtrudeTriangleFromEdge(ref vertexPosition, pred, newTri, out newEdge, out succ));
        }