From 0e82ecca8619398f327ca3aa2ea7fa6282f3260a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 1 Sep 2013 03:11:02 -0700 Subject: [PATCH] Fix lighting when lightpos and spec coef are 0. Zero to the power of zero is mathematically undefined, NVIDIA chokes but AMD seems to accept it. Not well tested on Android. Fixes #2424. --- GPU/GLES/VertexShaderGenerator.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/VertexShaderGenerator.cpp b/GPU/GLES/VertexShaderGenerator.cpp index 9fb597b68c..b327ae35b4 100644 --- a/GPU/GLES/VertexShaderGenerator.cpp +++ b/GPU/GLES/VertexShaderGenerator.cpp @@ -229,14 +229,13 @@ void GenerateVertexShader(int prim, char *buffer, bool useHWTransform) { WRITE(p, "uniform vec3 u_lightpos%i;\n", i); } if (doLight[i] == LIGHT_FULL) { - // These are needed for the full thing - WRITE(p, "uniform mediump vec3 u_lightdir%i;\n", i); GELightType type = gstate.getLightType(i); if (type != GE_LIGHTTYPE_DIRECTIONAL) WRITE(p, "uniform mediump vec3 u_lightatt%i;\n", i); if (type == GE_LIGHTTYPE_SPOT || type == GE_LIGHTTYPE_UNKNOWN) { + WRITE(p, "uniform mediump vec3 u_lightdir%i;\n", i); WRITE(p, "uniform mediump float u_lightangle%i;\n", i); WRITE(p, "uniform mediump float u_lightspotCoef%i;\n", i); } @@ -449,6 +448,10 @@ void GenerateVertexShader(int prim, char *buffer, bool useHWTransform) { if (poweredDiffuse) { WRITE(p, " mediump float dot%i = pow(dot(toLight, worldnormal), u_matspecular.a);\n", i); + // Ugly NaN check. pow(0.0, 0.0) may be undefined, but PSP seems to treat it as 1.0. + // Seen in Tales of the World: Radiant Mythology (#2424.) + WRITE(p, " if (!(dot%i < 1.0) && !(dot%i > 0.0))\n", i, i); + WRITE(p, " dot%i = 1.0;\n", i); } else { WRITE(p, " mediump float dot%i = dot(toLight, worldnormal);\n", i); }