Files
Seele/src/Engine/Scene/Components/CameraComponent.cpp
T
2021-10-15 23:12:29 +02:00

76 lines
1.9 KiB
C++

#include "CameraComponent.h"
#include "Scene/Actor/Actor.h"
#include <algorithm>
#include <iostream>
using namespace Seele;
CameraComponent::CameraComponent()
: bNeedsViewBuild(true)
, bNeedsProjectionBuild(true)
, originPoint(0, 0, 0)
, cameraPosition(0, 0, 0)
{
distance = 50;
rotationX = 0;
rotationY = -1.f;
}
CameraComponent::~CameraComponent()
{
}
void CameraComponent::mouseMove(float deltaX, float deltaY)
{
//0.01 mouse sensitivity
rotationX += deltaX/500.f;
rotationY += deltaY/500.f;
rotationY = std::clamp(rotationY, -1.5f, 1.5f);
getParent()->setWorldRotation(glm::rotate(glm::quat(), rotationX, Vector(0, 1, 0)));
getParent()->setWorldRotation(glm::rotate(glm::quat(), rotationY, Vector(1, 0, 0)));
bNeedsViewBuild = true;
}
void CameraComponent::mouseScroll(double x)
{
distance -= static_cast<float>(x);
distance = std::max(distance, 1.f);
getParent()->addWorldTranslation(Vector(0, 0, x));
bNeedsViewBuild = true;
}
void CameraComponent::moveOrigin(float up)
{
originPoint.y += up;
getParent()->addWorldTranslation(Vector(0, up, 0));
bNeedsViewBuild = true;
}
void CameraComponent::buildViewMatrix()
{
Matrix4 rotation = glm::rotate(Matrix4(1.0f), rotationX, Vector(0, 1, 0));
rotation = glm::rotate(rotation, rotationY, Vector(1, 0, 0));
Vector4 translation(0, 0, distance, 1);
translation = rotation * translation;
cameraPosition = originPoint + Vector(translation);
viewMatrix = glm::lookAt(cameraPosition, originPoint, Vector(0, 1, 0));
bNeedsViewBuild = false;
}
void CameraComponent::buildProjectionMatrix()
{
projectionMatrix = glm::perspective(fieldOfView, aspectRatio, 1.0f, 1000.f);
static Matrix4 correctionMatrix =
Matrix4(
Vector4(1, 0, 0, 0),
Vector4(0, 1, 0, 0),
Vector4(0, 0, 0.5f, 0),
Vector4(0, 0, 0.5f, 1));
projectionMatrix = correctionMatrix * projectionMatrix;
bNeedsProjectionBuild = false;
}