62cf8f151a3f67875fdf8d6928f6ec8619e69cfc
[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 // Fog
29 uniform bool fogOn;
30 uniform float fogDensity;
31 uniform vec3 fogColor;
32
33 in vec2 texCoord;
34 in vec3 vertex;
35 in vec3 normal;
36 in vec4 color;
37
38 out vec2 fTexCoord;
39 out vec4 fColor;
40 out vec4 fColorBack;
41
42 void main(void)
43 {
44    float f = 1;
45    vec3 n = normalize(mat3x3(modelview_matrix) * normal);
46    vec4 pos = modelview_matrix * vec4(vertex, 1.0);
47
48    gl_Position = projection_matrix * pos;
49    fTexCoord = texCoord;
50
51    if(fogOn)
52       f = clamp(exp(fogDensity * pos.z), 0, 1);
53
54    if(lightingOn)
55    {
56       int i;
57       vec3 diffuseColor = perVertexColor ? color.xyz : matDiffuse;
58       vec3 ambientColor = perVertexColor ? color.xyz : matAmbient;
59       float opacity = perVertexColor ? color.w : matOpacity;
60       vec3 c = vec3(0);
61       vec3 c2 = vec3(0);
62       // vec3 ecPosition3 = vec3(gl_Position) / gl_Position.w;
63       vec3 eye = vec3(0.0, 0.0, 1.0);
64
65       fColor = vec4(0);
66       if(matTwoSided)
67          fColorBack = vec4(0);
68       for(i = 0; i < 8; i++)
69          if(lightsOn[i])
70          {
71             vec4 l = lightsPos[i];
72             float d = dot(n, l.xyz);
73             float pf = 0;
74             vec3 VP = l.xyz;
75             vec3 halfVector;
76             if(matPower != 0.0)
77             {
78                float nDotVP;
79                VP = l.xyz;
80                halfVector = normalize(VP + eye);
81                nDotVP = max(0, dot(n, VP));
82                if(nDotVP != 0.0)
83                {
84                   float nDotHV = max(0.0, dot(n, halfVector));
85                   pf = pow(nDotHV, matPower);
86                }
87             }
88
89             c += diffuseColor * min(1, max(0, d)) * lightsDiffuse[i];
90             c += matSpecular * pf * lightsSpecular[i];
91             c += matAmbient * lightsAmbient[i];
92
93             if(matTwoSided)
94             {
95                vec3 iN = -n;
96                float d2 = dot(iN, l.xyz);
97                if(matPower != 0.0)
98                {
99                   float nDotVP = max(0, dot(iN, VP));
100                   if(nDotVP != 0.0)
101                   {
102                      float nDotHV = max(0.0, dot(iN, halfVector));
103                      pf = pow(nDotHV, matPower);
104                   }
105                }
106
107                c2 += diffuseColor * min(1, max(0, d2)) * lightsDiffuse[i];
108                c2 += matSpecular * pf * lightsSpecular[i];
109                c2 += matAmbient * lightsAmbient[i];
110             }
111          }
112
113       c += ambientColor * globalAmbient;
114       c += matEmissive;
115       fColor = vec4(c, opacity);
116
117       if(fogOn)
118          fColor = f * fColor + (1-f) * vec4(fogColor, 1);
119
120       if(matTwoSided)
121       {
122          c2 += ambientColor * globalAmbient;
123          c2 += matEmissive;
124          fColorBack = vec4(c2, opacity);
125
126          if(fogOn)
127             fColorBack = f * fColorBack + (1-f) * vec4(fogColor, 1);
128       }
129    }
130    else
131    {
132       fColor = current_color * color;
133
134       if(fogOn)
135          fColor = f * fColor + (1-f) * vec4(fogColor, 1);
136    }
137 }