Ironforge Great Forge lava, magma water rendering, LavaSteam particle effects

- Add magma/slime rendering path to water shader (fbm noise, crust/molten/core coloring)
- Fix WMO liquid height filter rejecting high-altitude zones like Ironforge (Z>300)
- Allow interior WMO magma/slime MLIQ groups to load (skip only water/ocean)
- Mark LAVASTEAM.m2 as spell effect for proper additive blend, hide emission mesh
- Add isLavaModel flag for M2 ForgeLava/LavaPots UV scroll fallback
- Add isLava material detection in WMO renderer for lava texture UV animation
- Fix WMO material UBO colors for magma (was blue, now orange-red)
This commit is contained in:
Kelsi 2026-03-07 00:48:04 -08:00
parent 2c5b7cd368
commit a24fe4cc45
10 changed files with 158 additions and 12 deletions

View file

@ -835,10 +835,24 @@ bool TerrainManager::advanceFinalization(FinalizingTile& ft) {
modelMatrix = glm::rotate(modelMatrix, wmoReady.rotation.z, glm::vec3(0.0f, 0.0f, 1.0f));
modelMatrix = glm::rotate(modelMatrix, wmoReady.rotation.y, glm::vec3(0.0f, 1.0f, 0.0f));
modelMatrix = glm::rotate(modelMatrix, wmoReady.rotation.x, glm::vec3(1.0f, 0.0f, 0.0f));
for (const auto& group : wmoReady.model.groups) {
for (size_t gi = 0; gi < wmoReady.model.groups.size(); gi++) {
const auto& group = wmoReady.model.groups[gi];
if (!group.liquid.hasLiquid()) continue;
// Skip interior groups — their liquid is for indoor areas
if (group.flags & 0x2000) continue;
uint16_t lt = group.liquid.materialId;
uint8_t basicType = (lt == 0) ? 0 : ((lt - 1) % 4);
bool isInterior = (group.flags & 0x2000) != 0;
LOG_WARNING("WMO MLIQ group", gi, ": flags=0x", std::hex, group.flags, std::dec,
" materialId=", lt, " basicType=", (int)basicType,
" interior=", isInterior ? "Y" : "N",
" xVerts=", group.liquid.xVerts, " yVerts=", group.liquid.yVerts);
// Skip interior water/ocean but keep magma/slime (e.g. Ironforge lava)
if (isInterior) {
if (basicType < 2) {
LOG_WARNING(" -> SKIPPED (interior water/ocean)");
continue;
}
LOG_WARNING(" -> LOADING (interior magma/slime)");
}
waterRenderer->loadFromWMO(group.liquid, modelMatrix, wmoInstId);
loadedLiquids++;
}