Files
bluflame/aiwaz/Aiwaz/AnimationManager/AnimationManager.cpp
2026-04-18 22:31:51 +02:00

163 lines
5.7 KiB
C++

#include "stdafx.h"
#include "ITimeline.h"
#include "AnimationManager.h"
AnimationManager::AnimationManager(IEngine& argEngine)
: m_Engine(argEngine)
, m_PreviousDemoTime(0.0)
, m_PreviousRealTime(0.0)
{
}
AnimationManager::~AnimationManager()
{
}
void AnimationManager::AddDemoTimeAnimation(double argBeginTime, double argEndTime, IAnimateable* argValue, unsigned int argUserData)
{
m_ForwardSortedAnimations[r_AnimationInterval(argBeginTime, argEndTime)].push_back(std::make_pair(argValue, argUserData));
m_BackwardSortedAnimations[r_AnimationInterval(argBeginTime, argEndTime)].push_back(std::make_pair(argValue, argUserData));
}
void AnimationManager::AddRealTimeAnimation(double argBeginTime, double argEndTime, IAnimateable* argValue, unsigned int argUserData)
{
m_RealTimeAnimations[r_AnimationInterval(argBeginTime, argEndTime)].push_back(std::make_pair(argValue, argUserData));
}
void AnimationManager::AddDemoTimeEvent(double argTime, IEvent* argValue, unsigned int argUserData)
{
m_DemoTimeEvents[argTime].push_back(std::make_pair(argValue, argUserData));
}
void AnimationManager::AddRealTimeEvent(double argTime, IEvent* argValue, unsigned int argUserData)
{
m_RealTimeEvents[argTime].push_back(std::make_pair(argValue, argUserData));
}
void AnimationManager::Animate()
{
ITimeline& timeline = m_Engine.get_Timeline();
double ld_DemoTime = timeline.get_DemoTime();
double ld_RealTime = timeline.get_RealTime();
// Gather all active animations, they are the ones that started before now and end after now.
// Do this for both the demo time and real time.
std::vector<std::pair<IAnimateable*, unsigned int> > lk_ActiveAnimations;
std::vector<double> lk_AnimationTimes;
// Demo time animations: Demo time can go backwards, so search from both directions
if (timeline.get_SpeedAndDirection() > 0)
{
tk_ForwardAnims::iterator lk_Iter = m_ForwardSortedAnimations.begin();
for (; lk_Iter != m_ForwardSortedAnimations.end(); ++lk_Iter)
{
if (lk_Iter->first.m_Begin <= ld_DemoTime && lk_Iter->first.m_End >= ld_DemoTime)
{
std::vector<std::pair<IAnimateable*, unsigned int> >::iterator lk_AnimIter = lk_Iter->second.begin();
for (; lk_AnimIter != lk_Iter->second.end(); ++lk_AnimIter)
{
lk_ActiveAnimations.push_back(*lk_AnimIter);
lk_AnimationTimes.push_back((ld_DemoTime - lk_Iter->first.m_Begin) / (lk_Iter->first.m_End - lk_Iter->first.m_Begin));
}
}
if (lk_Iter->first.m_Begin > ld_DemoTime)
break;
}
}
else if (timeline.get_SpeedAndDirection() < 0)
{
tk_BackwardAnims::iterator lk_Iter = m_BackwardSortedAnimations.begin();
for (; lk_Iter != m_BackwardSortedAnimations.end(); ++lk_Iter)
{
if (lk_Iter->first.m_End >= ld_DemoTime && lk_Iter->first.m_Begin <= ld_DemoTime)
{
std::vector<std::pair<IAnimateable*, unsigned int> >::iterator lk_AnimIter = lk_Iter->second.begin();
for (; lk_AnimIter != lk_Iter->second.end(); ++lk_AnimIter)
{
lk_ActiveAnimations.push_back(*lk_AnimIter);
lk_AnimationTimes.push_back((ld_DemoTime - lk_Iter->first.m_Begin) / (lk_Iter->first.m_End - lk_Iter->first.m_Begin));
}
}
if (lk_Iter->first.m_End < ld_DemoTime)
break;
}
}
// Real time animations: The time that we know doesn't allow us to travel to the past, so just check into the future:
{
tk_ForwardAnims::iterator lk_Iter = m_RealTimeAnimations.begin();
for (; lk_Iter != m_RealTimeAnimations.end(); ++lk_Iter)
{
if (lk_Iter->first.m_Begin <= ld_RealTime && lk_Iter->first.m_End >= ld_RealTime)
{
std::vector<std::pair<IAnimateable*, unsigned int> >::iterator lk_AnimIter = lk_Iter->second.begin();
for (; lk_AnimIter != lk_Iter->second.end(); ++lk_AnimIter)
{
lk_ActiveAnimations.push_back(*lk_AnimIter);
lk_AnimationTimes.push_back((ld_RealTime - lk_Iter->first.m_End) / (lk_Iter->first.m_Begin - lk_Iter->first.m_End));
}
}
if (lk_Iter->first.m_Begin > ld_RealTime)
break;
}
}
// Now that we know what animations correspond to this time, animate them!
std::vector<std::pair<IAnimateable*, unsigned int> >::iterator lk_AnimIter = lk_ActiveAnimations.begin();
std::vector<double>::iterator lk_TimeIter = lk_AnimationTimes.begin();
for (; lk_AnimIter != lk_ActiveAnimations.end(); ++lk_AnimIter, ++lk_TimeIter)
{
IAnimateable* lr_Animateable_ = lk_AnimIter->first;
lr_Animateable_->OnAnimate(*lk_TimeIter, lk_AnimIter->second);
}
// Fire all events that happened since last time:
tk_Events::iterator lk_EventIter = m_DemoTimeEvents.begin();
for (; lk_EventIter != m_DemoTimeEvents.end(); ++lk_EventIter)
{
double ld_Time = lk_EventIter->first;
std::vector<std::pair<IEvent*, unsigned int> >::iterator lk_EventVecIter = lk_EventIter->second.begin();
for (; lk_EventVecIter != lk_EventIter->second.end(); ++lk_EventVecIter)
{
IEvent* lr_Event_ = lk_EventVecIter->first;
unsigned int lui_UserData = lk_EventVecIter->second;
if (((timeline.get_SpeedAndDirection() > 0) && (ld_Time >= m_PreviousDemoTime && ld_Time <= ld_DemoTime)) ||
((timeline.get_SpeedAndDirection() < 0) && (ld_Time <= m_PreviousDemoTime && ld_Time >= ld_DemoTime)))
{
lr_Event_->OnEvent(lui_UserData);
}
}
}
lk_EventIter = m_RealTimeEvents.begin();
for (; lk_EventIter != m_RealTimeEvents.end(); ++lk_EventIter)
{
double ld_Time = lk_EventIter->first;
std::vector<std::pair<IEvent*, unsigned int> >::iterator lk_EventVecIter = lk_EventIter->second.begin();
for (; lk_EventVecIter != lk_EventIter->second.end(); ++lk_EventVecIter)
{
IEvent* lr_Event_ = lk_EventVecIter->first;
unsigned int lui_UserData = lk_EventVecIter->second;
if (ld_Time >= m_PreviousRealTime && ld_Time <= ld_RealTime)
{
lr_Event_->OnEvent(lui_UserData);
}
}
}
m_PreviousDemoTime = ld_DemoTime;
m_PreviousRealTime = ld_RealTime;
}