From 779e618046d309d732d2c5a48846cf94086206da Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Sat, 9 Mar 2019 10:25:41 -0600 Subject: [PATCH] VideoCommon: Change free-look's middle-mouse action to roll the camera. --- Source/Core/Core/State.cpp | 2 +- .../Config/Graphics/AdvancedWidget.cpp | 2 +- Source/Core/DolphinQt/RenderWidget.cpp | 26 +++++---- Source/Core/DolphinQt/RenderWidget.h | 4 +- .../Core/VideoCommon/VertexShaderManager.cpp | 53 +++++-------------- Source/Core/VideoCommon/VertexShaderManager.h | 2 +- 6 files changed, 28 insertions(+), 61 deletions(-) diff --git a/Source/Core/Core/State.cpp b/Source/Core/Core/State.cpp index 920ee474d3..f1bd5aaed5 100644 --- a/Source/Core/Core/State.cpp +++ b/Source/Core/Core/State.cpp @@ -74,7 +74,7 @@ static Common::Event g_compressAndDumpStateSyncEvent; static std::thread g_save_thread; // Don't forget to increase this after doing changes on the savestate system -static const u32 STATE_VERSION = 107; // Last changed in PR 7952 +static const u32 STATE_VERSION = 108; // Last changed in PR 7870 // Maps savestate versions to Dolphin versions. // Versions after 42 don't need to be added to this list, diff --git a/Source/Core/DolphinQt/Config/Graphics/AdvancedWidget.cpp b/Source/Core/DolphinQt/Config/Graphics/AdvancedWidget.cpp index 04f7863de6..4b1eda0aa3 100644 --- a/Source/Core/DolphinQt/Config/Graphics/AdvancedWidget.cpp +++ b/Source/Core/DolphinQt/Config/Graphics/AdvancedWidget.cpp @@ -191,7 +191,7 @@ void AdvancedWidget::AddDescriptions() #endif static const char TR_FREE_LOOK_DESCRIPTION[] = QT_TR_NOOP( "Allows manipulation of the in-game camera. Move the mouse while holding the right button " - "to pan or middle button to move.\n\nUse the WASD keys while holding SHIFT to move the " + "to pan or middle button to roll.\n\nUse the WASD keys while holding SHIFT to move the " "camera. Press SHIFT+2 to increase speed or SHIFT+1 to decrease speed. Press SHIFT+R " "to reset the camera or SHIFT+F to reset the speed.\n\nIf unsure, leave this unchecked. "); static const char TR_CROPPING_DESCRIPTION[] = diff --git a/Source/Core/DolphinQt/RenderWidget.cpp b/Source/Core/DolphinQt/RenderWidget.cpp index ad6d65c252..794ef06f6d 100644 --- a/Source/Core/DolphinQt/RenderWidget.cpp +++ b/Source/Core/DolphinQt/RenderWidget.cpp @@ -235,21 +235,19 @@ bool RenderWidget::event(QEvent* 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); - } + const auto mouse_move = event->pos() - m_last_mouse; + m_last_mouse = event->pos(); - m_last_mouse[0] = event->x(); - m_last_mouse[1] = event->y(); + if (event->buttons() & Qt::RightButton) + { + // Camera Pitch and Yaw: + VertexShaderManager::RotateView(mouse_move.y() / 200.f, mouse_move.x() / 200.f, 0.f); + } + else if (event->buttons() & Qt::MidButton) + { + // Camera Roll: + VertexShaderManager::RotateView(0.f, 0.f, mouse_move.x() / 200.f); + } } void RenderWidget::PassEventToImGui(const QEvent* event) diff --git a/Source/Core/DolphinQt/RenderWidget.h b/Source/Core/DolphinQt/RenderWidget.h index a9099fd5a7..df4f34d93e 100644 --- a/Source/Core/DolphinQt/RenderWidget.h +++ b/Source/Core/DolphinQt/RenderWidget.h @@ -4,8 +4,6 @@ #pragma once -#include - #include #include @@ -43,5 +41,5 @@ private: static constexpr int MOUSE_HIDE_DELAY = 3000; QTimer* m_mouse_timer; - std::array m_last_mouse{}; + QPoint m_last_mouse{}; }; diff --git a/Source/Core/VideoCommon/VertexShaderManager.cpp b/Source/Core/VideoCommon/VertexShaderManager.cpp index b0821df950..58ecf198c8 100644 --- a/Source/Core/VideoCommon/VertexShaderManager.cpp +++ b/Source/Core/VideoCommon/VertexShaderManager.cpp @@ -39,10 +39,7 @@ static int nPostTransformMatricesChanged[2]; // min,max static int nLightsChanged[2]; // min,max static Common::Matrix44 s_viewportCorrection; -static Common::Matrix33 s_viewRotationMatrix; -static Common::Matrix33 s_viewInvRotationMatrix; -static Common::Vec3 s_fViewTranslationVector; -static float s_fViewRotation[2]; +static Common::Matrix44 s_freelook_matrix; VertexShaderConstants VertexShaderManager::constants; bool VertexShaderManager::dirty; @@ -450,24 +447,12 @@ void VertexShaderManager::SetConstants() PRIM_LOG("Projection: %f %f %f %f %f %f", rawProjection[0], rawProjection[1], rawProjection[2], rawProjection[3], rawProjection[4], rawProjection[5]); + auto corrected_matrix = s_viewportCorrection * Common::Matrix44::FromArray(g_fProjectionMatrix); + if (g_ActiveConfig.bFreeLook && xfmem.projection.type == GX_PERSPECTIVE) - { - using Common::Matrix44; + corrected_matrix *= s_freelook_matrix; - auto mtxA = Matrix44::Translate(s_fViewTranslationVector); - auto mtxB = Matrix44::FromMatrix33(s_viewRotationMatrix); - const auto viewMtx = mtxB * mtxA; // view = rotation x translation - - mtxA = Matrix44::FromArray(g_fProjectionMatrix) * viewMtx; // mtxA = projection x view - mtxB = s_viewportCorrection * mtxA; // mtxB = viewportCorrection x mtxA - memcpy(constants.projection.data(), mtxB.data.data(), 4 * sizeof(float4)); - } - else - { - const auto projMtx = Common::Matrix44::FromArray(g_fProjectionMatrix); - const auto correctedMtx = s_viewportCorrection * projMtx; - memcpy(constants.projection.data(), correctedMtx.data.data(), 4 * sizeof(float4)); - } + memcpy(constants.projection.data(), corrected_matrix.data.data(), 4 * sizeof(float4)); dirty = true; } @@ -654,36 +639,25 @@ void VertexShaderManager::SetMaterialColorChanged(int index) void VertexShaderManager::TranslateView(float x, float y, float z) { - s_fViewTranslationVector += s_viewInvRotationMatrix * Common::Vec3{x, z, y}; + s_freelook_matrix = Common::Matrix44::Translate({x, z, y}) * s_freelook_matrix; bProjectionChanged = true; } -void VertexShaderManager::RotateView(float x, float y) +void VertexShaderManager::RotateView(float x, float y, float z) { using Common::Matrix33; - s_fViewRotation[0] += x; - s_fViewRotation[1] += y; - - s_viewRotationMatrix = - Matrix33::RotateX(s_fViewRotation[1]) * Matrix33::RotateY(s_fViewRotation[0]); - - // reverse rotation - s_viewInvRotationMatrix = - Matrix33::RotateY(-s_fViewRotation[0]) * Matrix33::RotateX(-s_fViewRotation[1]); + s_freelook_matrix = Common::Matrix44::FromMatrix33(Matrix33::RotateX(x) * Matrix33::RotateY(y) * + Matrix33::RotateZ(z)) * + s_freelook_matrix; bProjectionChanged = true; } void VertexShaderManager::ResetView() { - using Common::Matrix33; - - s_fViewTranslationVector = {}; - s_viewRotationMatrix = Matrix33::Identity(); - s_viewInvRotationMatrix = Matrix33::Identity(); - s_fViewRotation[0] = s_fViewRotation[1] = 0.0f; + s_freelook_matrix = Common::Matrix44::Identity(); bProjectionChanged = true; } @@ -736,10 +710,7 @@ void VertexShaderManager::DoState(PointerWrap& p) { p.Do(g_fProjectionMatrix); p.Do(s_viewportCorrection); - p.Do(s_viewRotationMatrix); - p.Do(s_viewInvRotationMatrix); - p.Do(s_fViewTranslationVector); - p.Do(s_fViewRotation); + p.Do(s_freelook_matrix); p.Do(nTransformMatricesChanged); p.Do(nNormalMatricesChanged); diff --git a/Source/Core/VideoCommon/VertexShaderManager.h b/Source/Core/VideoCommon/VertexShaderManager.h index 384fc0e7f9..cd13bee4ff 100644 --- a/Source/Core/VideoCommon/VertexShaderManager.h +++ b/Source/Core/VideoCommon/VertexShaderManager.h @@ -30,7 +30,7 @@ public: static void SetMaterialColorChanged(int index); static void TranslateView(float x, float y, float z = 0.0f); - static void RotateView(float x, float y); + static void RotateView(float x, float y, float z); static void ResetView(); static void SetVertexFormat(u32 components);