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.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/Source/Core/VideoCommon/VertexShaderManager.cpp b/Source/Core/VideoCommon/VertexShaderManager.cpp
index 555819e072..ce43235977 100644
--- a/Source/Core/VideoCommon/VertexShaderManager.cpp
+++ b/Source/Core/VideoCommon/VertexShaderManager.cpp
@@ -172,14 +172,22 @@ void VertexShaderManager::SetConstants(const std::vector<std::string>& textures)
dstlight.pos[1] = light.dpos[1];
dstlight.pos[2] = light.dpos[2];
+ // TODO: Hardware testing is needed to confirm that this normalization is correct
+ auto sanitize = [](float f) {
+ if (std::isnan(f))
+ return 0.0f;
+ else if (std::isinf(f))
+ return f > 0.0f ? 1.0f : -1.0f;
+ else
+ return f;
+ };
double norm = double(light.ddir[0]) * double(light.ddir[0]) +
double(light.ddir[1]) * double(light.ddir[1]) +
double(light.ddir[2]) * double(light.ddir[2]);
norm = 1.0 / sqrt(norm);
- float norm_float = static_cast<float>(norm);
- dstlight.dir[0] = light.ddir[0] * norm_float;
- dstlight.dir[1] = light.ddir[1] * norm_float;
- dstlight.dir[2] = light.ddir[2] * norm_float;
+ dstlight.dir[0] = sanitize(static_cast<float>(light.ddir[0] * norm));
+ dstlight.dir[1] = sanitize(static_cast<float>(light.ddir[1] * norm));
+ dstlight.dir[2] = sanitize(static_cast<float>(light.ddir[2] * norm));
}
dirty = true;