2 ======================================================================
5 Definitions and typedefs for LWO2 files.
8 ====================================================================== */
13 #include "globaldefs.h"
15 /* chunk and subchunk IDs */
17 #define LWID_( a,b,c,d ) ( ( ( a ) << 24 ) | ( ( b ) << 16 ) | ( ( c ) << 8 ) | ( d ) )
19 #define ID_FORM LWID_( 'F','O','R','M' )
20 #define ID_LWO2 LWID_( 'L','W','O','2' )
21 #define ID_LWOB LWID_( 'L','W','O','B' )
23 /* top-level chunks */
24 #define ID_LAYR LWID_( 'L','A','Y','R' )
25 #define ID_TAGS LWID_( 'T','A','G','S' )
26 #define ID_PNTS LWID_( 'P','N','T','S' )
27 #define ID_BBOX LWID_( 'B','B','O','X' )
28 #define ID_VMAP LWID_( 'V','M','A','P' )
29 #define ID_VMAD LWID_( 'V','M','A','D' )
30 #define ID_POLS LWID_( 'P','O','L','S' )
31 #define ID_PTAG LWID_( 'P','T','A','G' )
32 #define ID_ENVL LWID_( 'E','N','V','L' )
33 #define ID_CLIP LWID_( 'C','L','I','P' )
34 #define ID_SURF LWID_( 'S','U','R','F' )
35 #define ID_DESC LWID_( 'D','E','S','C' )
36 #define ID_TEXT LWID_( 'T','E','X','T' )
37 #define ID_ICON LWID_( 'I','C','O','N' )
40 #define ID_FACE LWID_( 'F','A','C','E' )
41 #define ID_CURV LWID_( 'C','U','R','V' )
42 #define ID_PTCH LWID_( 'P','T','C','H' )
43 #define ID_MBAL LWID_( 'M','B','A','L' )
44 #define ID_BONE LWID_( 'B','O','N','E' )
47 #define ID_SURF LWID_( 'S','U','R','F' )
48 #define ID_PART LWID_( 'P','A','R','T' )
49 #define ID_SMGP LWID_( 'S','M','G','P' )
52 #define ID_PRE LWID_( 'P','R','E',' ' )
53 #define ID_POST LWID_( 'P','O','S','T' )
54 #define ID_KEY LWID_( 'K','E','Y',' ' )
55 #define ID_SPAN LWID_( 'S','P','A','N' )
56 #define ID_TCB LWID_( 'T','C','B',' ' )
57 #define ID_HERM LWID_( 'H','E','R','M' )
58 #define ID_BEZI LWID_( 'B','E','Z','I' )
59 #define ID_BEZ2 LWID_( 'B','E','Z','2' )
60 #define ID_LINE LWID_( 'L','I','N','E' )
61 #define ID_STEP LWID_( 'S','T','E','P' )
64 #define ID_STIL LWID_( 'S','T','I','L' )
65 #define ID_ISEQ LWID_( 'I','S','E','Q' )
66 #define ID_ANIM LWID_( 'A','N','I','M' )
67 #define ID_XREF LWID_( 'X','R','E','F' )
68 #define ID_STCC LWID_( 'S','T','C','C' )
69 #define ID_TIME LWID_( 'T','I','M','E' )
70 #define ID_CONT LWID_( 'C','O','N','T' )
71 #define ID_BRIT LWID_( 'B','R','I','T' )
72 #define ID_SATR LWID_( 'S','A','T','R' )
73 #define ID_HUE LWID_( 'H','U','E',' ' )
74 #define ID_GAMM LWID_( 'G','A','M','M' )
75 #define ID_NEGA LWID_( 'N','E','G','A' )
76 #define ID_IFLT LWID_( 'I','F','L','T' )
77 #define ID_PFLT LWID_( 'P','F','L','T' )
80 #define ID_COLR LWID_( 'C','O','L','R' )
81 #define ID_LUMI LWID_( 'L','U','M','I' )
82 #define ID_DIFF LWID_( 'D','I','F','F' )
83 #define ID_SPEC LWID_( 'S','P','E','C' )
84 #define ID_GLOS LWID_( 'G','L','O','S' )
85 #define ID_REFL LWID_( 'R','E','F','L' )
86 #define ID_RFOP LWID_( 'R','F','O','P' )
87 #define ID_RIMG LWID_( 'R','I','M','G' )
88 #define ID_RSAN LWID_( 'R','S','A','N' )
89 #define ID_TRAN LWID_( 'T','R','A','N' )
90 #define ID_TROP LWID_( 'T','R','O','P' )
91 #define ID_TIMG LWID_( 'T','I','M','G' )
92 #define ID_RIND LWID_( 'R','I','N','D' )
93 #define ID_TRNL LWID_( 'T','R','N','L' )
94 #define ID_BUMP LWID_( 'B','U','M','P' )
95 #define ID_SMAN LWID_( 'S','M','A','N' )
96 #define ID_SIDE LWID_( 'S','I','D','E' )
97 #define ID_CLRH LWID_( 'C','L','R','H' )
98 #define ID_CLRF LWID_( 'C','L','R','F' )
99 #define ID_ADTR LWID_( 'A','D','T','R' )
100 #define ID_SHRP LWID_( 'S','H','R','P' )
101 #define ID_LINE LWID_( 'L','I','N','E' )
102 #define ID_LSIZ LWID_( 'L','S','I','Z' )
103 #define ID_ALPH LWID_( 'A','L','P','H' )
104 #define ID_AVAL LWID_( 'A','V','A','L' )
105 #define ID_GVAL LWID_( 'G','V','A','L' )
106 #define ID_BLOK LWID_( 'B','L','O','K' )
109 #define ID_TYPE LWID_( 'T','Y','P','E' )
110 #define ID_CHAN LWID_( 'C','H','A','N' )
111 #define ID_NAME LWID_( 'N','A','M','E' )
112 #define ID_ENAB LWID_( 'E','N','A','B' )
113 #define ID_OPAC LWID_( 'O','P','A','C' )
114 #define ID_FLAG LWID_( 'F','L','A','G' )
115 #define ID_PROJ LWID_( 'P','R','O','J' )
116 #define ID_STCK LWID_( 'S','T','C','K' )
117 #define ID_TAMP LWID_( 'T','A','M','P' )
119 /* texture coordinates */
120 #define ID_TMAP LWID_( 'T','M','A','P' )
121 #define ID_AXIS LWID_( 'A','X','I','S' )
122 #define ID_CNTR LWID_( 'C','N','T','R' )
123 #define ID_SIZE LWID_( 'S','I','Z','E' )
124 #define ID_ROTA LWID_( 'R','O','T','A' )
125 #define ID_OREF LWID_( 'O','R','E','F' )
126 #define ID_FALL LWID_( 'F','A','L','L' )
127 #define ID_CSYS LWID_( 'C','S','Y','S' )
130 #define ID_IMAP LWID_( 'I','M','A','P' )
131 #define ID_IMAG LWID_( 'I','M','A','G' )
132 #define ID_WRAP LWID_( 'W','R','A','P' )
133 #define ID_WRPW LWID_( 'W','R','P','W' )
134 #define ID_WRPH LWID_( 'W','R','P','H' )
135 #define ID_VMAP LWID_( 'V','M','A','P' )
136 #define ID_AAST LWID_( 'A','A','S','T' )
137 #define ID_PIXB LWID_( 'P','I','X','B' )
140 #define ID_PROC LWID_( 'P','R','O','C' )
141 #define ID_COLR LWID_( 'C','O','L','R' )
142 #define ID_VALU LWID_( 'V','A','L','U' )
143 #define ID_FUNC LWID_( 'F','U','N','C' )
144 #define ID_FTPS LWID_( 'F','T','P','S' )
145 #define ID_ITPS LWID_( 'I','T','P','S' )
146 #define ID_ETPS LWID_( 'E','T','P','S' )
149 #define ID_GRAD LWID_( 'G','R','A','D' )
150 #define ID_GRST LWID_( 'G','R','S','T' )
151 #define ID_GREN LWID_( 'G','R','E','N' )
152 #define ID_PNAM LWID_( 'P','N','A','M' )
153 #define ID_INAM LWID_( 'I','N','A','M' )
154 #define ID_GRPT LWID_( 'G','R','P','T' )
155 #define ID_FKEY LWID_( 'F','K','E','Y' )
156 #define ID_IKEY LWID_( 'I','K','E','Y' )
159 #define ID_SHDR LWID_( 'S','H','D','R' )
160 #define ID_DATA LWID_( 'D','A','T','A' )
163 /* generic linked list */
165 typedef struct st_lwNode {
166 struct st_lwNode *next, *prev;
171 /* plug-in reference */
173 typedef struct st_lwPlugin {
174 struct st_lwPlugin *next, *prev;
184 typedef struct st_lwKey {
185 struct st_lwKey *next, *prev;
188 unsigned int shape; /* ID_TCB, ID_BEZ2, etc. */
195 typedef struct st_lwEnvelope {
196 struct st_lwEnvelope *next, *prev;
200 lwKey *key; /* linked list of keys */
202 int behavior[ 2 ]; /* pre and post (extrapolation) */
203 lwPlugin *cfilter; /* linked list of channel filters */
208 #define BEH_CONSTANT 1
210 #define BEH_OSCILLATE 3
215 /* values that can be enveloped */
217 typedef struct st_lwEParam {
222 typedef struct st_lwVParam {
230 typedef struct st_lwClipStill {
234 typedef struct st_lwClipSeq {
235 char *prefix; /* filename before sequence digits */
236 char *suffix; /* after digits, e.g. extensions */
244 typedef struct st_lwClipAnim {
246 char *server; /* anim loader plug-in */
250 typedef struct st_lwClipXRef {
253 struct st_lwClip *clip;
256 typedef struct st_lwClipCycle {
262 typedef struct st_lwClip {
263 struct st_lwClip *next, *prev;
265 unsigned int type; /* ID_STIL, ID_ISEQ, etc. */
282 lwPlugin *ifilter; /* linked list of image filters */
284 lwPlugin *pfilter; /* linked list of pixel filters */
291 typedef struct st_lwTMap {
301 typedef struct st_lwImageMap {
317 #define PROJ_PLANAR 0
318 #define PROJ_CYLINDRICAL 1
319 #define PROJ_SPHERICAL 2
325 #define WRAP_REPEAT 2
326 #define WRAP_MIRROR 3
328 typedef struct st_lwProcedural {
335 typedef struct st_lwGradKey {
336 struct st_lwGradKey *next, *prev;
341 typedef struct st_lwGradient {
347 lwGradKey *key; /* array of gradient keys */
348 short *ikey; /* array of interpolation codes */
351 typedef struct st_lwTexture {
352 struct st_lwTexture *next, *prev;
370 /* values that can be textured */
372 typedef struct st_lwTParam {
375 lwTexture *tex; /* linked list of texture layers */
378 typedef struct st_lwCParam {
381 lwTexture *tex; /* linked list of texture layers */
387 typedef struct st_lwGlow {
394 typedef struct st_lwRMap {
401 typedef struct st_lwLine {
403 unsigned short flags;
407 typedef struct st_lwSurface {
408 struct st_lwSurface *next, *prev;
414 lwTParam specularity;
419 lwTParam translucency;
425 lwEParam color_hilite;
426 lwEParam color_filter;
431 lwPlugin *shader; /* linked list of shaders */
438 typedef struct st_lwVMap {
439 struct st_lwVMap *next, *prev;
445 int *vindex; /* array of point indexes */
446 int *pindex; /* array of polygon indexes */
450 typedef struct st_lwVMapPt {
452 int index; /* vindex or pindex element */
456 /* points and polygons */
458 typedef struct st_lwPoint {
460 int npols; /* number of polygons sharing the point */
461 int *pol; /* array of polygon indexes */
463 lwVMapPt *vm; /* array of vmap references */
466 typedef struct st_lwPolVert {
467 int index; /* index into the point array */
470 lwVMapPt *vm; /* array of vmap references */
473 typedef struct st_lwPolygon {
475 int part; /* part index */
476 int smoothgrp; /* smoothing group */
481 lwPolVert *v; /* array of vertex records */
484 typedef struct st_lwPointList {
486 int offset; /* only used during reading */
487 lwPoint *pt; /* array of points */
490 typedef struct st_lwPolygonList {
492 int offset; /* only used during reading */
493 int vcount; /* total number of vertices */
494 int voffset; /* only used during reading */
495 lwPolygon *pol; /* array of polygons */
499 /* geometry layers */
501 typedef struct st_lwLayer {
502 struct st_lwLayer *next, *prev;
510 lwPolygonList polygon;
512 lwVMap *vmap; /* linked list of vmaps */
518 typedef struct st_lwTagList {
520 int offset; /* only used during reading */
521 char **tag; /* array of strings */
527 typedef struct st_lwObject {
528 lwLayer *layer; /* linked list of layers */
529 lwEnvelope *env; /* linked list of envelopes */
530 lwClip *clip; /* linked list of clips */
531 lwSurface *surf; /* linked list of surfaces */
542 void lwFreeLayer( lwLayer *layer );
543 void lwFreeObject( lwObject *object );
544 lwObject *lwGetObject( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
545 int lwValidateObject( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
549 void lwFreePoints( lwPointList *point );
550 void lwFreePolygons( lwPolygonList *plist );
551 int lwGetPoints( picoMemStream_t *fp, int cksize, lwPointList *point );
552 void lwGetBoundingBox( lwPointList * point, float bbox[] );
553 int lwAllocPolygons( lwPolygonList *plist, int npols, int nverts );
554 int lwGetPolygons( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );
555 void lwGetPolyNormals( lwPointList *point, lwPolygonList *polygon );
556 int lwGetPointPolygons( lwPointList *point, lwPolygonList *polygon );
557 int lwResolvePolySurfaces( lwPolygonList *polygon, lwTagList *tlist,
558 lwSurface **surf, int *nsurfs );
559 void lwGetVertNormals( lwPointList *point, lwPolygonList *polygon );
560 void lwFreeTags( lwTagList *tlist );
561 int lwGetTags( picoMemStream_t *fp, int cksize, lwTagList *tlist );
562 int lwGetPolygonTags( picoMemStream_t *fp, int cksize, lwTagList *tlist,
563 lwPolygonList *plist );
567 void lwFreeVMap( lwVMap *vmap );
568 lwVMap *lwGetVMap( picoMemStream_t *fp, int cksize, int ptoffset, int poloffset,
570 int lwGetPointVMaps( lwPointList *point, lwVMap *vmap );
571 int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap );
575 void lwFreeClip( lwClip *clip );
576 lwClip *lwGetClip( picoMemStream_t *fp, int cksize );
577 lwClip *lwFindClip( lwClip *list, int index );
581 void lwFreeEnvelope( lwEnvelope *env );
582 lwEnvelope *lwGetEnvelope( picoMemStream_t *fp, int cksize );
583 lwEnvelope *lwFindEnvelope( lwEnvelope *list, int index );
584 float lwEvalEnvelope( lwEnvelope *env, float time );
588 void lwFreePlugin( lwPlugin *p );
589 void lwFreeTexture( lwTexture *t );
590 void lwFreeSurface( lwSurface *surf );
591 int lwGetTHeader( picoMemStream_t *fp, int hsz, lwTexture *tex );
592 int lwGetTMap( picoMemStream_t *fp, int tmapsz, lwTMap *tmap );
593 int lwGetImageMap( picoMemStream_t *fp, int rsz, lwTexture *tex );
594 int lwGetProcedural( picoMemStream_t *fp, int rsz, lwTexture *tex );
595 int lwGetGradient( picoMemStream_t *fp, int rsz, lwTexture *tex );
596 lwTexture *lwGetTexture( picoMemStream_t *fp, int bloksz, unsigned int type );
597 lwPlugin *lwGetShader( picoMemStream_t *fp, int bloksz );
598 lwSurface *lwGetSurface( picoMemStream_t *fp, int cksize );
599 lwSurface *lwDefaultSurface( void );
603 lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj );
604 int lwGetPolygons5( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );
605 lwObject *lwGetObject5( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
606 int lwValidateObject5( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
610 void lwListFree( void *list, void ( *freeNode )( void * ) );
611 void lwListAdd( void **list, void *node );
612 void lwListInsert( void **vlist, void *vitem,
613 int ( *compare )( void *, void * ) );
617 float dot( float a[], float b[] );
618 void cross( float a[], float b[], float c[] );
619 void normalize( float v[] );
620 #define vecangle( a, b ) ( float ) acos( dot( a, b ) )
624 void set_flen( int i );
625 int get_flen( void );
626 void *getbytes( picoMemStream_t *fp, int size );
627 void skipbytes( picoMemStream_t *fp, int n );
628 int getI1( picoMemStream_t *fp );
629 short getI2( picoMemStream_t *fp );
630 int getI4( picoMemStream_t *fp );
631 unsigned char getU1( picoMemStream_t *fp );
632 unsigned short getU2( picoMemStream_t *fp );
633 unsigned int getU4( picoMemStream_t *fp );
634 int getVX( picoMemStream_t *fp );
635 float getF4( picoMemStream_t *fp );
636 char *getS0( picoMemStream_t *fp );
637 int sgetI1( unsigned char **bp );
638 short sgetI2( unsigned char **bp );
639 int sgetI4( unsigned char **bp );
640 unsigned char sgetU1( unsigned char **bp );
641 unsigned short sgetU2( unsigned char **bp );
642 unsigned int sgetU4( unsigned char **bp );
643 int sgetVX( unsigned char **bp );
644 float sgetF4( unsigned char **bp );
645 char *sgetS0( unsigned char **bp );
647 #if !GDEF_ARCH_ENDIAN_BIG
648 void revbytes( void *bp, int elsize, int elcount );
650 #define revbytes( b, s, c )