]> git.xonotic.org Git - xonotic/netradiant.git/blob - libs/picomodel/pm_fm.h
transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / libs / picomodel / pm_fm.h
1 /* -----------------------------------------------------------------------------\r
2 \r
3 PicoModel Library\r
4 \r
5 Copyright (c) 2002, Randy Reddig & seaw0lf\r
6 All rights reserved.\r
7 \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
10 \r
11 Redistributions of source code must retain the above copyright notice, this list\r
12 of conditions and the following disclaimer.\r
13 \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
17 \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
21 \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
32 \r
33 ----------------------------------------------------------------------------- */\r
34 \r
35 // This header file is based from the following:\r
36 \r
37 /*\r
38         FlexModel.H - Header file for FlexModel file structure\r
39 \r
40         By Chris Burke\r
41         serotonin@earthlink.net\r
42 */\r
43 \r
44 #ifndef __PM_FM_H__\r
45 #define __PM_FM_H__\r
46 \r
47 #include "picointernal.h"\r
48 \r
49 \r
50 //\r
51 //      Absolute limits (from QData / QMView source)\r
52 //\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
59 \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
65 \r
66 #define SKINPAGE_WIDTH 640\r
67 #define SKINPAGE_HEIGHT 480\r
68 \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
73 \r
74 #define SCALE_ADJUST_FACTOR 0.96\r
75 \r
76 #define INFO_HEIGHT 5\r
77 #define INFO_Y (SKINPAGE_HEIGHT-INFO_HEIGHT)\r
78 \r
79 #ifndef byte\r
80         #define byte unsigned char\r
81 #endif\r
82 \r
83 \r
84 //\r
85 //      Generic header on every chunk\r
86 //\r
87 #define FM_MAXCHUNKIDENT        32L\r
88 typedef struct\r
89 {\r
90         char                    ident[FM_MAXCHUNKIDENT];\r
91         unsigned int            version;\r
92         unsigned int            size;\r
93 } fm_chunk_header_t;\r
94 \r
95 //\r
96 //      The format of the "header" chunk\r
97 //\r
98 #define FM_HEADERCHUNKNAME      "header"\r
99 #define FM_HEADERCHUNKVER       2\r
100 #define FM_HEADERCHUNKSIZE      40\r
101 typedef struct\r
102 {\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
113 } fm_header_t;\r
114 \r
115 //\r
116 //      The format of an entry in the "skin" chunk.\r
117 //      The number of entries is given in the fmheader chunk\r
118 //\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
123 typedef struct\r
124 {\r
125         char                            path[FM_SKINPATHSIZE];  //      path, relative to 'base'\r
126 } fm_skinpath_t;\r
127 \r
128 //\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
132 //\r
133 #define FM_STCOORDCHUNKNAME     "st coord"\r
134 #define FM_STCOORDCHUNKVER      1\r
135 #define FM_STCOORDUVSIZE        (2L + 2L)\r
136 \r
137 typedef struct\r
138 {\r
139         short   s;\r
140         short   t;\r
141 } fm_st_t;\r
142 \r
143 //\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
146 //\r
147 #define FM_TRISCHUNKNAME        "tris"\r
148 #define FM_TRISCHUNKVER         1\r
149 #define FM_TRISINFOSIZE         (2L*3 + 2L*3)\r
150 \r
151 typedef struct\r
152 {\r
153         short   index_xyz[3];\r
154         short   index_st[3];\r
155 } fm_xyz_st_t;\r
156 \r
157 \r
158 //\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
162 //\r
163 #define FM_FRAMESCHUNKNAME      "frames"\r
164 #define FM_FRAMESCHUNKVER       1\r
165 \r
166 #define FM_NUMVERTEXNORMALS     162\r
167 \r
168 // Frame info\r
169 typedef struct\r
170 {\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
174 \r
175 typedef struct\r
176 {\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
180 } fm_framehdr_t;\r
181 \r
182 typedef struct\r
183 {\r
184         fm_framehdr_t           header;                         //      One header per frame\r
185         fm_vert_normal_t        verts[1];                       //      variable number of these\r
186 } fm_frame_t;\r
187 \r
188 typedef struct\r
189 {\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
195         fm_st_t                 *fm_st;\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
200 } fm_t;\r
201 \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
365 };\r
366 \r
367 #endif\r