-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathClip.cpp
107 lines (107 loc) · 2.41 KB
/
Clip.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "Clip.h"
Clip::Clip()
{
mName = "No name given";
mStartTime = 0.0f;
mEndTime = 0.0f;
mLooping = true;
}
float Clip::Sample(Pose& outPose, float time) {
if (GetDuration() == 0.0f) {
return 0.0f;
}
time = AdjustTimeToFitRange(time);
unsigned int size = mTracks.size();
for (unsigned int i = 0; i < size; ++i)
{
unsigned int j = mTracks[i].GetId(); // Joint
Transform local = outPose.GetLocalTransform(j);
Transform animated = mTracks[i].Sample(
local, time, mLooping);
outPose.SetLocalTransform(j, animated);
}
return time;
}
float Clip::AdjustTimeToFitRange(float inTime) {
if (mLooping) {
float duration = mEndTime - mStartTime;
if (duration <= 0) { 0.0f; }
inTime = fmodf(inTime - mStartTime,
mEndTime - mStartTime);
if (inTime < 0.0f) {
inTime += mEndTime - mStartTime;
}
inTime = inTime + mStartTime;
}
else {
if (inTime < mStartTime) {
inTime = mStartTime;
}
if (inTime > mEndTime) {
inTime = mEndTime;
}
}
return inTime;
}
void Clip::RecalculateDuration() {
mStartTime = 0.0f;
mEndTime = 0.0f;
bool startSet = false;
bool endSet = false;
unsigned int tracksSize = mTracks.size();
for (unsigned int i = 0; i < tracksSize; ++i) {
if (mTracks[i].IsValid()) {
float startTime = mTracks[i].GetStartTime();
float endTime = mTracks[i].GetEndTime();
if (startTime < mStartTime || !startSet) {
mStartTime = startTime;
startSet = true;
}
if (endTime > mEndTime || !endSet) {
mEndTime = endTime;
endSet = true;
}
}
}
}
TransformTrack& Clip::operator[](unsigned int joint) {
for (int i = 0, s = mTracks.size(); i < s; ++i) {
if (mTracks[i].GetId() == joint) {
return mTracks[i];
}
}
mTracks.push_back(TransformTrack());
mTracks[mTracks.size() - 1].SetId(joint);
return mTracks[mTracks.size() - 1];
}
std::string& Clip::GetName() {
return mName;
}
unsigned int Clip::GetIdAtIndex(unsigned int index) {
return mTracks[index].GetId();
}
unsigned int Clip::Size() {
return (unsigned int)mTracks.size();
}
float Clip::GetDuration() {
return mEndTime - mStartTime;
}
float Clip::GetStartTime() {
return mStartTime;
}
float Clip::GetEndTime() {
return mEndTime;
}
bool Clip::GetLooping() {
return mLooping;
}
void Clip::SetName(const std::string& inNewName) {
mName = inNewName;
}
void Clip::SetIdAtIndex(unsigned int index, unsigned int
id) {
return mTracks[index].SetId(id);
}
void Clip::SetLooping(bool inLooping) {
mLooping = inLooping;
}