#include #include #include #ifndef NT #include #include #else #include "winmem.h" #endif #include "monotone.h" #include "msort.h" static int comp_priorityq( Vert **x, Vert **y ); static void grow_priorityq( GLUtriangulatorObj *tobj ); void __gl_init_priorityq( GLUtriangulatorObj *tobj, long s ) { assert( ! tobj->parray ) ; tobj->phead = 0; tobj->ptail = 0; tobj->psize = s > 0 ? s : 1; tobj->parray = (Vert **) malloc( (unsigned int) (sizeof( Vert *) * tobj->psize) ); } void __gl_add_priorityq( GLUtriangulatorObj *tobj, Vert *v ) { assert( tobj->parray ); if( tobj->ptail == tobj->psize ) grow_priorityq( tobj ); tobj->parray[tobj->ptail++] = v; } int __gl_more_priorityq( GLUtriangulatorObj *tobj ) { return tobj->phead != tobj->ptail; } void __gl_sort_priorityq( GLUtriangulatorObj *tobj ) { assert( tobj->phead <= tobj->ptail ); __gl_msort( tobj, (void **)tobj->parray+tobj->phead, tobj->ptail-tobj->phead, sizeof(Vert *), (SortFunc) comp_priorityq ); } Vert * __gl_remove_priorityq( GLUtriangulatorObj *tobj ) { return tobj->parray[tobj->phead++]; } void __gl_free_priorityq( GLUtriangulatorObj *tobj ) { if (tobj->parray) { free( tobj->parray ); tobj->parray = 0; } } static void grow_priorityq( GLUtriangulatorObj *tobj ) { tobj->psize *= 2; tobj->parray = (Vert **) realloc( tobj->parray, (unsigned int)(sizeof(Vert*)*tobj->psize) ); } static int comp_priorityq( Vert **vp1, Vert **vp2 ) { float diff = (*vp1)->s - (*vp2)->s; if (diff < (float)0.0) return -1; if (diff > (float)0.0) return 1; if (diff == (float)0.0) diff = (*vp1)->t - (*vp2)->t; if (diff < (float)0.0) return -1; if (diff > (float)0.0) return 1; return 0; } void __gl_setpriority_priorityq( GLUtriangulatorObj *tobj, int s, int t ) { int i; for( i=tobj->phead; iptail; i++ ) { tobj->parray[i]->s = tobj->parray[i]->v[s]; tobj->parray[i]->t = tobj->parray[i]->v[t]; } }