Fix WMO LOD shell culling and MOGP header parsing

- Fix MOGP header: skip 8-byte groupName/descriptiveName prefix before flags
- Fix fogIndices: read as 4×uint8 (4 bytes) instead of 4×uint32 (16 bytes)
- Detect LOD shell groups: city shells, facades, flag 0x80 indoor, low-vert
- Per-group distance culling at 196 units instead of whole-WMO distance
This commit is contained in:
Kelsi 2026-02-23 03:23:18 -08:00
parent 3ffb7ccc50
commit a7cf0d0c4e
2 changed files with 41 additions and 23 deletions

View file

@ -429,9 +429,11 @@ bool WMOLoader::loadGroup(const std::vector<uint8_t>& groupData,
}
// Read MOGP header
// NOTE: In WMO group files, the MOGP data starts directly at flags
// (groupName/descriptiveGroupName are handled by the root WMO's MOGI chunk).
// MOGP starts with groupName(4) + descriptiveName(4) offsets into MOGN,
// followed by flags at offset +8.
uint32_t mogpOffset = offset;
mogpOffset += 4; // skip groupName offset
mogpOffset += 4; // skip descriptiveGroupName offset
group.flags = read<uint32_t>(groupData, mogpOffset);
bool isInterior = (group.flags & 0x2000) != 0;
core::Logger::getInstance().debug(" Group flags: 0x", std::hex, group.flags, std::dec,
@ -442,14 +444,14 @@ bool WMOLoader::loadGroup(const std::vector<uint8_t>& groupData,
group.boundingBoxMax.x = read<float>(groupData, mogpOffset);
group.boundingBoxMax.y = read<float>(groupData, mogpOffset);
group.boundingBoxMax.z = read<float>(groupData, mogpOffset);
mogpOffset += 4; // nameOffset
group.portalStart = read<uint16_t>(groupData, mogpOffset);
group.portalCount = read<uint16_t>(groupData, mogpOffset);
mogpOffset += 8; // transBatchCount, intBatchCount, extBatchCount, padding
group.fogIndices[0] = read<uint32_t>(groupData, mogpOffset);
group.fogIndices[1] = read<uint32_t>(groupData, mogpOffset);
group.fogIndices[2] = read<uint32_t>(groupData, mogpOffset);
group.fogIndices[3] = read<uint32_t>(groupData, mogpOffset);
// fogIndices: 4 × uint8 (4 bytes total, NOT 4 × uint32)
group.fogIndices[0] = read<uint8_t>(groupData, mogpOffset);
group.fogIndices[1] = read<uint8_t>(groupData, mogpOffset);
group.fogIndices[2] = read<uint8_t>(groupData, mogpOffset);
group.fogIndices[3] = read<uint8_t>(groupData, mogpOffset);
group.liquidType = read<uint32_t>(groupData, mogpOffset);
// Skip to end of 68-byte header
mogpOffset = offset + 68;