feat: render equipment on other players (helmets, weapons, belts, wrists)

Other players previously appeared partially naked — only chest, legs, feet,
hands, cape, and tabard rendered. Now renders full equipment:

- Helmet M2 model: loads from ItemDisplayInfo.dbc with race/gender suffix,
  attaches at head bone (point 0/11), hides hair geoset under helm
- Weapons: mainhand (attachment 1) and offhand (attachment 2) M2 models
  loaded from ItemDisplayInfo, with Weapon/Shield path fallback
- Wrist/bracer geoset (group 8): applies when no chest sleeve overrides
- Belt/waist geoset (group 18): reads GeosetGroup1 from ItemDisplayInfo
- Shoulder M2 attachments deferred (separate bone attachment system)

Also applied same wrist/waist geosets to NPC and character preview paths.

Minimap: batch 9 individual vkUpdateDescriptorSets into single call.
This commit is contained in:
Kelsi 2026-03-27 17:30:35 -07:00
parent 50a3eb7f07
commit 0396a42beb
3 changed files with 223 additions and 10 deletions

View file

@ -623,11 +623,27 @@ bool CharacterPreview::applyEquipment(const std::vector<game::EquipmentItem>& eq
uint32_t gg = getGeosetGroup(did, 0);
if (gg > 0) geosetGloves = static_cast<uint16_t>(401 + gg);
}
// Wrists/Bracers → group 8 (sleeves, only if chest/shirt didn't set it)
{
uint32_t did = findDisplayId({9});
if (did != 0 && geosetSleeves == 801) {
uint32_t gg = getGeosetGroup(did, 0);
if (gg > 0) geosetSleeves = static_cast<uint16_t>(801 + gg);
}
}
// Belt → group 18 (buckle)
uint16_t geosetBelt = 0;
{
uint32_t did = findDisplayId({6});
uint32_t gg = getGeosetGroup(did, 0);
if (gg > 0) geosetBelt = static_cast<uint16_t>(1801 + gg);
}
geosets.insert(geosetGloves);
geosets.insert(geosetBoots);
geosets.insert(geosetSleeves);
geosets.insert(geosetPants);
if (geosetBelt != 0) geosets.insert(geosetBelt);
geosets.insert(hasInvType({16}) ? 1502 : 1501); // Cloak mesh toggle (visual may still be limited)
if (hasInvType({19})) geosets.insert(1201); // Tabard mesh toggle