File CameraController.cpp
File List > controllers > CameraController.cpp
Go to the documentation of this file
#include "CameraController.h"
#include "events/CameraEvents.h"
#include "xdz_math.h"
void CameraZoom(CameraZoomEvent e)
{
const glm::vec3 delta = e.cam->o_position - e.cam->cam_tar;
e.cam->SetPos(e.cam->cam_tar + delta * glm::pow(0.8f, e.scroll_dir));
}
void CameraRotate(CameraRotateEvent e)
{
const glm::vec2 delta_mouse = glm::vec2(e.mouse_delta_x, e.mouse_delta_y);
const glm::vec2 angle = delta_mouse * -0.01f;
e.cam->Spin(e.cam->cam_tar, angle);
}
void CameraPush(CameraPushEvent e)
{
e.cam->o_position += glm::cross(e.cam->o_dir_up, e.cam->o_dir_right) * xdzm::dir_float_dist(e.mouse_delta_x, e.mouse_delta_y) * 0.05f;
e.cam->is_TransF_changed = true;
}
void CameraSpin(CameraSpinEvent e)
{
glm::vec3 Delt_angle = glm::vec3(e.mouse_delta_y, 0.0f, e.mouse_delta_x) * 0.05f;
e.cam->SetRot(e.cam->o_rot + Delt_angle);
e.cam->cam_tar -= e.cam->o_position;
e.cam->cam_tar = glm::mat4_cast(glm::qua<float>(glm::radians(Delt_angle))) * e.cam->cam_tar;
e.cam->cam_tar += e.cam->o_position;
}
void CameraSlide(CameraSlideEvent e)
{
const glm::vec3 delta = -e.mouse_delta_x * 0.03f * e.cam->o_dir_right + e.mouse_delta_y * 0.03f * e.cam->o_dir_up;
e.cam->SetPos(e.cam->o_position + delta);
e.cam->cam_tar += delta;
}
void CameraResize(CameraResizeEvent e)
{
e.cam->ChangeCamRatio(float(e.width), float(e.height));
}
void CameraController::bind(EventPool& pool)
{
pool.subscribe<CameraZoomEvent>(CameraZoom);
pool.subscribe<CameraRotateEvent>(CameraRotate);
pool.subscribe<CameraSlideEvent>(CameraSlide);
pool.subscribe<CameraPushEvent>(CameraPush);
pool.subscribe<CameraSpinEvent>(CameraSpin);
pool.subscribe<CameraResizeEvent>(CameraResize);
}