]> de.git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
model: Create header for Half-Life MDL format
authorcloudwalk <cloudwalk@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 31 Dec 2020 19:06:37 +0000 (19:06 +0000)
committercloudwalk <cloudwalk@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 31 Dec 2020 19:06:37 +0000 (19:06 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@13081 d7cf8633-e32d-0410-b094-e92efae38249

model_hlmdl.h [new file with mode: 0644]

diff --git a/model_hlmdl.h b/model_hlmdl.h
new file mode 100644 (file)
index 0000000..58fde4e
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+Copyright (C) 2021 David Knapp (Cloudwalk)
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+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.
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+/*
+ * The Half-Life MDL format is Valve's format for models in GoldSrc engine.
+ * 
+ * These headers were added based on information found at
+ * https://github.com/malortie/assimp/wiki/MDL:-Half-Life-1-file-format
+ */
+
+#include "qtypes.h"
+#include "qdefs.h"
+
+#define HLPOLYHEADER (('T' << 24) + ('S' << 16) + ('D' << 8) + 'I')
+#define HLMDLHEADER "IDST"
+#define HLSEQHEADER "IDSQ"
+
+// Flags
+#define HLMDLFLAG_FLAT 0x1
+#define HLMDLFLAG_CHROME 0x2
+#define HLMDLFLAG_FULLBRIGHT 0x4
+
+// Header
+typedef struct dhlmdl_header_s
+{
+       int32_t id; // Should be IDST
+       int32_t version; // Should be 10
+       int8_t name[64];
+       int32_t filesize;
+       vec3_t eyeposition;
+       vec3_t min, max;
+       vec3_t bbmin, bbmax;
+       int32_t flags;
+
+       int32_t num_bones;
+       int32_t ofs_bones;
+
+       int32_t num_bonecontrollers;
+       int32_t ofs_bonecontrollers;
+
+       int32_t num_hitboxes;
+       int32_t ofs_hitboxes;
+
+       int32_t num_seq;
+       int32_t ofs_seq;
+
+       int32_t num_seqgroups;
+       int32_t ofs_seqgroups;
+
+       int32_t num_textures;
+       int32_t ofs_textures;
+       int32_t ofs_texturedata;
+
+       int32_t num_skins;
+       int32_t num_skingroups;
+       int32_t ofs_skins;
+
+       int32_t num_bodyparts;
+       int32_t ofs_bodyparts;
+
+       int32_t num_attachments;
+       int32_t ofs_attachments;
+
+       int32_t soundtable;
+       int32_t soundindex;
+
+       int32_t num_soundgroups;
+       int32_t ofs_soundgroups;
+
+       int32_t num_transitions;
+       int32_t ofs_transitions;
+} dhlmdl_header_t;
+
+typedef struct dhlmdl_sequence_header_s
+{
+       int32_t id; // Should be IDSQ
+       int32_t version; // Should be 10
+       int8_t name[64];
+       int32_t size;
+} dhlmdl_sequence_header_t;
+
+typedef struct dhlmdl_texture_s
+{
+       int8_t name[64];
+       int32_t flags;
+       int32_t w, h;
+       int32_t ofs;
+} dhlmdl_texture_t;
+
+typedef struct dhlmdl_bone_s
+{
+       int8_t name[32];
+       int32_t parent;
+       int32_t flags;
+       int32_t bonecontroller[6];
+       float value[6];
+       float scale[6];
+} dhlmdl_bone_t;
+
+typedef struct dhlmdl_bone_controller_s
+{
+       int32_t bone;
+       int32_t type;
+       float start;
+       float end;
+       int32_t rest;
+       int32_t index;
+} dhlmdl_bone_controller_t;
+
+typedef struct dhlmdl_hitbox_s
+{
+       int32_t bone;
+       int32_t group;
+       vec3_t bbmin, bbmax;
+} dhlmdl_hitbox_t;
+
+typedef struct dhlmdl_sequence_group_s
+{
+       int8_t label[32];
+       int8_t name[64];
+       int64_t unused;
+} dhlmdl_sequence_group_t;
+
+typedef struct dhlmdl_sequence_description_s
+{
+       int8_t label[32];
+       float fps;
+       int32_t flags;
+       int32_t activity;
+       int32_t actweight;
+
+       int32_t num_events;
+       int32_t ofs_events;
+
+       int32_t num_frames;
+       
+       int64_t unused0;
+       
+       int32_t motiontype;
+       int32_t motionbone;
+       vec3_t linearmovement;
+       int64_t unused1;
+       vec3_t bbmin, bbmax;
+
+       int32_t num_blends;
+
+       int32_t ofs_anim;
+
+       int32_t blendtype[2];
+       float blendstart[2], blendend[2];
+       int32_t unused2; // blendparent
+       int32_t seqgroup;
+       int32_t entrynode;
+       int32_t exitnode;
+       int32_t nodeflags;
+       int32_t unused3; // nextseq
+} dhlmdl_sequence_description_t;
+
+typedef uint16_t dhlmdl_animoffset_t[6];
+
+typedef union dhlmdl_animvalue_s
+{
+       struct {
+               uint8_t valid;
+               uint8_t total;
+       } num;
+       int16_t value;
+} dhlmdl_animvalue_t;
+
+typedef struct dhlmdl_animevent_s
+{
+       int32_t frame;
+       int32_t event;
+       int32_t unused;
+       int8_t options[64];
+} dhlmdl_animevent_t;
+
+typedef struct dhlmdl_attachment_s
+{
+       int8_t unused0[36];
+       int32_t type;
+       int32_t bone;
+       vec3_t org;
+       vec3_t unused1[3];
+} dhlmdl_attachment_t;
+
+typedef struct dhlmdl_bodypart_s
+{
+       int8_t name[64];
+       int32_t num_models;
+       int32_t base;
+       int32_t ofs_models;
+} dhlmdl_bodypart_t;
+
+typedef struct dhlmdl_s
+{
+       int8_t name[64];
+       int64_t unused0;
+
+       int32_t num_mesh;
+       int32_t ofs_mesh;
+
+       int32_t num_verts;
+       int32_t ofs_vertinfo;
+       int32_t ofs_verts;
+       
+       int32_t num_norms;
+       int32_t ofs_norminfo;
+       int32_t ofs_norms;
+       
+       int64_t unused1;
+} dhlmdl_t;
+
+typedef struct dhlmdl_mesh_s
+{
+       int32_t num_tris;
+       int32_t ofs_tris;
+       int32_t ofs_skins;
+       int64_t unused;
+} dhlmdl_mesh_t;
+
+typedef struct dhlmdl_trivert_s
+{
+       int16_t vertindex;
+       int16_t normindex;
+       int16_t s, t;
+} dhlmdl_trivert_t;