1[vertex]
2
3#ifdef USE_GLES_OVER_GL
4#define mediump
5#define highp
6#else
7precision mediump float;
8precision mediump int;
9#endif
10
11uniform highp mat4 projection_matrix;
12uniform highp mat4 modelview_matrix;
13uniform highp mat4 extra_matrix;
14attribute highp vec3 vertex; // attrib:0
15attribute vec4 color_attrib; // attrib:3
16attribute highp vec2 uv_attrib; // attrib:4
17
18varying vec2 uv_interp;
19varying vec4 color_interp;
20
21#if defined(USE_TIME)
22uniform float time;
23#endif
24
25
26#ifdef USE_LIGHTING
27
28uniform highp mat4 light_matrix;
29uniform highp mat4 light_local_matrix;
30uniform vec2 light_pos;
31varying vec4 light_uv_interp;
32
33#if defined(NORMAL_USED)
34varying vec4 local_rot;
35uniform vec2 normal_flip;
36#endif
37
38#ifdef USE_SHADOWS
39varying highp vec2 pos;
40#endif
41
42#define at_light_pass 1
43#else
44#define at_light_pass 0
45#endif
46
47#if defined(ENABLE_VAR1_INTERP)
48varying vec4 var1_interp;
49#endif
50
51#if defined(ENABLE_VAR2_INTERP)
52varying vec4 var2_interp;
53#endif
54
55//uniform bool snap_pixels;
56
57VERTEX_SHADER_GLOBALS
58
59void main() {
60
61	color_interp = color_attrib;
62	uv_interp = uv_attrib;
63        highp vec4 outvec = vec4(vertex, 1.0);
64{
65        vec2 src_vtx=outvec.xy;
66VERTEX_SHADER_CODE
67
68}
69#if !defined(USE_WORLD_VEC)
70        outvec = extra_matrix * outvec;
71        outvec = modelview_matrix * outvec;
72#endif
73
74
75
76#ifdef USE_PIXEL_SNAP
77
78	outvec.xy=floor(outvec.xy+0.5);
79#endif
80
81
82	gl_Position = projection_matrix * outvec;
83
84#ifdef USE_LIGHTING
85
86	light_uv_interp.xy = (light_matrix * outvec).xy;
87	light_uv_interp.zw =(light_local_matrix * outvec).xy;
88#ifdef USE_SHADOWS
89	pos=outvec.xy;
90#endif
91
92#if defined(NORMAL_USED)
93	local_rot.xy=normalize( (modelview_matrix * ( extra_matrix * vec4(1.0,0.0,0.0,0.0) )).xy  )*normal_flip.x;
94	local_rot.zw=normalize( (modelview_matrix * ( extra_matrix * vec4(0.0,1.0,0.0,0.0) )).xy  )*normal_flip.y;
95#endif
96
97#endif
98
99}
100
101[fragment]
102
103#ifdef USE_GLES_OVER_GL
104#define mediump
105#define highp
106#else
107precision mediump float;
108precision mediump int;
109#endif
110
111 // texunit:0
112uniform sampler2D texture;
113
114varying vec2 uv_interp;
115varying vec4 color_interp;
116
117#ifdef MOMO
118
119#endif
120
121#if defined(ENABLE_SCREEN_UV)
122
123uniform vec2 screen_uv_mult;
124
125#endif
126
127#if defined(ENABLE_TEXSCREEN)
128
129uniform vec2 texscreen_screen_mult;
130uniform vec4 texscreen_screen_clamp;
131uniform sampler2D texscreen_tex;
132
133#endif
134
135
136#if defined(ENABLE_VAR1_INTERP)
137varying vec4 var1_interp;
138#endif
139
140#if defined(ENABLE_VAR2_INTERP)
141varying vec4 var2_interp;
142#endif
143
144#if defined(USE_TIME)
145uniform float time;
146#endif
147
148#ifdef USE_MODULATE
149
150uniform vec4 modulate;
151
152#endif
153
154#ifdef USE_LIGHTING
155
156uniform sampler2D light_texture;
157uniform vec4 light_color;
158uniform vec4 light_shadow_color;
159uniform float light_height;
160varying vec4 light_uv_interp;
161uniform float light_outside_alpha;
162
163#if defined(NORMAL_USED)
164varying vec4 local_rot;
165#endif
166
167#ifdef USE_SHADOWS
168
169uniform highp sampler2D shadow_texture;
170uniform float shadow_attenuation;
171
172uniform highp mat4 shadow_matrix;
173varying highp vec2 pos;
174uniform float shadowpixel_size;
175
176#ifdef SHADOW_ESM
177uniform float shadow_esm_multiplier;
178#endif
179
180#endif
181
182#define at_light_pass 1
183#else
184#define at_light_pass 0
185#endif
186
187#if defined(USE_TEXPIXEL_SIZE)
188uniform vec2 texpixel_size;
189#endif
190
191
192FRAGMENT_SHADER_GLOBALS
193
194
195void main() {
196
197	vec4 color = color_interp;
198#if defined(NORMAL_USED)
199	vec3 normal = vec3(0.0,0.0,1.0);
200#endif
201
202#ifdef USE_DISTANCE_FIELD
203	const float smoothing = 1.0/32.0;
204	float distance = texture2D(texture, uv_interp).a;
205	color.a = smoothstep(0.5 - smoothing, 0.5 + smoothing, distance) * color.a;
206#else
207	color *= texture2D( texture,  uv_interp );
208
209#endif
210
211
212#if defined(ENABLE_SCREEN_UV)
213	vec2 screen_uv = gl_FragCoord.xy*screen_uv_mult;
214#endif
215
216
217{
218#if defined(USE_NORMALMAP)
219	vec3 normal_map=vec3(0.0,0.0,1.0);
220	float normal_depth=1.0;
221#endif
222
223FRAGMENT_SHADER_CODE
224
225#if defined(USE_NORMALMAP)
226	normal = mix(vec3(0.0,0.0,1.0), normal_map * vec3(2.0,-2.0,1.0) - vec3( 1.0, -1.0, 0.0 ), normal_depth );
227#endif
228
229}
230#ifdef DEBUG_ENCODED_32
231	highp float enc32 = dot( color,highp vec4(1.0 / (256.0 * 256.0 * 256.0),1.0 / (256.0 * 256.0),1.0 / 256.0,1)  );
232	color = vec4(vec3(enc32),1.0);
233#endif
234
235#ifdef USE_MODULATE
236
237	color*=modulate;
238#endif
239
240
241#ifdef USE_LIGHTING
242
243	vec2 light_vec = light_uv_interp.zw;; //for shadow and normal mapping
244
245#if defined(NORMAL_USED)
246	normal.xy =  mat2(local_rot.xy,local_rot.zw) * normal.xy;
247#endif
248
249	float att=1.0;
250
251	vec2 light_uv = light_uv_interp.xy;
252	vec4 light = texture2D(light_texture,light_uv) * light_color;
253#if defined(USE_OUTPUT_SHADOW_COLOR)
254	vec4 shadow_color=vec4(0.0,0.0,0.0,0.0);
255#endif
256
257	if (any(lessThan(light_uv_interp.xy,vec2(0.0,0.0))) || any(greaterThanEqual(light_uv_interp.xy,vec2(1.0,1.0)))) {
258		color.a*=light_outside_alpha; //invisible
259
260	} else {
261
262#if defined(USE_LIGHT_SHADER_CODE)
263//light is written by the light shader
264		{
265			vec4 light_out=light*color;
266LIGHT_SHADER_CODE
267			color=light_out;
268		}
269
270#else
271
272#if defined(NORMAL_USED)
273		vec3 light_normal = normalize(vec3(light_vec,-light_height));
274		light*=max(dot(-light_normal,normal),0.0);
275#endif
276
277		color*=light;
278/*
279#ifdef USE_NORMAL
280	color.xy=local_rot.xy;//normal.xy;
281	color.zw=vec2(0.0,1.0);
282#endif
283*/
284
285//light shader code
286#endif
287
288
289#ifdef USE_SHADOWS
290
291		float angle_to_light = -atan(light_vec.x,light_vec.y);
292		float PI = 3.14159265358979323846264;
293		/*int i = int(mod(floor((angle_to_light+7.0*PI/6.0)/(4.0*PI/6.0))+1.0, 3.0)); // +1 pq os indices estao em ordem 2,0,1 nos arrays
294		float ang*/
295
296		float su,sz;
297
298		float abs_angle = abs(angle_to_light);
299		vec2 point;
300		float sh;
301		if (abs_angle<45.0*PI/180.0) {
302			point = light_vec;
303			sh=0.0+(1.0/8.0);
304		} else if (abs_angle>135.0*PI/180.0) {
305			point = -light_vec;
306			sh = 0.5+(1.0/8.0);
307		} else if (angle_to_light>0.0) {
308
309			point = vec2(light_vec.y,-light_vec.x);
310			sh = 0.25+(1.0/8.0);
311		} else {
312
313			point = vec2(-light_vec.y,light_vec.x);
314			sh = 0.75+(1.0/8.0);
315
316		}
317
318
319		highp vec4 s = shadow_matrix * vec4(point,0.0,1.0);
320		s.xyz/=s.w;
321		su=s.x*0.5+0.5;
322		sz=s.z*0.5+0.5;
323
324		highp float shadow_attenuation=0.0;
325
326#ifdef USE_DEPTH_SHADOWS
327
328#define SHADOW_DEPTH(m_tex,m_uv) (texture2D((m_tex),(m_uv)).z)
329
330#else
331
332//#define SHADOW_DEPTH(m_tex,m_uv) dot(texture2D((m_tex),(m_uv)),highp vec4(1.0 / (256.0 * 256.0 * 256.0),1.0 / (256.0 * 256.0),1.0 / 256.0,1)  )
333#define SHADOW_DEPTH(m_tex,m_uv) dot(texture2D((m_tex),(m_uv)),vec4(1.0 / (256.0 * 256.0 * 256.0),1.0 / (256.0 * 256.0),1.0 / 256.0,1)  )
334
335#endif
336
337
338
339#ifdef SHADOW_PCF5
340
341		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su,sh))<sz?0.0:1.0;
342		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size,sh))<sz?0.0:1.0;
343		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*2.0,sh))<sz?0.0:1.0;
344		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size,sh))<sz?0.0:1.0;
345		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*2.0,sh))<sz?0.0:1.0;
346		shadow_attenuation/=5.0;
347
348#endif
349
350#ifdef SHADOW_PCF13
351
352		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su,sh))<sz?0.0:1.0;
353		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size,sh))<sz?0.0:1.0;
354		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*2.0,sh))<sz?0.0:1.0;
355		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*3.0,sh))<sz?0.0:1.0;
356		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*4.0,sh))<sz?0.0:1.0;
357		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*5.0,sh))<sz?0.0:1.0;
358		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*6.0,sh))<sz?0.0:1.0;
359		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*2.0,sh))<sz?0.0:1.0;
360		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*3.0,sh))<sz?0.0:1.0;
361		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*4.0,sh))<sz?0.0:1.0;
362		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*5.0,sh))<sz?0.0:1.0;
363		shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*6.0,sh))<sz?0.0:1.0;
364		shadow_attenuation/=13.0;
365
366#endif
367
368#ifdef SHADOW_ESM
369
370
371	{
372			float unnormalized = su/shadowpixel_size;
373			float fractional = fract(unnormalized);
374			unnormalized = floor(unnormalized);
375			float zc = SHADOW_DEPTH(shadow_texture,vec2((unnormalized-0.5)*shadowpixel_size,sh));
376			float zn = SHADOW_DEPTH(shadow_texture,vec2((unnormalized+0.5)*shadowpixel_size,sh));
377			float z = mix(zc,zn,fractional);
378			shadow_attenuation=clamp(exp(shadow_esm_multiplier* ( z - sz )),0.0,1.0);
379	}
380
381#endif
382
383#if !defined(SHADOW_PCF5) && !defined(SHADOW_PCF13) && !defined(SHADOW_ESM)
384
385		shadow_attenuation = SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size,sh))<sz?0.0:1.0;
386
387#endif
388
389#if defined(USE_OUTPUT_SHADOW_COLOR)
390	color=mix(shadow_color,color,shadow_attenuation);
391#else
392	//color*=shadow_attenuation;
393	color=mix(light_shadow_color,color,shadow_attenuation);
394#endif
395//use shadows
396#endif
397	}
398
399//use lighting
400#endif
401//	color.rgb*=color.a;
402	gl_FragColor = color;
403
404}
405
406