예제 #1
0
 public void Dispose(ProgMesh pm)
 {
     Debug.Assert(Face.Count == 0, "[ProgMeshVertex.destroy] face.size() == 0");
     while (Neighbor.Count > 0)
     {
         ProgMeshUtil.RemoveFillWithBack(Neighbor[0].Neighbor, this);
         ProgMeshUtil.RemoveFillWithBack(Neighbor, Neighbor[0]);
     }
     ProgMeshUtil.RemoveFillWithBack(pm.Vertices, this);
 }
예제 #2
0
        public void RemoveIfNonNeighbor(ProgMeshVertex n)
        {
            // removes n from neighbor Array if n isn't a neighbor.
            if (!Neighbor.Contains(n))
            {
                return;
            }

            foreach (var face in Face)
            {
                if (face.HasVertex(n))
                {
                    return;
                }
            }
            ProgMeshUtil.RemoveFillWithBack(Neighbor, n);
        }
        public void ReplaceVertex(ProgMeshVertex vOld, ProgMeshVertex vNew)
        {
            Debug.Assert(vOld != null && vNew != null, "[ProgMeshTriangle.ReplaceVertex] Arguments must not be null.");
            Debug.Assert(vOld == _vertex[0] || vOld == _vertex[1] || vOld == _vertex[2], "[ProgMeshTriangle.replaceVertex] vOld must not be included in this.vertex.");
            Debug.Assert(vNew != _vertex[0] && vNew != _vertex[1] && vNew != _vertex[2], "[ProgMeshTriangle.replaceVertex] vNew must not be included in this.vertex.");

            if (vOld == _vertex[0])
            {
                _vertex[0] = vNew;
            }
            else if (vOld == _vertex[1])
            {
                _vertex[1] = vNew;
            }
            else
            {
                Debug.Assert(vOld == _vertex[2], "[ProgMeshTriangle.ReplaceVertex] vOld == vertex[2]");
                _vertex[2] = vNew;
            }

            ProgMeshUtil.RemoveFillWithBack(vOld.Face, this);
            Debug.Assert(!vNew.Face.Contains(this), "[ProgMeshTriangle.ReplaceVertex] !Contains(vNew->face, this)");

            vNew.Face.Add(this);

            for (var i = 0; i < 3; i++)
            {
                vOld.RemoveIfNonNeighbor(_vertex[i]);
                _vertex[i].RemoveIfNonNeighbor(vOld);
            }

            for (var i = 0; i < 3; i++)
            {
                Debug.Assert(_vertex[i].Face.Count(f => f == this) == 1, "[ProgMeshTriangle.replaceVertex] Contains(vertex[i]->face, this) == 1");
                for (var j = 0; j < 3; j++)
                {
                    if (i != j)
                    {
                        ProgMeshUtil.AddUnique(_vertex[i].Neighbor, _vertex[j]);
                    }
                }
            }
            ComputeNormal();
        }
        public ProgMeshTriangle(ProgMeshVertex v0, ProgMeshVertex v1, ProgMeshVertex v2)
        {
            Debug.Assert(v0 != null && v1 != null && v2 != null, "[ProgMeshTriangle] Vertices must not be null.");
            Debug.Assert(v0 != v1 && v1 != v2 && v2 != v0, "[ProgMeshTriangle] Vertices must be different.");

            _vertex = new[] { v0, v1, v2 };
            ComputeNormal();

            for (var i = 0; i < 3; i++)
            {
                _vertex[i].Face.Add(this);
                for (var j = 0; j < 3; j++)
                {
                    if (i != j)
                    {
                        ProgMeshUtil.AddUnique(_vertex[i].Neighbor, _vertex[j]);
                    }
                }
            }
        }
        public void Dispose(ProgMesh pm)
        {
            ProgMeshUtil.RemoveFillWithBack(pm.Triangles, this);
            for (var i = 0; i < 3; i++)
            {
                if (_vertex[i] != null)
                {
                    ProgMeshUtil.RemoveFillWithBack(_vertex[i].Face, this);
                }
            }

            for (var i = 0; i < 3; i++)
            {
                var i2 = (i + 1) % 3;
                if (_vertex[i] != null && _vertex[i2] != null)
                {
                    _vertex[i].RemoveIfNonNeighbor(_vertex[i2]);
                    _vertex[i2].RemoveIfNonNeighbor(_vertex[i]);
                }
            }
        }