2022-11-17 16:47:42 +01:00
|
|
|
#include "ViewportControl.h"
|
|
|
|
|
#include "Component/Camera.h"
|
|
|
|
|
|
|
|
|
|
using namespace Seele;
|
2023-02-24 22:09:07 +01:00
|
|
|
using namespace Seele::Editor;
|
2022-11-17 16:47:42 +01:00
|
|
|
|
2023-01-21 18:43:21 +01:00
|
|
|
ViewportControl::ViewportControl(const URect& viewportDimensions, Vector initialPos)
|
2022-11-17 16:47:42 +01:00
|
|
|
: position(initialPos)
|
|
|
|
|
, fieldOfView(glm::radians(70.f))
|
|
|
|
|
, aspectRatio(static_cast<float>(viewportDimensions.size.x) / viewportDimensions.size.y)
|
|
|
|
|
, yaw(glm::pi<float>()/-2.0f)
|
|
|
|
|
, pitch(0)
|
|
|
|
|
{
|
|
|
|
|
std::cout << yaw << " " << pitch << std::endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ViewportControl::~ViewportControl()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ViewportControl::update(Component::Camera& camera, float deltaTime)
|
|
|
|
|
{
|
|
|
|
|
float cameraMove = deltaTime * 20;
|
|
|
|
|
if(keys[KeyCode::KEY_LEFT_SHIFT])
|
|
|
|
|
{
|
|
|
|
|
cameraMove *= 4;
|
|
|
|
|
}
|
2023-01-21 18:43:21 +01:00
|
|
|
Vector moveVector = Vector();
|
|
|
|
|
Vector forward = glm::normalize(springArm);
|
|
|
|
|
Vector side = glm::cross(Vector(0, 1, 0), forward);
|
2022-11-17 16:47:42 +01:00
|
|
|
if(keys[KeyCode::KEY_W])
|
|
|
|
|
{
|
|
|
|
|
moveVector += forward * cameraMove;
|
|
|
|
|
}
|
|
|
|
|
if(keys[KeyCode::KEY_S])
|
|
|
|
|
{
|
|
|
|
|
moveVector += forward * -cameraMove;
|
|
|
|
|
}
|
|
|
|
|
if(keys[KeyCode::KEY_A])
|
|
|
|
|
{
|
|
|
|
|
moveVector += side * cameraMove;
|
|
|
|
|
}
|
|
|
|
|
if(keys[KeyCode::KEY_D])
|
|
|
|
|
{
|
|
|
|
|
moveVector += side * -cameraMove;
|
|
|
|
|
}
|
|
|
|
|
if(keys[KeyCode::KEY_E])
|
|
|
|
|
{
|
|
|
|
|
moveVector += glm::vec3(0, cameraMove, 0);
|
|
|
|
|
}
|
|
|
|
|
if(keys[KeyCode::KEY_Q])
|
|
|
|
|
{
|
|
|
|
|
moveVector += glm::vec3(0, -cameraMove, 0);
|
|
|
|
|
}
|
|
|
|
|
position += moveVector;
|
|
|
|
|
static float lastX, lastY;
|
|
|
|
|
if(mouse2)
|
|
|
|
|
{
|
|
|
|
|
float deltaX = mouseX - lastX;
|
|
|
|
|
float deltaY = mouseY - lastY;
|
|
|
|
|
yaw += deltaX / 500.f;
|
|
|
|
|
pitch -= deltaY / 500.f;
|
|
|
|
|
}
|
|
|
|
|
lastX = mouseX;
|
|
|
|
|
lastY = mouseY;
|
|
|
|
|
springArm = glm::normalize(
|
2023-01-21 18:43:21 +01:00
|
|
|
Vector(
|
2022-11-17 16:47:42 +01:00
|
|
|
cos(yaw) * cos(pitch),
|
|
|
|
|
sin(pitch),
|
|
|
|
|
sin(yaw) * cos(pitch)));
|
2023-01-21 18:43:21 +01:00
|
|
|
camera.viewMatrix = glm::lookAt(position, position + springArm, Vector(0, 1, 0));
|
2022-11-17 16:47:42 +01:00
|
|
|
std::cout << yaw << " " << pitch << std::endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ViewportControl::keyCallback(KeyCode key, InputAction action)
|
|
|
|
|
{
|
|
|
|
|
keys[static_cast<size_t>(key)] = action != InputAction::RELEASE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ViewportControl::mouseMoveCallback(double xPos, double yPos)
|
|
|
|
|
{
|
|
|
|
|
mouseX = static_cast<float>(xPos);
|
|
|
|
|
mouseY = static_cast<float>(yPos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ViewportControl::mouseButtonCallback(MouseButton button, InputAction action)
|
|
|
|
|
{
|
|
|
|
|
if(button == MouseButton::MOUSE_BUTTON_1)
|
|
|
|
|
{
|
|
|
|
|
mouse1 = action != InputAction::RELEASE;
|
|
|
|
|
}
|
|
|
|
|
if(button == MouseButton::MOUSE_BUTTON_2)
|
|
|
|
|
{
|
|
|
|
|
mouse2 = action != InputAction::RELEASE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-21 18:43:21 +01:00
|
|
|
void ViewportControl::viewportResize(URect dimensions)
|
2022-11-17 16:47:42 +01:00
|
|
|
{
|
|
|
|
|
aspectRatio = static_cast<float>(dimensions.size.x) / dimensions.size.y;
|
|
|
|
|
}
|