2 Copyright (C) 1996-1997 Id Software, Inc.
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.
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.
13 See the GNU General Public License for more details.
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.
25 ==============================================================================
29 Alias models are position independent, so the cache manager can move them.
30 ==============================================================================
54 ========================================================================
56 .MD2 triangle model file format
58 ========================================================================
61 // LordHavoc: grabbed this from the Q2 utility source,
62 // renamed a things to avoid conflicts
64 #define MD2ALIAS_VERSION 8
65 #define MD2_SKINNAME 64
81 float scale[3]; // multiply byte verts by this
82 float translate[3]; // then add this
83 char name[16]; // frame name from grabbing
87 // a positive integer starts a tristrip command, followed by that many
89 // a negative integer starts a trifan command, followed by -x vertexes
90 // a zero indicates the end of the command list.
91 // a vertex consists of a floating point s, a floating point t,
92 // and an integer vertex index.
102 int framesize; // byte size of each frame
106 int num_st; // greater than num_xyz for seams
108 int num_glcmds; // dwords in strip/fan command list
111 int ofs_skins; // each skin is a MAX_SKINNAME string
112 int ofs_st; // byte offset from start for stverts
113 int ofs_tris; // offset for dtriangles
114 int ofs_frames; // offset for first frame
116 int ofs_end; // end of file
119 extern void Mod_IDP0_Load(struct model_s *mod, void *buffer);
120 extern void Mod_IDP2_Load(struct model_s *mod, void *buffer);
121 extern void Mod_IDP3_Load(struct model_s *mod, void *buffer);
123 extern void Mod_AliasInit(void);
125 #include "model_zymotic.h"
127 // all md3 ints, floats, and shorts, are little endian, and thus need to be
128 // passed through LittleLong/LittleFloat/LittleShort to avoid breaking on
129 // bigendian machines (Macs for example)
130 #define MD3VERSION 15
132 #define MD3FRAMENAME 16
134 // the origin is at 1/64th scale
135 // the pitch and yaw are encoded as 8 bits each
136 typedef struct md3vertex_s
138 short origin[3], normalpitchyaw;
143 typedef struct md3frameinfo_s
149 char name[MD3FRAMENAME];
153 // one per tag per frame
154 typedef struct md3tag_s
158 float rotationmatrix[9];
162 // one per shader per mesh
163 typedef struct md3shader_s
166 // engine field (yes this empty int does exist in the file)
171 // one per mesh per model
173 // note that the lump_ offsets in this struct are relative to the beginning
174 // of the mesh struct
176 // to find the next mesh in the file, you must go to lump_end, which puts you
177 // at the beginning of the next mesh
178 typedef struct md3mesh_s
180 char identifier[4]; // "IDP3"
190 int lump_framevertices;
195 // this struct is at the beginning of the md3 file
197 // note that the lump_ offsets in this struct are relative to the beginning
198 // of the header struct (which is the beginning of the file)
199 typedef struct md3modelheader_s
201 char identifier[4]; // "IDP3"
216 // this layer is fog (completely specialized behavior, automatic NODRAW_IF_NOTFOGGED behavior)
217 #define ALIASLAYER_FOG 1
218 // apply diffuse lighting
219 #define ALIASLAYER_DIFFUSE 8
220 // apply specular lighting
221 #define ALIASLAYER_SPECULAR 16
222 // tint with pants color
223 #define ALIASLAYER_COLORMAP_PANTS 32
224 // tint with shirt color
225 #define ALIASLAYER_COLORMAP_SHIRT 64
226 // don't draw this layer if colormap is not used
227 #define ALIASLAYER_NODRAW_IF_NOTCOLORMAPPED 128
228 // don't draw this layer if colormap is used
229 #define ALIASLAYER_NODRAW_IF_COLORMAPPED 256
230 // ignore NODRAW flags on this layer only if all previous layers were skipped
231 #define ALIASLAYER_FORCEDRAW_IF_FIRSTPASS 512
233 typedef struct aliaslayer_s
241 // indicates this skin is transparent
242 #define ALIASSKIN_TRANSPARENT 1
244 typedef struct aliasskin_s
248 aliaslayer_t *data_layers;
252 typedef struct aliasvertexboneweight_s
254 unsigned int vertexindex;
255 unsigned int boneindex;
259 aliasvertexboneweight_t;
261 typedef struct aliasmesh_s
263 // skins to choose from (indexed by entity skin)
265 aliasskin_t *data_skins;
267 // triangles comprising the mesh
270 int *data_neighbor3i;
272 // skin texcoords do not change
274 float *data_texcoord2f;
276 // morph blending, these are zero if model is skeletal
278 float *data_morphvertex3f;
280 // base frame (frame zero typically)
281 // since most models do not animate, caching the base frame helps
282 float *data_basevertex3f;
283 float *data_basesvector3f;
284 float *data_basetvector3f;
285 float *data_basenormal3f;
287 // skeletal blending, these are zero if model is morph
288 int num_vertexboneweights;
289 aliasvertexboneweight_t *data_vertexboneweights;
293 typedef struct aliastag_s
300 typedef struct aliasbone_s
304 int parent; // -1 for no parent
309 void Mod_Alias_GetMesh_Vertex3f(const struct model_s *model, const struct frameblend_s *frameblend, const struct aliasmesh_s *mesh, float *out3f);