#include <cmath>
#include <msp/core/maputils.h>
#include <msp/datafile/collection.h>
-#include <msp/time/units.h>
#include "animation.h"
#include "animationeventobserver.h"
#include "armature.h"
void Animation::set_armature(const Armature &a)
{
+ if(!keyframes.empty() && &a!=armature)
+ throw invalid_operation("Animation::set_armature");
armature = &a;
}
throw invalid_argument("Animation::add_keyframe");
if(!keyframes.empty() && t<keyframes.back().time)
throw invalid_argument("Animation::add_keyframe");
+ if(kf->get_pose() && armature && kf->get_pose()->get_armature()!=armature)
+ throw invalid_argument("Animation::add_keyframe");
bool realloc = (keyframes.size()>=keyframes.capacity());
+ if(kf->get_pose() && !armature)
+ armature = kf->get_pose()->get_armature();
+
keyframes.push_back(TimedKeyFrame());
TimedKeyFrame &tkf = keyframes.back();
tkf.time = t;
if(realloc)
{
for(unsigned i=1; i<keyframes.size(); ++i)
- keyframes[i].prev = &keyframes[i-1];
+ if(keyframes[i].prev)
+ keyframes[i].prev = &keyframes[i-1];
}
- else if(keyframes.size()>1)
+ if(keyframes.size()>1 && t>(&tkf-1)->time)
tkf.prev = &tkf-1;
prepare_keyframe(tkf);
event_iter(animation->events.begin()),
x(0),
end(false)
-{ }
+{
+ if(iter==animation->keyframes.end())
+ throw invalid_argument("Animation::Iterator::Iterator");
+}
Animation::Iterator &Animation::Iterator::operator+=(const Time::TimeDelta &t)
{