1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-06 06:45:35 +00:00

Rewrite typed NiInterpolator loading

This commit is contained in:
Alexei Kotov 2023-09-14 00:15:02 +03:00
parent 6d82f8b00d
commit 19d1f6f3f5
7 changed files with 38 additions and 108 deletions

View file

@ -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))

View file

@ -318,46 +318,29 @@ namespace Nif
{
};
struct NiPoint3Interpolator : public NiInterpolator
template<class T, class DataPtr>
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<osg::Vec3f, NiPosDataPtr>;
using NiBoolInterpolator = TypedNiInterpolator<bool, NiBoolDataPtr>;
using NiFloatInterpolator = TypedNiInterpolator<float, NiFloatDataPtr>;
using NiTransformInterpolator = TypedNiInterpolator<NiQuatTransform, NiKeyframeDataPtr>;
using NiColorInterpolator = TypedNiInterpolator<osg::Vec4f, NiColorDataPtr>;
// Abstract
struct NiBlendInterpolator : public NiInterpolator

View file

@ -528,7 +528,7 @@ namespace Nif
void NiBoolData::read(NIFStream* nif)
{
mKeyList = std::make_shared<ByteKeyMap>();
mKeyList = std::make_shared<BoolKeyMap>();
mKeyList->read(nif);
}

View file

@ -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<std::map<float, bool>> 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;
};

View file

@ -152,13 +152,13 @@ namespace Nif
using Vector3KeyMap = KeyMapT<osg::Vec3f, &NIFStream::get<osg::Vec3f>>;
using Vector4KeyMap = KeyMapT<osg::Vec4f, &NIFStream::get<osg::Vec4f>>;
using QuaternionKeyMap = KeyMapT<osg::Quat, &NIFStream::get<osg::Quat>>;
using ByteKeyMap = KeyMapT<char, &NIFStream::get<char>>;
using BoolKeyMap = KeyMapT<bool, &NIFStream::get<bool>>;
using FloatKeyMapPtr = std::shared_ptr<FloatKeyMap>;
using Vector3KeyMapPtr = std::shared_ptr<Vector3KeyMap>;
using Vector4KeyMapPtr = std::shared_ptr<Vector4KeyMap>;
using QuaternionKeyMapPtr = std::shared_ptr<QuaternionKeyMap>;
using ByteKeyMapPtr = std::shared_ptr<ByteKeyMap>;
using BoolKeyMapPtr = std::shared_ptr<BoolKeyMap>;
} // Namespace
#endif //#ifndef OPENMW_COMPONENTS_NIF_NIFKEY_HPP

View file

@ -90,7 +90,7 @@ namespace NifOsg
{
const Nif::NiTransformInterpolator* interp
= static_cast<const Nif::NiTransformInterpolator*>(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<const Nif::NiBoolInterpolator*>(ctrl->mInterpolator.getPtr()));
if (ctrl->mInterpolator->recType != Nif::RC_NiBoolInterpolator)
return;
mInterpolator = { static_cast<const Nif::NiBoolInterpolator*>(ctrl->mInterpolator.getPtr()) };
}
else if (!ctrl->mData.empty())
mData = ctrl->mData->mKeys;

View file

@ -66,15 +66,15 @@ namespace NifOsg
typename
= std::enable_if_t<std::conjunction_v<std::disjunction<std::is_same<ValueT, float>,
std::is_same<ValueT, osg::Vec3f>, std::is_same<ValueT, bool>,
std::is_same<ValueT, osg::Vec4f>, std::is_same<ValueT, char>>,
std::is_same<decltype(T::defaultVal), ValueT>>,
std::is_same<ValueT, osg::Vec4f>>,
std::is_same<decltype(T::mDefaultValue), ValueT>>,
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<Nif::FloatKeyMap>;
using Vec3Interpolator = ValueInterpolator<Nif::Vector3KeyMap>;
using Vec4Interpolator = ValueInterpolator<Nif::Vector4KeyMap>;
using ByteInterpolator = ValueInterpolator<Nif::ByteKeyMap>;
using BoolInterpolator = ValueInterpolator<Nif::BoolKeyMap>;
class ControllerFunction : public SceneUtil::ControllerFunction
{
@ -283,7 +283,7 @@ namespace NifOsg
{
private:
std::shared_ptr<std::map<float, bool>> mData;
ByteInterpolator mInterpolator;
BoolInterpolator mInterpolator;
unsigned int mMask{ 0u };
bool calculate(float time) const;