diff --git a/components/nif/data.cpp b/components/nif/data.cpp index 2023735252..c7f9e71fda 100644 --- a/components/nif/data.cpp +++ b/components/nif/data.cpp @@ -532,6 +532,44 @@ namespace Nif mKeyList->read(nif); } + void NiAdditionalGeometryData::read(NIFStream* nif) + { + nif->read(mNumVertices); + mBlockInfos.resize(nif->get()); + for (DataStream& info : mBlockInfos) + info.read(nif); + mBlocks.resize(nif->get()); + for (DataBlock& block : mBlocks) + block.read(nif, recType == RC_BSPackedAdditionalGeometryData); + } + + void NiAdditionalGeometryData::DataStream::read(NIFStream* nif) + { + nif->read(mType); + nif->read(mUnitSize); + nif->read(mTotalSize); + nif->read(mStride); + nif->read(mBlockIndex); + nif->read(mBlockOffset); + nif->read(mFlags); + } + + void NiAdditionalGeometryData::DataBlock::read(NIFStream* nif, bool bsPacked) + { + nif->read(mValid); + if (!mValid) + return; + nif->read(mBlockSize); + nif->readVector(mBlockOffsets, nif->get()); + nif->readVector(mDataSizes, nif->get()); + nif->readVector(mData, mDataSizes.size() * mBlockSize); + if (bsPacked) + { + nif->read(mShaderIndex); + nif->read(mTotalSize); + } + } + void BSMultiBound::read(NIFStream* nif) { mData.read(nif); diff --git a/components/nif/data.hpp b/components/nif/data.hpp index 0eb6387f89..1596579fdd 100644 --- a/components/nif/data.hpp +++ b/components/nif/data.hpp @@ -362,6 +362,41 @@ namespace Nif void read(NIFStream* nif) override; }; + struct NiAdditionalGeometryData : public Record + { + struct DataStream + { + uint32_t mType; + uint32_t mUnitSize; + uint32_t mTotalSize; + uint32_t mStride; + uint32_t mBlockIndex; + uint32_t mBlockOffset; + uint8_t mFlags; + + void read(NIFStream* nif); + }; + + struct DataBlock + { + bool mValid; + uint32_t mBlockSize; + std::vector mBlockOffsets; + std::vector mDataSizes; + std::vector mData; + uint32_t mShaderIndex; + uint32_t mTotalSize; + + void read(NIFStream* nif, bool bsPacked); + }; + + uint16_t mNumVertices; + std::vector mBlockInfos; + std::vector mBlocks; + + void read(NIFStream* nif); + }; + struct BSMultiBound : public Record { BSMultiBoundDataPtr mData; diff --git a/components/nif/niffile.cpp b/components/nif/niffile.cpp index 6201c4df44..4f1eaae257 100644 --- a/components/nif/niffile.cpp +++ b/components/nif/niffile.cpp @@ -169,11 +169,13 @@ namespace Nif { "NiVisData", &construct }, // Gamebryo + { "NiAdditionalGeometryData", &construct }, { "NiBoolData", &construct }, { "NiDefaultAVObjectPalette", &construct }, { "NiTransformData", &construct }, // Bethesda + { "BSPackedAdditionalGeometryData", &construct }, { "BSShaderTextureSet", &construct }, // DYNAMIC EFFECTS diff --git a/components/nif/record.hpp b/components/nif/record.hpp index 23bdebb7f7..8240bf4026 100644 --- a/components/nif/record.hpp +++ b/components/nif/record.hpp @@ -84,6 +84,7 @@ namespace Nif RC_BSMultiBoundAABB, RC_BSMultiBoundOBB, RC_BSMultiBoundSphere, + RC_BSPackedAdditionalGeometryData, RC_BSRefractionFirePeriodController, RC_BSRefractionStrengthController, RC_BSShaderNoLightingProperty, @@ -96,6 +97,7 @@ namespace Nif RC_DistantLODShaderProperty, RC_HairShaderProperty, RC_hkPackedNiTriStripsData, + RC_NiAdditionalGeometryData, RC_NiAlphaAccumulator, RC_NiAlphaController, RC_NiAlphaProperty,