summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VertexShaderManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon/VertexShaderManager.cpp')
-rw-r--r--Source/Core/VideoCommon/VertexShaderManager.cpp172
1 files changed, 92 insertions, 80 deletions
diff --git a/Source/Core/VideoCommon/VertexShaderManager.cpp b/Source/Core/VideoCommon/VertexShaderManager.cpp
index abc59b862c..deda07fd65 100644
--- a/Source/Core/VideoCommon/VertexShaderManager.cpp
+++ b/Source/Core/VideoCommon/VertexShaderManager.cpp
@@ -65,6 +65,97 @@ void VertexShaderManager::Dirty()
dirty = true;
}
+Common::Matrix44 VertexShaderManager::LoadProjectionMatrix()
+{
+ const auto& rawProjection = xfmem.projection.rawProjection;
+
+ switch (xfmem.projection.type)
+ {
+ case ProjectionType::Perspective:
+ {
+ const Common::Vec2 fov_multiplier = g_freelook_camera.IsActive() ?
+ g_freelook_camera.GetFieldOfViewMultiplier() :
+ Common::Vec2{1, 1};
+ m_projection_matrix[0] = rawProjection[0] * g_ActiveConfig.fAspectRatioHackW * fov_multiplier.x;
+ m_projection_matrix[1] = 0.0f;
+ m_projection_matrix[2] = rawProjection[1] * g_ActiveConfig.fAspectRatioHackW * fov_multiplier.x;
+ m_projection_matrix[3] = 0.0f;
+
+ m_projection_matrix[4] = 0.0f;
+ m_projection_matrix[5] = rawProjection[2] * g_ActiveConfig.fAspectRatioHackH * fov_multiplier.y;
+ m_projection_matrix[6] = rawProjection[3] * g_ActiveConfig.fAspectRatioHackH * fov_multiplier.y;
+ m_projection_matrix[7] = 0.0f;
+
+ m_projection_matrix[8] = 0.0f;
+ m_projection_matrix[9] = 0.0f;
+ m_projection_matrix[10] = rawProjection[4];
+ m_projection_matrix[11] = rawProjection[5];
+
+ m_projection_matrix[12] = 0.0f;
+ m_projection_matrix[13] = 0.0f;
+
+ m_projection_matrix[14] = -1.0f;
+ m_projection_matrix[15] = 0.0f;
+
+ g_stats.gproj = m_projection_matrix;
+ }
+ break;
+
+ case ProjectionType::Orthographic:
+ {
+ m_projection_matrix[0] = rawProjection[0];
+ m_projection_matrix[1] = 0.0f;
+ m_projection_matrix[2] = 0.0f;
+ m_projection_matrix[3] = rawProjection[1];
+
+ m_projection_matrix[4] = 0.0f;
+ m_projection_matrix[5] = rawProjection[2];
+ m_projection_matrix[6] = 0.0f;
+ m_projection_matrix[7] = rawProjection[3];
+
+ m_projection_matrix[8] = 0.0f;
+ m_projection_matrix[9] = 0.0f;
+ m_projection_matrix[10] = rawProjection[4];
+ m_projection_matrix[11] = rawProjection[5];
+
+ m_projection_matrix[12] = 0.0f;
+ m_projection_matrix[13] = 0.0f;
+
+ m_projection_matrix[14] = 0.0f;
+ m_projection_matrix[15] = 1.0f;
+
+ g_stats.g2proj = m_projection_matrix;
+ g_stats.proj = rawProjection;
+ }
+ break;
+
+ default:
+ ERROR_LOG_FMT(VIDEO, "Unknown projection type: {}", xfmem.projection.type);
+ }
+
+ PRIM_LOG("Projection: {} {} {} {} {} {}", rawProjection[0], rawProjection[1], rawProjection[2],
+ rawProjection[3], rawProjection[4], rawProjection[5]);
+
+ auto corrected_matrix = m_viewport_correction * Common::Matrix44::FromArray(m_projection_matrix);
+
+ if (g_freelook_camera.IsActive() && xfmem.projection.type == ProjectionType::Perspective)
+ corrected_matrix *= g_freelook_camera.GetView();
+
+ g_freelook_camera.GetController()->SetClean();
+
+ return corrected_matrix;
+}
+
+void VertexShaderManager::SetProjectionMatrix()
+{
+ if (m_projection_changed || g_freelook_camera.GetController()->IsDirty())
+ {
+ m_projection_changed = false;
+ auto corrected_matrix = LoadProjectionMatrix();
+ memcpy(constants.projection.data(), corrected_matrix.data.data(), 4 * sizeof(float4));
+ }
+}
+
// Syncs the shader constant buffers with xfmem
// TODO: A cleaner way to control the matrices without making a mess in the parameters field
void VertexShaderManager::SetConstants(const std::vector<std::string>& textures)
@@ -317,84 +408,7 @@ void VertexShaderManager::SetConstants(const std::vector<std::string>& textures)
m_projection_changed = false;
m_projection_graphics_mod_change = !projection_actions.empty();
- const auto& rawProjection = xfmem.projection.rawProjection;
-
- switch (xfmem.projection.type)
- {
- case ProjectionType::Perspective:
- {
- const Common::Vec2 fov_multiplier = g_freelook_camera.IsActive() ?
- g_freelook_camera.GetFieldOfViewMultiplier() :
- Common::Vec2{1, 1};
- m_projection_matrix[0] =
- rawProjection[0] * g_ActiveConfig.fAspectRatioHackW * fov_multiplier.x;
- m_projection_matrix[1] = 0.0f;
- m_projection_matrix[2] =
- rawProjection[1] * g_ActiveConfig.fAspectRatioHackW * fov_multiplier.x;
- m_projection_matrix[3] = 0.0f;
-
- m_projection_matrix[4] = 0.0f;
- m_projection_matrix[5] =
- rawProjection[2] * g_ActiveConfig.fAspectRatioHackH * fov_multiplier.y;
- m_projection_matrix[6] =
- rawProjection[3] * g_ActiveConfig.fAspectRatioHackH * fov_multiplier.y;
- m_projection_matrix[7] = 0.0f;
-
- m_projection_matrix[8] = 0.0f;
- m_projection_matrix[9] = 0.0f;
- m_projection_matrix[10] = rawProjection[4];
- m_projection_matrix[11] = rawProjection[5];
-
- m_projection_matrix[12] = 0.0f;
- m_projection_matrix[13] = 0.0f;
-
- m_projection_matrix[14] = -1.0f;
- m_projection_matrix[15] = 0.0f;
-
- g_stats.gproj = m_projection_matrix;
- }
- break;
-
- case ProjectionType::Orthographic:
- {
- m_projection_matrix[0] = rawProjection[0];
- m_projection_matrix[1] = 0.0f;
- m_projection_matrix[2] = 0.0f;
- m_projection_matrix[3] = rawProjection[1];
-
- m_projection_matrix[4] = 0.0f;
- m_projection_matrix[5] = rawProjection[2];
- m_projection_matrix[6] = 0.0f;
- m_projection_matrix[7] = rawProjection[3];
-
- m_projection_matrix[8] = 0.0f;
- m_projection_matrix[9] = 0.0f;
- m_projection_matrix[10] = rawProjection[4];
- m_projection_matrix[11] = rawProjection[5];
-
- m_projection_matrix[12] = 0.0f;
- m_projection_matrix[13] = 0.0f;
-
- m_projection_matrix[14] = 0.0f;
- m_projection_matrix[15] = 1.0f;
-
- g_stats.g2proj = m_projection_matrix;
- g_stats.proj = rawProjection;
- }
- break;
-
- default:
- ERROR_LOG_FMT(VIDEO, "Unknown projection type: {}", xfmem.projection.type);
- }
-
- PRIM_LOG("Projection: {} {} {} {} {} {}", rawProjection[0], rawProjection[1], rawProjection[2],
- rawProjection[3], rawProjection[4], rawProjection[5]);
-
- auto corrected_matrix =
- m_viewport_correction * Common::Matrix44::FromArray(m_projection_matrix);
-
- if (g_freelook_camera.IsActive() && xfmem.projection.type == ProjectionType::Perspective)
- corrected_matrix *= g_freelook_camera.GetView();
+ auto corrected_matrix = LoadProjectionMatrix();
GraphicsModActionData::Projection projection{&corrected_matrix};
for (auto action : projection_actions)
@@ -404,8 +418,6 @@ void VertexShaderManager::SetConstants(const std::vector<std::string>& textures)
memcpy(constants.projection.data(), corrected_matrix.data.data(), 4 * sizeof(float4));
- g_freelook_camera.GetController()->SetClean();
-
dirty = true;
}