ecere/gfx/drivers/OpenGL: Materials & Light colors support
[sdk] / ecere / src / gfx / drivers / gl3 / fixed.vertex
index ee92422..d696727 100644 (file)
@@ -7,14 +7,25 @@ uniform vec4 current_color;
 // 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;
@@ -32,17 +43,46 @@ void main(void)
    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;