]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/picomodel/lwo/lwo2.h
eol style
[xonotic/netradiant.git] / libs / picomodel / lwo / lwo2.h
index 1fe1dd97ab40f6ebed8f57d4fdd96ed22b756fe9..1d55ba46c048812a01fc6d9c907bb4aae30eb681 100644 (file)
-/*\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( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
+int lwValidateObject( 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( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
+int lwValidateObject5( 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 );
+
+#ifdef _WIN32
+  void revbytes( void *bp, int elsize, int elcount );
+#else
+  #define revbytes( b, s, c )
+#endif
+
+#endif