summaryrefslogtreecommitdiff
path: root/src/modules/evas/engines/gl_common/shader_3d/flat_vert.shd
blob: 10b94933046d569c5a37712ad90b39860fab3039 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
uniform   mat4  uMatrixMvp;
uniform   mat3  uMatrixNormal;
uniform   mat4  uMatrixModelview;
uniform   vec4  uLightPosition;
varying   vec2  vFactor;

VERTEX_SHADER_USE_SHADOWS
VERTEX_SHADER_USE_POSITION
VERTEX_SHADER_USE_NORMALS
VERTEX_SHADER_USE_TEXCOORD
VERTEX_SHADER_NEED_TEX_COORD

#ifdef LIGHT_SPOT
uniform   vec3  uLightSpotDir;
uniform   float uLightSpotExp;
uniform   float uLightSpotCutoffCos;
#endif //LIGHT_SPOT

#ifdef SPECULAR
uniform float   uMaterialShininess;
#endif //SPECULAR

#ifdef LIGHT_ATTENUATION
uniform   vec3  uLightAtten;
#endif //LIGHT_ATTENUATION

void vertexFlat(vec4 position, vec3 normal)
{
   vec3  lv;
   float factor;
   normal = uMatrixNormal * normal;
   position = uMatrixModelview * position;

#ifdef NORMALIZE_NORMALS
   normal = normalize(normal);
#endif //NORMALIZE_NORMALS

#ifdef LIGHT_DIRECTIONAL
   lv = uLightPosition.xyz;
#else
   lv = uLightPosition.xyz - position.xyz;
   lv = normalize(lv);
#endif //LIGHT_DIRECTIONAL

   factor = max(dot(lv, normal), 0.0);

#ifdef LIGHT_SPOT
   float f = dot(-lv, uLightSpotDir);
   if (f > uLightSpotCutoffCos)
     factor *= pow(f, uLightSpotExp);
   else
      factor = 0.0;
#endif //LIGHT_SPOT

   if (factor > 0.0)
     {

#ifdef DIFFUSE
        vFactor.x = factor;
#else
        vFactor.x = 0.0;
#endif //DIFFUSE

#ifdef SPECULAR
        vec3  hv = normalize(normalize(-position.xyz) + lv);
        factor = pow(max(dot(hv, normal), 0.0), uMaterialShininess);
        vFactor.y = factor;
#endif //SPECULAR

     }
   else
     vFactor = vec2(0.0, 0.0);

   /* Light attenuation. */
#ifdef LIGHT_ATTENUATION
   float dist = length(lv);
   vFactor /= dot(uLightAtten, vec3(1.0, dist, dist * dist));
#endif //LIGHT_ATTENUATION
}

void main()
{

   VERTEX_SHADER_POSITION
   VERTEX_SHADER_NORMAL
   VERTEX_SHADER_TEXCOORD

   gl_Position = uMatrixMvp * position;
   vertexFlat(position, normal);

   VERTEX_SHADER_SHADOWED
}