diff --git a/include/render/Renderer.h b/include/render/Renderer.h index d3cf602..d957c73 100644 --- a/include/render/Renderer.h +++ b/include/render/Renderer.h @@ -26,7 +26,7 @@ struct Camera { class Renderer { public: static constexpr float m_AnimationSpeed = 2.0f; - static constexpr float m_MouseSensitivity = 100.0f; + static constexpr float m_MouseSensitivity = 200.0f; struct Model { GL::VertexArray* vao; @@ -55,6 +55,7 @@ public: void RenderModel(const Model& model); void SetZoom(float zoom); + void SetCamAngularMovement(const Vec2f& mov); void SetCamMovement(const Vec2f& mov); void SetCamLook(const Vec2f& worldPos); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 556df46..a2f244e 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -92,12 +92,18 @@ void Renderer::SetZoom(float zoom) { 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_Yaw += mov.x / m_MouseSensitivity; SetCamLook(m_Camera.CamLook); } +void Renderer::SetCamMovement(const Vec2f& mov) { + Vec2f cursor = {static_cast(m_WindowSize.x) / 2.0f - mov.x, static_cast(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) { Vec3f front = { diff --git a/src/render/WorldRenderer.cpp b/src/render/WorldRenderer.cpp index 846f615..5eafcbb 100644 --- a/src/render/WorldRenderer.cpp +++ b/src/render/WorldRenderer.cpp @@ -48,15 +48,25 @@ void WorldRenderer::UpdateCursorPos() { void WorldRenderer::Update() { if (m_WorldVao == nullptr) return; + ImGuiIO& io = ImGui::GetIO(); + if (io.MouseDown[0] && !ImGui::IsAnyItemActive() && !ImGui::IsAnyItemHovered()) { 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) { ChangeZoom(io.MouseWheel); } + UpdateCursorPos(); + if (ImGui::IsMouseClicked(0)) { if (!m_TowerUpgradePopup->IsPopupOpened()) { m_HoldCursorPos = { io.MousePos.x, io.MousePos.y }; @@ -136,7 +146,7 @@ void WorldRenderer::RenderTooltips() const { void WorldRenderer::MoveCam(float relativeX, float relativeY) { if (m_WorldVao == nullptr) return; - m_Renderer->SetCamMovement({ relativeX, relativeY }); + } void WorldRenderer::ChangeZoom(float zoomStep) { @@ -144,7 +154,6 @@ void WorldRenderer::ChangeZoom(float zoomStep) { return; m_Renderer->SetZoom(zoomStep); - m_Renderer->SetCamMovement({}); } void WorldRenderer::Click() {