diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp index 1f55074957..58671f0b75 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp @@ -79,6 +79,8 @@ void Config::Load() iniFile.Get("Hacks", "EFBToTextureDisable", &bEBFToTextureDisable, 0); + iniFile.Get("Hacks", "ProjectionHax1", &bProjectionHax1, 0); + iniFile.Get("Hacks", "ProjectionHax2", &bProjectionHax2, 0); } void Config::Save() @@ -112,6 +114,8 @@ void Config::Save() iniFile.Set("Enhancements", "ForceMaxAniso", bForceMaxAniso); iniFile.Set("Hacks", "EFBToTextureDisable", bEBFToTextureDisable); + iniFile.Set("Hacks", "ProjectionHax1", bProjectionHax1); + iniFile.Set("Hacks", "ProjectionHax2", bProjectionHax2); iniFile.Save(FULL_CONFIG_DIR "gfx_opengl.ini"); } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Config.h b/Source/Plugins/Plugin_VideoOGL/Src/Config.h index f476215bc7..0721252260 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Config.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/Config.h @@ -62,6 +62,8 @@ struct Config // Hacks bool bEBFToTextureDisable; + bool bProjectionHax1; + bool bProjectionHax2; int iLog; // CONF_ bits int iSaveTargetId; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp index 7d4a63933f..b7fdb2fe9f 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp @@ -47,6 +47,8 @@ BEGIN_EVENT_TABLE(ConfigDialog,wxDialog) EVT_CHECKBOX(ID_DISABLELIGHTING, ConfigDialog::AdvancedSettingsChanged) EVT_CHECKBOX(ID_DISABLETEXTURING, ConfigDialog::AdvancedSettingsChanged) EVT_CHECKBOX(ID_EFBTOTEXTUREDISABLE, ConfigDialog::AdvancedSettingsChanged) + EVT_CHECKBOX(ID_PROJECTIONHACK1,ConfigDialog::AdvancedSettingsChanged) + EVT_CHECKBOX(ID_PROJECTIONHACK2,ConfigDialog::AdvancedSettingsChanged) EVT_DIRPICKER_CHANGED(ID_TEXTUREPATH, ConfigDialog::TexturePathChange) END_EVENT_TABLE() @@ -190,6 +192,14 @@ void ConfigDialog::CreateGUIControls() m_EFBToTextureDisable->Enable(true); m_EFBToTextureDisable->SetValue(g_Config.bEBFToTextureDisable); + m_ProjectionHax1 = new wxCheckBox(m_PageAdvanced, ID_PROJECTIONHACK1, wxT("Projection before R945"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); + m_ProjectionHax1->Enable(true); + m_ProjectionHax1->SetValue(g_Config.bProjectionHax1); + + m_ProjectionHax2 = new wxCheckBox(m_PageAdvanced, ID_PROJECTIONHACK2, wxT("Projection hack of R844"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); + m_ProjectionHax2->Enable(true); + m_ProjectionHax2->SetValue(g_Config.bProjectionHax2); + sAdvanced = new wxBoxSizer(wxVERTICAL); sInfo = new wxGridBagSizer(0, 0); sInfo->Add(m_ShowFPS, wxGBPosition(0, 0), wxGBSpan(1, 2), wxALL, 5); @@ -216,6 +226,8 @@ void ConfigDialog::CreateGUIControls() sHacks = new wxGridBagSizer(0, 0); sHacks->Add(m_EFBToTextureDisable, wxGBPosition(0, 0), wxGBSpan(1, 1), wxALL, 5); + sHacks->Add(m_ProjectionHax1, wxGBPosition(1, 0), wxGBSpan(1, 1), wxALL, 5); + sHacks->Add(m_ProjectionHax2, wxGBPosition(2, 0), wxGBSpan(1, 2), wxALL, 5); sbHacks->Add(sHacks); sAdvanced->Add(sbHacks, 0, wxEXPAND|wxALL, 5); m_PageAdvanced->SetSizer(sAdvanced); @@ -343,6 +355,14 @@ void ConfigDialog::AdvancedSettingsChanged(wxCommandEvent& event) case ID_EFBTOTEXTUREDISABLE: g_Config.bEBFToTextureDisable = m_EFBToTextureDisable->IsChecked(); break; + case ID_PROJECTIONHACK1: + g_Config.bProjectionHax1 = m_ProjectionHax1->IsChecked(); + break; + case ID_PROJECTIONHACK2: + g_Config.bProjectionHax2 = m_ProjectionHax2->IsChecked(); + break; + default: + break; } } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h index e80bc15150..71d7c70a15 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h @@ -94,6 +94,8 @@ class ConfigDialog : public wxDialog wxCheckBox *m_DumpTextures; wxDirPickerCtrl *m_TexturePath; wxCheckBox *m_EFBToTextureDisable; + wxCheckBox *m_ProjectionHax1; + wxCheckBox *m_ProjectionHax2; enum { @@ -134,6 +136,8 @@ class ConfigDialog : public wxDialog ID_TEXTUREPATH, ID_EFBTOTEXTUREDISABLE, + ID_PROJECTIONHACK1, + ID_PROJECTIONHACK2 }; void OnClose(wxCloseEvent& event); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderManager.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderManager.cpp index d17d7005ac..358d6bd275 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderManager.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderManager.cpp @@ -441,7 +441,20 @@ void VertexShaderMngr::SetConstants() g_fProjectionMatrix[8] = 0.0f; g_fProjectionMatrix[9] = 0.0f; g_fProjectionMatrix[10] = xfregs.rawProjection[4]; - g_fProjectionMatrix[11] = xfregs.rawProjection[5]; + + //---------Projection[11]--------- + // No hacks + if ((!g_Config.bProjectionHax1 && !g_Config.bProjectionHax2) || (g_Config.bProjectionHax1 && g_Config.bProjectionHax2)) + g_fProjectionMatrix[11] = -(0.0f - xfregs.rawProjection[5]); + + // Before R945 Hack + if(g_Config.bProjectionHax1 && !g_Config.bProjectionHax2) + g_fProjectionMatrix[11] = -(1.0f - xfregs.rawProjection[5]); + + // R844 Hack + if(!g_Config.bProjectionHax1 && g_Config.bProjectionHax2) + g_fProjectionMatrix[11] = xfregs.rawProjection[5]; + //-------------------------------- g_fProjectionMatrix[12] = 0.0f; g_fProjectionMatrix[13] = 0.0f; @@ -464,7 +477,21 @@ void VertexShaderMngr::SetConstants() g_fProjectionMatrix[8] = 0.0f; g_fProjectionMatrix[9] = 0.0f; g_fProjectionMatrix[10] = xfregs.rawProjection[4]; - g_fProjectionMatrix[11] = 1.0f + xfregs.rawProjection[5]; + + //---------Projection[11]--------- + // No hacks + if ((!g_Config.bProjectionHax1 && !g_Config.bProjectionHax2) || (g_Config.bProjectionHax1 && g_Config.bProjectionHax2)) + g_fProjectionMatrix[11] = -(-1.0f - xfregs.rawProjection[5]); + + // Before R945 Hack + if (g_Config.bProjectionHax1 && !g_Config.bProjectionHax2) + g_fProjectionMatrix[11] = -(0.0f - xfregs.rawProjection[5]); + + // R844 Hack + if (!g_Config.bProjectionHax1 && g_Config.bProjectionHax2) + g_fProjectionMatrix[11] = -xfregs.rawProjection[5]; + + //-------------------------------- g_fProjectionMatrix[12] = 0; g_fProjectionMatrix[13] = 0;