]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_alias.h
Configure all of the CL_MeshEntities* meshes the same, the material flags decide...
[xonotic/darkplaces.git] / model_alias.h
index 8908bec243b02ea18702b3e8340521036d0e6da3..61c1099a3a033c8833fd4e39fb6c8e3191bfcb4b 100644 (file)
@@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -18,6 +18,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 */
 
+#ifndef MODEL_ALIAS_H
+#define MODEL_ALIAS_H
+
 /*
 ==============================================================================
 
@@ -29,45 +32,8 @@ Alias models are position independent, so the cache manager can move them.
 
 #include "modelgen.h"
 
-typedef struct
-{
-       int                                     firstpose;
-       int                                     numposes;
-       float                           interval;
-       trivertx_t                      bboxmin;
-       trivertx_t                      bboxmax;
-       int                                     frame;
-       char                            name[16];
-} maliasframedesc_t;
-
-typedef struct
+typedef struct daliashdr_s
 {
-       trivertx_t                      bboxmin;
-       trivertx_t                      bboxmax;
-       int                                     frame;
-} maliasgroupframedesc_t;
-
-typedef struct
-{
-       int                                             numframes;
-       int                                             intervals;
-       maliasgroupframedesc_t  frames[1];
-} maliasgroup_t;
-
-// !!! if this is changed, it must be changed in asm_draw.h too !!!
-typedef struct mtriangle_s {
-       int                                     facesfront;
-       int                                     vertindex[3];
-} mtriangle_t;
-
-// LordHavoc: new vertex format
-typedef struct {
-       byte v[3]; // location
-       signed char n[3]; // surface normal for lighting *127.0
-} trivert2;
-
-#define        MAX_SKINS       32
-typedef struct {
        int                     ident;
        int                     version;
        vec3_t          scale;
@@ -83,29 +49,8 @@ typedef struct {
        synctype_t      synctype;
        int                     flags;
        float           size;
-
-       int                                     numposes;
-       int                                     posedata;       // LordHavoc: numposes*numverts*trivert2
-       int                                     frontfaces; // LordHavoc: how many front faces
-       int                                     backfaces; // LordHavoc: how many back faces
-//     int                                     poseverts;
-//     int                                     posedata;       // numposes*poseverts trivert_t
-//     int                                     commands;       // gl command list with embedded s/t
-       int                                     texcoords;      // LordHavoc: texture coordinates
-       int                                     vertindices;    // LordHavoc: vertex numbers
-       int                                     gl_texturenum[MAX_SKINS][4];
-       int                                     texels[MAX_SKINS];      // only for player skins
-       maliasframedesc_t       frames[1];      // variable sized
-} aliashdr_t;
-
-#define        MAXALIASVERTS   4096
-#define        MAXALIASFRAMES  1024
-#define        MAXALIASTRIS    4096
-
-extern aliashdr_t      *pheader;
-//extern       stvert_t        stverts[MAXALIASVERTS];
-//extern       mtriangle_t     triangles[MAXALIASTRIS];
-//extern       trivertx_t      *poseverts[MAXALIASFRAMES];
+}
+daliashdr_t;
 
 /*
 ========================================================================
@@ -118,46 +63,28 @@ extern     aliashdr_t      *pheader;
 // LordHavoc: grabbed this from the Q2 utility source,
 // renamed a things to avoid conflicts
 
-#define MD2IDALIASHEADER               (('2'<<24)+('P'<<16)+('D'<<8)+'I')
 #define MD2ALIAS_VERSION       8
+#define        MD2_SKINNAME    64
 
-#define        MD2MAX_TRIANGLES        4096
-#define MD2MAX_VERTS           4096
-#define MD2MAX_FRAMES          1024
-#define MD2MAX_SKINS   32
-#define        MD2MAX_SKINNAME 64
-// sanity checking size
-#define MD2MAX_SIZE    (16777216)
-
-typedef struct
+typedef struct md2stvert_s
 {
        short   s;
        short   t;
 } md2stvert_t;
 
-typedef struct 
+typedef struct md2triangle_s
 {
        short   index_xyz[3];
        short   index_st[3];
 } md2triangle_t;
 
-typedef struct
+typedef struct md2frame_s
 {
        float           scale[3];       // multiply byte verts by this
        float           translate[3];   // then add this
        char            name[16];       // frame name from grabbing
-       trivertx_t      verts[];        // variable sized
 } md2frame_t;
 
-// LordHavoc: memory representation is different than disk
-typedef struct
-{
-       float           scale[3];       // multiply byte verts by this
-       float           translate[3];   // then add this
-       trivert2        verts[];        // variable sized
-} md2memframe_t;
-
-
 // the glcmd format:
 // a positive integer starts a tristrip command, followed by that many
 // vertex structures.
@@ -167,7 +94,7 @@ typedef struct
 // and an integer vertex index.
 
 
-typedef struct
+typedef struct md2_s
 {
        int                     ident;
        int                     version;
@@ -187,27 +114,139 @@ typedef struct
        int                     ofs_st;                 // byte offset from start for stverts
        int                     ofs_tris;               // offset for dtriangles
        int                     ofs_frames;             // offset for first frame
-       int                     ofs_glcmds;     
+       int                     ofs_glcmds;
        int                     ofs_end;                // end of file
 } md2_t;
 
-typedef struct
+// all md3 ints, floats, and shorts, are little endian, and thus need to be
+// passed through LittleLong/LittleFloat/LittleShort to avoid breaking on
+// bigendian machines
+#define MD3VERSION 15
+#define MD3NAME 64
+#define MD3FRAMENAME 16
+
+// the origin is at 1/64th scale
+// the pitch and yaw are encoded as 8 bits each
+typedef struct md3vertex_s
 {
-       int                     framesize;              // byte size of each frame
+       short origin[3];
+       unsigned char pitch;
+       unsigned char yaw;
+}
+md3vertex_t;
+
+// one per frame
+typedef struct md3frameinfo_s
+{
+       float mins[3];
+       float maxs[3];
+       float origin[3];
+       float radius;
+       char name[MD3FRAMENAME];
+}
+md3frameinfo_t;
+
+// one per tag per frame
+typedef struct md3tag_s
+{
+       char name[MD3NAME];
+       float origin[3];
+       float rotationmatrix[9];
+}
+md3tag_t;
+
+// one per shader per mesh
+typedef struct md3shader_s
+{
+       char name[MD3NAME];
+       // engine field (yes this empty int does exist in the file)
+       int shadernum;
+}
+md3shader_t;
+
+// one per mesh per model
+//
+// note that the lump_ offsets in this struct are relative to the beginning
+// of the mesh struct
+//
+// to find the next mesh in the file, you must go to lump_end, which puts you
+// at the beginning of the next mesh
+typedef struct md3mesh_s
+{
+       char identifier[4]; // "IDP3"
+       char name[MD3NAME];
+       int flags;
+       int num_frames;
+       int num_shaders;
+       int num_vertices;
+       int num_triangles;
+       int lump_elements;
+       int lump_shaders;
+       int lump_texcoords;
+       int lump_framevertices;
+       int lump_end;
+}
+md3mesh_t;
+
+// this struct is at the beginning of the md3 file
+//
+// note that the lump_ offsets in this struct are relative to the beginning
+// of the header struct (which is the beginning of the file)
+typedef struct md3modelheader_s
+{
+       char identifier[4]; // "IDP3"
+       int version; // 15
+       char name[MD3NAME];
+       int flags;
+       int num_frames;
+       int num_tags;
+       int num_meshes;
+       int num_skins;
+       int lump_frameinfo;
+       int lump_tags;
+       int lump_meshes;
+       int lump_end;
+}
+md3modelheader_t;
+
+typedef struct aliastag_s
+{
+       char name[MD3NAME];
+       float matrixgl[12];
+}
+aliastag_t;
 
-       int                     num_skins;
-       int                     num_xyz;
-       int                     num_st;                 // greater than num_xyz for seams
-       int                     num_tris;
-       int                     num_glcmds;             // dwords in strip/fan command list
-       int                     num_frames;
+typedef struct aliasbone_s
+{
+       char name[MD3NAME];
+       int flags;
+       int parent; // -1 for no parent
+}
+aliasbone_t;
 
-       int                     ofs_tris;               // offset for dtriangles
-       int                     ofs_frames;             // offset for first frame
-       int                     ofs_glcmds;     
+#include "model_zymotic.h"
+
+#include "model_dpmodel.h"
+
+#include "model_psk.h"
+
+#include "model_iqm.h"
+
+// for decoding md3 model latlong vertex normals
+extern float mod_md3_sin[320];
+
+extern cvar_t r_skeletal_debugbone;
+extern cvar_t r_skeletal_debugbonecomponent;
+extern cvar_t r_skeletal_debugbonevalue;
+extern cvar_t r_skeletal_debugtranslatex;
+extern cvar_t r_skeletal_debugtranslatey;
+extern cvar_t r_skeletal_debugtranslatez;
+
+struct model_s;
+struct frameblend_s;
+
+void *Mod_Skeletal_AnimateVertices_AllocBuffers(size_t nbytes);
+void Mod_Skeletal_BuildTransforms(const struct model_s * RESTRICT model, const struct frameblend_s * RESTRICT frameblend, const skeleton_t *skeleton, float * RESTRICT bonepose, float * RESTRICT boneposerelative);
 
-       int                     gl_texturenum[MAX_SKINS];
-} md2mem_t;
+#endif
 
-#define ALIASTYPE_MDL 1
-#define ALIASTYPE_MD2 2