00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include "PositionTimeTrack.h"
00013
#include <OpenCAL/KeyFrameSystem.h>
00014
using namespace OpenCAL;
00015
00016
using namespace std;
00017
00018
00019
00020
00021
00022
00023 PositionTimeTrack::PositionTimeTrack(
KeyFrameSystem *keyFrameSystem, Vector3 *position)
00024 :
TimeTrack(keyFrameSystem), m_position(position)
00025 {
00026 }
00027
00028 PositionTimeTrack::~PositionTimeTrack()
00029 {
00030 }
00031
00032
00033
00034
00035
00036
00037
void PositionTimeTrack::addKeyFrame(
float time,
const Vector3 &value)
00038 {
00039 m_keyFrames[time] = value;
00040
00041
if(time > m_length)
00042 m_length = time;
00043 }
00044
00045
void PositionTimeTrack::deleteKeyFrame(
float time)
00046 {
00047 KeyFrameMap::iterator it;
00048
for(it = m_keyFrames.begin(); it != m_keyFrames.end(); ++it)
00049
if(it->first == time)
00050 {
00051 m_keyFrames.erase(it);
00052
if(time == m_length)
00053
if(m_keyFrames.size() == 0)
00054 m_length = 0.0f;
00055
else
00056 m_length = m_keyFrames.rbegin()->first;
00057
return;
00058 }
00059 }
00060
00061
void PositionTimeTrack::apply()
00062 {
00063
float time = applySpeed();
00064
00065 KeyFrameMap::iterator it = m_keyFrames.begin();
00066
while(it != m_keyFrames.end() && it->first < time)
00067 ++it;
00068
00069
if(it == m_keyFrames.end())
return;
00070
00071
00072
float time2 = it->first;
00073
const Vector3 &value2 = it->second;
00074 --it;
00075
float time1 = it->first;
00076
const Vector3 &value1 = it->second;
00077
00078
float u = (time - time1) / (time2 - time1);
00079
00080 *m_position = value1.blended(u, value2);
00081 }