-/*\r
-======================================================================\r
-lwo2.h\r
-\r
-Definitions and typedefs for LWO2 files.\r
-\r
-Ernie Wright 17 Sep 00\r
-====================================================================== */\r
-\r
-#ifndef LWO2_H\r
-#define LWO2_H\r
-\r
-/* chunk and subchunk IDs */\r
-\r
-#define LWID_(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))\r
-\r
-#define ID_FORM LWID_('F','O','R','M')\r
-#define ID_LWO2 LWID_('L','W','O','2')\r
-#define ID_LWOB LWID_('L','W','O','B')\r
-\r
-/* top-level chunks */\r
-#define ID_LAYR LWID_('L','A','Y','R')\r
-#define ID_TAGS LWID_('T','A','G','S')\r
-#define ID_PNTS LWID_('P','N','T','S')\r
-#define ID_BBOX LWID_('B','B','O','X')\r
-#define ID_VMAP LWID_('V','M','A','P')\r
-#define ID_VMAD LWID_('V','M','A','D')\r
-#define ID_POLS LWID_('P','O','L','S')\r
-#define ID_PTAG LWID_('P','T','A','G')\r
-#define ID_ENVL LWID_('E','N','V','L')\r
-#define ID_CLIP LWID_('C','L','I','P')\r
-#define ID_SURF LWID_('S','U','R','F')\r
-#define ID_DESC LWID_('D','E','S','C')\r
-#define ID_TEXT LWID_('T','E','X','T')\r
-#define ID_ICON LWID_('I','C','O','N')\r
-\r
-/* polygon types */\r
-#define ID_FACE LWID_('F','A','C','E')\r
-#define ID_CURV LWID_('C','U','R','V')\r
-#define ID_PTCH LWID_('P','T','C','H')\r
-#define ID_MBAL LWID_('M','B','A','L')\r
-#define ID_BONE LWID_('B','O','N','E')\r
-\r
-/* polygon tags */\r
-#define ID_SURF LWID_('S','U','R','F')\r
-#define ID_PART LWID_('P','A','R','T')\r
-#define ID_SMGP LWID_('S','M','G','P')\r
-\r
-/* envelopes */\r
-#define ID_PRE LWID_('P','R','E',' ')\r
-#define ID_POST LWID_('P','O','S','T')\r
-#define ID_KEY LWID_('K','E','Y',' ')\r
-#define ID_SPAN LWID_('S','P','A','N')\r
-#define ID_TCB LWID_('T','C','B',' ')\r
-#define ID_HERM LWID_('H','E','R','M')\r
-#define ID_BEZI LWID_('B','E','Z','I')\r
-#define ID_BEZ2 LWID_('B','E','Z','2')\r
-#define ID_LINE LWID_('L','I','N','E')\r
-#define ID_STEP LWID_('S','T','E','P')\r
-\r
-/* clips */\r
-#define ID_STIL LWID_('S','T','I','L')\r
-#define ID_ISEQ LWID_('I','S','E','Q')\r
-#define ID_ANIM LWID_('A','N','I','M')\r
-#define ID_XREF LWID_('X','R','E','F')\r
-#define ID_STCC LWID_('S','T','C','C')\r
-#define ID_TIME LWID_('T','I','M','E')\r
-#define ID_CONT LWID_('C','O','N','T')\r
-#define ID_BRIT LWID_('B','R','I','T')\r
-#define ID_SATR LWID_('S','A','T','R')\r
-#define ID_HUE LWID_('H','U','E',' ')\r
-#define ID_GAMM LWID_('G','A','M','M')\r
-#define ID_NEGA LWID_('N','E','G','A')\r
-#define ID_IFLT LWID_('I','F','L','T')\r
-#define ID_PFLT LWID_('P','F','L','T')\r
-\r
-/* surfaces */\r
-#define ID_COLR LWID_('C','O','L','R')\r
-#define ID_LUMI LWID_('L','U','M','I')\r
-#define ID_DIFF LWID_('D','I','F','F')\r
-#define ID_SPEC LWID_('S','P','E','C')\r
-#define ID_GLOS LWID_('G','L','O','S')\r
-#define ID_REFL LWID_('R','E','F','L')\r
-#define ID_RFOP LWID_('R','F','O','P')\r
-#define ID_RIMG LWID_('R','I','M','G')\r
-#define ID_RSAN LWID_('R','S','A','N')\r
-#define ID_TRAN LWID_('T','R','A','N')\r
-#define ID_TROP LWID_('T','R','O','P')\r
-#define ID_TIMG LWID_('T','I','M','G')\r
-#define ID_RIND LWID_('R','I','N','D')\r
-#define ID_TRNL LWID_('T','R','N','L')\r
-#define ID_BUMP LWID_('B','U','M','P')\r
-#define ID_SMAN LWID_('S','M','A','N')\r
-#define ID_SIDE LWID_('S','I','D','E')\r
-#define ID_CLRH LWID_('C','L','R','H')\r
-#define ID_CLRF LWID_('C','L','R','F')\r
-#define ID_ADTR LWID_('A','D','T','R')\r
-#define ID_SHRP LWID_('S','H','R','P')\r
-#define ID_LINE LWID_('L','I','N','E')\r
-#define ID_LSIZ LWID_('L','S','I','Z')\r
-#define ID_ALPH LWID_('A','L','P','H')\r
-#define ID_AVAL LWID_('A','V','A','L')\r
-#define ID_GVAL LWID_('G','V','A','L')\r
-#define ID_BLOK LWID_('B','L','O','K')\r
-\r
-/* texture layer */\r
-#define ID_TYPE LWID_('T','Y','P','E')\r
-#define ID_CHAN LWID_('C','H','A','N')\r
-#define ID_NAME LWID_('N','A','M','E')\r
-#define ID_ENAB LWID_('E','N','A','B')\r
-#define ID_OPAC LWID_('O','P','A','C')\r
-#define ID_FLAG LWID_('F','L','A','G')\r
-#define ID_PROJ LWID_('P','R','O','J')\r
-#define ID_STCK LWID_('S','T','C','K')\r
-#define ID_TAMP LWID_('T','A','M','P')\r
-\r
-/* texture coordinates */\r
-#define ID_TMAP LWID_('T','M','A','P')\r
-#define ID_AXIS LWID_('A','X','I','S')\r
-#define ID_CNTR LWID_('C','N','T','R')\r
-#define ID_SIZE LWID_('S','I','Z','E')\r
-#define ID_ROTA LWID_('R','O','T','A')\r
-#define ID_OREF LWID_('O','R','E','F')\r
-#define ID_FALL LWID_('F','A','L','L')\r
-#define ID_CSYS LWID_('C','S','Y','S')\r
-\r
-/* image map */\r
-#define ID_IMAP LWID_('I','M','A','P')\r
-#define ID_IMAG LWID_('I','M','A','G')\r
-#define ID_WRAP LWID_('W','R','A','P')\r
-#define ID_WRPW LWID_('W','R','P','W')\r
-#define ID_WRPH LWID_('W','R','P','H')\r
-#define ID_VMAP LWID_('V','M','A','P')\r
-#define ID_AAST LWID_('A','A','S','T')\r
-#define ID_PIXB LWID_('P','I','X','B')\r
-\r
-/* procedural */\r
-#define ID_PROC LWID_('P','R','O','C')\r
-#define ID_COLR LWID_('C','O','L','R')\r
-#define ID_VALU LWID_('V','A','L','U')\r
-#define ID_FUNC LWID_('F','U','N','C')\r
-#define ID_FTPS LWID_('F','T','P','S')\r
-#define ID_ITPS LWID_('I','T','P','S')\r
-#define ID_ETPS LWID_('E','T','P','S')\r
-\r
-/* gradient */\r
-#define ID_GRAD LWID_('G','R','A','D')\r
-#define ID_GRST LWID_('G','R','S','T')\r
-#define ID_GREN LWID_('G','R','E','N')\r
-#define ID_PNAM LWID_('P','N','A','M')\r
-#define ID_INAM LWID_('I','N','A','M')\r
-#define ID_GRPT LWID_('G','R','P','T')\r
-#define ID_FKEY LWID_('F','K','E','Y')\r
-#define ID_IKEY LWID_('I','K','E','Y')\r
-\r
-/* shader */\r
-#define ID_SHDR LWID_('S','H','D','R')\r
-#define ID_DATA LWID_('D','A','T','A')\r
-\r
-\r
-/* generic linked list */\r
-\r
-typedef struct st_lwNode {\r
- struct st_lwNode *next, *prev;\r
- void *data;\r
-} lwNode;\r
-\r
-\r
-/* plug-in reference */\r
-\r
-typedef struct st_lwPlugin {\r
- struct st_lwPlugin *next, *prev;\r
- char *ord;\r
- char *name;\r
- int flags;\r
- void *data;\r
-} lwPlugin;\r
-\r
-\r
-/* envelopes */\r
-\r
-typedef struct st_lwKey {\r
- struct st_lwKey *next, *prev;\r
- float value;\r
- float time;\r
- unsigned int shape; /* ID_TCB, ID_BEZ2, etc. */\r
- float tension;\r
- float continuity;\r
- float bias;\r
- float param[ 4 ];\r
-} lwKey;\r
-\r
-typedef struct st_lwEnvelope {\r
- struct st_lwEnvelope *next, *prev;\r
- int index;\r
- int type;\r
- char *name;\r
- lwKey *key; /* linked list of keys */\r
- int nkeys;\r
- int behavior[ 2 ]; /* pre and post (extrapolation) */\r
- lwPlugin *cfilter; /* linked list of channel filters */\r
- int ncfilters;\r
-} lwEnvelope;\r
-\r
-#define BEH_RESET 0\r
-#define BEH_CONSTANT 1\r
-#define BEH_REPEAT 2\r
-#define BEH_OSCILLATE 3\r
-#define BEH_OFFSET 4\r
-#define BEH_LINEAR 5\r
-\r
-\r
-/* values that can be enveloped */\r
-\r
-typedef struct st_lwEParam {\r
- float val;\r
- int eindex;\r
-} lwEParam;\r
-\r
-typedef struct st_lwVParam {\r
- float val[ 3 ];\r
- int eindex;\r
-} lwVParam;\r
-\r
-\r
-/* clips */\r
-\r
-typedef struct st_lwClipStill {\r
- char *name;\r
-} lwClipStill;\r
-\r
-typedef struct st_lwClipSeq {\r
- char *prefix; /* filename before sequence digits */\r
- char *suffix; /* after digits, e.g. extensions */\r
- int digits;\r
- int flags;\r
- int offset;\r
- int start;\r
- int end;\r
-} lwClipSeq;\r
-\r
-typedef struct st_lwClipAnim {\r
- char *name;\r
- char *server; /* anim loader plug-in */\r
- void *data;\r
-} lwClipAnim;\r
-\r
-typedef struct st_lwClipXRef {\r
- char *string;\r
- int index;\r
- struct st_lwClip *clip;\r
-} lwClipXRef;\r
-\r
-typedef struct st_lwClipCycle {\r
- char *name;\r
- int lo;\r
- int hi;\r
-} lwClipCycle;\r
-\r
-typedef struct st_lwClip {\r
- struct st_lwClip *next, *prev;\r
- int index;\r
- unsigned int type; /* ID_STIL, ID_ISEQ, etc. */\r
- union {\r
- lwClipStill still;\r
- lwClipSeq seq;\r
- lwClipAnim anim;\r
- lwClipXRef xref;\r
- lwClipCycle cycle;\r
- } source;\r
- float start_time;\r
- float duration;\r
- float frame_rate;\r
- lwEParam contrast;\r
- lwEParam brightness;\r
- lwEParam saturation;\r
- lwEParam hue;\r
- lwEParam gamma;\r
- int negative;\r
- lwPlugin *ifilter; /* linked list of image filters */\r
- int nifilters;\r
- lwPlugin *pfilter; /* linked list of pixel filters */\r
- int npfilters;\r
-} lwClip;\r
-\r
-\r
-/* textures */\r
-\r
-typedef struct st_lwTMap {\r
- lwVParam size;\r
- lwVParam center;\r
- lwVParam rotate;\r
- lwVParam falloff;\r
- int fall_type;\r
- char *ref_object;\r
- int coord_sys;\r
-} lwTMap;\r
-\r
-typedef struct st_lwImageMap {\r
- int cindex;\r
- int projection;\r
- char *vmap_name;\r
- int axis;\r
- int wrapw_type;\r
- int wraph_type;\r
- lwEParam wrapw;\r
- lwEParam wraph;\r
- float aa_strength;\r
- int aas_flags;\r
- int pblend;\r
- lwEParam stck;\r
- lwEParam amplitude;\r
-} lwImageMap;\r
-\r
-#define PROJ_PLANAR 0\r
-#define PROJ_CYLINDRICAL 1\r
-#define PROJ_SPHERICAL 2\r
-#define PROJ_CUBIC 3\r
-#define PROJ_FRONT 4\r
-\r
-#define WRAP_NONE 0\r
-#define WRAP_EDGE 1\r
-#define WRAP_REPEAT 2\r
-#define WRAP_MIRROR 3\r
-\r
-typedef struct st_lwProcedural {\r
- int axis;\r
- float value[ 3 ];\r
- char *name;\r
- void *data;\r
-} lwProcedural;\r
-\r
-typedef struct st_lwGradKey {\r
- struct st_lwGradKey *next, *prev;\r
- float value;\r
- float rgba[ 4 ];\r
-} lwGradKey;\r
-\r
-typedef struct st_lwGradient {\r
- char *paramname;\r
- char *itemname;\r
- float start;\r
- float end;\r
- int repeat;\r
- lwGradKey *key; /* array of gradient keys */\r
- short *ikey; /* array of interpolation codes */\r
-} lwGradient;\r
-\r
-typedef struct st_lwTexture {\r
- struct st_lwTexture *next, *prev;\r
- char *ord;\r
- unsigned int type;\r
- unsigned int chan;\r
- lwEParam opacity;\r
- short opac_type;\r
- short enabled;\r
- short negative;\r
- short axis;\r
- union {\r
- lwImageMap imap;\r
- lwProcedural proc;\r
- lwGradient grad;\r
- } param;\r
- lwTMap tmap;\r
-} lwTexture;\r
-\r
-\r
-/* values that can be textured */\r
-\r
-typedef struct st_lwTParam {\r
- float val;\r
- int eindex;\r
- lwTexture *tex; /* linked list of texture layers */\r
-} lwTParam;\r
-\r
-typedef struct st_lwCParam {\r
- float rgb[ 3 ];\r
- int eindex;\r
- lwTexture *tex; /* linked list of texture layers */\r
-} lwCParam;\r
-\r
-\r
-/* surfaces */\r
-\r
-typedef struct st_lwGlow {\r
- short enabled;\r
- short type;\r
- lwEParam intensity;\r
- lwEParam size;\r
-} Glow;\r
-\r
-typedef struct st_lwRMap {\r
- lwTParam val;\r
- int options;\r
- int cindex;\r
- float seam_angle;\r
-} lwRMap;\r
-\r
-typedef struct st_lwLine {\r
- short enabled;\r
- unsigned short flags;\r
- lwEParam size;\r
-} lwLine;\r
-\r
-typedef struct st_lwSurface {\r
- struct st_lwSurface *next, *prev;\r
- char *name;\r
- char *srcname;\r
- lwCParam color;\r
- lwTParam luminosity;\r
- lwTParam diffuse;\r
- lwTParam specularity;\r
- lwTParam glossiness;\r
- lwRMap reflection;\r
- lwRMap transparency;\r
- lwTParam eta;\r
- lwTParam translucency;\r
- lwTParam bump;\r
- float smooth;\r
- int sideflags;\r
- float alpha;\r
- int alpha_mode;\r
- lwEParam color_hilite;\r
- lwEParam color_filter;\r
- lwEParam add_trans;\r
- lwEParam dif_sharp;\r
- lwEParam glow;\r
- lwLine line;\r
- lwPlugin *shader; /* linked list of shaders */\r
- int nshaders;\r
-} lwSurface;\r
-\r
-\r
-/* vertex maps */\r
-\r
-typedef struct st_lwVMap {\r
- struct st_lwVMap *next, *prev;\r
- char *name;\r
- unsigned int type;\r
- int dim;\r
- int nverts;\r
- int perpoly;\r
- int *vindex; /* array of point indexes */\r
- int *pindex; /* array of polygon indexes */\r
- float **val;\r
-} lwVMap;\r
-\r
-typedef struct st_lwVMapPt {\r
- lwVMap *vmap;\r
- int index; /* vindex or pindex element */\r
-} lwVMapPt;\r
-\r
-\r
-/* points and polygons */\r
-\r
-typedef struct st_lwPoint {\r
- float pos[ 3 ];\r
- int npols; /* number of polygons sharing the point */\r
- int *pol; /* array of polygon indexes */\r
- int nvmaps;\r
- lwVMapPt *vm; /* array of vmap references */\r
-} lwPoint;\r
-\r
-typedef struct st_lwPolVert {\r
- int index; /* index into the point array */\r
- float norm[ 3 ];\r
- int nvmaps;\r
- lwVMapPt *vm; /* array of vmap references */\r
-} lwPolVert;\r
-\r
-typedef struct st_lwPolygon {\r
- lwSurface *surf;\r
- int part; /* part index */\r
- int smoothgrp; /* smoothing group */\r
- int flags;\r
- unsigned int type;\r
- float norm[ 3 ];\r
- int nverts;\r
- lwPolVert *v; /* array of vertex records */\r
-} lwPolygon;\r
-\r
-typedef struct st_lwPointList {\r
- int count;\r
- int offset; /* only used during reading */\r
- lwPoint *pt; /* array of points */\r
-} lwPointList;\r
-\r
-typedef struct st_lwPolygonList {\r
- int count;\r
- int offset; /* only used during reading */\r
- int vcount; /* total number of vertices */\r
- int voffset; /* only used during reading */\r
- lwPolygon *pol; /* array of polygons */\r
-} lwPolygonList;\r
-\r
-\r
-/* geometry layers */\r
-\r
-typedef struct st_lwLayer {\r
- struct st_lwLayer *next, *prev;\r
- char *name;\r
- int index;\r
- int parent;\r
- int flags;\r
- float pivot[ 3 ];\r
- float bbox[ 6 ];\r
- lwPointList point;\r
- lwPolygonList polygon;\r
- int nvmaps;\r
- lwVMap *vmap; /* linked list of vmaps */\r
-} lwLayer;\r
-\r
-\r
-/* tag strings */\r
-\r
-typedef struct st_lwTagList {\r
- int count;\r
- int offset; /* only used during reading */\r
- char **tag; /* array of strings */\r
-} lwTagList;\r
-\r
-\r
-/* an object */\r
-\r
-typedef struct st_lwObject {\r
- lwLayer *layer; /* linked list of layers */\r
- lwEnvelope *env; /* linked list of envelopes */\r
- lwClip *clip; /* linked list of clips */\r
- lwSurface *surf; /* linked list of surfaces */\r
- lwTagList taglist;\r
- int nlayers;\r
- int nenvs;\r
- int nclips;\r
- int nsurfs;\r
-} lwObject;\r
-\r
-\r
-/* lwo2.c */\r
-\r
-void lwFreeLayer( lwLayer *layer );\r
-void lwFreeObject( lwObject *object );\r
-lwObject *lwGetObject( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );\r
-int lwValidateObject( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );\r
-\r
-/* pntspols.c */\r
-\r
-void lwFreePoints( lwPointList *point );\r
-void lwFreePolygons( lwPolygonList *plist );\r
-int lwGetPoints( picoMemStream_t *fp, int cksize, lwPointList *point );\r
-void lwGetBoundingBox( lwPointList *point, float bbox[] );\r
-int lwAllocPolygons( lwPolygonList *plist, int npols, int nverts );\r
-int lwGetPolygons( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );\r
-void lwGetPolyNormals( lwPointList *point, lwPolygonList *polygon );\r
-int lwGetPointPolygons( lwPointList *point, lwPolygonList *polygon );\r
-int lwResolvePolySurfaces( lwPolygonList *polygon, lwTagList *tlist,\r
- lwSurface **surf, int *nsurfs );\r
-void lwGetVertNormals( lwPointList *point, lwPolygonList *polygon );\r
-void lwFreeTags( lwTagList *tlist );\r
-int lwGetTags( picoMemStream_t *fp, int cksize, lwTagList *tlist );\r
-int lwGetPolygonTags( picoMemStream_t *fp, int cksize, lwTagList *tlist,\r
- lwPolygonList *plist );\r
-\r
-/* vmap.c */\r
-\r
-void lwFreeVMap( lwVMap *vmap );\r
-lwVMap *lwGetVMap( picoMemStream_t *fp, int cksize, int ptoffset, int poloffset,\r
- int perpoly );\r
-int lwGetPointVMaps( lwPointList *point, lwVMap *vmap );\r
-int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap );\r
-\r
-/* clip.c */\r
-\r
-void lwFreeClip( lwClip *clip );\r
-lwClip *lwGetClip( picoMemStream_t *fp, int cksize );\r
-lwClip *lwFindClip( lwClip *list, int index );\r
-\r
-/* envelope.c */\r
-\r
-void lwFreeEnvelope( lwEnvelope *env );\r
-lwEnvelope *lwGetEnvelope( picoMemStream_t *fp, int cksize );\r
-lwEnvelope *lwFindEnvelope( lwEnvelope *list, int index );\r
-float lwEvalEnvelope( lwEnvelope *env, float time );\r
-\r
-/* surface.c */\r
-\r
-void lwFreePlugin( lwPlugin *p );\r
-void lwFreeTexture( lwTexture *t );\r
-void lwFreeSurface( lwSurface *surf );\r
-int lwGetTHeader( picoMemStream_t *fp, int hsz, lwTexture *tex );\r
-int lwGetTMap( picoMemStream_t *fp, int tmapsz, lwTMap *tmap );\r
-int lwGetImageMap( picoMemStream_t *fp, int rsz, lwTexture *tex );\r
-int lwGetProcedural( picoMemStream_t *fp, int rsz, lwTexture *tex );\r
-int lwGetGradient( picoMemStream_t *fp, int rsz, lwTexture *tex );\r
-lwTexture *lwGetTexture( picoMemStream_t *fp, int bloksz, unsigned int type );\r
-lwPlugin *lwGetShader( picoMemStream_t *fp, int bloksz );\r
-lwSurface *lwGetSurface( picoMemStream_t *fp, int cksize );\r
-lwSurface *lwDefaultSurface( void );\r
-\r
-/* lwob.c */\r
-\r
-lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj );\r
-int lwGetPolygons5( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );\r
-lwObject *lwGetObject5( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );\r
-int lwValidateObject5( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );\r
-\r
-/* list.c */\r
-\r
-void lwListFree( void *list, void ( *freeNode )( void * ));\r
-void lwListAdd( void **list, void *node );\r
-void lwListInsert( void **vlist, void *vitem,\r
- int ( *compare )( void *, void * ));\r
-\r
-/* vecmath.c */\r
-\r
-float dot( float a[], float b[] );\r
-void cross( float a[], float b[], float c[] );\r
-void normalize( float v[] );\r
-#define vecangle( a, b ) ( float ) acos( dot( a, b ))\r
-\r
-/* lwio.c */\r
-\r
-void set_flen( int i );\r
-int get_flen( void );\r
-void *getbytes( picoMemStream_t *fp, int size );\r
-void skipbytes( picoMemStream_t *fp, int n );\r
-int getI1( picoMemStream_t *fp );\r
-short getI2( picoMemStream_t *fp );\r
-int getI4( picoMemStream_t *fp );\r
-unsigned char getU1( picoMemStream_t *fp );\r
-unsigned short getU2( picoMemStream_t *fp );\r
-unsigned int getU4( picoMemStream_t *fp );\r
-int getVX( picoMemStream_t *fp );\r
-float getF4( picoMemStream_t *fp );\r
-char *getS0( picoMemStream_t *fp );\r
-int sgetI1( unsigned char **bp );\r
-short sgetI2( unsigned char **bp );\r
-int sgetI4( unsigned char **bp );\r
-unsigned char sgetU1( unsigned char **bp );\r
-unsigned short sgetU2( unsigned char **bp );\r
-unsigned int sgetU4( unsigned char **bp );\r
-int sgetVX( unsigned char **bp );\r
-float sgetF4( unsigned char **bp );\r
-char *sgetS0( unsigned char **bp );\r
-\r
-#ifdef _WIN32\r
- void revbytes( void *bp, int elsize, int elcount );\r
-#else\r
- #define revbytes( b, s, c )\r
-#endif\r
-\r
-#endif\r
+/*
+ ======================================================================
+ lwo2.h
+
+ Definitions and typedefs for LWO2 files.
+
+ Ernie Wright 17 Sep 00
+ ====================================================================== */
+
+#ifndef LWO2_H
+#define LWO2_H
+
+/* chunk and subchunk IDs */
+
+#define LWID_( a,b,c,d ) ( ( ( a ) << 24 ) | ( ( b ) << 16 ) | ( ( c ) << 8 ) | ( d ) )
+
+#define ID_FORM LWID_( 'F','O','R','M' )
+#define ID_LWO2 LWID_( 'L','W','O','2' )
+#define ID_LWOB LWID_( 'L','W','O','B' )
+
+/* top-level chunks */
+#define ID_LAYR LWID_( 'L','A','Y','R' )
+#define ID_TAGS LWID_( 'T','A','G','S' )
+#define ID_PNTS LWID_( 'P','N','T','S' )
+#define ID_BBOX LWID_( 'B','B','O','X' )
+#define ID_VMAP LWID_( 'V','M','A','P' )
+#define ID_VMAD LWID_( 'V','M','A','D' )
+#define ID_POLS LWID_( 'P','O','L','S' )
+#define ID_PTAG LWID_( 'P','T','A','G' )
+#define ID_ENVL LWID_( 'E','N','V','L' )
+#define ID_CLIP LWID_( 'C','L','I','P' )
+#define ID_SURF LWID_( 'S','U','R','F' )
+#define ID_DESC LWID_( 'D','E','S','C' )
+#define ID_TEXT LWID_( 'T','E','X','T' )
+#define ID_ICON LWID_( 'I','C','O','N' )
+
+/* polygon types */
+#define ID_FACE LWID_( 'F','A','C','E' )
+#define ID_CURV LWID_( 'C','U','R','V' )
+#define ID_PTCH LWID_( 'P','T','C','H' )
+#define ID_MBAL LWID_( 'M','B','A','L' )
+#define ID_BONE LWID_( 'B','O','N','E' )
+
+/* polygon tags */
+#define ID_SURF LWID_( 'S','U','R','F' )
+#define ID_PART LWID_( 'P','A','R','T' )
+#define ID_SMGP LWID_( 'S','M','G','P' )
+
+/* envelopes */
+#define ID_PRE LWID_( 'P','R','E',' ' )
+#define ID_POST LWID_( 'P','O','S','T' )
+#define ID_KEY LWID_( 'K','E','Y',' ' )
+#define ID_SPAN LWID_( 'S','P','A','N' )
+#define ID_TCB LWID_( 'T','C','B',' ' )
+#define ID_HERM LWID_( 'H','E','R','M' )
+#define ID_BEZI LWID_( 'B','E','Z','I' )
+#define ID_BEZ2 LWID_( 'B','E','Z','2' )
+#define ID_LINE LWID_( 'L','I','N','E' )
+#define ID_STEP LWID_( 'S','T','E','P' )
+
+/* clips */
+#define ID_STIL LWID_( 'S','T','I','L' )
+#define ID_ISEQ LWID_( 'I','S','E','Q' )
+#define ID_ANIM LWID_( 'A','N','I','M' )
+#define ID_XREF LWID_( 'X','R','E','F' )
+#define ID_STCC LWID_( 'S','T','C','C' )
+#define ID_TIME LWID_( 'T','I','M','E' )
+#define ID_CONT LWID_( 'C','O','N','T' )
+#define ID_BRIT LWID_( 'B','R','I','T' )
+#define ID_SATR LWID_( 'S','A','T','R' )
+#define ID_HUE LWID_( 'H','U','E',' ' )
+#define ID_GAMM LWID_( 'G','A','M','M' )
+#define ID_NEGA LWID_( 'N','E','G','A' )
+#define ID_IFLT LWID_( 'I','F','L','T' )
+#define ID_PFLT LWID_( 'P','F','L','T' )
+
+/* surfaces */
+#define ID_COLR LWID_( 'C','O','L','R' )
+#define ID_LUMI LWID_( 'L','U','M','I' )
+#define ID_DIFF LWID_( 'D','I','F','F' )
+#define ID_SPEC LWID_( 'S','P','E','C' )
+#define ID_GLOS LWID_( 'G','L','O','S' )
+#define ID_REFL LWID_( 'R','E','F','L' )
+#define ID_RFOP LWID_( 'R','F','O','P' )
+#define ID_RIMG LWID_( 'R','I','M','G' )
+#define ID_RSAN LWID_( 'R','S','A','N' )
+#define ID_TRAN LWID_( 'T','R','A','N' )
+#define ID_TROP LWID_( 'T','R','O','P' )
+#define ID_TIMG LWID_( 'T','I','M','G' )
+#define ID_RIND LWID_( 'R','I','N','D' )
+#define ID_TRNL LWID_( 'T','R','N','L' )
+#define ID_BUMP LWID_( 'B','U','M','P' )
+#define ID_SMAN LWID_( 'S','M','A','N' )
+#define ID_SIDE LWID_( 'S','I','D','E' )
+#define ID_CLRH LWID_( 'C','L','R','H' )
+#define ID_CLRF LWID_( 'C','L','R','F' )
+#define ID_ADTR LWID_( 'A','D','T','R' )
+#define ID_SHRP LWID_( 'S','H','R','P' )
+#define ID_LINE LWID_( 'L','I','N','E' )
+#define ID_LSIZ LWID_( 'L','S','I','Z' )
+#define ID_ALPH LWID_( 'A','L','P','H' )
+#define ID_AVAL LWID_( 'A','V','A','L' )
+#define ID_GVAL LWID_( 'G','V','A','L' )
+#define ID_BLOK LWID_( 'B','L','O','K' )
+
+/* texture layer */
+#define ID_TYPE LWID_( 'T','Y','P','E' )
+#define ID_CHAN LWID_( 'C','H','A','N' )
+#define ID_NAME LWID_( 'N','A','M','E' )
+#define ID_ENAB LWID_( 'E','N','A','B' )
+#define ID_OPAC LWID_( 'O','P','A','C' )
+#define ID_FLAG LWID_( 'F','L','A','G' )
+#define ID_PROJ LWID_( 'P','R','O','J' )
+#define ID_STCK LWID_( 'S','T','C','K' )
+#define ID_TAMP LWID_( 'T','A','M','P' )
+
+/* texture coordinates */
+#define ID_TMAP LWID_( 'T','M','A','P' )
+#define ID_AXIS LWID_( 'A','X','I','S' )
+#define ID_CNTR LWID_( 'C','N','T','R' )
+#define ID_SIZE LWID_( 'S','I','Z','E' )
+#define ID_ROTA LWID_( 'R','O','T','A' )
+#define ID_OREF LWID_( 'O','R','E','F' )
+#define ID_FALL LWID_( 'F','A','L','L' )
+#define ID_CSYS LWID_( 'C','S','Y','S' )
+
+/* image map */
+#define ID_IMAP LWID_( 'I','M','A','P' )
+#define ID_IMAG LWID_( 'I','M','A','G' )
+#define ID_WRAP LWID_( 'W','R','A','P' )
+#define ID_WRPW LWID_( 'W','R','P','W' )
+#define ID_WRPH LWID_( 'W','R','P','H' )
+#define ID_VMAP LWID_( 'V','M','A','P' )
+#define ID_AAST LWID_( 'A','A','S','T' )
+#define ID_PIXB LWID_( 'P','I','X','B' )
+
+/* procedural */
+#define ID_PROC LWID_( 'P','R','O','C' )
+#define ID_COLR LWID_( 'C','O','L','R' )
+#define ID_VALU LWID_( 'V','A','L','U' )
+#define ID_FUNC LWID_( 'F','U','N','C' )
+#define ID_FTPS LWID_( 'F','T','P','S' )
+#define ID_ITPS LWID_( 'I','T','P','S' )
+#define ID_ETPS LWID_( 'E','T','P','S' )
+
+/* gradient */
+#define ID_GRAD LWID_( 'G','R','A','D' )
+#define ID_GRST LWID_( 'G','R','S','T' )
+#define ID_GREN LWID_( 'G','R','E','N' )
+#define ID_PNAM LWID_( 'P','N','A','M' )
+#define ID_INAM LWID_( 'I','N','A','M' )
+#define ID_GRPT LWID_( 'G','R','P','T' )
+#define ID_FKEY LWID_( 'F','K','E','Y' )
+#define ID_IKEY LWID_( 'I','K','E','Y' )
+
+/* shader */
+#define ID_SHDR LWID_( 'S','H','D','R' )
+#define ID_DATA LWID_( 'D','A','T','A' )
+
+
+/* generic linked list */
+
+typedef struct st_lwNode {
+ struct st_lwNode *next, *prev;
+ void *data;
+} lwNode;
+
+
+/* plug-in reference */
+
+typedef struct st_lwPlugin {
+ struct st_lwPlugin *next, *prev;
+ char *ord;
+ char *name;
+ int flags;
+ void *data;
+} lwPlugin;
+
+
+/* envelopes */
+
+typedef struct st_lwKey {
+ struct st_lwKey *next, *prev;
+ float value;
+ float time;
+ unsigned int shape; /* ID_TCB, ID_BEZ2, etc. */
+ float tension;
+ float continuity;
+ float bias;
+ float param[ 4 ];
+} lwKey;
+
+typedef struct st_lwEnvelope {
+ struct st_lwEnvelope *next, *prev;
+ int index;
+ int type;
+ char *name;
+ lwKey *key; /* linked list of keys */
+ int nkeys;
+ int behavior[ 2 ]; /* pre and post (extrapolation) */
+ lwPlugin *cfilter; /* linked list of channel filters */
+ int ncfilters;
+} lwEnvelope;
+
+#define BEH_RESET 0
+#define BEH_CONSTANT 1
+#define BEH_REPEAT 2
+#define BEH_OSCILLATE 3
+#define BEH_OFFSET 4
+#define BEH_LINEAR 5
+
+
+/* values that can be enveloped */
+
+typedef struct st_lwEParam {
+ float val;
+ int eindex;
+} lwEParam;
+
+typedef struct st_lwVParam {
+ float val[ 3 ];
+ int eindex;
+} lwVParam;
+
+
+/* clips */
+
+typedef struct st_lwClipStill {
+ char *name;
+} lwClipStill;
+
+typedef struct st_lwClipSeq {
+ char *prefix; /* filename before sequence digits */
+ char *suffix; /* after digits, e.g. extensions */
+ int digits;
+ int flags;
+ int offset;
+ int start;
+ int end;
+} lwClipSeq;
+
+typedef struct st_lwClipAnim {
+ char *name;
+ char *server; /* anim loader plug-in */
+ void *data;
+} lwClipAnim;
+
+typedef struct st_lwClipXRef {
+ char *string;
+ int index;
+ struct st_lwClip *clip;
+} lwClipXRef;
+
+typedef struct st_lwClipCycle {
+ char *name;
+ int lo;
+ int hi;
+} lwClipCycle;
+
+typedef struct st_lwClip {
+ struct st_lwClip *next, *prev;
+ int index;
+ unsigned int type; /* ID_STIL, ID_ISEQ, etc. */
+ union {
+ lwClipStill still;
+ lwClipSeq seq;
+ lwClipAnim anim;
+ lwClipXRef xref;
+ lwClipCycle cycle;
+ } source;
+ float start_time;
+ float duration;
+ float frame_rate;
+ lwEParam contrast;
+ lwEParam brightness;
+ lwEParam saturation;
+ lwEParam hue;
+ lwEParam gamma;
+ int negative;
+ lwPlugin *ifilter; /* linked list of image filters */
+ int nifilters;
+ lwPlugin *pfilter; /* linked list of pixel filters */
+ int npfilters;
+} lwClip;
+
+
+/* textures */
+
+typedef struct st_lwTMap {
+ lwVParam size;
+ lwVParam center;
+ lwVParam rotate;
+ lwVParam falloff;
+ int fall_type;
+ char *ref_object;
+ int coord_sys;
+} lwTMap;
+
+typedef struct st_lwImageMap {
+ int cindex;
+ int projection;
+ char *vmap_name;
+ int axis;
+ int wrapw_type;
+ int wraph_type;
+ lwEParam wrapw;
+ lwEParam wraph;
+ float aa_strength;
+ int aas_flags;
+ int pblend;
+ lwEParam stck;
+ lwEParam amplitude;
+} lwImageMap;
+
+#define PROJ_PLANAR 0
+#define PROJ_CYLINDRICAL 1
+#define PROJ_SPHERICAL 2
+#define PROJ_CUBIC 3
+#define PROJ_FRONT 4
+
+#define WRAP_NONE 0
+#define WRAP_EDGE 1
+#define WRAP_REPEAT 2
+#define WRAP_MIRROR 3
+
+typedef struct st_lwProcedural {
+ int axis;
+ float value[ 3 ];
+ char *name;
+ void *data;
+} lwProcedural;
+
+typedef struct st_lwGradKey {
+ struct st_lwGradKey *next, *prev;
+ float value;
+ float rgba[ 4 ];
+} lwGradKey;
+
+typedef struct st_lwGradient {
+ char *paramname;
+ char *itemname;
+ float start;
+ float end;
+ int repeat;
+ lwGradKey *key; /* array of gradient keys */
+ short *ikey; /* array of interpolation codes */
+} lwGradient;
+
+typedef struct st_lwTexture {
+ struct st_lwTexture *next, *prev;
+ char *ord;
+ unsigned int type;
+ unsigned int chan;
+ lwEParam opacity;
+ short opac_type;
+ short enabled;
+ short negative;
+ short axis;
+ union {
+ lwImageMap imap;
+ lwProcedural proc;
+ lwGradient grad;
+ } param;
+ lwTMap tmap;
+} lwTexture;
+
+
+/* values that can be textured */
+
+typedef struct st_lwTParam {
+ float val;
+ int eindex;
+ lwTexture *tex; /* linked list of texture layers */
+} lwTParam;
+
+typedef struct st_lwCParam {
+ float rgb[ 3 ];
+ int eindex;
+ lwTexture *tex; /* linked list of texture layers */
+} lwCParam;
+
+
+/* surfaces */
+
+typedef struct st_lwGlow {
+ short enabled;
+ short type;
+ lwEParam intensity;
+ lwEParam size;
+} Glow;
+
+typedef struct st_lwRMap {
+ lwTParam val;
+ int options;
+ int cindex;
+ float seam_angle;
+} lwRMap;
+
+typedef struct st_lwLine {
+ short enabled;
+ unsigned short flags;
+ lwEParam size;
+} lwLine;
+
+typedef struct st_lwSurface {
+ struct st_lwSurface *next, *prev;
+ char *name;
+ char *srcname;
+ lwCParam color;
+ lwTParam luminosity;
+ lwTParam diffuse;
+ lwTParam specularity;
+ lwTParam glossiness;
+ lwRMap reflection;
+ lwRMap transparency;
+ lwTParam eta;
+ lwTParam translucency;
+ lwTParam bump;
+ float smooth;
+ int sideflags;
+ float alpha;
+ int alpha_mode;
+ lwEParam color_hilite;
+ lwEParam color_filter;
+ lwEParam add_trans;
+ lwEParam dif_sharp;
+ lwEParam glow;
+ lwLine line;
+ lwPlugin *shader; /* linked list of shaders */
+ int nshaders;
+} lwSurface;
+
+
+/* vertex maps */
+
+typedef struct st_lwVMap {
+ struct st_lwVMap *next, *prev;
+ char *name;
+ unsigned int type;
+ int dim;
+ int nverts;
+ int perpoly;
+ int *vindex; /* array of point indexes */
+ int *pindex; /* array of polygon indexes */
+ float **val;
+} lwVMap;
+
+typedef struct st_lwVMapPt {
+ lwVMap *vmap;
+ int index; /* vindex or pindex element */
+} lwVMapPt;
+
+
+/* points and polygons */
+
+typedef struct st_lwPoint {
+ float pos[ 3 ];
+ int npols; /* number of polygons sharing the point */
+ int *pol; /* array of polygon indexes */
+ int nvmaps;
+ lwVMapPt *vm; /* array of vmap references */
+} lwPoint;
+
+typedef struct st_lwPolVert {
+ int index; /* index into the point array */
+ float norm[ 3 ];
+ int nvmaps;
+ lwVMapPt *vm; /* array of vmap references */
+} lwPolVert;
+
+typedef struct st_lwPolygon {
+ lwSurface *surf;
+ int part; /* part index */
+ int smoothgrp; /* smoothing group */
+ int flags;
+ unsigned int type;
+ float norm[ 3 ];
+ int nverts;
+ lwPolVert *v; /* array of vertex records */
+} lwPolygon;
+
+typedef struct st_lwPointList {
+ int count;
+ int offset; /* only used during reading */
+ lwPoint *pt; /* array of points */
+} lwPointList;
+
+typedef struct st_lwPolygonList {
+ int count;
+ int offset; /* only used during reading */
+ int vcount; /* total number of vertices */
+ int voffset; /* only used during reading */
+ lwPolygon *pol; /* array of polygons */
+} lwPolygonList;
+
+
+/* geometry layers */
+
+typedef struct st_lwLayer {
+ struct st_lwLayer *next, *prev;
+ char *name;
+ int index;
+ int parent;
+ int flags;
+ float pivot[ 3 ];
+ float bbox[ 6 ];
+ lwPointList point;
+ lwPolygonList polygon;
+ int nvmaps;
+ lwVMap *vmap; /* linked list of vmaps */
+} lwLayer;
+
+
+/* tag strings */
+
+typedef struct st_lwTagList {
+ int count;
+ int offset; /* only used during reading */
+ char **tag; /* array of strings */
+} lwTagList;
+
+
+/* an object */
+
+typedef struct st_lwObject {
+ lwLayer *layer; /* linked list of layers */
+ lwEnvelope *env; /* linked list of envelopes */
+ lwClip *clip; /* linked list of clips */
+ lwSurface *surf; /* linked list of surfaces */
+ lwTagList taglist;
+ int nlayers;
+ int nenvs;
+ int nclips;
+ int nsurfs;
+} lwObject;
+
+
+/* lwo2.c */
+
+void lwFreeLayer( lwLayer *layer );
+void lwFreeObject( lwObject *object );
+lwObject *lwGetObject( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
+int lwValidateObject( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
+
+/* pntspols.c */
+
+void lwFreePoints( lwPointList *point );
+void lwFreePolygons( lwPolygonList *plist );
+int lwGetPoints( picoMemStream_t *fp, int cksize, lwPointList *point );
+void lwGetBoundingBox( lwPointList * point, float bbox[] );
+int lwAllocPolygons( lwPolygonList *plist, int npols, int nverts );
+int lwGetPolygons( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );
+void lwGetPolyNormals( lwPointList *point, lwPolygonList *polygon );
+int lwGetPointPolygons( lwPointList *point, lwPolygonList *polygon );
+int lwResolvePolySurfaces( lwPolygonList *polygon, lwTagList *tlist,
+ lwSurface **surf, int *nsurfs );
+void lwGetVertNormals( lwPointList *point, lwPolygonList *polygon );
+void lwFreeTags( lwTagList *tlist );
+int lwGetTags( picoMemStream_t *fp, int cksize, lwTagList *tlist );
+int lwGetPolygonTags( picoMemStream_t *fp, int cksize, lwTagList *tlist,
+ lwPolygonList *plist );
+
+/* vmap.c */
+
+void lwFreeVMap( lwVMap *vmap );
+lwVMap *lwGetVMap( picoMemStream_t *fp, int cksize, int ptoffset, int poloffset,
+ int perpoly );
+int lwGetPointVMaps( lwPointList *point, lwVMap *vmap );
+int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap );
+
+/* clip.c */
+
+void lwFreeClip( lwClip *clip );
+lwClip *lwGetClip( picoMemStream_t *fp, int cksize );
+lwClip *lwFindClip( lwClip *list, int index );
+
+/* envelope.c */
+
+void lwFreeEnvelope( lwEnvelope *env );
+lwEnvelope *lwGetEnvelope( picoMemStream_t *fp, int cksize );
+lwEnvelope *lwFindEnvelope( lwEnvelope *list, int index );
+float lwEvalEnvelope( lwEnvelope *env, float time );
+
+/* surface.c */
+
+void lwFreePlugin( lwPlugin *p );
+void lwFreeTexture( lwTexture *t );
+void lwFreeSurface( lwSurface *surf );
+int lwGetTHeader( picoMemStream_t *fp, int hsz, lwTexture *tex );
+int lwGetTMap( picoMemStream_t *fp, int tmapsz, lwTMap *tmap );
+int lwGetImageMap( picoMemStream_t *fp, int rsz, lwTexture *tex );
+int lwGetProcedural( picoMemStream_t *fp, int rsz, lwTexture *tex );
+int lwGetGradient( picoMemStream_t *fp, int rsz, lwTexture *tex );
+lwTexture *lwGetTexture( picoMemStream_t *fp, int bloksz, unsigned int type );
+lwPlugin *lwGetShader( picoMemStream_t *fp, int bloksz );
+lwSurface *lwGetSurface( picoMemStream_t *fp, int cksize );
+lwSurface *lwDefaultSurface( void );
+
+/* lwob.c */
+
+lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj );
+int lwGetPolygons5( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );
+lwObject *lwGetObject5( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
+int lwValidateObject5( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
+
+/* list.c */
+
+void lwListFree( void *list, void ( *freeNode )( void * ) );
+void lwListAdd( void **list, void *node );
+void lwListInsert( void **vlist, void *vitem,
+ int ( *compare )( void *, void * ) );
+
+/* vecmath.c */
+
+float dot( float a[], float b[] );
+void cross( float a[], float b[], float c[] );
+void normalize( float v[] );
+#define vecangle( a, b ) ( float ) acos( dot( a, b ) )
+
+/* lwio.c */
+
+void set_flen( int i );
+int get_flen( void );
+void *getbytes( picoMemStream_t *fp, int size );
+void skipbytes( picoMemStream_t *fp, int n );
+int getI1( picoMemStream_t *fp );
+short getI2( picoMemStream_t *fp );
+int getI4( picoMemStream_t *fp );
+unsigned char getU1( picoMemStream_t *fp );
+unsigned short getU2( picoMemStream_t *fp );
+unsigned int getU4( picoMemStream_t *fp );
+int getVX( picoMemStream_t *fp );
+float getF4( picoMemStream_t *fp );
+char *getS0( picoMemStream_t *fp );
+int sgetI1( unsigned char **bp );
+short sgetI2( unsigned char **bp );
+int sgetI4( unsigned char **bp );
+unsigned char sgetU1( unsigned char **bp );
+unsigned short sgetU2( unsigned char **bp );
+unsigned int sgetU4( unsigned char **bp );
+int sgetVX( unsigned char **bp );
+float sgetF4( unsigned char **bp );
+char *sgetS0( unsigned char **bp );
+
+#ifndef __BIG_ENDIAN__
+void revbytes( void *bp, int elsize, int elcount );
+#else
+ #define revbytes( b, s, c )
+#endif
+
+#endif