43#include "coveandtiler.h"
44#include "gridvertex.h"
45#include "gridtrimvertex.h"
50const int CoveAndTiler::MAXSTRIPSIZE = 1000;
52CoveAndTiler::CoveAndTiler(
Backend& b )
56CoveAndTiler::~CoveAndTiler(
void )
62 backend.tmeshvert( &gv );
68 backend.tmeshvert( tv );
74 backend.tmeshvert( &g );
78CoveAndTiler::coveAndTile(
void )
80 long ustart = (top.ustart >= bot.ustart) ? top.ustart : bot.ustart;
81 long uend = (top.uend <= bot.uend) ? top.uend : bot.uend;
82 if( ustart <= uend ) {
83 tile( bot.vindex, ustart, uend );
84 if( top.ustart >= bot.ustart )
89 if( top.uend <= bot.uend )
94 TrimVertex blv, tlv, *bl, *tl;
95 GridTrimVertex bllv, tllv;
96 TrimVertex *lf = left.first();
97 TrimVertex *ll = left.last();
98 if( lf->param[0] >= ll->param[0] ) {
99 blv.param[0] = lf->param[0];
100 blv.param[1] = ll->param[1];
102 assert( blv.param[1] == bot.vval );
106 if( ll->param[0] > uarray.uarray[top.ustart-1] ) {
108 assert( ll->param[0] <= uarray.uarray[bot.ustart] );
110 bllv.set( top.ustart-1, bot.vindex );
112 coveUpperLeftNoGrid( bl );
114 tlv.param[0] = ll->param[0];
115 tlv.param[1] = lf->param[1];
117 assert( tlv.param[1] == top.vval );
121 if( lf->param[0] > uarray.uarray[bot.ustart-1] ) {
122 assert( lf->param[0] <= uarray.uarray[bot.ustart] );
125 tllv.set( bot.ustart-1, top.vindex );
127 coveLowerLeftNoGrid( tl );
130 TrimVertex brv, trv, *br, *tr;
131 GridTrimVertex brrv, trrv;
132 TrimVertex *rf = right.first();
133 TrimVertex *rl = right.last();
135 if( rf->param[0] <= rl->param[0] ) {
136 brv.param[0] = rf->param[0];
137 brv.param[1] = rl->param[1];
139 assert( brv.param[1] == bot.vval );
143 if( rl->param[0] < uarray.uarray[top.uend+1] ) {
144 assert( rl->param[0] >= uarray.uarray[top.uend] );
147 brrv.set( top.uend+1, bot.vindex );
149 coveUpperRightNoGrid( br );
151 trv.param[0] = rl->param[0];
152 trv.param[1] = rf->param[1];
154 assert( trv.param[1] == top.vval );
158 if( rf->param[0] < uarray.uarray[bot.uend+1] ) {
159 assert( rf->param[0] >= uarray.uarray[bot.uend] );
162 trrv.set( bot.uend+1, top.vindex );
164 coveLowerRightNoGrid( tr );
167 backend.bgntmesh(
"doit" );
181CoveAndTiler::tile(
long vindex,
long ustart,
long uend )
183 long numsteps = uend - ustart;
185 if( numsteps == 0 )
return;
187 if( numsteps > MAXSTRIPSIZE ) {
188 long umid = ustart + (uend - ustart) / 2;
189 tile( vindex, ustart, umid );
190 tile( vindex, umid, uend );
192 backend.surfmesh( ustart, vindex-1, numsteps, 1 );
197CoveAndTiler::coveUpperRight(
void )
199 GridVertex tgv( top.uend, top.vindex );
200 GridVertex gv( top.uend, bot.vindex );
203 backend.bgntmesh(
"coveUpperRight" );
204 output( right.next() );
213CoveAndTiler::coveUpperRightNoGrid(
TrimVertex* br )
215 backend.bgntmesh(
"coveUpperRight" );
216 output( right.first() );
217 output( right.next() );
225CoveAndTiler::coveUR( )
227 GridVertex gv( top.uend, bot.vindex );
228 TrimVertex *vert = right.next();
229 if( vert == NULL )
return;
231 assert( vert->param[0] >= uarray.uarray[gv.gparam[0]] );
233 if( gv.nextu() >= bot.uend ) {
234 for( ; vert; vert = right.next() ) {
239 if( vert->param[0] < uarray.uarray[gv.gparam[0]] ) {
243 if( vert == NULL )
break;
247 if( gv.nextu() == bot.uend ) {
248 for( ; vert; vert = right.next() ) {
259CoveAndTiler::coveUpperLeft(
void )
261 GridVertex tgv( top.ustart, top.vindex );
262 GridVertex gv( top.ustart, bot.vindex );
265 backend.bgntmesh(
"coveUpperLeft" );
267 output( left.next() );
275CoveAndTiler::coveUpperLeftNoGrid(
TrimVertex* bl )
277 backend.bgntmesh(
"coveUpperLeftNoGrid" );
278 output( left.first() );
279 output( left.next() );
287CoveAndTiler::coveUL()
289 GridVertex gv( top.ustart, bot.vindex );
290 TrimVertex *vert = left.next();
291 if( vert == NULL )
return;
292 assert( vert->param[0] <= uarray.uarray[gv.gparam[0]] );
294 if( gv.prevu() <= bot.ustart ) {
295 for( ; vert; vert = left.next() ) {
300 if( vert->param[0] > uarray.uarray[gv.gparam[0]] ) {
304 if( vert == NULL )
break;
308 if( gv.prevu() == bot.ustart ) {
309 for( ; vert; vert = left.next() ) {
320CoveAndTiler::coveLowerLeft(
void )
322 GridVertex bgv( bot.ustart, bot.vindex );
323 GridVertex gv( bot.ustart, top.vindex );
326 backend.bgntmesh(
"coveLowerLeft" );
327 output( left.prev() );
336CoveAndTiler::coveLowerLeftNoGrid(
TrimVertex* tl )
338 backend.bgntmesh(
"coveLowerLeft" );
339 output( left.last() );
340 output( left.prev() );
348CoveAndTiler::coveLL()
350 GridVertex gv( bot.ustart, top.vindex );
351 TrimVertex *vert = left.prev();
352 if( vert == NULL )
return;
353 assert( vert->param[0] <= uarray.uarray[gv.gparam[0]] );
355 if( gv.prevu() <= top.ustart ) {
356 for( ; vert; vert = left.prev() ) {
361 if( vert->param[0] > uarray.uarray[gv.gparam[0]] ){
365 if( vert == NULL )
break;
369 if( gv.prevu() == top.ustart ) {
370 for( ; vert; vert = left.prev() ) {
381CoveAndTiler::coveLowerRight(
void )
383 GridVertex bgv( bot.uend, bot.vindex );
384 GridVertex gv( bot.uend, top.vindex );
387 backend.bgntmesh(
"coveLowerRight" );
389 output( right.prev() );
397CoveAndTiler::coveLowerRightNoGrid(
TrimVertex* tr )
399 backend.bgntmesh(
"coveLowerRIght" );
400 output( right.last() );
401 output( right.prev() );
409CoveAndTiler::coveLR( )
411 GridVertex gv( bot.uend, top.vindex );
412 TrimVertex *vert = right.prev();
413 if( vert == NULL )
return;
414 assert( vert->param[0] >= uarray.uarray[gv.gparam[0]] );
416 if( gv.nextu() >= top.uend ) {
417 for( ; vert; vert = right.prev() ) {
422 if( vert->param[0] < uarray.uarray[gv.gparam[0]] ) {
426 if( vert == NULL )
break;
430 if( gv.nextu() == top.uend ) {
431 for( ; vert; vert = right.prev() ) {