Metropoli BBS
VIEWER: iritprsr.h MODE: TEXT (ASCII)
/*****************************************************************************
* Generic parser for the "Irit" solid modeller.				     *
*									     *
* Written by:  Gershon Elber				Ver 0.2, Sep. 1991   *
*****************************************************************************/

#ifndef	IRIT_PRSR_GH
#define	IRIT_PRSR_GH

#include "cagd_lib.h"
#include "genmat.h"

typedef enum {
    IP_POLYGON = 1,
    IP_POLYLINE,
    IP_POINTLIST
} IPPolyStructType;

typedef enum {
    IP_OBJ_UNDEF,
    IP_OBJ_POLY,
    IP_OBJ_SURFACE,
    IP_OBJ_CURVE
} IPObjStructType;

#define MAX_NUM_ATTRS		10

/*****************************************************************************
* Attributes - an attribute is a pair of strings consists of a key and the   *
* data. Up to MAX_NUM_ATTRS are supported.		                     *
*****************************************************************************/
typedef struct IPAttributeStruct {
    int NumStrAttribs;
    char *StrAttrName[MAX_NUM_ATTRS];		    /* Generic string attrs. */
    char *StrAttrData[MAX_NUM_ATTRS];
} IPAttributeStruct;


#define IP_IS_VRTX_INTERNAL(V)		(V -> VTags & 0x01)
#define IP_SET_VRTX_INTERNAL(V)		(V -> VTags |= 0x01)
#define IP_RST_VRTX_INTERNAL(V)		(V -> VTags &= ~0x01)
#define IP_HAS_VRTX_NORMAL(V)		(V -> VTags & 0x02)
#define IP_SET_VRTX_NORMAL(V)		(V -> VTags |= 0x02)
#define IP_RST_VRTX_NORMAL(V)		(V -> VTags &= ~0x02)

typedef struct IPVertexStruct {
    struct IPVertexStruct *Pnext;		        /* To next in chain. */
    VoidPtr VAux;
    unsigned int VTags;					 /* Some attributes. */
    int Color;
    RealType Coord[3];			       /* Holds X, Y, Z coordinates. */
    RealType Normal[3];		       /* Hold Vertex normal into the solid. */
} IPVertexStruct;

#define IP_HAS_POLY_PLANE(P)		(P -> PTags & 0x01)
#define IP_SET_POLY_PLANE(P)		(P -> PTags |= 0x01)
#define IP_RST_POLY_PLANE(P)		(P -> PTags &= ~0x01)
#define IP_HAS_POLY_BBOX(P)		(P -> PTags & 0x02)
#define IP_SET_POLY_BBOX(P)		(P -> PTags |= 0x02)
#define IP_RST_POLY_BBOX(P)		(P -> PTags &= ~0x02)

typedef struct IPPolygonStruct {
    struct IPPolygonStruct *Pnext;		        /* To next in chain. */
    VoidPtr PAux;
    unsigned int PTags;				         /* Some attributes. */
    IPPolyStructType Type;
    RealType Plane[4];			 /* Holds Plane as Ax + By + Cz + D. */
    RealType Xmin, Xmax, Ymin, Ymax;         /* Bounding box of the polygon. */
    IPVertexStruct *PVertex;		    		/* To vertices list. */
} IPPolygonStruct;

#define IP_HAS_OBJ_RGB(P)		(P -> OTags & 0x01)
#define IP_SET_OBJ_RGB(P)		(P -> OTags |= 0x01)
#define IP_RST_OBJ_RGB(P)		(P -> OTags &= ~0x01)
#define IP_HAS_OBJ_COLOR(P)		(P -> OTags & 0x02)
#define IP_SET_OBJ_COLOR(P)		(P -> OTags |= 0x02)
#define IP_RST_OBJ_COLOR(P)		(P -> OTags &= ~0x02)

typedef struct IPObjectStruct {
    struct IPObjectStruct *Pnext;
    struct IPObjectStruct *FFPolylines, *FFPolygons;    /* Freeform approx.. */
    struct IPAttributeStruct Attrs;
    VoidPtr OAux;
    char Name[OBJ_NAME_LEN];
    unsigned char RGB[3];
    unsigned int OTags;				         /* Some attributes. */
    IPObjStructType Type;
    int Color;
    union {
	IPPolygonStruct *PPolygon;
	CagdCrvStruct *PCrvs;
	CagdSrfStruct *PSrfs;
    } U;
} IPObjectStruct;

#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
IPObjectStruct *IritPrsrGetObjects(FILE *f);
int IritPrsrParseError(char **ErrorMsg);
IPVertexStruct *IritPrsrNewVertexStruct(void);
IPPolygonStruct *IritPrsrNewPolygonStruct(void);
IPObjectStruct *IritPrsrNewObjectStruct(void);

void IritPrsrSetStrAttrib(IPObjectStruct *PObj, char *Name, char *Data);
char *IritPrsrGetStrAttrib(IPObjectStruct *PObj, char *Name);

/* If set to TRUE (default) polygons will have their vertex lists circular   */
/* or last vertex point on first. If set to FALSE, regular list list.	     */
extern int IritPrsrPolyListCirc;

/* Will be set to VIEW_MAT and PERS_MAT respectively if found in parsed data.*/
extern MatrixType IritPrsrViewMat, IritPrsrPrspMat;
extern int IritPrsrWasViewMat, IritPrsrWasPrspMat;

/* External variables/functions that should be provided by the application:  */

/* Gets two list of all curves and surfaces in the datafile and process them */
/* as needed. May return a processed version to be put on returned list from */
/* IritPrsrGetObjects (polygonal approximation of the free form data for     */
/* example), or NULL otherwise.						     */
/* This function is responsible to free crvs/srfs if not needed any more.    */
IPObjectStruct *IritPrsrProcessFreeForm(IPObjectStruct *CrvObjs,
					IPObjectStruct *SrfObjs);

#if defined(__cplusplus) || defined(c_plusplus)
}
#endif

#endif	/* IRIT_PRSR_GH */
[ RETURN TO DIRECTORY ]