Merge pull request #2790 from phire/even_smarter_heuristic

Make the GameCube game widescreen heuristic smarter.
This commit is contained in:
Scott Mansell 2015-08-01 15:59:06 +12:00
commit a3eb16c6e1
1 changed files with 22 additions and 10 deletions

View File

@ -89,6 +89,23 @@ static float PHackValue(std::string sValue)
return f; return f;
} }
// Due to the BT.601 standard which the GameCube is based on being a compromise
// between PAL and NTSC, neither standard gets square pixels. They are each off
// by ~9% in opposite directions.
// Just in case any game decides to take this into account, we do both these
// tests with a large amount of slop.
static bool AspectIs4_3(float width, float height)
{
float aspect = fabsf(width / height);
return fabsf(aspect - 4.0f / 3.0f) < 4.0f / 3.0f * 0.11; // within 11% of 4:3
}
static bool AspectIs16_9(float width, float height)
{
float aspect = fabsf(width / height);
return fabsf(aspect - 16.0f / 9.0f) < 16.0f / 9.0f * 0.11; // within 11% of 16:9
}
void UpdateProjectionHack(int iPhackvalue[], std::string sPhackvalue[]) void UpdateProjectionHack(int iPhackvalue[], std::string sPhackvalue[])
{ {
float fhackvalue1 = 0, fhackvalue2 = 0; float fhackvalue1 = 0, fhackvalue2 = 0;
@ -422,16 +439,11 @@ void VertexShaderManager::SetConstants()
// Heuristic to detect if a GameCube game is in 16:9 anamorphic widescreen mode. // Heuristic to detect if a GameCube game is in 16:9 anamorphic widescreen mode.
if (!SConfig::GetInstance().bWii) if (!SConfig::GetInstance().bWii)
{ {
// Due to the BT.601 standard which the GameCube is based on being a compromise bool viewport_is_4_3 = AspectIs4_3(xfmem.viewport.wd, xfmem.viewport.ht);
// between PAL and NTSC, neither standard gets square pixels. They are each off if (AspectIs16_9(rawProjection[2], rawProjection[0]) && viewport_is_4_3)
// by ~9% in opposite directions. g_aspect_wide = true; // Projection is 16:9 and viewport is 4:3, we are rendering an anamorphic widescreen picture
// Just in case any game decides to take this into account, we do these tests else if (AspectIs4_3(rawProjection[2], rawProjection[0]) && viewport_is_4_3)
// with a large amount of slop. g_aspect_wide = false; // Project and viewports are both 4:3, we are rendering a normal image.
float aspect = fabsf(rawProjection[2] / rawProjection[0]);
if (fabsf(aspect - 16.0f/9.0f) < 16.0f/9.0f * 0.11) // within 11% of 16:9
g_aspect_wide = true;
else if (fabsf(aspect - 4.0f/3.0f) < 4.0f/3.0f * 0.11) // within 11% of 4:3
g_aspect_wide = false;
} }
SETSTAT_FT(stats.gproj_0, g_fProjectionMatrix[0]); SETSTAT_FT(stats.gproj_0, g_fProjectionMatrix[0]);