approximative cam movement

This commit is contained in:
2023-06-06 17:56:19 +02:00
parent 39bdd0a11e
commit b70e8f7790
3 changed files with 21 additions and 5 deletions

View File

@@ -26,7 +26,7 @@ struct Camera {
class Renderer { class Renderer {
public: public:
static constexpr float m_AnimationSpeed = 2.0f; static constexpr float m_AnimationSpeed = 2.0f;
static constexpr float m_MouseSensitivity = 100.0f; static constexpr float m_MouseSensitivity = 200.0f;
struct Model { struct Model {
GL::VertexArray* vao; GL::VertexArray* vao;
@@ -55,6 +55,7 @@ public:
void RenderModel(const Model& model); void RenderModel(const Model& model);
void SetZoom(float zoom); void SetZoom(float zoom);
void SetCamAngularMovement(const Vec2f& mov);
void SetCamMovement(const Vec2f& mov); void SetCamMovement(const Vec2f& mov);
void SetCamLook(const Vec2f& worldPos); void SetCamLook(const Vec2f& worldPos);

View File

@@ -92,12 +92,18 @@ void Renderer::SetZoom(float zoom) {
SetCamLook(m_Camera.CamLook); SetCamLook(m_Camera.CamLook);
} }
void Renderer::SetCamMovement(const Vec2f& mov) { void Renderer::SetCamAngularMovement(const Vec2f& mov) {
m_Camera.m_Pitch = std::clamp(m_Camera.m_Pitch - mov.y / m_MouseSensitivity, -PI / 2.0f + 0.0000001f, -PI / 12.0f ); m_Camera.m_Pitch = std::clamp(m_Camera.m_Pitch - mov.y / m_MouseSensitivity, -PI / 2.0f + 0.0000001f, -PI / 12.0f );
m_Camera.m_Yaw += mov.x / m_MouseSensitivity; m_Camera.m_Yaw += mov.x / m_MouseSensitivity;
SetCamLook(m_Camera.CamLook); SetCamLook(m_Camera.CamLook);
} }
void Renderer::SetCamMovement(const Vec2f& mov) {
Vec2f cursor = {static_cast<float>(m_WindowSize.x) / 2.0f - mov.x, static_cast<float>(m_WindowSize.y) / 2.0f - mov.y};
Vec2f worldMovement = GetCursorWorldPos(cursor, m_WindowSize.x, m_WindowSize.y);
SetCamLook(worldMovement);
}
void Renderer::SetCamPos(const Vec3f& newPos) { void Renderer::SetCamPos(const Vec3f& newPos) {
Vec3f front = { Vec3f front = {

View File

@@ -48,15 +48,25 @@ void WorldRenderer::UpdateCursorPos() {
void WorldRenderer::Update() { void WorldRenderer::Update() {
if (m_WorldVao == nullptr) if (m_WorldVao == nullptr)
return; return;
ImGuiIO& io = ImGui::GetIO(); ImGuiIO& io = ImGui::GetIO();
if (io.MouseDown[0] && !ImGui::IsAnyItemActive() && !ImGui::IsAnyItemHovered()) { if (io.MouseDown[0] && !ImGui::IsAnyItemActive() && !ImGui::IsAnyItemHovered()) {
ImVec2 mouseDelta = ImGui::GetIO().MouseDelta; ImVec2 mouseDelta = ImGui::GetIO().MouseDelta;
MoveCam(mouseDelta.x, mouseDelta.y); m_Renderer->SetCamMovement({ mouseDelta.x, mouseDelta.y });
} }
if (io.MouseDown[1] && !ImGui::IsAnyItemActive() && !ImGui::IsAnyItemHovered()) {
ImVec2 mouseDelta = ImGui::GetIO().MouseDelta;
m_Renderer->SetCamAngularMovement({ mouseDelta.x, mouseDelta.y });
}
if (io.MouseWheel != 0) { if (io.MouseWheel != 0) {
ChangeZoom(io.MouseWheel); ChangeZoom(io.MouseWheel);
} }
UpdateCursorPos(); UpdateCursorPos();
if (ImGui::IsMouseClicked(0)) { if (ImGui::IsMouseClicked(0)) {
if (!m_TowerUpgradePopup->IsPopupOpened()) { if (!m_TowerUpgradePopup->IsPopupOpened()) {
m_HoldCursorPos = { io.MousePos.x, io.MousePos.y }; m_HoldCursorPos = { io.MousePos.x, io.MousePos.y };
@@ -136,7 +146,7 @@ void WorldRenderer::RenderTooltips() const {
void WorldRenderer::MoveCam(float relativeX, float relativeY) { void WorldRenderer::MoveCam(float relativeX, float relativeY) {
if (m_WorldVao == nullptr) if (m_WorldVao == nullptr)
return; return;
m_Renderer->SetCamMovement({ relativeX, relativeY });
} }
void WorldRenderer::ChangeZoom(float zoomStep) { void WorldRenderer::ChangeZoom(float zoomStep) {
@@ -144,7 +154,6 @@ void WorldRenderer::ChangeZoom(float zoomStep) {
return; return;
m_Renderer->SetZoom(zoomStep); m_Renderer->SetZoom(zoomStep);
m_Renderer->SetCamMovement({});
} }
void WorldRenderer::Click() { void WorldRenderer::Click() {