MDL (GoldSrc)/en
Language subpage
This subpage is used on the MDL (GoldSrc) page to display content in English.
If you have edited the language subpage, do not forget to purge the base page by clicking on the button on the right. Otherwise, its contents will not be updated.
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.
Contents
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).
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]
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 ().
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?
Confirm: Can replacement renderers without engine access, such as Trinity Engine, improve performance for higher-poly MDLs?
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 Confirm: Half Lambert?
|
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. 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. |
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.
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.
|
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
- 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