--- /dev/null
+/*
+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;