From a2ed295f1f47d407749662db361ae372d90b6ee1 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Wed, 16 Aug 2023 00:09:20 +0300 Subject: [PATCH] Update ESM4 LTEX loading Load grasses into a list Fix FO4 loading Load Havok parameters for FNV --- components/esm4/loadltex.cpp | 27 +++++++++++---------------- components/esm4/loadltex.hpp | 4 ++-- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/components/esm4/loadltex.cpp b/components/esm4/loadltex.cpp index 55409c75ae..b6f083dd03 100644 --- a/components/esm4/loadltex.cpp +++ b/components/esm4/loadltex.cpp @@ -35,8 +35,6 @@ void ESM4::LandTexture::load(ESM4::Reader& reader) { mId = reader.getFormIdFromHeader(); mFlags = reader.hdr().record.flags; - std::uint32_t esmVer = reader.esmVersion(); - bool isFONV = esmVer == ESM::VER_132 || esmVer == ESM::VER_133 || esmVer == ESM::VER_134; while (reader.getSubRecordHeader()) { @@ -48,25 +46,22 @@ void ESM4::LandTexture::load(ESM4::Reader& reader) break; case ESM4::SUB_HNAM: { - if (isFONV) + // TES5+ + if (subHdr.dataSize == 2) { - reader.skipSubRecordData(); // FIXME: skip FONV for now - break; + reader.get(mHavokFriction); + reader.get(mHavokRestitution); } - - if ((reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170) - && subHdr.dataSize == 2) // FO3 is VER_094 but dataSize 3 + // TES4, FO3, FNV + else if (subHdr.dataSize == 3) { + reader.get(mHavokMaterial); reader.get(mHavokFriction); reader.get(mHavokRestitution); } else { - if (subHdr.dataSize != 3) - throw std::runtime_error("LTEX unexpected HNAM size, expected 3"); - reader.get(mHavokMaterial); - reader.get(mHavokFriction); - reader.get(mHavokRestitution); + reader.skipSubRecordData(); } break; } @@ -77,14 +72,14 @@ void ESM4::LandTexture::load(ESM4::Reader& reader) reader.get(mTextureSpecular); break; case ESM4::SUB_GNAM: - reader.getFormId(mGrass); + reader.getFormId(mGrass.emplace_back()); break; case ESM4::SUB_TNAM: reader.getFormId(mTexture); - break; // TES5 only + break; // TES5, FO4 case ESM4::SUB_MNAM: reader.getFormId(mMaterial); - break; // TES5 only + break; // TES5, FO4 default: throw std::runtime_error("ESM4::LTEX::load - Unknown subrecord " + ESM::printName(subHdr.typeId)); } diff --git a/components/esm4/loadltex.hpp b/components/esm4/loadltex.hpp index 5fea61d0d0..bed5887f5c 100644 --- a/components/esm4/loadltex.hpp +++ b/components/esm4/loadltex.hpp @@ -49,14 +49,14 @@ namespace ESM4 std::uint8_t mHavokRestitution; std::uint8_t mTextureSpecular; // default 30 - ESM::FormId mGrass; + std::vector mGrass; // ------ TES4 only ----- std::string mTextureFile; std::uint8_t mHavokMaterial; - // ------ TES5 only ----- + // ------ TES5, FO4 ----- ESM::FormId mTexture; ESM::FormId mMaterial;