summaryrefslogtreecommitdiffstats
path: root/src/render/shaders/gl3/light.inc.frag
blob: 6d4b8b68f5c3af945cbeb992f4ddf3df0dccc00b (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
const int MAX_LIGHTS = 8;
struct Light {
    vec3 position;
    vec3 color;
    float intensity;
    vec3 direction;
    vec3 attenuation;
//    float cutOffAngle;
};
uniform Light lights[MAX_LIGHTS];
uniform int lightCount;

void adsModelNormalMapped(const in vec3 vpos, const in vec3 vnormal, const in vec3 eye, const in float shininess,
                          const in mat3 tangentMatrix,
                          out vec3 diffuseColor, out vec3 specularColor)
{
    diffuseColor = vec3(0.0);
    specularColor = vec3(0.0);

    vec3 n = normalize( vnormal );

    int i;
    for (i = 0; i < lightCount; ++i) {
        vec3 lightDir = lights[i].direction;
        float att = 1.0;
        if (length( lightDir ) == 0.0) {
            lightDir = lights[i].position - vpos;
            if (length( lights[i].attenuation ) != 0.0) {
                float dist = length(lightDir);
                att = 1.0 / (lights[i].attenuation.x + lights[i].attenuation.y * dist + lights[i].attenuation.z * dist * dist);
            }
        }

        vec3 s = normalize( tangentMatrix * lightDir );
        float diffuse = max( dot( s, n ), 0.0 );

        float specular = 0.0;
        if (diffuse > 0.0 && shininess > 0.0) {
            vec3 r = reflect( -s, n );
            vec3 v = normalize( tangentMatrix * ( eye - vpos ) );
            float normFactor = ( shininess + 2.0 ) / 2.0;
            specular = normFactor * pow( max( dot( r, v ), 0.0 ), shininess );
        }

        diffuseColor += att * lights[i].intensity * diffuse * lights[i].color;
        specularColor += specular;
    }
}

void adsModel(const in vec3 vpos, const in vec3 vnormal, const in vec3 eye, const in float shininess,
              out vec3 diffuseColor, out vec3 specularColor)
{
    diffuseColor = vec3(0.0);
    specularColor = vec3(0.0);

    vec3 n = normalize( vnormal );

    int i;
    for (i = 0; i < lightCount; ++i) {
        vec3 lightDir = lights[i].direction;
        float att = 1.0;
        if (length( lightDir ) == 0.0) {
            lightDir = lights[i].position - vpos;
            if (length( lights[i].attenuation ) != 0.0) {
                float dist = length(lightDir);
                att = 1.0 / (lights[i].attenuation.x + lights[i].attenuation.y * dist + lights[i].attenuation.z * dist * dist);
            }
        }

        vec3 s = normalize( lightDir );
        float diffuse = max( dot( s, n ), 0.0 );

        float specular = 0.0;
        if (diffuse > 0.0 && shininess > 0.0) {
            vec3 r = reflect( -s, n );
            vec3 v = normalize( eye - vpos );
            float normFactor = ( shininess + 2.0 ) / 2.0;
            specular = normFactor * pow( max( dot( r, v ), 0.0 ), shininess );
        }

        diffuseColor += att * lights[i].intensity * diffuse * lights[i].color;
        specularColor += specular;
    }
}

void adModel(const in vec3 vpos, const in vec3 vnormal, out vec3 diffuseColor)
{
    diffuseColor = vec3(0.0);

    vec3 n = normalize( vnormal );

    int i;
    for (i = 0; i < lightCount; ++i) {
        vec3 lightDir = lights[i].direction;
        float att = 1.0;
        if (length( lightDir ) == 0.0) {
            lightDir = lights[i].position - vpos;
            if (length( lights[i].attenuation ) != 0.0) {
                float dist = length(lightDir);
                att = 1.0 / (lights[i].attenuation.x + lights[i].attenuation.y * dist + lights[i].attenuation.z * dist * dist);
            }
        }

        vec3 s = normalize( lightDir );
        float diffuse = max( dot( s, n ), 0.0 );

        diffuseColor += att * lights[i].intensity * diffuse * lights[i].color;
    }
}