#pragma once #include namespace charcoal { using namespace glm; class Poseable { public: // Assumes that forward, up, and right are orthogonal and normalized Poseable( const vec3& position = vec3(0.0f, 0.0f, 0.0f), const vec3& forward = vec3(0.0f, 0.0f, 1.0f), const vec3& up = vec3(0.0f, 1.0f, 0.0f), const vec3& right = vec3(1.0f, 0.0f, 0.0f) ); void reset_orientation(); void update_position(const vec3& position); // Assumes that forward, up, and right are orthogonal and normalized void update_orientation(const vec3& forward, const vec3& up, const vec3& right); void translate(const vec3& translation); void rotate(const vec3& axis, float angle); void set_orientation_matrix(const mat4& orientation_matrix) { m_orientation_matrix = orientation_matrix; } const mat4& get_orientation_matrix() const { return m_orientation_matrix; } protected: mat4 m_orientation_matrix; }; }