pose.cpp 1.44 KB
Newer Older
TheNumbat's avatar
TheNumbat committed
1
2
3

#include "pose.h"

TheNumbat's avatar
TheNumbat committed
4
Mat4 Pose::transform() const { return Mat4::translate(pos) * rotation_mat() * Mat4::scale(scale); }
TheNumbat's avatar
TheNumbat committed
5

TheNumbat's avatar
TheNumbat committed
6
Mat4 Pose::rotation_mat() const { return Mat4::euler(euler); }
TheNumbat's avatar
TheNumbat committed
7

TheNumbat's avatar
TheNumbat committed
8
Quat Pose::rotation_quat() const { return Quat::euler(euler); }
TheNumbat's avatar
TheNumbat committed
9

TheNumbat's avatar
TheNumbat committed
10
bool Pose::valid() const { return pos.valid() && euler.valid() && scale.valid(); }
TheNumbat's avatar
TheNumbat committed
11
12

void Pose::clamp_euler() {
TheNumbat's avatar
TheNumbat committed
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    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;
TheNumbat's avatar
TheNumbat committed
27
28
}

TheNumbat's avatar
TheNumbat committed
29
Pose Pose::rotated(Vec3 angles) { return Pose{Vec3{}, angles, Vec3{1.0f, 1.0f, 1.0f}}; }
TheNumbat's avatar
TheNumbat committed
30

TheNumbat's avatar
TheNumbat committed
31
Pose Pose::moved(Vec3 t) { return Pose{t, Vec3{}, Vec3{1.0f, 1.0f, 1.0f}}; }
TheNumbat's avatar
TheNumbat committed
32

TheNumbat's avatar
TheNumbat committed
33
Pose Pose::scaled(Vec3 s) { return Pose{Vec3{}, Vec3{}, s}; }
TheNumbat's avatar
TheNumbat committed
34

TheNumbat's avatar
TheNumbat committed
35
Pose Pose::id() { return Pose{Vec3{}, Vec3{}, Vec3{1.0f, 1.0f, 1.0f}}; }
TheNumbat's avatar
TheNumbat committed
36

TheNumbat's avatar
TheNumbat committed
37
38
bool operator==(const Pose &l, const Pose &r) {
    return l.pos == r.pos && l.euler == r.euler && l.scale == r.scale;
TheNumbat's avatar
TheNumbat committed
39
40
}

TheNumbat's avatar
TheNumbat committed
41
42
bool operator!=(const Pose &l, const Pose &r) {
    return l.pos != r.pos || l.euler != r.euler || l.scale != r.scale;
TheNumbat's avatar
TheNumbat committed
43
44
45
}

Pose Anim_Pose::at(float t) const {
TheNumbat's avatar
TheNumbat committed
46
47
    auto [p, r, s] = splines.at(t);
    return Pose{p, r.to_euler(), s};
TheNumbat's avatar
TheNumbat committed
48
49
}

TheNumbat's avatar
TheNumbat committed
50
void Anim_Pose::set(float t, Pose p) { splines.set(t, p.pos, Quat::euler(p.euler), p.scale); }