ca5bf36b36335511965d2202328a02b8cd83bd7c
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.
40 #include "glimports.h"
43 #include "coveandtiler.h"
44 #include "gridvertex.h"
45 #include "gridtrimvertex.h"
50 const int CoveAndTiler::MAXSTRIPSIZE
= 1000;
52 CoveAndTiler::CoveAndTiler( Backend
& b
)
56 CoveAndTiler::~CoveAndTiler( void )
60 CoveAndTiler::output( GridVertex
&gv
)
62 backend
.tmeshvert( &gv
);
66 CoveAndTiler::output( TrimVertex
*tv
)
68 backend
.tmeshvert( tv
);
72 CoveAndTiler::output( GridTrimVertex
& g
)
74 backend
.tmeshvert( &g
);
78 CoveAndTiler::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" );
181 CoveAndTiler::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 );
197 CoveAndTiler::coveUpperRight( void )
199 GridVertex
tgv( top
.uend
, top
.vindex
);
200 GridVertex
gv( top
.uend
, bot
.vindex
);
203 backend
.bgntmesh( "coveUpperRight" );
204 output( right
.next() );
213 CoveAndTiler::coveUpperRightNoGrid( TrimVertex
* br
)
215 backend
.bgntmesh( "coveUpperRight" );
216 output( right
.first() );
217 output( right
.next() );
225 CoveAndTiler::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() ) {
259 CoveAndTiler::coveUpperLeft( void )
261 GridVertex
tgv( top
.ustart
, top
.vindex
);
262 GridVertex
gv( top
.ustart
, bot
.vindex
);
265 backend
.bgntmesh( "coveUpperLeft" );
267 output( left
.next() );
275 CoveAndTiler::coveUpperLeftNoGrid( TrimVertex
* bl
)
277 backend
.bgntmesh( "coveUpperLeftNoGrid" );
278 output( left
.first() );
279 output( left
.next() );
287 CoveAndTiler::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() ) {
320 CoveAndTiler::coveLowerLeft( void )
322 GridVertex
bgv( bot
.ustart
, bot
.vindex
);
323 GridVertex
gv( bot
.ustart
, top
.vindex
);
326 backend
.bgntmesh( "coveLowerLeft" );
327 output( left
.prev() );
336 CoveAndTiler::coveLowerLeftNoGrid( TrimVertex
* tl
)
338 backend
.bgntmesh( "coveLowerLeft" );
339 output( left
.last() );
340 output( left
.prev() );
348 CoveAndTiler::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() ) {
381 CoveAndTiler::coveLowerRight( void )
383 GridVertex
bgv( bot
.uend
, bot
.vindex
);
384 GridVertex
gv( bot
.uend
, top
.vindex
);
387 backend
.bgntmesh( "coveLowerRight" );
389 output( right
.prev() );
397 CoveAndTiler::coveLowerRightNoGrid( TrimVertex
* tr
)
399 backend
.bgntmesh( "coveLowerRIght" );
400 output( right
.last() );
401 output( right
.prev() );
409 CoveAndTiler::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() ) {