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 45typedef REAL Maxmatrix[MAXCOORDS][MAXCOORDS]; 46 47class Backend; 48 49class Mapdesc : public PooledObj { 50 friend class Maplist; 51 52public: 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 114private: 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 149inline void 150Mapdesc::setBmat( INREAL *mat, long rstride, long cstride ) 151{ 152 copy( bmat, hcoords, mat, rstride, cstride ); 153} 154 155inline void 156Mapdesc::setCmat( INREAL *mat, long rstride, long cstride ) 157{ 158 copy( cmat, hcoords, mat, rstride, cstride ); 159} 160 161inline void 162Mapdesc::setSmat( INREAL *mat, long rstride, long cstride ) 163{ 164 copy( smat, hcoords, mat, rstride, cstride ); 165} 166 167inline long 168Mapdesc::getType( void ) 169{ 170 return type; 171} 172 173inline void 174Mapdesc::xformCulling( REAL *d, REAL *s ) 175{ 176 if( isrational ) 177 xformRational( cmat, d, s ); 178 else 179 xformNonrational( cmat, d, s ); 180} 181 182inline void 183Mapdesc::xformSampling( REAL *d, REAL *s ) 184{ 185 if( isrational ) 186 xformRational( smat, d, s ); 187 else 188 xformNonrational( smat, d, s ); 189} 190 191inline int 192Mapdesc::isRational( void ) 193{ 194 return isrational ? 1 : 0; 195} 196 197inline int 198Mapdesc::getNcoords( void ) 199{ 200 return ncoords; 201} 202 203inline int 204Mapdesc::isConstantSampling( void ) 205{ 206 return ((sampling_method == N_FIXEDRATE) ? 1 : 0); 207} 208 209inline int 210Mapdesc::isDomainSampling( void ) 211{ 212 return ((sampling_method == N_DOMAINDISTANCE) ? 1 : 0); 213} 214 215inline int 216Mapdesc::isParametricDistanceSampling( void ) 217{ 218 return ((sampling_method == N_PARAMETRICDISTANCE) ? 1 : 0); 219} 220 221inline int 222Mapdesc::isObjectSpaceParaSampling( void ) 223{ 224 return ((sampling_method == N_OBJECTSPACE_PARA) ? 1 : 0); 225} 226 227inline int 228Mapdesc::isObjectSpacePathSampling( void ) 229{ 230 return ((sampling_method == N_OBJECTSPACE_PATH) ? 1 : 0); 231} 232 233inline int 234Mapdesc::isSurfaceAreaSampling( void ) 235{ 236 return ((sampling_method == N_SURFACEAREA) ? 1 : 0); 237} 238 239inline int 240Mapdesc::isPathLengthSampling( void ) 241{ 242 return ((sampling_method == N_PATHLENGTH) ? 1 : 0); 243} 244 245inline int 246Mapdesc::isRangeSampling( void ) 247{ 248 return ( isParametricDistanceSampling() || isPathLengthSampling() || 249 isSurfaceAreaSampling() || 250 isObjectSpaceParaSampling() || 251 isObjectSpacePathSampling()); 252} 253 254inline int 255Mapdesc::isSampling( void ) 256{ 257 return isRangeSampling() || isConstantSampling() || isDomainSampling(); 258} 259 260inline int 261Mapdesc::isCulling( void ) 262{ 263 return ((culling_method != N_NOCULLING) ? 1 : 0); 264} 265 266inline int 267Mapdesc::isBboxSubdividing( void ) 268{ 269 return ((bbox_subdividing != N_NOBBOXSUBDIVISION) ? 1 : 0); 270} 271#endif /* __glumapdesc_h_ */ 272