48 static GLUvertex *allocVertex()
50 return (GLUvertex *)memAlloc(
sizeof( GLUvertex ));
53 static GLUface *allocFace()
55 return (GLUface *)memAlloc(
sizeof( GLUface ));
64 static GLUhalfEdge *MakeEdge( GLUhalfEdge *eNext )
69 EdgePair *pair = (EdgePair *)memAlloc(
sizeof( EdgePair ));
70 if (pair == NULL)
return NULL;
76 if( eNext->Sym < eNext ) { eNext = eNext->Sym; }
81 ePrev = eNext->Sym->next;
85 eNext->Sym->next = eSym;
93 e->activeRegion = NULL;
101 eSym->activeRegion = NULL;
112 static void Splice( GLUhalfEdge *a, GLUhalfEdge *b )
114 GLUhalfEdge *aOnext = a->Onext;
115 GLUhalfEdge *bOnext = b->Onext;
117 aOnext->Sym->Lnext = b;
118 bOnext->Sym->Lnext = a;
129 static void MakeVertex( GLUvertex *newVertex,
130 GLUhalfEdge *eOrig, GLUvertex *vNext )
134 GLUvertex *vNew = newVertex;
136 assert(vNew != NULL);
145 vNew->anEdge = eOrig;
154 }
while( e != eOrig );
163 static void MakeFace( GLUface *newFace, GLUhalfEdge *eOrig, GLUface *fNext )
167 GLUface *fNew = newFace;
169 assert(fNew != NULL);
178 fNew->anEdge = eOrig;
181 fNew->marked = FALSE;
186 fNew->inside = fNext->inside;
193 }
while( e != eOrig );
199 static void KillEdge( GLUhalfEdge *eDel )
201 GLUhalfEdge *ePrev, *eNext;
204 if( eDel->Sym < eDel ) { eDel = eDel->Sym; }
208 ePrev = eDel->Sym->next;
209 eNext->Sym->next = ePrev;
210 ePrev->Sym->next = eNext;
219 static void KillVertex( GLUvertex *vDel, GLUvertex *newOrg )
221 GLUhalfEdge *e, *eStart = vDel->anEdge;
222 GLUvertex *vPrev, *vNext;
229 }
while( e != eStart );
243 static void KillFace( GLUface *fDel, GLUface *newLface )
245 GLUhalfEdge *e, *eStart = fDel->anEdge;
246 GLUface *fPrev, *fNext;
253 }
while( e != eStart );
270 GLUhalfEdge *__gl_meshMakeEdge( GLUmesh *mesh )
272 GLUvertex *newVertex1= allocVertex();
273 GLUvertex *newVertex2= allocVertex();
274 GLUface *newFace= allocFace();
278 if (newVertex1 == NULL || newVertex2 == NULL || newFace == NULL) {
279 if (newVertex1 != NULL) memFree(newVertex1);
280 if (newVertex2 != NULL) memFree(newVertex2);
281 if (newFace != NULL) memFree(newFace);
285 e = MakeEdge( &mesh->eHead );
293 MakeVertex( newVertex1, e, &mesh->vHead );
294 MakeVertex( newVertex2, e->Sym, &mesh->vHead );
295 MakeFace( newFace, e, &mesh->fHead );
323 int __gl_meshSplice( GLUhalfEdge *eOrg, GLUhalfEdge *eDst )
325 int joiningLoops = FALSE;
326 int joiningVertices = FALSE;
328 if( eOrg == eDst )
return 1;
330 if( eDst->Org != eOrg->Org ) {
332 joiningVertices = TRUE;
333 KillVertex( eDst->Org, eOrg->Org );
335 if( eDst->Lface != eOrg->Lface ) {
338 KillFace( eDst->Lface, eOrg->Lface );
342 Splice( eDst, eOrg );
344 if( ! joiningVertices ) {
345 GLUvertex *newVertex= allocVertex();
346 if (newVertex == NULL)
return 0;
351 MakeVertex( newVertex, eDst, eOrg->Org );
352 eOrg->Org->anEdge = eOrg;
354 if( ! joiningLoops ) {
355 GLUface *newFace= allocFace();
356 if (newFace == NULL)
return 0;
361 MakeFace( newFace, eDst, eOrg->Lface );
362 eOrg->Lface->anEdge = eOrg;
379 int __gl_meshDelete( GLUhalfEdge *eDel )
381 GLUhalfEdge *eDelSym = eDel->Sym;
382 int joiningLoops = FALSE;
387 if( eDel->Lface != eDel->Rface ) {
390 KillFace( eDel->Lface, eDel->Rface );
393 if( eDel->Onext == eDel ) {
394 KillVertex( eDel->Org, NULL );
397 eDel->Rface->anEdge = eDel->Oprev;
398 eDel->Org->anEdge = eDel->Onext;
400 Splice( eDel, eDel->Oprev );
401 if( ! joiningLoops ) {
402 GLUface *newFace= allocFace();
403 if (newFace == NULL)
return 0;
406 MakeFace( newFace, eDel, eDel->Lface );
413 if( eDelSym->Onext == eDelSym ) {
414 KillVertex( eDelSym->Org, NULL );
415 KillFace( eDelSym->Lface, NULL );
418 eDel->Lface->anEdge = eDelSym->Oprev;
419 eDelSym->Org->anEdge = eDelSym->Onext;
420 Splice( eDelSym, eDelSym->Oprev );
441 GLUhalfEdge *__gl_meshAddEdgeVertex( GLUhalfEdge *eOrg )
443 GLUhalfEdge *eNewSym;
444 GLUhalfEdge *eNew = MakeEdge( eOrg );
445 if (eNew == NULL)
return NULL;
450 Splice( eNew, eOrg->Lnext );
453 eNew->Org = eOrg->Dst;
455 GLUvertex *newVertex= allocVertex();
456 if (newVertex == NULL)
return NULL;
458 MakeVertex( newVertex, eNewSym, eNew->Org );
460 eNew->Lface = eNewSym->Lface = eOrg->Lface;
470 GLUhalfEdge *__gl_meshSplitEdge( GLUhalfEdge *eOrg )
473 GLUhalfEdge *tempHalfEdge= __gl_meshAddEdgeVertex( eOrg );
474 if (tempHalfEdge == NULL)
return NULL;
476 eNew = tempHalfEdge->Sym;
479 Splice( eOrg->Sym, eOrg->Sym->Oprev );
480 Splice( eOrg->Sym, eNew );
483 eOrg->Dst = eNew->Org;
484 eNew->Dst->anEdge = eNew->Sym;
485 eNew->Rface = eOrg->Rface;
486 eNew->winding = eOrg->winding;
487 eNew->Sym->winding = eOrg->Sym->winding;
503 GLUhalfEdge *__gl_meshConnect( GLUhalfEdge *eOrg, GLUhalfEdge *eDst )
505 GLUhalfEdge *eNewSym;
506 int joiningLoops = FALSE;
507 GLUhalfEdge *eNew = MakeEdge( eOrg );
508 if (eNew == NULL)
return NULL;
512 if( eDst->Lface != eOrg->Lface ) {
515 KillFace( eDst->Lface, eOrg->Lface );
519 Splice( eNew, eOrg->Lnext );
520 Splice( eNewSym, eDst );
523 eNew->Org = eOrg->Dst;
524 eNewSym->Org = eDst->Org;
525 eNew->Lface = eNewSym->Lface = eOrg->Lface;
528 eOrg->Lface->anEdge = eNewSym;
530 if( ! joiningLoops ) {
531 GLUface *newFace= allocFace();
532 if (newFace == NULL)
return NULL;
535 MakeFace( newFace, eNew, eOrg->Lface );
550 void __gl_meshZapFace( GLUface *fZap )
552 GLUhalfEdge *eStart = fZap->anEdge;
553 GLUhalfEdge *e, *eNext, *eSym;
554 GLUface *fPrev, *fNext;
557 eNext = eStart->Lnext;
563 if( e->Rface == NULL ) {
566 if( e->Onext == e ) {
567 KillVertex( e->Org, NULL );
570 e->Org->anEdge = e->Onext;
571 Splice( e, e->Oprev );
574 if( eSym->Onext == eSym ) {
575 KillVertex( eSym->Org, NULL );
578 eSym->Org->anEdge = eSym->Onext;
579 Splice( eSym, eSym->Oprev );
583 }
while( e != eStart );
598 GLUmesh *__gl_meshNewMesh(
void )
604 GLUmesh *mesh = (GLUmesh *)memAlloc(
sizeof( GLUmesh ));
612 eSym = &mesh->eHeadSym;
614 v->next = v->prev = v;
618 f->next = f->prev = f;
632 e->activeRegion = NULL;
641 eSym->activeRegion = NULL;
650 GLUmesh *__gl_meshUnion( GLUmesh *mesh1, GLUmesh *mesh2 )
652 GLUface *f1 = &mesh1->fHead;
653 GLUvertex *v1 = &mesh1->vHead;
654 GLUhalfEdge *e1 = &mesh1->eHead;
655 GLUface *f2 = &mesh2->fHead;
656 GLUvertex *v2 = &mesh2->vHead;
657 GLUhalfEdge *e2 = &mesh2->eHead;
660 if( f2->next != f2 ) {
661 f1->prev->next = f2->next;
662 f2->next->prev = f1->prev;
667 if( v2->next != v2 ) {
668 v1->prev->next = v2->next;
669 v2->next->prev = v1->prev;
674 if( e2->next != e2 ) {
675 e1->Sym->next->Sym->next = e2->next;
676 e2->next->Sym->next = e1->Sym->next;
677 e2->Sym->next->Sym->next = e1;
678 e1->Sym->next = e2->Sym->next;
686 #ifdef DELETE_BY_ZAPPING
690 void __gl_meshDeleteMesh( GLUmesh *mesh )
692 GLUface *fHead = &mesh->fHead;
694 while( fHead->next != fHead ) {
695 __gl_meshZapFace( fHead->next );
697 assert( mesh->vHead.next == &mesh->vHead );
706 void __gl_meshDeleteMesh( GLUmesh *mesh )
709 GLUvertex *v, *vNext;
710 GLUhalfEdge *e, *eNext;
712 for( f = mesh->fHead.next; f != &mesh->fHead; f = fNext ) {
717 for( v = mesh->vHead.next; v != &mesh->vHead; v = vNext ) {
722 for( e = mesh->eHead.next; e != &mesh->eHead; e = eNext ) {
737 void __gl_meshCheckMesh( GLUmesh *mesh )
739 GLUface *fHead = &mesh->fHead;
740 GLUvertex *vHead = &mesh->vHead;
741 GLUhalfEdge *eHead = &mesh->eHead;
743 GLUvertex *v, *vPrev;
744 GLUhalfEdge *e, *ePrev;
747 for( fPrev = fHead ; (f = fPrev->next) != fHead; fPrev = f) {
748 assert( f->prev == fPrev );
751 assert( e->Sym != e );
752 assert( e->Sym->Sym == e );
753 assert( e->Lnext->Onext->Sym == e );
754 assert( e->Onext->Sym->Lnext == e );
755 assert( e->Lface == f );
757 }
while( e != f->anEdge );
759 assert( f->prev == fPrev && f->anEdge == NULL && f->data == NULL );
762 for( vPrev = vHead ; (v = vPrev->next) != vHead; vPrev = v) {
763 assert( v->prev == vPrev );
766 assert( e->Sym != e );
767 assert( e->Sym->Sym == e );
768 assert( e->Lnext->Onext->Sym == e );
769 assert( e->Onext->Sym->Lnext == e );
770 assert( e->Org == v );
772 }
while( e != v->anEdge );
774 assert( v->prev == vPrev && v->anEdge == NULL && v->data == NULL );
777 for( ePrev = eHead ; (e = ePrev->next) != eHead; ePrev = e) {
778 assert( e->Sym->next == ePrev->Sym );
779 assert( e->Sym != e );
780 assert( e->Sym->Sym == e );
781 assert( e->Org != NULL );
782 assert( e->Dst != NULL );
783 assert( e->Lnext->Onext->Sym == e );
784 assert( e->Onext->Sym->Lnext == e );
786 assert( e->Sym->next == ePrev->Sym
787 && e->Sym == &mesh->eHeadSym
789 && e->Org == NULL && e->Dst == NULL
790 && e->Lface == NULL && e->Rface == NULL );