Files
BT411/context/asset-formats.md
T
Joe DiPrima 137c151951 #87: mech armour PANELS now darken with damage -- the .DZM material system was loaded and unused
Players: "the actual enemy mech in external view is not showing darkened armor
panels".  We swapped destroyed LIMB meshes but never darkened a panel.

The 1995 game darkens armour through the MATERIALS.  MakeMechRenderables
(FUN_004cef28) built, per (damage zone, material), a watcher
FUN_004573e4(material, &zone->damageLevel, 0.1f) that snapshotted the materials
2026-07-31 19:52:55 -05:00

66 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: asset-formats
title: "Asset Formats — MOD/SKL/ANI/BMF/BSL/textures/gauges/collision"
status: established
source_sections: "PROGRESS_LOG.md §5; docs/ASSET_PIPELINE.md; docs/BGF_FORMAT.md"
related_topics: [bgf-format, rendering, locomotion, combat-damage, gauges-hud]
key_terms: [MOD, SKL, ANI, BMF, BSL, VTX, SLD, DZM, PCC, GIM, material-ramp]
---
# Asset Formats
All reverse-engineered. Geometry (BGF) has its own topic ([[bgf-format]]); the full pixel/material
spec is `docs/ASSET_PIPELINE.md`. Full list: `docs/PROGRESS_LOG.md §5`.
## Definition / skeleton / animation
- **`.MOD`** — INI mech/object definition: skeleton, skins, collision, gauges, physics, animations,
class. The `.MOD` physics (MoverMass/drag/MaxAcceleration) governed thrust VEHICLES + collisions,
NOT walk gait ([[locomotion]]). [T1]
- **`.SKL`** — INI joint skeleton. `[joint] parent=, Type=(hingex/y/z|ball|balltranslate),
Object=part.bgf, dzone=, tranx/y/z, pitch/yaw/roll`. Build a **DCS tree**; neutral pose ≈
translations (pyr≈0). [T1]
- **`.ANI`** — INI keyframe animation. `[HEADER] framecount/framerate(30)/skeletonfile`; `[frameN]`
joint→**`pitch yaw roll` radians for EVERY joint type** (ANIMTOOL.cpp:140-142 parses the triple as
EulerAngles unconditionally — the old "balltranslate→translate" note was wrong [T0]); a
balltranslate joint ADDITIONALLY gets a per-frame translation from the separate **`[KeyJointPos]`**
section (ANIMTOOL.cpp:478-483 packs EulerAngles+Vector3D; JMOVER/seqctl apply SetRotation +
SetTranslation). For the root `jointlocal`, KeyJointPos.y = the gait vertical bob;
`[RootTranslation]` per-keyframe `x y z` where **`.z` = forward root SPEED** (units/s). Walk anims
have no baked root translation — forward motion is animation-driven from `.z` ([[locomotion]]).
Walk/run CYCLE clips author NO body pitch — root keys are a ≤1.5° roll sway only; the authored
LEAN lives in the transition (`rwl/rwr/wrl/wrr` jointhip ~7-12°) + `bmp` stagger (~25°) clips
(2026-07-13 sweep of all 331 source ANIs). [T1]
## Materials / textures
- **`.BMF`** — `DIV-BIZ2` (FILETYPE=1) material+texture LIBRARY (no pixels). Material → DIFFUSE color
+ `MATERIAL_TEXTURE`→texture→`TEXTURE_MAP` image basename. Tags: `0x18 BITSLICE` (BSL slice select),
`0x28` ramp ref, `0x26` emissive, `0x30/0x31` ramp def. [T1]
- **Texture pixels:** `.tga` (Truevision), `.vtx` (`DIV-VTX2`, trailing RGB), and **`.bsl`**
(`DIV-BSL2` — a BIT-SLICED container: w*h 32-bit texel words holding SIX independent 4-bit
GRAYSCALE sub-images (nibble pair-swapped, byte 0 pad) OR RGB444/RGBA4444 (sliceType 7/8). The BMF
`0x18 BITSLICE` tag picks the slice, absent=0). Decoding BSL as RGB = the "rainbow/graffiti mech"
bug. Reference reader: `DivLoader/VGCDivLoader.cpp:323-410`; archive-only — in-repo reimplementation: `engine/MUNGA_L4/image.cpp`. [T2]
- **`.VMF`** — `DIV-VIZ2` material SOURCE. Carries the `SCROLL` animation + `MAP{}` image binding for
effects (beams/muzzle/smoke/sky). THE key effects asset ([[rendering]]). [T2]
- **[[material-ramp]]** — the IG board colours no-normal geometry by a 2-endpoint RAMP; details in
[[bgf-format]] + [[rendering]]. [T2]
## Collision / damage / subsystems
- **`.SLD`** collision solids (Block/YCyl/Cone/Ramp/Wedge). Terrain is modeled AS collision volumes;
see [[locomotion]] ground model + [[combat-damage]]. [T1]
- **`.DZM`** = INI damage-zone→material map (mech skin damage states) — `[dz_<zone>]` sections each
listing `material=<lib>:<name>_mtl`. One file per SKIN VARIANT (`dzm`/`dzms`/`dzmt`/`dzmo`/`dzma`/
`dzmb`/`dzmc`/`dzmd`). This is the ARMOUR-DARKENING registry: the renderer lerps every listed
material toward 0.1× as that zone's `damageLevel` runs 0→1. Loaded by MUNGA's `DamageZone` stream
ctor into `materialTable` (`GetMaterialList(skl_type)`); full chain in [[rendering]]. [T1] **`.DMG`/`.TBL`** damage
zones/tables, **`.SUB`** subsystems (weapon params — DischargeTime/RechargeRate/WeaponRange),
**`.CTL`** control maps. [T1]
## Cockpit HUD assets ([[gauges-hud]])
- **`.GIM`** vector MFD/radar line maps + **`.GAT`** color table; **`.PCC`** ZSoft PCX 8-bit gauge
rasters (fonts helv15/helv42, label strips, dials). [T1]
## Key Relationships
- Geometry detail: [[bgf-format]]; pixel/material spec: `docs/ASSET_PIPELINE.md`.
- Consumed by: [[rendering]], [[locomotion]] (SKL/ANI), [[combat-damage]] (SLD/DZM/SUB), [[gauges-hud]] (GIM/PCC).