Synchronize with trunk's revision r57629.
[reactos.git] / dll / opengl / glu32 / src / libnurbs / internals / mapdesc.h
1 /*
2 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice including the dates of first publication and
13 * either this permission notice or a reference to
14 * http://oss.sgi.com/projects/FreeB/
15 * shall be included in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
22 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 *
25 * Except as contained in this notice, the name of Silicon Graphics, Inc.
26 * shall not be used in advertising or otherwise to promote the sale, use or
27 * other dealings in this Software without prior written authorization from
28 * Silicon Graphics, Inc.
29 */
30
31 /*
32 * mapdesc.h
33 *
34 */
35
36 #ifndef __glumapdesc_h_
37 #define __glumapdesc_h_
38
39 #include "mystdio.h"
40 #include "types.h"
41 #include "defines.h"
42 #include "bufpool.h"
43 #include "nurbsconsts.h"
44
45 typedef REAL Maxmatrix[MAXCOORDS][MAXCOORDS];
46
47 class Backend;
48
49 class Mapdesc : public PooledObj {
50 friend class Maplist;
51
52 public:
53 Mapdesc( long, int, int, Backend & );
54 int isProperty( long );
55 REAL getProperty( long );
56 void setProperty( long, REAL );
57 int isConstantSampling( void );
58 int isDomainSampling( void );
59 int isRangeSampling( void );
60 int isSampling( void );
61 int isParametricDistanceSampling( void );
62 int isObjectSpaceParaSampling( void );
63 int isObjectSpacePathSampling( void );
64 int isSurfaceAreaSampling( void );
65 int isPathLengthSampling( void );
66 int isCulling( void );
67 int isBboxSubdividing( void );
68 long getType( void );
69
70 /* curve routines */
71 void subdivide( REAL *, REAL *, REAL, int, int );
72 int cullCheck( REAL *, int, int );
73 void xformBounding( REAL *, int, int, REAL *, int );
74 void xformCulling( REAL *, int, int, REAL *, int );
75 void xformSampling( REAL *, int, int, REAL *, int );
76 void xformMat( Maxmatrix, REAL *, int, int, REAL *, int );
77 REAL calcPartialVelocity ( REAL *, int, int, int, REAL );
78 int project( REAL *, int, REAL *, int, int );
79 REAL calcVelocityRational( REAL *, int, int );
80 REAL calcVelocityNonrational( REAL *, int, int );
81
82 /* surface routines */
83 void subdivide( REAL *, REAL *, REAL, int, int, int, int );
84 int cullCheck( REAL *, int, int, int, int );
85 void xformBounding( REAL *, int, int, int, int, REAL *, int, int );
86 void xformCulling( REAL *, int, int, int, int, REAL *, int, int );
87 void xformSampling( REAL *, int, int, int, int, REAL *, int, int );
88 void xformMat( Maxmatrix, REAL *, int, int, int, int, REAL *, int, int );
89 REAL calcPartialVelocity ( REAL *, REAL *, int, int, int, int, int, int, REAL, REAL, int );
90 int project( REAL *, int, int, REAL *, int, int, int, int);
91 void surfbbox( REAL bb[2][MAXCOORDS] );
92
93 int bboxTooBig( REAL *, int, int, int, int, REAL [2][MAXCOORDS] );
94 int xformAndCullCheck( REAL *, int, int, int, int );
95
96 void identify( REAL[MAXCOORDS][MAXCOORDS] );
97 void setBboxsize( INREAL *);
98 inline void setBmat( INREAL*, long, long );
99 inline void setCmat( INREAL*, long, long );
100 inline void setSmat( INREAL*, long, long );
101 inline int isRational( void );
102 inline int getNcoords( void );
103
104 REAL pixel_tolerance; /* pathlength sampling tolerance */
105 REAL error_tolerance; /* parametric error sampling tolerance*/
106 REAL object_space_error_tolerance; /* object space tess*/
107 REAL clampfactor;
108 REAL minsavings;
109 REAL maxrate;
110 REAL maxsrate;
111 REAL maxtrate;
112 REAL bboxsize[MAXCOORDS];
113
114 private:
115 long type;
116 int isrational;
117 int ncoords;
118 int hcoords;
119 int inhcoords;
120 int mask;
121 Maxmatrix bmat;
122 Maxmatrix cmat;
123 Maxmatrix smat;
124 REAL s_steps; /* max samples in s direction */
125 REAL t_steps; /* max samples in t direction */
126 REAL sampling_method;
127 REAL culling_method; /* check for culling */
128 REAL bbox_subdividing;
129 Mapdesc * next;
130 Backend & backend;
131
132 void bbox( REAL [2][MAXCOORDS], REAL *, int, int, int, int );
133 REAL maxDifference( int, REAL *, int );
134 static void copy( Maxmatrix, long, INREAL *, long, long );
135
136 /* individual control point routines */
137 static void transform4d( float[4], float[4], float[4][4] );
138 static void multmatrix4d ( float[4][4], const float[4][4],
139 const float[4][4] );
140 void copyPt( REAL *, REAL * );
141 void sumPt( REAL *, REAL *, REAL *, REAL, REAL );
142 void xformSampling( REAL *, REAL * );
143 void xformCulling( REAL *, REAL * );
144 void xformRational( Maxmatrix, REAL *, REAL * );
145 void xformNonrational( Maxmatrix, REAL *, REAL * );
146 unsigned int clipbits( REAL * );
147 };
148
149 inline void
150 Mapdesc::setBmat( INREAL *mat, long rstride, long cstride )
151 {
152 copy( bmat, hcoords, mat, rstride, cstride );
153 }
154
155 inline void
156 Mapdesc::setCmat( INREAL *mat, long rstride, long cstride )
157 {
158 copy( cmat, hcoords, mat, rstride, cstride );
159 }
160
161 inline void
162 Mapdesc::setSmat( INREAL *mat, long rstride, long cstride )
163 {
164 copy( smat, hcoords, mat, rstride, cstride );
165 }
166
167 inline long
168 Mapdesc::getType( void )
169 {
170 return type;
171 }
172
173 inline void
174 Mapdesc::xformCulling( REAL *d, REAL *s )
175 {
176 if( isrational )
177 xformRational( cmat, d, s );
178 else
179 xformNonrational( cmat, d, s );
180 }
181
182 inline void
183 Mapdesc::xformSampling( REAL *d, REAL *s )
184 {
185 if( isrational )
186 xformRational( smat, d, s );
187 else
188 xformNonrational( smat, d, s );
189 }
190
191 inline int
192 Mapdesc::isRational( void )
193 {
194 return isrational ? 1 : 0;
195 }
196
197 inline int
198 Mapdesc::getNcoords( void )
199 {
200 return ncoords;
201 }
202
203 inline int
204 Mapdesc::isConstantSampling( void )
205 {
206 return ((sampling_method == N_FIXEDRATE) ? 1 : 0);
207 }
208
209 inline int
210 Mapdesc::isDomainSampling( void )
211 {
212 return ((sampling_method == N_DOMAINDISTANCE) ? 1 : 0);
213 }
214
215 inline int
216 Mapdesc::isParametricDistanceSampling( void )
217 {
218 return ((sampling_method == N_PARAMETRICDISTANCE) ? 1 : 0);
219 }
220
221 inline int
222 Mapdesc::isObjectSpaceParaSampling( void )
223 {
224 return ((sampling_method == N_OBJECTSPACE_PARA) ? 1 : 0);
225 }
226
227 inline int
228 Mapdesc::isObjectSpacePathSampling( void )
229 {
230 return ((sampling_method == N_OBJECTSPACE_PATH) ? 1 : 0);
231 }
232
233 inline int
234 Mapdesc::isSurfaceAreaSampling( void )
235 {
236 return ((sampling_method == N_SURFACEAREA) ? 1 : 0);
237 }
238
239 inline int
240 Mapdesc::isPathLengthSampling( void )
241 {
242 return ((sampling_method == N_PATHLENGTH) ? 1 : 0);
243 }
244
245 inline int
246 Mapdesc::isRangeSampling( void )
247 {
248 return ( isParametricDistanceSampling() || isPathLengthSampling() ||
249 isSurfaceAreaSampling() ||
250 isObjectSpaceParaSampling() ||
251 isObjectSpacePathSampling());
252 }
253
254 inline int
255 Mapdesc::isSampling( void )
256 {
257 return isRangeSampling() || isConstantSampling() || isDomainSampling();
258 }
259
260 inline int
261 Mapdesc::isCulling( void )
262 {
263 return ((culling_method != N_NOCULLING) ? 1 : 0);
264 }
265
266 inline int
267 Mapdesc::isBboxSubdividing( void )
268 {
269 return ((bbox_subdividing != N_NOBBOXSUBDIVISION) ? 1 : 0);
270 }
271 #endif /* __glumapdesc_h_ */