home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-385-Vol-1of3.iso
/
i
/
iritsm3s.zip
/
cagd_lib
/
cagd_loc.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-01-28
|
5KB
|
124 lines
/******************************************************************************
* Cagd_loc.h - header file for the CAGD library. *
* This header is local to the library - it is NOT external. *
*******************************************************************************
* Written by Gershon Elber, Mar. 90. *
******************************************************************************/
#ifndef CAGD_LOC_H
#define CAGD_LOC_H
#include <stdio.h>
#include <math.h>
#include "irit_sm.h"
typedef enum TokenNumType { /* Tokens are returned by _CagdGetToken routines. */
TOKEN_EOF,
TOKEN_OPEN_PAREN,
TOKEN_CLOSE_PAREN,
TOKEN_BEZIER,
TOKEN_BSPLINE,
TOKEN_POWER,
TOKEN_CURVE,
TOKEN_SURFACE,
TOKEN_PTYPE,
TOKEN_NUM_PTS,
TOKEN_ORDER,
TOKEN_KV,
TOKEN_OTHER
} TokenNumType;
/******************************************************************************
* Some lists simplifying operators. *
******************************************************************************/
#define CAGD_LIST_PUSH(New, List) { (New) -> Pnext = (List); \
(List) = (New); }
#define CAGD_LIST_POP(Head, List) { (Head) = (List); \
(List) = (List) -> Pnext; \
(Head) -> Pnext = NULL; }
#define CAGD_LIST_LAST(Elem) { if (Elem) \
while ((Elem) -> Pnext) \
(Elem) = (Elem) -> Pnext; }
/******************************************************************************
* Some points/ectors simplifying operators. *
******************************************************************************/
#define CAGD_COPY_POINT(DstPt, SrcPt) { (DstPt) = (SrcPt); }
#define CAGD_RESET_POINT(DstPt) { (DstPt).Pt[0] = \
(DstPt).Pt[1] = \
(DstPt).Pt[2] = 0.0; }
#define CAGD_ADD_POINT(DstPt, SrcPt) { (DstPt).Pt[0] += (SrcPt).Pt[0]; \
(DstPt).Pt[1] += (SrcPt).Pt[1]; \
(DstPt).Pt[2] += (SrcPt).Pt[2]; }
#define CAGD_SUB_POINT(DstPt, SrcPt) { (DstPt).Pt[0] -= (SrcPt).Pt[0]; \
(DstPt).Pt[1] -= (SrcPt).Pt[1]; \
(DstPt).Pt[2] -= (SrcPt).Pt[2]; }
#define CAGD_MULT_POINT(DstPt, Scaler) { (DstPt).Pt[0] *= (Scaler); \
(DstPt).Pt[1] *= (Scaler); \
(DstPt).Pt[2] *= (Scaler); }
#define CAGD_COPY_VECTOR(DstVec, SrcVec) { (DstVec) = (SrcVec); }
#define CAGD_RESET_VECTOR(DstVec) { (DstVec).Vec[0] = \
(DstVec).Vec[1] = \
(DstVec).Vec[2] = 0.0; }
#define CAGD_ADD_VECTOR(DstVec, SrcVec) { (DstVec).Vec[0] += (SrcVec).Vec[0]; \
(DstVec).Vec[1] += (SrcVec).Vec[1]; \
(DstVec).Vec[2] += (SrcVec).Vec[2]; }
#define CAGD_SUB_VECTOR(DstVec, SrcVec) { (DstVec).Vec[0] -= (SrcVec).Vec[0]; \
(DstVec).Vec[1] -= (SrcVec).Vec[1]; \
(DstVec).Vec[2] -= (SrcVec).Vec[2]; }
#define CAGD_MULT_VECTOR(DstVec, Scaler){ (DstVec).Vec[0] *= (Scaler); \
(DstVec).Vec[1] *= (Scaler); \
(DstVec).Vec[2] *= (Scaler); }
#define CAGD_DIV_VECTOR(DstVec, Scaler) { (DstVec).Vec[0] /= (Scaler); \
(DstVec).Vec[1] /= (Scaler); \
(DstVec).Vec[2] /= (Scaler); }
#define CAGD_LEN_VECTOR(V) sqrt(SQR((V).Vec[0]) + \
SQR((V).Vec[1]) + \
SQR((V).Vec[2]))
#define CAGD_NORMALIZE_VECTOR(V) { CagdRType __t = CAGD_LEN_VECTOR(V); \
if (!APX_EQ(__t, 0.0)) \
CAGD_DIV_VECTOR((V), __t); }
/******************************************************************************
* This macro is called when the library has detected an unrecoverable error. *
* Default action is to call CagdFatalError, but you may want to reroute this *
* to invoke your handler and recover yourself (by long jump for example). *
******************************************************************************/
#define FATAL_ERROR(Msg) CagdFatalError(Msg)
#define INFINITY 1e6
#define W 0 /* Positions of points in Points array (see structs below). */
#define X 1
#define Y 2
#define Z 3
#include "cagd_lib.h" /* Include the extrenal header as well. */
/* Declaration of extrenal variables local to the cagd library only. */
extern int _CagdGlblLineCount; /* Used to locate errors in input file. */
extern CagdLin2PolyType _CagdLin2Poly; /* Linear srf convertion to polys. */
/* Declarations of functions local to the Cagd library only. */
char *_CagdGetCurveAttributes(FILE *f);
char *_CagdGetSurfaceAttributes(FILE *f);
void _CagdUnGetToken(char *StringToken);
TokenNumType _CagdGetToken(FILE *f, char *StringToken);
char *_CagdReal2Str(double R);
CagdPolygonStruct *_CagdMakePolygon(CagdBType ComputeNormals,
CagdPtStruct *Pt1,
CagdPtStruct *Pt2,
CagdPtStruct *Pt3,
CagdVecStruct *Nl1,
CagdVecStruct *Nl2,
CagdVecStruct *Nl3);
#ifdef USE_VARARGS
void _CagdFprintf(FILE *f, int Indent, char *va_alist, ...);
#else
void _CagdFprintf(FILE *f, int Indent, char *Format, ...);
#endif /* USE_VARARGS */
#endif /* CAGD_LOC_H */