summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2019-03-09 10:25:41 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2019-04-17 05:10:11 -0500
commit779e618046d309d732d2c5a48846cf94086206da (patch)
tree947335e34c1ec044032a9542ae871d656140376e /Source/Core
parent5c5e6df0380c518d098f20d9ffc832887782335c (diff)
VideoCommon: Change free-look's middle-mouse action to roll the camera.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/State.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/Graphics/AdvancedWidget.cpp2
-rw-r--r--Source/Core/DolphinQt/RenderWidget.cpp20
-rw-r--r--Source/Core/DolphinQt/RenderWidget.h4
-rw-r--r--Source/Core/VideoCommon/VertexShaderManager.cpp53
-rw-r--r--Source/Core/VideoCommon/VertexShaderManager.h2
6 files changed, 25 insertions, 58 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)
+ const auto mouse_move = event->pos() - m_last_mouse;
+ m_last_mouse = event->pos();
+
+ if (event->buttons() & Qt::RightButton)
{
- // Mouse Move
- VertexShaderManager::TranslateView((event->x() - m_last_mouse[0]) / 50.0f,
- (event->y() - m_last_mouse[1]) / 50.0f);
+ // Camera Pitch and Yaw:
+ VertexShaderManager::RotateView(mouse_move.y() / 200.f, mouse_move.x() / 200.f, 0.f);
}
- else if (event->buttons() & Qt::RightButton)
+ else if (event->buttons() & Qt::MidButton)
{
- // Mouse Look
- VertexShaderManager::RotateView((event->x() - m_last_mouse[0]) / 200.0f,
- (event->y() - m_last_mouse[1]) / 200.0f);
+ // Camera Roll:
+ VertexShaderManager::RotateView(0.f, 0.f, mouse_move.x() / 200.f);
}
-
- m_last_mouse[0] = event->x();
- m_last_mouse[1] = event->y();
}
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 <array>
-
#include <QEvent>
#include <QWidget>
@@ -43,5 +41,5 @@ private:
static constexpr int MOUSE_HIDE_DELAY = 3000;
QTimer* m_mouse_timer;
- std::array<float, 2> 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);