Home | History | Annotate | Line # | Download | only in internals
      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_ */
    272