Skip to content

File Camera.cpp

File List > scene > Camera.cpp

Go to the documentation of this file

#include "Camera.h"
#include "Input.h"

#include "xdz_math.h"
#include "xdz_matrix.h"
#include "glm/gtx/matrix_decompose.hpp"

Camera::Camera(float w, float h, float per, float n, float f)
    :cam_w(w), cam_h(h), cam_pers(per), cam_near(n), cam_far(f)
{
    o_type = GO_CAM;
    //cam_frustum = glm::ortho(-cam_w / 2, cam_w / 2, -cam_h / 2, cam_h / 2, cam_near, cam_far);
    cam_frustum = glm::perspective(glm::radians(per), w / h, n, f); //fov angle from y axis

    o_name = "Camera." + std::to_string(GetObjectID());
}

Camera::Camera()
{
    o_type = GO_CAM;
    cam_w = 0;
    cam_h = 0;
}

Camera::~Camera()
{

}

void Camera::GenFloatData()
{
    cam_floatData = {
        o_position[0],
        o_position[1],
        o_position[2],

        o_rot[0],
        o_rot[1],
        o_rot[2],

        cam_w / cam_h,              //ratio
        glm::radians(cam_pers)
    };
}

void Camera::ChangeCamRatio(float w, float h)
{
    if (w == cam_w && h == cam_h)
        return;

    cam_w = w;
    cam_h = h;

    cam_frustum = glm::perspective(glm::radians(cam_pers), cam_w / cam_h, cam_near, cam_far);
    is_frustum_changed = true;
}

void Camera::ChangeCamRatio(const glm::vec2& size)
{
    if (size == glm::vec2(cam_w, cam_h))
        return;

    cam_w = size.x;
    cam_h = size.y;

    cam_frustum = glm::perspective(glm::radians(cam_pers), cam_w / cam_h, cam_near, cam_far);
    is_frustum_changed = true;
}

void Camera::ChangeCamPersp(float persp)
{
    if (persp == cam_pers)
        return;

    cam_pers = persp;
    cam_frustum = glm::perspective(glm::radians(cam_pers), cam_w / cam_h, cam_near, cam_far);
    is_frustum_changed = true;
}

void Camera::SetCamPos(const glm::vec3& _pos)
{
    SetPos(_pos);
    LookAt(cam_tar, { 0,0,1 });
}

void Camera::SetTarPos(const glm::vec3& _pos)
{
    if (_pos == cam_tar)
        return;

    cam_tar = _pos;
    LookAt(cam_tar, { 0,0,1 });
}

void Camera::SetCamTrans(const glm::mat4& _trans, bool pos /*= true*/, bool rot /*= true*/)
{
    if (xdzm::matrix_diff(_trans, o_Transform) < 0.000001)
        return;

    glm::vec3 _s, position, _sk;
    glm::quat rotation;
    glm::vec4 _per;

    glm::decompose(_trans, _s, rotation, position, _sk, _per);

    if (pos)
    { 
        cam_tar += position - o_position;
        SetPos(position);
    }

    if (rot)
    { 
        const glm::vec3 delta = glm::eulerAngles(rotation) - glm::radians(o_rot);
        //DEBUG(delta);
        Spin(cam_tar, { delta.z, delta.x });
        //SetRot(glm::degrees(glm::eulerAngles(rotation)));
    }
}