⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mapdesc.cc

📁 mesa-6.5-minigui源码
💻 CC
📖 第 1 页 / 共 2 页
字号:
 *	or intersecting the viewing frustrum. *-------------------------------------------------------------------------- */intMapdesc::cullCheck( REAL *pts, int order, int stride ){    unsigned int inbits = mask;    unsigned int outbits  = 0;    REAL *p = pts;    for( REAL *pend = p + order * stride; p != pend; p += stride ) {	unsigned int bits = clipbits( p );	outbits |= bits;	inbits &= bits;	if( ( outbits == (unsigned int)mask ) && ( inbits != (unsigned int)mask ) ) return CULL_ACCEPT;    }    if( outbits != (unsigned int)mask ) {	return CULL_TRIVIAL_REJECT;    } else if( inbits == (unsigned int)mask ) {	return CULL_TRIVIAL_ACCEPT;    } else {	return CULL_ACCEPT;    }}/*-------------------------------------------------------------------------- * xformSampling - transform a set of points that may be EITHER  *	homogeneous or inhomogeneous depending on the map description  *	into sampling space  *-------------------------------------------------------------------------- */voidMapdesc::xformSampling( REAL *pts, int order, int stride, REAL *sp, int outstride ){    xformMat( smat, pts, order, stride, sp, outstride );}voidMapdesc::xformBounding( REAL *pts, int order, int stride, REAL *sp, int outstride ){    xformMat( bmat, pts, order, stride, sp, outstride );}/*-------------------------------------------------------------------------- * xformCulling - transform a set of points that may be EITHER  *	homogeneous or inhomogeneous depending on the map description  *	into culling space  *-------------------------------------------------------------------------- */voidMapdesc::xformCulling( REAL *pts, int order, int stride, REAL *cp, int outstride ){    xformMat( cmat, pts, order, stride, cp, outstride );}/*-------------------------------------------------------------------------- * xformCulling - transform a set of points that may be EITHER  *	homogeneous or inhomogeneous depending on the map description  *	into culling space  *-------------------------------------------------------------------------- */voidMapdesc::xformCulling( REAL *pts,     int uorder, int ustride,    int vorder, int vstride,     REAL *cp, int outustride, int outvstride ){    xformMat( cmat, pts, uorder, ustride, vorder, vstride, cp, outustride, outvstride );}/*-------------------------------------------------------------------------- * xformSampling - transform a set of points that may be EITHER  *	homogeneous or inhomogeneous depending on the map description  *	into sampling space  *-------------------------------------------------------------------------- */voidMapdesc::xformSampling( REAL *pts,     int uorder, int ustride,     int vorder, int vstride,     REAL *sp, int outustride, int outvstride ){    xformMat( smat, pts, uorder, ustride, vorder, vstride, sp, outustride, outvstride );}voidMapdesc::xformBounding( REAL *pts,     int uorder, int ustride,     int vorder, int vstride,     REAL *sp, int outustride, int outvstride ){    xformMat( bmat, pts, uorder, ustride, vorder, vstride, sp, outustride, outvstride );}voidMapdesc::xformMat(     Maxmatrix	mat,     REAL *	pts,     int 	order,     int 	stride,    REAL *	cp,     int 	outstride ){    if( isrational ) {	REAL *pend = pts + order * stride;	for( REAL *p = pts ; p != pend; p += stride ) {	    xformRational( mat, cp, p );	    cp += outstride;	}           } else {	REAL *pend = pts + order * stride;	for( REAL *p = pts ; p != pend; p += stride ) {	    xformNonrational( mat, cp, p );	    cp += outstride;	}	    }}voidMapdesc::xformMat( Maxmatrix mat, REAL *pts,     int uorder, int ustride,     int vorder, int vstride,     REAL *cp, int outustride, int outvstride ){    if( isrational ) {	REAL *pend = pts + uorder * ustride;	for( REAL *p = pts ; p != pend; p += ustride ) {	    REAL *cpts2 = cp;	    REAL *qend = p + vorder * vstride;	    for( REAL *q = p; q != qend; q += vstride ) {		xformRational( mat, cpts2, q );		cpts2 += outvstride;	    } 	    cp += outustride;	}    } else {	REAL *pend = pts + uorder * ustride;	for( REAL *p = pts ; p != pend; p += ustride ) {	    REAL *cpts2 = cp;	    REAL *qend = p + vorder * vstride;	    for( REAL *q = p; q != qend; q += vstride ) {		xformNonrational( mat, cpts2, q );		cpts2 += outvstride;	    } 	    cp += outustride;	}    }}/*-------------------------------------------------------------------------- * subdivide - subdivide a curve along an isoparametric line *-------------------------------------------------------------------------- */voidMapdesc::subdivide( REAL *src, REAL *dst, REAL v, int stride, int order ){    REAL mv = 1.0 - v;    for( REAL *send=src+stride*order; src!=send; send-=stride, dst+=stride ) {	copyPt( dst, src );	REAL *qpnt = src + stride;	for( REAL *qp=src; qpnt!=send; qp=qpnt, qpnt+=stride )	    sumPt( qp, qp, qpnt, mv, v );    }}/*-------------------------------------------------------------------------- * subdivide - subdivide a patch along an isoparametric line *-------------------------------------------------------------------------- */voidMapdesc::subdivide( REAL *src, REAL *dst, REAL v,     int so, int ss, int to, int ts  ){    REAL mv = 1.0 - v;    for( REAL *slast = src+ss*so; src != slast; src += ss, dst += ss ) {	REAL *sp = src;	REAL *dp = dst;        for( REAL *send = src+ts*to; sp != send; send -= ts, dp += ts ) {	    copyPt( dp, sp );	    REAL *qp = sp;	    for( REAL *qpnt = sp+ts; qpnt != send; qp = qpnt, qpnt += ts )	        sumPt( qp, qp, qpnt, mv, v );	}    }}#define sign(x)	((x > 0) ? 1 : ((x < 0.0) ? -1 : 0))/*-------------------------------------------------------------------------- * project - project a set of homogeneous coordinates into inhomogeneous ones *-------------------------------------------------------------------------- */intMapdesc::project( REAL *src, int rstride, int cstride, 	          REAL *dest, int trstride, int tcstride,		  int nrows, int ncols ){    int s = sign( src[inhcoords] );    REAL *rlast = src + nrows * rstride;    REAL *trptr = dest;    for( REAL *rptr=src; rptr != rlast; rptr+=rstride, trptr+=trstride ) {	REAL *clast = rptr + ncols * cstride;	REAL *tcptr = trptr;	for( REAL *cptr = rptr; cptr != clast; cptr+=cstride, tcptr+=tcstride ) {	    REAL *coordlast = cptr + inhcoords;	    if( sign( *coordlast ) != s ) return 0;	    REAL *tcoord = tcptr;	    for( REAL *coord = cptr; coord != coordlast; coord++, tcoord++ ) {		*tcoord = *coord / *coordlast;	    }	}    }    return 1;}/*-------------------------------------------------------------------------- * project - project a set of homogeneous coordinates into inhomogeneous ones *-------------------------------------------------------------------------- */intMapdesc::project( REAL *src, int stride, REAL *dest, int tstride, int ncols ){    int s = sign( src[inhcoords] );    REAL *clast = src + ncols * stride;    for( REAL *cptr = src, *tcptr = dest; cptr != clast; cptr+=stride, tcptr+=tstride ) {	REAL *coordlast = cptr + inhcoords;	if( sign( *coordlast ) != s ) return 0;	for( REAL *coord = cptr, *tcoord = tcptr; coord != coordlast; coord++, tcoord++ ) 	    *tcoord = *coord / *coordlast;    }    return 1;}intMapdesc::bboxTooBig(     REAL *p,     int	 rstride,    int	 cstride,    int	 nrows,    int	 ncols,    REAL bb[2][MAXCOORDS] ){    REAL bbpts[MAXORDER][MAXORDER][MAXCOORDS];    const int trstride = sizeof(bbpts[0]) / sizeof(REAL);    const int tcstride = sizeof(bbpts[0][0]) / sizeof(REAL);     // points have been transformed, therefore they are homogeneous    // project points    int val = project( p, rstride, cstride, 	     &bbpts[0][0][0], trstride, tcstride, nrows, ncols );    if( val == 0 ) return -1;    // compute bounding box    bbox( bb, &bbpts[0][0][0], trstride, tcstride, nrows, ncols );    // find out if bounding box can't fit in unit cube    if( bbox_subdividing == N_BBOXROUND ) {	for( int k=0; k != inhcoords; k++ )	    if( ceilf(bb[1][k]) - floorf(bb[0][k]) > bboxsize[k] ) return 1;    } else {	for( int k=0; k != inhcoords; k++ )	    if( bb[1][k] - bb[0][k] > bboxsize[k] ) return 1;    }    return 0;  }voidMapdesc::bbox(     REAL bb[2][MAXCOORDS],     REAL *p,     int	 rstride,    int	 cstride,    int	 nrows,    int	 ncols ){    int k;    for( k=0; k != inhcoords; k++ )	 bb[0][k] = bb[1][k] = p[k];    for( int i=0; i != nrows; i++ ) 	for( int j=0; j != ncols; j++ ) 	    for( k=0; k != inhcoords; k++ ) {		REAL x = p[i*rstride + j*cstride + k];		if(  x < bb[0][k] ) bb[0][k] = x;		else if( x > bb[1][k] ) bb[1][k] = x;	    }}/*-------------------------------------------------------------------------- * calcVelocityRational - calculate upper bound on first partial derivative  *	of a homogeneous set of points and bounds on each row of points. *-------------------------------------------------------------------------- */REALMapdesc::calcVelocityRational( REAL *p, int stride, int ncols ){    REAL tmp[MAXORDER][MAXCOORDS];    assert( ncols <= MAXORDER );    const int tstride = sizeof(tmp[0]) / sizeof(REAL);     if( project( p, stride, &tmp[0][0], tstride, ncols ) ) {	return calcPartialVelocity( &tmp[0][0], tstride, ncols, 1, 1.0 );    } else { /* XXX */	return calcPartialVelocity( &tmp[0][0], tstride, ncols, 1, 1.0 );    }}/*-------------------------------------------------------------------------- * calcVelocityNonrational - calculate upper bound on  first partial  *	derivative of a inhomogeneous set of points. *-------------------------------------------------------------------------- */REALMapdesc::calcVelocityNonrational( REAL *pts, int stride, int ncols ){    return calcPartialVelocity( pts, stride, ncols, 1, 1.0 );}intMapdesc::isProperty( long property ){    switch ( property ) {	case N_PIXEL_TOLERANCE:	case N_ERROR_TOLERANCE:	case N_CULLING:	case N_BBOX_SUBDIVIDING:	case N_S_STEPS:	case N_T_STEPS:        case N_SAMPLINGMETHOD:        case N_CLAMPFACTOR:        case N_MINSAVINGS:	    return 1;	default:	    return 0;    }}REALMapdesc::getProperty( long property ){    switch ( property ) {	case N_PIXEL_TOLERANCE:	    return pixel_tolerance;	case N_ERROR_TOLERANCE:	    return error_tolerance;	case N_CULLING:	    return culling_method;	case N_BBOX_SUBDIVIDING:	    return bbox_subdividing;	case N_S_STEPS:	    return s_steps;	case N_T_STEPS:	    return t_steps;        case N_SAMPLINGMETHOD:	    return sampling_method;        case N_CLAMPFACTOR:	    return clampfactor;        case N_MINSAVINGS:	    return minsavings;	default:	    abort();	    return -1; //not necessary, needed to shut up compiler    }}voidMapdesc::setProperty( long property, REAL value ){    switch ( property ) {	case N_PIXEL_TOLERANCE:	    pixel_tolerance = value;	    break;	case N_ERROR_TOLERANCE:	    error_tolerance = value;	    break;	case N_CULLING:	    culling_method = value;	    break;	case N_BBOX_SUBDIVIDING:	    if( value <= 0.0 ) value = N_NOBBOXSUBDIVISION;	    bbox_subdividing = value;	    break;	case N_S_STEPS:	    if( value < 0.0 ) value = 0.0;	    s_steps = value;	    maxrate = ( value < 0.0 ) ? 0.0 : value;	    maxsrate = ( value < 0.0 ) ? 0.0 : value;	    break;	case N_T_STEPS:	    if( value < 0.0 ) value = 0.0;	    t_steps = value;	    maxtrate = ( value < 0.0 ) ? 0.0 : value;	    break;	case N_SAMPLINGMETHOD:	    sampling_method = value;	    break;	case N_CLAMPFACTOR:	    if( value <= 0.0 ) value = N_NOCLAMPING;	    clampfactor = value;	    break;	case N_MINSAVINGS:	    if( value <= 0.0 ) value = N_NOSAVINGSSUBDIVISION;	    minsavings = value;	    break;	default:	    abort();	    break;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -