1attribute vec3  attr_Position;
2attribute vec3  attr_Normal;
3
4attribute vec4  attr_TexCoord0;
5
6#if defined(USE_VERTEX_ANIMATION)
7attribute vec3  attr_Position2;
8attribute vec3  attr_Normal2;
9#elif defined(USE_BONE_ANIMATION)
10attribute vec4 attr_BoneIndexes;
11attribute vec4 attr_BoneWeights;
12#endif
13
14uniform vec4    u_FogDistance;
15uniform vec4    u_FogDepth;
16uniform float   u_FogEyeT;
17
18#if defined(USE_DEFORM_VERTEXES)
19uniform int     u_DeformGen;
20uniform float   u_DeformParams[5];
21#endif
22
23uniform float   u_Time;
24uniform mat4    u_ModelViewProjectionMatrix;
25
26#if defined(USE_VERTEX_ANIMATION)
27uniform float   u_VertexLerp;
28#elif defined(USE_BONE_ANIMATION)
29uniform mat4 u_BoneMatrix[MAX_GLSL_BONES];
30#endif
31
32uniform vec4  u_Color;
33
34varying float   var_Scale;
35
36#if defined(USE_DEFORM_VERTEXES)
37vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
38{
39	if (u_DeformGen == 0)
40	{
41		return pos;
42	}
43
44	float base =      u_DeformParams[0];
45	float amplitude = u_DeformParams[1];
46	float phase =     u_DeformParams[2];
47	float frequency = u_DeformParams[3];
48	float spread =    u_DeformParams[4];
49
50	if (u_DeformGen == DGEN_BULGE)
51	{
52		phase *= st.x;
53	}
54	else // if (u_DeformGen <= DGEN_WAVE_INVERSE_SAWTOOTH)
55	{
56		phase += dot(pos.xyz, vec3(spread));
57	}
58
59	float value = phase + (u_Time * frequency);
60	float func;
61
62	if (u_DeformGen == DGEN_WAVE_SIN)
63	{
64		func = sin(value * 2.0 * M_PI);
65	}
66	else if (u_DeformGen == DGEN_WAVE_SQUARE)
67	{
68		func = sign(0.5 - fract(value));
69	}
70	else if (u_DeformGen == DGEN_WAVE_TRIANGLE)
71	{
72		func = abs(fract(value + 0.75) - 0.5) * 4.0 - 1.0;
73	}
74	else if (u_DeformGen == DGEN_WAVE_SAWTOOTH)
75	{
76		func = fract(value);
77	}
78	else if (u_DeformGen == DGEN_WAVE_INVERSE_SAWTOOTH)
79	{
80		func = (1.0 - fract(value));
81	}
82	else // if (u_DeformGen == DGEN_BULGE)
83	{
84		func = sin(value);
85	}
86
87	return pos + normal * (base + func * amplitude);
88}
89#endif
90
91float CalcFog(vec3 position)
92{
93	float s = dot(vec4(position, 1.0), u_FogDistance);
94#if defined(USE_WOLF_FOG_LINEAR)
95	return 1.0 - (u_FogDepth.y - s) / (u_FogDepth.y - u_FogDepth.x);
96#elif defined(USE_WOLF_FOG_EXPONENTIAL)
97	return 1.0 - exp(-u_FogDepth.z * s);
98#else // defined(USE_QUAKE3_FOG)
99	float t = dot(vec4(position, 1.0), u_FogDepth);
100
101	float eyeOutside = float(u_FogEyeT < 0.0);
102	float fogged = float(t >= eyeOutside);
103
104	t += 1e-6;
105	t *= fogged / (t - u_FogEyeT * eyeOutside);
106
107	return s * 8.0 * t;
108#endif
109}
110
111void main()
112{
113#if defined(USE_VERTEX_ANIMATION)
114	vec3 position = mix(attr_Position, attr_Position2, u_VertexLerp);
115	vec3 normal   = mix(attr_Normal,   attr_Normal2,   u_VertexLerp);
116#elif defined(USE_BONE_ANIMATION)
117	mat4 vtxMat  = u_BoneMatrix[int(attr_BoneIndexes.x)] * attr_BoneWeights.x;
118	     vtxMat += u_BoneMatrix[int(attr_BoneIndexes.y)] * attr_BoneWeights.y;
119	     vtxMat += u_BoneMatrix[int(attr_BoneIndexes.z)] * attr_BoneWeights.z;
120	     vtxMat += u_BoneMatrix[int(attr_BoneIndexes.w)] * attr_BoneWeights.w;
121	mat3 nrmMat = mat3(cross(vtxMat[1].xyz, vtxMat[2].xyz), cross(vtxMat[2].xyz, vtxMat[0].xyz), cross(vtxMat[0].xyz, vtxMat[1].xyz));
122
123	vec3 position  = vec3(vtxMat * vec4(attr_Position, 1.0));
124	vec3 normal    = normalize(nrmMat * attr_Normal);
125#else
126	vec3 position = attr_Position;
127	vec3 normal   = attr_Normal;
128#endif
129
130#if defined(USE_DEFORM_VERTEXES)
131	position.xyz = DeformPosition(position.xyz, normal, attr_TexCoord0.st);
132#endif
133
134	gl_Position = u_ModelViewProjectionMatrix * vec4(position, 1.0);
135
136	var_Scale = CalcFog(position) * u_Color.a * u_Color.a;
137}
138