#define WFO_FAILURE FALSE #define WFO_SUCCESS TRUE #define PI 3.141592653589793 #define TWO_PI 2.0*PI #define ZERO_EPS 0.00000001 //#define VARRAY 1 static const double CoplanarThresholdAngle = PI/180.0/2.0; // 0.5 degreees // outline prim types #define PRIM_LINE 3 #define PRIM_CURVE 4 typedef struct { FLOAT x,y; } POINT2D; typedef struct { FLOAT x,y,z; } POINT3D; typedef struct { DWORD primType; DWORD nVerts; DWORD VertIndex;// index into Loop's VertBuf POINT2D *pVert; // ptr to vertex list in Loop's VertBuf POINT3D *pFNorm; // face normals POINT3D *pVNorm; // vertex normals } PRIM; typedef struct { PRIM *PrimBuf; // array of prims DWORD nPrims; DWORD PrimBufSize; POINT2D *VertBuf; // buffer of vertices for the loop DWORD nVerts; DWORD VertBufSize; POINT3D *FNormBuf; // buffer of face normals POINT3D *VNormBuf; // buffer of vertex normals } LOOP; typedef struct { LOOP *LoopBuf; // array of loops DWORD nLoops; DWORD LoopBufSize; } LOOP_LIST; typedef struct { FLOAT zExtrusion; INT extrType; FLOAT* FaceBuf; DWORD FaceBufSize; DWORD FaceBufIndex; DWORD FaceVertexCountIndex; #ifdef VARRAY FLOAT* vaBuf; DWORD vaBufSize; #endif #ifdef FONT_DEBUG BOOL bSidePolys; BOOL bFacePolys; #endif GLenum TessErrorOccurred; } EXTRContext; // Memory pool for tesselation Combine callback #define POOL_SIZE 50 typedef struct MEM_POOL MEM_POOL; struct MEM_POOL { int index; // next free space in pool POINT2D pool[POOL_SIZE]; // memory pool MEM_POOL *next; // next pool }; typedef struct { GLenum TessErrorOccurred; FLOAT chordalDeviation; FLOAT scale; int format; UCHAR* glyphBuf; DWORD glyphSize; HFONT hfontOld; GLUtesselator* tess; MEM_POOL combinePool; // start of MEM_POOL chain MEM_POOL *curCombinePool; // currently active MEM_POOL EXTRContext *ec; } OFContext; // Outline Font Context extern EXTRContext* extr_Init( FLOAT extrusion, INT format ); extern void extr_Finish( EXTRContext *ec ); extern void extr_DrawLines( EXTRContext *ec, LOOP_LIST *pLoopList ); extern BOOL extr_DrawPolygons( EXTRContext *ec, LOOP_LIST *pLoopList ); #ifdef VARRAY extern void DrawFacePolygons( EXTRContext *ec, FLOAT z ); #endif extern BOOL extr_PolyInit( EXTRContext *ec ); extern void extr_PolyFinish( EXTRContext *ec ); extern void CALLBACK extr_glBegin( GLenum primType, void *data ); extern void CALLBACK extr_glVertex( GLfloat *v, void *data ); extern void CALLBACK extr_glEnd( void ); extern double CalcAngle( POINT2D *v1, POINT2D *v2 );