pose.cpp 1.37 KB
Newer Older
TheNumbat's avatar
TheNumbat committed
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

#include "pose.h"

Mat4 Pose::transform() const {
	return Mat4::translate(pos) * 
		   rotation_mat() *
		   Mat4::scale(scale);
}

Mat4 Pose::rotation_mat() const {
	return Mat4::euler(euler);
}

Quat Pose::rotation_quat() const {
	return Quat::euler(euler);
}

bool Pose::valid() const {
	return pos.valid() && euler.valid() && scale.valid();
}

void Pose::clamp_euler() {
	if(!valid()) return;
	while(euler.x < 0) euler.x += 360.0f;
	while(euler.x >= 360.0f) euler.x -= 360.0f;
	while(euler.y < 0) euler.y += 360.0f;
	while(euler.y >= 360.0f) euler.y -= 360.0f;
	while(euler.z < 0) euler.z += 360.0f;
	while(euler.z >= 360.0f) euler.z -= 360.0f;
}

Pose Pose::rotated(Vec3 angles) {
	return Pose{Vec3{}, angles, Vec3{1.0f, 1.0f, 1.0f}};
}

Pose Pose::moved(Vec3 t) {
	return Pose{t, Vec3{}, Vec3{1.0f, 1.0f, 1.0f}};
}

Pose Pose::scaled(Vec3 s) {
	return Pose{Vec3{}, Vec3{}, s};
}

Pose Pose::id() {
	return Pose{Vec3{},Vec3{},Vec3{1.0f, 1.0f, 1.0f}};
}

bool operator==(const Pose& l, const Pose& r) {
	return l.pos == r.pos && l.euler == r.euler && l.scale == r.scale;
}

bool operator!=(const Pose& l, const Pose& r) {
	return l.pos != r.pos || l.euler != r.euler || l.scale != r.scale;
}

Pose Anim_Pose::at(float t) const {
	auto [p, r, s] = splines.at(t);
	return Pose{p, r.to_euler(), s};
}

void Anim_Pose::set(float t, Pose p) {
	splines.set(t, p.pos, Quat::euler(p.euler), p.scale);
}