• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#if defined(diffuseTextureFlag) || defined(specularTextureFlag)
2#define textureFlag
3#endif
4
5#if defined(specularTextureFlag) || defined(specularColorFlag)
6#define specularFlag
7#endif
8
9#if defined(specularFlag) || defined(fogFlag)
10#define cameraPositionFlag
11#endif
12
13attribute vec3 a_position;
14uniform mat4 u_projViewTrans;
15
16#if defined(colorFlag)
17varying vec4 v_color;
18attribute vec4 a_color;
19#endif // colorFlag
20
21#ifdef normalFlag
22attribute vec3 a_normal;
23uniform mat3 u_normalMatrix;
24varying vec3 v_normal;
25#endif // normalFlag
26
27#ifdef textureFlag
28attribute vec2 a_texCoord0;
29#endif // textureFlag
30
31#ifdef diffuseTextureFlag
32uniform vec4 u_diffuseUVTransform;
33varying vec2 v_diffuseUV;
34#endif
35
36#ifdef specularTextureFlag
37uniform vec4 u_specularUVTransform;
38varying vec2 v_specularUV;
39#endif
40
41#ifdef boneWeight0Flag
42#define boneWeightsFlag
43attribute vec2 a_boneWeight0;
44#endif //boneWeight0Flag
45
46#ifdef boneWeight1Flag
47#ifndef boneWeightsFlag
48#define boneWeightsFlag
49#endif
50attribute vec2 a_boneWeight1;
51#endif //boneWeight1Flag
52
53#ifdef boneWeight2Flag
54#ifndef boneWeightsFlag
55#define boneWeightsFlag
56#endif
57attribute vec2 a_boneWeight2;
58#endif //boneWeight2Flag
59
60#ifdef boneWeight3Flag
61#ifndef boneWeightsFlag
62#define boneWeightsFlag
63#endif
64attribute vec2 a_boneWeight3;
65#endif //boneWeight3Flag
66
67#ifdef boneWeight4Flag
68#ifndef boneWeightsFlag
69#define boneWeightsFlag
70#endif
71attribute vec2 a_boneWeight4;
72#endif //boneWeight4Flag
73
74#ifdef boneWeight5Flag
75#ifndef boneWeightsFlag
76#define boneWeightsFlag
77#endif
78attribute vec2 a_boneWeight5;
79#endif //boneWeight5Flag
80
81#ifdef boneWeight6Flag
82#ifndef boneWeightsFlag
83#define boneWeightsFlag
84#endif
85attribute vec2 a_boneWeight6;
86#endif //boneWeight6Flag
87
88#ifdef boneWeight7Flag
89#ifndef boneWeightsFlag
90#define boneWeightsFlag
91#endif
92attribute vec2 a_boneWeight7;
93#endif //boneWeight7Flag
94
95#if defined(numBones) && defined(boneWeightsFlag)
96#if (numBones > 0)
97#define skinningFlag
98#endif
99#endif
100
101uniform mat4 u_worldTrans;
102
103#if defined(numBones)
104#if numBones > 0
105uniform mat4 u_bones[numBones];
106#endif //numBones
107#endif
108
109#ifdef shininessFlag
110uniform float u_shininess;
111#else
112const float u_shininess = 20.0;
113#endif // shininessFlag
114
115#ifdef blendedFlag
116uniform float u_opacity;
117varying float v_opacity;
118
119#ifdef alphaTestFlag
120uniform float u_alphaTest;
121varying float v_alphaTest;
122#endif //alphaTestFlag
123#endif // blendedFlag
124
125#ifdef lightingFlag
126varying vec3 v_lightDiffuse;
127
128#ifdef ambientLightFlag
129uniform vec3 u_ambientLight;
130#endif // ambientLightFlag
131
132#ifdef ambientCubemapFlag
133uniform vec3 u_ambientCubemap[6];
134#endif // ambientCubemapFlag
135
136#ifdef sphericalHarmonicsFlag
137uniform vec3 u_sphericalHarmonics[9];
138#endif //sphericalHarmonicsFlag
139
140#ifdef specularFlag
141varying vec3 v_lightSpecular;
142#endif // specularFlag
143
144#ifdef cameraPositionFlag
145uniform vec4 u_cameraPosition;
146#endif // cameraPositionFlag
147
148#ifdef fogFlag
149varying float v_fog;
150#endif // fogFlag
151
152
153#if numDirectionalLights > 0
154struct DirectionalLight
155{
156	vec3 color;
157	vec3 direction;
158};
159uniform DirectionalLight u_dirLights[numDirectionalLights];
160#endif // numDirectionalLights
161
162#if numPointLights > 0
163struct PointLight
164{
165	vec3 color;
166	vec3 position;
167};
168uniform PointLight u_pointLights[numPointLights];
169#endif // numPointLights
170
171#if	defined(ambientLightFlag) || defined(ambientCubemapFlag) || defined(sphericalHarmonicsFlag)
172#define ambientFlag
173#endif //ambientFlag
174
175#ifdef shadowMapFlag
176uniform mat4 u_shadowMapProjViewTrans;
177varying vec3 v_shadowMapUv;
178#define separateAmbientFlag
179#endif //shadowMapFlag
180
181#if defined(ambientFlag) && defined(separateAmbientFlag)
182varying vec3 v_ambientLight;
183#endif //separateAmbientFlag
184
185#endif // lightingFlag
186
187void main() {
188	#ifdef diffuseTextureFlag
189		v_diffuseUV = u_diffuseUVTransform.xy + a_texCoord0 * u_diffuseUVTransform.zw;
190	#endif //diffuseTextureFlag
191
192	#ifdef specularTextureFlag
193		v_specularUV = u_specularUVTransform.xy + a_texCoord0 * u_specularUVTransform.zw;
194	#endif //specularTextureFlag
195
196	#if defined(colorFlag)
197		v_color = a_color;
198	#endif // colorFlag
199
200	#ifdef blendedFlag
201		v_opacity = u_opacity;
202		#ifdef alphaTestFlag
203			v_alphaTest = u_alphaTest;
204		#endif //alphaTestFlag
205	#endif // blendedFlag
206
207	#ifdef skinningFlag
208		mat4 skinning = mat4(0.0);
209		#ifdef boneWeight0Flag
210			skinning += (a_boneWeight0.y) * u_bones[int(a_boneWeight0.x)];
211		#endif //boneWeight0Flag
212		#ifdef boneWeight1Flag
213			skinning += (a_boneWeight1.y) * u_bones[int(a_boneWeight1.x)];
214		#endif //boneWeight1Flag
215		#ifdef boneWeight2Flag
216			skinning += (a_boneWeight2.y) * u_bones[int(a_boneWeight2.x)];
217		#endif //boneWeight2Flag
218		#ifdef boneWeight3Flag
219			skinning += (a_boneWeight3.y) * u_bones[int(a_boneWeight3.x)];
220		#endif //boneWeight3Flag
221		#ifdef boneWeight4Flag
222			skinning += (a_boneWeight4.y) * u_bones[int(a_boneWeight4.x)];
223		#endif //boneWeight4Flag
224		#ifdef boneWeight5Flag
225			skinning += (a_boneWeight5.y) * u_bones[int(a_boneWeight5.x)];
226		#endif //boneWeight5Flag
227		#ifdef boneWeight6Flag
228			skinning += (a_boneWeight6.y) * u_bones[int(a_boneWeight6.x)];
229		#endif //boneWeight6Flag
230		#ifdef boneWeight7Flag
231			skinning += (a_boneWeight7.y) * u_bones[int(a_boneWeight7.x)];
232		#endif //boneWeight7Flag
233	#endif //skinningFlag
234
235	#ifdef skinningFlag
236		vec4 pos = u_worldTrans * skinning * vec4(a_position, 1.0);
237	#else
238		vec4 pos = u_worldTrans * vec4(a_position, 1.0);
239	#endif
240
241	gl_Position = u_projViewTrans * pos;
242
243	#ifdef shadowMapFlag
244		vec4 spos = u_shadowMapProjViewTrans * pos;
245		v_shadowMapUv.xy = (spos.xy / spos.w) * 0.5 + 0.5;
246		v_shadowMapUv.z = min(spos.z * 0.5 + 0.5, 0.998);
247	#endif //shadowMapFlag
248
249	#if defined(normalFlag)
250		#if defined(skinningFlag)
251			vec3 normal = normalize((u_worldTrans * skinning * vec4(a_normal, 0.0)).xyz);
252		#else
253			vec3 normal = normalize(u_normalMatrix * a_normal);
254		#endif
255		v_normal = normal;
256	#endif // normalFlag
257
258    #ifdef fogFlag
259        vec3 flen = u_cameraPosition.xyz - pos.xyz;
260        float fog = dot(flen, flen) * u_cameraPosition.w;
261        v_fog = min(fog, 1.0);
262    #endif
263
264	#ifdef lightingFlag
265		#if	defined(ambientLightFlag)
266        	vec3 ambientLight = u_ambientLight;
267		#elif defined(ambientFlag)
268        	vec3 ambientLight = vec3(0.0);
269		#endif
270
271		#ifdef ambientCubemapFlag
272			vec3 squaredNormal = normal * normal;
273			vec3 isPositive  = step(0.0, normal);
274			ambientLight += squaredNormal.x * mix(u_ambientCubemap[0], u_ambientCubemap[1], isPositive.x) +
275					squaredNormal.y * mix(u_ambientCubemap[2], u_ambientCubemap[3], isPositive.y) +
276					squaredNormal.z * mix(u_ambientCubemap[4], u_ambientCubemap[5], isPositive.z);
277		#endif // ambientCubemapFlag
278
279		#ifdef sphericalHarmonicsFlag
280			ambientLight += u_sphericalHarmonics[0];
281			ambientLight += u_sphericalHarmonics[1] * normal.x;
282			ambientLight += u_sphericalHarmonics[2] * normal.y;
283			ambientLight += u_sphericalHarmonics[3] * normal.z;
284			ambientLight += u_sphericalHarmonics[4] * (normal.x * normal.z);
285			ambientLight += u_sphericalHarmonics[5] * (normal.z * normal.y);
286			ambientLight += u_sphericalHarmonics[6] * (normal.y * normal.x);
287			ambientLight += u_sphericalHarmonics[7] * (3.0 * normal.z * normal.z - 1.0);
288			ambientLight += u_sphericalHarmonics[8] * (normal.x * normal.x - normal.y * normal.y);
289		#endif // sphericalHarmonicsFlag
290
291		#ifdef ambientFlag
292			#ifdef separateAmbientFlag
293				v_ambientLight = ambientLight;
294				v_lightDiffuse = vec3(0.0);
295			#else
296				v_lightDiffuse = ambientLight;
297			#endif //separateAmbientFlag
298		#else
299	        v_lightDiffuse = vec3(0.0);
300		#endif //ambientFlag
301
302
303		#ifdef specularFlag
304			v_lightSpecular = vec3(0.0);
305			vec3 viewVec = normalize(u_cameraPosition.xyz - pos.xyz);
306		#endif // specularFlag
307
308		#if (numDirectionalLights > 0) && defined(normalFlag)
309			for (int i = 0; i < numDirectionalLights; i++) {
310				vec3 lightDir = -u_dirLights[i].direction;
311				float NdotL = clamp(dot(normal, lightDir), 0.0, 1.0);
312				vec3 value = u_dirLights[i].color * NdotL;
313				v_lightDiffuse += value;
314				#ifdef specularFlag
315					float halfDotView = max(0.0, dot(normal, normalize(lightDir + viewVec)));
316					v_lightSpecular += value * pow(halfDotView, u_shininess);
317				#endif // specularFlag
318			}
319		#endif // numDirectionalLights
320
321		#if (numPointLights > 0) && defined(normalFlag)
322			for (int i = 0; i < numPointLights; i++) {
323				vec3 lightDir = u_pointLights[i].position - pos.xyz;
324				float dist2 = dot(lightDir, lightDir);
325				lightDir *= inversesqrt(dist2);
326				float NdotL = clamp(dot(normal, lightDir), 0.0, 1.0);
327				vec3 value = u_pointLights[i].color * (NdotL / (1.0 + dist2));
328				v_lightDiffuse += value;
329				#ifdef specularFlag
330					float halfDotView = max(0.0, dot(normal, normalize(lightDir + viewVec)));
331					v_lightSpecular += value * pow(halfDotView, u_shininess);
332				#endif // specularFlag
333			}
334		#endif // numPointLights
335	#endif // lightingFlag
336}
337