#pragma once
#include "glm/glm.hpp"
#include "glm/gtc/quaternion.hpp"

#include "Deer/Components.h"
#include "DeerRender/Components.h"
#include "DeerRender/SceneCamera.h"

namespace Deer {
    namespace EditorEngine {
        void vec3_constructor(void*);
        void vec3_constructor_params(float, float, float, void*);

        glm::vec3 vec3_add(glm::vec3&, glm::vec3&);
        glm::vec3 vec3_sub(const glm::vec3&, glm::vec3&);
        glm::vec3 vec3_neg(glm::vec3&);
        glm::vec3 vec3_mult(float, glm::vec3&);
        
        void quat_construct(glm::quat*);
        void quat_copyConstruct(glm::quat*, glm::quat*);
        void quat_destruct(glm::quat*);
        void quat_constructFromValue(float, float, float, float, glm::quat*);

        glm::vec3 quat_getEuler(glm::quat*);
        void quat_setEuler(glm::vec3, glm::quat*);
        glm::quat quat_multiply(glm::quat*, glm::quat*);

        void transform_construct(TransformComponent*);
        void camera_construct(CameraComponent*);
        void sceneCamera_Construct(SceneCamera*);

        glm::vec3 transform_relative(glm::vec3, TransformComponent*);

        void emptyDestructor();

        void registerMathStructs();
        void registerMathFunctions();
    }
}