Program Listing for File Transform.hpp

↰ Return to documentation for file (engine/include/Cacao/Transform.hpp)

#pragma once

#include "glm/trigonometric.hpp"
#include "glm/vec3.hpp"
#include "glm/mat4x4.hpp"
#include "glm/gtc/quaternion.hpp"

#include "DllHelper.hpp"

namespace Cacao {
    class CACAO_API Transform {
      public:
        Transform(glm::vec3 position, glm::quat rotation, glm::vec3 scale)
          : pos(position), scale(scale), rot(rotation), transMat(1.0) {
            RecalculateTransformationMatrix();
        }

        Transform(glm::vec3 position, glm::vec3 rotation, glm::vec3 scale)
          : pos(position), scale(scale), rot(glm::radians(rotation)), transMat(1.0) {
            RecalculateTransformationMatrix();
        }

        Transform()
          : pos(0, 0, 0), scale(1, 1, 1), rot(1.0, 0.0, 0.0, 0.0) {
            RecalculateTransformationMatrix();
        }

        glm::vec3 GetPosition() const {
            return pos;
        }

        glm::quat GetRotation() const {
            return rot;
        }

        glm::vec3 GetRotationEuler() const {
            return glm::degrees(glm::eulerAngles(rot));
        }

        glm::vec3 GetScale() const {
            return scale;
        }

        void SetPosition(glm::vec3 newPos) {
            pos = newPos;
            RecalculateTransformationMatrix();
        }

        void SetRotation(glm::quat newRot) {
            rot = newRot;
            RecalculateTransformationMatrix();
        }

        void SetRotationEuler(glm::vec3 newRot) {
            rot = glm::quat(glm::radians(newRot));
            RecalculateTransformationMatrix();
        }

        void SetScale(glm::vec3 newScale) {
            scale = newScale;
            RecalculateTransformationMatrix();
        }

        glm::mat4 GetTransformationMatrix() const {
            return transMat;
        }

      private:
        glm::vec3 pos, scale;
        glm::quat rot;

        glm::mat4 transMat;

        void RecalculateTransformationMatrix();
    };
}