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:
parent
6d82f8b00d
commit
19d1f6f3f5
7 changed files with 38 additions and 108 deletions
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -528,7 +528,7 @@ namespace Nif
|
|||
|
||||
void NiBoolData::read(NIFStream* nif)
|
||||
{
|
||||
mKeyList = std::make_shared<ByteKeyMap>();
|
||||
mKeyList = std::make_shared<BoolKeyMap>();
|
||||
mKeyList->read(nif);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue