159 lines
4.8 KiB
C++
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_ */
|