Windows2003-3790/multimedia/opengl/glu/nurbs/core/subdivid.h
2020-09-30 16:53:55 +02:00

159 lines
4.8 KiB
C++

#ifndef __glusubdivider_h_
#define __glusubdivider_h_
/**************************************************************************
* *
* Copyright (C) 1992, Silicon Graphics, Inc. *
* *
* These coded instructions, statements, and computer programs contain *
* unpublished proprietary information of Silicon Graphics, Inc., and *
* are protected by Federal copyright law. They may not be disclosed *
* to third parties or copied or duplicated in any form, in whole or *
* in part, without the prior written consent of Silicon Graphics, Inc. *
* *
**************************************************************************/
/*
* subdivider.h - $Revision: 1.1 $
*/
#include "mysetjmp.h"
#include "bin.h"
#include "flist.h"
#include "slicer.h"
#include "arctess.h"
#include "trimvert.h"
#include "trimpool.h"
class Arc;
class Pool;
class Renderhints;
class Backend;
class Quilt;
class Patchlist;
class Curvelist;
#ifdef NT
struct JumpBuffer;
#else
class JumpBuffer;
#endif
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 *, Arc * );
int ccwTurn_sr( Arc *, Arc * );
int ccwTurn_tl( Arc *, Arc * );
int ccwTurn_tr( Arc *, Arc * );
void setJumpbuffer( JumpBuffer * );
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 *, REAL );
void monotonize( Arc *, Bin & );
int isMonotone( Arc * );
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 * 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 *, Arc * );
void join_t( Bin &, Bin &, Arc *, Arc * );
int arc_split( Arc *, int, REAL, int );
void check_s( Arc *, Arc * );
void check_t( Arc *, Arc * );
inline void link( Arc *, Arc *, Arc *, Arc * );
inline void simple_link( Arc *, Arc * );
};
inline void
Subdivider::beginLoop( void )
{
pjarc = 0;
}
#endif /* __glusubdivider_h_ */