// Lights
uniform bool lightsOn[8];
uniform vec4 lightsPos[8];
+uniform vec4 lightsPosI[8];
-uniform vec4 lightsDiffuse[8];
-uniform vec4 lightsAmbient[8];
-uniform vec4 lightsSpecular[8];
+uniform vec3 lightsDiffuse[8];
+uniform vec3 lightsAmbient[8];
+uniform vec3 lightsSpecular[8];
-uniform vec4 globalAmbient;
+uniform vec3 globalAmbient;
uniform bool lightingOn;
+// Material
+uniform bool perVertexColor;
+uniform vec3 matDiffuse;
+uniform vec3 matAmbient;
+uniform vec3 matSpecular;
+uniform vec3 matEmissive;
+uniform float matOpacity;
+uniform float matPower;
+uniform bool matTwoSided;
+
in vec2 texCoord;
in vec3 vertex;
in vec3 normal;
if(lightingOn)
{
int i;
- vec4 diffuseColor = current_color * color;
- vec4 ambientColor = diffuseColor;
+ vec3 diffuseColor = perVertexColor ? color.xyz : matDiffuse;
+ vec3 ambientColor = perVertexColor ? color.xyz : matAmbient;
+ float opacity = perVertexColor ? color.w : matOpacity;
+ vec3 c = vec3(0);
+ vec3 ecPosition3 = vec3(gl_Position) / gl_Position.w;
+ vec3 eye = vec3(0.0, 0.0, 1.0);
fColor = vec4(0);
for(i = 0; i < 8; i++)
if(lightsOn[i])
{
vec4 l = lightsPos[i];
- fColor += diffuseColor * min(1, max(0, dot(n, l.xyz))) * lightsDiffuse[i];
+ float d = dot(n, l.xyz);
+ float pf = 0;
+ if(matTwoSided)
+ {
+ float d2 = dot(n, lightsPosI[i].xyz);
+ if(d2 > d)
+ d = d2;
+ }
+ if(matPower != 0.0)
+ {
+ vec3 VP = l.xyz;
+ vec3 halfVector = normalize(VP + eye);
+ float nDotVP = max(0, dot(n, VP));
+ if(nDotVP != 0.0)
+ {
+ float nDotHV = max(0.0, dot(n, halfVector));
+ pf = pow(nDotHV, matPower);
+ }
+ }
+
+ c += diffuseColor * min(1, max(0, d)) * lightsDiffuse[i];
+ c += matSpecular * pf * lightsSpecular[i];
+ c += matAmbient * lightsAmbient[i];
}
- fColor += ambientColor * globalAmbient;
+
+ c += ambientColor * globalAmbient;
+ c += matEmissive;
+ fColor = vec4(c, opacity);
}
else
fColor = current_color * color;