]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/picomodel/pm_fm.h
merge branch work back into trunk
[xonotic/netradiant.git] / libs / picomodel / pm_fm.h
index ce43d334d775902e476773f8cfffc51278e281a3..3fd5148e82d40626389a64cef0be46e4e5adda5d 100644 (file)
-/* -----------------------------------------------------------------------------\r
-\r
-PicoModel Library\r
-\r
-Copyright (c) 2002, Randy Reddig & seaw0lf\r
-All rights reserved.\r
-\r
-Redistribution and use in source and binary forms, with or without modification,\r
-are permitted provided that the following conditions are met:\r
-\r
-Redistributions of source code must retain the above copyright notice, this list\r
-of conditions and the following disclaimer.\r
-\r
-Redistributions in binary form must reproduce the above copyright notice, this\r
-list of conditions and the following disclaimer in the documentation and/or\r
-other materials provided with the distribution.\r
-\r
-Neither the names of the copyright holders nor the names of its contributors may\r
-be used to endorse or promote products derived from this software without\r
-specific prior written permission.\r
-\r
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\r
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
------------------------------------------------------------------------------ */\r
-\r
-// This header file is based from the following:\r
-\r
-/*\r
-       FlexModel.H - Header file for FlexModel file structure\r
-\r
-       By Chris Burke\r
-       serotonin@earthlink.net\r
-*/\r
-\r
-#ifndef        __PM_FM_H__\r
-#define        __PM_FM_H__\r
-\r
-#include "picointernal.h"\r
-\r
-\r
-//\r
-//     Absolute limits (from QData / QMView source)\r
-//\r
-#define        MAX_FM_TRIANGLES        2048\r
-#define MAX_FM_VERTS           2048\r
-#define MAX_FM_FRAMES          2048\r
-#define MAX_FM_SKINS           64\r
-#define        MAX_FM_SKINNAME         64\r
-#define MAX_FM_MESH_NODES      16\r
-\r
-#define DTRIVERTX_V0   0\r
-#define DTRIVERTX_V1   1\r
-#define DTRIVERTX_V2   2\r
-#define DTRIVERTX_LNI  3\r
-#define DTRIVERTX_SIZE 4\r
-\r
-#define SKINPAGE_WIDTH 640\r
-#define SKINPAGE_HEIGHT 480\r
-\r
-#define ENCODED_WIDTH_X 92\r
-#define ENCODED_WIDTH_Y 475\r
-#define ENCODED_HEIGHT_X 128\r
-#define ENCODED_HEIGHT_Y 475\r
-\r
-#define SCALE_ADJUST_FACTOR 0.96\r
-\r
-#define INFO_HEIGHT 5\r
-#define INFO_Y (SKINPAGE_HEIGHT-INFO_HEIGHT)\r
-\r
-#ifndef byte\r
-       #define byte unsigned char\r
-#endif\r
-\r
-\r
-//\r
-//     Generic header on every chunk\r
-//\r
-#define        FM_MAXCHUNKIDENT        32L\r
-typedef struct\r
-{\r
-       char                    ident[FM_MAXCHUNKIDENT];\r
-       unsigned int            version;\r
-       unsigned int            size;\r
-} fm_chunk_header_t;\r
-\r
-//\r
-//     The format of the "header" chunk\r
-//\r
-#define        FM_HEADERCHUNKNAME      "header"\r
-#define        FM_HEADERCHUNKVER       2\r
-#define        FM_HEADERCHUNKSIZE      40\r
-typedef struct\r
-{\r
-       int                     skinWidth;              // in pixels\r
-       int                     skinHeight;             // in pixels\r
-       int                     frameSize;              // size of each frame (in bytes)\r
-       int                     numSkins;               // number of skins\r
-       int                     numXYZ;                 // number of unique vertices in 3D space\r
-       int                     numST;                  // number of unique vertices in texture space\r
-       int                     numTris;                // number of unique triangles\r
-       int                     numGLCmds;              // # 32-bit elements in strip/fan command list\r
-       int                     numFrames;              // number of animation frames\r
-       int                     numMeshNodes;           // number of mesh nodes\r
-} fm_header_t;\r
-\r
-//\r
-//     The format of an entry in the "skin" chunk.\r
-//     The number of entries is given in the fmheader chunk\r
-//\r
-#define        FM_SKINCHUNKNAME        "skin"\r
-#define        FM_SKINCHUNKVER         1\r
-#define        FM_MAXPATHLENGTH        64L\r
-#define        FM_SKINPATHSIZE (FM_MAXPATHLENGTH)\r
-typedef struct\r
-{\r
-       char                            path[FM_SKINPATHSIZE];  //      path, relative to 'base'\r
-} fm_skinpath_t;\r
-\r
-//\r
-//     The format of the "st coord" chunk. This is a list\r
-//     of unique skin texture (u, v) coordinates to be mapped\r
-//     to verteces of the model\r
-//\r
-#define FM_STCOORDCHUNKNAME    "st coord"\r
-#define FM_STCOORDCHUNKVER     1\r
-#define        FM_STCOORDUVSIZE        (2L + 2L)\r
-\r
-typedef struct\r
-{\r
-       short   s;\r
-       short   t;\r
-} fm_st_t;\r
-\r
-//\r
-//     The format of the "tris" chunk. This is a list of vertex indeces\r
-//     in 3D space, and the corresponding vertex indeces in texture space.\r
-//\r
-#define FM_TRISCHUNKNAME       "tris"\r
-#define FM_TRISCHUNKVER                1\r
-#define        FM_TRISINFOSIZE         (2L*3 + 2L*3)\r
-\r
-typedef struct\r
-{\r
-       short   index_xyz[3];\r
-       short   index_st[3];\r
-} fm_xyz_st_t;\r
-\r
-\r
-//\r
-//     The format of the "frames" chunk. This is a list of animation\r
-//     frames, each specifying the coordinates and "light normal" index\r
-//     of every vertex of the model in 3D space.\r
-//\r
-#define FM_FRAMESCHUNKNAME     "frames"\r
-#define FM_FRAMESCHUNKVER      1\r
-\r
-#define FM_NUMVERTEXNORMALS    162\r
-\r
-// Frame info\r
-typedef struct\r
-{\r
-       byte                    v[3];                           //      scaled by header info\r
-       byte                    lightnormalindex;       //      index in canned table of closest vertex normal\r
-} fm_vert_normal_t;\r
-\r
-typedef struct\r
-{\r
-       float                   scale[3];                       //      multiply byte verts by this\r
-       float                   translate[3];           //      then add this\r
-       char                    name[16];                       //      frame name\r
-} fm_framehdr_t;\r
-\r
-typedef struct\r
-{\r
-       fm_framehdr_t           header;                         //      One header per frame\r
-       fm_vert_normal_t        verts[1];                       //      variable number of these\r
-} fm_frame_t;\r
-\r
-typedef struct\r
-{\r
-       fm_chunk_header_t       *fm_header_hdr;\r
-       fm_header_t             *fm_header;\r
-       fm_chunk_header_t       *fm_skin_hdr;\r
-       fm_skinpath_t           *fm_skin;\r
-       fm_chunk_header_t       *fm_st_hdr;\r
-       fm_st_t                 *fm_st;\r
-       fm_chunk_header_t       *fm_tri_hdr;\r
-       fm_xyz_st_t             *fm_tri;\r
-       fm_chunk_header_t       *fm_frame_hdr;\r
-       fm_frame_t              *fm_frame;\r
-} fm_t;\r
-\r
-float  fm_normals[FM_NUMVERTEXNORMALS][3] = {\r
-  {-0.525731f, 0.000000f, 0.850651f},\r
-  {-0.442863f, 0.238856f, 0.864188f},\r
-  {-0.295242f, 0.000000f, 0.955423f},\r
-  {-0.309017f, 0.500000f, 0.809017f},\r
-  {-0.162460f, 0.262866f, 0.951056f},\r
-  {0.000000f, 0.000000f, 1.000000f},\r
-  {0.000000f, 0.850651f, 0.525731f},\r
-  {-0.147621f, 0.716567f, 0.681718f},\r
-  {0.147621f, 0.716567f, 0.681718f},\r
-  {0.000000f, 0.525731f, 0.850651f},\r
-  {0.309017f, 0.500000f, 0.809017f},\r
-  {0.525731f, 0.000000f, 0.850651f},\r
-  {0.295242f, 0.000000f, 0.955423f},\r
-  {0.442863f, 0.238856f, 0.864188f},\r
-  {0.162460f, 0.262866f, 0.951056f},\r
-  {-0.681718f, 0.147621f, 0.716567f},\r
-  {-0.809017f, 0.309017f, 0.500000f},\r
-  {-0.587785f, 0.425325f, 0.688191f},\r
-  {-0.850651f, 0.525731f, 0.000000f},\r
-  {-0.864188f, 0.442863f, 0.238856f},\r
-  {-0.716567f, 0.681718f, 0.147621f},\r
-  {-0.688191f, 0.587785f, 0.425325f},\r
-  {-0.500000f, 0.809017f, 0.309017f},\r
-  {-0.238856f, 0.864188f, 0.442863f},\r
-  {-0.425325f, 0.688191f, 0.587785f},\r
-  {-0.716567f, 0.681718f, -0.147621f},\r
-  {-0.500000f, 0.809017f, -0.309017f},\r
-  {-0.525731f, 0.850651f, 0.000000f},\r
-  {0.000000f, 0.850651f, -0.525731f},\r
-  {-0.238856f, 0.864188f, -0.442863f},\r
-  {0.000000f, 0.955423f, -0.295242f},\r
-  {-0.262866f, 0.951056f, -0.162460f},\r
-  {0.000000f, 1.000000f, 0.000000f}, \r
-  {0.000000f, 0.955423f, 0.295242f},\r
-  {-0.262866f, 0.951056f, 0.162460f},\r
-  {0.238856f, 0.864188f, 0.442863f},\r
-  {0.262866f, 0.951056f, 0.162460f}, \r
-  {0.500000f, 0.809017f, 0.309017f},\r
-  {0.238856f, 0.864188f, -0.442863f},\r
-  {0.262866f, 0.951056f, -0.162460f},\r
-  {0.500000f, 0.809017f, -0.309017f},\r
-  {0.850651f, 0.525731f, 0.000000f},\r
-  {0.716567f, 0.681718f, 0.147621f},\r
-  {0.716567f, 0.681718f, -0.147621f},\r
-  {0.525731f, 0.850651f, 0.000000f}, \r
-  {0.425325f, 0.688191f, 0.587785f},\r
-  {0.864188f, 0.442863f, 0.238856f}, \r
-  {0.688191f, 0.587785f, 0.425325f},\r
-  {0.809017f, 0.309017f, 0.500000f}, \r
-  {0.681718f, 0.147621f, 0.716567f},\r
-  {0.587785f, 0.425325f, 0.688191f}, \r
-  {0.955423f, 0.295242f, 0.000000f},\r
-  {1.000000f, 0.000000f, 0.000000f}, \r
-  {0.951056f, 0.162460f, 0.262866f},\r
-  {0.850651f, -0.525731f, 0.000000f}, \r
-  {0.955423f, -0.295242f, 0.000000f},\r
-  {0.864188f, -0.442863f, 0.238856f}, \r
-  {0.951056f, -0.162460f, 0.262866f},\r
-  {0.809017f, -0.309017f, 0.500000f}, \r
-  {0.681718f, -0.147621f, 0.716567f},\r
-  {0.850651f, 0.000000f, 0.525731f},\r
-  {0.864188f, 0.442863f, -0.238856f}, \r
-  {0.809017f, 0.309017f, -0.500000f},\r
-  {0.951056f, 0.162460f, -0.262866f}, \r
-  {0.525731f, 0.000000f, -0.850651f},\r
-  {0.681718f, 0.147621f, -0.716567f},\r
-  {0.681718f, -0.147621f, -0.716567f}, \r
-  {0.850651f, 0.000000f, -0.525731f},\r
-  {0.809017f, -0.309017f, -0.500000f}, \r
-  {0.864188f, -0.442863f, -0.238856f},\r
-  {0.951056f, -0.162460f, -0.262866f}, \r
-  {0.147621f, 0.716567f, -0.681718f},\r
-  {0.309017f, 0.500000f, -0.809017f}, \r
-  {0.425325f, 0.688191f, -0.587785f},\r
-  {0.442863f, 0.238856f, -0.864188f}, \r
-  {0.587785f, 0.425325f, -0.688191f},\r
-  {0.688191f, 0.587785f, -0.425325f}, \r
-  {-0.147621f, 0.716567f, -0.681718f},\r
-  {-0.309017f, 0.500000f, -0.809017f}, \r
-  {0.000000f, 0.525731f, -0.850651f},\r
-  {-0.525731f, 0.000000f, -0.850651f}, \r
-  {-0.442863f, 0.238856f, -0.864188f},\r
-  {-0.295242f, 0.000000f, -0.955423f}, \r
-  {-0.162460f, 0.262866f, -0.951056f},\r
-  {0.000000f, 0.000000f, -1.000000f}, \r
-  {0.295242f, 0.000000f, -0.955423f},\r
-  {0.162460f, 0.262866f, -0.951056f}, \r
-  {-0.442863f, -0.238856f, -0.864188f},\r
-  {-0.309017f, -0.500000f, -0.809017f}, \r
-  {-0.162460f, -0.262866f, -0.951056f},\r
-  {0.000000f, -0.850651f, -0.525731f}, \r
-  {-0.147621f, -0.716567f, -0.681718f},\r
-  {0.147621f, -0.716567f, -0.681718f}, \r
-  {0.000000f, -0.525731f, -0.850651f},\r
-  {0.309017f, -0.500000f, -0.809017f}, \r
-  {0.442863f, -0.238856f, -0.864188f},\r
-  {0.162460f, -0.262866f, -0.951056f}, \r
-  {0.238856f, -0.864188f, -0.442863f},\r
-  {0.500000f, -0.809017f, -0.309017f}, \r
-  {0.425325f, -0.688191f, -0.587785f},\r
-  {0.716567f, -0.681718f, -0.147621f}, \r
-  {0.688191f, -0.587785f, -0.425325f},\r
-  {0.587785f, -0.425325f, -0.688191f}, \r
-  {0.000000f, -0.955423f, -0.295242f},\r
-  {0.000000f, -1.000000f, 0.000000f}, \r
-  {0.262866f, -0.951056f, -0.162460f},\r
-  {0.000000f, -0.850651f, 0.525731f}, \r
-  {0.000000f, -0.955423f, 0.295242f},\r
-  {0.238856f, -0.864188f, 0.442863f}, \r
-  {0.262866f, -0.951056f, 0.162460f},\r
-  {0.500000f, -0.809017f, 0.309017f}, \r
-  {0.716567f, -0.681718f, 0.147621f},\r
-  {0.525731f, -0.850651f, 0.000000f}, \r
-  {-0.238856f, -0.864188f, -0.442863f},\r
-  {-0.500000f, -0.809017f, -0.309017f}, \r
-  {-0.262866f, -0.951056f, -0.162460f},\r
-  {-0.850651f, -0.525731f, 0.000000f}, \r
-  {-0.716567f, -0.681718f, -0.147621f},\r
-  {-0.716567f, -0.681718f, 0.147621f}, \r
-  {-0.525731f, -0.850651f, 0.000000f},\r
-  {-0.500000f, -0.809017f, 0.309017f}, \r
-  {-0.238856f, -0.864188f, 0.442863f},\r
-  {-0.262866f, -0.951056f, 0.162460f}, \r
-  {-0.864188f, -0.442863f, 0.238856f},\r
-  {-0.809017f, -0.309017f, 0.500000f}, \r
-  {-0.688191f, -0.587785f, 0.425325f},\r
-  {-0.681718f, -0.147621f, 0.716567f}, \r
-  {-0.442863f, -0.238856f, 0.864188f},\r
-  {-0.587785f, -0.425325f, 0.688191f}, \r
-  {-0.309017f, -0.500000f, 0.809017f},\r
-  {-0.147621f, -0.716567f, 0.681718f}, \r
-  {-0.425325f, -0.688191f, 0.587785f},\r
-  {-0.162460f, -0.262866f, 0.951056f}, \r
-  {0.442863f, -0.238856f, 0.864188f},\r
-  {0.162460f, -0.262866f, 0.951056f}, \r
-  {0.309017f, -0.500000f, 0.809017f},\r
-  {0.147621f, -0.716567f, 0.681718f}, \r
-  {0.000000f, -0.525731f, 0.850651f},\r
-  {0.425325f, -0.688191f, 0.587785f}, \r
-  {0.587785f, -0.425325f, 0.688191f},\r
-  {0.688191f, -0.587785f, 0.425325f}, \r
-  {-0.955423f, 0.295242f, 0.000000f},\r
-  {-0.951056f, 0.162460f, 0.262866f}, \r
-  {-1.000000f, 0.000000f, 0.000000f},\r
-  {-0.850651f, 0.000000f, 0.525731f}, \r
-  {-0.955423f, -0.295242f, 0.000000f},\r
-  {-0.951056f, -0.162460f, 0.262866f}, \r
-  {-0.864188f, 0.442863f, -0.238856f},\r
-  {-0.951056f, 0.162460f, -0.262866f}, \r
-  {-0.809017f, 0.309017f, -0.500000f},\r
-  {-0.864188f, -0.442863f, -0.238856f},\r
-  {-0.951056f, -0.162460f, -0.262866f},\r
-  {-0.809017f, -0.309017f, -0.500000f}, \r
-  {-0.681718f, 0.147621f, -0.716567f},\r
-  {-0.681718f, -0.147621f, -0.716567f}, \r
-  {-0.850651f, 0.000000f, -0.525731f},\r
-  {-0.688191f, 0.587785f, -0.425325f}, \r
-  {-0.587785f, 0.425325f, -0.688191f},\r
-  {-0.425325f, 0.688191f, -0.587785f}, \r
-  {-0.425325f, -0.688191f, -0.587785f},\r
-  {-0.587785f, -0.425325f, -0.688191f}, \r
-  {-0.688191f, -0.587785f, -0.425325f},\r
-};\r
-\r
-#endif\r
+/* -----------------------------------------------------------------------------
+
+PicoModel Library
+
+Copyright (c) 2002, Randy Reddig & seaw0lf
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list
+of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this
+list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+Neither the names of the copyright holders nor the names of its contributors may
+be used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----------------------------------------------------------------------------- */
+
+// This header file is based from the following:
+
+/*
+       FlexModel.H - Header file for FlexModel file structure
+
+       By Chris Burke
+       serotonin@earthlink.net
+*/
+
+#ifndef        __PM_FM_H__
+#define        __PM_FM_H__
+
+#include "picointernal.h"
+
+
+//
+//     Absolute limits (from QData / QMView source)
+//
+#define        MAX_FM_TRIANGLES        2048
+#define MAX_FM_VERTS           2048
+#define MAX_FM_FRAMES          2048
+#define MAX_FM_SKINS           64
+#define        MAX_FM_SKINNAME         64
+#define MAX_FM_MESH_NODES      16
+
+#define DTRIVERTX_V0   0
+#define DTRIVERTX_V1   1
+#define DTRIVERTX_V2   2
+#define DTRIVERTX_LNI  3
+#define DTRIVERTX_SIZE 4
+
+#define SKINPAGE_WIDTH 640
+#define SKINPAGE_HEIGHT 480
+
+#define ENCODED_WIDTH_X 92
+#define ENCODED_WIDTH_Y 475
+#define ENCODED_HEIGHT_X 128
+#define ENCODED_HEIGHT_Y 475
+
+#define SCALE_ADJUST_FACTOR 0.96
+
+#define INFO_HEIGHT 5
+#define INFO_Y (SKINPAGE_HEIGHT-INFO_HEIGHT)
+
+#ifndef byte
+       #define byte unsigned char
+#endif
+
+
+//
+//     Generic header on every chunk
+//
+#define        FM_MAXCHUNKIDENT        32L
+typedef struct
+{
+       char                    ident[FM_MAXCHUNKIDENT];
+       unsigned int            version;
+       unsigned int            size;
+} fm_chunk_header_t;
+
+//
+//     The format of the "header" chunk
+//
+#define        FM_HEADERCHUNKNAME      "header"
+#define        FM_HEADERCHUNKVER       2
+#define        FM_HEADERCHUNKSIZE      40
+typedef struct
+{
+       int                     skinWidth;              // in pixels
+       int                     skinHeight;             // in pixels
+       int                     frameSize;              // size of each frame (in bytes)
+       int                     numSkins;               // number of skins
+       int                     numXYZ;                 // number of unique vertices in 3D space
+       int                     numST;                  // number of unique vertices in texture space
+       int                     numTris;                // number of unique triangles
+       int                     numGLCmds;              // # 32-bit elements in strip/fan command list
+       int                     numFrames;              // number of animation frames
+       int                     numMeshNodes;           // number of mesh nodes
+} fm_header_t;
+
+//
+//     The format of an entry in the "skin" chunk.
+//     The number of entries is given in the fmheader chunk
+//
+#define        FM_SKINCHUNKNAME        "skin"
+#define        FM_SKINCHUNKVER         1
+#define        FM_MAXPATHLENGTH        64L
+#define        FM_SKINPATHSIZE (FM_MAXPATHLENGTH)
+typedef struct
+{
+       char                            path[FM_SKINPATHSIZE];  //      path, relative to 'base'
+} fm_skinpath_t;
+
+//
+//     The format of the "st coord" chunk. This is a list
+//     of unique skin texture (u, v) coordinates to be mapped
+//     to verteces of the model
+//
+#define FM_STCOORDCHUNKNAME    "st coord"
+#define FM_STCOORDCHUNKVER     1
+#define        FM_STCOORDUVSIZE        (2L + 2L)
+
+typedef struct
+{
+       short   s;
+       short   t;
+} fm_st_t;
+
+//
+//     The format of the "tris" chunk. This is a list of vertex indeces
+//     in 3D space, and the corresponding vertex indeces in texture space.
+//
+#define FM_TRISCHUNKNAME       "tris"
+#define FM_TRISCHUNKVER                1
+#define        FM_TRISINFOSIZE         (2L*3 + 2L*3)
+
+typedef struct
+{
+       short   index_xyz[3];
+       short   index_st[3];
+} fm_xyz_st_t;
+
+
+//
+//     The format of the "frames" chunk. This is a list of animation
+//     frames, each specifying the coordinates and "light normal" index
+//     of every vertex of the model in 3D space.
+//
+#define FM_FRAMESCHUNKNAME     "frames"
+#define FM_FRAMESCHUNKVER      1
+
+#define FM_NUMVERTEXNORMALS    162
+
+// Frame info
+typedef struct
+{
+       byte                    v[3];                           //      scaled by header info
+       byte                    lightnormalindex;       //      index in canned table of closest vertex normal
+} fm_vert_normal_t;
+
+typedef struct
+{
+       float                   scale[3];                       //      multiply byte verts by this
+       float                   translate[3];           //      then add this
+       char                    name[16];                       //      frame name
+} fm_framehdr_t;
+
+typedef struct
+{
+       fm_framehdr_t           header;                         //      One header per frame
+       fm_vert_normal_t        verts[1];                       //      variable number of these
+} fm_frame_t;
+
+typedef struct
+{
+       fm_chunk_header_t       *fm_header_hdr;
+       fm_header_t             *fm_header;
+       fm_chunk_header_t       *fm_skin_hdr;
+       fm_skinpath_t           *fm_skin;
+       fm_chunk_header_t       *fm_st_hdr;
+       fm_st_t                 *fm_st;
+       fm_chunk_header_t       *fm_tri_hdr;
+       fm_xyz_st_t             *fm_tri;
+       fm_chunk_header_t       *fm_frame_hdr;
+       fm_frame_t              *fm_frame;
+} fm_t;
+
+float  fm_normals[FM_NUMVERTEXNORMALS][3] = {
+  {-0.525731f, 0.000000f, 0.850651f},
+  {-0.442863f, 0.238856f, 0.864188f},
+  {-0.295242f, 0.000000f, 0.955423f},
+  {-0.309017f, 0.500000f, 0.809017f},
+  {-0.162460f, 0.262866f, 0.951056f},
+  {0.000000f, 0.000000f, 1.000000f},
+  {0.000000f, 0.850651f, 0.525731f},
+  {-0.147621f, 0.716567f, 0.681718f},
+  {0.147621f, 0.716567f, 0.681718f},
+  {0.000000f, 0.525731f, 0.850651f},
+  {0.309017f, 0.500000f, 0.809017f},
+  {0.525731f, 0.000000f, 0.850651f},
+  {0.295242f, 0.000000f, 0.955423f},
+  {0.442863f, 0.238856f, 0.864188f},
+  {0.162460f, 0.262866f, 0.951056f},
+  {-0.681718f, 0.147621f, 0.716567f},
+  {-0.809017f, 0.309017f, 0.500000f},
+  {-0.587785f, 0.425325f, 0.688191f},
+  {-0.850651f, 0.525731f, 0.000000f},
+  {-0.864188f, 0.442863f, 0.238856f},
+  {-0.716567f, 0.681718f, 0.147621f},
+  {-0.688191f, 0.587785f, 0.425325f},
+  {-0.500000f, 0.809017f, 0.309017f},
+  {-0.238856f, 0.864188f, 0.442863f},
+  {-0.425325f, 0.688191f, 0.587785f},
+  {-0.716567f, 0.681718f, -0.147621f},
+  {-0.500000f, 0.809017f, -0.309017f},
+  {-0.525731f, 0.850651f, 0.000000f},
+  {0.000000f, 0.850651f, -0.525731f},
+  {-0.238856f, 0.864188f, -0.442863f},
+  {0.000000f, 0.955423f, -0.295242f},
+  {-0.262866f, 0.951056f, -0.162460f},
+  {0.000000f, 1.000000f, 0.000000f}, 
+  {0.000000f, 0.955423f, 0.295242f},
+  {-0.262866f, 0.951056f, 0.162460f},
+  {0.238856f, 0.864188f, 0.442863f},
+  {0.262866f, 0.951056f, 0.162460f}, 
+  {0.500000f, 0.809017f, 0.309017f},
+  {0.238856f, 0.864188f, -0.442863f},
+  {0.262866f, 0.951056f, -0.162460f},
+  {0.500000f, 0.809017f, -0.309017f},
+  {0.850651f, 0.525731f, 0.000000f},
+  {0.716567f, 0.681718f, 0.147621f},
+  {0.716567f, 0.681718f, -0.147621f},
+  {0.525731f, 0.850651f, 0.000000f}, 
+  {0.425325f, 0.688191f, 0.587785f},
+  {0.864188f, 0.442863f, 0.238856f}, 
+  {0.688191f, 0.587785f, 0.425325f},
+  {0.809017f, 0.309017f, 0.500000f}, 
+  {0.681718f, 0.147621f, 0.716567f},
+  {0.587785f, 0.425325f, 0.688191f}, 
+  {0.955423f, 0.295242f, 0.000000f},
+  {1.000000f, 0.000000f, 0.000000f}, 
+  {0.951056f, 0.162460f, 0.262866f},
+  {0.850651f, -0.525731f, 0.000000f}, 
+  {0.955423f, -0.295242f, 0.000000f},
+  {0.864188f, -0.442863f, 0.238856f}, 
+  {0.951056f, -0.162460f, 0.262866f},
+  {0.809017f, -0.309017f, 0.500000f}, 
+  {0.681718f, -0.147621f, 0.716567f},
+  {0.850651f, 0.000000f, 0.525731f},
+  {0.864188f, 0.442863f, -0.238856f}, 
+  {0.809017f, 0.309017f, -0.500000f},
+  {0.951056f, 0.162460f, -0.262866f}, 
+  {0.525731f, 0.000000f, -0.850651f},
+  {0.681718f, 0.147621f, -0.716567f},
+  {0.681718f, -0.147621f, -0.716567f}, 
+  {0.850651f, 0.000000f, -0.525731f},
+  {0.809017f, -0.309017f, -0.500000f}, 
+  {0.864188f, -0.442863f, -0.238856f},
+  {0.951056f, -0.162460f, -0.262866f}, 
+  {0.147621f, 0.716567f, -0.681718f},
+  {0.309017f, 0.500000f, -0.809017f}, 
+  {0.425325f, 0.688191f, -0.587785f},
+  {0.442863f, 0.238856f, -0.864188f}, 
+  {0.587785f, 0.425325f, -0.688191f},
+  {0.688191f, 0.587785f, -0.425325f}, 
+  {-0.147621f, 0.716567f, -0.681718f},
+  {-0.309017f, 0.500000f, -0.809017f}, 
+  {0.000000f, 0.525731f, -0.850651f},
+  {-0.525731f, 0.000000f, -0.850651f}, 
+  {-0.442863f, 0.238856f, -0.864188f},
+  {-0.295242f, 0.000000f, -0.955423f}, 
+  {-0.162460f, 0.262866f, -0.951056f},
+  {0.000000f, 0.000000f, -1.000000f}, 
+  {0.295242f, 0.000000f, -0.955423f},
+  {0.162460f, 0.262866f, -0.951056f}, 
+  {-0.442863f, -0.238856f, -0.864188f},
+  {-0.309017f, -0.500000f, -0.809017f}, 
+  {-0.162460f, -0.262866f, -0.951056f},
+  {0.000000f, -0.850651f, -0.525731f}, 
+  {-0.147621f, -0.716567f, -0.681718f},
+  {0.147621f, -0.716567f, -0.681718f}, 
+  {0.000000f, -0.525731f, -0.850651f},
+  {0.309017f, -0.500000f, -0.809017f}, 
+  {0.442863f, -0.238856f, -0.864188f},
+  {0.162460f, -0.262866f, -0.951056f}, 
+  {0.238856f, -0.864188f, -0.442863f},
+  {0.500000f, -0.809017f, -0.309017f}, 
+  {0.425325f, -0.688191f, -0.587785f},
+  {0.716567f, -0.681718f, -0.147621f}, 
+  {0.688191f, -0.587785f, -0.425325f},
+  {0.587785f, -0.425325f, -0.688191f}, 
+  {0.000000f, -0.955423f, -0.295242f},
+  {0.000000f, -1.000000f, 0.000000f}, 
+  {0.262866f, -0.951056f, -0.162460f},
+  {0.000000f, -0.850651f, 0.525731f}, 
+  {0.000000f, -0.955423f, 0.295242f},
+  {0.238856f, -0.864188f, 0.442863f}, 
+  {0.262866f, -0.951056f, 0.162460f},
+  {0.500000f, -0.809017f, 0.309017f}, 
+  {0.716567f, -0.681718f, 0.147621f},
+  {0.525731f, -0.850651f, 0.000000f}, 
+  {-0.238856f, -0.864188f, -0.442863f},
+  {-0.500000f, -0.809017f, -0.309017f}, 
+  {-0.262866f, -0.951056f, -0.162460f},
+  {-0.850651f, -0.525731f, 0.000000f}, 
+  {-0.716567f, -0.681718f, -0.147621f},
+  {-0.716567f, -0.681718f, 0.147621f}, 
+  {-0.525731f, -0.850651f, 0.000000f},
+  {-0.500000f, -0.809017f, 0.309017f}, 
+  {-0.238856f, -0.864188f, 0.442863f},
+  {-0.262866f, -0.951056f, 0.162460f}, 
+  {-0.864188f, -0.442863f, 0.238856f},
+  {-0.809017f, -0.309017f, 0.500000f}, 
+  {-0.688191f, -0.587785f, 0.425325f},
+  {-0.681718f, -0.147621f, 0.716567f}, 
+  {-0.442863f, -0.238856f, 0.864188f},
+  {-0.587785f, -0.425325f, 0.688191f}, 
+  {-0.309017f, -0.500000f, 0.809017f},
+  {-0.147621f, -0.716567f, 0.681718f}, 
+  {-0.425325f, -0.688191f, 0.587785f},
+  {-0.162460f, -0.262866f, 0.951056f}, 
+  {0.442863f, -0.238856f, 0.864188f},
+  {0.162460f, -0.262866f, 0.951056f}, 
+  {0.309017f, -0.500000f, 0.809017f},
+  {0.147621f, -0.716567f, 0.681718f}, 
+  {0.000000f, -0.525731f, 0.850651f},
+  {0.425325f, -0.688191f, 0.587785f}, 
+  {0.587785f, -0.425325f, 0.688191f},
+  {0.688191f, -0.587785f, 0.425325f}, 
+  {-0.955423f, 0.295242f, 0.000000f},
+  {-0.951056f, 0.162460f, 0.262866f}, 
+  {-1.000000f, 0.000000f, 0.000000f},
+  {-0.850651f, 0.000000f, 0.525731f}, 
+  {-0.955423f, -0.295242f, 0.000000f},
+  {-0.951056f, -0.162460f, 0.262866f}, 
+  {-0.864188f, 0.442863f, -0.238856f},
+  {-0.951056f, 0.162460f, -0.262866f}, 
+  {-0.809017f, 0.309017f, -0.500000f},
+  {-0.864188f, -0.442863f, -0.238856f},
+  {-0.951056f, -0.162460f, -0.262866f},
+  {-0.809017f, -0.309017f, -0.500000f}, 
+  {-0.681718f, 0.147621f, -0.716567f},
+  {-0.681718f, -0.147621f, -0.716567f}, 
+  {-0.850651f, 0.000000f, -0.525731f},
+  {-0.688191f, 0.587785f, -0.425325f}, 
+  {-0.587785f, 0.425325f, -0.688191f},
+  {-0.425325f, 0.688191f, -0.587785f}, 
+  {-0.425325f, -0.688191f, -0.587785f},
+  {-0.587785f, -0.425325f, -0.688191f}, 
+  {-0.688191f, -0.587785f, -0.425325f},
+};
+
+#endif