]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - misc/mediasource/extra/netradiant-src/libs/picomodel/lwo/lwo2.h
Rename the compiled fteqcc to fteqcc-win32 (as that's what it is)
[voretournament/voretournament.git] / misc / mediasource / extra / netradiant-src / libs / picomodel / lwo / lwo2.h
1 /*
2 ======================================================================
3 lwo2.h
4
5 Definitions and typedefs for LWO2 files.
6
7 Ernie Wright  17 Sep 00
8 ====================================================================== */
9
10 #ifndef LWO2_H
11 #define LWO2_H
12
13 /* chunk and subchunk IDs */
14
15 #define LWID_(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
16
17 #define ID_FORM  LWID_('F','O','R','M')
18 #define ID_LWO2  LWID_('L','W','O','2')
19 #define ID_LWOB  LWID_('L','W','O','B')
20
21 /* top-level chunks */
22 #define ID_LAYR  LWID_('L','A','Y','R')
23 #define ID_TAGS  LWID_('T','A','G','S')
24 #define ID_PNTS  LWID_('P','N','T','S')
25 #define ID_BBOX  LWID_('B','B','O','X')
26 #define ID_VMAP  LWID_('V','M','A','P')
27 #define ID_VMAD  LWID_('V','M','A','D')
28 #define ID_POLS  LWID_('P','O','L','S')
29 #define ID_PTAG  LWID_('P','T','A','G')
30 #define ID_ENVL  LWID_('E','N','V','L')
31 #define ID_CLIP  LWID_('C','L','I','P')
32 #define ID_SURF  LWID_('S','U','R','F')
33 #define ID_DESC  LWID_('D','E','S','C')
34 #define ID_TEXT  LWID_('T','E','X','T')
35 #define ID_ICON  LWID_('I','C','O','N')
36
37 /* polygon types */
38 #define ID_FACE  LWID_('F','A','C','E')
39 #define ID_CURV  LWID_('C','U','R','V')
40 #define ID_PTCH  LWID_('P','T','C','H')
41 #define ID_MBAL  LWID_('M','B','A','L')
42 #define ID_BONE  LWID_('B','O','N','E')
43
44 /* polygon tags */
45 #define ID_SURF  LWID_('S','U','R','F')
46 #define ID_PART  LWID_('P','A','R','T')
47 #define ID_SMGP  LWID_('S','M','G','P')
48
49 /* envelopes */
50 #define ID_PRE   LWID_('P','R','E',' ')
51 #define ID_POST  LWID_('P','O','S','T')
52 #define ID_KEY   LWID_('K','E','Y',' ')
53 #define ID_SPAN  LWID_('S','P','A','N')
54 #define ID_TCB   LWID_('T','C','B',' ')
55 #define ID_HERM  LWID_('H','E','R','M')
56 #define ID_BEZI  LWID_('B','E','Z','I')
57 #define ID_BEZ2  LWID_('B','E','Z','2')
58 #define ID_LINE  LWID_('L','I','N','E')
59 #define ID_STEP  LWID_('S','T','E','P')
60
61 /* clips */
62 #define ID_STIL  LWID_('S','T','I','L')
63 #define ID_ISEQ  LWID_('I','S','E','Q')
64 #define ID_ANIM  LWID_('A','N','I','M')
65 #define ID_XREF  LWID_('X','R','E','F')
66 #define ID_STCC  LWID_('S','T','C','C')
67 #define ID_TIME  LWID_('T','I','M','E')
68 #define ID_CONT  LWID_('C','O','N','T')
69 #define ID_BRIT  LWID_('B','R','I','T')
70 #define ID_SATR  LWID_('S','A','T','R')
71 #define ID_HUE   LWID_('H','U','E',' ')
72 #define ID_GAMM  LWID_('G','A','M','M')
73 #define ID_NEGA  LWID_('N','E','G','A')
74 #define ID_IFLT  LWID_('I','F','L','T')
75 #define ID_PFLT  LWID_('P','F','L','T')
76
77 /* surfaces */
78 #define ID_COLR  LWID_('C','O','L','R')
79 #define ID_LUMI  LWID_('L','U','M','I')
80 #define ID_DIFF  LWID_('D','I','F','F')
81 #define ID_SPEC  LWID_('S','P','E','C')
82 #define ID_GLOS  LWID_('G','L','O','S')
83 #define ID_REFL  LWID_('R','E','F','L')
84 #define ID_RFOP  LWID_('R','F','O','P')
85 #define ID_RIMG  LWID_('R','I','M','G')
86 #define ID_RSAN  LWID_('R','S','A','N')
87 #define ID_TRAN  LWID_('T','R','A','N')
88 #define ID_TROP  LWID_('T','R','O','P')
89 #define ID_TIMG  LWID_('T','I','M','G')
90 #define ID_RIND  LWID_('R','I','N','D')
91 #define ID_TRNL  LWID_('T','R','N','L')
92 #define ID_BUMP  LWID_('B','U','M','P')
93 #define ID_SMAN  LWID_('S','M','A','N')
94 #define ID_SIDE  LWID_('S','I','D','E')
95 #define ID_CLRH  LWID_('C','L','R','H')
96 #define ID_CLRF  LWID_('C','L','R','F')
97 #define ID_ADTR  LWID_('A','D','T','R')
98 #define ID_SHRP  LWID_('S','H','R','P')
99 #define ID_LINE  LWID_('L','I','N','E')
100 #define ID_LSIZ  LWID_('L','S','I','Z')
101 #define ID_ALPH  LWID_('A','L','P','H')
102 #define ID_AVAL  LWID_('A','V','A','L')
103 #define ID_GVAL  LWID_('G','V','A','L')
104 #define ID_BLOK  LWID_('B','L','O','K')
105
106 /* texture layer */
107 #define ID_TYPE  LWID_('T','Y','P','E')
108 #define ID_CHAN  LWID_('C','H','A','N')
109 #define ID_NAME  LWID_('N','A','M','E')
110 #define ID_ENAB  LWID_('E','N','A','B')
111 #define ID_OPAC  LWID_('O','P','A','C')
112 #define ID_FLAG  LWID_('F','L','A','G')
113 #define ID_PROJ  LWID_('P','R','O','J')
114 #define ID_STCK  LWID_('S','T','C','K')
115 #define ID_TAMP  LWID_('T','A','M','P')
116
117 /* texture coordinates */
118 #define ID_TMAP  LWID_('T','M','A','P')
119 #define ID_AXIS  LWID_('A','X','I','S')
120 #define ID_CNTR  LWID_('C','N','T','R')
121 #define ID_SIZE  LWID_('S','I','Z','E')
122 #define ID_ROTA  LWID_('R','O','T','A')
123 #define ID_OREF  LWID_('O','R','E','F')
124 #define ID_FALL  LWID_('F','A','L','L')
125 #define ID_CSYS  LWID_('C','S','Y','S')
126
127 /* image map */
128 #define ID_IMAP  LWID_('I','M','A','P')
129 #define ID_IMAG  LWID_('I','M','A','G')
130 #define ID_WRAP  LWID_('W','R','A','P')
131 #define ID_WRPW  LWID_('W','R','P','W')
132 #define ID_WRPH  LWID_('W','R','P','H')
133 #define ID_VMAP  LWID_('V','M','A','P')
134 #define ID_AAST  LWID_('A','A','S','T')
135 #define ID_PIXB  LWID_('P','I','X','B')
136
137 /* procedural */
138 #define ID_PROC  LWID_('P','R','O','C')
139 #define ID_COLR  LWID_('C','O','L','R')
140 #define ID_VALU  LWID_('V','A','L','U')
141 #define ID_FUNC  LWID_('F','U','N','C')
142 #define ID_FTPS  LWID_('F','T','P','S')
143 #define ID_ITPS  LWID_('I','T','P','S')
144 #define ID_ETPS  LWID_('E','T','P','S')
145
146 /* gradient */
147 #define ID_GRAD  LWID_('G','R','A','D')
148 #define ID_GRST  LWID_('G','R','S','T')
149 #define ID_GREN  LWID_('G','R','E','N')
150 #define ID_PNAM  LWID_('P','N','A','M')
151 #define ID_INAM  LWID_('I','N','A','M')
152 #define ID_GRPT  LWID_('G','R','P','T')
153 #define ID_FKEY  LWID_('F','K','E','Y')
154 #define ID_IKEY  LWID_('I','K','E','Y')
155
156 /* shader */
157 #define ID_SHDR  LWID_('S','H','D','R')
158 #define ID_DATA  LWID_('D','A','T','A')
159
160
161 /* generic linked list */
162
163 typedef struct st_lwNode {
164    struct st_lwNode *next, *prev;
165    void *data;
166 } lwNode;
167
168
169 /* plug-in reference */
170
171 typedef struct st_lwPlugin {
172    struct st_lwPlugin *next, *prev;
173    char          *ord;
174    char          *name;
175    int            flags;
176    void          *data;
177 } lwPlugin;
178
179
180 /* envelopes */
181
182 typedef struct st_lwKey {
183    struct st_lwKey *next, *prev;
184    float          value;
185    float          time;
186    unsigned int   shape;               /* ID_TCB, ID_BEZ2, etc. */
187    float          tension;
188    float          continuity;
189    float          bias;
190    float          param[ 4 ];
191 } lwKey;
192
193 typedef struct st_lwEnvelope {
194    struct st_lwEnvelope *next, *prev;
195    int            index;
196    int            type;
197    char          *name;
198    lwKey         *key;                 /* linked list of keys */
199    int            nkeys;
200    int            behavior[ 2 ];       /* pre and post (extrapolation) */
201    lwPlugin      *cfilter;             /* linked list of channel filters */
202    int            ncfilters;
203 } lwEnvelope;
204
205 #define BEH_RESET      0
206 #define BEH_CONSTANT   1
207 #define BEH_REPEAT     2
208 #define BEH_OSCILLATE  3
209 #define BEH_OFFSET     4
210 #define BEH_LINEAR     5
211
212
213 /* values that can be enveloped */
214
215 typedef struct st_lwEParam {
216    float          val;
217    int            eindex;
218 } lwEParam;
219
220 typedef struct st_lwVParam {
221    float          val[ 3 ];
222    int            eindex;
223 } lwVParam;
224
225
226 /* clips */
227
228 typedef struct st_lwClipStill {
229    char          *name;
230 } lwClipStill;
231
232 typedef struct st_lwClipSeq {
233    char          *prefix;              /* filename before sequence digits */
234    char          *suffix;              /* after digits, e.g. extensions */
235    int            digits;
236    int            flags;
237    int            offset;
238    int            start;
239    int            end;
240 } lwClipSeq;
241
242 typedef struct st_lwClipAnim {
243    char          *name;
244    char          *server;              /* anim loader plug-in */
245    void          *data;
246 } lwClipAnim;
247
248 typedef struct st_lwClipXRef {
249    char          *string;
250    int            index;
251    struct st_lwClip *clip;
252 } lwClipXRef;
253
254 typedef struct st_lwClipCycle {
255    char          *name;
256    int            lo;
257    int            hi;
258 } lwClipCycle;
259
260 typedef struct st_lwClip {
261    struct st_lwClip *next, *prev;
262    int            index;
263    unsigned int   type;                /* ID_STIL, ID_ISEQ, etc. */
264    union {
265       lwClipStill    still;
266       lwClipSeq      seq;
267       lwClipAnim     anim;
268       lwClipXRef     xref;
269       lwClipCycle    cycle;
270    }              source;
271    float          start_time;
272    float          duration;
273    float          frame_rate;
274    lwEParam       contrast;
275    lwEParam       brightness;
276    lwEParam       saturation;
277    lwEParam       hue;
278    lwEParam       gamma;
279    int            negative;
280    lwPlugin      *ifilter;             /* linked list of image filters */
281    int            nifilters;
282    lwPlugin      *pfilter;             /* linked list of pixel filters */
283    int            npfilters;
284 } lwClip;
285
286
287 /* textures */
288
289 typedef struct st_lwTMap {
290    lwVParam       size;
291    lwVParam       center;
292    lwVParam       rotate;
293    lwVParam       falloff;
294    int            fall_type;
295    char          *ref_object;
296    int            coord_sys;
297 } lwTMap;
298
299 typedef struct st_lwImageMap {
300    int            cindex;
301    int            projection;
302    char          *vmap_name;
303    int            axis;
304    int            wrapw_type;
305    int            wraph_type;
306    lwEParam       wrapw;
307    lwEParam       wraph;
308    float          aa_strength;
309    int            aas_flags;
310    int            pblend;
311    lwEParam       stck;
312    lwEParam       amplitude;
313 } lwImageMap;
314
315 #define PROJ_PLANAR       0
316 #define PROJ_CYLINDRICAL  1
317 #define PROJ_SPHERICAL    2
318 #define PROJ_CUBIC        3
319 #define PROJ_FRONT        4
320
321 #define WRAP_NONE    0
322 #define WRAP_EDGE    1
323 #define WRAP_REPEAT  2
324 #define WRAP_MIRROR  3
325
326 typedef struct st_lwProcedural {
327    int            axis;
328    float          value[ 3 ];
329    char          *name;
330    void          *data;
331 } lwProcedural;
332
333 typedef struct st_lwGradKey {
334    struct st_lwGradKey *next, *prev;
335    float          value;
336    float          rgba[ 4 ];
337 } lwGradKey;
338
339 typedef struct st_lwGradient {
340    char          *paramname;
341    char          *itemname;
342    float          start;
343    float          end;
344    int            repeat;
345    lwGradKey     *key;                 /* array of gradient keys */
346    short         *ikey;                /* array of interpolation codes */
347 } lwGradient;
348
349 typedef struct st_lwTexture {
350    struct st_lwTexture *next, *prev;
351    char          *ord;
352    unsigned int   type;
353    unsigned int   chan;
354    lwEParam       opacity;
355    short          opac_type;
356    short          enabled;
357    short          negative;
358    short          axis;
359    union {
360       lwImageMap     imap;
361       lwProcedural   proc;
362       lwGradient     grad;
363    }              param;
364    lwTMap         tmap;
365 } lwTexture;
366
367
368 /* values that can be textured */
369
370 typedef struct st_lwTParam {
371    float          val;
372    int            eindex;
373    lwTexture     *tex;                 /* linked list of texture layers */
374 } lwTParam;
375
376 typedef struct st_lwCParam {
377    float          rgb[ 3 ];
378    int            eindex;
379    lwTexture     *tex;                 /* linked list of texture layers */
380 } lwCParam;
381
382
383 /* surfaces */
384
385 typedef struct st_lwGlow {
386    short          enabled;
387    short          type;
388    lwEParam       intensity;
389    lwEParam       size;
390 } Glow;
391
392 typedef struct st_lwRMap {
393    lwTParam       val;
394    int            options;
395    int            cindex;
396    float          seam_angle;
397 } lwRMap;
398
399 typedef struct st_lwLine {
400    short          enabled;
401    unsigned short flags;
402    lwEParam       size;
403 } lwLine;
404
405 typedef struct st_lwSurface {
406    struct st_lwSurface *next, *prev;
407    char          *name;
408    char          *srcname;
409    lwCParam       color;
410    lwTParam       luminosity;
411    lwTParam       diffuse;
412    lwTParam       specularity;
413    lwTParam       glossiness;
414    lwRMap         reflection;
415    lwRMap         transparency;
416    lwTParam       eta;
417    lwTParam       translucency;
418    lwTParam       bump;
419    float          smooth;
420    int            sideflags;
421    float          alpha;
422    int            alpha_mode;
423    lwEParam       color_hilite;
424    lwEParam       color_filter;
425    lwEParam       add_trans;
426    lwEParam       dif_sharp;
427    lwEParam       glow;
428    lwLine         line;
429    lwPlugin      *shader;              /* linked list of shaders */
430    int            nshaders;
431 } lwSurface;
432
433
434 /* vertex maps */
435
436 typedef struct st_lwVMap {
437    struct st_lwVMap *next, *prev;
438    char          *name;
439    unsigned int   type;
440    int            dim;
441    int            nverts;
442    int            perpoly;
443    int           *vindex;              /* array of point indexes */
444    int           *pindex;              /* array of polygon indexes */
445    float        **val;
446 } lwVMap;
447
448 typedef struct st_lwVMapPt {
449    lwVMap        *vmap;
450    int            index;               /* vindex or pindex element */
451 } lwVMapPt;
452
453
454 /* points and polygons */
455
456 typedef struct st_lwPoint {
457    float          pos[ 3 ];
458    int            npols;               /* number of polygons sharing the point */
459    int           *pol;                 /* array of polygon indexes */
460    int            nvmaps;
461    lwVMapPt      *vm;                  /* array of vmap references */
462 } lwPoint;
463
464 typedef struct st_lwPolVert {
465    int            index;               /* index into the point array */
466    float          norm[ 3 ];
467    int            nvmaps;
468    lwVMapPt      *vm;                  /* array of vmap references */
469 } lwPolVert;
470
471 typedef struct st_lwPolygon {
472    lwSurface     *surf;
473    int            part;                /* part index */
474    int            smoothgrp;           /* smoothing group */
475    int            flags;
476    unsigned int   type;
477    float          norm[ 3 ];
478    int            nverts;
479    lwPolVert     *v;                   /* array of vertex records */
480 } lwPolygon;
481
482 typedef struct st_lwPointList {
483    int            count;
484    int            offset;              /* only used during reading */
485    lwPoint       *pt;                  /* array of points */
486 } lwPointList;
487
488 typedef struct st_lwPolygonList {
489    int            count;
490    int            offset;              /* only used during reading */
491    int            vcount;              /* total number of vertices */
492    int            voffset;             /* only used during reading */
493    lwPolygon     *pol;                 /* array of polygons */
494 } lwPolygonList;
495
496
497 /* geometry layers */
498
499 typedef struct st_lwLayer {
500    struct st_lwLayer *next, *prev;
501    char          *name;
502    int            index;
503    int            parent;
504    int            flags;
505    float          pivot[ 3 ];
506    float          bbox[ 6 ];
507    lwPointList    point;
508    lwPolygonList  polygon;
509    int            nvmaps;
510    lwVMap        *vmap;                /* linked list of vmaps */
511 } lwLayer;
512
513
514 /* tag strings */
515
516 typedef struct st_lwTagList {
517    int            count;
518    int            offset;              /* only used during reading */
519    char         **tag;                 /* array of strings */
520 } lwTagList;
521
522
523 /* an object */
524
525 typedef struct st_lwObject {
526    lwLayer       *layer;               /* linked list of layers */
527    lwEnvelope    *env;                 /* linked list of envelopes */
528    lwClip        *clip;                /* linked list of clips */
529    lwSurface     *surf;                /* linked list of surfaces */
530    lwTagList      taglist;
531    int            nlayers;
532    int            nenvs;
533    int            nclips;
534    int            nsurfs;
535 } lwObject;
536
537
538 /* lwo2.c */
539
540 void lwFreeLayer( lwLayer *layer );
541 void lwFreeObject( lwObject *object );
542 lwObject *lwGetObject( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
543 int lwValidateObject( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
544
545 /* pntspols.c */
546
547 void lwFreePoints( lwPointList *point );
548 void lwFreePolygons( lwPolygonList *plist );
549 int lwGetPoints( picoMemStream_t *fp, int cksize, lwPointList *point );
550 void lwGetBoundingBox( lwPointList *point, float bbox[] );
551 int lwAllocPolygons( lwPolygonList *plist, int npols, int nverts );
552 int lwGetPolygons( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );
553 void lwGetPolyNormals( lwPointList *point, lwPolygonList *polygon );
554 int lwGetPointPolygons( lwPointList *point, lwPolygonList *polygon );
555 int lwResolvePolySurfaces( lwPolygonList *polygon, lwTagList *tlist,
556    lwSurface **surf, int *nsurfs );
557 void lwGetVertNormals( lwPointList *point, lwPolygonList *polygon );
558 void lwFreeTags( lwTagList *tlist );
559 int lwGetTags( picoMemStream_t *fp, int cksize, lwTagList *tlist );
560 int lwGetPolygonTags( picoMemStream_t *fp, int cksize, lwTagList *tlist,
561    lwPolygonList *plist );
562
563 /* vmap.c */
564
565 void lwFreeVMap( lwVMap *vmap );
566 lwVMap *lwGetVMap( picoMemStream_t *fp, int cksize, int ptoffset, int poloffset,
567    int perpoly );
568 int lwGetPointVMaps( lwPointList *point, lwVMap *vmap );
569 int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap );
570
571 /* clip.c */
572
573 void lwFreeClip( lwClip *clip );
574 lwClip *lwGetClip( picoMemStream_t *fp, int cksize );
575 lwClip *lwFindClip( lwClip *list, int index );
576
577 /* envelope.c */
578
579 void lwFreeEnvelope( lwEnvelope *env );
580 lwEnvelope *lwGetEnvelope( picoMemStream_t *fp, int cksize );
581 lwEnvelope *lwFindEnvelope( lwEnvelope *list, int index );
582 float lwEvalEnvelope( lwEnvelope *env, float time );
583
584 /* surface.c */
585
586 void lwFreePlugin( lwPlugin *p );
587 void lwFreeTexture( lwTexture *t );
588 void lwFreeSurface( lwSurface *surf );
589 int lwGetTHeader( picoMemStream_t *fp, int hsz, lwTexture *tex );
590 int lwGetTMap( picoMemStream_t *fp, int tmapsz, lwTMap *tmap );
591 int lwGetImageMap( picoMemStream_t *fp, int rsz, lwTexture *tex );
592 int lwGetProcedural( picoMemStream_t *fp, int rsz, lwTexture *tex );
593 int lwGetGradient( picoMemStream_t *fp, int rsz, lwTexture *tex );
594 lwTexture *lwGetTexture( picoMemStream_t *fp, int bloksz, unsigned int type );
595 lwPlugin *lwGetShader( picoMemStream_t *fp, int bloksz );
596 lwSurface *lwGetSurface( picoMemStream_t *fp, int cksize );
597 lwSurface *lwDefaultSurface( void );
598
599 /* lwob.c */
600
601 lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj );
602 int lwGetPolygons5( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );
603 lwObject *lwGetObject5( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
604 int lwValidateObject5( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
605
606 /* list.c */
607
608 void lwListFree( void *list, void ( *freeNode )( void * ));
609 void lwListAdd( void **list, void *node );
610 void lwListInsert( void **vlist, void *vitem,
611    int ( *compare )( void *, void * ));
612
613 /* vecmath.c */
614
615 float dot( float a[], float b[] );
616 void cross( float a[], float b[], float c[] );
617 void normalize( float v[] );
618 #define vecangle( a, b ) ( float ) acos( dot( a, b ))
619
620 /* lwio.c */
621
622 void  set_flen( int i );
623 int   get_flen( void );
624 void *getbytes( picoMemStream_t *fp, int size );
625 void  skipbytes( picoMemStream_t *fp, int n );
626 int   getI1( picoMemStream_t *fp );
627 short getI2( picoMemStream_t *fp );
628 int   getI4( picoMemStream_t *fp );
629 unsigned char  getU1( picoMemStream_t *fp );
630 unsigned short getU2( picoMemStream_t *fp );
631 unsigned int   getU4( picoMemStream_t *fp );
632 int   getVX( picoMemStream_t *fp );
633 float getF4( picoMemStream_t *fp );
634 char *getS0( picoMemStream_t *fp );
635 int   sgetI1( unsigned char **bp );
636 short sgetI2( unsigned char **bp );
637 int   sgetI4( unsigned char **bp );
638 unsigned char  sgetU1( unsigned char **bp );
639 unsigned short sgetU2( unsigned char **bp );
640 unsigned int   sgetU4( unsigned char **bp );
641 int   sgetVX( unsigned char **bp );
642 float sgetF4( unsigned char **bp );
643 char *sgetS0( unsigned char **bp );
644
645 #ifndef __BIG_ENDIAN__
646   void revbytes( void *bp, int elsize, int elcount );
647 #else
648   #define revbytes( b, s, c )
649 #endif
650
651 #endif