diff --git a/components/nif/controller.cpp b/components/nif/controller.cpp index 7d6706aeae..7a8bb31152 100644 --- a/components/nif/controller.cpp +++ b/components/nif/controller.cpp @@ -470,61 +470,6 @@ namespace Nif mObjectPalette.post(nif); } - void NiPoint3Interpolator::read(NIFStream* nif) - { - defaultVal = nif->getVector3(); - data.read(nif); - } - - void NiPoint3Interpolator::post(Reader& nif) - { - data.post(nif); - } - - void NiBoolInterpolator::read(NIFStream* nif) - { - defaultVal = nif->getBoolean(); - data.read(nif); - } - - void NiBoolInterpolator::post(Reader& nif) - { - data.post(nif); - } - - void NiFloatInterpolator::read(NIFStream* nif) - { - defaultVal = nif->getFloat(); - data.read(nif); - } - - void NiFloatInterpolator::post(Reader& nif) - { - data.post(nif); - } - - void NiTransformInterpolator::read(NIFStream* nif) - { - nif->read(mDefaultTransform); - mData.read(nif); - } - - void NiTransformInterpolator::post(Reader& nif) - { - mData.post(nif); - } - - void NiColorInterpolator::read(NIFStream* nif) - { - defaultVal = nif->getVector4(); - data.read(nif); - } - - void NiColorInterpolator::post(Reader& nif) - { - data.post(nif); - } - void NiBlendInterpolator::read(NIFStream* nif) { if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 112)) diff --git a/components/nif/controller.hpp b/components/nif/controller.hpp index 24d5b17465..1a6847a5b7 100644 --- a/components/nif/controller.hpp +++ b/components/nif/controller.hpp @@ -318,46 +318,29 @@ namespace Nif { }; - struct NiPoint3Interpolator : public NiInterpolator + template + struct TypedNiInterpolator : public NiInterpolator { - osg::Vec3f defaultVal; - NiPosDataPtr data; - void read(NIFStream* nif) override; - void post(Reader& nif) override; + T mDefaultValue; + DataPtr mData; + + void read(NIFStream* nif) override + { + nif->read(mDefaultValue); + mData.read(nif); + } + + void post(Reader& nif) override + { + mData.post(nif); + } }; - struct NiBoolInterpolator : public NiInterpolator - { - char defaultVal; - NiBoolDataPtr data; - void read(NIFStream* nif) override; - void post(Reader& nif) override; - }; - - struct NiFloatInterpolator : public NiInterpolator - { - float defaultVal; - NiFloatDataPtr data; - void read(NIFStream* nif) override; - void post(Reader& nif) override; - }; - - struct NiTransformInterpolator : public NiInterpolator - { - NiQuatTransform mDefaultTransform; - NiKeyframeDataPtr mData; - - void read(NIFStream* nif) override; - void post(Reader& nif) override; - }; - - struct NiColorInterpolator : public NiInterpolator - { - osg::Vec4f defaultVal; - NiColorDataPtr data; - void read(NIFStream* nif) override; - void post(Reader& nif) override; - }; + using NiPoint3Interpolator = TypedNiInterpolator; + using NiBoolInterpolator = TypedNiInterpolator; + using NiFloatInterpolator = TypedNiInterpolator; + using NiTransformInterpolator = TypedNiInterpolator; + using NiColorInterpolator = TypedNiInterpolator; // Abstract struct NiBlendInterpolator : public NiInterpolator diff --git a/components/nif/data.cpp b/components/nif/data.cpp index a07f66d43f..528256c49b 100644 --- a/components/nif/data.cpp +++ b/components/nif/data.cpp @@ -528,7 +528,7 @@ namespace Nif void NiBoolData::read(NIFStream* nif) { - mKeyList = std::make_shared(); + mKeyList = std::make_shared(); mKeyList->read(nif); } diff --git a/components/nif/data.hpp b/components/nif/data.hpp index 849cbde7bd..6ec09c2f42 100644 --- a/components/nif/data.hpp +++ b/components/nif/data.hpp @@ -219,7 +219,7 @@ namespace Nif struct NiVisData : public Record { - // TODO: investigate possible use of ByteKeyMap + // TODO: investigate possible use of BoolKeyMap std::shared_ptr> mKeys; void read(NIFStream* nif) override; @@ -357,7 +357,8 @@ namespace Nif struct NiBoolData : public Record { - ByteKeyMapPtr mKeyList; + BoolKeyMapPtr mKeyList; + void read(NIFStream* nif) override; }; diff --git a/components/nif/nifkey.hpp b/components/nif/nifkey.hpp index bbd06cb048..604cf92c33 100644 --- a/components/nif/nifkey.hpp +++ b/components/nif/nifkey.hpp @@ -152,13 +152,13 @@ namespace Nif using Vector3KeyMap = KeyMapT>; using Vector4KeyMap = KeyMapT>; using QuaternionKeyMap = KeyMapT>; - using ByteKeyMap = KeyMapT>; + using BoolKeyMap = KeyMapT>; using FloatKeyMapPtr = std::shared_ptr; using Vector3KeyMapPtr = std::shared_ptr; using Vector4KeyMapPtr = std::shared_ptr; using QuaternionKeyMapPtr = std::shared_ptr; - using ByteKeyMapPtr = std::shared_ptr; + using BoolKeyMapPtr = std::shared_ptr; } // Namespace #endif //#ifndef OPENMW_COMPONENTS_NIF_NIFKEY_HPP diff --git a/components/nifosg/controller.cpp b/components/nifosg/controller.cpp index 88a88f46be..018b650dbd 100644 --- a/components/nifosg/controller.cpp +++ b/components/nifosg/controller.cpp @@ -90,7 +90,7 @@ namespace NifOsg { const Nif::NiTransformInterpolator* interp = static_cast(keyctrl->mInterpolator.getPtr()); - const Nif::NiQuatTransform& defaultTransform = interp->mDefaultTransform; + const Nif::NiQuatTransform& defaultTransform = interp->mDefaultValue; if (!interp->mData.empty()) { mRotations = QuaternionInterpolator(interp->mData->mRotations, defaultTransform.mRotation); @@ -318,9 +318,10 @@ namespace NifOsg { if (!ctrl->mInterpolator.empty()) { - if (ctrl->mInterpolator->recType == Nif::RC_NiBoolInterpolator) - mInterpolator - = ByteInterpolator(static_cast(ctrl->mInterpolator.getPtr())); + if (ctrl->mInterpolator->recType != Nif::RC_NiBoolInterpolator) + return; + + mInterpolator = { static_cast(ctrl->mInterpolator.getPtr()) }; } else if (!ctrl->mData.empty()) mData = ctrl->mData->mKeys; diff --git a/components/nifosg/controller.hpp b/components/nifosg/controller.hpp index 1025f1988e..613aa7dc16 100644 --- a/components/nifosg/controller.hpp +++ b/components/nifosg/controller.hpp @@ -66,15 +66,15 @@ namespace NifOsg typename = std::enable_if_t, std::is_same, std::is_same, - std::is_same, std::is_same>, - std::is_same>, + std::is_same>, + std::is_same>, T>> ValueInterpolator(const T* interpolator) - : mDefaultVal(interpolator->defaultVal) + : mDefaultVal(interpolator->mDefaultValue) { - if (interpolator->data.empty()) + if (interpolator->mData.empty()) return; - mKeys = interpolator->data->mKeyList; + mKeys = interpolator->mData->mKeyList; if (mKeys) { mLastLowKey = mKeys->mKeys.end(); @@ -182,7 +182,7 @@ namespace NifOsg using FloatInterpolator = ValueInterpolator; using Vec3Interpolator = ValueInterpolator; using Vec4Interpolator = ValueInterpolator; - using ByteInterpolator = ValueInterpolator; + using BoolInterpolator = ValueInterpolator; class ControllerFunction : public SceneUtil::ControllerFunction { @@ -283,7 +283,7 @@ namespace NifOsg { private: std::shared_ptr> mData; - ByteInterpolator mInterpolator; + BoolInterpolator mInterpolator; unsigned int mMask{ 0u }; bool calculate(float time) const;