ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

curve.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.