2 ** License Applicability. Except to the extent portions of this file are
3 ** made subject to an alternative license as permitted in the SGI Free
4 ** Software License B, Version 1.1 (the "License"), the contents of this
5 ** file are subject only to the provisions of the License. You may not use
6 ** this file except in compliance with the License. You may obtain a copy
7 ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
8 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
10 ** http://oss.sgi.com/projects/FreeB
12 ** Note that, as provided in the License, the Software is distributed on an
13 ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
14 ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
15 ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
16 ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
18 ** Original Code. The Original Code is: OpenGL Sample Implementation,
19 ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
20 ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
21 ** Copyright in any portions created by third parties is as indicated
22 ** elsewhere herein. All Rights Reserved.
24 ** Additional Notice Provisions: The application programming interfaces
25 ** established by SGI in conjunction with the Original Code are The
26 ** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
27 ** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
28 ** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
29 ** Window System(R) (Version 1.3), released October 19, 1998. This software
30 ** was created using the OpenGL(R) version 1.2.1 Sample Implementation
31 ** published by SGI, but has not been independently verified as being
32 ** compliant with the OpenGL(R) version 1.2.1 Specification.
38 * $Date: 2001/03/17 00:25:40 $ $Revision: 1.1 $
39 * $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/coveandtiler.cc,v 1.1 2001/03/17 00:25:40 brianp Exp $
42 #include "glimports.h"
45 #include "coveandtiler.h"
46 #include "gridvertex.h"
47 #include "gridtrimvertex.h"
52 const int CoveAndTiler::MAXSTRIPSIZE
= 1000;
54 CoveAndTiler::CoveAndTiler( Backend
& b
)
58 CoveAndTiler::~CoveAndTiler( void )
62 CoveAndTiler::output( GridVertex
&gv
)
64 backend
.tmeshvert( &gv
);
68 CoveAndTiler::output( TrimVertex
*tv
)
70 backend
.tmeshvert( tv
);
74 CoveAndTiler::output( GridTrimVertex
& g
)
76 backend
.tmeshvert( &g
);
80 CoveAndTiler::coveAndTile( void )
82 long ustart
= (top
.ustart
>= bot
.ustart
) ? top
.ustart
: bot
.ustart
;
83 long uend
= (top
.uend
<= bot
.uend
) ? top
.uend
: bot
.uend
;
84 if( ustart
<= uend
) {
85 tile( bot
.vindex
, ustart
, uend
);
86 if( top
.ustart
>= bot
.ustart
)
91 if( top
.uend
<= bot
.uend
)
96 TrimVertex blv
, tlv
, *bl
, *tl
;
97 GridTrimVertex bllv
, tllv
;
98 TrimVertex
*lf
= left
.first();
99 TrimVertex
*ll
= left
.last();
100 if( lf
->param
[0] >= ll
->param
[0] ) {
101 blv
.param
[0] = lf
->param
[0];
102 blv
.param
[1] = ll
->param
[1];
104 assert( blv
.param
[1] == bot
.vval
);
108 if( ll
->param
[0] > uarray
.uarray
[top
.ustart
-1] ) {
110 assert( ll
->param
[0] <= uarray
.uarray
[bot
.ustart
] );
112 bllv
.set( top
.ustart
-1, bot
.vindex
);
114 coveUpperLeftNoGrid( bl
);
116 tlv
.param
[0] = ll
->param
[0];
117 tlv
.param
[1] = lf
->param
[1];
119 assert( tlv
.param
[1] == top
.vval
);
123 if( lf
->param
[0] > uarray
.uarray
[bot
.ustart
-1] ) {
124 assert( lf
->param
[0] <= uarray
.uarray
[bot
.ustart
] );
127 tllv
.set( bot
.ustart
-1, top
.vindex
);
129 coveLowerLeftNoGrid( tl
);
132 TrimVertex brv
, trv
, *br
, *tr
;
133 GridTrimVertex brrv
, trrv
;
134 TrimVertex
*rf
= right
.first();
135 TrimVertex
*rl
= right
.last();
137 if( rf
->param
[0] <= rl
->param
[0] ) {
138 brv
.param
[0] = rf
->param
[0];
139 brv
.param
[1] = rl
->param
[1];
141 assert( brv
.param
[1] == bot
.vval
);
145 if( rl
->param
[0] < uarray
.uarray
[top
.uend
+1] ) {
146 assert( rl
->param
[0] >= uarray
.uarray
[top
.uend
] );
149 brrv
.set( top
.uend
+1, bot
.vindex
);
151 coveUpperRightNoGrid( br
);
153 trv
.param
[0] = rl
->param
[0];
154 trv
.param
[1] = rf
->param
[1];
156 assert( trv
.param
[1] == top
.vval
);
160 if( rf
->param
[0] < uarray
.uarray
[bot
.uend
+1] ) {
161 assert( rf
->param
[0] >= uarray
.uarray
[bot
.uend
] );
164 trrv
.set( bot
.uend
+1, top
.vindex
);
166 coveLowerRightNoGrid( tr
);
169 backend
.bgntmesh( "doit" );
183 CoveAndTiler::tile( long vindex
, long ustart
, long uend
)
185 long numsteps
= uend
- ustart
;
187 if( numsteps
== 0 ) return;
189 if( numsteps
> MAXSTRIPSIZE
) {
190 long umid
= ustart
+ (uend
- ustart
) / 2;
191 tile( vindex
, ustart
, umid
);
192 tile( vindex
, umid
, uend
);
194 backend
.surfmesh( ustart
, vindex
-1, numsteps
, 1 );
199 CoveAndTiler::coveUpperRight( void )
201 GridVertex
tgv( top
.uend
, top
.vindex
);
202 GridVertex
gv( top
.uend
, bot
.vindex
);
205 backend
.bgntmesh( "coveUpperRight" );
206 output( right
.next() );
215 CoveAndTiler::coveUpperRightNoGrid( TrimVertex
* br
)
217 backend
.bgntmesh( "coveUpperRight" );
218 output( right
.first() );
219 output( right
.next() );
227 CoveAndTiler::coveUR( )
229 GridVertex
gv( top
.uend
, bot
.vindex
);
230 TrimVertex
*vert
= right
.next();
231 if( vert
== NULL
) return;
233 assert( vert
->param
[0] >= uarray
.uarray
[gv
.gparam
[0]] );
235 if( gv
.nextu() >= bot
.uend
) {
236 for( ; vert
; vert
= right
.next() ) {
241 if( vert
->param
[0] < uarray
.uarray
[gv
.gparam
[0]] ) {
245 if( vert
== NULL
) break;
249 if( gv
.nextu() == bot
.uend
) {
250 for( ; vert
; vert
= right
.next() ) {
261 CoveAndTiler::coveUpperLeft( void )
263 GridVertex
tgv( top
.ustart
, top
.vindex
);
264 GridVertex
gv( top
.ustart
, bot
.vindex
);
267 backend
.bgntmesh( "coveUpperLeft" );
269 output( left
.next() );
277 CoveAndTiler::coveUpperLeftNoGrid( TrimVertex
* bl
)
279 backend
.bgntmesh( "coveUpperLeftNoGrid" );
280 output( left
.first() );
281 output( left
.next() );
289 CoveAndTiler::coveUL()
291 GridVertex
gv( top
.ustart
, bot
.vindex
);
292 TrimVertex
*vert
= left
.next();
293 if( vert
== NULL
) return;
294 assert( vert
->param
[0] <= uarray
.uarray
[gv
.gparam
[0]] );
296 if( gv
.prevu() <= bot
.ustart
) {
297 for( ; vert
; vert
= left
.next() ) {
302 if( vert
->param
[0] > uarray
.uarray
[gv
.gparam
[0]] ) {
306 if( vert
== NULL
) break;
310 if( gv
.prevu() == bot
.ustart
) {
311 for( ; vert
; vert
= left
.next() ) {
322 CoveAndTiler::coveLowerLeft( void )
324 GridVertex
bgv( bot
.ustart
, bot
.vindex
);
325 GridVertex
gv( bot
.ustart
, top
.vindex
);
328 backend
.bgntmesh( "coveLowerLeft" );
329 output( left
.prev() );
338 CoveAndTiler::coveLowerLeftNoGrid( TrimVertex
* tl
)
340 backend
.bgntmesh( "coveLowerLeft" );
341 output( left
.last() );
342 output( left
.prev() );
350 CoveAndTiler::coveLL()
352 GridVertex
gv( bot
.ustart
, top
.vindex
);
353 TrimVertex
*vert
= left
.prev();
354 if( vert
== NULL
) return;
355 assert( vert
->param
[0] <= uarray
.uarray
[gv
.gparam
[0]] );
357 if( gv
.prevu() <= top
.ustart
) {
358 for( ; vert
; vert
= left
.prev() ) {
363 if( vert
->param
[0] > uarray
.uarray
[gv
.gparam
[0]] ){
367 if( vert
== NULL
) break;
371 if( gv
.prevu() == top
.ustart
) {
372 for( ; vert
; vert
= left
.prev() ) {
383 CoveAndTiler::coveLowerRight( void )
385 GridVertex
bgv( bot
.uend
, bot
.vindex
);
386 GridVertex
gv( bot
.uend
, top
.vindex
);
389 backend
.bgntmesh( "coveLowerRight" );
391 output( right
.prev() );
399 CoveAndTiler::coveLowerRightNoGrid( TrimVertex
* tr
)
401 backend
.bgntmesh( "coveLowerRIght" );
402 output( right
.last() );
403 output( right
.prev() );
411 CoveAndTiler::coveLR( )
413 GridVertex
gv( bot
.uend
, top
.vindex
);
414 TrimVertex
*vert
= right
.prev();
415 if( vert
== NULL
) return;
416 assert( vert
->param
[0] >= uarray
.uarray
[gv
.gparam
[0]] );
418 if( gv
.nextu() >= top
.uend
) {
419 for( ; vert
; vert
= right
.prev() ) {
424 if( vert
->param
[0] < uarray
.uarray
[gv
.gparam
[0]] ) {
428 if( vert
== NULL
) break;
432 if( gv
.nextu() == top
.uend
) {
433 for( ; vert
; vert
= right
.prev() ) {