From bc51c34a962aa314e3326487d0dd60e621ab69a4 Mon Sep 17 00:00:00 2001 From: spycrab Date: Sun, 29 Apr 2018 13:35:43 +0200 Subject: [PATCH] Qt: Implement "Free look" --- Source/Core/DolphinQt2/RenderWidget.cpp | 27 +++++++++++++++++++++++++ Source/Core/DolphinQt2/RenderWidget.h | 5 +++++ 2 files changed, 32 insertions(+) diff --git a/Source/Core/DolphinQt2/RenderWidget.cpp b/Source/Core/DolphinQt2/RenderWidget.cpp index c2bbec0d4b..0d82a40372 100644 --- a/Source/Core/DolphinQt2/RenderWidget.cpp +++ b/Source/Core/DolphinQt2/RenderWidget.cpp @@ -6,12 +6,16 @@ #include #include #include +#include #include #include #include #include "Core/ConfigManager.h" #include "Core/Core.h" +#include "VideoCommon/VertexShaderManager.h" +#include "VideoCommon/VideoConfig.h" + #include "DolphinQt2/Host.h" #include "DolphinQt2/RenderWidget.h" #include "DolphinQt2/Settings.h" @@ -120,6 +124,10 @@ bool RenderWidget::event(QEvent* event) break; } case QEvent::MouseMove: + if (g_Config.bFreeLook) + OnFreeLookMouseMove(static_cast(event)); + + // [[fallthrough]] case QEvent::MouseButtonPress: if (!Settings::Instance().GetHideCursor() && isActiveWindow()) { @@ -162,3 +170,22 @@ bool RenderWidget::event(QEvent* event) } return QWidget::event(event); } + +void RenderWidget::OnFreeLookMouseMove(QMouseEvent* event) +{ + if (event->buttons() & Qt::MidButton) + { + // Mouse Move + VertexShaderManager::TranslateView((event->x() - m_last_mouse[0]) / 50.0f, + (event->y() - m_last_mouse[1]) / 50.0f); + } + else if (event->buttons() & Qt::RightButton) + { + // Mouse Look + VertexShaderManager::RotateView((event->x() - m_last_mouse[0]) / 200.0f, + (event->y() - m_last_mouse[1]) / 200.0f); + } + + m_last_mouse[0] = event->x(); + m_last_mouse[1] = event->y(); +} diff --git a/Source/Core/DolphinQt2/RenderWidget.h b/Source/Core/DolphinQt2/RenderWidget.h index 0c89363fa0..6122fc8633 100644 --- a/Source/Core/DolphinQt2/RenderWidget.h +++ b/Source/Core/DolphinQt2/RenderWidget.h @@ -4,9 +4,12 @@ #pragma once +#include + #include #include +class QMouseEvent; class QTimer; class RenderWidget final : public QWidget @@ -31,7 +34,9 @@ private: void OnHideCursorChanged(); void OnKeepOnTopChanged(bool top); void SetFillBackground(bool fill); + void OnFreeLookMouseMove(QMouseEvent* event); static constexpr int MOUSE_HIDE_DELAY = 3000; QTimer* m_mouse_timer; + std::array m_last_mouse{}; };