1 #include <IO/AssimpLoader/AssimpAnimationDataLoader.hpp>
3 #include <assimp/scene.h>
6 #include <Core/Animation/KeyFramedValue.hpp>
7 #include <Core/Animation/KeyFramedValueInterpolators.hpp>
8 #include <Core/Asset/AnimationData.hpp>
9 #include <Core/Math/Math.hpp>
10 #include <Core/Utils/Log.hpp>
12 #include <IO/AssimpLoader/AssimpWrapper.hpp>
17 using namespace Core::Utils;
18 using namespace Core::Animation;
19 using namespace Core::Asset;
30 std::vector<std::unique_ptr<AnimationData>>& data ) {
33 if ( scene ==
nullptr ) {
34 LOG( logDEBUG ) <<
"AssimpAnimationDataLoader : scene is nullptr.";
39 LOG( logDEBUG ) <<
"AssimpAnimationDataLoader : scene has no animation.";
44 LOG( logDEBUG ) <<
"File contains animation.";
45 LOG( logDEBUG ) <<
"Animation Loading begin...";
50 if ( m_verbose ) { LOG( logDEBUG ) <<
"Animation Loading end.\n"; }
59 if ( scene->HasAnimations() ) {
return scene->mNumAnimations; }
65 data->
setName( assimpToCore( anim->mName ) );
70 const auto tick = Scalar( anim->mTicksPerSecond );
71 const auto duration = Scalar( anim->mDuration );
81 dt = Scalar( 1.0 ) / tick;
82 time.
setEnd( dt * duration );
91 std::vector<std::unique_ptr<AnimationData>>& data )
const {
94 for ( uint i = 0; i < size; ++i ) {
95 aiAnimation* anim = scene->mAnimations[i];
101 data[i].reset( animData );
107 const uint size = anim->mNumChannels;
109 std::vector<HandleAnimation> keyFrame( size );
110 for ( uint i = 0; i < size; ++i ) {
112 time.
extends( keyFrame[i].m_animationTime );
121 const uint T_size = node->mNumPositionKeys;
122 const uint R_size = node->mNumRotationKeys;
123 const uint S_size = node->mNumScalingKeys;
124 data.
m_name = assimpToCore( node->mNodeName );
127 if ( T_size == 0 && R_size == 0 && S_size == 0 ) {
return; }
130 std::set<AnimationTime::Time> keyFrame;
134 keyFrame.insert( time + timeOffset );
136 assimpToCore( node->mPositionKeys[0].mValue ) );
137 time = Scalar( node->mRotationKeys[0].mTime );
138 keyFrame.insert( time );
140 assimpToCore( node->mRotationKeys[0].mValue ) );
141 time = Scalar( node->mScalingKeys[0].mTime );
142 keyFrame.insert( time );
144 assimpToCore( node->mScalingKeys[0].mValue ) );
147 for ( uint i = 1; i < T_size; ++i ) {
148 time = Scalar( node->mPositionKeys[i].mTime ) + timeOffset;
149 tr.
insertKeyFrame( time, assimpToCore( node->mPositionKeys[i].mValue ) );
150 keyFrame.insert( time );
153 for ( uint i = 1; i < R_size; ++i ) {
154 time = Scalar( node->mRotationKeys[i].mTime ) + timeOffset;
155 rot.
insertKeyFrame( time, assimpToCore( node->mRotationKeys[i].mValue ) );
156 keyFrame.insert( time );
159 for ( uint i = 1; i < S_size; ++i ) {
160 time = Scalar( node->mScalingKeys[i].mTime ) + timeOffset;
161 s.
insertKeyFrame( time, assimpToCore( node->mScalingKeys[i].mValue ) );
162 keyFrame.insert( time );
167 for (
const auto& t : keyFrame ) {
169 T.fromPositionOrientationScale( tr.
at( t, linearInterpolate<Core::Vector3> ),
170 rot.
at( t, linearInterpolate<Core::Quaternion> ),
171 s.
at( t, linearInterpolate<Core::Vector3> ) );
void insertKeyFrame(const Scalar &t, const VALUE_TYPE &frame)
VALUE_TYPE at(const Scalar &t, const Interpolator &interpolator) const
bool removeKeyFrame(size_t i) override
void setHandleData(const std::vector< HandleAnimation > &frameList)
AnimationTime::Time getTimeStep() const
const AnimationTime & getTime() const
void setName(const std::string &name)
void setTimeStep(const AnimationTime::Time &delta)
void setTime(const AnimationTime &time)
void setStart(const Time &start)
void extends(const Time &t)
void setEnd(const Time &end)
~AssimpAnimationDataLoader() override
DESTRUCTOR.
void fetchTime(const aiAnimation *anim, Core::Asset::AnimationData *data) const
TIME.
void fetchHandleAnimation(aiNodeAnim *node, Core::Asset::HandleAnimation &data, const Core::Asset::AnimationTime::Time dt) const
bool sceneHasAnimation(const aiScene *scene) const
QUERY.
uint sceneAnimationSize(const aiScene *scene) const
AssimpAnimationDataLoader(const bool VERBOSE_MODE=false)
CONSTRUCTOR.
void fetchAnimation(const aiAnimation *anim, Core::Asset::AnimationData *data) const
void loadData(const aiScene *scene, std::vector< std::unique_ptr< Core::Asset::AnimationData >> &data) override
LOADING.
void fetchName(const aiAnimation *anim, Core::Asset::AnimationData *data) const
NAME.
void loadAnimationData(const aiScene *scene, std::vector< std::unique_ptr< Core::Asset::AnimationData >> &data) const
KEY FRAME.
std::enable_if<!std::numeric_limits< T >::is_integer, bool >::type areApproxEqual(T x, T y, T espilonBoostFactor=T(10))
Compare two numbers such that |x-y| < espilon*epsilonBoostFactor.
std::string m_name
The Handle's name.
AnimationTime m_animationTime
The AnimationTime for the Handle.
Core::Animation::KeyFramedValue< Transform > m_anim
The list of KeyFramed transforms applied to the Handle.