-
Notifications
You must be signed in to change notification settings - Fork 0
/
KeyframeNode.cpp
110 lines (89 loc) · 2.32 KB
/
KeyframeNode.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
108
109
110
#include "KeyframeNode.hpp"
#include "cs488-framework/MathUtils.hpp"
double linear(double x) { return x; }
double easeInQuad(double x) { return x * x; }
double easeOutQuad(double x) { return 1 - (1 - x) * (1 - x); }
double easeInOutQuad(double x) { return x <= 0.5 ? 2 * x * x : 1 - 2 * (1 - x) * (1 - x); }
const EasingFunction easings[]
{
linear,
easeInQuad,
easeOutQuad,
easeInOutQuad
};
KeyframeNode::KeyframeNode(
const std::string& name,
double startTime,
double endTime,
uint easing)
: SceneNode(name)
, m_startTime(startTime)
, m_endTime(endTime)
, m_easing(easings[easing])
, m_translation(0)
, m_rotation(0)
, m_scale(1)
{
m_nodeType = NodeType::KeyframeNode;
}
KeyframeNode::~KeyframeNode() {
}
// void KeyframeNode::setStartTime(double t)
// {
// m_startTime = t;
// }
// void KeyframeNode::setEndTime(double t)
// {
// m_endTime = t;
// }
// void KeyframeNode::setEasing(uint index)
// {
// m_easing = easings[index];
// }
// const glm::mat4& KeyframeNode::get_transform(double t) const
// {
// double s = m_easing(glm::clamp(t, 0.0, 1.0));
// glm::mat4 trans =
// glm::translate(m_translation * s)
// * glm::rotate(m_rotation.x * s, glm::dvec3(1, 0, 0))
// * glm::rotate(m_rotation.y * s, glm::dvec3(0, 1, 0))
// * glm::rotate(m_rotation.z * s, glm::dvec3(0, 0, 1))
// * glm::scale(m_scale * s);
// return trans;
// }
void KeyframeNode::translate(const glm::vec3& amount)
{
m_translation += amount;
}
void KeyframeNode::rotate(char axis, float angle)
{
switch (axis) {
case 'x':
m_rotation.x += degreesToRadians(angle);
break;
case 'y':
m_rotation.y += degreesToRadians(angle);
break;
case 'z':
m_rotation.z += degreesToRadians(angle);
break;
}
}
void KeyframeNode::scale(const glm::vec3& amount)
{
m_scale *= amount;
}
void KeyframeNode::updateTrans(double time)
{
if (time == m_currentTime)
return;
m_currentTime = time;
double t = (time - m_startTime) / (m_endTime - m_startTime);
double s = m_easing(glm::clamp(t, 0.0, 1.0));
trans = glm::translate(s * m_translation)
* glm::rotate(s * m_rotation.x, glm::dvec3(1.0, 0.0, 0.0))
* glm::rotate(s * m_rotation.y, glm::dvec3(0.0, 1.0, 0.0))
* glm::rotate(s * m_rotation.z, glm::dvec3(0.0, 0.0, 1.0))
* glm::scale(glm::dvec3(1.0) + s * (m_scale - glm::dvec3(1.0)));
invtrans = glm::inverse(trans);
}