This article's documentation is for the "GoldSrc" engine. Click here for more information.

MDL (GoldSrc)

From Valve Developer Community
Jump to navigation Jump to search
English (en)Translate (Translate)

edit

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 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 Sven Co-op and other engines like FTE FTE).
  • Have a file name which is not longer than 64 characters (including the .bmp extension).


Icon-Important.pngImportant:Older versions of StudioMDL, including the version found in the Half-Life SDK 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 GoldSrc which have tiled UVs.
Icon-Bug.pngBug: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.pngTip: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.pngWarning: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.pngNote:Third party games that upgrade the renderer (ex: Paranoia, Cry of Fear or Counter-Strike Nexon: Studio) can handle higher polygon MDLs better. This does not include Sven Co-op Sven Co-op, which uses a mostly vanilla renderer.
This is obviously not a problem for games on engines much newer than GoldSrc GoldSrc that use the HLMDL format, such as Codename: Loop Codename: Loop (Unity) or FreeCS FreeCS (FTE).
Confirm:Is this soft limit 9000 total, or 9000 being displayed simultaneously?
Confirm:Can custom renderers without engine access, such as Trinity Engine, improve performance for higher-poly MDLs?
Cpp.pngCode: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 Quake I rocket trail particles and dynamic light
2 EF_GRENADE Yes Quake Quake I grenade trail smoke particles
4 EF_GIB Yes Quake Quake I gib blood trail particles
8 EF_ROTATE No Rotate this model around its origin, like the weapon pickups in Quake Quake I; requires supported game code.
16 EF_TRACER Yes Quake Quake I skrag spit particles
32 EF_ZOMGIB Yes Quake Quake I zombie blood; like EF_GIB, but darker
64 EF_TRACER2 Yes Quake 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.
Icon-Bug.pngBug:Limited to 64x64 in vanilla GoldSrc GoldSrc; this is fixed in Sven Co-op Sven Co-op. Chrome resolutions higher than 256x256 tend to have diminishing returns.  [todo tested in?]
Note.pngNote:Automatically set for any textures that contain the string chrome somewhere in their name.
Icon-Important.pngImportant: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.
Icon-Bug.pngBug:Doesn't work in vanilla GoldSrc GoldSrc; fixed in Sven Co-op 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 Sven Co-op, which always generates mipmaps for models, regardless of this flag.
Icon-Bug.pngBug: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.pngTip: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.
Icon-Bug.pngBug:Sometimes breaks normals of non-additive faces on the same mesh.
PlacementTip.pngWorkaround: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.pngTip: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 Wikipedia icon 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 FTE and the Unity Unity game Codename: Loop Codename: Loop.

External links

References

  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