Esempio n. 1
0
        public void Check()
        {
            MeshUtils.Edge e;

            MeshUtils.Face fPrev = _fHead, f;
            for (fPrev = _fHead; (f = fPrev._next) != _fHead; fPrev = f)
            {
                e = f._anEdge;
                do
                {
                    Debug.Assert(e._Sym != e);
                    Debug.Assert(e._Sym._Sym == e);
                    Debug.Assert(e._Lnext._Onext._Sym == e);
                    Debug.Assert(e._Onext._Sym._Lnext == e);
                    Debug.Assert(e._Lface == f);
                    e = e._Lnext;
                } while (e != f._anEdge);
            }
            Debug.Assert(f._prev == fPrev && f._anEdge == null);

            MeshUtils.Vertex vPrev = _vHead, v;
            for (vPrev = _vHead; (v = vPrev._next) != _vHead; vPrev = v)
            {
                Debug.Assert(v._prev == vPrev);
                e = v._anEdge;
                do
                {
                    Debug.Assert(e._Sym != e);
                    Debug.Assert(e._Sym._Sym == e);
                    Debug.Assert(e._Lnext._Onext._Sym == e);
                    Debug.Assert(e._Onext._Sym._Lnext == e);
                    Debug.Assert(e._Org == v);
                    e = e._Onext;
                } while (e != v._anEdge);
            }
            Debug.Assert(v._prev == vPrev && v._anEdge == null);

            MeshUtils.Edge ePrev = _eHead;
            for (ePrev = _eHead; (e = ePrev._next) != _eHead; ePrev = e)
            {
                Debug.Assert(e._Sym._next == ePrev._Sym);
                Debug.Assert(e._Sym != e);
                Debug.Assert(e._Sym._Sym == e);
                Debug.Assert(e._Org != null);
                Debug.Assert(e._Dst != null);
                Debug.Assert(e._Lnext._Onext._Sym == e);
                Debug.Assert(e._Onext._Sym._Lnext == e);
            }
            Debug.Assert(e._Sym._next == ePrev._Sym &&
                         e._Sym == _eHeadSym &&
                         e._Sym._Sym == e &&
                         e._Org == null && e._Dst == null &&
                         e._Lface == null && e._Rface == null);
        }
Esempio n. 2
0
 private void DiscardExterior()
 {
     MeshUtils.Face next;
     for (MeshUtils.Face face = _mesh._fHead._next; face != _mesh._fHead; face = next)
     {
         next = face._next;
         if (!face._inside)
         {
             _mesh.ZapFace(face);
         }
     }
 }
Esempio n. 3
0
 private void TessellateInterior()
 {
     MeshUtils.Face next;
     for (MeshUtils.Face face = _mesh._fHead._next; face != _mesh._fHead; face = next)
     {
         next = face._next;
         if (face._inside)
         {
             TessellateMonoRegion(face);
         }
     }
 }
Esempio n. 4
0
        /// <summary>
        /// Destroys a face and removes it from the global face list. All edges of
        /// fZap will have a NULL pointer as their left face. Any edges which
        /// also have a NULL pointer as their right face are deleted entirely
        /// (along with any isolated vertices this produces).
        /// An entire mesh can be deleted by zapping its faces, one at a time,
        /// in any order. Zapped faces cannot be used in further mesh operations!
        /// </summary>
        public void ZapFace(IPool pool, MeshUtils.Face fZap)
        {
            var eStart = fZap._anEdge;

            // walk around face, deleting edges whose right face is also NULL
            var eNext = eStart._Lnext;

            MeshUtils.Edge e, eSym;
            do
            {
                e     = eNext;
                eNext = e._Lnext;

                e._Lface = null;
                if (e._Rface == null)
                {
                    // delete the edge -- see TESSmeshDelete above

                    if (e._Onext == e)
                    {
                        MeshUtils.KillVertex(pool, e._Org, null);
                    }
                    else
                    {
                        // Make sure that e._Org points to a valid half-edge
                        e._Org._anEdge = e._Onext;
                        MeshUtils.Splice(e, e._Oprev);
                    }
                    eSym = e._Sym;
                    if (eSym._Onext == eSym)
                    {
                        MeshUtils.KillVertex(pool, eSym._Org, null);
                    }
                    else
                    {
                        // Make sure that eSym._Org points to a valid half-edge
                        eSym._Org._anEdge = eSym._Onext;
                        MeshUtils.Splice(eSym, eSym._Oprev);
                    }
                    MeshUtils.KillEdge(pool, e);
                }
            } while (e != eStart);

            /* delete from circular doubly-linked list */
            var fPrev = fZap._prev;
            var fNext = fZap._next;

            fNext._prev = fPrev;
            fPrev._next = fNext;

            pool.Return(fZap);
        }
Esempio n. 5
0
 private void RemoveDegenerateFaces()
 {
     MeshUtils.Face next;
     for (MeshUtils.Face face = _mesh._fHead._next; face != _mesh._fHead; face = next)
     {
         next = face._next;
         MeshUtils.Edge anEdge = face._anEdge;
         if (anEdge._Lnext._Lnext == anEdge)
         {
             Geom.AddWinding(anEdge._Onext, anEdge);
             _mesh.Delete(anEdge);
         }
     }
 }
Esempio n. 6
0
        private void OutputContours()
        {
            int num  = 0;
            int num2 = 0;

            _vertexCount  = 0;
            _elementCount = 0;
            for (MeshUtils.Face next = _mesh._fHead._next; next != _mesh._fHead; next = next._next)
            {
                if (next._inside)
                {
                    MeshUtils.Edge edge;
                    MeshUtils.Edge edge2 = edge = next._anEdge;
                    do
                    {
                        _vertexCount++;
                        edge = edge._Lnext;
                    }while (edge != edge2);
                    _elementCount++;
                }
            }
            _elements = new int[_elementCount * 2];
            _vertices = new ContourVertex[_vertexCount];
            int num3 = 0;
            int num4 = 0;

            num = 0;
            for (MeshUtils.Face next = _mesh._fHead._next; next != _mesh._fHead; next = next._next)
            {
                if (next._inside)
                {
                    num2 = 0;
                    MeshUtils.Edge edge;
                    MeshUtils.Edge edge2 = edge = next._anEdge;
                    do
                    {
                        _vertices[num3].Position = edge._Org._coords;
                        _vertices[num3].Data     = edge._Org._data;
                        num3++;
                        num2++;
                        edge = edge._Lnext;
                    }while (edge != edge2);
                    _elements[num4++] = num;
                    _elements[num4++] = num2;
                    num += num2;
                }
            }
        }
Esempio n. 7
0
        public Mesh()
        {
            var v = _vHead = new MeshUtils.Vertex();
            var f = _fHead = new MeshUtils.Face();

            var pair = MeshUtils.EdgePair.Create();
            var e = _eHead = pair._e;
            var eSym = _eHeadSym = pair._eSym;

            v._next = v._prev = v;
            f._next = f._prev = f;

            e._next = e;
            e._Sym = eSym;

            eSym._next = eSym;
            eSym._Sym = e;
        }
Esempio n. 8
0
 public void ZapFace(MeshUtils.Face fZap)
 {
     MeshUtils.Edge anEdge = fZap._anEdge;
     MeshUtils.Edge lnext  = anEdge._Lnext;
     MeshUtils.Edge edge;
     do
     {
         edge        = lnext;
         lnext       = edge._Lnext;
         edge._Lface = null;
         if (edge._Rface == null)
         {
             if (edge._Onext == edge)
             {
                 MeshUtils.KillVertex(edge._Org, null);
             }
             else
             {
                 edge._Org._anEdge = edge._Onext;
                 MeshUtils.Edge edge2 = edge;
                 MeshUtils.Splice(edge2, edge2._Oprev);
             }
             MeshUtils.Edge sym = edge._Sym;
             if (sym._Onext == sym)
             {
                 MeshUtils.KillVertex(sym._Org, null);
             }
             else
             {
                 sym._Org._anEdge = sym._Onext;
                 MeshUtils.Edge edge3 = sym;
                 MeshUtils.Splice(edge3, edge3._Oprev);
             }
             MeshUtils.KillEdge(edge);
         }
     }while (edge != anEdge);
     MeshUtils.Face prev = fZap._prev;
     MeshUtils.Face next = fZap._next;
     next._prev = prev;
     prev._next = next;
     fZap.Free();
 }
Esempio n. 9
0
        private void CheckOrientation()
        {
            float num = 0f;

            for (MeshUtils.Face next = _mesh._fHead._next; next != _mesh._fHead; next = next._next)
            {
                if (next._anEdge._winding > 0)
                {
                    num += MeshUtils.FaceArea(next);
                }
            }
            if (num < 0f)
            {
                for (MeshUtils.Vertex next2 = _mesh._vHead._next; next2 != _mesh._vHead; next2 = next2._next)
                {
                    MeshUtils.Vertex vertex = next2;
                    vertex._t = 0f - vertex._t;
                }
                Vec3.Neg(ref _tUnit);
            }
        }
Esempio n. 10
0
 private void TessellateMonoRegion(MeshUtils.Face face)
 {
     MeshUtils.Edge edge = face._anEdge;
     while (Geom.VertLeq(edge._Dst, edge._Org))
     {
         edge = edge._Lprev;
     }
     while (Geom.VertLeq(edge._Org, edge._Dst))
     {
         edge = edge._Lnext;
     }
     MeshUtils.Edge edge2 = edge._Lprev;
     while (edge._Lnext != edge2)
     {
         if (Geom.VertLeq(edge._Dst, edge2._Org))
         {
             while (edge2._Lnext != edge && (Geom.EdgeGoesLeft(edge2._Lnext) || Geom.EdgeSign(edge2._Org, edge2._Dst, edge2._Lnext._Dst) <= 0f))
             {
                 edge2 = _mesh.Connect(edge2._Lnext, edge2)._Sym;
             }
             edge2 = edge2._Lprev;
         }
         else
         {
             while (edge2._Lnext != edge && (Geom.EdgeGoesRight(edge._Lprev) || Geom.EdgeSign(edge._Dst, edge._Org, edge._Lprev._Org) >= 0f))
             {
                 Mesh           mesh  = _mesh;
                 MeshUtils.Edge edge3 = edge;
                 edge = mesh.Connect(edge3, edge3._Lprev)._Sym;
             }
             edge = edge._Lnext;
         }
     }
     while (edge2._Lnext._Lnext != edge)
     {
         edge2 = _mesh.Connect(edge2._Lnext, edge2)._Sym;
     }
 }
Esempio n. 11
0
        public void Reset(IPool pool)
        {
            for (MeshUtils.Face f = _fHead, fNext = _fHead; f._next != null; f = fNext)
            {
                fNext = f._next;
                pool.Return(f);
            }
            for (MeshUtils.Vertex v = _vHead, vNext = _vHead; v._next != null; v = vNext)
            {
                vNext = v._next;
                pool.Return(v);
            }
            for (MeshUtils.Edge e = _eHead, eNext = _eHead; e._next != null; e = eNext)
            {
                eNext = e._next;
                pool.Return(e._Sym);
                pool.Return(e);
            }

            _vHead = null;
            _fHead = null;
            _eHead = _eHeadSym = null;
        }
Esempio n. 12
0
        public Mesh()
        {
            var v = _vHead = MeshUtils.Vertex.Create();
            var f = _fHead = MeshUtils.Face.Create();

            var pair = MeshUtils.EdgePair.Create();
            var e    = _eHead = pair._e;
            var eSym = _eHeadSym = pair._eSym;

            v._next   = v._prev = v;
            v._anEdge = null;

            f._next   = f._prev = f;
            f._anEdge = null;
            f._trail  = null;
            f._marked = false;
            f._inside = false;

            e._next         = e;
            e._Sym          = eSym;
            e._Onext        = null;
            e._Lnext        = null;
            e._Org          = null;
            e._Lface        = null;
            e._winding      = 0;
            e._activeRegion = null;

            eSym._next         = eSym;
            eSym._Sym          = e;
            eSym._Onext        = null;
            eSym._Lnext        = null;
            eSym._Org          = null;
            eSym._Lface        = null;
            eSym._winding      = 0;
            eSym._activeRegion = null;
        }
Esempio n. 13
0
File: Mesh.cs Progetto: D021/ink
        public Mesh()
        {
            var v = _vHead = new MeshUtils.Vertex();
            var f = _fHead = new MeshUtils.Face();

            var pair = MeshUtils.EdgePair.Create();
            var e = _eHead = pair._e;
            var eSym = _eHeadSym = pair._eSym;

            v._next = v._prev = v;
            v._anEdge = null;

            f._next = f._prev = f;
            f._anEdge = null;
            f._trail = null;
            f._marked = false;
            f._inside = false;

            e._next = e;
            e._Sym = eSym;
            e._Onext = null;
            e._Lnext = null;
            e._Org = null;
            e._Lface = null;
            e._winding = 0;
            e._activeRegion = null;

            eSym._next = eSym;
            eSym._Sym = e;
            eSym._Onext = null;
            eSym._Lnext = null;
            eSym._Org = null;
            eSym._Lface = null;
            eSym._winding = 0;
            eSym._activeRegion = null;
        }
Esempio n. 14
0
        public Mesh()
        {
            MeshUtils.Vertex vertex = _vHead = MeshUtils.Pooled <MeshUtils.Vertex> .Create();

            MeshUtils.Face face = _fHead = MeshUtils.Pooled <MeshUtils.Face> .Create();

            MeshUtils.EdgePair edgePair = MeshUtils.EdgePair.Create();
            MeshUtils.Edge     edge     = _eHead = edgePair._e;
            MeshUtils.Edge     edge2    = _eHeadSym = edgePair._eSym;
            vertex._next   = (vertex._prev = vertex);
            vertex._anEdge = null;
            MeshUtils.Face face2 = face;
            face2._next  = (face2._prev = face2);
            face._anEdge = null;
            face._trail  = null;
            face._marked = false;
            face._inside = false;
            MeshUtils.Edge edge3 = edge;
            edge3._next        = edge3;
            edge._Sym          = edge2;
            edge._Onext        = null;
            edge._Lnext        = null;
            edge._Org          = null;
            edge._Lface        = null;
            edge._winding      = 0;
            edge._activeRegion = null;
            MeshUtils.Edge edge4 = edge2;
            edge4._next         = edge4;
            edge2._Sym          = edge;
            edge2._Onext        = null;
            edge2._Lnext        = null;
            edge2._Org          = null;
            edge2._Lface        = null;
            edge2._winding      = 0;
            edge2._activeRegion = null;
        }
Esempio n. 15
0
        private void OutputPolymesh(ElementType elementType, int polySize)
        {
            int num  = 0;
            int num2 = 0;

            if (polySize < 3)
            {
                polySize = 3;
            }
            if (polySize > 3)
            {
                _mesh.MergeConvexFaces(polySize);
            }
            for (MeshUtils.Vertex next = _mesh._vHead._next; next != _mesh._vHead; next = next._next)
            {
                next._n = -1;
            }
            for (MeshUtils.Face next2 = _mesh._fHead._next; next2 != _mesh._fHead; next2 = next2._next)
            {
                next2._n = -1;
                if (next2._inside && (!NoEmptyPolygons || !(Math.Abs(MeshUtils.FaceArea(next2)) < 1.401298E-45f)))
                {
                    MeshUtils.Edge edge = next2._anEdge;
                    int            num3 = 0;
                    do
                    {
                        MeshUtils.Vertex next = edge._Org;
                        if (next._n == -1)
                        {
                            next._n = num2;
                            num2++;
                        }
                        num3++;
                        edge = edge._Lnext;
                    }while (edge != next2._anEdge);
                    next2._n = num;
                    num++;
                }
            }
            _elementCount = num;
            if (elementType == ElementType.ConnectedPolygons)
            {
                num *= 2;
            }
            _elements    = new int[num * polySize];
            _vertexCount = num2;
            _vertices    = new ContourVertex[_vertexCount];
            for (MeshUtils.Vertex next = _mesh._vHead._next; next != _mesh._vHead; next = next._next)
            {
                if (next._n != -1)
                {
                    _vertices[next._n].Position = next._coords;
                    _vertices[next._n].Data     = next._data;
                }
            }
            int num4 = 0;

            for (MeshUtils.Face next2 = _mesh._fHead._next; next2 != _mesh._fHead; next2 = next2._next)
            {
                if (next2._inside && (!NoEmptyPolygons || !(Math.Abs(MeshUtils.FaceArea(next2)) < 1.401298E-45f)))
                {
                    MeshUtils.Edge edge = next2._anEdge;
                    int            num3 = 0;
                    do
                    {
                        MeshUtils.Vertex next = edge._Org;
                        _elements[num4++] = next._n;
                        num3++;
                        edge = edge._Lnext;
                    }while (edge != next2._anEdge);
                    for (int i = num3; i < polySize; i++)
                    {
                        _elements[num4++] = -1;
                    }
                    if (elementType == ElementType.ConnectedPolygons)
                    {
                        edge = next2._anEdge;
                        do
                        {
                            _elements[num4++] = GetNeighbourFace(edge);
                            edge = edge._Lnext;
                        }while (edge != next2._anEdge);
                        for (int i = num3; i < polySize; i++)
                        {
                            _elements[num4++] = -1;
                        }
                    }
                }
            }
        }
Esempio n. 16
0
 public override void Reset()
 {
     _vHead = null;
     _fHead = null;
     _eHead = (_eHeadSym = null);
 }