diff --git a/apps/openmw_test_suite/nif/node.hpp b/apps/openmw_test_suite/nif/node.hpp index 2d82289592..19276059c8 100644 --- a/apps/openmw_test_suite/nif/node.hpp +++ b/apps/openmw_test_suite/nif/node.hpp @@ -53,8 +53,8 @@ namespace Nif::Testing inline void init(NiSkinInstance& value) { - value.data = NiSkinDataPtr(nullptr); - value.root = NodePtr(nullptr); + value.mData = NiSkinDataPtr(nullptr); + value.mRoot = NodePtr(nullptr); } inline void init(Controller& value) diff --git a/components/nif/data.cpp b/components/nif/data.cpp index 1574462892..50501c4104 100644 --- a/components/nif/data.cpp +++ b/components/nif/data.cpp @@ -7,43 +7,6 @@ namespace Nif { - void NiSkinInstance::read(NIFStream* nif) - { - data.read(nif); - if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 101)) - partitions.read(nif); - root.read(nif); - readRecordList(nif, bones); - } - - void NiSkinInstance::post(Reader& nif) - { - data.post(nif); - partitions.post(nif); - root.post(nif); - postRecordList(nif, bones); - - if (data.empty() || root.empty()) - throw Nif::Exception("NiSkinInstance missing root or data", nif.getFilename()); - - if (bones.size() != data->bones.size()) - throw Nif::Exception("Mismatch in NiSkinData bone count", nif.getFilename()); - - for (auto& bone : bones) - { - if (bone.empty()) - throw Nif::Exception("Oops: Missing bone! Don't know how to handle this.", nif.getFilename()); - bone->setBone(); - } - } - - void BSDismemberSkinInstance::read(NIFStream* nif) - { - NiSkinInstance::read(nif); - unsigned int numPartitions = nif->getUInt(); - nif->skip(4 * numPartitions); // Body part information - } - void NiGeometryData::read(NIFStream* nif) { if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 114)) @@ -121,6 +84,7 @@ namespace Nif void NiTriBasedGeomData::read(NIFStream* nif) { NiGeometryData::read(nif); + mNumTriangles = nif->getUShort(); } @@ -174,6 +138,7 @@ namespace Nif void NiLinesData::read(NIFStream* nif) { NiGeometryData::read(nif); + size_t num = vertices.size(); std::vector flags; nif->readVector(flags, num); @@ -326,6 +291,48 @@ namespace Nif } } + void NiSkinInstance::read(NIFStream* nif) + { + mData.read(nif); + if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 101)) + mPartitions.read(nif); + mRoot.read(nif); + readRecordList(nif, mBones); + } + + void NiSkinInstance::post(Reader& nif) + { + mData.post(nif); + mPartitions.post(nif); + mRoot.post(nif); + postRecordList(nif, mBones); + + if (mData.empty() || mRoot.empty()) + throw Nif::Exception("NiSkinInstance missing root or data", nif.getFilename()); + + if (mBones.size() != mData->bones.size()) + throw Nif::Exception("Mismatch in NiSkinData bone count", nif.getFilename()); + + for (auto& bone : mBones) + { + if (bone.empty()) + throw Nif::Exception("Oops: Missing bone! Don't know how to handle this.", nif.getFilename()); + bone->setBone(); + } + } + + void BSDismemberSkinInstance::read(NIFStream* nif) + { + NiSkinInstance::read(nif); + + mParts.resize(nif->get()); + for (BodyPart& part : mParts) + { + nif->read(part.mFlags); + nif->read(part.mType); + } + } + void NiSkinData::read(NIFStream* nif) { trafo.rotation = nif->getMatrix3(); diff --git a/components/nif/data.hpp b/components/nif/data.hpp index 6f0ca25237..48d2ff0310 100644 --- a/components/nif/data.hpp +++ b/components/nif/data.hpp @@ -172,10 +172,10 @@ namespace Nif struct NiSkinInstance : public Record { - NiSkinDataPtr data; - NiSkinPartitionPtr partitions; - NodePtr root; - NodeList bones; + NiSkinDataPtr mData; + NiSkinPartitionPtr mPartitions; + NodePtr mRoot; + NodeList mBones; void read(NIFStream* nif) override; void post(Reader& nif) override; @@ -183,6 +183,14 @@ namespace Nif struct BSDismemberSkinInstance : public NiSkinInstance { + struct BodyPart + { + uint16_t mFlags; + uint16_t mType; + }; + + std::vector mParts; + void read(NIFStream* nif) override; }; diff --git a/components/nifosg/nifloader.cpp b/components/nifosg/nifloader.cpp index dde4f261e2..cf2f05a378 100644 --- a/components/nifosg/nifloader.cpp +++ b/components/nifosg/nifloader.cpp @@ -1391,14 +1391,14 @@ namespace NifOsg const Nif::NiSkinInstance* skin = niGeometry->skin.getPtr(); const Nif::NiSkinData* data = nullptr; const Nif::NiSkinPartition* partitions = nullptr; - if (!skin->data.empty()) + if (!skin->mData.empty()) { - data = skin->data.getPtr(); + data = skin->mData.getPtr(); if (!data->partitions.empty()) partitions = data->partitions.getPtr(); } - if (!partitions && !skin->partitions.empty()) - partitions = skin->partitions.getPtr(); + if (!partitions && !skin->mPartitions.empty()) + partitions = skin->mPartitions.getPtr(); hasPartitions = partitions != nullptr; if (hasPartitions) @@ -1549,9 +1549,9 @@ namespace NifOsg osg::ref_ptr map(new SceneUtil::RigGeometry::InfluenceMap); const Nif::NiSkinInstance* skin = static_cast(nifNode)->skin.getPtr(); - const Nif::NiSkinData* data = skin->data.getPtr(); - const Nif::NodeList& bones = skin->bones; - for (std::size_t i = 0, n = bones.size(); i < n; ++i) + const Nif::NiSkinData* data = skin->mData.getPtr(); + const Nif::NodeList& bones = skin->mBones; + for (std::size_t i = 0; i < bones.size(); ++i) { std::string boneName = Misc::StringUtils::lowerCase(bones[i].getPtr()->name);