Stub
This article or section is a stub. You can help by expanding it.
MDL (sometimes referred to as Half-Life MDL or HLMDL) is a model format used by
GoldSrc to store dynamically lit models which can be animated using skeletal animation, along with their associated textures. It is a heavily modified version of the Quake MDL format.
Overview
Limits
HLMDL has the following limits per input SMD:
- 1 mesh
- 2048 vertices (and vertex normals) per mesh
- 4080 triangles per mesh
- 1 animation sequence
- 512 keyframes per sequence
- 128 bones
Additionally, the following limits apply to the whole MDL:
- 4 bone attachments
- 8 bone controllers
- 32 meshes across all submodels
- 256 animation sequences.
Textures must:
- Be 8-bit uncompressed BMP files.
- Have a resolution which is a multiple of 8 (multiples of 16 are preferred).
- Have a resolution which does not exceed 512x512 (soft limit; raised to 1024x1024 in
Sven Co-op and other engines like
FTE).
- Have a file name which is not longer than 64 characters (including the .bmp extension).
Important:Older versions of StudioMDL, including the version found in the
Half-Life SDK on Steam, do not support tiling UVs, clamping them to the edge of the texture. This is not a limitation of the HLMDL file format; the Sven Co-op StudioMDL can create MDLs compatible with vanilla
GoldSrc which have tiled UVs.
Bug:The latest version of the Sven Co-op StudioMDL (from December 2020), as found in the Sven Co-op SDK, has some bugs with bounding boxes; use the version linked above instead (from November 2018). [todo tested in ?]
Tip:To create a model or submodel with more than 4080 tris, split the model into multiple SMD meshes, with a separate $body or $bodygroup entry for each mesh in the QC file.
Warning:Avoid going over 9000 tris!
While the HLMDL format can handle over 100K tris, the old OpenGL renderer struggles with such "high-poly" models, even on high-end GPUs.[1]
Note:Third party games that upgrade the renderer (ex:
,
or
) can handle higher polygon MDLs better. This does not include
Sven Co-op, which uses a mostly vanilla renderer.
This is obviously not a problem for games on engines much newer than
GoldSrc that use the HLMDL format, such as
Codename: Loop (
) or
FreeCS (
).
Confirm:Is this soft limit 9000 total, or 9000 being displayed simultaneously?
Code:While MDL does not natively support animated textures, a model's skin can be quickly switched between in game code to animate between them. For example, monster_houndeye uses skin switching to blink.
Confirm:Max textures, max skins, and other limits?
Flags
Model flags
Particle effects cannot be combined, but all others can.[Clarify]
Bit |
Flag name |
Particle effect? |
Description
|
1 |
EF_ROCKET |
Yes |
Quake I rocket trail particles and dynamic light
|
2 |
EF_GRENADE |
Yes |
Quake I grenade trail smoke particles
|
4 |
EF_GIB |
Yes |
Quake I gib blood trail particles
|
8 |
EF_ROTATE |
No |
Rotate this model around its origin, like the weapon pickups in Quake I; requires supported game code.
|
16 |
EF_TRACER |
Yes |
Quake I skrag spit particles
|
32 |
EF_ZOMGIB |
Yes |
Quake I zombie blood; like EF_GIB, but darker
|
64 |
EF_TRACER2 |
Yes |
Quake I death knight slashing particles
|
128 |
EF_TRACER3 |
Yes |
Like EF_GRENADE, but only has one trail
|
256 |
EF_NOSHADELIGHT |
No |
Reduces intensity of shadows on the model, without making the model flat
|
512 |
EF_HITBOXCOLLISIONS |
No |
Use hitbox for collision instead of bounding box
|
1024 |
EF_FORCESKYLIGHT |
No |
Always use skybox lighting, regardless of model location
|
Texture flags
Bit |
Flag name |
Description
|
1 |
STUDIO_NF_FLATSHADE |
Shade the model a single tint, without any shadowing, resulting in the model looking "flat" like a cartoon character.
|
2 |
STUDIO_NF_CHROME |
Use matcap environment mapping to render the texture as a sphere map.
Bug:Limited to 64x64 in vanilla GoldSrc; this is fixed in Sven Co-op. Chrome resolutions higher than 256x256 tend to have diminishing returns. [todo tested in ?]
Note:Automatically set for any textures that contain the string chrome somewhere in their name.
Important:Setting the chrome flag via StudioMDL will also add the flatshade flag, as well as move all UV coordinates to the top-left corner (chrome doesn't use UV mapping).
|
4 |
STUDIO_NF_FULLBRIGHT |
Display texture at maximum brightness, ignoring lighting.
Bug:Doesn't work in vanilla GoldSrc; fixed in Sven Co-op and custom renderers. [todo tested in ?]
|
8 |
STUDIO_NF_MIPMAPS |
Generates mipmaps for the texture, greatly reducing texture aliasing at a distance. No effect in Sven Co-op, which always generates mipmaps for models, regardless of this flag. Bug:This flag was actually originally intended to disable mipmaps for a texture, but this behavior was accidentally inverted. Confirm:Allegedy fixed in 25th Anniversary Update. [todo tested in ?]
Tip:Recommended for most textures except alphatested ones. Due to the way textures are stored, enabling mipmaps of alphatested texture will result in the texture transparency becoming more exaggerated at a distance, with fine details like thin foliage and wire fences disappearing, and shadowing occurring around the edges occurring due to transparent texels not being dilated.
|
16 |
STUDIO_NF_ALPHA |
Unused?
|
32 |
STUDIO_NF_ADDITIVE |
Use additive translucency. Still affected by entity lighting; use the Additive rendermode on an entity to ignore lighting.
Bug:Sometimes breaks normals of non-additive faces on the same mesh.
Workaround:Split the additive portions onto a different mesh, by listing it as a separate SMD with a separate $body line (usually after the main mesh).
Tip:This affects the order in which faces are loaded into the z-buffer, which can be used for manual alpha sorting. In practice, this means defining an additive chrome overlay (to simulate specular highlights) as a separate mesh after the main mesh will prevent z-fighting, even if the mesh is coplanar.
[todo tested in ?]
|
64 |
STUDIO_NF_MASKED |
Use binary alphatest transparency, wherein the last palette entry of the texture is transparent.
|
In other engines
Half-Life MDLs are supported by
FTE and the
Unity game
Codename: Loop.
External links
References
CollapseReferences
|
1.
|
From the GoldSrc Model Export Tutorial by The303:
In order to compile models with more than 4080 triangles, you must break up your SMD's into parts and give them their own $body lines for compiling. Also, FOR THE LOVE OF ALL THAT IS HOLY PLEASE DO NOT GO CRAZY ON YOUR TRIANGLE COUNT; remember this is goldsrc, not source engine. Going any higher than 9000 tris is excessive and direct ports from source/other games are inefficent, wasteful, and cause performance issues for the old renderer. — The303
|
|