2 ======================================================================
\r
5 Definitions and typedefs for LWO2 files.
\r
7 Ernie Wright 17 Sep 00
\r
8 ====================================================================== */
\r
13 /* chunk and subchunk IDs */
\r
15 #define LWID_(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
\r
17 #define ID_FORM LWID_('F','O','R','M')
\r
18 #define ID_LWO2 LWID_('L','W','O','2')
\r
19 #define ID_LWOB LWID_('L','W','O','B')
\r
21 /* top-level chunks */
\r
22 #define ID_LAYR LWID_('L','A','Y','R')
\r
23 #define ID_TAGS LWID_('T','A','G','S')
\r
24 #define ID_PNTS LWID_('P','N','T','S')
\r
25 #define ID_BBOX LWID_('B','B','O','X')
\r
26 #define ID_VMAP LWID_('V','M','A','P')
\r
27 #define ID_VMAD LWID_('V','M','A','D')
\r
28 #define ID_POLS LWID_('P','O','L','S')
\r
29 #define ID_PTAG LWID_('P','T','A','G')
\r
30 #define ID_ENVL LWID_('E','N','V','L')
\r
31 #define ID_CLIP LWID_('C','L','I','P')
\r
32 #define ID_SURF LWID_('S','U','R','F')
\r
33 #define ID_DESC LWID_('D','E','S','C')
\r
34 #define ID_TEXT LWID_('T','E','X','T')
\r
35 #define ID_ICON LWID_('I','C','O','N')
\r
38 #define ID_FACE LWID_('F','A','C','E')
\r
39 #define ID_CURV LWID_('C','U','R','V')
\r
40 #define ID_PTCH LWID_('P','T','C','H')
\r
41 #define ID_MBAL LWID_('M','B','A','L')
\r
42 #define ID_BONE LWID_('B','O','N','E')
\r
45 #define ID_SURF LWID_('S','U','R','F')
\r
46 #define ID_PART LWID_('P','A','R','T')
\r
47 #define ID_SMGP LWID_('S','M','G','P')
\r
50 #define ID_PRE LWID_('P','R','E',' ')
\r
51 #define ID_POST LWID_('P','O','S','T')
\r
52 #define ID_KEY LWID_('K','E','Y',' ')
\r
53 #define ID_SPAN LWID_('S','P','A','N')
\r
54 #define ID_TCB LWID_('T','C','B',' ')
\r
55 #define ID_HERM LWID_('H','E','R','M')
\r
56 #define ID_BEZI LWID_('B','E','Z','I')
\r
57 #define ID_BEZ2 LWID_('B','E','Z','2')
\r
58 #define ID_LINE LWID_('L','I','N','E')
\r
59 #define ID_STEP LWID_('S','T','E','P')
\r
62 #define ID_STIL LWID_('S','T','I','L')
\r
63 #define ID_ISEQ LWID_('I','S','E','Q')
\r
64 #define ID_ANIM LWID_('A','N','I','M')
\r
65 #define ID_XREF LWID_('X','R','E','F')
\r
66 #define ID_STCC LWID_('S','T','C','C')
\r
67 #define ID_TIME LWID_('T','I','M','E')
\r
68 #define ID_CONT LWID_('C','O','N','T')
\r
69 #define ID_BRIT LWID_('B','R','I','T')
\r
70 #define ID_SATR LWID_('S','A','T','R')
\r
71 #define ID_HUE LWID_('H','U','E',' ')
\r
72 #define ID_GAMM LWID_('G','A','M','M')
\r
73 #define ID_NEGA LWID_('N','E','G','A')
\r
74 #define ID_IFLT LWID_('I','F','L','T')
\r
75 #define ID_PFLT LWID_('P','F','L','T')
\r
78 #define ID_COLR LWID_('C','O','L','R')
\r
79 #define ID_LUMI LWID_('L','U','M','I')
\r
80 #define ID_DIFF LWID_('D','I','F','F')
\r
81 #define ID_SPEC LWID_('S','P','E','C')
\r
82 #define ID_GLOS LWID_('G','L','O','S')
\r
83 #define ID_REFL LWID_('R','E','F','L')
\r
84 #define ID_RFOP LWID_('R','F','O','P')
\r
85 #define ID_RIMG LWID_('R','I','M','G')
\r
86 #define ID_RSAN LWID_('R','S','A','N')
\r
87 #define ID_TRAN LWID_('T','R','A','N')
\r
88 #define ID_TROP LWID_('T','R','O','P')
\r
89 #define ID_TIMG LWID_('T','I','M','G')
\r
90 #define ID_RIND LWID_('R','I','N','D')
\r
91 #define ID_TRNL LWID_('T','R','N','L')
\r
92 #define ID_BUMP LWID_('B','U','M','P')
\r
93 #define ID_SMAN LWID_('S','M','A','N')
\r
94 #define ID_SIDE LWID_('S','I','D','E')
\r
95 #define ID_CLRH LWID_('C','L','R','H')
\r
96 #define ID_CLRF LWID_('C','L','R','F')
\r
97 #define ID_ADTR LWID_('A','D','T','R')
\r
98 #define ID_SHRP LWID_('S','H','R','P')
\r
99 #define ID_LINE LWID_('L','I','N','E')
\r
100 #define ID_LSIZ LWID_('L','S','I','Z')
\r
101 #define ID_ALPH LWID_('A','L','P','H')
\r
102 #define ID_AVAL LWID_('A','V','A','L')
\r
103 #define ID_GVAL LWID_('G','V','A','L')
\r
104 #define ID_BLOK LWID_('B','L','O','K')
\r
106 /* texture layer */
\r
107 #define ID_TYPE LWID_('T','Y','P','E')
\r
108 #define ID_CHAN LWID_('C','H','A','N')
\r
109 #define ID_NAME LWID_('N','A','M','E')
\r
110 #define ID_ENAB LWID_('E','N','A','B')
\r
111 #define ID_OPAC LWID_('O','P','A','C')
\r
112 #define ID_FLAG LWID_('F','L','A','G')
\r
113 #define ID_PROJ LWID_('P','R','O','J')
\r
114 #define ID_STCK LWID_('S','T','C','K')
\r
115 #define ID_TAMP LWID_('T','A','M','P')
\r
117 /* texture coordinates */
\r
118 #define ID_TMAP LWID_('T','M','A','P')
\r
119 #define ID_AXIS LWID_('A','X','I','S')
\r
120 #define ID_CNTR LWID_('C','N','T','R')
\r
121 #define ID_SIZE LWID_('S','I','Z','E')
\r
122 #define ID_ROTA LWID_('R','O','T','A')
\r
123 #define ID_OREF LWID_('O','R','E','F')
\r
124 #define ID_FALL LWID_('F','A','L','L')
\r
125 #define ID_CSYS LWID_('C','S','Y','S')
\r
128 #define ID_IMAP LWID_('I','M','A','P')
\r
129 #define ID_IMAG LWID_('I','M','A','G')
\r
130 #define ID_WRAP LWID_('W','R','A','P')
\r
131 #define ID_WRPW LWID_('W','R','P','W')
\r
132 #define ID_WRPH LWID_('W','R','P','H')
\r
133 #define ID_VMAP LWID_('V','M','A','P')
\r
134 #define ID_AAST LWID_('A','A','S','T')
\r
135 #define ID_PIXB LWID_('P','I','X','B')
\r
138 #define ID_PROC LWID_('P','R','O','C')
\r
139 #define ID_COLR LWID_('C','O','L','R')
\r
140 #define ID_VALU LWID_('V','A','L','U')
\r
141 #define ID_FUNC LWID_('F','U','N','C')
\r
142 #define ID_FTPS LWID_('F','T','P','S')
\r
143 #define ID_ITPS LWID_('I','T','P','S')
\r
144 #define ID_ETPS LWID_('E','T','P','S')
\r
147 #define ID_GRAD LWID_('G','R','A','D')
\r
148 #define ID_GRST LWID_('G','R','S','T')
\r
149 #define ID_GREN LWID_('G','R','E','N')
\r
150 #define ID_PNAM LWID_('P','N','A','M')
\r
151 #define ID_INAM LWID_('I','N','A','M')
\r
152 #define ID_GRPT LWID_('G','R','P','T')
\r
153 #define ID_FKEY LWID_('F','K','E','Y')
\r
154 #define ID_IKEY LWID_('I','K','E','Y')
\r
157 #define ID_SHDR LWID_('S','H','D','R')
\r
158 #define ID_DATA LWID_('D','A','T','A')
\r
161 /* generic linked list */
\r
163 typedef struct st_lwNode {
\r
164 struct st_lwNode *next, *prev;
\r
169 /* plug-in reference */
\r
171 typedef struct st_lwPlugin {
\r
172 struct st_lwPlugin *next, *prev;
\r
182 typedef struct st_lwKey {
\r
183 struct st_lwKey *next, *prev;
\r
186 unsigned int shape; /* ID_TCB, ID_BEZ2, etc. */
\r
193 typedef struct st_lwEnvelope {
\r
194 struct st_lwEnvelope *next, *prev;
\r
198 lwKey *key; /* linked list of keys */
\r
200 int behavior[ 2 ]; /* pre and post (extrapolation) */
\r
201 lwPlugin *cfilter; /* linked list of channel filters */
\r
205 #define BEH_RESET 0
\r
206 #define BEH_CONSTANT 1
\r
207 #define BEH_REPEAT 2
\r
208 #define BEH_OSCILLATE 3
\r
209 #define BEH_OFFSET 4
\r
210 #define BEH_LINEAR 5
\r
213 /* values that can be enveloped */
\r
215 typedef struct st_lwEParam {
\r
220 typedef struct st_lwVParam {
\r
228 typedef struct st_lwClipStill {
\r
232 typedef struct st_lwClipSeq {
\r
233 char *prefix; /* filename before sequence digits */
\r
234 char *suffix; /* after digits, e.g. extensions */
\r
242 typedef struct st_lwClipAnim {
\r
244 char *server; /* anim loader plug-in */
\r
248 typedef struct st_lwClipXRef {
\r
251 struct st_lwClip *clip;
\r
254 typedef struct st_lwClipCycle {
\r
260 typedef struct st_lwClip {
\r
261 struct st_lwClip *next, *prev;
\r
263 unsigned int type; /* ID_STIL, ID_ISEQ, etc. */
\r
275 lwEParam brightness;
\r
276 lwEParam saturation;
\r
280 lwPlugin *ifilter; /* linked list of image filters */
\r
282 lwPlugin *pfilter; /* linked list of pixel filters */
\r
289 typedef struct st_lwTMap {
\r
299 typedef struct st_lwImageMap {
\r
312 lwEParam amplitude;
\r
315 #define PROJ_PLANAR 0
\r
316 #define PROJ_CYLINDRICAL 1
\r
317 #define PROJ_SPHERICAL 2
\r
318 #define PROJ_CUBIC 3
\r
319 #define PROJ_FRONT 4
\r
321 #define WRAP_NONE 0
\r
322 #define WRAP_EDGE 1
\r
323 #define WRAP_REPEAT 2
\r
324 #define WRAP_MIRROR 3
\r
326 typedef struct st_lwProcedural {
\r
333 typedef struct st_lwGradKey {
\r
334 struct st_lwGradKey *next, *prev;
\r
339 typedef struct st_lwGradient {
\r
345 lwGradKey *key; /* array of gradient keys */
\r
346 short *ikey; /* array of interpolation codes */
\r
349 typedef struct st_lwTexture {
\r
350 struct st_lwTexture *next, *prev;
\r
368 /* values that can be textured */
\r
370 typedef struct st_lwTParam {
\r
373 lwTexture *tex; /* linked list of texture layers */
\r
376 typedef struct st_lwCParam {
\r
379 lwTexture *tex; /* linked list of texture layers */
\r
385 typedef struct st_lwGlow {
\r
388 lwEParam intensity;
\r
392 typedef struct st_lwRMap {
\r
399 typedef struct st_lwLine {
\r
401 unsigned short flags;
\r
405 typedef struct st_lwSurface {
\r
406 struct st_lwSurface *next, *prev;
\r
410 lwTParam luminosity;
\r
412 lwTParam specularity;
\r
413 lwTParam glossiness;
\r
415 lwRMap transparency;
\r
417 lwTParam translucency;
\r
423 lwEParam color_hilite;
\r
424 lwEParam color_filter;
\r
425 lwEParam add_trans;
\r
426 lwEParam dif_sharp;
\r
429 lwPlugin *shader; /* linked list of shaders */
\r
436 typedef struct st_lwVMap {
\r
437 struct st_lwVMap *next, *prev;
\r
443 int *vindex; /* array of point indexes */
\r
444 int *pindex; /* array of polygon indexes */
\r
448 typedef struct st_lwVMapPt {
\r
450 int index; /* vindex or pindex element */
\r
454 /* points and polygons */
\r
456 typedef struct st_lwPoint {
\r
458 int npols; /* number of polygons sharing the point */
\r
459 int *pol; /* array of polygon indexes */
\r
461 lwVMapPt *vm; /* array of vmap references */
\r
464 typedef struct st_lwPolVert {
\r
465 int index; /* index into the point array */
\r
468 lwVMapPt *vm; /* array of vmap references */
\r
471 typedef struct st_lwPolygon {
\r
473 int part; /* part index */
\r
474 int smoothgrp; /* smoothing group */
\r
479 lwPolVert *v; /* array of vertex records */
\r
482 typedef struct st_lwPointList {
\r
484 int offset; /* only used during reading */
\r
485 lwPoint *pt; /* array of points */
\r
488 typedef struct st_lwPolygonList {
\r
490 int offset; /* only used during reading */
\r
491 int vcount; /* total number of vertices */
\r
492 int voffset; /* only used during reading */
\r
493 lwPolygon *pol; /* array of polygons */
\r
497 /* geometry layers */
\r
499 typedef struct st_lwLayer {
\r
500 struct st_lwLayer *next, *prev;
\r
508 lwPolygonList polygon;
\r
510 lwVMap *vmap; /* linked list of vmaps */
\r
516 typedef struct st_lwTagList {
\r
518 int offset; /* only used during reading */
\r
519 char **tag; /* array of strings */
\r
525 typedef struct st_lwObject {
\r
526 lwLayer *layer; /* linked list of layers */
\r
527 lwEnvelope *env; /* linked list of envelopes */
\r
528 lwClip *clip; /* linked list of clips */
\r
529 lwSurface *surf; /* linked list of surfaces */
\r
540 void lwFreeLayer( lwLayer *layer );
\r
541 void lwFreeObject( lwObject *object );
\r
542 lwObject *lwGetObject( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
\r
543 int lwValidateObject( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
\r
547 void lwFreePoints( lwPointList *point );
\r
548 void lwFreePolygons( lwPolygonList *plist );
\r
549 int lwGetPoints( picoMemStream_t *fp, int cksize, lwPointList *point );
\r
550 void lwGetBoundingBox( lwPointList *point, float bbox[] );
\r
551 int lwAllocPolygons( lwPolygonList *plist, int npols, int nverts );
\r
552 int lwGetPolygons( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );
\r
553 void lwGetPolyNormals( lwPointList *point, lwPolygonList *polygon );
\r
554 int lwGetPointPolygons( lwPointList *point, lwPolygonList *polygon );
\r
555 int lwResolvePolySurfaces( lwPolygonList *polygon, lwTagList *tlist,
\r
556 lwSurface **surf, int *nsurfs );
\r
557 void lwGetVertNormals( lwPointList *point, lwPolygonList *polygon );
\r
558 void lwFreeTags( lwTagList *tlist );
\r
559 int lwGetTags( picoMemStream_t *fp, int cksize, lwTagList *tlist );
\r
560 int lwGetPolygonTags( picoMemStream_t *fp, int cksize, lwTagList *tlist,
\r
561 lwPolygonList *plist );
\r
565 void lwFreeVMap( lwVMap *vmap );
\r
566 lwVMap *lwGetVMap( picoMemStream_t *fp, int cksize, int ptoffset, int poloffset,
\r
568 int lwGetPointVMaps( lwPointList *point, lwVMap *vmap );
\r
569 int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap );
\r
573 void lwFreeClip( lwClip *clip );
\r
574 lwClip *lwGetClip( picoMemStream_t *fp, int cksize );
\r
575 lwClip *lwFindClip( lwClip *list, int index );
\r
579 void lwFreeEnvelope( lwEnvelope *env );
\r
580 lwEnvelope *lwGetEnvelope( picoMemStream_t *fp, int cksize );
\r
581 lwEnvelope *lwFindEnvelope( lwEnvelope *list, int index );
\r
582 float lwEvalEnvelope( lwEnvelope *env, float time );
\r
586 void lwFreePlugin( lwPlugin *p );
\r
587 void lwFreeTexture( lwTexture *t );
\r
588 void lwFreeSurface( lwSurface *surf );
\r
589 int lwGetTHeader( picoMemStream_t *fp, int hsz, lwTexture *tex );
\r
590 int lwGetTMap( picoMemStream_t *fp, int tmapsz, lwTMap *tmap );
\r
591 int lwGetImageMap( picoMemStream_t *fp, int rsz, lwTexture *tex );
\r
592 int lwGetProcedural( picoMemStream_t *fp, int rsz, lwTexture *tex );
\r
593 int lwGetGradient( picoMemStream_t *fp, int rsz, lwTexture *tex );
\r
594 lwTexture *lwGetTexture( picoMemStream_t *fp, int bloksz, unsigned int type );
\r
595 lwPlugin *lwGetShader( picoMemStream_t *fp, int bloksz );
\r
596 lwSurface *lwGetSurface( picoMemStream_t *fp, int cksize );
\r
597 lwSurface *lwDefaultSurface( void );
\r
601 lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj );
\r
602 int lwGetPolygons5( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );
\r
603 lwObject *lwGetObject5( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
\r
604 int lwValidateObject5( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
\r
608 void lwListFree( void *list, void ( *freeNode )( void * ));
\r
609 void lwListAdd( void **list, void *node );
\r
610 void lwListInsert( void **vlist, void *vitem,
\r
611 int ( *compare )( void *, void * ));
\r
615 float dot( float a[], float b[] );
\r
616 void cross( float a[], float b[], float c[] );
\r
617 void normalize( float v[] );
\r
618 #define vecangle( a, b ) ( float ) acos( dot( a, b ))
\r
622 void set_flen( int i );
\r
623 int get_flen( void );
\r
624 void *getbytes( picoMemStream_t *fp, int size );
\r
625 void skipbytes( picoMemStream_t *fp, int n );
\r
626 int getI1( picoMemStream_t *fp );
\r
627 short getI2( picoMemStream_t *fp );
\r
628 int getI4( picoMemStream_t *fp );
\r
629 unsigned char getU1( picoMemStream_t *fp );
\r
630 unsigned short getU2( picoMemStream_t *fp );
\r
631 unsigned int getU4( picoMemStream_t *fp );
\r
632 int getVX( picoMemStream_t *fp );
\r
633 float getF4( picoMemStream_t *fp );
\r
634 char *getS0( picoMemStream_t *fp );
\r
635 int sgetI1( unsigned char **bp );
\r
636 short sgetI2( unsigned char **bp );
\r
637 int sgetI4( unsigned char **bp );
\r
638 unsigned char sgetU1( unsigned char **bp );
\r
639 unsigned short sgetU2( unsigned char **bp );
\r
640 unsigned int sgetU4( unsigned char **bp );
\r
641 int sgetVX( unsigned char **bp );
\r
642 float sgetF4( unsigned char **bp );
\r
643 char *sgetS0( unsigned char **bp );
\r
646 void revbytes( void *bp, int elsize, int elcount );
\r
648 #define revbytes( b, s, c )
\r