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)));
}
}