42 #define AddWinding(eDst,eSrc) (eDst->winding += eSrc->winding, \
43 eDst->Sym->winding += eSrc->Sym->winding)
72 int __gl_meshTessellateMonoRegion( GLUface *face )
82 assert( up->Lnext != up && up->Lnext->Lnext != up );
84 for( ; VertLeq( up->Dst, up->Org ); up = up->Lprev )
86 for( ; VertLeq( up->Org, up->Dst ); up = up->Lnext )
90 while( up->Lnext != lo ) {
91 if( VertLeq( up->Dst, lo->Org )) {
96 while( lo->Lnext != up && (EdgeGoesLeft( lo->Lnext )
97 || EdgeSign( lo->Org, lo->Dst, lo->Lnext->Dst ) <= 0 )) {
98 GLUhalfEdge *tempHalfEdge= __gl_meshConnect( lo->Lnext, lo );
99 if (tempHalfEdge == NULL)
return 0;
100 lo = tempHalfEdge->Sym;
105 while( lo->Lnext != up && (EdgeGoesRight( up->Lprev )
106 || EdgeSign( up->Dst, up->Org, up->Lprev->Org ) >= 0 )) {
107 GLUhalfEdge *tempHalfEdge= __gl_meshConnect( up, up->Lprev );
108 if (tempHalfEdge == NULL)
return 0;
109 up = tempHalfEdge->Sym;
118 assert( lo->Lnext != up );
119 while( lo->Lnext->Lnext != up ) {
120 GLUhalfEdge *tempHalfEdge= __gl_meshConnect( lo->Lnext, lo );
121 if (tempHalfEdge == NULL)
return 0;
122 lo = tempHalfEdge->Sym;
133 int __gl_meshTessellateInterior( GLUmesh *mesh )
138 for( f = mesh->fHead.next; f != &mesh->fHead; f = next ) {
142 if ( !__gl_meshTessellateMonoRegion( f ) )
return 0;
155 void __gl_meshDiscardExterior( GLUmesh *mesh )
160 for( f = mesh->fHead.next; f != &mesh->fHead; f = next ) {
164 __gl_meshZapFace( f );
169 #define MARKED_FOR_DELETION 0x7fffffff
179 int __gl_meshSetWindingNumber( GLUmesh *mesh,
int value,
180 GLboolean keepOnlyBoundary )
182 GLUhalfEdge *e, *eNext;
184 for( e = mesh->eHead.next; e != &mesh->eHead; e = eNext ) {
186 if( e->Rface->inside != e->Lface->inside ) {
189 e->winding = (e->Lface->inside) ? value : -value;
193 if( ! keepOnlyBoundary ) {
196 if ( !__gl_meshDelete( e ) )
return 0;