summary refs log tree commit diff
path: root/src/Transform.hpp
blob: ea7f9b3ad243d991503f0fa274b865f0d0741ad4 (plain)
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
#pragma once

#include "Math/Rotation.hpp"
#include "World/Position.hpp"

namespace MC {

class Transform {
public:
    Transform() : m_scale(1) {}
    explicit Transform(Position::World position) : m_position(position), m_scale(1) {}
    Transform(Position::World position, Rotation rotation, Vector<3> scale)
        : m_position(position),
          m_rotation(rotation),
          m_scale(scale) {}

    Vector<3> forward() const;
    Vector<3> right() const;
    Vector<3> up() const;

    Position::World& position() { return m_position; }
    const Position::World& position() const { return m_position; }

    Rotation& rotation() { return m_rotation; }
    const Rotation& rotation() const { return m_rotation; }

    Vector<3>& scale() { return m_scale; }
    const Vector<3>& scale() const { return m_scale; }
private:
    Vector<3> unit_vector(Vector<3> axis) const;

    // TODO: Use a non-MC::World position class.
    // I don't want coupling between the game implementation
    // and what is essentially engine code.
    Position::World m_position;
    Rotation m_rotation;
    Vector<3> m_scale;
};

}