From 5b8f574be3b49d0278bdb0d67010abe0e7a96f7b Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Wed, 6 Sep 2023 00:32:04 +0300 Subject: [PATCH] Update keygroup/morph loading --- components/nif/nifkey.hpp | 53 +++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/components/nif/nifkey.hpp b/components/nif/nifkey.hpp index 8f0e54de0d..bbd06cb048 100644 --- a/components/nif/nifkey.hpp +++ b/components/nif/nifkey.hpp @@ -49,7 +49,9 @@ namespace Nif using ValueType = T; using KeyType = KeyT; - unsigned int mInterpolationType = InterpolationType_Unknown; + std::string mFrameName; + float mLegacyWeight; + uint32_t mInterpolationType = InterpolationType_Unknown; MapType mKeys; // Read in a KeyGroup (see http://niftools.sourceforge.net/doc/nif/NiKeyframeData.html) @@ -57,21 +59,25 @@ namespace Nif { assert(nif); - if (morph && nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 106)) - nif->getString(); // Frame name - - if (morph && nif->getVersion() > NIFStream::generateVersion(10, 1, 0, 0)) + if (morph) { - if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 104) - && nif->getVersion() <= NIFStream::generateVersion(20, 1, 0, 2) && nif->getBethVersion() < 10) - nif->getFloat(); // Legacy weight - return; + if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 106)) + nif->read(mFrameName); + + if (nif->getVersion() > NIFStream::generateVersion(10, 1, 0, 0)) + { + if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 104) + && nif->getVersion() <= NIFStream::generateVersion(20, 1, 0, 2) && nif->getBethVersion() < 10) + nif->read(mLegacyWeight); + return; + } } - size_t count = nif->getUInt(); + uint32_t count; + nif->read(count); if (count != 0 || morph) - mInterpolationType = nif->getUInt(); + nif->read(mInterpolationType); KeyType key = {}; @@ -79,7 +85,8 @@ namespace Nif { for (size_t i = 0; i < count; i++) { - float time = nif->getFloat(); + float time; + nif->read(time); readValue(*nif, key); mKeys[time] = key; } @@ -88,7 +95,8 @@ namespace Nif { for (size_t i = 0; i < count; i++) { - float time = nif->getFloat(); + float time; + nif->read(time); readQuadratic(*nif, key); mKeys[time] = key; } @@ -97,7 +105,8 @@ namespace Nif { for (size_t i = 0; i < count; i++) { - float time = nif->getFloat(); + float time; + nif->read(time); readTBC(*nif, key); mKeys[time] = key; } @@ -134,16 +143,16 @@ namespace Nif static void readTBC(NIFStream& nif, KeyT& key) { readValue(nif, key); - /*key.mTension = */ nif.getFloat(); - /*key.mBias = */ nif.getFloat(); - /*key.mContinuity = */ nif.getFloat(); + /*key.mTension = */ nif.get(); + /*key.mBias = */ nif.get(); + /*key.mContinuity = */ nif.get(); } }; - using FloatKeyMap = KeyMapT; - using Vector3KeyMap = KeyMapT; - using Vector4KeyMap = KeyMapT; - using QuaternionKeyMap = KeyMapT; - using ByteKeyMap = KeyMapT; + using FloatKeyMap = KeyMapT>; + using Vector3KeyMap = KeyMapT>; + using Vector4KeyMap = KeyMapT>; + using QuaternionKeyMap = KeyMapT>; + using ByteKeyMap = KeyMapT>; using FloatKeyMapPtr = std::shared_ptr; using Vector3KeyMapPtr = std::shared_ptr;