MDL: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(Intermediate save of what I have so far.)
mNo edit summary
Line 8: Line 8:
<source lang="cpp">struct studiohdr_t
<source lang="cpp">struct studiohdr_t
{
{
int id;             // Model format ID, such as "IDST" (0x49 0x44 0x53 0x54)
int id; // Model format ID, such as "IDST" (0x49 0x44 0x53 0x54)
int version;       // Format version number, such as 48 (0x30,0x00,0x00,0x00)
int version; // Format version number, such as 48 (0x30,0x00,0x00,0x00)
char[64]       name;           // The internal name of the model, padding with null bytes.
char[64] name; // The internal name of the model, padding with null bytes.
                                        // Typically "my_model.mdl" will have an internal name of "my_model"
// Typically "my_model.mdl" will have an internal name of "my_model"
int         dataLength; // ??
int dataLength; // ??


        // A vector is 12 bytes, three 4-byte float-values in a row.
// A vector is 12 bytes, three 4-byte float-values in a row.
        Vector         eyeposition;   // Position of player viewpoint relative to model origin
Vector eyeposition; // Position of player viewpoint relative to model origin
        Vector         illumposition; // ?? Presumably the point used for lighting when per-vertex lighting is not enabled.
Vector illumposition; // ?? Presumably the point used for lighting when per-vertex lighting is not enabled.
        Vector         hull_min;       // Corner of model hull box with the least X/Y/Z values
Vector hull_min; // Corner of model hull box with the least X/Y/Z values
        Vector         hull_max;       // Opposite corner of model hull box
Vector hull_max; // Opposite corner of model hull box
        Vector         view_bbmin;
Vector   view_bbmin;
        Vector         view_bbmax;
Vector view_bbmax;


        int             flags;         // ??
int flags; // ??
       
        // After this point, the header contains many references to offsets within the MDL file and the number of items at those offsets.
/*
* After this point, the header contains many references to offsets
* within the MDL file and the number of items at those offsets.
*
* Offsets are from the very beginning of the file.
*
* Note that indexes/counts are not always paired and ordered consistently.
*/


        int             bone_count     // Number of mstudiobone_t structs   
// mstudiobone_t
        int             bone_offset     // Offset of first mstudiobone_t struct
int bone_count; // Number of data sections (of type mstudiobone_t)
int bone_offset; // Offset of first data section


        int             bonecontroller_count     // Number of mstudiobonecontroller_t structs   
// mstudiobonecontroller_t
         int             bonecontroller_offset    // Offset of first mstudiobonecontroller_t struct
int bonecontroller_count;
}</source>
int bonecontroller_offset;
 
// mstudiohitboxset_t
int hitbox_count;
int hitbox_offset;
 
// mstudioanimdesc_t
int localanim_count;
int localanim_offset;
 
// mstudioseqdesc_t
int localseq_count;
int localseq_offset;
 
int activitylistversion; // ??
int eventsindexed; // ??
// VMT texture filenames
// (A series of null-terminated strings)
int texture_count;
int texture_offset;
// Relative paths to search for textures
// (A series of null-terminated strings)
int texturedir_count;
int texturedir_offset;
// Skin family information for replaceable textures
int skinreference_count;
int skinrfamily_count;
int            skinreference_index;
// mstudiobodyparts_t
int bodypart_count;
int bodypart_offset;
         // Local attachment points
// mstudioattachment_t
int attachment_count;
int attachment_offset;
// Node values appear to be single bytes, while their names are null-terminated strings.
int localnode_count;
int localnode_index;
int localnode_name_index;
// mstudioflexdesc_t
int flexdesc_count;
int flexdesc_index;
// mstudioflexcontroller_t
int flexcontroller_count;
int flexcontroller_index;
// mstudioflexrule_t
int flexrules_count;
int flexrules_index;
// IK probably referse to inverse kinematics
// mstudioikchain_t
int ikchain_count;
int ikchain_index;
// Information about any "mouth" on the model for speech animation
// More than one sounds pretty creepy.
// mstudiomouth_t
int mouths_count;
int mouths_index;
// mstudioposeparamdesc_t
int localposeparam_count;
int localposeparam_index;
/*
* For anyone trying to follow along, as of this writing,
* the next "surfaceprop_index" value is at position 0x0134 (308)
* from the start of the file.
*/
// Surface property value (single null-terminated string)
int surfaceprop_index;
// Unusual: In this one index comes first, then count.
// Key-value data is a series of strings. If you can't find
// what you're interested in, check the associated PHY file as well.
int keyvalue_index;
int keyvalue_count;
// More inverse-kinematics
// mstudioiklock_t
int iklock_count;
int iklock_index;
float mass; // Mass of object (4-bytes)
int contents; // ??
// Other models can be referenced for re-used sequences and animations
// (See also: The $includemodel QC option.)
// mstudiomodelgroup_t
int includemodel_count;
int includemodel_index;
//
 
}
</source>


{{TODO|This header information is incomplete.}}
{{TODO|This header information is incomplete.}}

Revision as of 21:31, 20 August 2010

MDL is the extension for Source's proprietary model format. It defines the structure of the model along with animation, bounding box, hit box, material, mesh and LOD information. It does not, however, contain all the information needed for the model. Additional data is stored in PHY, ANI, VTX and VVD files, and sometimes, usually for shared animations, other .mdl files.

File format

Some details of the file format may be gleaned from the source code in Valve's studio.h, specifically the struct studiohdr_t. The early header defines a series of offsets and lengths for various sub-sections within the file, along with some key scalar information. The MDL also contains the names of materials (VMT) which are used as the numerically-defined swappable skins.

Main header

struct studiohdr_t
{
	int		id;		// Model format ID, such as "IDST" (0x49 0x44 0x53 0x54)
	int		version;	// Format version number, such as 48 (0x30,0x00,0x00,0x00)
	char[64]	name;		// The internal name of the model, padding with null bytes.
					// Typically "my_model.mdl" will have an internal name of "my_model"
	int		dataLength;	// ??

	// A vector is 12 bytes, three 4-byte float-values in a row.
	Vector		eyeposition;	// Position of player viewpoint relative to model origin
	Vector		illumposition;	// ?? Presumably the point used for lighting when per-vertex lighting is not enabled.
	Vector		hull_min;	// Corner of model hull box with the least X/Y/Z values
	Vector		hull_max;	// Opposite corner of model hull box
	Vector	  	view_bbmin;
	Vector	 	view_bbmax;

	int		flags;		// ??
	
	/*
	 * After this point, the header contains many references to offsets
	 * within the MDL file and the number of items at those offsets.
	 *
	 * Offsets are from the very beginning of the file.
	 * 
	 * Note that indexes/counts are not always paired and ordered consistently.
	 */	

	// mstudiobone_t
	int		bone_count;	// Number of data sections (of type mstudiobone_t)
	int		bone_offset;	// Offset of first data section

	// mstudiobonecontroller_t
	int		bonecontroller_count;
	int		bonecontroller_offset;

	// mstudiohitboxset_t
	int		hitbox_count;
	int		hitbox_offset;

	// mstudioanimdesc_t
	int		localanim_count;
	int		localanim_offset;

	// mstudioseqdesc_t
	int		localseq_count;
	int		localseq_offset;

	int		activitylistversion; // ??
	int		eventsindexed;	// ??
	
	// VMT texture filenames
	// (A series of null-terminated strings)
	int		texture_count;
	int		texture_offset;
			
	// Relative paths to search for textures
	// (A series of null-terminated strings)
	int		texturedir_count;
	int		texturedir_offset;
	
	// Skin family information for replaceable textures
	int		skinreference_count;
	int		skinrfamily_count;
	int             skinreference_index;
	
	// mstudiobodyparts_t
	int		bodypart_count;
	int		bodypart_offset;
	
        // Local attachment points		
	// mstudioattachment_t
	int		attachment_count;
	int		attachment_offset;
	
	// Node values appear to be single bytes, while their names are null-terminated strings.
	int		localnode_count;
	int		localnode_index;
	int		localnode_name_index;
	
	// mstudioflexdesc_t
	int		flexdesc_count;
	int		flexdesc_index;
	
	// mstudioflexcontroller_t
	int		flexcontroller_count;
	int		flexcontroller_index;
	
	// mstudioflexrule_t
	int		flexrules_count;
	int		flexrules_index;
	
	// IK probably referse to inverse kinematics
	// mstudioikchain_t
	int		ikchain_count;
	int		ikchain_index;
	
	// Information about any "mouth" on the model for speech animation
	// More than one sounds pretty creepy.
	// mstudiomouth_t
	int		mouths_count; 
	int		mouths_index;
	
	// mstudioposeparamdesc_t
	int		localposeparam_count;
	int		localposeparam_index;
	
	/*
	 * For anyone trying to follow along, as of this writing,
	 * the next "surfaceprop_index" value is at position 0x0134 (308)
	 * from the start of the file.
	 */
	
	// Surface property value (single null-terminated string)
	int		surfaceprop_index;
	
	// Unusual: In this one index comes first, then count.
	// Key-value data is a series of strings. If you can't find
	// what you're interested in, check the associated PHY file as well.
	int		keyvalue_index;
	int		keyvalue_count;	
	
	// More inverse-kinematics
	// mstudioiklock_t
	int		iklock_count;
	int		iklock_index;
	
	
	float		mass; // Mass of object (4-bytes)
	int		contents; // ??
	
	// Other models can be referenced for re-used sequences and animations
	// (See also: The $includemodel QC option.)
	// mstudiomodelgroup_t
	int		includemodel_count;
	int		includemodel_index;
	
	// 
	

}
Todo: This header information is incomplete.


See also