//
// 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;

#if 0
// Constants for Grace Cathedral lighting
const vec3 L00  = vec3( 0.78908,  0.43710,  0.54161);
const vec3 L1m1 = vec3( 0.39499,  0.34989,  0.60488);
const vec3 L10  = vec3(-0.33974, -0.18236, -0.26940);
const vec3 L11  = vec3(-0.29213, -0.05562,  0.00944);
const vec3 L2m2 = vec3(-0.11141, -0.05090, -0.12231);
const vec3 L2m1 = vec3(-0.26240, -0.22401, -0.47479);
const vec3 L20  = vec3(-0.15570, -0.09471, -0.14733);
const vec3 L21  = vec3( 0.56014,  0.21444,  0.13915);
const vec3 L22  = vec3( 0.21205, -0.05432, -0.30374);
#endif

#if 0
// Constants for Eucalyptus Grove lighting
const vec3 L00  = vec3( 0.3783264,  0.4260425,  0.4504587);
const vec3 L1m1 = vec3( 0.2887813,  0.3586803,  0.4147053);
const vec3 L10  = vec3( 0.0379030,  0.0295216,  0.0098567);
const vec3 L11  = vec3(-0.1033028, -0.1031690, -0.0884924);
const vec3 L2m2 = vec3(-0.0621750, -0.0554432, -0.0396779);
const vec3 L2m1 = vec3( 0.0077820, -0.0148312, -0.0471301);
const vec3 L20  = vec3(-0.0935561, -0.1254260, -0.1525629);
const vec3 L21  = vec3(-0.0572703, -0.0502192, -0.0363410);
const vec3 L22  = vec3( 0.0203348, -0.0044201, -0.0452180);
#endif

#if 0
// Constants for St. Peter's Basilica lighting
const vec3 L00  = vec3( 0.3623915,  0.2624130,  0.2326261);
const vec3 L1m1 = vec3( 0.1759130,  0.1436267,  0.1260569);
const vec3 L10  = vec3(-0.0247311, -0.0101253, -0.0010745);
const vec3 L11  = vec3( 0.0346500,  0.0223184,  0.0101350);
const vec3 L2m2 = vec3( 0.0198140,  0.0144073,  0.0043987);
const vec3 L2m1 = vec3(-0.0469596, -0.0254485, -0.0117786);
const vec3 L20  = vec3(-0.0898667, -0.0760911, -0.0740964);
const vec3 L21  = vec3( 0.0050194,  0.0038841,  0.0001374);
const vec3 L22  = vec3(-0.0818750, -0.0321501,  0.0033399);
#endif

#if 0
// 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);
#endif

#if 0
// Constants for Galileo's tomb lighting
const vec3 L00  = vec3( 1.0351604,  0.7603549,  0.7074635);
const vec3 L1m1 = vec3( 0.4442150,  0.3430402,  0.3403777);
const vec3 L10  = vec3(-0.2247797, -0.1828517, -0.1705181);
const vec3 L11  = vec3( 0.7110400,  0.5423169,  0.5587956);
const vec3 L2m2 = vec3( 0.6430452,  0.4971454,  0.5156357);
const vec3 L2m1 = vec3(-0.1150112, -0.0936603, -0.0839287);
const vec3 L20  = vec3(-0.3742487, -0.2755962, -0.2875017);
const vec3 L21  = vec3(-0.1694954, -0.1343096, -0.1335315);
const vec3 L22  = vec3( 0.5515260,  0.4222179,  0.4162488);
#endif

#if 0 
// Constants for Vine Street kitchen lighting
const vec3 L00  = vec3( 0.6396604,  0.6740969,  0.7286833);
const vec3 L1m1 = vec3( 0.2828940,  0.3159227,  0.3313502);
const vec3 L10  = vec3( 0.4200835,  0.5994586,  0.7748295);
const vec3 L11  = vec3(-0.0474917, -0.0372616, -0.0199377);
const vec3 L2m2 = vec3(-0.0984616, -0.0765437, -0.0509038);
const vec3 L2m1 = vec3( 0.2496256,  0.3935312,  0.5333141);
const vec3 L20  = vec3( 0.3813504,  0.5424832,  0.7141644);
const vec3 L21  = vec3( 0.0583734,  0.0066377, -0.0234326);
const vec3 L22  = vec3(-0.0325933, -0.0239167, -0.0330796);
#endif

#if 0
// Constants for Breezeway lighting
const vec3 L00  = vec3( 0.3175995,  0.3571678,  0.3784286);
const vec3 L1m1 = vec3( 0.3655063,  0.4121290,  0.4490332);
const vec3 L10  = vec3(-0.0071628, -0.0123780, -0.0146215);
const vec3 L11  = vec3(-0.1047419, -0.1183074, -0.1260049);
const vec3 L2m2 = vec3(-0.1304345, -0.1507366, -0.1702497);
const vec3 L2m1 = vec3(-0.0098978, -0.0155750, -0.0178279);
const vec3 L20  = vec3(-0.0704158, -0.0762753, -0.0865235);
const vec3 L21  = vec3( 0.0242531,  0.0279176,  0.0335200);
const vec3 L22  = vec3(-0.2858534, -0.3235718, -0.3586478);
#endif

#if 1
// Constants for Campus Sunset lighting
const vec3 L00  = vec3( 0.7870665,  0.9379944,  0.9799986);
const vec3 L1m1 = vec3( 0.4376419,  0.5579443,  0.7024107);
const vec3 L10  = vec3(-0.1020717, -0.1824865, -0.2749662);
const vec3 L11  = vec3( 0.4543814,  0.3750162,  0.1968642);
const vec3 L2m2 = vec3( 0.1841687,  0.1396696,  0.0491580);
const vec3 L2m1 = vec3(-0.1417495, -0.2186370, -0.3132702);
const vec3 L20  = vec3(-0.3890121, -0.4033574, -0.3639718);
const vec3 L21  = vec3( 0.0872238,  0.0744587,  0.0353051);
const vec3 L22  = vec3( 0.6662600,  0.6706794,  0.5246173);
#endif

#if 0
// Constants for Funston Beach Sunset lighting
const vec3 L00  = vec3( 0.6841148,  0.6929004,  0.7069543);
const vec3 L1m1 = vec3( 0.3173355,  0.3694407,  0.4406839);
const vec3 L10  = vec3(-0.1747193, -0.1737154, -0.1657420);
const vec3 L11  = vec3(-0.4496467, -0.4155184, -0.3416573);
const vec3 L2m2 = vec3(-0.1690202, -0.1703022, -0.1525870);
const vec3 L2m1 = vec3(-0.0837808, -0.0940454, -0.1027518);
const vec3 L20  = vec3(-0.0319670, -0.0214051, -0.0147691);
const vec3 L21  = vec3( 0.1641816,  0.1377558,  0.1010403);
const vec3 L22  = vec3( 0.3697189,  0.3097930,  0.2029923);
#endif

#if 0
// Constants for Old Town Square lighting
const vec3 L00  = vec3( 0.871297,  0.875222,  0.864470);
const vec3 L1m1 = vec3( 0.175058,  0.245335,  0.312891);
const vec3 L10  = vec3( 0.034675,  0.036107,  0.037362);
const vec3 L11  = vec3(-0.004629, -0.029448, -0.048028);
const vec3 L2m2 = vec3(-0.120535, -0.121160, -0.117507);
const vec3 L2m1 = vec3( 0.003242,  0.003624,  0.007511);
const vec3 L20  = vec3(-0.028667, -0.024926, -0.020998);
const vec3 L21  = vec3(-0.077539, -0.086325, -0.091591);
const vec3 L22  = vec3(-0.161784, -0.191783, -0.219152);
#endif

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();
}
