Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygencurve.cc
Go to the documentation of this file.
00001 /* 00002 ** License Applicability. Except to the extent portions of this file are 00003 ** made subject to an alternative license as permitted in the SGI Free 00004 ** Software License B, Version 1.1 (the "License"), the contents of this 00005 ** file are subject only to the provisions of the License. You may not use 00006 ** this file except in compliance with the License. You may obtain a copy 00007 ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 00008 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: 00009 ** 00010 ** http://oss.sgi.com/projects/FreeB 00011 ** 00012 ** Note that, as provided in the License, the Software is distributed on an 00013 ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS 00014 ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND 00015 ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A 00016 ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. 00017 ** 00018 ** Original Code. The Original Code is: OpenGL Sample Implementation, 00019 ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, 00020 ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. 00021 ** Copyright in any portions created by third parties is as indicated 00022 ** elsewhere herein. All Rights Reserved. 00023 ** 00024 ** Additional Notice Provisions: The application programming interfaces 00025 ** established by SGI in conjunction with the Original Code are The 00026 ** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released 00027 ** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version 00028 ** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X 00029 ** Window System(R) (Version 1.3), released October 19, 1998. This software 00030 ** was created using the OpenGL(R) version 1.2.1 Sample Implementation 00031 ** published by SGI, but has not been independently verified as being 00032 ** compliant with the OpenGL(R) version 1.2.1 Specification. 00033 */ 00034 00035 /* 00036 * curve.c++ 00037 * 00038 * $Date: 2006-03-12 00:07:02 +0000 (Sun, 12 Mar 2006) $ $Revision: 1.1 $ 00039 * $Header: /cygdrive/c/RCVS/CVS/ReactOS/reactos/lib/glu32/libnurbs/internals/curve.cc,v 1.1 2004/02/02 16:39:11 navaraf Exp $ 00040 */ 00041 00042 #include "glimports.h" 00043 #include "myassert.h" 00044 #include "mystdio.h" 00045 #include "mymath.h" 00046 #include "curve.h" 00047 #include "mapdesc.h" 00048 #include "types.h" 00049 #include "quilt.h" 00050 #include "nurbsconsts.h" 00051 00052 /*-------------------------------------------------------------------------- 00053 * Curve::Curve - copy curve from quilt and transform control points 00054 *-------------------------------------------------------------------------- 00055 */ 00056 00057 Curve::Curve( Quilt_ptr geo, REAL pta, REAL ptb, Curve *c ) 00058 { 00059 mapdesc = geo->mapdesc; 00060 next = c; 00061 needsSampling = mapdesc->isRangeSampling() ? 1 : 0; 00062 cullval = mapdesc->isCulling() ? CULL_ACCEPT : CULL_TRIVIAL_ACCEPT; 00063 order = geo->qspec[0].order; 00064 stride = MAXCOORDS; 00065 00066 REAL *ps = geo->cpts; 00067 Quiltspec_ptr qs = geo->qspec; 00068 ps += qs->offset; 00069 ps += qs->index * qs->order * qs->stride; 00070 00071 if( needsSampling ) 00072 mapdesc->xformSampling( ps, qs->order, qs->stride, spts, stride ); 00073 00074 if( cullval == CULL_ACCEPT ) 00075 mapdesc->xformCulling( ps, qs->order, qs->stride, cpts, stride ); 00076 00077 /* set untrimmed curve range */ 00078 range[0] = qs->breakpoints[qs->index]; 00079 range[1] = qs->breakpoints[qs->index+1]; 00080 range[2] = range[1] - range[0]; 00081 00082 if( range[0] != pta ) { 00083 Curve lower( *this, pta, 0 ); 00084 lower.next = next; 00085 *this = lower; 00086 } 00087 if( range[1] != ptb ) { 00088 Curve lower( *this, ptb, 0 ); 00089 } 00090 } 00091 00092 /*-------------------------------------------------------------------------- 00093 * Curve::Curve - subdivide a curve along an isoparametric line 00094 *-------------------------------------------------------------------------- 00095 */ 00096 00097 Curve::Curve( Curve& upper, REAL value, Curve *c ) 00098 { 00099 Curve &lower = *this; 00100 00101 lower.next = c; 00102 lower.mapdesc = upper.mapdesc; 00103 lower.needsSampling = upper.needsSampling; 00104 lower.order = upper.order; 00105 lower.stride = upper.stride; 00106 lower.cullval = upper.cullval; 00107 00108 REAL d = (value - upper.range[0]) / upper.range[2]; 00109 00110 if( needsSampling ) 00111 mapdesc->subdivide( upper.spts, lower.spts, d, upper.stride, upper.order ); 00112 00113 if( cullval == CULL_ACCEPT ) 00114 mapdesc->subdivide( upper.cpts, lower.cpts, d, upper.stride, upper.order ); 00115 00116 lower.range[0] = upper.range[0]; 00117 lower.range[1] = value; 00118 lower.range[2] = value - upper.range[0]; 00119 upper.range[0] = value; 00120 upper.range[2] = upper.range[1] - value; 00121 } 00122 00123 00124 /*-------------------------------------------------------------------------- 00125 * Curve::clamp - clamp the sampling rate to a given maximum 00126 *-------------------------------------------------------------------------- 00127 */ 00128 00129 void 00130 Curve::clamp( void ) 00131 { 00132 if( stepsize < minstepsize ) 00133 stepsize = mapdesc->clampfactor * minstepsize; 00134 } 00135 00136 void 00137 Curve::setstepsize( REAL max ) 00138 { 00139 stepsize = ( max >= 1.0 ) ? (range[2] / max) : range[2]; 00140 minstepsize = stepsize; 00141 } 00142 00143 void 00144 Curve::getstepsize( void ) 00145 { 00146 minstepsize= 0; 00147 00148 if( mapdesc->isConstantSampling() ) { 00149 // fixed number of samples per patch in each direction 00150 // maxrate is number of s samples per patch 00151 setstepsize( mapdesc->maxrate ); 00152 } else if( mapdesc->isDomainSampling() ) { 00153 // maxrate is number of s samples per unit s length of domain 00154 setstepsize( mapdesc->maxrate * range[2] ); 00155 } else { 00156 // upper bound on path length between sample points 00157 00158 assert( order <= MAXORDER ); 00159 00160 /* points have been transformed, therefore they are homogeneous */ 00161 REAL tmp[MAXORDER][MAXCOORDS]; 00162 const int tstride = sizeof(tmp[0]) / sizeof(REAL); 00163 int val = mapdesc->project( spts, stride, &tmp[0][0], tstride, order ); 00164 00165 if( val == 0 ) { 00166 // control points cross infinity, therefore derivatives are undefined 00167 setstepsize( mapdesc->maxrate ); 00168 } else { 00169 REAL t = mapdesc->getProperty( N_PIXEL_TOLERANCE ); 00170 if( mapdesc->isParametricDistanceSampling() ) { 00171 REAL d = mapdesc->calcPartialVelocity( &tmp[0][0], tstride, order, 2, range[2] ); 00172 stepsize = (d > 0.0) ? sqrtf( 8.0 * t / d ) : range[2]; 00173 minstepsize = ( mapdesc->maxrate > 0.0 ) ? (range[2] / mapdesc->maxrate) : 0.0; 00174 } else if( mapdesc->isPathLengthSampling() ) { 00175 // t is upper bound on path (arc) length 00176 REAL d = mapdesc->calcPartialVelocity( &tmp[0][0], tstride, order, 1, range[2] ); 00177 stepsize = ( d > 0.0 ) ? (t / d) : range[2]; 00178 minstepsize = ( mapdesc->maxrate > 0.0 ) ? (range[2] / mapdesc->maxrate) : 0.0; 00179 } else { 00180 // control points cross infinity, therefore partials are undefined 00181 setstepsize( mapdesc->maxrate ); 00182 } 00183 } 00184 } 00185 } 00186 00187 int 00188 Curve::needsSamplingSubdivision( void ) 00189 { 00190 return ( stepsize < minstepsize ) ? 1 : 0; 00191 } 00192 00193 int 00194 Curve::cullCheck( void ) 00195 { 00196 if( cullval == CULL_ACCEPT ) 00197 cullval = mapdesc->cullCheck( cpts, order, stride ); 00198 return cullval; 00199 } 00200 Generated on Mon May 28 2012 04:23:30 for ReactOS by
1.7.6.1
|