//
// Vertex shader for spherical harmonics lighting
//
// Author: Randi Rost
//
// Copyright (C) 2005 3Dlabs, Inc.
//
// See 3Dlabs-License.txt for license information
//

varying vec3  DiffuseColor;
uniform float ScaleFactor;

const float C1 = 0.429043;
const float C2 = 0.511664;
const float C3 = 0.743125;
const float C4 = 0.886227;
const float C5 = 0.247708;


// Constants for Uffizi Gallery lighting
const vec3 L00  = vec3(  0.3168843,  0.3073441,  0.3495361);
const vec3 L1m1 = vec3(  0.3711289,  0.3682168,  0.4292092);
const vec3 L10  = vec3( -0.0034406, -0.0031891, -0.0039797);
const vec3 L11  = vec3( -0.0084237, -0.0087049, -0.0116718);
const vec3 L2m2 = vec3( -0.0190313, -0.0192164, -0.0250836);
const vec3 L2m1 = vec3( -0.0110002, -0.0102972, -0.0119522);
const vec3 L20  = vec3( -0.2787319, -0.2752035, -0.3184335);
const vec3 L21  = vec3(  0.0011448,  0.0009613,  0.0008975);
const vec3 L22  = vec3( -0.2419374, -0.2410955, -0.2842899);

void main(void)
{
    vec3 tnorm      = normalize(gl_NormalMatrix * gl_Normal);

    DiffuseColor    = C1 * L22 * (tnorm.x * tnorm.x - tnorm.y * tnorm.y) +
                      C3 * L20 * tnorm.z * tnorm.z +
                      C4 * L00 -
                      C5 * L20 +
                      2.0 * C1 * L2m2 * tnorm.x * tnorm.y +
                      2.0 * C1 * L21  * tnorm.x * tnorm.z +
                      2.0 * C1 * L2m1 * tnorm.y * tnorm.z +
                      2.0 * C2 * L11  * tnorm.x +
                      2.0 * C2 * L1m1 * tnorm.y +
                      2.0 * C2 * L10  * tnorm.z;

    DiffuseColor   *= ScaleFactor;

    gl_Position     = ftransform();
}
