Initial revision
[divverent/darkplaces.git] / model_alias.h
1 /*
2 Copyright (C) 1996-1997 Id Software, Inc.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
12
13 See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
19 */
20
21 /*
22 ==============================================================================
23
24 ALIAS MODELS
25
26 Alias models are position independent, so the cache manager can move them.
27 ==============================================================================
28 */
29
30 #include "modelgen.h"
31
32 typedef struct
33 {
34         int                                     firstpose;
35         int                                     numposes;
36         float                           interval;
37         trivertx_t                      bboxmin;
38         trivertx_t                      bboxmax;
39         int                                     frame;
40         char                            name[16];
41 } maliasframedesc_t;
42
43 typedef struct
44 {
45         trivertx_t                      bboxmin;
46         trivertx_t                      bboxmax;
47         int                                     frame;
48 } maliasgroupframedesc_t;
49
50 typedef struct
51 {
52         int                                             numframes;
53         int                                             intervals;
54         maliasgroupframedesc_t  frames[1];
55 } maliasgroup_t;
56
57 // !!! if this is changed, it must be changed in asm_draw.h too !!!
58 typedef struct mtriangle_s {
59         int                                     facesfront;
60         int                                     vertindex[3];
61 } mtriangle_t;
62
63 // LordHavoc: new vertex format
64 typedef struct {
65         byte v[3]; // location
66         signed char n[3]; // surface normal for lighting *127.0
67 } trivert2;
68
69 #define MAX_SKINS       32
70 typedef struct {
71         int                     ident;
72         int                     version;
73         vec3_t          scale;
74         vec3_t          scale_origin;
75         float           boundingradius;
76         vec3_t          eyeposition;
77         int                     numskins;
78         int                     skinwidth;
79         int                     skinheight;
80         int                     numverts;
81         int                     numtris;
82         int                     numframes;
83         synctype_t      synctype;
84         int                     flags;
85         float           size;
86
87         int                                     numposes;
88         int                                     posedata;       // LordHavoc: numposes*numverts*trivert2
89         int                                     frontfaces; // LordHavoc: how many front faces
90         int                                     backfaces; // LordHavoc: how many back faces
91 //      int                                     poseverts;
92 //      int                                     posedata;       // numposes*poseverts trivert_t
93 //      int                                     commands;       // gl command list with embedded s/t
94         int                                     texcoords;      // LordHavoc: texture coordinates
95         int                                     vertindices;    // LordHavoc: vertex numbers
96         int                                     gl_texturenum[MAX_SKINS][4];
97         int                                     texels[MAX_SKINS];      // only for player skins
98         maliasframedesc_t       frames[1];      // variable sized
99 } aliashdr_t;
100
101 #define MAXALIASVERTS   4096
102 #define MAXALIASFRAMES  1024
103 #define MAXALIASTRIS    4096
104
105 extern  aliashdr_t      *pheader;
106 //extern        stvert_t        stverts[MAXALIASVERTS];
107 //extern        mtriangle_t     triangles[MAXALIASTRIS];
108 //extern        trivertx_t      *poseverts[MAXALIASFRAMES];
109
110 /*
111 ========================================================================
112
113 .MD2 triangle model file format
114
115 ========================================================================
116 */
117
118 // LordHavoc: grabbed this from the Q2 utility source,
119 // renamed a things to avoid conflicts
120
121 #define MD2IDALIASHEADER                (('2'<<24)+('P'<<16)+('D'<<8)+'I')
122 #define MD2ALIAS_VERSION        8
123
124 #define MD2MAX_TRIANGLES        4096
125 #define MD2MAX_VERTS            4096
126 #define MD2MAX_FRAMES           1024
127 #define MD2MAX_SKINS    32
128 #define MD2MAX_SKINNAME 64
129 // sanity checking size
130 #define MD2MAX_SIZE     (16777216)
131
132 typedef struct
133 {
134         short   s;
135         short   t;
136 } md2stvert_t;
137
138 typedef struct 
139 {
140         short   index_xyz[3];
141         short   index_st[3];
142 } md2triangle_t;
143
144 typedef struct
145 {
146         float           scale[3];       // multiply byte verts by this
147         float           translate[3];   // then add this
148         char            name[16];       // frame name from grabbing
149         trivertx_t      verts[];        // variable sized
150 } md2frame_t;
151
152 // LordHavoc: memory representation is different than disk
153 typedef struct
154 {
155         float           scale[3];       // multiply byte verts by this
156         float           translate[3];   // then add this
157         trivert2        verts[];        // variable sized
158 } md2memframe_t;
159
160
161 // the glcmd format:
162 // a positive integer starts a tristrip command, followed by that many
163 // vertex structures.
164 // a negative integer starts a trifan command, followed by -x vertexes
165 // a zero indicates the end of the command list.
166 // a vertex consists of a floating point s, a floating point t,
167 // and an integer vertex index.
168
169
170 typedef struct
171 {
172         int                     ident;
173         int                     version;
174
175         int                     skinwidth;
176         int                     skinheight;
177         int                     framesize;              // byte size of each frame
178
179         int                     num_skins;
180         int                     num_xyz;
181         int                     num_st;                 // greater than num_xyz for seams
182         int                     num_tris;
183         int                     num_glcmds;             // dwords in strip/fan command list
184         int                     num_frames;
185
186         int                     ofs_skins;              // each skin is a MAX_SKINNAME string
187         int                     ofs_st;                 // byte offset from start for stverts
188         int                     ofs_tris;               // offset for dtriangles
189         int                     ofs_frames;             // offset for first frame
190         int                     ofs_glcmds;     
191         int                     ofs_end;                // end of file
192 } md2_t;
193
194 typedef struct
195 {
196         int                     framesize;              // byte size of each frame
197
198         int                     num_skins;
199         int                     num_xyz;
200         int                     num_st;                 // greater than num_xyz for seams
201         int                     num_tris;
202         int                     num_glcmds;             // dwords in strip/fan command list
203         int                     num_frames;
204
205         int                     ofs_tris;               // offset for dtriangles
206         int                     ofs_frames;             // offset for first frame
207         int                     ofs_glcmds;     
208
209         int                     gl_texturenum[MAX_SKINS];
210 } md2mem_t;
211
212 #define ALIASTYPE_MDL 1
213 #define ALIASTYPE_MD2 2