| /* |
| * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) |
| * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice including the dates of first publication and |
| * either this permission notice or a reference to |
| * http://oss.sgi.com/projects/FreeB/ |
| * shall be included in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
| * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF |
| * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| * SOFTWARE. |
| * |
| * Except as contained in this notice, the name of Silicon Graphics, Inc. |
| * shall not be used in advertising or otherwise to promote the sale, use or |
| * other dealings in this Software without prior written authorization from |
| * Silicon Graphics, Inc. |
| */ |
| |
| /* |
| * subdivider.h |
| * |
| * $Date: 2012/03/29 17:22:18 $ $Revision: 1.1.1.1 $ |
| * $Header: /cvs/bao-parsec/pkgs/libs/mesa/src/src/glu/sgi/libnurbs/internals/subdivider.h,v 1.1.1.1 2012/03/29 17:22:18 uid42307 Exp $ |
| */ |
| |
| #ifndef __glusubdivider_h_ |
| #define __glusubdivider_h_ |
| |
| #include "mysetjmp.h" |
| #include "bin.h" |
| #include "flist.h" |
| #include "slicer.h" |
| #include "arctess.h" |
| #include "trimvertex.h" |
| #include "trimvertpool.h" |
| |
| class Arc; |
| class Pool; |
| class Renderhints; |
| class Quilt; |
| class Patchlist; |
| class Curvelist; |
| struct JumpBuffer; |
| |
| class Subdivider { |
| public: |
| Subdivider( Renderhints&, Backend& ); |
| ~Subdivider( void ); |
| void clear( void ); |
| |
| void beginTrims( void ) {} |
| void beginLoop( void ); |
| void addArc( REAL *, Quilt *, long ); |
| void addArc( int, TrimVertex *, long ); |
| void endLoop( void ) {} |
| void endTrims( void ) {} |
| |
| void beginQuilts( void ); |
| void addQuilt( Quilt * ); |
| void endQuilts( void ) {} |
| |
| void drawCurves( void ); |
| void drawSurfaces( long ); |
| |
| int ccwTurn_sl( Arc_ptr, Arc_ptr ); |
| int ccwTurn_sr( Arc_ptr , Arc_ptr ); |
| int ccwTurn_tl( Arc_ptr , Arc_ptr ); |
| int ccwTurn_tr( Arc_ptr , Arc_ptr ); |
| |
| void setJumpbuffer( JumpBuffer * ); |
| |
| void set_domain_distance_u_rate(REAL u_rate) |
| { |
| domain_distance_u_rate = u_rate; |
| } |
| void set_domain_distance_v_rate(REAL v_rate) |
| { |
| domain_distance_v_rate = v_rate; |
| } |
| void set_is_domain_distance_sampling(int flag) |
| { |
| is_domain_distance_sampling = flag; |
| } |
| |
| private: |
| void classify_headonleft_s( Bin &, Bin &, Bin &, REAL ); |
| void classify_tailonleft_s( Bin &, Bin &, Bin &, REAL ); |
| void classify_headonright_s( Bin &, Bin &, Bin &, REAL ); |
| void classify_tailonright_s( Bin &, Bin &, Bin &, REAL ); |
| void classify_headonleft_t( Bin &, Bin &, Bin &, REAL ); |
| void classify_tailonleft_t( Bin &, Bin &, Bin &, REAL ); |
| void classify_headonright_t( Bin &, Bin &, Bin &, REAL ); |
| void classify_tailonright_t( Bin &, Bin &, Bin &, REAL ); |
| |
| enum dir { down, same, up, none }; |
| void tessellate( Arc_ptr, REAL ); |
| void monotonize( Arc_ptr , Bin & ); |
| int isMonotone( Arc_ptr ); |
| int decompose( Bin &, REAL ); |
| |
| |
| Slicer slicer; |
| ArcTessellator arctessellator; |
| Pool arcpool; |
| Pool bezierarcpool; |
| Pool pwlarcpool; |
| TrimVertexPool trimvertexpool; |
| |
| JumpBuffer* jumpbuffer; |
| Renderhints& renderhints; |
| Backend& backend; |
| |
| Bin initialbin; |
| Arc_ptr pjarc; |
| int s_index; |
| int t_index; |
| Quilt * qlist; |
| Flist spbrkpts; |
| Flist tpbrkpts; |
| Flist smbrkpts; |
| Flist tmbrkpts; |
| REAL stepsizes[4]; |
| int showDegenerate; |
| int isArcTypeBezier; |
| |
| void samplingSplit( Curvelist&, int ); |
| |
| void subdivideInS( Bin& ); |
| void splitInS( Bin&, int, int ); |
| void splitInT( Bin&, int, int ); |
| void samplingSplit( Bin&, Patchlist&, int, int ); |
| void nonSamplingSplit( Bin&, Patchlist&, int, int ); |
| void tessellation( Bin&, Patchlist& ); |
| void monosplitInS( Bin&, int, int ); |
| void monosplitInT( Bin&, int, int ); |
| |
| void outline( Bin & ); |
| void freejarcs( Bin & ); |
| void render( Bin & ); |
| void split( Bin &, Bin &, Bin &, int, REAL ); |
| void tessellate( Bin &, REAL, REAL, REAL, REAL ); |
| |
| inline void setDegenerate( void ) { showDegenerate = 1; } |
| inline void setNonDegenerate( void ) { showDegenerate = 0; } |
| inline int showingDegenerate( void ) { return showDegenerate; } |
| inline void setArcTypeBezier( void ) { isArcTypeBezier = 1; } |
| inline void setArcTypePwl( void ) { isArcTypeBezier = 0; } |
| inline int isBezierArcType( void ) { return isArcTypeBezier; } |
| |
| void makeBorderTrim( const REAL *, const REAL * ); |
| void split( Bin &, int, const REAL *, int, int ); |
| void partition( Bin &, Bin &, Bin &, Bin &, Bin &, int, REAL ); |
| void findIrregularS( Bin & ); |
| void findIrregularT( Bin & ); |
| |
| |
| inline int bbox( TrimVertex *, TrimVertex *, TrimVertex *, int ); |
| static int bbox( REAL, REAL, REAL, REAL, REAL, REAL ); |
| static int ccw( TrimVertex *, TrimVertex *, TrimVertex * ); |
| void join_s( Bin &, Bin &, Arc_ptr, Arc_ptr ); |
| void join_t( Bin &, Bin &, Arc_ptr , Arc_ptr ); |
| int arc_split( Arc_ptr , int, REAL, int ); |
| void check_s( Arc_ptr , Arc_ptr ); |
| void check_t( Arc_ptr , Arc_ptr ); |
| inline void link( Arc_ptr , Arc_ptr , Arc_ptr , Arc_ptr ); |
| inline void simple_link( Arc_ptr , Arc_ptr ); |
| |
| Bin* makePatchBoundary( const REAL *from, const REAL *to ); |
| |
| /*in domain distance method, the tessellation is controled by two numbers: |
| *GLU_U_STEP: number of u-segments per unit u length of domain |
| *GLU_V_STEP: number of v-segments per unit v length of domain |
| *These two numbers are normally stored in mapdesc->maxs(t)rate. |
| *I (ZL) put these two numbers here so that I can optimize the untrimmed |
| *case in the case of domain distance sampling. |
| *These two numbers are set by set_domain_distance_u_rate() and ..._v_..(). |
| */ |
| REAL domain_distance_u_rate; |
| REAL domain_distance_v_rate; |
| int is_domain_distance_sampling; |
| }; |
| |
| inline void |
| Subdivider::beginLoop( void ) |
| { |
| pjarc = 0; |
| } |
| |
| |
| #endif /* __glusubdivider_h_ */ |