summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/PixelShaderManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon/Src/PixelShaderManager.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/PixelShaderManager.cpp28
1 files changed, 27 insertions, 1 deletions
diff --git a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp
index fb484ca0c0..96ba2cb3f2 100644
--- a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp
+++ b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp
@@ -22,6 +22,7 @@
#include "PixelShaderManager.h"
#include "VideoCommon.h"
#include "VideoConfig.h"
+#include "RenderBase.h"
static float GC_ALIGNED16(s_fMaterials[16]);
static int s_nColorsChanged[2]; // 0 - regular colors, 1 - k colors
static int s_nIndTexMtxChanged;
@@ -31,6 +32,7 @@ static bool s_bZTextureTypeChanged;
static bool s_bDepthRangeChanged;
static bool s_bFogColorChanged;
static bool s_bFogParamChanged;
+static bool s_bFogRangeAdjustChanged;
static int nLightsChanged[2]; // min,max
static float lastDepthRange[2]; // 0 = far z, 1 = far - near
static float lastRGBAfull[2][4][4];
@@ -57,7 +59,7 @@ void PixelShaderManager::Dirty()
s_nIndTexScaleChanged = 0xFF;
s_nIndTexMtxChanged = 15;
s_bAlphaChanged = s_bZBiasChanged = s_bZTextureTypeChanged = s_bDepthRangeChanged = true;
- s_bFogColorChanged = s_bFogParamChanged = true;
+ s_bFogRangeAdjustChanged = s_bFogColorChanged = s_bFogParamChanged = true;
nLightsChanged[0] = 0; nLightsChanged[1] = 0x80;
nMaterialsChanged = 15;
}
@@ -214,6 +216,25 @@ void PixelShaderManager::SetConstants()
s_bFogParamChanged = false;
}
+ if (s_bFogRangeAdjustChanged)
+ {
+ if(!g_ActiveConfig.bDisableFog && bpmem.fogRange.Base.Enabled == 1)
+ {
+ //bpmem.fogRange.Base.Center : center of the viewport in x axis. observation: bpmem.fogRange.Base.Center = realcenter + 342;
+ int center = ((u32)bpmem.fogRange.Base.Center) - 342;
+ // normalice center to make calculations easy
+ float ScreenSpaceCenter = center / (2.0f * xfregs.rawViewport[0]);
+ ScreenSpaceCenter = (ScreenSpaceCenter * 2.0f) - 1.0f;
+ //bpmem.fogRange.K seems to be a table of precalculated coeficients for the adjust factor
+ //observations: bpmem.fogRange.K[0].LO apears to be the lowest value and bpmem.fogRange.K[4].HI the largest
+ // they always seems to be larger than 256 so my teory is :
+ // they are the coeficients from the center to th e border of the screen
+ // so to simplify i use the hi coeficient as K in the shader taking 256 as the scale
+ SetPSConstant4f(C_FOG + 2, ScreenSpaceCenter, (float)Renderer::EFBToScaledX((int)(2.0f * xfregs.rawViewport[0])), bpmem.fogRange.K[4].HI / 256.0f,0.0f);
+ }
+ s_bFogRangeAdjustChanged = false;
+ }
+
if (g_ActiveConfig.bEnablePixelLigting && g_ActiveConfig.backend_info.bSupportsPixelLighting && nLightsChanged[0] >= 0) // config check added because the code in here was crashing for me inside SetPSConstant4f
{
// lights don't have a 1 to 1 mapping, the color component needs to be converted to 4 floats
@@ -394,6 +415,11 @@ void PixelShaderManager::SetFogParamChanged()
s_bFogParamChanged = true;
}
+void PixelShaderManager::SetFogRangeAdjustChanged()
+{
+ s_bFogRangeAdjustChanged = true;
+}
+
void PixelShaderManager::SetColorMatrix(const float* pmatrix)
{
SetMultiPSConstant4fv(C_COLORMATRIX,7,pmatrix);