1/**
2 * @project Spring RTS
3 * @file bumpWaterVS.glsl
4 * @brief An extended bumpmapping water shader
5 * @author jK
6 *
7 * Copyright (C) 2008,2009.  Licensed under the terms of the
8 * GNU GPL, v2 or later.
9 */
10
11//////////////////////////////////////////////////
12// runtime defined constants are:
13// #define SurfaceColor     vec4
14// #define DiffuseColor     vec3
15// #define PlaneColor       vec4  (unused)
16// #define AmbientFactor    float
17// #define DiffuseFactor    float   (note: it is the map defined value multipled with 15x!)
18// #define SpecularColor    vec3
19// #define SpecularPower    float
20// #define SpecularFactor   float
21// #define PerlinStartFreq  float
22// #define PerlinFreq       float
23// #define PerlinAmp        float
24// #define Speed            float
25// #define FresnelMin       float
26// #define FresnelMax       float
27// #define FresnelPower     float
28// #define ScreenInverse    vec2
29// #define ViewPos          vec2
30// #define MapMid           vec3
31// #define SunDir           vec3
32// #define ReflDistortion   float
33// #define BlurBase         vec2
34// #define BlurExponent     float
35// #define PerlinStartFreq  float
36// #define PerlinLacunarity float
37// #define PerlinAmp        float
38// #define WindSpeed        float
39// #define TexGenPlane      vec4
40// #define ShadingPlane     vec4
41
42//////////////////////////////////////////////////
43// possible flags are:
44// //#define opt_heightmap
45// #define opt_reflection
46// #define opt_refraction
47// #define opt_shorewaves
48// #define opt_depth
49// #define opt_blurreflection
50// #define opt_texrect
51// #define opt_endlessocean
52
53uniform float frame;
54uniform vec3 eyePos;
55
56varying vec3 eyeVec;
57varying vec3 ligVec;
58varying vec3 worldPos;
59
60void main()
61{
62	// COMPUTE TEXCOORDS
63	gl_TexCoord[0] = TexGenPlane * gl_Vertex.xzxz;
64	gl_TexCoord[5].st = ShadingPlane.xy * gl_Vertex.xz;
65
66	// COMPUTE WAVE TEXTURE COORDS
67	float fstart = PerlinStartFreq;
68	float f      = PerlinLacunarity;
69	gl_TexCoord[1].st = (vec2(-1.0,-1.0) + gl_TexCoord[0].pq + 0.75) * fstart       + frame * WindSpeed * gl_MultiTexCoord1.st;
70	gl_TexCoord[1].pq = (vec2(-1.0, 1.0) + gl_TexCoord[0].pq + 0.50) * fstart*f     - frame * WindSpeed * gl_MultiTexCoord1.st;
71	gl_TexCoord[2].st = (vec2( 1.0,-1.0) + gl_TexCoord[0].pq + 0.25) * fstart*f*f   + frame * WindSpeed * gl_MultiTexCoord1.st;
72	gl_TexCoord[2].pq = (vec2( 1.0, 1.0) + gl_TexCoord[0].pq + 0.00) * fstart*f*f*f + frame * WindSpeed * gl_MultiTexCoord1.st;
73
74	gl_TexCoord[3].st = gl_TexCoord[0].pq * 160.0 + frame * 2.5;
75	gl_TexCoord[3].pq = gl_TexCoord[0].pq * 90.0  - frame * 2.0;
76	gl_TexCoord[4].st = gl_TexCoord[0].pq * 2.0;
77	gl_TexCoord[4].pq = gl_TexCoord[0].pq * 6.0 + frame * 0.37;
78
79	// SIMULATE WAVES
80	vec4 myVertex;
81	myVertex.xzw = gl_Vertex.xzw;
82	myVertex.y = 3.0 * (cos(frame * 500.0 + gl_Vertex.z) * sin(frame * 500.0 + gl_Vertex.x / 1000.0));
83
84	// COMPUTE LIGHT VECTORS
85	eyeVec = eyePos - gl_Vertex.xyz;
86	ligVec = normalize(SunDir*20000.0 + MapMid - myVertex.xyz);
87
88	// FOG
89	worldPos = myVertex.xyz;
90	gl_FogFragCoord = (gl_ModelViewMatrix * myVertex).z;
91
92	// POSITION
93	gl_Position = gl_ModelViewProjectionMatrix * myVertex;
94}
95