diff --git a/components/nif/data.cpp b/components/nif/data.cpp index fac41518c9..fd94c5753a 100644 --- a/components/nif/data.cpp +++ b/components/nif/data.cpp @@ -484,4 +484,27 @@ namespace Nif mKeyList->read(nif); } + void BSMultiBound::read(NIFStream* nif) + { + mData.read(nif); + } + + void BSMultiBound::post(Reader& nif) + { + mData.post(nif); + } + + void BSMultiBoundOBB::read(NIFStream* nif) + { + mCenter = nif->getVector3(); + mSize = nif->getVector3(); + mRotation = nif->getMatrix3(); + } + + void BSMultiBoundSphere::read(NIFStream* nif) + { + mCenter = nif->getVector3(); + mRadius = nif->getFloat(); + } + } // Namespace diff --git a/components/nif/data.hpp b/components/nif/data.hpp index bac47a87f5..96e8441639 100644 --- a/components/nif/data.hpp +++ b/components/nif/data.hpp @@ -288,5 +288,35 @@ namespace Nif void read(NIFStream* nif) override; }; + struct BSMultiBound : public Record + { + BSMultiBoundDataPtr mData; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + + // Abstract + struct BSMultiBoundData : public Record + { + }; + + struct BSMultiBoundOBB : public BSMultiBoundData + { + osg::Vec3f mCenter; + osg::Vec3f mSize; + Nif::Matrix3 mRotation; + + void read(NIFStream* nif) override; + }; + + struct BSMultiBoundSphere : public BSMultiBoundData + { + osg::Vec3f mCenter; + float mRadius; + + void read(NIFStream* nif) override; + }; + } // Namespace #endif diff --git a/components/nif/niffile.cpp b/components/nif/niffile.cpp index c9f04dcd88..6240c08655 100644 --- a/components/nif/niffile.cpp +++ b/components/nif/niffile.cpp @@ -139,6 +139,7 @@ namespace Nif { "BSFadeNode", &construct }, { "BSLeafAnimNode", &construct }, { "BSTreeNode", &construct }, + { "BSMultiBoundNode", &construct }, { "bhkBlendController", &construct }, { "NiFloatInterpolator", &construct }, { "NiBoolInterpolator", &construct }, @@ -186,6 +187,9 @@ namespace Nif &construct }, { "bhkCompressedMeshShape", &construct }, { "bhkCompressedMeshShapeData", &construct }, + { "BSMultiBound", &construct }, + { "BSMultiBoundOBB", &construct }, + { "BSMultiBoundSphere", &construct }, }; } diff --git a/components/nif/niffile.hpp b/components/nif/niffile.hpp index f2adb698d0..96534df2d3 100644 --- a/components/nif/niffile.hpp +++ b/components/nif/niffile.hpp @@ -27,6 +27,7 @@ namespace Nif enum BethVersion { BETHVER_FO3 = 34, // Fallout 3 + BETHVER_SKY = 83, // Skyrim BETHVER_FO4 = 130 // Fallout 4 }; diff --git a/components/nif/node.cpp b/components/nif/node.cpp index 1960bf3fbc..0ec1b8ab33 100644 --- a/components/nif/node.cpp +++ b/components/nif/node.cpp @@ -320,4 +320,18 @@ namespace Nif postRecordList(nif, mBones1); postRecordList(nif, mBones2); } + + void BSMultiBoundNode::read(NIFStream* nif) + { + NiNode::read(nif); + mMultiBound.read(nif); + if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_SKY) + mType = nif->getUInt(); + } + + void BSMultiBoundNode::post(Reader& nif) + { + NiNode::post(nif); + mMultiBound.post(nif); + } } diff --git a/components/nif/node.hpp b/components/nif/node.hpp index d9274be6df..8b572a8e7d 100644 --- a/components/nif/node.hpp +++ b/components/nif/node.hpp @@ -291,5 +291,14 @@ namespace Nif void post(Reader& nif) override; }; + struct BSMultiBoundNode : NiNode + { + BSMultiBoundPtr mMultiBound; + unsigned int mType{ 0 }; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + } // Namespace #endif diff --git a/components/nif/record.hpp b/components/nif/record.hpp index 0a4cf3a8b0..afd23ac21c 100644 --- a/components/nif/record.hpp +++ b/components/nif/record.hpp @@ -159,6 +159,9 @@ namespace Nif RC_NiBlendTransformInterpolator, RC_bhkCompressedMeshShape, RC_bhkCompressedMeshShapeData, + RC_BSMultiBound, + RC_BSMultiBoundOBB, + RC_BSMultiBoundSphere, }; /// Base class for all records diff --git a/components/nif/recordptr.hpp b/components/nif/recordptr.hpp index bf5c8a9ba2..7025063213 100644 --- a/components/nif/recordptr.hpp +++ b/components/nif/recordptr.hpp @@ -146,6 +146,8 @@ namespace Nif struct NiDefaultAVObjectPalette; struct NiControllerSequence; struct bhkCompressedMeshShapeData; + struct BSMultiBound; + struct BSMultiBoundData; using NodePtr = RecordPtrT; using ExtraPtr = RecordPtrT; @@ -181,6 +183,8 @@ namespace Nif using NiBlendInterpolatorPtr = RecordPtrT; using NiDefaultAVObjectPalettePtr = RecordPtrT; using bhkCompressedMeshShapeDataPtr = RecordPtrT; + using BSMultiBoundPtr = RecordPtrT; + using BSMultiBoundDataPtr = RecordPtrT; using NodeList = RecordListT; using PropertyList = RecordListT;