1 /* -----------------------------------------------------------------------------
\r
5 Copyright (c) 2002, Randy Reddig & seaw0lf
\r
8 Redistribution and use in source and binary forms, with or without modification,
\r
9 are permitted provided that the following conditions are met:
\r
11 Redistributions of source code must retain the above copyright notice, this list
\r
12 of conditions and the following disclaimer.
\r
14 Redistributions in binary form must reproduce the above copyright notice, this
\r
15 list of conditions and the following disclaimer in the documentation and/or
\r
16 other materials provided with the distribution.
\r
18 Neither the names of the copyright holders nor the names of its contributors may
\r
19 be used to endorse or promote products derived from this software without
\r
20 specific prior written permission.
\r
22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
\r
23 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
\r
24 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
\r
25 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
\r
26 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
\r
27 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
\r
28 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
\r
29 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
30 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
\r
31 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
33 ----------------------------------------------------------------------------- */
\r
35 // This header file is based from the following:
\r
38 FlexModel.H - Header file for FlexModel file structure
\r
41 serotonin@earthlink.net
\r
47 #include "picointernal.h"
\r
51 // Absolute limits (from QData / QMView source)
\r
53 #define MAX_FM_TRIANGLES 2048
\r
54 #define MAX_FM_VERTS 2048
\r
55 #define MAX_FM_FRAMES 2048
\r
56 #define MAX_FM_SKINS 64
\r
57 #define MAX_FM_SKINNAME 64
\r
58 #define MAX_FM_MESH_NODES 16
\r
60 #define DTRIVERTX_V0 0
\r
61 #define DTRIVERTX_V1 1
\r
62 #define DTRIVERTX_V2 2
\r
63 #define DTRIVERTX_LNI 3
\r
64 #define DTRIVERTX_SIZE 4
\r
66 #define SKINPAGE_WIDTH 640
\r
67 #define SKINPAGE_HEIGHT 480
\r
69 #define ENCODED_WIDTH_X 92
\r
70 #define ENCODED_WIDTH_Y 475
\r
71 #define ENCODED_HEIGHT_X 128
\r
72 #define ENCODED_HEIGHT_Y 475
\r
74 #define SCALE_ADJUST_FACTOR 0.96
\r
76 #define INFO_HEIGHT 5
\r
77 #define INFO_Y (SKINPAGE_HEIGHT-INFO_HEIGHT)
\r
80 #define byte unsigned char
\r
85 // Generic header on every chunk
\r
87 #define FM_MAXCHUNKIDENT 32L
\r
90 char ident[FM_MAXCHUNKIDENT];
\r
91 unsigned int version;
\r
93 } fm_chunk_header_t;
\r
96 // The format of the "header" chunk
\r
98 #define FM_HEADERCHUNKNAME "header"
\r
99 #define FM_HEADERCHUNKVER 2
\r
100 #define FM_HEADERCHUNKSIZE 40
\r
103 int skinWidth; // in pixels
\r
104 int skinHeight; // in pixels
\r
105 int frameSize; // size of each frame (in bytes)
\r
106 int numSkins; // number of skins
\r
107 int numXYZ; // number of unique vertices in 3D space
\r
108 int numST; // number of unique vertices in texture space
\r
109 int numTris; // number of unique triangles
\r
110 int numGLCmds; // # 32-bit elements in strip/fan command list
\r
111 int numFrames; // number of animation frames
\r
112 int numMeshNodes; // number of mesh nodes
\r
116 // The format of an entry in the "skin" chunk.
\r
117 // The number of entries is given in the fmheader chunk
\r
119 #define FM_SKINCHUNKNAME "skin"
\r
120 #define FM_SKINCHUNKVER 1
\r
121 #define FM_MAXPATHLENGTH 64L
\r
122 #define FM_SKINPATHSIZE (FM_MAXPATHLENGTH)
\r
125 char path[FM_SKINPATHSIZE]; // path, relative to 'base'
\r
129 // The format of the "st coord" chunk. This is a list
\r
130 // of unique skin texture (u, v) coordinates to be mapped
\r
131 // to verteces of the model
\r
133 #define FM_STCOORDCHUNKNAME "st coord"
\r
134 #define FM_STCOORDCHUNKVER 1
\r
135 #define FM_STCOORDUVSIZE (2L + 2L)
\r
144 // The format of the "tris" chunk. This is a list of vertex indeces
\r
145 // in 3D space, and the corresponding vertex indeces in texture space.
\r
147 #define FM_TRISCHUNKNAME "tris"
\r
148 #define FM_TRISCHUNKVER 1
\r
149 #define FM_TRISINFOSIZE (2L*3 + 2L*3)
\r
153 short index_xyz[3];
\r
159 // The format of the "frames" chunk. This is a list of animation
\r
160 // frames, each specifying the coordinates and "light normal" index
\r
161 // of every vertex of the model in 3D space.
\r
163 #define FM_FRAMESCHUNKNAME "frames"
\r
164 #define FM_FRAMESCHUNKVER 1
\r
166 #define FM_NUMVERTEXNORMALS 162
\r
171 byte v[3]; // scaled by header info
\r
172 byte lightnormalindex; // index in canned table of closest vertex normal
\r
173 } fm_vert_normal_t;
\r
177 float scale[3]; // multiply byte verts by this
\r
178 float translate[3]; // then add this
\r
179 char name[16]; // frame name
\r
184 fm_framehdr_t header; // One header per frame
\r
185 fm_vert_normal_t verts[1]; // variable number of these
\r
190 fm_chunk_header_t *fm_header_hdr;
\r
191 fm_header_t *fm_header;
\r
192 fm_chunk_header_t *fm_skin_hdr;
\r
193 fm_skinpath_t *fm_skin;
\r
194 fm_chunk_header_t *fm_st_hdr;
\r
196 fm_chunk_header_t *fm_tri_hdr;
\r
197 fm_xyz_st_t *fm_tri;
\r
198 fm_chunk_header_t *fm_frame_hdr;
\r
199 fm_frame_t *fm_frame;
\r
202 float fm_normals[FM_NUMVERTEXNORMALS][3] = {
\r
203 {-0.525731f, 0.000000f, 0.850651f},
\r
204 {-0.442863f, 0.238856f, 0.864188f},
\r
205 {-0.295242f, 0.000000f, 0.955423f},
\r
206 {-0.309017f, 0.500000f, 0.809017f},
\r
207 {-0.162460f, 0.262866f, 0.951056f},
\r
208 {0.000000f, 0.000000f, 1.000000f},
\r
209 {0.000000f, 0.850651f, 0.525731f},
\r
210 {-0.147621f, 0.716567f, 0.681718f},
\r
211 {0.147621f, 0.716567f, 0.681718f},
\r
212 {0.000000f, 0.525731f, 0.850651f},
\r
213 {0.309017f, 0.500000f, 0.809017f},
\r
214 {0.525731f, 0.000000f, 0.850651f},
\r
215 {0.295242f, 0.000000f, 0.955423f},
\r
216 {0.442863f, 0.238856f, 0.864188f},
\r
217 {0.162460f, 0.262866f, 0.951056f},
\r
218 {-0.681718f, 0.147621f, 0.716567f},
\r
219 {-0.809017f, 0.309017f, 0.500000f},
\r
220 {-0.587785f, 0.425325f, 0.688191f},
\r
221 {-0.850651f, 0.525731f, 0.000000f},
\r
222 {-0.864188f, 0.442863f, 0.238856f},
\r
223 {-0.716567f, 0.681718f, 0.147621f},
\r
224 {-0.688191f, 0.587785f, 0.425325f},
\r
225 {-0.500000f, 0.809017f, 0.309017f},
\r
226 {-0.238856f, 0.864188f, 0.442863f},
\r
227 {-0.425325f, 0.688191f, 0.587785f},
\r
228 {-0.716567f, 0.681718f, -0.147621f},
\r
229 {-0.500000f, 0.809017f, -0.309017f},
\r
230 {-0.525731f, 0.850651f, 0.000000f},
\r
231 {0.000000f, 0.850651f, -0.525731f},
\r
232 {-0.238856f, 0.864188f, -0.442863f},
\r
233 {0.000000f, 0.955423f, -0.295242f},
\r
234 {-0.262866f, 0.951056f, -0.162460f},
\r
235 {0.000000f, 1.000000f, 0.000000f},
\r
236 {0.000000f, 0.955423f, 0.295242f},
\r
237 {-0.262866f, 0.951056f, 0.162460f},
\r
238 {0.238856f, 0.864188f, 0.442863f},
\r
239 {0.262866f, 0.951056f, 0.162460f},
\r
240 {0.500000f, 0.809017f, 0.309017f},
\r
241 {0.238856f, 0.864188f, -0.442863f},
\r
242 {0.262866f, 0.951056f, -0.162460f},
\r
243 {0.500000f, 0.809017f, -0.309017f},
\r
244 {0.850651f, 0.525731f, 0.000000f},
\r
245 {0.716567f, 0.681718f, 0.147621f},
\r
246 {0.716567f, 0.681718f, -0.147621f},
\r
247 {0.525731f, 0.850651f, 0.000000f},
\r
248 {0.425325f, 0.688191f, 0.587785f},
\r
249 {0.864188f, 0.442863f, 0.238856f},
\r
250 {0.688191f, 0.587785f, 0.425325f},
\r
251 {0.809017f, 0.309017f, 0.500000f},
\r
252 {0.681718f, 0.147621f, 0.716567f},
\r
253 {0.587785f, 0.425325f, 0.688191f},
\r
254 {0.955423f, 0.295242f, 0.000000f},
\r
255 {1.000000f, 0.000000f, 0.000000f},
\r
256 {0.951056f, 0.162460f, 0.262866f},
\r
257 {0.850651f, -0.525731f, 0.000000f},
\r
258 {0.955423f, -0.295242f, 0.000000f},
\r
259 {0.864188f, -0.442863f, 0.238856f},
\r
260 {0.951056f, -0.162460f, 0.262866f},
\r
261 {0.809017f, -0.309017f, 0.500000f},
\r
262 {0.681718f, -0.147621f, 0.716567f},
\r
263 {0.850651f, 0.000000f, 0.525731f},
\r
264 {0.864188f, 0.442863f, -0.238856f},
\r
265 {0.809017f, 0.309017f, -0.500000f},
\r
266 {0.951056f, 0.162460f, -0.262866f},
\r
267 {0.525731f, 0.000000f, -0.850651f},
\r
268 {0.681718f, 0.147621f, -0.716567f},
\r
269 {0.681718f, -0.147621f, -0.716567f},
\r
270 {0.850651f, 0.000000f, -0.525731f},
\r
271 {0.809017f, -0.309017f, -0.500000f},
\r
272 {0.864188f, -0.442863f, -0.238856f},
\r
273 {0.951056f, -0.162460f, -0.262866f},
\r
274 {0.147621f, 0.716567f, -0.681718f},
\r
275 {0.309017f, 0.500000f, -0.809017f},
\r
276 {0.425325f, 0.688191f, -0.587785f},
\r
277 {0.442863f, 0.238856f, -0.864188f},
\r
278 {0.587785f, 0.425325f, -0.688191f},
\r
279 {0.688191f, 0.587785f, -0.425325f},
\r
280 {-0.147621f, 0.716567f, -0.681718f},
\r
281 {-0.309017f, 0.500000f, -0.809017f},
\r
282 {0.000000f, 0.525731f, -0.850651f},
\r
283 {-0.525731f, 0.000000f, -0.850651f},
\r
284 {-0.442863f, 0.238856f, -0.864188f},
\r
285 {-0.295242f, 0.000000f, -0.955423f},
\r
286 {-0.162460f, 0.262866f, -0.951056f},
\r
287 {0.000000f, 0.000000f, -1.000000f},
\r
288 {0.295242f, 0.000000f, -0.955423f},
\r
289 {0.162460f, 0.262866f, -0.951056f},
\r
290 {-0.442863f, -0.238856f, -0.864188f},
\r
291 {-0.309017f, -0.500000f, -0.809017f},
\r
292 {-0.162460f, -0.262866f, -0.951056f},
\r
293 {0.000000f, -0.850651f, -0.525731f},
\r
294 {-0.147621f, -0.716567f, -0.681718f},
\r
295 {0.147621f, -0.716567f, -0.681718f},
\r
296 {0.000000f, -0.525731f, -0.850651f},
\r
297 {0.309017f, -0.500000f, -0.809017f},
\r
298 {0.442863f, -0.238856f, -0.864188f},
\r
299 {0.162460f, -0.262866f, -0.951056f},
\r
300 {0.238856f, -0.864188f, -0.442863f},
\r
301 {0.500000f, -0.809017f, -0.309017f},
\r
302 {0.425325f, -0.688191f, -0.587785f},
\r
303 {0.716567f, -0.681718f, -0.147621f},
\r
304 {0.688191f, -0.587785f, -0.425325f},
\r
305 {0.587785f, -0.425325f, -0.688191f},
\r
306 {0.000000f, -0.955423f, -0.295242f},
\r
307 {0.000000f, -1.000000f, 0.000000f},
\r
308 {0.262866f, -0.951056f, -0.162460f},
\r
309 {0.000000f, -0.850651f, 0.525731f},
\r
310 {0.000000f, -0.955423f, 0.295242f},
\r
311 {0.238856f, -0.864188f, 0.442863f},
\r
312 {0.262866f, -0.951056f, 0.162460f},
\r
313 {0.500000f, -0.809017f, 0.309017f},
\r
314 {0.716567f, -0.681718f, 0.147621f},
\r
315 {0.525731f, -0.850651f, 0.000000f},
\r
316 {-0.238856f, -0.864188f, -0.442863f},
\r
317 {-0.500000f, -0.809017f, -0.309017f},
\r
318 {-0.262866f, -0.951056f, -0.162460f},
\r
319 {-0.850651f, -0.525731f, 0.000000f},
\r
320 {-0.716567f, -0.681718f, -0.147621f},
\r
321 {-0.716567f, -0.681718f, 0.147621f},
\r
322 {-0.525731f, -0.850651f, 0.000000f},
\r
323 {-0.500000f, -0.809017f, 0.309017f},
\r
324 {-0.238856f, -0.864188f, 0.442863f},
\r
325 {-0.262866f, -0.951056f, 0.162460f},
\r
326 {-0.864188f, -0.442863f, 0.238856f},
\r
327 {-0.809017f, -0.309017f, 0.500000f},
\r
328 {-0.688191f, -0.587785f, 0.425325f},
\r
329 {-0.681718f, -0.147621f, 0.716567f},
\r
330 {-0.442863f, -0.238856f, 0.864188f},
\r
331 {-0.587785f, -0.425325f, 0.688191f},
\r
332 {-0.309017f, -0.500000f, 0.809017f},
\r
333 {-0.147621f, -0.716567f, 0.681718f},
\r
334 {-0.425325f, -0.688191f, 0.587785f},
\r
335 {-0.162460f, -0.262866f, 0.951056f},
\r
336 {0.442863f, -0.238856f, 0.864188f},
\r
337 {0.162460f, -0.262866f, 0.951056f},
\r
338 {0.309017f, -0.500000f, 0.809017f},
\r
339 {0.147621f, -0.716567f, 0.681718f},
\r
340 {0.000000f, -0.525731f, 0.850651f},
\r
341 {0.425325f, -0.688191f, 0.587785f},
\r
342 {0.587785f, -0.425325f, 0.688191f},
\r
343 {0.688191f, -0.587785f, 0.425325f},
\r
344 {-0.955423f, 0.295242f, 0.000000f},
\r
345 {-0.951056f, 0.162460f, 0.262866f},
\r
346 {-1.000000f, 0.000000f, 0.000000f},
\r
347 {-0.850651f, 0.000000f, 0.525731f},
\r
348 {-0.955423f, -0.295242f, 0.000000f},
\r
349 {-0.951056f, -0.162460f, 0.262866f},
\r
350 {-0.864188f, 0.442863f, -0.238856f},
\r
351 {-0.951056f, 0.162460f, -0.262866f},
\r
352 {-0.809017f, 0.309017f, -0.500000f},
\r
353 {-0.864188f, -0.442863f, -0.238856f},
\r
354 {-0.951056f, -0.162460f, -0.262866f},
\r
355 {-0.809017f, -0.309017f, -0.500000f},
\r
356 {-0.681718f, 0.147621f, -0.716567f},
\r
357 {-0.681718f, -0.147621f, -0.716567f},
\r
358 {-0.850651f, 0.000000f, -0.525731f},
\r
359 {-0.688191f, 0.587785f, -0.425325f},
\r
360 {-0.587785f, 0.425325f, -0.688191f},
\r
361 {-0.425325f, 0.688191f, -0.587785f},
\r
362 {-0.425325f, -0.688191f, -0.587785f},
\r
363 {-0.587785f, -0.425325f, -0.688191f},
\r
364 {-0.688191f, -0.587785f, -0.425325f},
\r