ecere/gfx/drivers/OpenGL: Fixed two-sided lighting
[sdk] / ecere / src / gfx / drivers / gl3 / fixed.vertex
1 #version 150
2
3 uniform mat4 projection_matrix;
4 uniform mat4 modelview_matrix;
5 uniform vec4 current_color;
6
7 // Lights
8 uniform bool lightsOn[8];
9 uniform vec4 lightsPos[8];
10
11 uniform vec3 lightsDiffuse[8];
12 uniform vec3 lightsAmbient[8];
13 uniform vec3 lightsSpecular[8];
14
15 uniform vec3 globalAmbient;
16 uniform bool lightingOn;
17
18 // Material
19 uniform bool perVertexColor;
20 uniform vec3 matDiffuse;
21 uniform vec3 matAmbient;
22 uniform vec3 matSpecular;
23 uniform vec3 matEmissive;
24 uniform float matOpacity;
25 uniform float matPower;
26 uniform bool matTwoSided;
27
28 in vec2 texCoord;
29 in vec3 vertex;
30 in vec3 normal;
31 in vec4 color;
32
33 out vec2 fTexCoord;
34 out vec4 fColor;
35 out vec4 fColorBack;
36
37 void main(void)
38 {
39    vec3 n = normalize(mat3x3(modelview_matrix) * normal);
40    gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0);
41    fTexCoord = texCoord;
42
43    if(lightingOn)
44    {
45       int i;
46       vec3 diffuseColor = perVertexColor ? color.xyz : matDiffuse;
47       vec3 ambientColor = perVertexColor ? color.xyz : matAmbient;
48       float opacity = perVertexColor ? color.w : matOpacity;
49       vec3 c = vec3(0);
50       vec3 c2 = vec3(0);
51       vec3 ecPosition3 = vec3(gl_Position) / gl_Position.w;
52       vec3 eye = vec3(0.0, 0.0, 1.0);
53
54       fColor = vec4(0);
55       if(matTwoSided)
56          fColorBack = vec4(0);
57       for(i = 0; i < 8; i++)
58          if(lightsOn[i])
59          {
60             vec4 l = lightsPos[i];
61             float d = dot(n, l.xyz);
62             float pf = 0;
63             vec3 VP = l.xyz;
64             vec3 halfVector;
65             if(matPower != 0.0)
66             {
67                float nDotVP;
68                VP = l.xyz;
69                halfVector = normalize(VP + eye);
70                nDotVP = max(0, dot(n, VP));
71                if(nDotVP != 0.0)
72                {
73                   float nDotHV = max(0.0, dot(n, halfVector));
74                   pf = pow(nDotHV, matPower);
75                }
76             }
77
78             c += diffuseColor * min(1, max(0, d)) * lightsDiffuse[i];
79             c += matSpecular * pf * lightsSpecular[i];
80             c += matAmbient * lightsAmbient[i];
81
82             if(matTwoSided)
83             {
84                vec3 iN = -n;
85                float d2 = dot(iN, l.xyz);
86                if(matPower != 0.0)
87                {
88                   float nDotVP = max(0, dot(iN, VP));
89                   if(nDotVP != 0.0)
90                   {
91                      float nDotHV = max(0.0, dot(iN, halfVector));
92                      pf = pow(nDotHV, matPower);
93                   }
94                }
95
96                c2 += diffuseColor * min(1, max(0, d2)) * lightsDiffuse[i];
97                c2 += matSpecular * pf * lightsSpecular[i];
98                c2 += matAmbient * lightsAmbient[i];
99             }
100          }
101
102       c += ambientColor * globalAmbient;
103       c += matEmissive;
104       fColor = vec4(c, opacity);
105
106       if(matTwoSided)
107       {
108          c2 += ambientColor * globalAmbient;
109          c2 += matEmissive;
110          fColorBack = vec4(c2, opacity);
111       }
112    }
113    else
114       fColor = current_color * color;
115 }