npcs and tutorial stuff
[carveJwlIkooP6JGAAIwe30JlM.git] / shaders / impl.c
1 #include "shaders/scene_standard.h"
2 struct vg_shader _shader_scene_standard = {
3 .name = "scene_standard",
4 .vs =
5 {
6 .orig_file = "shaders/scene.vs",
7 .static_src =
8 "layout (location=0) in vec3 a_co;\n"
9 "layout (location=1) in vec4 a_norm;\n"
10 "layout (location=2) in vec2 a_uv;\n"
11 "\n"
12 "#line 1 1 \n"
13 "const float k_motion_lerp_amount = 0.01;\n"
14 "\n"
15 "#line 2 0 \n"
16 "\n"
17 "out vec3 aMotionVec0;\n"
18 "out vec3 aMotionVec1;\n"
19 "\n"
20 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
21 "{\n"
22 " // This magically solves some artifacting errors!\n"
23 " //\n"
24 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
25 "\n"
26 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
27 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
28 "}\n"
29 "\n"
30 "#line 6 0 \n"
31 "\n"
32 "uniform mat4x3 uMdl;\n"
33 "uniform mat4 uPv;\n"
34 "uniform mat4 uPvmPrev;\n"
35 "\n"
36 "out vec2 aUv;\n"
37 "out vec4 aNorm;\n"
38 "out vec3 aCo;\n"
39 "out vec3 aWorldCo;\n"
40 "\n"
41 "void main()\n"
42 "{\n"
43 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
44 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
45 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
46 "\n"
47 " vs_motion_out( vproj0, vproj1 );\n"
48 "\n"
49 " gl_Position = vproj0;\n"
50 "\n"
51 " aUv = a_uv;\n"
52 " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n"
53 " aCo = a_co;\n"
54 " aWorldCo = world_pos0;\n"
55 "}\n"
56 ""},
57 .fs =
58 {
59 .orig_file = "shaders/scene_standard.fs",
60 .static_src =
61 "uniform sampler2D uTexGarbage;\n"
62 "uniform sampler2D uTexMain;\n"
63 "uniform vec3 uCamera;\n"
64 "uniform vec4 uPlane;\n"
65 "\n"
66 "#line 1 1 \n"
67 "// :D\n"
68 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
69 "\n"
70 "#line 7 0 \n"
71 "#line 1 2 \n"
72 "// :D\n"
73 "\n"
74 "in vec2 aUv;\n"
75 "in vec4 aNorm;\n"
76 "in vec3 aCo;\n"
77 "in vec3 aWorldCo;\n"
78 "\n"
79 "#line 1 1 \n"
80 "layout (location = 0) out vec4 oColour;\n"
81 "\n"
82 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
83 "layout (std140) uniform ub_world_lighting\n"
84 "{\n"
85 " vec4 g_cube_min;\n"
86 " vec4 g_cube_inv_range;\n"
87 "\n"
88 " vec4 g_water_plane;\n"
89 " vec4 g_depth_bounds;\n"
90 "\n"
91 " vec4 g_daysky_colour;\n"
92 " vec4 g_nightsky_colour;\n"
93 " vec4 g_sunset_colour;\n"
94 " vec4 g_ambient_colour;\n"
95 " vec4 g_sunset_ambient;\n"
96 " vec4 g_sun_colour;\n"
97 " vec4 g_sun_dir;\n"
98 " vec4 g_board_0;\n"
99 " vec4 g_board_1;\n"
100 "\n"
101 " float g_water_fog;\n"
102 " float g_time;\n"
103 " float g_realtime;\n"
104 " float g_shadow_length;\n"
105 " float g_shadow_spread;\n"
106 "\n"
107 " float g_time_of_day;\n"
108 " float g_day_phase;\n"
109 " float g_sunset_phase;\n"
110 "\n"
111 " int g_light_preview;\n"
112 " int g_shadow_samples;\n"
113 "\n"
114 " int g_debug_indices;\n"
115 " int g_debug_complexity;\n"
116 "};\n"
117 "\n"
118 "uniform sampler2D g_world_depth;\n"
119 "uniform samplerBuffer uLightsArray;\n"
120 "uniform usampler3D uLightsIndex;\n"
121 "\n"
122 "#line 1 1 \n"
123 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
124 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
125 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
126 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
127 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
128 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
129 "\n"
130 "const float SUN_ANGLE = 0.0001;\n"
131 "const float PI = 3.14159265358979323846264;\n"
132 "\n"
133 "//struct world_info\n"
134 "//{\n"
135 "// float time,\n"
136 "// time_of_day,\n"
137 "// day_phase,\n"
138 "// sunset_phase;\n"
139 "// \n"
140 "// vec3 sun_dir;\n"
141 "//};\n"
142 "\n"
143 "vec3 rand33(vec3 p3)\n"
144 "{\n"
145 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
146 " p3 += dot(p3, p3.yxz+33.33);\n"
147 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
148 "}\n"
149 "\n"
150 "float stars( vec3 rd, float rr, float size ){\n"
151 " vec3 co = rd * rr;\n"
152 "\n"
153 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
154 "\n"
155 " float spaces = 1.0 / rr;\n"
156 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
157 " a -= mod(a, spaces) - spaces * 0.5;\n"
158 "\n"
159 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
160 " \n"
161 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
162 " plane = plane - mod(plane, PI / count);\n"
163 "\n"
164 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
165 "\n"
166 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
167 " float ydist = sqrt(rr * rr - level * level);\n"
168 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
169 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
170 " float star = smoothstep(size, 0.0, distance(center, co));\n"
171 " return star;\n"
172 "}\n"
173 "\n"
174 "float luminance( vec3 v )\n"
175 "{\n"
176 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
177 "}\n"
178 "\n"
179 "vec3 clearskies_ambient( vec3 dir )\n"
180 "{\n"
181 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
182 " float sky_gradient = dir.y;\n"
183 " \n"
184 " /* Blend phase colours */\n"
185 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
186 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
187 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
188 " \n"
189 " /* Add gradient */\n"
190 " ambient -= sky_gradient * luminance(ambient);\n"
191 " \n"
192 " return ambient;\n"
193 "}\n"
194 "\n"
195 "vec3 clearskies_sky( vec3 ray_dir )\n"
196 "{\n"
197 " ray_dir.y = abs( ray_dir.y );\n"
198 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
199 " \n"
200 " /* Sun */\n"
201 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
202 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
203 " float sun_shape = pow( sun_size, 2000.0 );\n"
204 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
205 " \n"
206 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
207 " sun_colour *= sun_shape;\n"
208 "\n"
209 " \n"
210 " float star = 0.0;\n"
211 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
212 "\n"
213 " if( star_blend > 0.001 ){\n"
214 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
215 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
216 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
217 " }\n"
218 " }\n"
219 " \n"
220 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
221 " return composite;\n"
222 "}\n"
223 "\n"
224 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
225 "{\n"
226 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
227 "\n"
228 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
229 " g_sunset_phase );\n"
230 "\n"
231 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
232 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
233 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
234 " ) * g_sun_colour.rgb * g_day_phase;\n"
235 "\n"
236 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
237 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
238 " g_sunset_phase );\n"
239 "\n"
240 " return ambient + (light_sun + sky_reflection) * shadow;\n"
241 "}\n"
242 "\n"
243 "#line 44 0 \n"
244 "\n"
245 "float world_depth_sample( vec3 pos )\n"
246 "{\n"
247 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
248 " return texture( g_world_depth, depth_coord ).r;\n"
249 "}\n"
250 "\n"
251 "float world_water_depth( vec3 pos )\n"
252 "{\n"
253 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
254 " return world_depth_sample( pos ) - ref_depth;\n"
255 "}\n"
256 "\n"
257 "float shadow_sample( vec3 co ){\n"
258 " float height_sample = world_depth_sample( co );\n"
259 "\n"
260 " float fdelta = height_sample - co.y;\n"
261 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
262 "}\n"
263 "\n"
264 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
265 " if( g_shadow_samples == 0 ){\n"
266 " return 1.0;\n"
267 " }\n"
268 "\n"
269 " float fspread = g_shadow_spread;\n"
270 " float flength = g_shadow_length;\n"
271 "\n"
272 " float famt = 0.0;\n"
273 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
274 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
275 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
276 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
277 "\n"
278 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
279 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
280 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
281 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
282 "\n"
283 " return 1.0 - famt;\n"
284 "}\n"
285 "\n"
286 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
287 "{\n"
288 " vec3 specdir = reflect( -dir, wnormal );\n"
289 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
290 "}\n"
291 "\n"
292 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
293 " float dist = pow(fdist*0.0010,0.78);\n"
294 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
295 "}\n"
296 "\n"
297 "vec3 scene_calculate_light( int light_index, \n"
298 " vec3 halfview, vec3 co, vec3 normal )\n"
299 "{\n"
300 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
301 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
302 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
303 "\n"
304 " vec3 light_delta = light_co.xyz-co;\n"
305 " float dist2 = dot(light_delta,light_delta);\n"
306 "\n"
307 " light_delta = normalize( light_delta );\n"
308 "\n"
309 " float quadratic = dist2*100.0;\n"
310 " float attenuation = 1.0/( 1.0 + quadratic );\n"
311 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
312 "\n"
313 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
314 "\n"
315 " if( light_dir.w < 0.999999 ){\n"
316 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
317 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
318 " }\n"
319 "\n"
320 " return light_colour.rgb * attenuation * falloff \n"
321 " * step( g_day_phase, light_colour.w );\n"
322 "}\n"
323 "\n"
324 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
325 " vec3 halfview, vec3 co, vec3 normal )\n"
326 "{\n"
327 " uint light_count = packed_index & 0x3u;\n"
328 "\n"
329 " vec3 l = vec3(0.0);\n"
330 "\n"
331 " if( light_count >= 1u ){\n"
332 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
333 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
334 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
335 "\n"
336 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
337 "\n"
338 " if( light_count >= 2u ){\n"
339 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
340 "\n"
341 " if( light_count >= 3u ){\n"
342 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
343 " }\n"
344 " }\n"
345 " }\n"
346 "\n"
347 " return l;\n"
348 "}\n"
349 "\n"
350 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
351 " float light_mask )\n"
352 "{\n"
353 " if( g_light_preview == 1 )\n"
354 " diffuse = vec3(0.75);\n"
355 "\n"
356 " // Lighting\n"
357 " vec3 halfview = uCamera - co;\n"
358 " float fdist = length(halfview);\n"
359 " halfview /= fdist;\n"
360 "\n"
361 " float world_shadow = newlight_compute_sun_shadow( \n"
362 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
363 "\n"
364 " vec3 total_light = clearskies_lighting( \n"
365 " normal, min( light_mask, world_shadow ), halfview );\n"
366 "\n"
367 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
368 " cube_coord = floor( cube_coord );\n"
369 "\n"
370 " if( g_debug_indices == 1 )\n"
371 " {\n"
372 " return rand33(cube_coord);\n"
373 " }\n"
374 "\n"
375 " if( g_debug_complexity == 1 )\n"
376 " {\n"
377 " ivec3 coord = ivec3( cube_coord );\n"
378 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
379 "\n"
380 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
381 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
382 " }\n"
383 "\n"
384 " // FIXME: this coord should absolutely must be clamped!\n"
385 " \n"
386 " ivec3 coord = ivec3( cube_coord );\n"
387 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
388 "\n"
389 " total_light += \n"
390 " scene_calculate_packed_light_patch( index_sample.x,\n"
391 " halfview, co, normal ) \n"
392 " * light_mask;\n"
393 " total_light += \n"
394 " scene_calculate_packed_light_patch( index_sample.y,\n"
395 " halfview, co, normal )\n"
396 " * light_mask;\n"
397 "\n"
398 " // Take a section of the sky function to give us a matching fog colour\n"
399 "\n"
400 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
401 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
402 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
403 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
404 " \n"
405 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
406 " sun_colour *= sun_shape;\n"
407 "\n"
408 " fog_colour += sun_colour;\n"
409 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
410 "}\n"
411 "\n"
412 "#line 9 0 \n"
413 "\n"
414 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
415 "{\n"
416 " vec3 pa = p - a;\n"
417 " vec3 ba = b - a;\n"
418 "\n"
419 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
420 " return length( pa - ba*h );\n"
421 "}\n"
422 "\n"
423 "float compute_board_shadow()\n"
424 "{\n"
425 " // player shadow\n"
426 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
427 " g_board_1.xyz )-0.1 );\n"
428 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
429 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
430 "\n"
431 " return 1.0 - player_shadow*0.8;\n"
432 "}\n"
433 "\n"
434 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
435 "{\n"
436 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
437 "}\n"
438 "\n"
439 "#line 8 0 \n"
440 "#line 1 3 \n"
441 "const float k_motion_lerp_amount = 0.01;\n"
442 "\n"
443 "#line 2 0 \n"
444 "\n"
445 "layout (location = 1) out vec2 oMotionVec;\n"
446 "\n"
447 "in vec3 aMotionVec0;\n"
448 "in vec3 aMotionVec1;\n"
449 "\n"
450 "void compute_motion_vectors()\n"
451 "{\n"
452 " // Write motion vectors\n"
453 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
454 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
455 "\n"
456 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
457 "}\n"
458 "\n"
459 "#line 9 0 \n"
460 "\n"
461 "void main()\n"
462 "{\n"
463 " compute_motion_vectors();\n"
464 "\n"
465 " vec3 vfrag = vec3(0.5,0.5,0.5);\n"
466 " vec4 vsamplemain = texture( uTexMain, aUv );\n"
467 " vec3 qnorm = aNorm.xyz;\n"
468 "\n"
469 " vfrag = vsamplemain.rgb;\n"
470 "\n"
471 " if( g_light_preview == 1 )\n"
472 " {\n"
473 " vfrag = vec3(0.5);\n"
474 " }\n"
475 "\n"
476 " vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n"
477 " oColour = vec4( vfrag, 1.0 );\n"
478 "}\n"
479 ""},
480 };
481
482 GLuint _uniform_scene_standard_uMdl;
483 GLuint _uniform_scene_standard_uPv;
484 GLuint _uniform_scene_standard_uPvmPrev;
485 GLuint _uniform_scene_standard_uTexGarbage;
486 GLuint _uniform_scene_standard_uTexMain;
487 GLuint _uniform_scene_standard_uCamera;
488 GLuint _uniform_scene_standard_uPlane;
489 GLuint _uniform_scene_standard_g_world_depth;
490 GLuint _uniform_scene_standard_uLightsArray;
491 GLuint _uniform_scene_standard_uLightsIndex;
492 #include "shaders/scene_standard_alphatest.h"
493 struct vg_shader _shader_scene_standard_alphatest = {
494 .name = "scene_standard_alphatest",
495 .vs =
496 {
497 .orig_file = "shaders/scene.vs",
498 .static_src =
499 "layout (location=0) in vec3 a_co;\n"
500 "layout (location=1) in vec4 a_norm;\n"
501 "layout (location=2) in vec2 a_uv;\n"
502 "\n"
503 "#line 1 1 \n"
504 "const float k_motion_lerp_amount = 0.01;\n"
505 "\n"
506 "#line 2 0 \n"
507 "\n"
508 "out vec3 aMotionVec0;\n"
509 "out vec3 aMotionVec1;\n"
510 "\n"
511 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
512 "{\n"
513 " // This magically solves some artifacting errors!\n"
514 " //\n"
515 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
516 "\n"
517 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
518 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
519 "}\n"
520 "\n"
521 "#line 6 0 \n"
522 "\n"
523 "uniform mat4x3 uMdl;\n"
524 "uniform mat4 uPv;\n"
525 "uniform mat4 uPvmPrev;\n"
526 "\n"
527 "out vec2 aUv;\n"
528 "out vec4 aNorm;\n"
529 "out vec3 aCo;\n"
530 "out vec3 aWorldCo;\n"
531 "\n"
532 "void main()\n"
533 "{\n"
534 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
535 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
536 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
537 "\n"
538 " vs_motion_out( vproj0, vproj1 );\n"
539 "\n"
540 " gl_Position = vproj0;\n"
541 "\n"
542 " aUv = a_uv;\n"
543 " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n"
544 " aCo = a_co;\n"
545 " aWorldCo = world_pos0;\n"
546 "}\n"
547 ""},
548 .fs =
549 {
550 .orig_file = "shaders/scene_standard_alphatest.fs",
551 .static_src =
552 "uniform sampler2D uTexGarbage;\n"
553 "uniform sampler2D uTexMain;\n"
554 "uniform vec3 uCamera;\n"
555 "uniform vec4 uPlane;\n"
556 "\n"
557 "#line 1 1 \n"
558 "// :D\n"
559 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
560 "\n"
561 "#line 7 0 \n"
562 "#line 1 2 \n"
563 "// :D\n"
564 "\n"
565 "in vec2 aUv;\n"
566 "in vec4 aNorm;\n"
567 "in vec3 aCo;\n"
568 "in vec3 aWorldCo;\n"
569 "\n"
570 "#line 1 1 \n"
571 "layout (location = 0) out vec4 oColour;\n"
572 "\n"
573 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
574 "layout (std140) uniform ub_world_lighting\n"
575 "{\n"
576 " vec4 g_cube_min;\n"
577 " vec4 g_cube_inv_range;\n"
578 "\n"
579 " vec4 g_water_plane;\n"
580 " vec4 g_depth_bounds;\n"
581 "\n"
582 " vec4 g_daysky_colour;\n"
583 " vec4 g_nightsky_colour;\n"
584 " vec4 g_sunset_colour;\n"
585 " vec4 g_ambient_colour;\n"
586 " vec4 g_sunset_ambient;\n"
587 " vec4 g_sun_colour;\n"
588 " vec4 g_sun_dir;\n"
589 " vec4 g_board_0;\n"
590 " vec4 g_board_1;\n"
591 "\n"
592 " float g_water_fog;\n"
593 " float g_time;\n"
594 " float g_realtime;\n"
595 " float g_shadow_length;\n"
596 " float g_shadow_spread;\n"
597 "\n"
598 " float g_time_of_day;\n"
599 " float g_day_phase;\n"
600 " float g_sunset_phase;\n"
601 "\n"
602 " int g_light_preview;\n"
603 " int g_shadow_samples;\n"
604 "\n"
605 " int g_debug_indices;\n"
606 " int g_debug_complexity;\n"
607 "};\n"
608 "\n"
609 "uniform sampler2D g_world_depth;\n"
610 "uniform samplerBuffer uLightsArray;\n"
611 "uniform usampler3D uLightsIndex;\n"
612 "\n"
613 "#line 1 1 \n"
614 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
615 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
616 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
617 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
618 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
619 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
620 "\n"
621 "const float SUN_ANGLE = 0.0001;\n"
622 "const float PI = 3.14159265358979323846264;\n"
623 "\n"
624 "//struct world_info\n"
625 "//{\n"
626 "// float time,\n"
627 "// time_of_day,\n"
628 "// day_phase,\n"
629 "// sunset_phase;\n"
630 "// \n"
631 "// vec3 sun_dir;\n"
632 "//};\n"
633 "\n"
634 "vec3 rand33(vec3 p3)\n"
635 "{\n"
636 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
637 " p3 += dot(p3, p3.yxz+33.33);\n"
638 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
639 "}\n"
640 "\n"
641 "float stars( vec3 rd, float rr, float size ){\n"
642 " vec3 co = rd * rr;\n"
643 "\n"
644 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
645 "\n"
646 " float spaces = 1.0 / rr;\n"
647 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
648 " a -= mod(a, spaces) - spaces * 0.5;\n"
649 "\n"
650 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
651 " \n"
652 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
653 " plane = plane - mod(plane, PI / count);\n"
654 "\n"
655 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
656 "\n"
657 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
658 " float ydist = sqrt(rr * rr - level * level);\n"
659 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
660 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
661 " float star = smoothstep(size, 0.0, distance(center, co));\n"
662 " return star;\n"
663 "}\n"
664 "\n"
665 "float luminance( vec3 v )\n"
666 "{\n"
667 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
668 "}\n"
669 "\n"
670 "vec3 clearskies_ambient( vec3 dir )\n"
671 "{\n"
672 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
673 " float sky_gradient = dir.y;\n"
674 " \n"
675 " /* Blend phase colours */\n"
676 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
677 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
678 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
679 " \n"
680 " /* Add gradient */\n"
681 " ambient -= sky_gradient * luminance(ambient);\n"
682 " \n"
683 " return ambient;\n"
684 "}\n"
685 "\n"
686 "vec3 clearskies_sky( vec3 ray_dir )\n"
687 "{\n"
688 " ray_dir.y = abs( ray_dir.y );\n"
689 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
690 " \n"
691 " /* Sun */\n"
692 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
693 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
694 " float sun_shape = pow( sun_size, 2000.0 );\n"
695 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
696 " \n"
697 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
698 " sun_colour *= sun_shape;\n"
699 "\n"
700 " \n"
701 " float star = 0.0;\n"
702 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
703 "\n"
704 " if( star_blend > 0.001 ){\n"
705 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
706 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
707 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
708 " }\n"
709 " }\n"
710 " \n"
711 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
712 " return composite;\n"
713 "}\n"
714 "\n"
715 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
716 "{\n"
717 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
718 "\n"
719 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
720 " g_sunset_phase );\n"
721 "\n"
722 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
723 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
724 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
725 " ) * g_sun_colour.rgb * g_day_phase;\n"
726 "\n"
727 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
728 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
729 " g_sunset_phase );\n"
730 "\n"
731 " return ambient + (light_sun + sky_reflection) * shadow;\n"
732 "}\n"
733 "\n"
734 "#line 44 0 \n"
735 "\n"
736 "float world_depth_sample( vec3 pos )\n"
737 "{\n"
738 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
739 " return texture( g_world_depth, depth_coord ).r;\n"
740 "}\n"
741 "\n"
742 "float world_water_depth( vec3 pos )\n"
743 "{\n"
744 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
745 " return world_depth_sample( pos ) - ref_depth;\n"
746 "}\n"
747 "\n"
748 "float shadow_sample( vec3 co ){\n"
749 " float height_sample = world_depth_sample( co );\n"
750 "\n"
751 " float fdelta = height_sample - co.y;\n"
752 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
753 "}\n"
754 "\n"
755 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
756 " if( g_shadow_samples == 0 ){\n"
757 " return 1.0;\n"
758 " }\n"
759 "\n"
760 " float fspread = g_shadow_spread;\n"
761 " float flength = g_shadow_length;\n"
762 "\n"
763 " float famt = 0.0;\n"
764 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
765 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
766 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
767 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
768 "\n"
769 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
770 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
771 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
772 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
773 "\n"
774 " return 1.0 - famt;\n"
775 "}\n"
776 "\n"
777 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
778 "{\n"
779 " vec3 specdir = reflect( -dir, wnormal );\n"
780 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
781 "}\n"
782 "\n"
783 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
784 " float dist = pow(fdist*0.0010,0.78);\n"
785 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
786 "}\n"
787 "\n"
788 "vec3 scene_calculate_light( int light_index, \n"
789 " vec3 halfview, vec3 co, vec3 normal )\n"
790 "{\n"
791 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
792 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
793 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
794 "\n"
795 " vec3 light_delta = light_co.xyz-co;\n"
796 " float dist2 = dot(light_delta,light_delta);\n"
797 "\n"
798 " light_delta = normalize( light_delta );\n"
799 "\n"
800 " float quadratic = dist2*100.0;\n"
801 " float attenuation = 1.0/( 1.0 + quadratic );\n"
802 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
803 "\n"
804 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
805 "\n"
806 " if( light_dir.w < 0.999999 ){\n"
807 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
808 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
809 " }\n"
810 "\n"
811 " return light_colour.rgb * attenuation * falloff \n"
812 " * step( g_day_phase, light_colour.w );\n"
813 "}\n"
814 "\n"
815 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
816 " vec3 halfview, vec3 co, vec3 normal )\n"
817 "{\n"
818 " uint light_count = packed_index & 0x3u;\n"
819 "\n"
820 " vec3 l = vec3(0.0);\n"
821 "\n"
822 " if( light_count >= 1u ){\n"
823 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
824 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
825 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
826 "\n"
827 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
828 "\n"
829 " if( light_count >= 2u ){\n"
830 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
831 "\n"
832 " if( light_count >= 3u ){\n"
833 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
834 " }\n"
835 " }\n"
836 " }\n"
837 "\n"
838 " return l;\n"
839 "}\n"
840 "\n"
841 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
842 " float light_mask )\n"
843 "{\n"
844 " if( g_light_preview == 1 )\n"
845 " diffuse = vec3(0.75);\n"
846 "\n"
847 " // Lighting\n"
848 " vec3 halfview = uCamera - co;\n"
849 " float fdist = length(halfview);\n"
850 " halfview /= fdist;\n"
851 "\n"
852 " float world_shadow = newlight_compute_sun_shadow( \n"
853 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
854 "\n"
855 " vec3 total_light = clearskies_lighting( \n"
856 " normal, min( light_mask, world_shadow ), halfview );\n"
857 "\n"
858 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
859 " cube_coord = floor( cube_coord );\n"
860 "\n"
861 " if( g_debug_indices == 1 )\n"
862 " {\n"
863 " return rand33(cube_coord);\n"
864 " }\n"
865 "\n"
866 " if( g_debug_complexity == 1 )\n"
867 " {\n"
868 " ivec3 coord = ivec3( cube_coord );\n"
869 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
870 "\n"
871 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
872 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
873 " }\n"
874 "\n"
875 " // FIXME: this coord should absolutely must be clamped!\n"
876 " \n"
877 " ivec3 coord = ivec3( cube_coord );\n"
878 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
879 "\n"
880 " total_light += \n"
881 " scene_calculate_packed_light_patch( index_sample.x,\n"
882 " halfview, co, normal ) \n"
883 " * light_mask;\n"
884 " total_light += \n"
885 " scene_calculate_packed_light_patch( index_sample.y,\n"
886 " halfview, co, normal )\n"
887 " * light_mask;\n"
888 "\n"
889 " // Take a section of the sky function to give us a matching fog colour\n"
890 "\n"
891 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
892 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
893 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
894 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
895 " \n"
896 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
897 " sun_colour *= sun_shape;\n"
898 "\n"
899 " fog_colour += sun_colour;\n"
900 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
901 "}\n"
902 "\n"
903 "#line 9 0 \n"
904 "\n"
905 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
906 "{\n"
907 " vec3 pa = p - a;\n"
908 " vec3 ba = b - a;\n"
909 "\n"
910 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
911 " return length( pa - ba*h );\n"
912 "}\n"
913 "\n"
914 "float compute_board_shadow()\n"
915 "{\n"
916 " // player shadow\n"
917 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
918 " g_board_1.xyz )-0.1 );\n"
919 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
920 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
921 "\n"
922 " return 1.0 - player_shadow*0.8;\n"
923 "}\n"
924 "\n"
925 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
926 "{\n"
927 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
928 "}\n"
929 "\n"
930 "#line 8 0 \n"
931 "#line 1 3 \n"
932 "const float k_motion_lerp_amount = 0.01;\n"
933 "\n"
934 "#line 2 0 \n"
935 "\n"
936 "layout (location = 1) out vec2 oMotionVec;\n"
937 "\n"
938 "in vec3 aMotionVec0;\n"
939 "in vec3 aMotionVec1;\n"
940 "\n"
941 "void compute_motion_vectors()\n"
942 "{\n"
943 " // Write motion vectors\n"
944 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
945 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
946 "\n"
947 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
948 "}\n"
949 "\n"
950 "#line 9 0 \n"
951 "\n"
952 "void main()\n"
953 "{\n"
954 " compute_motion_vectors();\n"
955 "\n"
956 " vec3 vfrag = vec3(0.5,0.5,0.5);\n"
957 " vec4 vsamplemain = texture( uTexMain, aUv );\n"
958 " vec3 qnorm = aNorm.xyz;\n"
959 "\n"
960 " if( vsamplemain.a < 0.15 )\n"
961 " discard;\n"
962 "\n"
963 " vfrag = vsamplemain.rgb;\n"
964 "\n"
965 " if( g_light_preview == 1 )\n"
966 " {\n"
967 " vfrag = vec3(0.5);\n"
968 " }\n"
969 "\n"
970 " vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n"
971 " oColour = vec4(vfrag, 1.0);\n"
972 "}\n"
973 ""},
974 };
975
976 GLuint _uniform_scene_standard_alphatest_uMdl;
977 GLuint _uniform_scene_standard_alphatest_uPv;
978 GLuint _uniform_scene_standard_alphatest_uPvmPrev;
979 GLuint _uniform_scene_standard_alphatest_uTexGarbage;
980 GLuint _uniform_scene_standard_alphatest_uTexMain;
981 GLuint _uniform_scene_standard_alphatest_uCamera;
982 GLuint _uniform_scene_standard_alphatest_uPlane;
983 GLuint _uniform_scene_standard_alphatest_g_world_depth;
984 GLuint _uniform_scene_standard_alphatest_uLightsArray;
985 GLuint _uniform_scene_standard_alphatest_uLightsIndex;
986 #include "shaders/scene_foliage.h"
987 struct vg_shader _shader_scene_foliage = {
988 .name = "scene_foliage",
989 .vs =
990 {
991 .orig_file = "shaders/scene_foliage.vs",
992 .static_src =
993 "layout (location=0) in vec3 a_co;\n"
994 "layout (location=1) in vec4 a_norm;\n"
995 "layout (location=2) in vec2 a_uv;\n"
996 "\n"
997 "#line 1 1 \n"
998 "const float k_motion_lerp_amount = 0.01;\n"
999 "\n"
1000 "#line 2 0 \n"
1001 "\n"
1002 "out vec3 aMotionVec0;\n"
1003 "out vec3 aMotionVec1;\n"
1004 "\n"
1005 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
1006 "{\n"
1007 " // This magically solves some artifacting errors!\n"
1008 " //\n"
1009 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
1010 "\n"
1011 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
1012 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
1013 "}\n"
1014 "\n"
1015 "#line 6 0 \n"
1016 "\n"
1017 "uniform mat4x3 uMdl;\n"
1018 "uniform mat4 uPv;\n"
1019 "uniform mat4 uPvmPrev;\n"
1020 "uniform float uTime;\n"
1021 "\n"
1022 "out vec2 aUv;\n"
1023 "out vec4 aNorm;\n"
1024 "out vec3 aCo;\n"
1025 "out vec3 aWorldCo;\n"
1026 "\n"
1027 "void main(){\n"
1028 " vec4 vsine = sin(vec4(uTime + a_co.x, uTime*0.7 + a_co.z,uTime,uTime*1.3));\n"
1029 " vec3 co = a_co + vsine.xyz * a_norm.w * 0.5;\n"
1030 " \n"
1031 " vec3 world_pos0 = uMdl * vec4( co, 1.0 );\n"
1032 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
1033 " vec4 vproj1 = uPvmPrev * vec4( co, 1.0 );\n"
1034 "\n"
1035 " vs_motion_out( vproj0, vproj1 );\n"
1036 "\n"
1037 " gl_Position = vproj0;\n"
1038 "\n"
1039 " aUv = a_uv;\n"
1040 " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n"
1041 " aCo = a_co;\n"
1042 " aWorldCo = world_pos0;\n"
1043 "}\n"
1044 ""},
1045 .fs =
1046 {
1047 .orig_file = "shaders/scene_foliage.fs",
1048 .static_src =
1049 "uniform sampler2D uTexGarbage;\n"
1050 "uniform sampler2D uTexMain;\n"
1051 "uniform vec3 uCamera;\n"
1052 "uniform vec4 uPlane;\n"
1053 "\n"
1054 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.4;\n"
1055 "#line 1 1 \n"
1056 "// :D\n"
1057 "\n"
1058 "in vec2 aUv;\n"
1059 "in vec4 aNorm;\n"
1060 "in vec3 aCo;\n"
1061 "in vec3 aWorldCo;\n"
1062 "\n"
1063 "#line 1 1 \n"
1064 "layout (location = 0) out vec4 oColour;\n"
1065 "\n"
1066 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
1067 "layout (std140) uniform ub_world_lighting\n"
1068 "{\n"
1069 " vec4 g_cube_min;\n"
1070 " vec4 g_cube_inv_range;\n"
1071 "\n"
1072 " vec4 g_water_plane;\n"
1073 " vec4 g_depth_bounds;\n"
1074 "\n"
1075 " vec4 g_daysky_colour;\n"
1076 " vec4 g_nightsky_colour;\n"
1077 " vec4 g_sunset_colour;\n"
1078 " vec4 g_ambient_colour;\n"
1079 " vec4 g_sunset_ambient;\n"
1080 " vec4 g_sun_colour;\n"
1081 " vec4 g_sun_dir;\n"
1082 " vec4 g_board_0;\n"
1083 " vec4 g_board_1;\n"
1084 "\n"
1085 " float g_water_fog;\n"
1086 " float g_time;\n"
1087 " float g_realtime;\n"
1088 " float g_shadow_length;\n"
1089 " float g_shadow_spread;\n"
1090 "\n"
1091 " float g_time_of_day;\n"
1092 " float g_day_phase;\n"
1093 " float g_sunset_phase;\n"
1094 "\n"
1095 " int g_light_preview;\n"
1096 " int g_shadow_samples;\n"
1097 "\n"
1098 " int g_debug_indices;\n"
1099 " int g_debug_complexity;\n"
1100 "};\n"
1101 "\n"
1102 "uniform sampler2D g_world_depth;\n"
1103 "uniform samplerBuffer uLightsArray;\n"
1104 "uniform usampler3D uLightsIndex;\n"
1105 "\n"
1106 "#line 1 1 \n"
1107 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
1108 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
1109 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
1110 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
1111 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
1112 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
1113 "\n"
1114 "const float SUN_ANGLE = 0.0001;\n"
1115 "const float PI = 3.14159265358979323846264;\n"
1116 "\n"
1117 "//struct world_info\n"
1118 "//{\n"
1119 "// float time,\n"
1120 "// time_of_day,\n"
1121 "// day_phase,\n"
1122 "// sunset_phase;\n"
1123 "// \n"
1124 "// vec3 sun_dir;\n"
1125 "//};\n"
1126 "\n"
1127 "vec3 rand33(vec3 p3)\n"
1128 "{\n"
1129 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
1130 " p3 += dot(p3, p3.yxz+33.33);\n"
1131 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
1132 "}\n"
1133 "\n"
1134 "float stars( vec3 rd, float rr, float size ){\n"
1135 " vec3 co = rd * rr;\n"
1136 "\n"
1137 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
1138 "\n"
1139 " float spaces = 1.0 / rr;\n"
1140 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
1141 " a -= mod(a, spaces) - spaces * 0.5;\n"
1142 "\n"
1143 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
1144 " \n"
1145 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
1146 " plane = plane - mod(plane, PI / count);\n"
1147 "\n"
1148 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
1149 "\n"
1150 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
1151 " float ydist = sqrt(rr * rr - level * level);\n"
1152 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
1153 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
1154 " float star = smoothstep(size, 0.0, distance(center, co));\n"
1155 " return star;\n"
1156 "}\n"
1157 "\n"
1158 "float luminance( vec3 v )\n"
1159 "{\n"
1160 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
1161 "}\n"
1162 "\n"
1163 "vec3 clearskies_ambient( vec3 dir )\n"
1164 "{\n"
1165 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
1166 " float sky_gradient = dir.y;\n"
1167 " \n"
1168 " /* Blend phase colours */\n"
1169 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
1170 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
1171 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
1172 " \n"
1173 " /* Add gradient */\n"
1174 " ambient -= sky_gradient * luminance(ambient);\n"
1175 " \n"
1176 " return ambient;\n"
1177 "}\n"
1178 "\n"
1179 "vec3 clearskies_sky( vec3 ray_dir )\n"
1180 "{\n"
1181 " ray_dir.y = abs( ray_dir.y );\n"
1182 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
1183 " \n"
1184 " /* Sun */\n"
1185 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
1186 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
1187 " float sun_shape = pow( sun_size, 2000.0 );\n"
1188 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
1189 " \n"
1190 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
1191 " sun_colour *= sun_shape;\n"
1192 "\n"
1193 " \n"
1194 " float star = 0.0;\n"
1195 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
1196 "\n"
1197 " if( star_blend > 0.001 ){\n"
1198 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
1199 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
1200 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
1201 " }\n"
1202 " }\n"
1203 " \n"
1204 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
1205 " return composite;\n"
1206 "}\n"
1207 "\n"
1208 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
1209 "{\n"
1210 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
1211 "\n"
1212 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
1213 " g_sunset_phase );\n"
1214 "\n"
1215 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
1216 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
1217 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
1218 " ) * g_sun_colour.rgb * g_day_phase;\n"
1219 "\n"
1220 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
1221 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
1222 " g_sunset_phase );\n"
1223 "\n"
1224 " return ambient + (light_sun + sky_reflection) * shadow;\n"
1225 "}\n"
1226 "\n"
1227 "#line 44 0 \n"
1228 "\n"
1229 "float world_depth_sample( vec3 pos )\n"
1230 "{\n"
1231 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
1232 " return texture( g_world_depth, depth_coord ).r;\n"
1233 "}\n"
1234 "\n"
1235 "float world_water_depth( vec3 pos )\n"
1236 "{\n"
1237 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
1238 " return world_depth_sample( pos ) - ref_depth;\n"
1239 "}\n"
1240 "\n"
1241 "float shadow_sample( vec3 co ){\n"
1242 " float height_sample = world_depth_sample( co );\n"
1243 "\n"
1244 " float fdelta = height_sample - co.y;\n"
1245 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
1246 "}\n"
1247 "\n"
1248 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
1249 " if( g_shadow_samples == 0 ){\n"
1250 " return 1.0;\n"
1251 " }\n"
1252 "\n"
1253 " float fspread = g_shadow_spread;\n"
1254 " float flength = g_shadow_length;\n"
1255 "\n"
1256 " float famt = 0.0;\n"
1257 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
1258 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
1259 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
1260 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
1261 "\n"
1262 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
1263 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
1264 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
1265 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
1266 "\n"
1267 " return 1.0 - famt;\n"
1268 "}\n"
1269 "\n"
1270 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
1271 "{\n"
1272 " vec3 specdir = reflect( -dir, wnormal );\n"
1273 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
1274 "}\n"
1275 "\n"
1276 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
1277 " float dist = pow(fdist*0.0010,0.78);\n"
1278 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
1279 "}\n"
1280 "\n"
1281 "vec3 scene_calculate_light( int light_index, \n"
1282 " vec3 halfview, vec3 co, vec3 normal )\n"
1283 "{\n"
1284 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
1285 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
1286 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
1287 "\n"
1288 " vec3 light_delta = light_co.xyz-co;\n"
1289 " float dist2 = dot(light_delta,light_delta);\n"
1290 "\n"
1291 " light_delta = normalize( light_delta );\n"
1292 "\n"
1293 " float quadratic = dist2*100.0;\n"
1294 " float attenuation = 1.0/( 1.0 + quadratic );\n"
1295 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
1296 "\n"
1297 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
1298 "\n"
1299 " if( light_dir.w < 0.999999 ){\n"
1300 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
1301 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
1302 " }\n"
1303 "\n"
1304 " return light_colour.rgb * attenuation * falloff \n"
1305 " * step( g_day_phase, light_colour.w );\n"
1306 "}\n"
1307 "\n"
1308 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
1309 " vec3 halfview, vec3 co, vec3 normal )\n"
1310 "{\n"
1311 " uint light_count = packed_index & 0x3u;\n"
1312 "\n"
1313 " vec3 l = vec3(0.0);\n"
1314 "\n"
1315 " if( light_count >= 1u ){\n"
1316 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
1317 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
1318 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
1319 "\n"
1320 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
1321 "\n"
1322 " if( light_count >= 2u ){\n"
1323 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
1324 "\n"
1325 " if( light_count >= 3u ){\n"
1326 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
1327 " }\n"
1328 " }\n"
1329 " }\n"
1330 "\n"
1331 " return l;\n"
1332 "}\n"
1333 "\n"
1334 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
1335 " float light_mask )\n"
1336 "{\n"
1337 " if( g_light_preview == 1 )\n"
1338 " diffuse = vec3(0.75);\n"
1339 "\n"
1340 " // Lighting\n"
1341 " vec3 halfview = uCamera - co;\n"
1342 " float fdist = length(halfview);\n"
1343 " halfview /= fdist;\n"
1344 "\n"
1345 " float world_shadow = newlight_compute_sun_shadow( \n"
1346 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
1347 "\n"
1348 " vec3 total_light = clearskies_lighting( \n"
1349 " normal, min( light_mask, world_shadow ), halfview );\n"
1350 "\n"
1351 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
1352 " cube_coord = floor( cube_coord );\n"
1353 "\n"
1354 " if( g_debug_indices == 1 )\n"
1355 " {\n"
1356 " return rand33(cube_coord);\n"
1357 " }\n"
1358 "\n"
1359 " if( g_debug_complexity == 1 )\n"
1360 " {\n"
1361 " ivec3 coord = ivec3( cube_coord );\n"
1362 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
1363 "\n"
1364 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
1365 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
1366 " }\n"
1367 "\n"
1368 " // FIXME: this coord should absolutely must be clamped!\n"
1369 " \n"
1370 " ivec3 coord = ivec3( cube_coord );\n"
1371 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
1372 "\n"
1373 " total_light += \n"
1374 " scene_calculate_packed_light_patch( index_sample.x,\n"
1375 " halfview, co, normal ) \n"
1376 " * light_mask;\n"
1377 " total_light += \n"
1378 " scene_calculate_packed_light_patch( index_sample.y,\n"
1379 " halfview, co, normal )\n"
1380 " * light_mask;\n"
1381 "\n"
1382 " // Take a section of the sky function to give us a matching fog colour\n"
1383 "\n"
1384 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
1385 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
1386 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
1387 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
1388 " \n"
1389 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
1390 " sun_colour *= sun_shape;\n"
1391 "\n"
1392 " fog_colour += sun_colour;\n"
1393 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
1394 "}\n"
1395 "\n"
1396 "#line 9 0 \n"
1397 "\n"
1398 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
1399 "{\n"
1400 " vec3 pa = p - a;\n"
1401 " vec3 ba = b - a;\n"
1402 "\n"
1403 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
1404 " return length( pa - ba*h );\n"
1405 "}\n"
1406 "\n"
1407 "float compute_board_shadow()\n"
1408 "{\n"
1409 " // player shadow\n"
1410 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
1411 " g_board_1.xyz )-0.1 );\n"
1412 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
1413 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
1414 "\n"
1415 " return 1.0 - player_shadow*0.8;\n"
1416 "}\n"
1417 "\n"
1418 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
1419 "{\n"
1420 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
1421 "}\n"
1422 "\n"
1423 "#line 8 0 \n"
1424 "#line 1 2 \n"
1425 "const float k_motion_lerp_amount = 0.01;\n"
1426 "\n"
1427 "#line 2 0 \n"
1428 "\n"
1429 "layout (location = 1) out vec2 oMotionVec;\n"
1430 "\n"
1431 "in vec3 aMotionVec0;\n"
1432 "in vec3 aMotionVec1;\n"
1433 "\n"
1434 "void compute_motion_vectors()\n"
1435 "{\n"
1436 " // Write motion vectors\n"
1437 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
1438 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
1439 "\n"
1440 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
1441 "}\n"
1442 "\n"
1443 "#line 9 0 \n"
1444 "\n"
1445 "void main(){\n"
1446 " compute_motion_vectors();\n"
1447 "\n"
1448 " vec3 vfrag = vec3(0.5,0.5,0.5);\n"
1449 " vec4 vsamplemain = texture( uTexMain, aUv );\n"
1450 " vec3 qnorm = aNorm.xyz;\n"
1451 "\n"
1452 " if( vsamplemain.a < 0.15 )\n"
1453 " discard;\n"
1454 "\n"
1455 " vfrag = vsamplemain.rgb;\n"
1456 "\n"
1457 " if( g_light_preview == 1 ){\n"
1458 " vfrag = vec3(0.5);\n"
1459 " }\n"
1460 "\n"
1461 " vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n"
1462 " oColour = vec4(vfrag, 1.0);\n"
1463 "}\n"
1464 ""},
1465 };
1466
1467 GLuint _uniform_scene_foliage_uMdl;
1468 GLuint _uniform_scene_foliage_uPv;
1469 GLuint _uniform_scene_foliage_uPvmPrev;
1470 GLuint _uniform_scene_foliage_uTime;
1471 GLuint _uniform_scene_foliage_uTexGarbage;
1472 GLuint _uniform_scene_foliage_uTexMain;
1473 GLuint _uniform_scene_foliage_uCamera;
1474 GLuint _uniform_scene_foliage_uPlane;
1475 GLuint _uniform_scene_foliage_g_world_depth;
1476 GLuint _uniform_scene_foliage_uLightsArray;
1477 GLuint _uniform_scene_foliage_uLightsIndex;
1478 #include "shaders/scene_override.h"
1479 struct vg_shader _shader_scene_override = {
1480 .name = "scene_override",
1481 .vs =
1482 {
1483 .orig_file = "shaders/scene_override.vs",
1484 .static_src =
1485 "layout (location=0) in vec3 a_co;\n"
1486 "layout (location=1) in vec4 a_norm;\n"
1487 "layout (location=2) in vec2 a_uv;\n"
1488 "\n"
1489 "#line 1 1 \n"
1490 "const float k_motion_lerp_amount = 0.01;\n"
1491 "\n"
1492 "#line 2 0 \n"
1493 "\n"
1494 "out vec3 aMotionVec0;\n"
1495 "out vec3 aMotionVec1;\n"
1496 "\n"
1497 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
1498 "{\n"
1499 " // This magically solves some artifacting errors!\n"
1500 " //\n"
1501 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
1502 "\n"
1503 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
1504 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
1505 "}\n"
1506 "\n"
1507 "#line 6 0 \n"
1508 "\n"
1509 "uniform mat4x3 uMdl;\n"
1510 "uniform mat4 uPv;\n"
1511 "uniform mat4 uPvmPrev;\n"
1512 "uniform mat3 uNormalMtx;\n"
1513 "\n"
1514 "out vec2 aUv;\n"
1515 "out vec4 aNorm;\n"
1516 "out vec3 aCo;\n"
1517 "out vec3 aWorldCo;\n"
1518 "\n"
1519 "void main()\n"
1520 "{\n"
1521 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
1522 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
1523 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
1524 "\n"
1525 " vs_motion_out( vproj0, vproj1 );\n"
1526 "\n"
1527 " gl_Position = vproj0;\n"
1528 "\n"
1529 " aUv = a_uv;\n"
1530 " aNorm = vec4( uNormalMtx * a_norm.xyz, a_norm.w );\n"
1531 " aCo = a_co;\n"
1532 " aWorldCo = world_pos0;\n"
1533 "}\n"
1534 ""},
1535 .fs =
1536 {
1537 .orig_file = "shaders/scene_override.fs",
1538 .static_src =
1539 "uniform sampler2D uTexGarbage;\n"
1540 "uniform sampler2D uTexMain;\n"
1541 "uniform vec3 uCamera;\n"
1542 "uniform vec4 uPlane;\n"
1543 "\n"
1544 "uniform vec4 uPlayerPos; /* w: distance to uSpawnPos */\n"
1545 "uniform vec4 uSpawnPos; /* w: inverse distance to uPlayerPos */\n"
1546 "uniform bool uAlphatest;\n"
1547 "uniform vec4 uMapInfo; /* x: min, y: max, z: iso line amount */\n"
1548 "\n"
1549 "#line 1 1 \n"
1550 "// :D\n"
1551 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
1552 "\n"
1553 "#line 12 0 \n"
1554 "#line 1 2 \n"
1555 "// :D\n"
1556 "\n"
1557 "in vec2 aUv;\n"
1558 "in vec4 aNorm;\n"
1559 "in vec3 aCo;\n"
1560 "in vec3 aWorldCo;\n"
1561 "\n"
1562 "#line 1 1 \n"
1563 "layout (location = 0) out vec4 oColour;\n"
1564 "\n"
1565 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
1566 "layout (std140) uniform ub_world_lighting\n"
1567 "{\n"
1568 " vec4 g_cube_min;\n"
1569 " vec4 g_cube_inv_range;\n"
1570 "\n"
1571 " vec4 g_water_plane;\n"
1572 " vec4 g_depth_bounds;\n"
1573 "\n"
1574 " vec4 g_daysky_colour;\n"
1575 " vec4 g_nightsky_colour;\n"
1576 " vec4 g_sunset_colour;\n"
1577 " vec4 g_ambient_colour;\n"
1578 " vec4 g_sunset_ambient;\n"
1579 " vec4 g_sun_colour;\n"
1580 " vec4 g_sun_dir;\n"
1581 " vec4 g_board_0;\n"
1582 " vec4 g_board_1;\n"
1583 "\n"
1584 " float g_water_fog;\n"
1585 " float g_time;\n"
1586 " float g_realtime;\n"
1587 " float g_shadow_length;\n"
1588 " float g_shadow_spread;\n"
1589 "\n"
1590 " float g_time_of_day;\n"
1591 " float g_day_phase;\n"
1592 " float g_sunset_phase;\n"
1593 "\n"
1594 " int g_light_preview;\n"
1595 " int g_shadow_samples;\n"
1596 "\n"
1597 " int g_debug_indices;\n"
1598 " int g_debug_complexity;\n"
1599 "};\n"
1600 "\n"
1601 "uniform sampler2D g_world_depth;\n"
1602 "uniform samplerBuffer uLightsArray;\n"
1603 "uniform usampler3D uLightsIndex;\n"
1604 "\n"
1605 "#line 1 1 \n"
1606 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
1607 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
1608 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
1609 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
1610 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
1611 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
1612 "\n"
1613 "const float SUN_ANGLE = 0.0001;\n"
1614 "const float PI = 3.14159265358979323846264;\n"
1615 "\n"
1616 "//struct world_info\n"
1617 "//{\n"
1618 "// float time,\n"
1619 "// time_of_day,\n"
1620 "// day_phase,\n"
1621 "// sunset_phase;\n"
1622 "// \n"
1623 "// vec3 sun_dir;\n"
1624 "//};\n"
1625 "\n"
1626 "vec3 rand33(vec3 p3)\n"
1627 "{\n"
1628 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
1629 " p3 += dot(p3, p3.yxz+33.33);\n"
1630 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
1631 "}\n"
1632 "\n"
1633 "float stars( vec3 rd, float rr, float size ){\n"
1634 " vec3 co = rd * rr;\n"
1635 "\n"
1636 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
1637 "\n"
1638 " float spaces = 1.0 / rr;\n"
1639 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
1640 " a -= mod(a, spaces) - spaces * 0.5;\n"
1641 "\n"
1642 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
1643 " \n"
1644 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
1645 " plane = plane - mod(plane, PI / count);\n"
1646 "\n"
1647 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
1648 "\n"
1649 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
1650 " float ydist = sqrt(rr * rr - level * level);\n"
1651 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
1652 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
1653 " float star = smoothstep(size, 0.0, distance(center, co));\n"
1654 " return star;\n"
1655 "}\n"
1656 "\n"
1657 "float luminance( vec3 v )\n"
1658 "{\n"
1659 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
1660 "}\n"
1661 "\n"
1662 "vec3 clearskies_ambient( vec3 dir )\n"
1663 "{\n"
1664 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
1665 " float sky_gradient = dir.y;\n"
1666 " \n"
1667 " /* Blend phase colours */\n"
1668 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
1669 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
1670 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
1671 " \n"
1672 " /* Add gradient */\n"
1673 " ambient -= sky_gradient * luminance(ambient);\n"
1674 " \n"
1675 " return ambient;\n"
1676 "}\n"
1677 "\n"
1678 "vec3 clearskies_sky( vec3 ray_dir )\n"
1679 "{\n"
1680 " ray_dir.y = abs( ray_dir.y );\n"
1681 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
1682 " \n"
1683 " /* Sun */\n"
1684 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
1685 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
1686 " float sun_shape = pow( sun_size, 2000.0 );\n"
1687 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
1688 " \n"
1689 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
1690 " sun_colour *= sun_shape;\n"
1691 "\n"
1692 " \n"
1693 " float star = 0.0;\n"
1694 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
1695 "\n"
1696 " if( star_blend > 0.001 ){\n"
1697 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
1698 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
1699 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
1700 " }\n"
1701 " }\n"
1702 " \n"
1703 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
1704 " return composite;\n"
1705 "}\n"
1706 "\n"
1707 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
1708 "{\n"
1709 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
1710 "\n"
1711 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
1712 " g_sunset_phase );\n"
1713 "\n"
1714 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
1715 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
1716 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
1717 " ) * g_sun_colour.rgb * g_day_phase;\n"
1718 "\n"
1719 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
1720 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
1721 " g_sunset_phase );\n"
1722 "\n"
1723 " return ambient + (light_sun + sky_reflection) * shadow;\n"
1724 "}\n"
1725 "\n"
1726 "#line 44 0 \n"
1727 "\n"
1728 "float world_depth_sample( vec3 pos )\n"
1729 "{\n"
1730 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
1731 " return texture( g_world_depth, depth_coord ).r;\n"
1732 "}\n"
1733 "\n"
1734 "float world_water_depth( vec3 pos )\n"
1735 "{\n"
1736 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
1737 " return world_depth_sample( pos ) - ref_depth;\n"
1738 "}\n"
1739 "\n"
1740 "float shadow_sample( vec3 co ){\n"
1741 " float height_sample = world_depth_sample( co );\n"
1742 "\n"
1743 " float fdelta = height_sample - co.y;\n"
1744 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
1745 "}\n"
1746 "\n"
1747 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
1748 " if( g_shadow_samples == 0 ){\n"
1749 " return 1.0;\n"
1750 " }\n"
1751 "\n"
1752 " float fspread = g_shadow_spread;\n"
1753 " float flength = g_shadow_length;\n"
1754 "\n"
1755 " float famt = 0.0;\n"
1756 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
1757 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
1758 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
1759 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
1760 "\n"
1761 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
1762 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
1763 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
1764 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
1765 "\n"
1766 " return 1.0 - famt;\n"
1767 "}\n"
1768 "\n"
1769 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
1770 "{\n"
1771 " vec3 specdir = reflect( -dir, wnormal );\n"
1772 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
1773 "}\n"
1774 "\n"
1775 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
1776 " float dist = pow(fdist*0.0010,0.78);\n"
1777 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
1778 "}\n"
1779 "\n"
1780 "vec3 scene_calculate_light( int light_index, \n"
1781 " vec3 halfview, vec3 co, vec3 normal )\n"
1782 "{\n"
1783 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
1784 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
1785 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
1786 "\n"
1787 " vec3 light_delta = light_co.xyz-co;\n"
1788 " float dist2 = dot(light_delta,light_delta);\n"
1789 "\n"
1790 " light_delta = normalize( light_delta );\n"
1791 "\n"
1792 " float quadratic = dist2*100.0;\n"
1793 " float attenuation = 1.0/( 1.0 + quadratic );\n"
1794 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
1795 "\n"
1796 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
1797 "\n"
1798 " if( light_dir.w < 0.999999 ){\n"
1799 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
1800 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
1801 " }\n"
1802 "\n"
1803 " return light_colour.rgb * attenuation * falloff \n"
1804 " * step( g_day_phase, light_colour.w );\n"
1805 "}\n"
1806 "\n"
1807 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
1808 " vec3 halfview, vec3 co, vec3 normal )\n"
1809 "{\n"
1810 " uint light_count = packed_index & 0x3u;\n"
1811 "\n"
1812 " vec3 l = vec3(0.0);\n"
1813 "\n"
1814 " if( light_count >= 1u ){\n"
1815 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
1816 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
1817 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
1818 "\n"
1819 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
1820 "\n"
1821 " if( light_count >= 2u ){\n"
1822 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
1823 "\n"
1824 " if( light_count >= 3u ){\n"
1825 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
1826 " }\n"
1827 " }\n"
1828 " }\n"
1829 "\n"
1830 " return l;\n"
1831 "}\n"
1832 "\n"
1833 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
1834 " float light_mask )\n"
1835 "{\n"
1836 " if( g_light_preview == 1 )\n"
1837 " diffuse = vec3(0.75);\n"
1838 "\n"
1839 " // Lighting\n"
1840 " vec3 halfview = uCamera - co;\n"
1841 " float fdist = length(halfview);\n"
1842 " halfview /= fdist;\n"
1843 "\n"
1844 " float world_shadow = newlight_compute_sun_shadow( \n"
1845 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
1846 "\n"
1847 " vec3 total_light = clearskies_lighting( \n"
1848 " normal, min( light_mask, world_shadow ), halfview );\n"
1849 "\n"
1850 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
1851 " cube_coord = floor( cube_coord );\n"
1852 "\n"
1853 " if( g_debug_indices == 1 )\n"
1854 " {\n"
1855 " return rand33(cube_coord);\n"
1856 " }\n"
1857 "\n"
1858 " if( g_debug_complexity == 1 )\n"
1859 " {\n"
1860 " ivec3 coord = ivec3( cube_coord );\n"
1861 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
1862 "\n"
1863 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
1864 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
1865 " }\n"
1866 "\n"
1867 " // FIXME: this coord should absolutely must be clamped!\n"
1868 " \n"
1869 " ivec3 coord = ivec3( cube_coord );\n"
1870 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
1871 "\n"
1872 " total_light += \n"
1873 " scene_calculate_packed_light_patch( index_sample.x,\n"
1874 " halfview, co, normal ) \n"
1875 " * light_mask;\n"
1876 " total_light += \n"
1877 " scene_calculate_packed_light_patch( index_sample.y,\n"
1878 " halfview, co, normal )\n"
1879 " * light_mask;\n"
1880 "\n"
1881 " // Take a section of the sky function to give us a matching fog colour\n"
1882 "\n"
1883 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
1884 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
1885 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
1886 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
1887 " \n"
1888 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
1889 " sun_colour *= sun_shape;\n"
1890 "\n"
1891 " fog_colour += sun_colour;\n"
1892 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
1893 "}\n"
1894 "\n"
1895 "#line 9 0 \n"
1896 "\n"
1897 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
1898 "{\n"
1899 " vec3 pa = p - a;\n"
1900 " vec3 ba = b - a;\n"
1901 "\n"
1902 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
1903 " return length( pa - ba*h );\n"
1904 "}\n"
1905 "\n"
1906 "float compute_board_shadow()\n"
1907 "{\n"
1908 " // player shadow\n"
1909 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
1910 " g_board_1.xyz )-0.1 );\n"
1911 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
1912 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
1913 "\n"
1914 " return 1.0 - player_shadow*0.8;\n"
1915 "}\n"
1916 "\n"
1917 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
1918 "{\n"
1919 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
1920 "}\n"
1921 "\n"
1922 "#line 13 0 \n"
1923 "#line 1 3 \n"
1924 "const float k_motion_lerp_amount = 0.01;\n"
1925 "\n"
1926 "#line 2 0 \n"
1927 "\n"
1928 "layout (location = 1) out vec2 oMotionVec;\n"
1929 "\n"
1930 "in vec3 aMotionVec0;\n"
1931 "in vec3 aMotionVec1;\n"
1932 "\n"
1933 "void compute_motion_vectors()\n"
1934 "{\n"
1935 " // Write motion vectors\n"
1936 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
1937 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
1938 "\n"
1939 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
1940 "}\n"
1941 "\n"
1942 "#line 14 0 \n"
1943 "\n"
1944 "vec2 smin( float a, float b, float k ){\n"
1945 " float h = max( k-abs(a-b), 0.0 )/k;\n"
1946 " float m = h*h*0.5;\n"
1947 " float s = m*k*(1.0/2.0);\n"
1948 "\n"
1949 " if( a < b )\n"
1950 " return vec2(a-s,m);\n"
1951 " else\n"
1952 " return vec2(b-s,1.0-m);\n"
1953 "}\n"
1954 "\n"
1955 "void main(){\n"
1956 " vec2 ssuv = gl_FragCoord.xy;\n"
1957 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
1958 " float dither = fract( vDither.g / 71.0 ) - 0.5;\n"
1959 "\n"
1960 " float dcam = (-8.0+distance( aCo, uCamera ))/4.0;\n"
1961 " float dy0 = aCo.y - uMapInfo.x;\n"
1962 " float dy1 = uMapInfo.y - aCo.y;\n"
1963 "\n"
1964 " if( min(min(dy0,dy1)*0.5, dcam) + dither < 0.51 ) \n"
1965 " discard;\n"
1966 "\n"
1967 " compute_motion_vectors();\n"
1968 "\n"
1969 " vec3 vfrag = vec3(0.898,0.811,0.716);\n"
1970 " vec3 qnorm = aNorm.xyz;\n"
1971 "\n"
1972 " qnorm = normalize(floor(aNorm.xyz*4.0)*0.25);\n"
1973 " qnorm += vec3(0.001,0.0,0.0);\n"
1974 "\n"
1975 " if( uAlphatest ){\n"
1976 " vec4 vSample = texture( uTexMain, aUv );\n"
1977 " if( vSample.a < 0.5 )\n"
1978 " discard;\n"
1979 " }\n"
1980 " else{\n"
1981 " }\n"
1982 "\n"
1983 " vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n"
1984 " \n"
1985 " // dots\n"
1986 " float d0 = distance( aCo, uPlayerPos.xyz )*2.0;\n"
1987 " float d1 = distance( aCo, uSpawnPos.xyz );\n"
1988 "\n"
1989 " vec2 dm = smin( d0, d1, 10.0 );\n"
1990 " float dd = fract(dm.x*0.2-g_realtime*0.5) * \n"
1991 " max(0.0,1.0-dm.x*0.04) * \n"
1992 " max(0.0,qnorm.y);\n"
1993 " vec3 emit = mix(vec3(1.0,0.0,0.0),vec3(0.0,1.0,0.0),dm.y)*dd;\n"
1994 "\n"
1995 " // line\n"
1996 " vec3 v0 = (uSpawnPos.xyz-uPlayerPos.xyz)*uSpawnPos.w;\n"
1997 " float t = clamp( dot(aCo-uPlayerPos.xyz,v0), 0.0, uPlayerPos.w );\n"
1998 " vec3 p0 = uPlayerPos.xyz + v0*t;\n"
1999 " float d3 = distance(p0,aCo);\n"
2000 " emit += vec3(fract(t*0.2-g_realtime+d3*0.2)*max(0.0,1.0-d3*0.2));\n"
2001 "\n"
2002 " vfrag += emit;\n"
2003 "\n"
2004 " if( uMapInfo.z > 0.0 ){\n"
2005 " float height = fract( aCo.y * 0.1 );\n"
2006 " float lg = 2.0*length(vec2(dFdx(height), dFdy(height)));\n"
2007 " vfrag *= 1.0f+(lg*0.2*uMapInfo.z);\n"
2008 " }\n"
2009 "\n"
2010 " oColour = vec4( vfrag, 1.0 );\n"
2011 " //oColour = vec4( vfrag, 1.0 );\n"
2012 "}\n"
2013 ""},
2014 };
2015
2016 GLuint _uniform_scene_override_uMdl;
2017 GLuint _uniform_scene_override_uPv;
2018 GLuint _uniform_scene_override_uPvmPrev;
2019 GLuint _uniform_scene_override_uNormalMtx;
2020 GLuint _uniform_scene_override_uTexGarbage;
2021 GLuint _uniform_scene_override_uTexMain;
2022 GLuint _uniform_scene_override_uCamera;
2023 GLuint _uniform_scene_override_uPlane;
2024 GLuint _uniform_scene_override_uPlayerPos;
2025 GLuint _uniform_scene_override_uSpawnPos;
2026 GLuint _uniform_scene_override_uAlphatest;
2027 GLuint _uniform_scene_override_uMapInfo;
2028 GLuint _uniform_scene_override_g_world_depth;
2029 GLuint _uniform_scene_override_uLightsArray;
2030 GLuint _uniform_scene_override_uLightsIndex;
2031 #include "shaders/scene_fxglow.h"
2032 struct vg_shader _shader_scene_fxglow = {
2033 .name = "scene_fxglow",
2034 .vs =
2035 {
2036 .orig_file = "shaders/scene_fxglow.vs",
2037 .static_src =
2038 "layout (location=0) in vec3 a_co;\n"
2039 "layout (location=1) in vec4 a_norm;\n"
2040 "layout (location=2) in vec2 a_uv;\n"
2041 "\n"
2042 "#line 1 1 \n"
2043 "const float k_motion_lerp_amount = 0.01;\n"
2044 "\n"
2045 "#line 2 0 \n"
2046 "\n"
2047 "out vec3 aMotionVec0;\n"
2048 "out vec3 aMotionVec1;\n"
2049 "\n"
2050 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
2051 "{\n"
2052 " // This magically solves some artifacting errors!\n"
2053 " //\n"
2054 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
2055 "\n"
2056 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
2057 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
2058 "}\n"
2059 "\n"
2060 "#line 6 0 \n"
2061 "\n"
2062 "uniform mat4x3 uMdl;\n"
2063 "uniform mat4 uPv;\n"
2064 "uniform mat4 uPvmPrev;\n"
2065 "uniform vec2 uUvOffset;\n"
2066 "\n"
2067 "out vec2 aUv;\n"
2068 "out vec4 aNorm;\n"
2069 "out vec3 aCo;\n"
2070 "out vec3 aWorldCo;\n"
2071 "\n"
2072 "void main()\n"
2073 "{\n"
2074 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
2075 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
2076 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
2077 "\n"
2078 " vs_motion_out( vproj0, vproj1 );\n"
2079 "\n"
2080 " gl_Position = vproj0;\n"
2081 "\n"
2082 " aUv = a_uv + uUvOffset;\n"
2083 " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n"
2084 " aCo = a_co;\n"
2085 " aWorldCo = world_pos0;\n"
2086 "}\n"
2087 ""},
2088 .fs =
2089 {
2090 .orig_file = "shaders/scene_fxglow.fs",
2091 .static_src =
2092 "uniform sampler2D uTexMain;\n"
2093 "uniform vec3 uCamera;\n"
2094 "\n"
2095 "#line 1 1 \n"
2096 "// :D\n"
2097 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
2098 "\n"
2099 "#line 5 0 \n"
2100 "#line 1 2 \n"
2101 "// :D\n"
2102 "\n"
2103 "in vec2 aUv;\n"
2104 "in vec4 aNorm;\n"
2105 "in vec3 aCo;\n"
2106 "in vec3 aWorldCo;\n"
2107 "\n"
2108 "#line 1 1 \n"
2109 "layout (location = 0) out vec4 oColour;\n"
2110 "\n"
2111 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
2112 "layout (std140) uniform ub_world_lighting\n"
2113 "{\n"
2114 " vec4 g_cube_min;\n"
2115 " vec4 g_cube_inv_range;\n"
2116 "\n"
2117 " vec4 g_water_plane;\n"
2118 " vec4 g_depth_bounds;\n"
2119 "\n"
2120 " vec4 g_daysky_colour;\n"
2121 " vec4 g_nightsky_colour;\n"
2122 " vec4 g_sunset_colour;\n"
2123 " vec4 g_ambient_colour;\n"
2124 " vec4 g_sunset_ambient;\n"
2125 " vec4 g_sun_colour;\n"
2126 " vec4 g_sun_dir;\n"
2127 " vec4 g_board_0;\n"
2128 " vec4 g_board_1;\n"
2129 "\n"
2130 " float g_water_fog;\n"
2131 " float g_time;\n"
2132 " float g_realtime;\n"
2133 " float g_shadow_length;\n"
2134 " float g_shadow_spread;\n"
2135 "\n"
2136 " float g_time_of_day;\n"
2137 " float g_day_phase;\n"
2138 " float g_sunset_phase;\n"
2139 "\n"
2140 " int g_light_preview;\n"
2141 " int g_shadow_samples;\n"
2142 "\n"
2143 " int g_debug_indices;\n"
2144 " int g_debug_complexity;\n"
2145 "};\n"
2146 "\n"
2147 "uniform sampler2D g_world_depth;\n"
2148 "uniform samplerBuffer uLightsArray;\n"
2149 "uniform usampler3D uLightsIndex;\n"
2150 "\n"
2151 "#line 1 1 \n"
2152 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
2153 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
2154 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
2155 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
2156 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
2157 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
2158 "\n"
2159 "const float SUN_ANGLE = 0.0001;\n"
2160 "const float PI = 3.14159265358979323846264;\n"
2161 "\n"
2162 "//struct world_info\n"
2163 "//{\n"
2164 "// float time,\n"
2165 "// time_of_day,\n"
2166 "// day_phase,\n"
2167 "// sunset_phase;\n"
2168 "// \n"
2169 "// vec3 sun_dir;\n"
2170 "//};\n"
2171 "\n"
2172 "vec3 rand33(vec3 p3)\n"
2173 "{\n"
2174 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
2175 " p3 += dot(p3, p3.yxz+33.33);\n"
2176 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
2177 "}\n"
2178 "\n"
2179 "float stars( vec3 rd, float rr, float size ){\n"
2180 " vec3 co = rd * rr;\n"
2181 "\n"
2182 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
2183 "\n"
2184 " float spaces = 1.0 / rr;\n"
2185 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
2186 " a -= mod(a, spaces) - spaces * 0.5;\n"
2187 "\n"
2188 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
2189 " \n"
2190 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
2191 " plane = plane - mod(plane, PI / count);\n"
2192 "\n"
2193 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
2194 "\n"
2195 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
2196 " float ydist = sqrt(rr * rr - level * level);\n"
2197 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
2198 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
2199 " float star = smoothstep(size, 0.0, distance(center, co));\n"
2200 " return star;\n"
2201 "}\n"
2202 "\n"
2203 "float luminance( vec3 v )\n"
2204 "{\n"
2205 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
2206 "}\n"
2207 "\n"
2208 "vec3 clearskies_ambient( vec3 dir )\n"
2209 "{\n"
2210 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
2211 " float sky_gradient = dir.y;\n"
2212 " \n"
2213 " /* Blend phase colours */\n"
2214 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
2215 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
2216 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
2217 " \n"
2218 " /* Add gradient */\n"
2219 " ambient -= sky_gradient * luminance(ambient);\n"
2220 " \n"
2221 " return ambient;\n"
2222 "}\n"
2223 "\n"
2224 "vec3 clearskies_sky( vec3 ray_dir )\n"
2225 "{\n"
2226 " ray_dir.y = abs( ray_dir.y );\n"
2227 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
2228 " \n"
2229 " /* Sun */\n"
2230 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
2231 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
2232 " float sun_shape = pow( sun_size, 2000.0 );\n"
2233 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
2234 " \n"
2235 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
2236 " sun_colour *= sun_shape;\n"
2237 "\n"
2238 " \n"
2239 " float star = 0.0;\n"
2240 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
2241 "\n"
2242 " if( star_blend > 0.001 ){\n"
2243 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
2244 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
2245 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
2246 " }\n"
2247 " }\n"
2248 " \n"
2249 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
2250 " return composite;\n"
2251 "}\n"
2252 "\n"
2253 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
2254 "{\n"
2255 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
2256 "\n"
2257 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
2258 " g_sunset_phase );\n"
2259 "\n"
2260 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
2261 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
2262 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
2263 " ) * g_sun_colour.rgb * g_day_phase;\n"
2264 "\n"
2265 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
2266 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
2267 " g_sunset_phase );\n"
2268 "\n"
2269 " return ambient + (light_sun + sky_reflection) * shadow;\n"
2270 "}\n"
2271 "\n"
2272 "#line 44 0 \n"
2273 "\n"
2274 "float world_depth_sample( vec3 pos )\n"
2275 "{\n"
2276 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
2277 " return texture( g_world_depth, depth_coord ).r;\n"
2278 "}\n"
2279 "\n"
2280 "float world_water_depth( vec3 pos )\n"
2281 "{\n"
2282 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
2283 " return world_depth_sample( pos ) - ref_depth;\n"
2284 "}\n"
2285 "\n"
2286 "float shadow_sample( vec3 co ){\n"
2287 " float height_sample = world_depth_sample( co );\n"
2288 "\n"
2289 " float fdelta = height_sample - co.y;\n"
2290 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
2291 "}\n"
2292 "\n"
2293 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
2294 " if( g_shadow_samples == 0 ){\n"
2295 " return 1.0;\n"
2296 " }\n"
2297 "\n"
2298 " float fspread = g_shadow_spread;\n"
2299 " float flength = g_shadow_length;\n"
2300 "\n"
2301 " float famt = 0.0;\n"
2302 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
2303 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
2304 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
2305 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
2306 "\n"
2307 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
2308 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
2309 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
2310 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
2311 "\n"
2312 " return 1.0 - famt;\n"
2313 "}\n"
2314 "\n"
2315 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
2316 "{\n"
2317 " vec3 specdir = reflect( -dir, wnormal );\n"
2318 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
2319 "}\n"
2320 "\n"
2321 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
2322 " float dist = pow(fdist*0.0010,0.78);\n"
2323 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
2324 "}\n"
2325 "\n"
2326 "vec3 scene_calculate_light( int light_index, \n"
2327 " vec3 halfview, vec3 co, vec3 normal )\n"
2328 "{\n"
2329 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
2330 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
2331 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
2332 "\n"
2333 " vec3 light_delta = light_co.xyz-co;\n"
2334 " float dist2 = dot(light_delta,light_delta);\n"
2335 "\n"
2336 " light_delta = normalize( light_delta );\n"
2337 "\n"
2338 " float quadratic = dist2*100.0;\n"
2339 " float attenuation = 1.0/( 1.0 + quadratic );\n"
2340 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
2341 "\n"
2342 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
2343 "\n"
2344 " if( light_dir.w < 0.999999 ){\n"
2345 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
2346 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
2347 " }\n"
2348 "\n"
2349 " return light_colour.rgb * attenuation * falloff \n"
2350 " * step( g_day_phase, light_colour.w );\n"
2351 "}\n"
2352 "\n"
2353 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
2354 " vec3 halfview, vec3 co, vec3 normal )\n"
2355 "{\n"
2356 " uint light_count = packed_index & 0x3u;\n"
2357 "\n"
2358 " vec3 l = vec3(0.0);\n"
2359 "\n"
2360 " if( light_count >= 1u ){\n"
2361 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
2362 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
2363 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
2364 "\n"
2365 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
2366 "\n"
2367 " if( light_count >= 2u ){\n"
2368 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
2369 "\n"
2370 " if( light_count >= 3u ){\n"
2371 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
2372 " }\n"
2373 " }\n"
2374 " }\n"
2375 "\n"
2376 " return l;\n"
2377 "}\n"
2378 "\n"
2379 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
2380 " float light_mask )\n"
2381 "{\n"
2382 " if( g_light_preview == 1 )\n"
2383 " diffuse = vec3(0.75);\n"
2384 "\n"
2385 " // Lighting\n"
2386 " vec3 halfview = uCamera - co;\n"
2387 " float fdist = length(halfview);\n"
2388 " halfview /= fdist;\n"
2389 "\n"
2390 " float world_shadow = newlight_compute_sun_shadow( \n"
2391 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
2392 "\n"
2393 " vec3 total_light = clearskies_lighting( \n"
2394 " normal, min( light_mask, world_shadow ), halfview );\n"
2395 "\n"
2396 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
2397 " cube_coord = floor( cube_coord );\n"
2398 "\n"
2399 " if( g_debug_indices == 1 )\n"
2400 " {\n"
2401 " return rand33(cube_coord);\n"
2402 " }\n"
2403 "\n"
2404 " if( g_debug_complexity == 1 )\n"
2405 " {\n"
2406 " ivec3 coord = ivec3( cube_coord );\n"
2407 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
2408 "\n"
2409 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
2410 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
2411 " }\n"
2412 "\n"
2413 " // FIXME: this coord should absolutely must be clamped!\n"
2414 " \n"
2415 " ivec3 coord = ivec3( cube_coord );\n"
2416 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
2417 "\n"
2418 " total_light += \n"
2419 " scene_calculate_packed_light_patch( index_sample.x,\n"
2420 " halfview, co, normal ) \n"
2421 " * light_mask;\n"
2422 " total_light += \n"
2423 " scene_calculate_packed_light_patch( index_sample.y,\n"
2424 " halfview, co, normal )\n"
2425 " * light_mask;\n"
2426 "\n"
2427 " // Take a section of the sky function to give us a matching fog colour\n"
2428 "\n"
2429 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
2430 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
2431 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
2432 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
2433 " \n"
2434 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
2435 " sun_colour *= sun_shape;\n"
2436 "\n"
2437 " fog_colour += sun_colour;\n"
2438 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
2439 "}\n"
2440 "\n"
2441 "#line 9 0 \n"
2442 "\n"
2443 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
2444 "{\n"
2445 " vec3 pa = p - a;\n"
2446 " vec3 ba = b - a;\n"
2447 "\n"
2448 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
2449 " return length( pa - ba*h );\n"
2450 "}\n"
2451 "\n"
2452 "float compute_board_shadow()\n"
2453 "{\n"
2454 " // player shadow\n"
2455 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
2456 " g_board_1.xyz )-0.1 );\n"
2457 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
2458 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
2459 "\n"
2460 " return 1.0 - player_shadow*0.8;\n"
2461 "}\n"
2462 "\n"
2463 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
2464 "{\n"
2465 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
2466 "}\n"
2467 "\n"
2468 "#line 6 0 \n"
2469 "#line 1 3 \n"
2470 "const float k_motion_lerp_amount = 0.01;\n"
2471 "\n"
2472 "#line 2 0 \n"
2473 "\n"
2474 "layout (location = 1) out vec2 oMotionVec;\n"
2475 "\n"
2476 "in vec3 aMotionVec0;\n"
2477 "in vec3 aMotionVec1;\n"
2478 "\n"
2479 "void compute_motion_vectors()\n"
2480 "{\n"
2481 " // Write motion vectors\n"
2482 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
2483 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
2484 "\n"
2485 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
2486 "}\n"
2487 "\n"
2488 "#line 7 0 \n"
2489 "\n"
2490 "void main(){\n"
2491 " oMotionVec = vec2(0.0);\n"
2492 "\n"
2493 " vec4 vsamplemain = texture( uTexMain, aUv );\n"
2494 "\n"
2495 " vec2 ssuv = gl_FragCoord.xy;\n"
2496 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
2497 " float dither = fract( vDither.g / 71.0 ) - 0.5;\n"
2498 "\n"
2499 " if( vsamplemain.a+dither<0.5 )\n"
2500 " discard;\n"
2501 "\n"
2502 " oColour = vec4( vsamplemain.rgb, 1.0 );\n"
2503 "}\n"
2504 ""},
2505 };
2506
2507 GLuint _uniform_scene_fxglow_uMdl;
2508 GLuint _uniform_scene_fxglow_uPv;
2509 GLuint _uniform_scene_fxglow_uPvmPrev;
2510 GLuint _uniform_scene_fxglow_uUvOffset;
2511 GLuint _uniform_scene_fxglow_uTexMain;
2512 GLuint _uniform_scene_fxglow_uCamera;
2513 GLuint _uniform_scene_fxglow_g_world_depth;
2514 GLuint _uniform_scene_fxglow_uLightsArray;
2515 GLuint _uniform_scene_fxglow_uLightsIndex;
2516 #include "shaders/scene_vertex_blend.h"
2517 struct vg_shader _shader_scene_vertex_blend = {
2518 .name = "scene_vertex_blend",
2519 .vs =
2520 {
2521 .orig_file = "shaders/scene.vs",
2522 .static_src =
2523 "layout (location=0) in vec3 a_co;\n"
2524 "layout (location=1) in vec4 a_norm;\n"
2525 "layout (location=2) in vec2 a_uv;\n"
2526 "\n"
2527 "#line 1 1 \n"
2528 "const float k_motion_lerp_amount = 0.01;\n"
2529 "\n"
2530 "#line 2 0 \n"
2531 "\n"
2532 "out vec3 aMotionVec0;\n"
2533 "out vec3 aMotionVec1;\n"
2534 "\n"
2535 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
2536 "{\n"
2537 " // This magically solves some artifacting errors!\n"
2538 " //\n"
2539 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
2540 "\n"
2541 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
2542 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
2543 "}\n"
2544 "\n"
2545 "#line 6 0 \n"
2546 "\n"
2547 "uniform mat4x3 uMdl;\n"
2548 "uniform mat4 uPv;\n"
2549 "uniform mat4 uPvmPrev;\n"
2550 "\n"
2551 "out vec2 aUv;\n"
2552 "out vec4 aNorm;\n"
2553 "out vec3 aCo;\n"
2554 "out vec3 aWorldCo;\n"
2555 "\n"
2556 "void main()\n"
2557 "{\n"
2558 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
2559 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
2560 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
2561 "\n"
2562 " vs_motion_out( vproj0, vproj1 );\n"
2563 "\n"
2564 " gl_Position = vproj0;\n"
2565 "\n"
2566 " aUv = a_uv;\n"
2567 " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n"
2568 " aCo = a_co;\n"
2569 " aWorldCo = world_pos0;\n"
2570 "}\n"
2571 ""},
2572 .fs =
2573 {
2574 .orig_file = "shaders/scene_vertex_blend.fs",
2575 .static_src =
2576 "uniform sampler2D uTexGarbage;\n"
2577 "uniform sampler2D uTexGradients;\n"
2578 "uniform vec3 uCamera;\n"
2579 "\n"
2580 "#line 1 1 \n"
2581 "// :D\n"
2582 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
2583 "\n"
2584 "#line 6 0 \n"
2585 "#line 1 2 \n"
2586 "// :D\n"
2587 "\n"
2588 "in vec2 aUv;\n"
2589 "in vec4 aNorm;\n"
2590 "in vec3 aCo;\n"
2591 "in vec3 aWorldCo;\n"
2592 "\n"
2593 "#line 1 1 \n"
2594 "layout (location = 0) out vec4 oColour;\n"
2595 "\n"
2596 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
2597 "layout (std140) uniform ub_world_lighting\n"
2598 "{\n"
2599 " vec4 g_cube_min;\n"
2600 " vec4 g_cube_inv_range;\n"
2601 "\n"
2602 " vec4 g_water_plane;\n"
2603 " vec4 g_depth_bounds;\n"
2604 "\n"
2605 " vec4 g_daysky_colour;\n"
2606 " vec4 g_nightsky_colour;\n"
2607 " vec4 g_sunset_colour;\n"
2608 " vec4 g_ambient_colour;\n"
2609 " vec4 g_sunset_ambient;\n"
2610 " vec4 g_sun_colour;\n"
2611 " vec4 g_sun_dir;\n"
2612 " vec4 g_board_0;\n"
2613 " vec4 g_board_1;\n"
2614 "\n"
2615 " float g_water_fog;\n"
2616 " float g_time;\n"
2617 " float g_realtime;\n"
2618 " float g_shadow_length;\n"
2619 " float g_shadow_spread;\n"
2620 "\n"
2621 " float g_time_of_day;\n"
2622 " float g_day_phase;\n"
2623 " float g_sunset_phase;\n"
2624 "\n"
2625 " int g_light_preview;\n"
2626 " int g_shadow_samples;\n"
2627 "\n"
2628 " int g_debug_indices;\n"
2629 " int g_debug_complexity;\n"
2630 "};\n"
2631 "\n"
2632 "uniform sampler2D g_world_depth;\n"
2633 "uniform samplerBuffer uLightsArray;\n"
2634 "uniform usampler3D uLightsIndex;\n"
2635 "\n"
2636 "#line 1 1 \n"
2637 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
2638 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
2639 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
2640 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
2641 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
2642 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
2643 "\n"
2644 "const float SUN_ANGLE = 0.0001;\n"
2645 "const float PI = 3.14159265358979323846264;\n"
2646 "\n"
2647 "//struct world_info\n"
2648 "//{\n"
2649 "// float time,\n"
2650 "// time_of_day,\n"
2651 "// day_phase,\n"
2652 "// sunset_phase;\n"
2653 "// \n"
2654 "// vec3 sun_dir;\n"
2655 "//};\n"
2656 "\n"
2657 "vec3 rand33(vec3 p3)\n"
2658 "{\n"
2659 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
2660 " p3 += dot(p3, p3.yxz+33.33);\n"
2661 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
2662 "}\n"
2663 "\n"
2664 "float stars( vec3 rd, float rr, float size ){\n"
2665 " vec3 co = rd * rr;\n"
2666 "\n"
2667 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
2668 "\n"
2669 " float spaces = 1.0 / rr;\n"
2670 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
2671 " a -= mod(a, spaces) - spaces * 0.5;\n"
2672 "\n"
2673 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
2674 " \n"
2675 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
2676 " plane = plane - mod(plane, PI / count);\n"
2677 "\n"
2678 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
2679 "\n"
2680 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
2681 " float ydist = sqrt(rr * rr - level * level);\n"
2682 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
2683 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
2684 " float star = smoothstep(size, 0.0, distance(center, co));\n"
2685 " return star;\n"
2686 "}\n"
2687 "\n"
2688 "float luminance( vec3 v )\n"
2689 "{\n"
2690 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
2691 "}\n"
2692 "\n"
2693 "vec3 clearskies_ambient( vec3 dir )\n"
2694 "{\n"
2695 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
2696 " float sky_gradient = dir.y;\n"
2697 " \n"
2698 " /* Blend phase colours */\n"
2699 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
2700 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
2701 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
2702 " \n"
2703 " /* Add gradient */\n"
2704 " ambient -= sky_gradient * luminance(ambient);\n"
2705 " \n"
2706 " return ambient;\n"
2707 "}\n"
2708 "\n"
2709 "vec3 clearskies_sky( vec3 ray_dir )\n"
2710 "{\n"
2711 " ray_dir.y = abs( ray_dir.y );\n"
2712 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
2713 " \n"
2714 " /* Sun */\n"
2715 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
2716 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
2717 " float sun_shape = pow( sun_size, 2000.0 );\n"
2718 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
2719 " \n"
2720 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
2721 " sun_colour *= sun_shape;\n"
2722 "\n"
2723 " \n"
2724 " float star = 0.0;\n"
2725 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
2726 "\n"
2727 " if( star_blend > 0.001 ){\n"
2728 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
2729 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
2730 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
2731 " }\n"
2732 " }\n"
2733 " \n"
2734 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
2735 " return composite;\n"
2736 "}\n"
2737 "\n"
2738 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
2739 "{\n"
2740 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
2741 "\n"
2742 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
2743 " g_sunset_phase );\n"
2744 "\n"
2745 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
2746 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
2747 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
2748 " ) * g_sun_colour.rgb * g_day_phase;\n"
2749 "\n"
2750 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
2751 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
2752 " g_sunset_phase );\n"
2753 "\n"
2754 " return ambient + (light_sun + sky_reflection) * shadow;\n"
2755 "}\n"
2756 "\n"
2757 "#line 44 0 \n"
2758 "\n"
2759 "float world_depth_sample( vec3 pos )\n"
2760 "{\n"
2761 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
2762 " return texture( g_world_depth, depth_coord ).r;\n"
2763 "}\n"
2764 "\n"
2765 "float world_water_depth( vec3 pos )\n"
2766 "{\n"
2767 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
2768 " return world_depth_sample( pos ) - ref_depth;\n"
2769 "}\n"
2770 "\n"
2771 "float shadow_sample( vec3 co ){\n"
2772 " float height_sample = world_depth_sample( co );\n"
2773 "\n"
2774 " float fdelta = height_sample - co.y;\n"
2775 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
2776 "}\n"
2777 "\n"
2778 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
2779 " if( g_shadow_samples == 0 ){\n"
2780 " return 1.0;\n"
2781 " }\n"
2782 "\n"
2783 " float fspread = g_shadow_spread;\n"
2784 " float flength = g_shadow_length;\n"
2785 "\n"
2786 " float famt = 0.0;\n"
2787 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
2788 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
2789 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
2790 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
2791 "\n"
2792 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
2793 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
2794 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
2795 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
2796 "\n"
2797 " return 1.0 - famt;\n"
2798 "}\n"
2799 "\n"
2800 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
2801 "{\n"
2802 " vec3 specdir = reflect( -dir, wnormal );\n"
2803 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
2804 "}\n"
2805 "\n"
2806 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
2807 " float dist = pow(fdist*0.0010,0.78);\n"
2808 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
2809 "}\n"
2810 "\n"
2811 "vec3 scene_calculate_light( int light_index, \n"
2812 " vec3 halfview, vec3 co, vec3 normal )\n"
2813 "{\n"
2814 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
2815 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
2816 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
2817 "\n"
2818 " vec3 light_delta = light_co.xyz-co;\n"
2819 " float dist2 = dot(light_delta,light_delta);\n"
2820 "\n"
2821 " light_delta = normalize( light_delta );\n"
2822 "\n"
2823 " float quadratic = dist2*100.0;\n"
2824 " float attenuation = 1.0/( 1.0 + quadratic );\n"
2825 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
2826 "\n"
2827 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
2828 "\n"
2829 " if( light_dir.w < 0.999999 ){\n"
2830 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
2831 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
2832 " }\n"
2833 "\n"
2834 " return light_colour.rgb * attenuation * falloff \n"
2835 " * step( g_day_phase, light_colour.w );\n"
2836 "}\n"
2837 "\n"
2838 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
2839 " vec3 halfview, vec3 co, vec3 normal )\n"
2840 "{\n"
2841 " uint light_count = packed_index & 0x3u;\n"
2842 "\n"
2843 " vec3 l = vec3(0.0);\n"
2844 "\n"
2845 " if( light_count >= 1u ){\n"
2846 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
2847 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
2848 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
2849 "\n"
2850 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
2851 "\n"
2852 " if( light_count >= 2u ){\n"
2853 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
2854 "\n"
2855 " if( light_count >= 3u ){\n"
2856 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
2857 " }\n"
2858 " }\n"
2859 " }\n"
2860 "\n"
2861 " return l;\n"
2862 "}\n"
2863 "\n"
2864 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
2865 " float light_mask )\n"
2866 "{\n"
2867 " if( g_light_preview == 1 )\n"
2868 " diffuse = vec3(0.75);\n"
2869 "\n"
2870 " // Lighting\n"
2871 " vec3 halfview = uCamera - co;\n"
2872 " float fdist = length(halfview);\n"
2873 " halfview /= fdist;\n"
2874 "\n"
2875 " float world_shadow = newlight_compute_sun_shadow( \n"
2876 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
2877 "\n"
2878 " vec3 total_light = clearskies_lighting( \n"
2879 " normal, min( light_mask, world_shadow ), halfview );\n"
2880 "\n"
2881 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
2882 " cube_coord = floor( cube_coord );\n"
2883 "\n"
2884 " if( g_debug_indices == 1 )\n"
2885 " {\n"
2886 " return rand33(cube_coord);\n"
2887 " }\n"
2888 "\n"
2889 " if( g_debug_complexity == 1 )\n"
2890 " {\n"
2891 " ivec3 coord = ivec3( cube_coord );\n"
2892 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
2893 "\n"
2894 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
2895 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
2896 " }\n"
2897 "\n"
2898 " // FIXME: this coord should absolutely must be clamped!\n"
2899 " \n"
2900 " ivec3 coord = ivec3( cube_coord );\n"
2901 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
2902 "\n"
2903 " total_light += \n"
2904 " scene_calculate_packed_light_patch( index_sample.x,\n"
2905 " halfview, co, normal ) \n"
2906 " * light_mask;\n"
2907 " total_light += \n"
2908 " scene_calculate_packed_light_patch( index_sample.y,\n"
2909 " halfview, co, normal )\n"
2910 " * light_mask;\n"
2911 "\n"
2912 " // Take a section of the sky function to give us a matching fog colour\n"
2913 "\n"
2914 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
2915 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
2916 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
2917 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
2918 " \n"
2919 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
2920 " sun_colour *= sun_shape;\n"
2921 "\n"
2922 " fog_colour += sun_colour;\n"
2923 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
2924 "}\n"
2925 "\n"
2926 "#line 9 0 \n"
2927 "\n"
2928 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
2929 "{\n"
2930 " vec3 pa = p - a;\n"
2931 " vec3 ba = b - a;\n"
2932 "\n"
2933 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
2934 " return length( pa - ba*h );\n"
2935 "}\n"
2936 "\n"
2937 "float compute_board_shadow()\n"
2938 "{\n"
2939 " // player shadow\n"
2940 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
2941 " g_board_1.xyz )-0.1 );\n"
2942 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
2943 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
2944 "\n"
2945 " return 1.0 - player_shadow*0.8;\n"
2946 "}\n"
2947 "\n"
2948 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
2949 "{\n"
2950 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
2951 "}\n"
2952 "\n"
2953 "#line 7 0 \n"
2954 "#line 1 3 \n"
2955 "const float k_motion_lerp_amount = 0.01;\n"
2956 "\n"
2957 "#line 2 0 \n"
2958 "\n"
2959 "layout (location = 1) out vec2 oMotionVec;\n"
2960 "\n"
2961 "in vec3 aMotionVec0;\n"
2962 "in vec3 aMotionVec1;\n"
2963 "\n"
2964 "void compute_motion_vectors()\n"
2965 "{\n"
2966 " // Write motion vectors\n"
2967 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
2968 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
2969 "\n"
2970 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
2971 "}\n"
2972 "\n"
2973 "#line 8 0 \n"
2974 "\n"
2975 "void main()\n"
2976 "{\n"
2977 " compute_motion_vectors();\n"
2978 "\n"
2979 " vec3 vfrag = vec3(0.5,0.5,0.5);\n"
2980 "\n"
2981 " // ws modulation\n"
2982 " vec4 wgarbage = vec4(0.5,0.5,0.5,1.0);\n"
2983 " \n"
2984 " // Creating normal patches\n"
2985 " vec3 modnorm = (wgarbage.rgb-0.4) * 1.4;\n"
2986 " vec3 qnorm = normalize(floor(aNorm.xyz*4.0+modnorm)*0.25);\n"
2987 " qnorm += vec3(0.001,0.0,0.0);\n"
2988 "\n"
2989 " vec3 tangent0 = normalize(cross(qnorm,vec3(0.0,1.0,0.0)));\n"
2990 " vec3 tangent1 = cross(qnorm,tangent0);\n"
2991 " vec2 uvdiffuse = vec2( dot(tangent0,aCo), dot(tangent1,aCo) ) * 0.160;\n"
2992 " \n"
2993 " // Patch local noise\n"
2994 " vec4 rgarbage = texture( uTexGarbage, uvdiffuse );\n"
2995 "\n"
2996 " // Colour blending\n"
2997 " float fblendclip = step(0.380,aNorm.w + (rgarbage.r-0.5)*-1.740)*0.320;\n"
2998 " vec2 uvgradients = aUv + vec2( fblendclip, 0.0 );\n"
2999 "\n"
3000 " vfrag = texture( uTexGradients, uvgradients ).rgb;\n"
3001 " vfrag -= rgarbage.a*0.04;\n"
3002 "\n"
3003 " if( g_light_preview == 1 )\n"
3004 " {\n"
3005 " vfrag = vec3(0.5);\n"
3006 " }\n"
3007 "\n"
3008 " vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n"
3009 " oColour = vec4(vfrag, 1.0);\n"
3010 "}\n"
3011 ""},
3012 };
3013
3014 GLuint _uniform_scene_vertex_blend_uMdl;
3015 GLuint _uniform_scene_vertex_blend_uPv;
3016 GLuint _uniform_scene_vertex_blend_uPvmPrev;
3017 GLuint _uniform_scene_vertex_blend_uTexGarbage;
3018 GLuint _uniform_scene_vertex_blend_uTexGradients;
3019 GLuint _uniform_scene_vertex_blend_uCamera;
3020 GLuint _uniform_scene_vertex_blend_g_world_depth;
3021 GLuint _uniform_scene_vertex_blend_uLightsArray;
3022 GLuint _uniform_scene_vertex_blend_uLightsIndex;
3023 #include "shaders/scene_terrain.h"
3024 struct vg_shader _shader_scene_terrain = {
3025 .name = "scene_terrain",
3026 .vs =
3027 {
3028 .orig_file = "shaders/scene.vs",
3029 .static_src =
3030 "layout (location=0) in vec3 a_co;\n"
3031 "layout (location=1) in vec4 a_norm;\n"
3032 "layout (location=2) in vec2 a_uv;\n"
3033 "\n"
3034 "#line 1 1 \n"
3035 "const float k_motion_lerp_amount = 0.01;\n"
3036 "\n"
3037 "#line 2 0 \n"
3038 "\n"
3039 "out vec3 aMotionVec0;\n"
3040 "out vec3 aMotionVec1;\n"
3041 "\n"
3042 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
3043 "{\n"
3044 " // This magically solves some artifacting errors!\n"
3045 " //\n"
3046 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
3047 "\n"
3048 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
3049 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
3050 "}\n"
3051 "\n"
3052 "#line 6 0 \n"
3053 "\n"
3054 "uniform mat4x3 uMdl;\n"
3055 "uniform mat4 uPv;\n"
3056 "uniform mat4 uPvmPrev;\n"
3057 "\n"
3058 "out vec2 aUv;\n"
3059 "out vec4 aNorm;\n"
3060 "out vec3 aCo;\n"
3061 "out vec3 aWorldCo;\n"
3062 "\n"
3063 "void main()\n"
3064 "{\n"
3065 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
3066 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
3067 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
3068 "\n"
3069 " vs_motion_out( vproj0, vproj1 );\n"
3070 "\n"
3071 " gl_Position = vproj0;\n"
3072 "\n"
3073 " aUv = a_uv;\n"
3074 " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n"
3075 " aCo = a_co;\n"
3076 " aWorldCo = world_pos0;\n"
3077 "}\n"
3078 ""},
3079 .fs =
3080 {
3081 .orig_file = "shaders/scene_terrain.fs",
3082 .static_src =
3083 "uniform sampler2D uTexGarbage;\n"
3084 "uniform sampler2D uTexGradients;\n"
3085 "uniform vec3 uCamera;\n"
3086 "uniform vec3 uSandColour;\n"
3087 "uniform vec2 uBlendOffset;\n"
3088 "\n"
3089 "#line 1 1 \n"
3090 "// :D\n"
3091 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
3092 "\n"
3093 "#line 8 0 \n"
3094 "#line 1 2 \n"
3095 "// :D\n"
3096 "\n"
3097 "in vec2 aUv;\n"
3098 "in vec4 aNorm;\n"
3099 "in vec3 aCo;\n"
3100 "in vec3 aWorldCo;\n"
3101 "\n"
3102 "#line 1 1 \n"
3103 "layout (location = 0) out vec4 oColour;\n"
3104 "\n"
3105 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
3106 "layout (std140) uniform ub_world_lighting\n"
3107 "{\n"
3108 " vec4 g_cube_min;\n"
3109 " vec4 g_cube_inv_range;\n"
3110 "\n"
3111 " vec4 g_water_plane;\n"
3112 " vec4 g_depth_bounds;\n"
3113 "\n"
3114 " vec4 g_daysky_colour;\n"
3115 " vec4 g_nightsky_colour;\n"
3116 " vec4 g_sunset_colour;\n"
3117 " vec4 g_ambient_colour;\n"
3118 " vec4 g_sunset_ambient;\n"
3119 " vec4 g_sun_colour;\n"
3120 " vec4 g_sun_dir;\n"
3121 " vec4 g_board_0;\n"
3122 " vec4 g_board_1;\n"
3123 "\n"
3124 " float g_water_fog;\n"
3125 " float g_time;\n"
3126 " float g_realtime;\n"
3127 " float g_shadow_length;\n"
3128 " float g_shadow_spread;\n"
3129 "\n"
3130 " float g_time_of_day;\n"
3131 " float g_day_phase;\n"
3132 " float g_sunset_phase;\n"
3133 "\n"
3134 " int g_light_preview;\n"
3135 " int g_shadow_samples;\n"
3136 "\n"
3137 " int g_debug_indices;\n"
3138 " int g_debug_complexity;\n"
3139 "};\n"
3140 "\n"
3141 "uniform sampler2D g_world_depth;\n"
3142 "uniform samplerBuffer uLightsArray;\n"
3143 "uniform usampler3D uLightsIndex;\n"
3144 "\n"
3145 "#line 1 1 \n"
3146 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
3147 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
3148 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
3149 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
3150 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
3151 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
3152 "\n"
3153 "const float SUN_ANGLE = 0.0001;\n"
3154 "const float PI = 3.14159265358979323846264;\n"
3155 "\n"
3156 "//struct world_info\n"
3157 "//{\n"
3158 "// float time,\n"
3159 "// time_of_day,\n"
3160 "// day_phase,\n"
3161 "// sunset_phase;\n"
3162 "// \n"
3163 "// vec3 sun_dir;\n"
3164 "//};\n"
3165 "\n"
3166 "vec3 rand33(vec3 p3)\n"
3167 "{\n"
3168 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
3169 " p3 += dot(p3, p3.yxz+33.33);\n"
3170 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
3171 "}\n"
3172 "\n"
3173 "float stars( vec3 rd, float rr, float size ){\n"
3174 " vec3 co = rd * rr;\n"
3175 "\n"
3176 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
3177 "\n"
3178 " float spaces = 1.0 / rr;\n"
3179 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
3180 " a -= mod(a, spaces) - spaces * 0.5;\n"
3181 "\n"
3182 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
3183 " \n"
3184 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
3185 " plane = plane - mod(plane, PI / count);\n"
3186 "\n"
3187 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
3188 "\n"
3189 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
3190 " float ydist = sqrt(rr * rr - level * level);\n"
3191 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
3192 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
3193 " float star = smoothstep(size, 0.0, distance(center, co));\n"
3194 " return star;\n"
3195 "}\n"
3196 "\n"
3197 "float luminance( vec3 v )\n"
3198 "{\n"
3199 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
3200 "}\n"
3201 "\n"
3202 "vec3 clearskies_ambient( vec3 dir )\n"
3203 "{\n"
3204 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
3205 " float sky_gradient = dir.y;\n"
3206 " \n"
3207 " /* Blend phase colours */\n"
3208 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
3209 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
3210 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
3211 " \n"
3212 " /* Add gradient */\n"
3213 " ambient -= sky_gradient * luminance(ambient);\n"
3214 " \n"
3215 " return ambient;\n"
3216 "}\n"
3217 "\n"
3218 "vec3 clearskies_sky( vec3 ray_dir )\n"
3219 "{\n"
3220 " ray_dir.y = abs( ray_dir.y );\n"
3221 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
3222 " \n"
3223 " /* Sun */\n"
3224 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
3225 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
3226 " float sun_shape = pow( sun_size, 2000.0 );\n"
3227 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
3228 " \n"
3229 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
3230 " sun_colour *= sun_shape;\n"
3231 "\n"
3232 " \n"
3233 " float star = 0.0;\n"
3234 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
3235 "\n"
3236 " if( star_blend > 0.001 ){\n"
3237 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
3238 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
3239 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
3240 " }\n"
3241 " }\n"
3242 " \n"
3243 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
3244 " return composite;\n"
3245 "}\n"
3246 "\n"
3247 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
3248 "{\n"
3249 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
3250 "\n"
3251 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
3252 " g_sunset_phase );\n"
3253 "\n"
3254 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
3255 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
3256 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
3257 " ) * g_sun_colour.rgb * g_day_phase;\n"
3258 "\n"
3259 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
3260 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
3261 " g_sunset_phase );\n"
3262 "\n"
3263 " return ambient + (light_sun + sky_reflection) * shadow;\n"
3264 "}\n"
3265 "\n"
3266 "#line 44 0 \n"
3267 "\n"
3268 "float world_depth_sample( vec3 pos )\n"
3269 "{\n"
3270 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
3271 " return texture( g_world_depth, depth_coord ).r;\n"
3272 "}\n"
3273 "\n"
3274 "float world_water_depth( vec3 pos )\n"
3275 "{\n"
3276 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
3277 " return world_depth_sample( pos ) - ref_depth;\n"
3278 "}\n"
3279 "\n"
3280 "float shadow_sample( vec3 co ){\n"
3281 " float height_sample = world_depth_sample( co );\n"
3282 "\n"
3283 " float fdelta = height_sample - co.y;\n"
3284 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
3285 "}\n"
3286 "\n"
3287 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
3288 " if( g_shadow_samples == 0 ){\n"
3289 " return 1.0;\n"
3290 " }\n"
3291 "\n"
3292 " float fspread = g_shadow_spread;\n"
3293 " float flength = g_shadow_length;\n"
3294 "\n"
3295 " float famt = 0.0;\n"
3296 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
3297 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
3298 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
3299 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
3300 "\n"
3301 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
3302 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
3303 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
3304 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
3305 "\n"
3306 " return 1.0 - famt;\n"
3307 "}\n"
3308 "\n"
3309 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
3310 "{\n"
3311 " vec3 specdir = reflect( -dir, wnormal );\n"
3312 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
3313 "}\n"
3314 "\n"
3315 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
3316 " float dist = pow(fdist*0.0010,0.78);\n"
3317 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
3318 "}\n"
3319 "\n"
3320 "vec3 scene_calculate_light( int light_index, \n"
3321 " vec3 halfview, vec3 co, vec3 normal )\n"
3322 "{\n"
3323 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
3324 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
3325 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
3326 "\n"
3327 " vec3 light_delta = light_co.xyz-co;\n"
3328 " float dist2 = dot(light_delta,light_delta);\n"
3329 "\n"
3330 " light_delta = normalize( light_delta );\n"
3331 "\n"
3332 " float quadratic = dist2*100.0;\n"
3333 " float attenuation = 1.0/( 1.0 + quadratic );\n"
3334 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
3335 "\n"
3336 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
3337 "\n"
3338 " if( light_dir.w < 0.999999 ){\n"
3339 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
3340 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
3341 " }\n"
3342 "\n"
3343 " return light_colour.rgb * attenuation * falloff \n"
3344 " * step( g_day_phase, light_colour.w );\n"
3345 "}\n"
3346 "\n"
3347 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
3348 " vec3 halfview, vec3 co, vec3 normal )\n"
3349 "{\n"
3350 " uint light_count = packed_index & 0x3u;\n"
3351 "\n"
3352 " vec3 l = vec3(0.0);\n"
3353 "\n"
3354 " if( light_count >= 1u ){\n"
3355 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
3356 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
3357 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
3358 "\n"
3359 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
3360 "\n"
3361 " if( light_count >= 2u ){\n"
3362 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
3363 "\n"
3364 " if( light_count >= 3u ){\n"
3365 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
3366 " }\n"
3367 " }\n"
3368 " }\n"
3369 "\n"
3370 " return l;\n"
3371 "}\n"
3372 "\n"
3373 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
3374 " float light_mask )\n"
3375 "{\n"
3376 " if( g_light_preview == 1 )\n"
3377 " diffuse = vec3(0.75);\n"
3378 "\n"
3379 " // Lighting\n"
3380 " vec3 halfview = uCamera - co;\n"
3381 " float fdist = length(halfview);\n"
3382 " halfview /= fdist;\n"
3383 "\n"
3384 " float world_shadow = newlight_compute_sun_shadow( \n"
3385 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
3386 "\n"
3387 " vec3 total_light = clearskies_lighting( \n"
3388 " normal, min( light_mask, world_shadow ), halfview );\n"
3389 "\n"
3390 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
3391 " cube_coord = floor( cube_coord );\n"
3392 "\n"
3393 " if( g_debug_indices == 1 )\n"
3394 " {\n"
3395 " return rand33(cube_coord);\n"
3396 " }\n"
3397 "\n"
3398 " if( g_debug_complexity == 1 )\n"
3399 " {\n"
3400 " ivec3 coord = ivec3( cube_coord );\n"
3401 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
3402 "\n"
3403 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
3404 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
3405 " }\n"
3406 "\n"
3407 " // FIXME: this coord should absolutely must be clamped!\n"
3408 " \n"
3409 " ivec3 coord = ivec3( cube_coord );\n"
3410 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
3411 "\n"
3412 " total_light += \n"
3413 " scene_calculate_packed_light_patch( index_sample.x,\n"
3414 " halfview, co, normal ) \n"
3415 " * light_mask;\n"
3416 " total_light += \n"
3417 " scene_calculate_packed_light_patch( index_sample.y,\n"
3418 " halfview, co, normal )\n"
3419 " * light_mask;\n"
3420 "\n"
3421 " // Take a section of the sky function to give us a matching fog colour\n"
3422 "\n"
3423 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
3424 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
3425 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
3426 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
3427 " \n"
3428 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
3429 " sun_colour *= sun_shape;\n"
3430 "\n"
3431 " fog_colour += sun_colour;\n"
3432 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
3433 "}\n"
3434 "\n"
3435 "#line 9 0 \n"
3436 "\n"
3437 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
3438 "{\n"
3439 " vec3 pa = p - a;\n"
3440 " vec3 ba = b - a;\n"
3441 "\n"
3442 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
3443 " return length( pa - ba*h );\n"
3444 "}\n"
3445 "\n"
3446 "float compute_board_shadow()\n"
3447 "{\n"
3448 " // player shadow\n"
3449 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
3450 " g_board_1.xyz )-0.1 );\n"
3451 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
3452 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
3453 "\n"
3454 " return 1.0 - player_shadow*0.8;\n"
3455 "}\n"
3456 "\n"
3457 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
3458 "{\n"
3459 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
3460 "}\n"
3461 "\n"
3462 "#line 9 0 \n"
3463 "#line 1 3 \n"
3464 "const float k_motion_lerp_amount = 0.01;\n"
3465 "\n"
3466 "#line 2 0 \n"
3467 "\n"
3468 "layout (location = 1) out vec2 oMotionVec;\n"
3469 "\n"
3470 "in vec3 aMotionVec0;\n"
3471 "in vec3 aMotionVec1;\n"
3472 "\n"
3473 "void compute_motion_vectors()\n"
3474 "{\n"
3475 " // Write motion vectors\n"
3476 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
3477 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
3478 "\n"
3479 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
3480 "}\n"
3481 "\n"
3482 "#line 10 0 \n"
3483 "\n"
3484 "void main()\n"
3485 "{\n"
3486 " compute_motion_vectors();\n"
3487 "\n"
3488 " // Colour\n"
3489 " // ------\n"
3490 " vec3 vfrag = vec3(0.5,0.5,0.5);\n"
3491 "\n"
3492 " // ws modulation\n"
3493 " vec4 wgarbage = texture( uTexGarbage, aCo.xz * 0.015 );\n"
3494 " \n"
3495 " // Creating normal patches\n"
3496 " vec3 modnorm = (wgarbage.rgb-0.4) * 1.4;\n"
3497 " vec3 qnorm = normalize(floor(aNorm.xyz*4.0+modnorm)*0.25);\n"
3498 " qnorm += vec3(0.001,0.0,0.0);\n"
3499 "\n"
3500 " vec2 dir = normalize(qnorm.xz);\n"
3501 " vec2 uvdiffuse = aCo.xz * 0.02;\n"
3502 " uvdiffuse = mat2(dir.y, dir.x, -dir.x, dir.y) * uvdiffuse;\n"
3503 " \n"
3504 " // Patch local noise\n"
3505 " vec4 rgarbage = texture( uTexGarbage, uvdiffuse );\n"
3506 "\n"
3507 " // Colour blending\n"
3508 " float amtgrass = step(qnorm.y,0.6);\n"
3509 " float amtsand = min(max((aCo.y - 10.0) * -0.1,0.0)*qnorm.y,1.0);\n"
3510 " vec2 uvgradients = aUv + vec2( amtgrass + rgarbage.a*0.8 )*uBlendOffset;\n"
3511 " vfrag = texture( uTexGradients, uvgradients ).rgb;\n"
3512 " vfrag = mix( vfrag, uSandColour, amtsand );\n"
3513 "\n"
3514 " qnorm = mix( qnorm, aNorm.xyz, amtsand );\n"
3515 " \n"
3516 " if( g_light_preview == 1 )\n"
3517 " {\n"
3518 " vfrag = vec3(0.5);\n"
3519 " }\n"
3520 "\n"
3521 " vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n"
3522 " oColour = vec4(vfrag, 1.0);\n"
3523 "}\n"
3524 ""},
3525 };
3526
3527 GLuint _uniform_scene_terrain_uMdl;
3528 GLuint _uniform_scene_terrain_uPv;
3529 GLuint _uniform_scene_terrain_uPvmPrev;
3530 GLuint _uniform_scene_terrain_uTexGarbage;
3531 GLuint _uniform_scene_terrain_uTexGradients;
3532 GLuint _uniform_scene_terrain_uCamera;
3533 GLuint _uniform_scene_terrain_uSandColour;
3534 GLuint _uniform_scene_terrain_uBlendOffset;
3535 GLuint _uniform_scene_terrain_g_world_depth;
3536 GLuint _uniform_scene_terrain_uLightsArray;
3537 GLuint _uniform_scene_terrain_uLightsIndex;
3538 #include "shaders/scene_route.h"
3539 struct vg_shader _shader_scene_route = {
3540 .name = "scene_route",
3541 .vs =
3542 {
3543 .orig_file = "shaders/scene_override.vs",
3544 .static_src =
3545 "layout (location=0) in vec3 a_co;\n"
3546 "layout (location=1) in vec4 a_norm;\n"
3547 "layout (location=2) in vec2 a_uv;\n"
3548 "\n"
3549 "#line 1 1 \n"
3550 "const float k_motion_lerp_amount = 0.01;\n"
3551 "\n"
3552 "#line 2 0 \n"
3553 "\n"
3554 "out vec3 aMotionVec0;\n"
3555 "out vec3 aMotionVec1;\n"
3556 "\n"
3557 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
3558 "{\n"
3559 " // This magically solves some artifacting errors!\n"
3560 " //\n"
3561 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
3562 "\n"
3563 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
3564 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
3565 "}\n"
3566 "\n"
3567 "#line 6 0 \n"
3568 "\n"
3569 "uniform mat4x3 uMdl;\n"
3570 "uniform mat4 uPv;\n"
3571 "uniform mat4 uPvmPrev;\n"
3572 "uniform mat3 uNormalMtx;\n"
3573 "\n"
3574 "out vec2 aUv;\n"
3575 "out vec4 aNorm;\n"
3576 "out vec3 aCo;\n"
3577 "out vec3 aWorldCo;\n"
3578 "\n"
3579 "void main()\n"
3580 "{\n"
3581 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
3582 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
3583 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
3584 "\n"
3585 " vs_motion_out( vproj0, vproj1 );\n"
3586 "\n"
3587 " gl_Position = vproj0;\n"
3588 "\n"
3589 " aUv = a_uv;\n"
3590 " aNorm = vec4( uNormalMtx * a_norm.xyz, a_norm.w );\n"
3591 " aCo = a_co;\n"
3592 " aWorldCo = world_pos0;\n"
3593 "}\n"
3594 ""},
3595 .fs =
3596 {
3597 .orig_file = "shaders/scene_route.fs",
3598 .static_src =
3599 "uniform sampler2D uTexGarbage;\n"
3600 "uniform sampler2D uTexGradients;\n"
3601 "uniform vec3 uCamera;\n"
3602 "uniform vec4 uColour;\n"
3603 "\n"
3604 "#line 1 1 \n"
3605 "// :D\n"
3606 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
3607 "\n"
3608 "#line 7 0 \n"
3609 "#line 1 2 \n"
3610 "// :D\n"
3611 "\n"
3612 "in vec2 aUv;\n"
3613 "in vec4 aNorm;\n"
3614 "in vec3 aCo;\n"
3615 "in vec3 aWorldCo;\n"
3616 "\n"
3617 "#line 1 1 \n"
3618 "layout (location = 0) out vec4 oColour;\n"
3619 "\n"
3620 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
3621 "layout (std140) uniform ub_world_lighting\n"
3622 "{\n"
3623 " vec4 g_cube_min;\n"
3624 " vec4 g_cube_inv_range;\n"
3625 "\n"
3626 " vec4 g_water_plane;\n"
3627 " vec4 g_depth_bounds;\n"
3628 "\n"
3629 " vec4 g_daysky_colour;\n"
3630 " vec4 g_nightsky_colour;\n"
3631 " vec4 g_sunset_colour;\n"
3632 " vec4 g_ambient_colour;\n"
3633 " vec4 g_sunset_ambient;\n"
3634 " vec4 g_sun_colour;\n"
3635 " vec4 g_sun_dir;\n"
3636 " vec4 g_board_0;\n"
3637 " vec4 g_board_1;\n"
3638 "\n"
3639 " float g_water_fog;\n"
3640 " float g_time;\n"
3641 " float g_realtime;\n"
3642 " float g_shadow_length;\n"
3643 " float g_shadow_spread;\n"
3644 "\n"
3645 " float g_time_of_day;\n"
3646 " float g_day_phase;\n"
3647 " float g_sunset_phase;\n"
3648 "\n"
3649 " int g_light_preview;\n"
3650 " int g_shadow_samples;\n"
3651 "\n"
3652 " int g_debug_indices;\n"
3653 " int g_debug_complexity;\n"
3654 "};\n"
3655 "\n"
3656 "uniform sampler2D g_world_depth;\n"
3657 "uniform samplerBuffer uLightsArray;\n"
3658 "uniform usampler3D uLightsIndex;\n"
3659 "\n"
3660 "#line 1 1 \n"
3661 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
3662 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
3663 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
3664 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
3665 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
3666 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
3667 "\n"
3668 "const float SUN_ANGLE = 0.0001;\n"
3669 "const float PI = 3.14159265358979323846264;\n"
3670 "\n"
3671 "//struct world_info\n"
3672 "//{\n"
3673 "// float time,\n"
3674 "// time_of_day,\n"
3675 "// day_phase,\n"
3676 "// sunset_phase;\n"
3677 "// \n"
3678 "// vec3 sun_dir;\n"
3679 "//};\n"
3680 "\n"
3681 "vec3 rand33(vec3 p3)\n"
3682 "{\n"
3683 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
3684 " p3 += dot(p3, p3.yxz+33.33);\n"
3685 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
3686 "}\n"
3687 "\n"
3688 "float stars( vec3 rd, float rr, float size ){\n"
3689 " vec3 co = rd * rr;\n"
3690 "\n"
3691 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
3692 "\n"
3693 " float spaces = 1.0 / rr;\n"
3694 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
3695 " a -= mod(a, spaces) - spaces * 0.5;\n"
3696 "\n"
3697 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
3698 " \n"
3699 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
3700 " plane = plane - mod(plane, PI / count);\n"
3701 "\n"
3702 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
3703 "\n"
3704 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
3705 " float ydist = sqrt(rr * rr - level * level);\n"
3706 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
3707 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
3708 " float star = smoothstep(size, 0.0, distance(center, co));\n"
3709 " return star;\n"
3710 "}\n"
3711 "\n"
3712 "float luminance( vec3 v )\n"
3713 "{\n"
3714 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
3715 "}\n"
3716 "\n"
3717 "vec3 clearskies_ambient( vec3 dir )\n"
3718 "{\n"
3719 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
3720 " float sky_gradient = dir.y;\n"
3721 " \n"
3722 " /* Blend phase colours */\n"
3723 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
3724 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
3725 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
3726 " \n"
3727 " /* Add gradient */\n"
3728 " ambient -= sky_gradient * luminance(ambient);\n"
3729 " \n"
3730 " return ambient;\n"
3731 "}\n"
3732 "\n"
3733 "vec3 clearskies_sky( vec3 ray_dir )\n"
3734 "{\n"
3735 " ray_dir.y = abs( ray_dir.y );\n"
3736 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
3737 " \n"
3738 " /* Sun */\n"
3739 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
3740 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
3741 " float sun_shape = pow( sun_size, 2000.0 );\n"
3742 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
3743 " \n"
3744 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
3745 " sun_colour *= sun_shape;\n"
3746 "\n"
3747 " \n"
3748 " float star = 0.0;\n"
3749 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
3750 "\n"
3751 " if( star_blend > 0.001 ){\n"
3752 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
3753 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
3754 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
3755 " }\n"
3756 " }\n"
3757 " \n"
3758 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
3759 " return composite;\n"
3760 "}\n"
3761 "\n"
3762 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
3763 "{\n"
3764 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
3765 "\n"
3766 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
3767 " g_sunset_phase );\n"
3768 "\n"
3769 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
3770 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
3771 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
3772 " ) * g_sun_colour.rgb * g_day_phase;\n"
3773 "\n"
3774 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
3775 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
3776 " g_sunset_phase );\n"
3777 "\n"
3778 " return ambient + (light_sun + sky_reflection) * shadow;\n"
3779 "}\n"
3780 "\n"
3781 "#line 44 0 \n"
3782 "\n"
3783 "float world_depth_sample( vec3 pos )\n"
3784 "{\n"
3785 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
3786 " return texture( g_world_depth, depth_coord ).r;\n"
3787 "}\n"
3788 "\n"
3789 "float world_water_depth( vec3 pos )\n"
3790 "{\n"
3791 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
3792 " return world_depth_sample( pos ) - ref_depth;\n"
3793 "}\n"
3794 "\n"
3795 "float shadow_sample( vec3 co ){\n"
3796 " float height_sample = world_depth_sample( co );\n"
3797 "\n"
3798 " float fdelta = height_sample - co.y;\n"
3799 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
3800 "}\n"
3801 "\n"
3802 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
3803 " if( g_shadow_samples == 0 ){\n"
3804 " return 1.0;\n"
3805 " }\n"
3806 "\n"
3807 " float fspread = g_shadow_spread;\n"
3808 " float flength = g_shadow_length;\n"
3809 "\n"
3810 " float famt = 0.0;\n"
3811 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
3812 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
3813 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
3814 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
3815 "\n"
3816 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
3817 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
3818 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
3819 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
3820 "\n"
3821 " return 1.0 - famt;\n"
3822 "}\n"
3823 "\n"
3824 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
3825 "{\n"
3826 " vec3 specdir = reflect( -dir, wnormal );\n"
3827 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
3828 "}\n"
3829 "\n"
3830 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
3831 " float dist = pow(fdist*0.0010,0.78);\n"
3832 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
3833 "}\n"
3834 "\n"
3835 "vec3 scene_calculate_light( int light_index, \n"
3836 " vec3 halfview, vec3 co, vec3 normal )\n"
3837 "{\n"
3838 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
3839 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
3840 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
3841 "\n"
3842 " vec3 light_delta = light_co.xyz-co;\n"
3843 " float dist2 = dot(light_delta,light_delta);\n"
3844 "\n"
3845 " light_delta = normalize( light_delta );\n"
3846 "\n"
3847 " float quadratic = dist2*100.0;\n"
3848 " float attenuation = 1.0/( 1.0 + quadratic );\n"
3849 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
3850 "\n"
3851 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
3852 "\n"
3853 " if( light_dir.w < 0.999999 ){\n"
3854 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
3855 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
3856 " }\n"
3857 "\n"
3858 " return light_colour.rgb * attenuation * falloff \n"
3859 " * step( g_day_phase, light_colour.w );\n"
3860 "}\n"
3861 "\n"
3862 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
3863 " vec3 halfview, vec3 co, vec3 normal )\n"
3864 "{\n"
3865 " uint light_count = packed_index & 0x3u;\n"
3866 "\n"
3867 " vec3 l = vec3(0.0);\n"
3868 "\n"
3869 " if( light_count >= 1u ){\n"
3870 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
3871 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
3872 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
3873 "\n"
3874 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
3875 "\n"
3876 " if( light_count >= 2u ){\n"
3877 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
3878 "\n"
3879 " if( light_count >= 3u ){\n"
3880 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
3881 " }\n"
3882 " }\n"
3883 " }\n"
3884 "\n"
3885 " return l;\n"
3886 "}\n"
3887 "\n"
3888 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
3889 " float light_mask )\n"
3890 "{\n"
3891 " if( g_light_preview == 1 )\n"
3892 " diffuse = vec3(0.75);\n"
3893 "\n"
3894 " // Lighting\n"
3895 " vec3 halfview = uCamera - co;\n"
3896 " float fdist = length(halfview);\n"
3897 " halfview /= fdist;\n"
3898 "\n"
3899 " float world_shadow = newlight_compute_sun_shadow( \n"
3900 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
3901 "\n"
3902 " vec3 total_light = clearskies_lighting( \n"
3903 " normal, min( light_mask, world_shadow ), halfview );\n"
3904 "\n"
3905 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
3906 " cube_coord = floor( cube_coord );\n"
3907 "\n"
3908 " if( g_debug_indices == 1 )\n"
3909 " {\n"
3910 " return rand33(cube_coord);\n"
3911 " }\n"
3912 "\n"
3913 " if( g_debug_complexity == 1 )\n"
3914 " {\n"
3915 " ivec3 coord = ivec3( cube_coord );\n"
3916 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
3917 "\n"
3918 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
3919 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
3920 " }\n"
3921 "\n"
3922 " // FIXME: this coord should absolutely must be clamped!\n"
3923 " \n"
3924 " ivec3 coord = ivec3( cube_coord );\n"
3925 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
3926 "\n"
3927 " total_light += \n"
3928 " scene_calculate_packed_light_patch( index_sample.x,\n"
3929 " halfview, co, normal ) \n"
3930 " * light_mask;\n"
3931 " total_light += \n"
3932 " scene_calculate_packed_light_patch( index_sample.y,\n"
3933 " halfview, co, normal )\n"
3934 " * light_mask;\n"
3935 "\n"
3936 " // Take a section of the sky function to give us a matching fog colour\n"
3937 "\n"
3938 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
3939 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
3940 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
3941 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
3942 " \n"
3943 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
3944 " sun_colour *= sun_shape;\n"
3945 "\n"
3946 " fog_colour += sun_colour;\n"
3947 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
3948 "}\n"
3949 "\n"
3950 "#line 9 0 \n"
3951 "\n"
3952 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
3953 "{\n"
3954 " vec3 pa = p - a;\n"
3955 " vec3 ba = b - a;\n"
3956 "\n"
3957 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
3958 " return length( pa - ba*h );\n"
3959 "}\n"
3960 "\n"
3961 "float compute_board_shadow()\n"
3962 "{\n"
3963 " // player shadow\n"
3964 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
3965 " g_board_1.xyz )-0.1 );\n"
3966 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
3967 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
3968 "\n"
3969 " return 1.0 - player_shadow*0.8;\n"
3970 "}\n"
3971 "\n"
3972 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
3973 "{\n"
3974 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
3975 "}\n"
3976 "\n"
3977 "#line 8 0 \n"
3978 "#line 1 3 \n"
3979 "const float k_motion_lerp_amount = 0.01;\n"
3980 "\n"
3981 "#line 2 0 \n"
3982 "\n"
3983 "layout (location = 1) out vec2 oMotionVec;\n"
3984 "\n"
3985 "in vec3 aMotionVec0;\n"
3986 "in vec3 aMotionVec1;\n"
3987 "\n"
3988 "void compute_motion_vectors()\n"
3989 "{\n"
3990 " // Write motion vectors\n"
3991 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
3992 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
3993 "\n"
3994 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
3995 "}\n"
3996 "\n"
3997 "#line 9 0 \n"
3998 "\n"
3999 "float filtered_stripe( in float p, in float ddx, in float ddy )\n"
4000 "{\n"
4001 " float w = max(abs(ddx), abs(ddy)) + 0.02;\n"
4002 " float i = (abs(fract((p-0.5*w)/2.0)-0.5)-abs(fract((p+0.5*w)/2.0)-0.5))/w;\n"
4003 " return 0.5 - i;\n"
4004 "}\n"
4005 "\n"
4006 "void main()\n"
4007 "{\n"
4008 " compute_motion_vectors();\n"
4009 "\n"
4010 " vec3 vfrag = vec3(0.5,0.5,0.5);\n"
4011 "\n"
4012 " // ws modulation\n"
4013 " vec4 wgarbage = texture( uTexGarbage, aCo.xz * 0.015 );\n"
4014 "\n"
4015 " // Creating normal patches\n"
4016 " vec3 modnorm = (wgarbage.rgb-0.4) * 1.4;\n"
4017 " vec3 qnorm = normalize(floor(aNorm.xyz*4.0+modnorm)*0.25);\n"
4018 " qnorm += vec3(0.001,0.0,0.0);\n"
4019 "\n"
4020 " vec3 tangent0 = normalize(cross(qnorm,vec3(0.0,1.0,0.0)));\n"
4021 " vec3 tangent1 = cross(qnorm,tangent0);\n"
4022 " vec2 uvdiffuse = vec2( dot(tangent0,aCo), dot(tangent1,aCo) ) * 0.035;\n"
4023 " \n"
4024 " // Patch local noise\n"
4025 " vec4 rgarbage = texture( uTexGarbage, uvdiffuse );\n"
4026 "\n"
4027 " vfrag = pow(uColour.rgb,vec3(1.0/2.2));\n"
4028 " vfrag -= rgarbage.a*0.1;\n"
4029 "\n"
4030 " if( wgarbage.g < 0.1 )\n"
4031 " discard;\n"
4032 "\n"
4033 " float movep = (aUv.x + abs(aUv.y-0.5)*0.4 - g_realtime)*2.0;\n"
4034 " float stripe = filtered_stripe( movep, dFdx(movep), dFdy(movep) );\n"
4035 " vfrag *= 0.9+stripe*uColour.a; \n"
4036 "\n"
4037 " if( g_light_preview == 1 )\n"
4038 " {\n"
4039 " vfrag = vec3(0.5);\n"
4040 " }\n"
4041 "\n"
4042 " // Lighting\n"
4043 " oColour = vec4( scene_compute_lighting( vfrag, qnorm, aWorldCo ), 1.0 );\n"
4044 "}\n"
4045 ""},
4046 };
4047
4048 GLuint _uniform_scene_route_uMdl;
4049 GLuint _uniform_scene_route_uPv;
4050 GLuint _uniform_scene_route_uPvmPrev;
4051 GLuint _uniform_scene_route_uNormalMtx;
4052 GLuint _uniform_scene_route_uTexGarbage;
4053 GLuint _uniform_scene_route_uTexGradients;
4054 GLuint _uniform_scene_route_uCamera;
4055 GLuint _uniform_scene_route_uColour;
4056 GLuint _uniform_scene_route_g_world_depth;
4057 GLuint _uniform_scene_route_uLightsArray;
4058 GLuint _uniform_scene_route_uLightsIndex;
4059 #include "shaders/scene_depth.h"
4060 struct vg_shader _shader_scene_depth = {
4061 .name = "scene_depth",
4062 .vs =
4063 {
4064 .orig_file = "shaders/scene.vs",
4065 .static_src =
4066 "layout (location=0) in vec3 a_co;\n"
4067 "layout (location=1) in vec4 a_norm;\n"
4068 "layout (location=2) in vec2 a_uv;\n"
4069 "\n"
4070 "#line 1 1 \n"
4071 "const float k_motion_lerp_amount = 0.01;\n"
4072 "\n"
4073 "#line 2 0 \n"
4074 "\n"
4075 "out vec3 aMotionVec0;\n"
4076 "out vec3 aMotionVec1;\n"
4077 "\n"
4078 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
4079 "{\n"
4080 " // This magically solves some artifacting errors!\n"
4081 " //\n"
4082 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
4083 "\n"
4084 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
4085 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
4086 "}\n"
4087 "\n"
4088 "#line 6 0 \n"
4089 "\n"
4090 "uniform mat4x3 uMdl;\n"
4091 "uniform mat4 uPv;\n"
4092 "uniform mat4 uPvmPrev;\n"
4093 "\n"
4094 "out vec2 aUv;\n"
4095 "out vec4 aNorm;\n"
4096 "out vec3 aCo;\n"
4097 "out vec3 aWorldCo;\n"
4098 "\n"
4099 "void main()\n"
4100 "{\n"
4101 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
4102 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
4103 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
4104 "\n"
4105 " vs_motion_out( vproj0, vproj1 );\n"
4106 "\n"
4107 " gl_Position = vproj0;\n"
4108 "\n"
4109 " aUv = a_uv;\n"
4110 " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n"
4111 " aCo = a_co;\n"
4112 " aWorldCo = world_pos0;\n"
4113 "}\n"
4114 ""},
4115 .fs =
4116 {
4117 .orig_file = "shaders/scene_depth.fs",
4118 .static_src =
4119 "out vec4 FragColor;\n"
4120 "\n"
4121 "uniform vec3 uCamera;\n"
4122 "uniform vec3 uBoard0;\n"
4123 "uniform vec3 uBoard1;\n"
4124 "\n"
4125 "#line 1 1 \n"
4126 "// :D\n"
4127 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
4128 "\n"
4129 "#line 8 0 \n"
4130 "#line 1 2 \n"
4131 "// :D\n"
4132 "\n"
4133 "in vec2 aUv;\n"
4134 "in vec4 aNorm;\n"
4135 "in vec3 aCo;\n"
4136 "in vec3 aWorldCo;\n"
4137 "\n"
4138 "#line 1 1 \n"
4139 "layout (location = 0) out vec4 oColour;\n"
4140 "\n"
4141 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
4142 "layout (std140) uniform ub_world_lighting\n"
4143 "{\n"
4144 " vec4 g_cube_min;\n"
4145 " vec4 g_cube_inv_range;\n"
4146 "\n"
4147 " vec4 g_water_plane;\n"
4148 " vec4 g_depth_bounds;\n"
4149 "\n"
4150 " vec4 g_daysky_colour;\n"
4151 " vec4 g_nightsky_colour;\n"
4152 " vec4 g_sunset_colour;\n"
4153 " vec4 g_ambient_colour;\n"
4154 " vec4 g_sunset_ambient;\n"
4155 " vec4 g_sun_colour;\n"
4156 " vec4 g_sun_dir;\n"
4157 " vec4 g_board_0;\n"
4158 " vec4 g_board_1;\n"
4159 "\n"
4160 " float g_water_fog;\n"
4161 " float g_time;\n"
4162 " float g_realtime;\n"
4163 " float g_shadow_length;\n"
4164 " float g_shadow_spread;\n"
4165 "\n"
4166 " float g_time_of_day;\n"
4167 " float g_day_phase;\n"
4168 " float g_sunset_phase;\n"
4169 "\n"
4170 " int g_light_preview;\n"
4171 " int g_shadow_samples;\n"
4172 "\n"
4173 " int g_debug_indices;\n"
4174 " int g_debug_complexity;\n"
4175 "};\n"
4176 "\n"
4177 "uniform sampler2D g_world_depth;\n"
4178 "uniform samplerBuffer uLightsArray;\n"
4179 "uniform usampler3D uLightsIndex;\n"
4180 "\n"
4181 "#line 1 1 \n"
4182 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
4183 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
4184 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
4185 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
4186 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
4187 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
4188 "\n"
4189 "const float SUN_ANGLE = 0.0001;\n"
4190 "const float PI = 3.14159265358979323846264;\n"
4191 "\n"
4192 "//struct world_info\n"
4193 "//{\n"
4194 "// float time,\n"
4195 "// time_of_day,\n"
4196 "// day_phase,\n"
4197 "// sunset_phase;\n"
4198 "// \n"
4199 "// vec3 sun_dir;\n"
4200 "//};\n"
4201 "\n"
4202 "vec3 rand33(vec3 p3)\n"
4203 "{\n"
4204 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
4205 " p3 += dot(p3, p3.yxz+33.33);\n"
4206 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
4207 "}\n"
4208 "\n"
4209 "float stars( vec3 rd, float rr, float size ){\n"
4210 " vec3 co = rd * rr;\n"
4211 "\n"
4212 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
4213 "\n"
4214 " float spaces = 1.0 / rr;\n"
4215 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
4216 " a -= mod(a, spaces) - spaces * 0.5;\n"
4217 "\n"
4218 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
4219 " \n"
4220 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
4221 " plane = plane - mod(plane, PI / count);\n"
4222 "\n"
4223 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
4224 "\n"
4225 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
4226 " float ydist = sqrt(rr * rr - level * level);\n"
4227 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
4228 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
4229 " float star = smoothstep(size, 0.0, distance(center, co));\n"
4230 " return star;\n"
4231 "}\n"
4232 "\n"
4233 "float luminance( vec3 v )\n"
4234 "{\n"
4235 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
4236 "}\n"
4237 "\n"
4238 "vec3 clearskies_ambient( vec3 dir )\n"
4239 "{\n"
4240 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
4241 " float sky_gradient = dir.y;\n"
4242 " \n"
4243 " /* Blend phase colours */\n"
4244 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
4245 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
4246 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
4247 " \n"
4248 " /* Add gradient */\n"
4249 " ambient -= sky_gradient * luminance(ambient);\n"
4250 " \n"
4251 " return ambient;\n"
4252 "}\n"
4253 "\n"
4254 "vec3 clearskies_sky( vec3 ray_dir )\n"
4255 "{\n"
4256 " ray_dir.y = abs( ray_dir.y );\n"
4257 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
4258 " \n"
4259 " /* Sun */\n"
4260 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
4261 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
4262 " float sun_shape = pow( sun_size, 2000.0 );\n"
4263 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
4264 " \n"
4265 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
4266 " sun_colour *= sun_shape;\n"
4267 "\n"
4268 " \n"
4269 " float star = 0.0;\n"
4270 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
4271 "\n"
4272 " if( star_blend > 0.001 ){\n"
4273 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
4274 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
4275 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
4276 " }\n"
4277 " }\n"
4278 " \n"
4279 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
4280 " return composite;\n"
4281 "}\n"
4282 "\n"
4283 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
4284 "{\n"
4285 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
4286 "\n"
4287 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
4288 " g_sunset_phase );\n"
4289 "\n"
4290 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
4291 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
4292 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
4293 " ) * g_sun_colour.rgb * g_day_phase;\n"
4294 "\n"
4295 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
4296 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
4297 " g_sunset_phase );\n"
4298 "\n"
4299 " return ambient + (light_sun + sky_reflection) * shadow;\n"
4300 "}\n"
4301 "\n"
4302 "#line 44 0 \n"
4303 "\n"
4304 "float world_depth_sample( vec3 pos )\n"
4305 "{\n"
4306 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
4307 " return texture( g_world_depth, depth_coord ).r;\n"
4308 "}\n"
4309 "\n"
4310 "float world_water_depth( vec3 pos )\n"
4311 "{\n"
4312 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
4313 " return world_depth_sample( pos ) - ref_depth;\n"
4314 "}\n"
4315 "\n"
4316 "float shadow_sample( vec3 co ){\n"
4317 " float height_sample = world_depth_sample( co );\n"
4318 "\n"
4319 " float fdelta = height_sample - co.y;\n"
4320 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
4321 "}\n"
4322 "\n"
4323 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
4324 " if( g_shadow_samples == 0 ){\n"
4325 " return 1.0;\n"
4326 " }\n"
4327 "\n"
4328 " float fspread = g_shadow_spread;\n"
4329 " float flength = g_shadow_length;\n"
4330 "\n"
4331 " float famt = 0.0;\n"
4332 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
4333 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
4334 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
4335 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
4336 "\n"
4337 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
4338 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
4339 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
4340 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
4341 "\n"
4342 " return 1.0 - famt;\n"
4343 "}\n"
4344 "\n"
4345 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
4346 "{\n"
4347 " vec3 specdir = reflect( -dir, wnormal );\n"
4348 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
4349 "}\n"
4350 "\n"
4351 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
4352 " float dist = pow(fdist*0.0010,0.78);\n"
4353 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
4354 "}\n"
4355 "\n"
4356 "vec3 scene_calculate_light( int light_index, \n"
4357 " vec3 halfview, vec3 co, vec3 normal )\n"
4358 "{\n"
4359 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
4360 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
4361 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
4362 "\n"
4363 " vec3 light_delta = light_co.xyz-co;\n"
4364 " float dist2 = dot(light_delta,light_delta);\n"
4365 "\n"
4366 " light_delta = normalize( light_delta );\n"
4367 "\n"
4368 " float quadratic = dist2*100.0;\n"
4369 " float attenuation = 1.0/( 1.0 + quadratic );\n"
4370 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
4371 "\n"
4372 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
4373 "\n"
4374 " if( light_dir.w < 0.999999 ){\n"
4375 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
4376 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
4377 " }\n"
4378 "\n"
4379 " return light_colour.rgb * attenuation * falloff \n"
4380 " * step( g_day_phase, light_colour.w );\n"
4381 "}\n"
4382 "\n"
4383 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
4384 " vec3 halfview, vec3 co, vec3 normal )\n"
4385 "{\n"
4386 " uint light_count = packed_index & 0x3u;\n"
4387 "\n"
4388 " vec3 l = vec3(0.0);\n"
4389 "\n"
4390 " if( light_count >= 1u ){\n"
4391 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
4392 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
4393 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
4394 "\n"
4395 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
4396 "\n"
4397 " if( light_count >= 2u ){\n"
4398 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
4399 "\n"
4400 " if( light_count >= 3u ){\n"
4401 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
4402 " }\n"
4403 " }\n"
4404 " }\n"
4405 "\n"
4406 " return l;\n"
4407 "}\n"
4408 "\n"
4409 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
4410 " float light_mask )\n"
4411 "{\n"
4412 " if( g_light_preview == 1 )\n"
4413 " diffuse = vec3(0.75);\n"
4414 "\n"
4415 " // Lighting\n"
4416 " vec3 halfview = uCamera - co;\n"
4417 " float fdist = length(halfview);\n"
4418 " halfview /= fdist;\n"
4419 "\n"
4420 " float world_shadow = newlight_compute_sun_shadow( \n"
4421 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
4422 "\n"
4423 " vec3 total_light = clearskies_lighting( \n"
4424 " normal, min( light_mask, world_shadow ), halfview );\n"
4425 "\n"
4426 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
4427 " cube_coord = floor( cube_coord );\n"
4428 "\n"
4429 " if( g_debug_indices == 1 )\n"
4430 " {\n"
4431 " return rand33(cube_coord);\n"
4432 " }\n"
4433 "\n"
4434 " if( g_debug_complexity == 1 )\n"
4435 " {\n"
4436 " ivec3 coord = ivec3( cube_coord );\n"
4437 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
4438 "\n"
4439 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
4440 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
4441 " }\n"
4442 "\n"
4443 " // FIXME: this coord should absolutely must be clamped!\n"
4444 " \n"
4445 " ivec3 coord = ivec3( cube_coord );\n"
4446 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
4447 "\n"
4448 " total_light += \n"
4449 " scene_calculate_packed_light_patch( index_sample.x,\n"
4450 " halfview, co, normal ) \n"
4451 " * light_mask;\n"
4452 " total_light += \n"
4453 " scene_calculate_packed_light_patch( index_sample.y,\n"
4454 " halfview, co, normal )\n"
4455 " * light_mask;\n"
4456 "\n"
4457 " // Take a section of the sky function to give us a matching fog colour\n"
4458 "\n"
4459 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
4460 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
4461 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
4462 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
4463 " \n"
4464 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
4465 " sun_colour *= sun_shape;\n"
4466 "\n"
4467 " fog_colour += sun_colour;\n"
4468 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
4469 "}\n"
4470 "\n"
4471 "#line 9 0 \n"
4472 "\n"
4473 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
4474 "{\n"
4475 " vec3 pa = p - a;\n"
4476 " vec3 ba = b - a;\n"
4477 "\n"
4478 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
4479 " return length( pa - ba*h );\n"
4480 "}\n"
4481 "\n"
4482 "float compute_board_shadow()\n"
4483 "{\n"
4484 " // player shadow\n"
4485 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
4486 " g_board_1.xyz )-0.1 );\n"
4487 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
4488 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
4489 "\n"
4490 " return 1.0 - player_shadow*0.8;\n"
4491 "}\n"
4492 "\n"
4493 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
4494 "{\n"
4495 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
4496 "}\n"
4497 "\n"
4498 "#line 9 0 \n"
4499 "\n"
4500 "// Water blending\n"
4501 "// ==============\n"
4502 "\n"
4503 "float water_depth( vec3 pos, vec3 halfview )\n"
4504 "{\n"
4505 " vec3 pnorm = g_water_plane.xyz;\n"
4506 " float pdist = g_water_plane.w;\n"
4507 "\n"
4508 " float d = dot( pnorm, halfview );\n"
4509 " float t = dot((pnorm*pdist - pos), pnorm) / d;\n"
4510 " return t * g_water_fog;\n"
4511 "}\n"
4512 "\n"
4513 "void main()\n"
4514 "{\n"
4515 " vec3 halfview = normalize( uCamera - aWorldCo );\n"
4516 " float depth = water_depth( aWorldCo, halfview );\n"
4517 " FragColor = vec4( depth, 0.0, 0.0, 0.0 );\n"
4518 "}\n"
4519 ""},
4520 };
4521
4522 GLuint _uniform_scene_depth_uMdl;
4523 GLuint _uniform_scene_depth_uPv;
4524 GLuint _uniform_scene_depth_uPvmPrev;
4525 GLuint _uniform_scene_depth_uCamera;
4526 GLuint _uniform_scene_depth_uBoard0;
4527 GLuint _uniform_scene_depth_uBoard1;
4528 GLuint _uniform_scene_depth_g_world_depth;
4529 GLuint _uniform_scene_depth_uLightsArray;
4530 GLuint _uniform_scene_depth_uLightsIndex;
4531 #include "shaders/scene_position.h"
4532 struct vg_shader _shader_scene_position = {
4533 .name = "scene_position",
4534 .vs =
4535 {
4536 .orig_file = "shaders/scene.vs",
4537 .static_src =
4538 "layout (location=0) in vec3 a_co;\n"
4539 "layout (location=1) in vec4 a_norm;\n"
4540 "layout (location=2) in vec2 a_uv;\n"
4541 "\n"
4542 "#line 1 1 \n"
4543 "const float k_motion_lerp_amount = 0.01;\n"
4544 "\n"
4545 "#line 2 0 \n"
4546 "\n"
4547 "out vec3 aMotionVec0;\n"
4548 "out vec3 aMotionVec1;\n"
4549 "\n"
4550 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
4551 "{\n"
4552 " // This magically solves some artifacting errors!\n"
4553 " //\n"
4554 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
4555 "\n"
4556 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
4557 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
4558 "}\n"
4559 "\n"
4560 "#line 6 0 \n"
4561 "\n"
4562 "uniform mat4x3 uMdl;\n"
4563 "uniform mat4 uPv;\n"
4564 "uniform mat4 uPvmPrev;\n"
4565 "\n"
4566 "out vec2 aUv;\n"
4567 "out vec4 aNorm;\n"
4568 "out vec3 aCo;\n"
4569 "out vec3 aWorldCo;\n"
4570 "\n"
4571 "void main()\n"
4572 "{\n"
4573 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
4574 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
4575 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
4576 "\n"
4577 " vs_motion_out( vproj0, vproj1 );\n"
4578 "\n"
4579 " gl_Position = vproj0;\n"
4580 "\n"
4581 " aUv = a_uv;\n"
4582 " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n"
4583 " aCo = a_co;\n"
4584 " aWorldCo = world_pos0;\n"
4585 "}\n"
4586 ""},
4587 .fs =
4588 {
4589 .orig_file = "shaders/scene_position.fs",
4590 .static_src =
4591 "out vec4 FragColor;\n"
4592 "\n"
4593 "uniform vec3 uCamera;\n"
4594 "uniform vec3 uBoard0;\n"
4595 "uniform vec3 uBoard1;\n"
4596 "\n"
4597 "#line 1 1 \n"
4598 "// :D\n"
4599 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
4600 "\n"
4601 "#line 8 0 \n"
4602 "#line 1 2 \n"
4603 "// :D\n"
4604 "\n"
4605 "in vec2 aUv;\n"
4606 "in vec4 aNorm;\n"
4607 "in vec3 aCo;\n"
4608 "in vec3 aWorldCo;\n"
4609 "\n"
4610 "#line 1 1 \n"
4611 "layout (location = 0) out vec4 oColour;\n"
4612 "\n"
4613 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
4614 "layout (std140) uniform ub_world_lighting\n"
4615 "{\n"
4616 " vec4 g_cube_min;\n"
4617 " vec4 g_cube_inv_range;\n"
4618 "\n"
4619 " vec4 g_water_plane;\n"
4620 " vec4 g_depth_bounds;\n"
4621 "\n"
4622 " vec4 g_daysky_colour;\n"
4623 " vec4 g_nightsky_colour;\n"
4624 " vec4 g_sunset_colour;\n"
4625 " vec4 g_ambient_colour;\n"
4626 " vec4 g_sunset_ambient;\n"
4627 " vec4 g_sun_colour;\n"
4628 " vec4 g_sun_dir;\n"
4629 " vec4 g_board_0;\n"
4630 " vec4 g_board_1;\n"
4631 "\n"
4632 " float g_water_fog;\n"
4633 " float g_time;\n"
4634 " float g_realtime;\n"
4635 " float g_shadow_length;\n"
4636 " float g_shadow_spread;\n"
4637 "\n"
4638 " float g_time_of_day;\n"
4639 " float g_day_phase;\n"
4640 " float g_sunset_phase;\n"
4641 "\n"
4642 " int g_light_preview;\n"
4643 " int g_shadow_samples;\n"
4644 "\n"
4645 " int g_debug_indices;\n"
4646 " int g_debug_complexity;\n"
4647 "};\n"
4648 "\n"
4649 "uniform sampler2D g_world_depth;\n"
4650 "uniform samplerBuffer uLightsArray;\n"
4651 "uniform usampler3D uLightsIndex;\n"
4652 "\n"
4653 "#line 1 1 \n"
4654 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
4655 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
4656 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
4657 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
4658 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
4659 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
4660 "\n"
4661 "const float SUN_ANGLE = 0.0001;\n"
4662 "const float PI = 3.14159265358979323846264;\n"
4663 "\n"
4664 "//struct world_info\n"
4665 "//{\n"
4666 "// float time,\n"
4667 "// time_of_day,\n"
4668 "// day_phase,\n"
4669 "// sunset_phase;\n"
4670 "// \n"
4671 "// vec3 sun_dir;\n"
4672 "//};\n"
4673 "\n"
4674 "vec3 rand33(vec3 p3)\n"
4675 "{\n"
4676 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
4677 " p3 += dot(p3, p3.yxz+33.33);\n"
4678 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
4679 "}\n"
4680 "\n"
4681 "float stars( vec3 rd, float rr, float size ){\n"
4682 " vec3 co = rd * rr;\n"
4683 "\n"
4684 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
4685 "\n"
4686 " float spaces = 1.0 / rr;\n"
4687 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
4688 " a -= mod(a, spaces) - spaces * 0.5;\n"
4689 "\n"
4690 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
4691 " \n"
4692 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
4693 " plane = plane - mod(plane, PI / count);\n"
4694 "\n"
4695 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
4696 "\n"
4697 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
4698 " float ydist = sqrt(rr * rr - level * level);\n"
4699 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
4700 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
4701 " float star = smoothstep(size, 0.0, distance(center, co));\n"
4702 " return star;\n"
4703 "}\n"
4704 "\n"
4705 "float luminance( vec3 v )\n"
4706 "{\n"
4707 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
4708 "}\n"
4709 "\n"
4710 "vec3 clearskies_ambient( vec3 dir )\n"
4711 "{\n"
4712 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
4713 " float sky_gradient = dir.y;\n"
4714 " \n"
4715 " /* Blend phase colours */\n"
4716 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
4717 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
4718 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
4719 " \n"
4720 " /* Add gradient */\n"
4721 " ambient -= sky_gradient * luminance(ambient);\n"
4722 " \n"
4723 " return ambient;\n"
4724 "}\n"
4725 "\n"
4726 "vec3 clearskies_sky( vec3 ray_dir )\n"
4727 "{\n"
4728 " ray_dir.y = abs( ray_dir.y );\n"
4729 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
4730 " \n"
4731 " /* Sun */\n"
4732 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
4733 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
4734 " float sun_shape = pow( sun_size, 2000.0 );\n"
4735 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
4736 " \n"
4737 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
4738 " sun_colour *= sun_shape;\n"
4739 "\n"
4740 " \n"
4741 " float star = 0.0;\n"
4742 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
4743 "\n"
4744 " if( star_blend > 0.001 ){\n"
4745 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
4746 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
4747 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
4748 " }\n"
4749 " }\n"
4750 " \n"
4751 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
4752 " return composite;\n"
4753 "}\n"
4754 "\n"
4755 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
4756 "{\n"
4757 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
4758 "\n"
4759 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
4760 " g_sunset_phase );\n"
4761 "\n"
4762 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
4763 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
4764 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
4765 " ) * g_sun_colour.rgb * g_day_phase;\n"
4766 "\n"
4767 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
4768 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
4769 " g_sunset_phase );\n"
4770 "\n"
4771 " return ambient + (light_sun + sky_reflection) * shadow;\n"
4772 "}\n"
4773 "\n"
4774 "#line 44 0 \n"
4775 "\n"
4776 "float world_depth_sample( vec3 pos )\n"
4777 "{\n"
4778 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
4779 " return texture( g_world_depth, depth_coord ).r;\n"
4780 "}\n"
4781 "\n"
4782 "float world_water_depth( vec3 pos )\n"
4783 "{\n"
4784 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
4785 " return world_depth_sample( pos ) - ref_depth;\n"
4786 "}\n"
4787 "\n"
4788 "float shadow_sample( vec3 co ){\n"
4789 " float height_sample = world_depth_sample( co );\n"
4790 "\n"
4791 " float fdelta = height_sample - co.y;\n"
4792 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
4793 "}\n"
4794 "\n"
4795 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
4796 " if( g_shadow_samples == 0 ){\n"
4797 " return 1.0;\n"
4798 " }\n"
4799 "\n"
4800 " float fspread = g_shadow_spread;\n"
4801 " float flength = g_shadow_length;\n"
4802 "\n"
4803 " float famt = 0.0;\n"
4804 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
4805 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
4806 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
4807 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
4808 "\n"
4809 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
4810 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
4811 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
4812 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
4813 "\n"
4814 " return 1.0 - famt;\n"
4815 "}\n"
4816 "\n"
4817 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
4818 "{\n"
4819 " vec3 specdir = reflect( -dir, wnormal );\n"
4820 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
4821 "}\n"
4822 "\n"
4823 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
4824 " float dist = pow(fdist*0.0010,0.78);\n"
4825 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
4826 "}\n"
4827 "\n"
4828 "vec3 scene_calculate_light( int light_index, \n"
4829 " vec3 halfview, vec3 co, vec3 normal )\n"
4830 "{\n"
4831 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
4832 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
4833 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
4834 "\n"
4835 " vec3 light_delta = light_co.xyz-co;\n"
4836 " float dist2 = dot(light_delta,light_delta);\n"
4837 "\n"
4838 " light_delta = normalize( light_delta );\n"
4839 "\n"
4840 " float quadratic = dist2*100.0;\n"
4841 " float attenuation = 1.0/( 1.0 + quadratic );\n"
4842 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
4843 "\n"
4844 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
4845 "\n"
4846 " if( light_dir.w < 0.999999 ){\n"
4847 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
4848 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
4849 " }\n"
4850 "\n"
4851 " return light_colour.rgb * attenuation * falloff \n"
4852 " * step( g_day_phase, light_colour.w );\n"
4853 "}\n"
4854 "\n"
4855 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
4856 " vec3 halfview, vec3 co, vec3 normal )\n"
4857 "{\n"
4858 " uint light_count = packed_index & 0x3u;\n"
4859 "\n"
4860 " vec3 l = vec3(0.0);\n"
4861 "\n"
4862 " if( light_count >= 1u ){\n"
4863 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
4864 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
4865 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
4866 "\n"
4867 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
4868 "\n"
4869 " if( light_count >= 2u ){\n"
4870 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
4871 "\n"
4872 " if( light_count >= 3u ){\n"
4873 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
4874 " }\n"
4875 " }\n"
4876 " }\n"
4877 "\n"
4878 " return l;\n"
4879 "}\n"
4880 "\n"
4881 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
4882 " float light_mask )\n"
4883 "{\n"
4884 " if( g_light_preview == 1 )\n"
4885 " diffuse = vec3(0.75);\n"
4886 "\n"
4887 " // Lighting\n"
4888 " vec3 halfview = uCamera - co;\n"
4889 " float fdist = length(halfview);\n"
4890 " halfview /= fdist;\n"
4891 "\n"
4892 " float world_shadow = newlight_compute_sun_shadow( \n"
4893 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
4894 "\n"
4895 " vec3 total_light = clearskies_lighting( \n"
4896 " normal, min( light_mask, world_shadow ), halfview );\n"
4897 "\n"
4898 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
4899 " cube_coord = floor( cube_coord );\n"
4900 "\n"
4901 " if( g_debug_indices == 1 )\n"
4902 " {\n"
4903 " return rand33(cube_coord);\n"
4904 " }\n"
4905 "\n"
4906 " if( g_debug_complexity == 1 )\n"
4907 " {\n"
4908 " ivec3 coord = ivec3( cube_coord );\n"
4909 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
4910 "\n"
4911 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
4912 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
4913 " }\n"
4914 "\n"
4915 " // FIXME: this coord should absolutely must be clamped!\n"
4916 " \n"
4917 " ivec3 coord = ivec3( cube_coord );\n"
4918 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
4919 "\n"
4920 " total_light += \n"
4921 " scene_calculate_packed_light_patch( index_sample.x,\n"
4922 " halfview, co, normal ) \n"
4923 " * light_mask;\n"
4924 " total_light += \n"
4925 " scene_calculate_packed_light_patch( index_sample.y,\n"
4926 " halfview, co, normal )\n"
4927 " * light_mask;\n"
4928 "\n"
4929 " // Take a section of the sky function to give us a matching fog colour\n"
4930 "\n"
4931 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
4932 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
4933 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
4934 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
4935 " \n"
4936 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
4937 " sun_colour *= sun_shape;\n"
4938 "\n"
4939 " fog_colour += sun_colour;\n"
4940 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
4941 "}\n"
4942 "\n"
4943 "#line 9 0 \n"
4944 "\n"
4945 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
4946 "{\n"
4947 " vec3 pa = p - a;\n"
4948 " vec3 ba = b - a;\n"
4949 "\n"
4950 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
4951 " return length( pa - ba*h );\n"
4952 "}\n"
4953 "\n"
4954 "float compute_board_shadow()\n"
4955 "{\n"
4956 " // player shadow\n"
4957 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
4958 " g_board_1.xyz )-0.1 );\n"
4959 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
4960 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
4961 "\n"
4962 " return 1.0 - player_shadow*0.8;\n"
4963 "}\n"
4964 "\n"
4965 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
4966 "{\n"
4967 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
4968 "}\n"
4969 "\n"
4970 "#line 9 0 \n"
4971 "\n"
4972 "void main()\n"
4973 "{\n"
4974 " float height_full = aWorldCo.y;\n"
4975 " float height_water = height_full;\n"
4976 "\n"
4977 " if( height_water > (g_water_plane.y * g_water_plane.w) + 2.0 )\n"
4978 " height_water = -99999.9;\n"
4979 "\n"
4980 " FragColor = vec4( height_full, height_water, 0.0, 0.0 );\n"
4981 "}\n"
4982 ""},
4983 };
4984
4985 GLuint _uniform_scene_position_uMdl;
4986 GLuint _uniform_scene_position_uPv;
4987 GLuint _uniform_scene_position_uPvmPrev;
4988 GLuint _uniform_scene_position_uCamera;
4989 GLuint _uniform_scene_position_uBoard0;
4990 GLuint _uniform_scene_position_uBoard1;
4991 GLuint _uniform_scene_position_g_world_depth;
4992 GLuint _uniform_scene_position_uLightsArray;
4993 GLuint _uniform_scene_position_uLightsIndex;
4994 #include "shaders/scene_cubemapped.h"
4995 struct vg_shader _shader_scene_cubemapped = {
4996 .name = "scene_cubemapped",
4997 .vs =
4998 {
4999 .orig_file = "shaders/scene.vs",
5000 .static_src =
5001 "layout (location=0) in vec3 a_co;\n"
5002 "layout (location=1) in vec4 a_norm;\n"
5003 "layout (location=2) in vec2 a_uv;\n"
5004 "\n"
5005 "#line 1 1 \n"
5006 "const float k_motion_lerp_amount = 0.01;\n"
5007 "\n"
5008 "#line 2 0 \n"
5009 "\n"
5010 "out vec3 aMotionVec0;\n"
5011 "out vec3 aMotionVec1;\n"
5012 "\n"
5013 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
5014 "{\n"
5015 " // This magically solves some artifacting errors!\n"
5016 " //\n"
5017 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
5018 "\n"
5019 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
5020 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
5021 "}\n"
5022 "\n"
5023 "#line 6 0 \n"
5024 "\n"
5025 "uniform mat4x3 uMdl;\n"
5026 "uniform mat4 uPv;\n"
5027 "uniform mat4 uPvmPrev;\n"
5028 "\n"
5029 "out vec2 aUv;\n"
5030 "out vec4 aNorm;\n"
5031 "out vec3 aCo;\n"
5032 "out vec3 aWorldCo;\n"
5033 "\n"
5034 "void main()\n"
5035 "{\n"
5036 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
5037 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
5038 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
5039 "\n"
5040 " vs_motion_out( vproj0, vproj1 );\n"
5041 "\n"
5042 " gl_Position = vproj0;\n"
5043 "\n"
5044 " aUv = a_uv;\n"
5045 " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n"
5046 " aCo = a_co;\n"
5047 " aWorldCo = world_pos0;\n"
5048 "}\n"
5049 ""},
5050 .fs =
5051 {
5052 .orig_file = "shaders/scene_cubemapped.fs",
5053 .static_src =
5054 "uniform sampler2D uTexGarbage;\n"
5055 "uniform sampler2D uTexMain;\n"
5056 "uniform samplerCube uTexCubemap;\n"
5057 "uniform vec3 uCamera;\n"
5058 "uniform vec4 uPlane;\n"
5059 "uniform vec4 uColour;\n"
5060 "\n"
5061 "#line 1 1 \n"
5062 "// :D\n"
5063 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
5064 "\n"
5065 "#line 9 0 \n"
5066 "#line 1 2 \n"
5067 "// :D\n"
5068 "\n"
5069 "in vec2 aUv;\n"
5070 "in vec4 aNorm;\n"
5071 "in vec3 aCo;\n"
5072 "in vec3 aWorldCo;\n"
5073 "\n"
5074 "#line 1 1 \n"
5075 "layout (location = 0) out vec4 oColour;\n"
5076 "\n"
5077 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
5078 "layout (std140) uniform ub_world_lighting\n"
5079 "{\n"
5080 " vec4 g_cube_min;\n"
5081 " vec4 g_cube_inv_range;\n"
5082 "\n"
5083 " vec4 g_water_plane;\n"
5084 " vec4 g_depth_bounds;\n"
5085 "\n"
5086 " vec4 g_daysky_colour;\n"
5087 " vec4 g_nightsky_colour;\n"
5088 " vec4 g_sunset_colour;\n"
5089 " vec4 g_ambient_colour;\n"
5090 " vec4 g_sunset_ambient;\n"
5091 " vec4 g_sun_colour;\n"
5092 " vec4 g_sun_dir;\n"
5093 " vec4 g_board_0;\n"
5094 " vec4 g_board_1;\n"
5095 "\n"
5096 " float g_water_fog;\n"
5097 " float g_time;\n"
5098 " float g_realtime;\n"
5099 " float g_shadow_length;\n"
5100 " float g_shadow_spread;\n"
5101 "\n"
5102 " float g_time_of_day;\n"
5103 " float g_day_phase;\n"
5104 " float g_sunset_phase;\n"
5105 "\n"
5106 " int g_light_preview;\n"
5107 " int g_shadow_samples;\n"
5108 "\n"
5109 " int g_debug_indices;\n"
5110 " int g_debug_complexity;\n"
5111 "};\n"
5112 "\n"
5113 "uniform sampler2D g_world_depth;\n"
5114 "uniform samplerBuffer uLightsArray;\n"
5115 "uniform usampler3D uLightsIndex;\n"
5116 "\n"
5117 "#line 1 1 \n"
5118 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
5119 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
5120 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
5121 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
5122 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
5123 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
5124 "\n"
5125 "const float SUN_ANGLE = 0.0001;\n"
5126 "const float PI = 3.14159265358979323846264;\n"
5127 "\n"
5128 "//struct world_info\n"
5129 "//{\n"
5130 "// float time,\n"
5131 "// time_of_day,\n"
5132 "// day_phase,\n"
5133 "// sunset_phase;\n"
5134 "// \n"
5135 "// vec3 sun_dir;\n"
5136 "//};\n"
5137 "\n"
5138 "vec3 rand33(vec3 p3)\n"
5139 "{\n"
5140 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
5141 " p3 += dot(p3, p3.yxz+33.33);\n"
5142 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
5143 "}\n"
5144 "\n"
5145 "float stars( vec3 rd, float rr, float size ){\n"
5146 " vec3 co = rd * rr;\n"
5147 "\n"
5148 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
5149 "\n"
5150 " float spaces = 1.0 / rr;\n"
5151 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
5152 " a -= mod(a, spaces) - spaces * 0.5;\n"
5153 "\n"
5154 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
5155 " \n"
5156 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
5157 " plane = plane - mod(plane, PI / count);\n"
5158 "\n"
5159 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
5160 "\n"
5161 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
5162 " float ydist = sqrt(rr * rr - level * level);\n"
5163 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
5164 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
5165 " float star = smoothstep(size, 0.0, distance(center, co));\n"
5166 " return star;\n"
5167 "}\n"
5168 "\n"
5169 "float luminance( vec3 v )\n"
5170 "{\n"
5171 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
5172 "}\n"
5173 "\n"
5174 "vec3 clearskies_ambient( vec3 dir )\n"
5175 "{\n"
5176 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
5177 " float sky_gradient = dir.y;\n"
5178 " \n"
5179 " /* Blend phase colours */\n"
5180 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
5181 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
5182 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
5183 " \n"
5184 " /* Add gradient */\n"
5185 " ambient -= sky_gradient * luminance(ambient);\n"
5186 " \n"
5187 " return ambient;\n"
5188 "}\n"
5189 "\n"
5190 "vec3 clearskies_sky( vec3 ray_dir )\n"
5191 "{\n"
5192 " ray_dir.y = abs( ray_dir.y );\n"
5193 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
5194 " \n"
5195 " /* Sun */\n"
5196 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
5197 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
5198 " float sun_shape = pow( sun_size, 2000.0 );\n"
5199 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
5200 " \n"
5201 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
5202 " sun_colour *= sun_shape;\n"
5203 "\n"
5204 " \n"
5205 " float star = 0.0;\n"
5206 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
5207 "\n"
5208 " if( star_blend > 0.001 ){\n"
5209 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
5210 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
5211 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
5212 " }\n"
5213 " }\n"
5214 " \n"
5215 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
5216 " return composite;\n"
5217 "}\n"
5218 "\n"
5219 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
5220 "{\n"
5221 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
5222 "\n"
5223 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
5224 " g_sunset_phase );\n"
5225 "\n"
5226 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
5227 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
5228 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
5229 " ) * g_sun_colour.rgb * g_day_phase;\n"
5230 "\n"
5231 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
5232 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
5233 " g_sunset_phase );\n"
5234 "\n"
5235 " return ambient + (light_sun + sky_reflection) * shadow;\n"
5236 "}\n"
5237 "\n"
5238 "#line 44 0 \n"
5239 "\n"
5240 "float world_depth_sample( vec3 pos )\n"
5241 "{\n"
5242 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
5243 " return texture( g_world_depth, depth_coord ).r;\n"
5244 "}\n"
5245 "\n"
5246 "float world_water_depth( vec3 pos )\n"
5247 "{\n"
5248 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
5249 " return world_depth_sample( pos ) - ref_depth;\n"
5250 "}\n"
5251 "\n"
5252 "float shadow_sample( vec3 co ){\n"
5253 " float height_sample = world_depth_sample( co );\n"
5254 "\n"
5255 " float fdelta = height_sample - co.y;\n"
5256 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
5257 "}\n"
5258 "\n"
5259 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
5260 " if( g_shadow_samples == 0 ){\n"
5261 " return 1.0;\n"
5262 " }\n"
5263 "\n"
5264 " float fspread = g_shadow_spread;\n"
5265 " float flength = g_shadow_length;\n"
5266 "\n"
5267 " float famt = 0.0;\n"
5268 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
5269 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
5270 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
5271 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
5272 "\n"
5273 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
5274 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
5275 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
5276 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
5277 "\n"
5278 " return 1.0 - famt;\n"
5279 "}\n"
5280 "\n"
5281 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
5282 "{\n"
5283 " vec3 specdir = reflect( -dir, wnormal );\n"
5284 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
5285 "}\n"
5286 "\n"
5287 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
5288 " float dist = pow(fdist*0.0010,0.78);\n"
5289 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
5290 "}\n"
5291 "\n"
5292 "vec3 scene_calculate_light( int light_index, \n"
5293 " vec3 halfview, vec3 co, vec3 normal )\n"
5294 "{\n"
5295 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
5296 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
5297 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
5298 "\n"
5299 " vec3 light_delta = light_co.xyz-co;\n"
5300 " float dist2 = dot(light_delta,light_delta);\n"
5301 "\n"
5302 " light_delta = normalize( light_delta );\n"
5303 "\n"
5304 " float quadratic = dist2*100.0;\n"
5305 " float attenuation = 1.0/( 1.0 + quadratic );\n"
5306 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
5307 "\n"
5308 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
5309 "\n"
5310 " if( light_dir.w < 0.999999 ){\n"
5311 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
5312 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
5313 " }\n"
5314 "\n"
5315 " return light_colour.rgb * attenuation * falloff \n"
5316 " * step( g_day_phase, light_colour.w );\n"
5317 "}\n"
5318 "\n"
5319 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
5320 " vec3 halfview, vec3 co, vec3 normal )\n"
5321 "{\n"
5322 " uint light_count = packed_index & 0x3u;\n"
5323 "\n"
5324 " vec3 l = vec3(0.0);\n"
5325 "\n"
5326 " if( light_count >= 1u ){\n"
5327 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
5328 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
5329 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
5330 "\n"
5331 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
5332 "\n"
5333 " if( light_count >= 2u ){\n"
5334 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
5335 "\n"
5336 " if( light_count >= 3u ){\n"
5337 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
5338 " }\n"
5339 " }\n"
5340 " }\n"
5341 "\n"
5342 " return l;\n"
5343 "}\n"
5344 "\n"
5345 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
5346 " float light_mask )\n"
5347 "{\n"
5348 " if( g_light_preview == 1 )\n"
5349 " diffuse = vec3(0.75);\n"
5350 "\n"
5351 " // Lighting\n"
5352 " vec3 halfview = uCamera - co;\n"
5353 " float fdist = length(halfview);\n"
5354 " halfview /= fdist;\n"
5355 "\n"
5356 " float world_shadow = newlight_compute_sun_shadow( \n"
5357 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
5358 "\n"
5359 " vec3 total_light = clearskies_lighting( \n"
5360 " normal, min( light_mask, world_shadow ), halfview );\n"
5361 "\n"
5362 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
5363 " cube_coord = floor( cube_coord );\n"
5364 "\n"
5365 " if( g_debug_indices == 1 )\n"
5366 " {\n"
5367 " return rand33(cube_coord);\n"
5368 " }\n"
5369 "\n"
5370 " if( g_debug_complexity == 1 )\n"
5371 " {\n"
5372 " ivec3 coord = ivec3( cube_coord );\n"
5373 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
5374 "\n"
5375 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
5376 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
5377 " }\n"
5378 "\n"
5379 " // FIXME: this coord should absolutely must be clamped!\n"
5380 " \n"
5381 " ivec3 coord = ivec3( cube_coord );\n"
5382 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
5383 "\n"
5384 " total_light += \n"
5385 " scene_calculate_packed_light_patch( index_sample.x,\n"
5386 " halfview, co, normal ) \n"
5387 " * light_mask;\n"
5388 " total_light += \n"
5389 " scene_calculate_packed_light_patch( index_sample.y,\n"
5390 " halfview, co, normal )\n"
5391 " * light_mask;\n"
5392 "\n"
5393 " // Take a section of the sky function to give us a matching fog colour\n"
5394 "\n"
5395 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
5396 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
5397 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
5398 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
5399 " \n"
5400 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
5401 " sun_colour *= sun_shape;\n"
5402 "\n"
5403 " fog_colour += sun_colour;\n"
5404 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
5405 "}\n"
5406 "\n"
5407 "#line 9 0 \n"
5408 "\n"
5409 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
5410 "{\n"
5411 " vec3 pa = p - a;\n"
5412 " vec3 ba = b - a;\n"
5413 "\n"
5414 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
5415 " return length( pa - ba*h );\n"
5416 "}\n"
5417 "\n"
5418 "float compute_board_shadow()\n"
5419 "{\n"
5420 " // player shadow\n"
5421 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
5422 " g_board_1.xyz )-0.1 );\n"
5423 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
5424 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
5425 "\n"
5426 " return 1.0 - player_shadow*0.8;\n"
5427 "}\n"
5428 "\n"
5429 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
5430 "{\n"
5431 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
5432 "}\n"
5433 "\n"
5434 "#line 10 0 \n"
5435 "#line 1 3 \n"
5436 "const float k_motion_lerp_amount = 0.01;\n"
5437 "\n"
5438 "#line 2 0 \n"
5439 "\n"
5440 "layout (location = 1) out vec2 oMotionVec;\n"
5441 "\n"
5442 "in vec3 aMotionVec0;\n"
5443 "in vec3 aMotionVec1;\n"
5444 "\n"
5445 "void compute_motion_vectors()\n"
5446 "{\n"
5447 " // Write motion vectors\n"
5448 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
5449 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
5450 "\n"
5451 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
5452 "}\n"
5453 "\n"
5454 "#line 11 0 \n"
5455 "\n"
5456 "void main()\n"
5457 "{\n"
5458 " compute_motion_vectors();\n"
5459 "\n"
5460 " vec3 vfrag = vec3(0.5,0.5,0.5);\n"
5461 " vec4 vsamplemain = texture( uTexMain, aUv );\n"
5462 " vec4 wgarbage = texture( uTexGarbage, aCo.xz * 0.0015 + aCo.yx*0.002 );\n"
5463 " vec3 qnorm = aNorm.xyz;\n"
5464 " vfrag = vsamplemain.rgb;\n"
5465 "\n"
5466 " if( g_light_preview == 1 ){\n"
5467 " vfrag = vec3(0.5);\n"
5468 " }\n"
5469 "\n"
5470 " vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n"
5471 " oColour = vec4( vfrag, 1.0 );\n"
5472 "\n"
5473 " vec3 halfdir = normalize( aWorldCo - uCamera );\n"
5474 " vec3 reflectdir = reflect( halfdir, qnorm );\n"
5475 " oColour = mix( oColour, \n"
5476 " vec4(texture(uTexCubemap,reflectdir).rgb * uColour.rgb, 1.0),\n"
5477 " uColour.a*wgarbage.b );\n"
5478 "}\n"
5479 ""},
5480 };
5481
5482 GLuint _uniform_scene_cubemapped_uMdl;
5483 GLuint _uniform_scene_cubemapped_uPv;
5484 GLuint _uniform_scene_cubemapped_uPvmPrev;
5485 GLuint _uniform_scene_cubemapped_uTexGarbage;
5486 GLuint _uniform_scene_cubemapped_uTexMain;
5487 GLuint _uniform_scene_cubemapped_uTexCubemap;
5488 GLuint _uniform_scene_cubemapped_uCamera;
5489 GLuint _uniform_scene_cubemapped_uPlane;
5490 GLuint _uniform_scene_cubemapped_uColour;
5491 GLuint _uniform_scene_cubemapped_g_world_depth;
5492 GLuint _uniform_scene_cubemapped_uLightsArray;
5493 GLuint _uniform_scene_cubemapped_uLightsIndex;
5494 #include "shaders/scene_water.h"
5495 struct vg_shader _shader_scene_water = {
5496 .name = "scene_water",
5497 .vs =
5498 {
5499 .orig_file = "shaders/scene.vs",
5500 .static_src =
5501 "layout (location=0) in vec3 a_co;\n"
5502 "layout (location=1) in vec4 a_norm;\n"
5503 "layout (location=2) in vec2 a_uv;\n"
5504 "\n"
5505 "#line 1 1 \n"
5506 "const float k_motion_lerp_amount = 0.01;\n"
5507 "\n"
5508 "#line 2 0 \n"
5509 "\n"
5510 "out vec3 aMotionVec0;\n"
5511 "out vec3 aMotionVec1;\n"
5512 "\n"
5513 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
5514 "{\n"
5515 " // This magically solves some artifacting errors!\n"
5516 " //\n"
5517 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
5518 "\n"
5519 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
5520 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
5521 "}\n"
5522 "\n"
5523 "#line 6 0 \n"
5524 "\n"
5525 "uniform mat4x3 uMdl;\n"
5526 "uniform mat4 uPv;\n"
5527 "uniform mat4 uPvmPrev;\n"
5528 "\n"
5529 "out vec2 aUv;\n"
5530 "out vec4 aNorm;\n"
5531 "out vec3 aCo;\n"
5532 "out vec3 aWorldCo;\n"
5533 "\n"
5534 "void main()\n"
5535 "{\n"
5536 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
5537 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
5538 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
5539 "\n"
5540 " vs_motion_out( vproj0, vproj1 );\n"
5541 "\n"
5542 " gl_Position = vproj0;\n"
5543 "\n"
5544 " aUv = a_uv;\n"
5545 " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n"
5546 " aCo = a_co;\n"
5547 " aWorldCo = world_pos0;\n"
5548 "}\n"
5549 ""},
5550 .fs =
5551 {
5552 .orig_file = "shaders/scene_water.fs",
5553 .static_src =
5554 "uniform sampler2D uTexMain;\n"
5555 "uniform sampler2D uTexDudv;\n"
5556 "uniform sampler2D uTexBack;\n"
5557 "\n"
5558 "uniform vec2 uInvRes;\n"
5559 "uniform float uTime;\n"
5560 "uniform vec3 uCamera;\n"
5561 "uniform float uSurfaceY;\n"
5562 "uniform vec3 uBoard0;\n"
5563 "uniform vec3 uBoard1;\n"
5564 "\n"
5565 "uniform vec3 uShoreColour;\n"
5566 "uniform vec3 uOceanColour;\n"
5567 "\n"
5568 "#line 1 1 \n"
5569 "// :D\n"
5570 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
5571 "\n"
5572 "#line 16 0 \n"
5573 "#line 1 2 \n"
5574 "// :D\n"
5575 "\n"
5576 "in vec2 aUv;\n"
5577 "in vec4 aNorm;\n"
5578 "in vec3 aCo;\n"
5579 "in vec3 aWorldCo;\n"
5580 "\n"
5581 "#line 1 1 \n"
5582 "layout (location = 0) out vec4 oColour;\n"
5583 "\n"
5584 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
5585 "layout (std140) uniform ub_world_lighting\n"
5586 "{\n"
5587 " vec4 g_cube_min;\n"
5588 " vec4 g_cube_inv_range;\n"
5589 "\n"
5590 " vec4 g_water_plane;\n"
5591 " vec4 g_depth_bounds;\n"
5592 "\n"
5593 " vec4 g_daysky_colour;\n"
5594 " vec4 g_nightsky_colour;\n"
5595 " vec4 g_sunset_colour;\n"
5596 " vec4 g_ambient_colour;\n"
5597 " vec4 g_sunset_ambient;\n"
5598 " vec4 g_sun_colour;\n"
5599 " vec4 g_sun_dir;\n"
5600 " vec4 g_board_0;\n"
5601 " vec4 g_board_1;\n"
5602 "\n"
5603 " float g_water_fog;\n"
5604 " float g_time;\n"
5605 " float g_realtime;\n"
5606 " float g_shadow_length;\n"
5607 " float g_shadow_spread;\n"
5608 "\n"
5609 " float g_time_of_day;\n"
5610 " float g_day_phase;\n"
5611 " float g_sunset_phase;\n"
5612 "\n"
5613 " int g_light_preview;\n"
5614 " int g_shadow_samples;\n"
5615 "\n"
5616 " int g_debug_indices;\n"
5617 " int g_debug_complexity;\n"
5618 "};\n"
5619 "\n"
5620 "uniform sampler2D g_world_depth;\n"
5621 "uniform samplerBuffer uLightsArray;\n"
5622 "uniform usampler3D uLightsIndex;\n"
5623 "\n"
5624 "#line 1 1 \n"
5625 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
5626 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
5627 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
5628 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
5629 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
5630 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
5631 "\n"
5632 "const float SUN_ANGLE = 0.0001;\n"
5633 "const float PI = 3.14159265358979323846264;\n"
5634 "\n"
5635 "//struct world_info\n"
5636 "//{\n"
5637 "// float time,\n"
5638 "// time_of_day,\n"
5639 "// day_phase,\n"
5640 "// sunset_phase;\n"
5641 "// \n"
5642 "// vec3 sun_dir;\n"
5643 "//};\n"
5644 "\n"
5645 "vec3 rand33(vec3 p3)\n"
5646 "{\n"
5647 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
5648 " p3 += dot(p3, p3.yxz+33.33);\n"
5649 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
5650 "}\n"
5651 "\n"
5652 "float stars( vec3 rd, float rr, float size ){\n"
5653 " vec3 co = rd * rr;\n"
5654 "\n"
5655 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
5656 "\n"
5657 " float spaces = 1.0 / rr;\n"
5658 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
5659 " a -= mod(a, spaces) - spaces * 0.5;\n"
5660 "\n"
5661 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
5662 " \n"
5663 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
5664 " plane = plane - mod(plane, PI / count);\n"
5665 "\n"
5666 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
5667 "\n"
5668 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
5669 " float ydist = sqrt(rr * rr - level * level);\n"
5670 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
5671 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
5672 " float star = smoothstep(size, 0.0, distance(center, co));\n"
5673 " return star;\n"
5674 "}\n"
5675 "\n"
5676 "float luminance( vec3 v )\n"
5677 "{\n"
5678 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
5679 "}\n"
5680 "\n"
5681 "vec3 clearskies_ambient( vec3 dir )\n"
5682 "{\n"
5683 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
5684 " float sky_gradient = dir.y;\n"
5685 " \n"
5686 " /* Blend phase colours */\n"
5687 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
5688 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
5689 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
5690 " \n"
5691 " /* Add gradient */\n"
5692 " ambient -= sky_gradient * luminance(ambient);\n"
5693 " \n"
5694 " return ambient;\n"
5695 "}\n"
5696 "\n"
5697 "vec3 clearskies_sky( vec3 ray_dir )\n"
5698 "{\n"
5699 " ray_dir.y = abs( ray_dir.y );\n"
5700 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
5701 " \n"
5702 " /* Sun */\n"
5703 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
5704 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
5705 " float sun_shape = pow( sun_size, 2000.0 );\n"
5706 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
5707 " \n"
5708 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
5709 " sun_colour *= sun_shape;\n"
5710 "\n"
5711 " \n"
5712 " float star = 0.0;\n"
5713 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
5714 "\n"
5715 " if( star_blend > 0.001 ){\n"
5716 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
5717 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
5718 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
5719 " }\n"
5720 " }\n"
5721 " \n"
5722 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
5723 " return composite;\n"
5724 "}\n"
5725 "\n"
5726 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
5727 "{\n"
5728 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
5729 "\n"
5730 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
5731 " g_sunset_phase );\n"
5732 "\n"
5733 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
5734 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
5735 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
5736 " ) * g_sun_colour.rgb * g_day_phase;\n"
5737 "\n"
5738 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
5739 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
5740 " g_sunset_phase );\n"
5741 "\n"
5742 " return ambient + (light_sun + sky_reflection) * shadow;\n"
5743 "}\n"
5744 "\n"
5745 "#line 44 0 \n"
5746 "\n"
5747 "float world_depth_sample( vec3 pos )\n"
5748 "{\n"
5749 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
5750 " return texture( g_world_depth, depth_coord ).r;\n"
5751 "}\n"
5752 "\n"
5753 "float world_water_depth( vec3 pos )\n"
5754 "{\n"
5755 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
5756 " return world_depth_sample( pos ) - ref_depth;\n"
5757 "}\n"
5758 "\n"
5759 "float shadow_sample( vec3 co ){\n"
5760 " float height_sample = world_depth_sample( co );\n"
5761 "\n"
5762 " float fdelta = height_sample - co.y;\n"
5763 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
5764 "}\n"
5765 "\n"
5766 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
5767 " if( g_shadow_samples == 0 ){\n"
5768 " return 1.0;\n"
5769 " }\n"
5770 "\n"
5771 " float fspread = g_shadow_spread;\n"
5772 " float flength = g_shadow_length;\n"
5773 "\n"
5774 " float famt = 0.0;\n"
5775 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
5776 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
5777 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
5778 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
5779 "\n"
5780 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
5781 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
5782 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
5783 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
5784 "\n"
5785 " return 1.0 - famt;\n"
5786 "}\n"
5787 "\n"
5788 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
5789 "{\n"
5790 " vec3 specdir = reflect( -dir, wnormal );\n"
5791 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
5792 "}\n"
5793 "\n"
5794 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
5795 " float dist = pow(fdist*0.0010,0.78);\n"
5796 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
5797 "}\n"
5798 "\n"
5799 "vec3 scene_calculate_light( int light_index, \n"
5800 " vec3 halfview, vec3 co, vec3 normal )\n"
5801 "{\n"
5802 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
5803 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
5804 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
5805 "\n"
5806 " vec3 light_delta = light_co.xyz-co;\n"
5807 " float dist2 = dot(light_delta,light_delta);\n"
5808 "\n"
5809 " light_delta = normalize( light_delta );\n"
5810 "\n"
5811 " float quadratic = dist2*100.0;\n"
5812 " float attenuation = 1.0/( 1.0 + quadratic );\n"
5813 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
5814 "\n"
5815 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
5816 "\n"
5817 " if( light_dir.w < 0.999999 ){\n"
5818 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
5819 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
5820 " }\n"
5821 "\n"
5822 " return light_colour.rgb * attenuation * falloff \n"
5823 " * step( g_day_phase, light_colour.w );\n"
5824 "}\n"
5825 "\n"
5826 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
5827 " vec3 halfview, vec3 co, vec3 normal )\n"
5828 "{\n"
5829 " uint light_count = packed_index & 0x3u;\n"
5830 "\n"
5831 " vec3 l = vec3(0.0);\n"
5832 "\n"
5833 " if( light_count >= 1u ){\n"
5834 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
5835 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
5836 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
5837 "\n"
5838 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
5839 "\n"
5840 " if( light_count >= 2u ){\n"
5841 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
5842 "\n"
5843 " if( light_count >= 3u ){\n"
5844 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
5845 " }\n"
5846 " }\n"
5847 " }\n"
5848 "\n"
5849 " return l;\n"
5850 "}\n"
5851 "\n"
5852 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
5853 " float light_mask )\n"
5854 "{\n"
5855 " if( g_light_preview == 1 )\n"
5856 " diffuse = vec3(0.75);\n"
5857 "\n"
5858 " // Lighting\n"
5859 " vec3 halfview = uCamera - co;\n"
5860 " float fdist = length(halfview);\n"
5861 " halfview /= fdist;\n"
5862 "\n"
5863 " float world_shadow = newlight_compute_sun_shadow( \n"
5864 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
5865 "\n"
5866 " vec3 total_light = clearskies_lighting( \n"
5867 " normal, min( light_mask, world_shadow ), halfview );\n"
5868 "\n"
5869 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
5870 " cube_coord = floor( cube_coord );\n"
5871 "\n"
5872 " if( g_debug_indices == 1 )\n"
5873 " {\n"
5874 " return rand33(cube_coord);\n"
5875 " }\n"
5876 "\n"
5877 " if( g_debug_complexity == 1 )\n"
5878 " {\n"
5879 " ivec3 coord = ivec3( cube_coord );\n"
5880 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
5881 "\n"
5882 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
5883 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
5884 " }\n"
5885 "\n"
5886 " // FIXME: this coord should absolutely must be clamped!\n"
5887 " \n"
5888 " ivec3 coord = ivec3( cube_coord );\n"
5889 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
5890 "\n"
5891 " total_light += \n"
5892 " scene_calculate_packed_light_patch( index_sample.x,\n"
5893 " halfview, co, normal ) \n"
5894 " * light_mask;\n"
5895 " total_light += \n"
5896 " scene_calculate_packed_light_patch( index_sample.y,\n"
5897 " halfview, co, normal )\n"
5898 " * light_mask;\n"
5899 "\n"
5900 " // Take a section of the sky function to give us a matching fog colour\n"
5901 "\n"
5902 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
5903 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
5904 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
5905 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
5906 " \n"
5907 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
5908 " sun_colour *= sun_shape;\n"
5909 "\n"
5910 " fog_colour += sun_colour;\n"
5911 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
5912 "}\n"
5913 "\n"
5914 "#line 9 0 \n"
5915 "\n"
5916 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
5917 "{\n"
5918 " vec3 pa = p - a;\n"
5919 " vec3 ba = b - a;\n"
5920 "\n"
5921 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
5922 " return length( pa - ba*h );\n"
5923 "}\n"
5924 "\n"
5925 "float compute_board_shadow()\n"
5926 "{\n"
5927 " // player shadow\n"
5928 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
5929 " g_board_1.xyz )-0.1 );\n"
5930 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
5931 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
5932 "\n"
5933 " return 1.0 - player_shadow*0.8;\n"
5934 "}\n"
5935 "\n"
5936 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
5937 "{\n"
5938 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
5939 "}\n"
5940 "\n"
5941 "#line 17 0 \n"
5942 "#line 1 3 \n"
5943 "const float k_motion_lerp_amount = 0.01;\n"
5944 "\n"
5945 "#line 2 0 \n"
5946 "\n"
5947 "layout (location = 1) out vec2 oMotionVec;\n"
5948 "\n"
5949 "in vec3 aMotionVec0;\n"
5950 "in vec3 aMotionVec1;\n"
5951 "\n"
5952 "void compute_motion_vectors()\n"
5953 "{\n"
5954 " // Write motion vectors\n"
5955 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
5956 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
5957 "\n"
5958 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
5959 "}\n"
5960 "\n"
5961 "#line 18 0 \n"
5962 "\n"
5963 "vec4 water_surf( vec3 halfview, vec3 vnorm, float depthvalue, \n"
5964 " vec4 beneath, vec4 above )\n"
5965 "{\n"
5966 " vec3 surface_tint = mix(uShoreColour, uOceanColour, depthvalue);\n"
5967 "\n"
5968 " float ffresnel = pow(1.0-dot( vnorm, halfview ),5.0);\n"
5969 "\n"
5970 " vec3 lightdir = vec3(0.95,0.0,-0.3);\n"
5971 " vec3 specdir = reflect( -lightdir, vnorm );\n"
5972 " float spec = pow(max(dot(halfview,specdir),0.0),20.0)*0.3;\n"
5973 " \n"
5974 " // Depth \n"
5975 " float depthblend = pow( beneath.r, 0.8 );\n"
5976 "\n"
5977 " // Composite\n"
5978 " vec3 vsurface = mix(surface_tint, above.rgb, ffresnel );\n"
5979 " //vsurface += spec;\n"
5980 "\n"
5981 " return vec4( vsurface,depthblend );\n"
5982 "}\n"
5983 "\n"
5984 "void main()\n"
5985 "{\n"
5986 " compute_motion_vectors();\n"
5987 "\n"
5988 " // Create texture coords\n"
5989 " vec2 ssuv = gl_FragCoord.xy*uInvRes;\n"
5990 " \n"
5991 " // Surface colour composite\n"
5992 " float depthvalue = clamp( -world_water_depth(aCo)*(1.0/25.0), 0.0,1.0 );\n"
5993 "\n"
5994 " vec2 world_coord = aCo.xz * 0.008;\n"
5995 " vec4 time_offsets = vec4( uTime ) * vec4( 0.008, 0.006, 0.003, 0.03 );\n"
5996 " vec4 dudva = texture( uTexDudv, world_coord + time_offsets.xy )-0.5;\n"
5997 " vec4 dudvb = texture( uTexDudv, world_coord *7.0 - time_offsets.zw )-0.5;\n"
5998 "\n"
5999 " vec3 surfnorm = dudva.rgb + dudvb.rgb;\n"
6000 " surfnorm = normalize(vec3(0.0,1.0,0.0) + dudva.xyz*0.4 + dudvb.xyz*0.1);\n"
6001 " \n"
6002 " // Foam\n"
6003 " float fband = fract( aCo.z*0.02+uTime*0.1+depthvalue*10.0 );\n"
6004 " fband = step( fband+dudva.a*0.8, 0.3 ) * max((1.0-depthvalue*4.0),0.0);\n"
6005 "\n"
6006 " // Lighting\n"
6007 " vec3 halfview = -normalize( aCo-uCamera );\n"
6008 "\n"
6009 " // Sample textures\n"
6010 " vec4 above = texture( uTexMain, ssuv+ surfnorm.xz*0.2 );\n"
6011 " vec4 beneath = texture( uTexBack, ssuv );\n"
6012 "\n"
6013 " // Fog\n"
6014 " float fdist = pow(length( aCo.xz-uCamera.xz ) * 0.00047, 2.6);\n"
6015 "\n"
6016 " // Composite\n"
6017 " vec4 vsurface = water_surf( halfview, surfnorm, depthvalue, beneath, above );\n"
6018 " vsurface.a -= fdist;\n"
6019 " oColour = mix( vsurface, vec4(1.0,1.0,1.0,0.5), fband );\n"
6020 " oColour.rgb = scene_compute_lighting( oColour.rgb, aNorm.xyz, aWorldCo );\n"
6021 "}\n"
6022 ""},
6023 };
6024
6025 GLuint _uniform_scene_water_uMdl;
6026 GLuint _uniform_scene_water_uPv;
6027 GLuint _uniform_scene_water_uPvmPrev;
6028 GLuint _uniform_scene_water_uTexMain;
6029 GLuint _uniform_scene_water_uTexDudv;
6030 GLuint _uniform_scene_water_uTexBack;
6031 GLuint _uniform_scene_water_uInvRes;
6032 GLuint _uniform_scene_water_uTime;
6033 GLuint _uniform_scene_water_uCamera;
6034 GLuint _uniform_scene_water_uSurfaceY;
6035 GLuint _uniform_scene_water_uBoard0;
6036 GLuint _uniform_scene_water_uBoard1;
6037 GLuint _uniform_scene_water_uShoreColour;
6038 GLuint _uniform_scene_water_uOceanColour;
6039 GLuint _uniform_scene_water_g_world_depth;
6040 GLuint _uniform_scene_water_uLightsArray;
6041 GLuint _uniform_scene_water_uLightsIndex;
6042 #include "shaders/scene_water_fast.h"
6043 struct vg_shader _shader_scene_water_fast = {
6044 .name = "scene_water_fast",
6045 .vs =
6046 {
6047 .orig_file = "shaders/scene.vs",
6048 .static_src =
6049 "layout (location=0) in vec3 a_co;\n"
6050 "layout (location=1) in vec4 a_norm;\n"
6051 "layout (location=2) in vec2 a_uv;\n"
6052 "\n"
6053 "#line 1 1 \n"
6054 "const float k_motion_lerp_amount = 0.01;\n"
6055 "\n"
6056 "#line 2 0 \n"
6057 "\n"
6058 "out vec3 aMotionVec0;\n"
6059 "out vec3 aMotionVec1;\n"
6060 "\n"
6061 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
6062 "{\n"
6063 " // This magically solves some artifacting errors!\n"
6064 " //\n"
6065 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
6066 "\n"
6067 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
6068 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
6069 "}\n"
6070 "\n"
6071 "#line 6 0 \n"
6072 "\n"
6073 "uniform mat4x3 uMdl;\n"
6074 "uniform mat4 uPv;\n"
6075 "uniform mat4 uPvmPrev;\n"
6076 "\n"
6077 "out vec2 aUv;\n"
6078 "out vec4 aNorm;\n"
6079 "out vec3 aCo;\n"
6080 "out vec3 aWorldCo;\n"
6081 "\n"
6082 "void main()\n"
6083 "{\n"
6084 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
6085 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
6086 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
6087 "\n"
6088 " vs_motion_out( vproj0, vproj1 );\n"
6089 "\n"
6090 " gl_Position = vproj0;\n"
6091 "\n"
6092 " aUv = a_uv;\n"
6093 " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n"
6094 " aCo = a_co;\n"
6095 " aWorldCo = world_pos0;\n"
6096 "}\n"
6097 ""},
6098 .fs =
6099 {
6100 .orig_file = "shaders/scene_water_fast.fs",
6101 .static_src =
6102 "uniform sampler2D uTexDudv;\n"
6103 "\n"
6104 "uniform float uTime;\n"
6105 "uniform vec3 uCamera;\n"
6106 "uniform float uSurfaceY;\n"
6107 "uniform vec3 uBoard0;\n"
6108 "uniform vec3 uBoard1;\n"
6109 "\n"
6110 "uniform vec3 uShoreColour;\n"
6111 "uniform vec3 uOceanColour;\n"
6112 "\n"
6113 "#line 1 1 \n"
6114 "// :D\n"
6115 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
6116 "\n"
6117 "#line 13 0 \n"
6118 "#line 1 2 \n"
6119 "// :D\n"
6120 "\n"
6121 "in vec2 aUv;\n"
6122 "in vec4 aNorm;\n"
6123 "in vec3 aCo;\n"
6124 "in vec3 aWorldCo;\n"
6125 "\n"
6126 "#line 1 1 \n"
6127 "layout (location = 0) out vec4 oColour;\n"
6128 "\n"
6129 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
6130 "layout (std140) uniform ub_world_lighting\n"
6131 "{\n"
6132 " vec4 g_cube_min;\n"
6133 " vec4 g_cube_inv_range;\n"
6134 "\n"
6135 " vec4 g_water_plane;\n"
6136 " vec4 g_depth_bounds;\n"
6137 "\n"
6138 " vec4 g_daysky_colour;\n"
6139 " vec4 g_nightsky_colour;\n"
6140 " vec4 g_sunset_colour;\n"
6141 " vec4 g_ambient_colour;\n"
6142 " vec4 g_sunset_ambient;\n"
6143 " vec4 g_sun_colour;\n"
6144 " vec4 g_sun_dir;\n"
6145 " vec4 g_board_0;\n"
6146 " vec4 g_board_1;\n"
6147 "\n"
6148 " float g_water_fog;\n"
6149 " float g_time;\n"
6150 " float g_realtime;\n"
6151 " float g_shadow_length;\n"
6152 " float g_shadow_spread;\n"
6153 "\n"
6154 " float g_time_of_day;\n"
6155 " float g_day_phase;\n"
6156 " float g_sunset_phase;\n"
6157 "\n"
6158 " int g_light_preview;\n"
6159 " int g_shadow_samples;\n"
6160 "\n"
6161 " int g_debug_indices;\n"
6162 " int g_debug_complexity;\n"
6163 "};\n"
6164 "\n"
6165 "uniform sampler2D g_world_depth;\n"
6166 "uniform samplerBuffer uLightsArray;\n"
6167 "uniform usampler3D uLightsIndex;\n"
6168 "\n"
6169 "#line 1 1 \n"
6170 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
6171 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
6172 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
6173 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
6174 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
6175 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
6176 "\n"
6177 "const float SUN_ANGLE = 0.0001;\n"
6178 "const float PI = 3.14159265358979323846264;\n"
6179 "\n"
6180 "//struct world_info\n"
6181 "//{\n"
6182 "// float time,\n"
6183 "// time_of_day,\n"
6184 "// day_phase,\n"
6185 "// sunset_phase;\n"
6186 "// \n"
6187 "// vec3 sun_dir;\n"
6188 "//};\n"
6189 "\n"
6190 "vec3 rand33(vec3 p3)\n"
6191 "{\n"
6192 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
6193 " p3 += dot(p3, p3.yxz+33.33);\n"
6194 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
6195 "}\n"
6196 "\n"
6197 "float stars( vec3 rd, float rr, float size ){\n"
6198 " vec3 co = rd * rr;\n"
6199 "\n"
6200 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
6201 "\n"
6202 " float spaces = 1.0 / rr;\n"
6203 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
6204 " a -= mod(a, spaces) - spaces * 0.5;\n"
6205 "\n"
6206 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
6207 " \n"
6208 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
6209 " plane = plane - mod(plane, PI / count);\n"
6210 "\n"
6211 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
6212 "\n"
6213 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
6214 " float ydist = sqrt(rr * rr - level * level);\n"
6215 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
6216 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
6217 " float star = smoothstep(size, 0.0, distance(center, co));\n"
6218 " return star;\n"
6219 "}\n"
6220 "\n"
6221 "float luminance( vec3 v )\n"
6222 "{\n"
6223 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
6224 "}\n"
6225 "\n"
6226 "vec3 clearskies_ambient( vec3 dir )\n"
6227 "{\n"
6228 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
6229 " float sky_gradient = dir.y;\n"
6230 " \n"
6231 " /* Blend phase colours */\n"
6232 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
6233 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
6234 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
6235 " \n"
6236 " /* Add gradient */\n"
6237 " ambient -= sky_gradient * luminance(ambient);\n"
6238 " \n"
6239 " return ambient;\n"
6240 "}\n"
6241 "\n"
6242 "vec3 clearskies_sky( vec3 ray_dir )\n"
6243 "{\n"
6244 " ray_dir.y = abs( ray_dir.y );\n"
6245 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
6246 " \n"
6247 " /* Sun */\n"
6248 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
6249 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
6250 " float sun_shape = pow( sun_size, 2000.0 );\n"
6251 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
6252 " \n"
6253 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
6254 " sun_colour *= sun_shape;\n"
6255 "\n"
6256 " \n"
6257 " float star = 0.0;\n"
6258 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
6259 "\n"
6260 " if( star_blend > 0.001 ){\n"
6261 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
6262 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
6263 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
6264 " }\n"
6265 " }\n"
6266 " \n"
6267 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
6268 " return composite;\n"
6269 "}\n"
6270 "\n"
6271 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
6272 "{\n"
6273 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
6274 "\n"
6275 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
6276 " g_sunset_phase );\n"
6277 "\n"
6278 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
6279 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
6280 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
6281 " ) * g_sun_colour.rgb * g_day_phase;\n"
6282 "\n"
6283 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
6284 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
6285 " g_sunset_phase );\n"
6286 "\n"
6287 " return ambient + (light_sun + sky_reflection) * shadow;\n"
6288 "}\n"
6289 "\n"
6290 "#line 44 0 \n"
6291 "\n"
6292 "float world_depth_sample( vec3 pos )\n"
6293 "{\n"
6294 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
6295 " return texture( g_world_depth, depth_coord ).r;\n"
6296 "}\n"
6297 "\n"
6298 "float world_water_depth( vec3 pos )\n"
6299 "{\n"
6300 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
6301 " return world_depth_sample( pos ) - ref_depth;\n"
6302 "}\n"
6303 "\n"
6304 "float shadow_sample( vec3 co ){\n"
6305 " float height_sample = world_depth_sample( co );\n"
6306 "\n"
6307 " float fdelta = height_sample - co.y;\n"
6308 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
6309 "}\n"
6310 "\n"
6311 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
6312 " if( g_shadow_samples == 0 ){\n"
6313 " return 1.0;\n"
6314 " }\n"
6315 "\n"
6316 " float fspread = g_shadow_spread;\n"
6317 " float flength = g_shadow_length;\n"
6318 "\n"
6319 " float famt = 0.0;\n"
6320 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
6321 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
6322 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
6323 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
6324 "\n"
6325 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
6326 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
6327 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
6328 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
6329 "\n"
6330 " return 1.0 - famt;\n"
6331 "}\n"
6332 "\n"
6333 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
6334 "{\n"
6335 " vec3 specdir = reflect( -dir, wnormal );\n"
6336 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
6337 "}\n"
6338 "\n"
6339 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
6340 " float dist = pow(fdist*0.0010,0.78);\n"
6341 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
6342 "}\n"
6343 "\n"
6344 "vec3 scene_calculate_light( int light_index, \n"
6345 " vec3 halfview, vec3 co, vec3 normal )\n"
6346 "{\n"
6347 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
6348 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
6349 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
6350 "\n"
6351 " vec3 light_delta = light_co.xyz-co;\n"
6352 " float dist2 = dot(light_delta,light_delta);\n"
6353 "\n"
6354 " light_delta = normalize( light_delta );\n"
6355 "\n"
6356 " float quadratic = dist2*100.0;\n"
6357 " float attenuation = 1.0/( 1.0 + quadratic );\n"
6358 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
6359 "\n"
6360 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
6361 "\n"
6362 " if( light_dir.w < 0.999999 ){\n"
6363 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
6364 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
6365 " }\n"
6366 "\n"
6367 " return light_colour.rgb * attenuation * falloff \n"
6368 " * step( g_day_phase, light_colour.w );\n"
6369 "}\n"
6370 "\n"
6371 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
6372 " vec3 halfview, vec3 co, vec3 normal )\n"
6373 "{\n"
6374 " uint light_count = packed_index & 0x3u;\n"
6375 "\n"
6376 " vec3 l = vec3(0.0);\n"
6377 "\n"
6378 " if( light_count >= 1u ){\n"
6379 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
6380 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
6381 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
6382 "\n"
6383 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
6384 "\n"
6385 " if( light_count >= 2u ){\n"
6386 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
6387 "\n"
6388 " if( light_count >= 3u ){\n"
6389 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
6390 " }\n"
6391 " }\n"
6392 " }\n"
6393 "\n"
6394 " return l;\n"
6395 "}\n"
6396 "\n"
6397 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
6398 " float light_mask )\n"
6399 "{\n"
6400 " if( g_light_preview == 1 )\n"
6401 " diffuse = vec3(0.75);\n"
6402 "\n"
6403 " // Lighting\n"
6404 " vec3 halfview = uCamera - co;\n"
6405 " float fdist = length(halfview);\n"
6406 " halfview /= fdist;\n"
6407 "\n"
6408 " float world_shadow = newlight_compute_sun_shadow( \n"
6409 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
6410 "\n"
6411 " vec3 total_light = clearskies_lighting( \n"
6412 " normal, min( light_mask, world_shadow ), halfview );\n"
6413 "\n"
6414 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
6415 " cube_coord = floor( cube_coord );\n"
6416 "\n"
6417 " if( g_debug_indices == 1 )\n"
6418 " {\n"
6419 " return rand33(cube_coord);\n"
6420 " }\n"
6421 "\n"
6422 " if( g_debug_complexity == 1 )\n"
6423 " {\n"
6424 " ivec3 coord = ivec3( cube_coord );\n"
6425 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
6426 "\n"
6427 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
6428 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
6429 " }\n"
6430 "\n"
6431 " // FIXME: this coord should absolutely must be clamped!\n"
6432 " \n"
6433 " ivec3 coord = ivec3( cube_coord );\n"
6434 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
6435 "\n"
6436 " total_light += \n"
6437 " scene_calculate_packed_light_patch( index_sample.x,\n"
6438 " halfview, co, normal ) \n"
6439 " * light_mask;\n"
6440 " total_light += \n"
6441 " scene_calculate_packed_light_patch( index_sample.y,\n"
6442 " halfview, co, normal )\n"
6443 " * light_mask;\n"
6444 "\n"
6445 " // Take a section of the sky function to give us a matching fog colour\n"
6446 "\n"
6447 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
6448 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
6449 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
6450 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
6451 " \n"
6452 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
6453 " sun_colour *= sun_shape;\n"
6454 "\n"
6455 " fog_colour += sun_colour;\n"
6456 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
6457 "}\n"
6458 "\n"
6459 "#line 9 0 \n"
6460 "\n"
6461 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
6462 "{\n"
6463 " vec3 pa = p - a;\n"
6464 " vec3 ba = b - a;\n"
6465 "\n"
6466 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
6467 " return length( pa - ba*h );\n"
6468 "}\n"
6469 "\n"
6470 "float compute_board_shadow()\n"
6471 "{\n"
6472 " // player shadow\n"
6473 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
6474 " g_board_1.xyz )-0.1 );\n"
6475 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
6476 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
6477 "\n"
6478 " return 1.0 - player_shadow*0.8;\n"
6479 "}\n"
6480 "\n"
6481 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
6482 "{\n"
6483 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
6484 "}\n"
6485 "\n"
6486 "#line 14 0 \n"
6487 "#line 1 3 \n"
6488 "const float k_motion_lerp_amount = 0.01;\n"
6489 "\n"
6490 "#line 2 0 \n"
6491 "\n"
6492 "layout (location = 1) out vec2 oMotionVec;\n"
6493 "\n"
6494 "in vec3 aMotionVec0;\n"
6495 "in vec3 aMotionVec1;\n"
6496 "\n"
6497 "void compute_motion_vectors()\n"
6498 "{\n"
6499 " // Write motion vectors\n"
6500 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
6501 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
6502 "\n"
6503 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
6504 "}\n"
6505 "\n"
6506 "#line 15 0 \n"
6507 "\n"
6508 "vec4 water_surf( vec3 halfview, vec3 vnorm, float depthvalue )\n"
6509 "{\n"
6510 " vec3 surface_tint = mix(uShoreColour, uOceanColour, depthvalue);\n"
6511 "\n"
6512 " float ffresnel = pow(1.0-dot( vnorm, halfview ),5.0);\n"
6513 "\n"
6514 " vec3 lightdir = vec3(0.95,0.0,-0.3);\n"
6515 " vec3 specdir = reflect( -lightdir, vnorm );\n"
6516 " float spec = pow(max(dot(halfview,specdir),0.0),20.0)*0.3;\n"
6517 " \n"
6518 " return vec4( surface_tint + spec, max(min(depthvalue*4.0, 1.0),0.0) );\n"
6519 "}\n"
6520 "\n"
6521 "void main()\n"
6522 "{\n"
6523 " compute_motion_vectors();\n"
6524 "\n"
6525 " // Surface colour composite\n"
6526 " float depthvalue = clamp( -world_water_depth( aCo )*(1.0/25.0), 0.0, 1.0 );\n"
6527 "\n"
6528 " vec2 world_coord = aCo.xz * 0.008;\n"
6529 " vec4 time_offsets = vec4( uTime ) * vec4( 0.008, 0.006, 0.003, 0.03 );\n"
6530 " vec4 dudva = texture( uTexDudv, world_coord + time_offsets.xy )-0.5;\n"
6531 " vec4 dudvb = texture( uTexDudv, world_coord *7.0 - time_offsets.zw )-0.5;\n"
6532 "\n"
6533 " vec3 surfnorm = dudva.rgb + dudvb.rgb;\n"
6534 " surfnorm = normalize(vec3(0.0,1.0,0.0) + dudva.xyz*0.4 + dudvb.xyz*0.1);\n"
6535 " \n"
6536 " // Foam\n"
6537 " float fband = fract( aCo.z*0.02+uTime*0.1+depthvalue*10.0 );\n"
6538 " fband = step( fband+dudva.a*0.8, 0.3 ) * max((1.0-depthvalue*4.0),0.0);\n"
6539 "\n"
6540 " // Lighting\n"
6541 " vec3 halfview = -normalize( aCo-uCamera );\n"
6542 "\n"
6543 " // Fog\n"
6544 " float fdist = pow(length( aCo.xz-uCamera.xz ) * 0.00047, 2.6);\n"
6545 "\n"
6546 " // Composite\n"
6547 " vec4 vsurface = water_surf( halfview, surfnorm, depthvalue );\n"
6548 " vsurface.a -= fdist;\n"
6549 " oColour = mix( vsurface, vec4(1.0,1.0,1.0,0.5), fband );\n"
6550 " oColour.rgb = scene_compute_lighting( oColour.rgb, aNorm.xyz, aWorldCo );\n"
6551 "}\n"
6552 ""},
6553 };
6554
6555 GLuint _uniform_scene_water_fast_uMdl;
6556 GLuint _uniform_scene_water_fast_uPv;
6557 GLuint _uniform_scene_water_fast_uPvmPrev;
6558 GLuint _uniform_scene_water_fast_uTexDudv;
6559 GLuint _uniform_scene_water_fast_uTime;
6560 GLuint _uniform_scene_water_fast_uCamera;
6561 GLuint _uniform_scene_water_fast_uSurfaceY;
6562 GLuint _uniform_scene_water_fast_uBoard0;
6563 GLuint _uniform_scene_water_fast_uBoard1;
6564 GLuint _uniform_scene_water_fast_uShoreColour;
6565 GLuint _uniform_scene_water_fast_uOceanColour;
6566 GLuint _uniform_scene_water_fast_g_world_depth;
6567 GLuint _uniform_scene_water_fast_uLightsArray;
6568 GLuint _uniform_scene_water_fast_uLightsIndex;
6569 #include "shaders/scene_scoretext.h"
6570 struct vg_shader _shader_scene_scoretext = {
6571 .name = "scene_scoretext",
6572 .vs =
6573 {
6574 .orig_file = "shaders/scene_sfd.vs",
6575 .static_src =
6576 "layout (location=0) in vec3 a_co;\n"
6577 "layout (location=1) in vec4 a_norm;\n"
6578 "layout (location=2) in vec2 a_uv;\n"
6579 "\n"
6580 "#line 1 1 \n"
6581 "const float k_motion_lerp_amount = 0.01;\n"
6582 "\n"
6583 "#line 2 0 \n"
6584 "\n"
6585 "out vec3 aMotionVec0;\n"
6586 "out vec3 aMotionVec1;\n"
6587 "\n"
6588 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
6589 "{\n"
6590 " // This magically solves some artifacting errors!\n"
6591 " //\n"
6592 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
6593 "\n"
6594 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
6595 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
6596 "}\n"
6597 "\n"
6598 "#line 6 0 \n"
6599 "\n"
6600 "uniform mat4x3 uMdl;\n"
6601 "uniform mat4 uPv;\n"
6602 "uniform mat4 uPvmPrev;\n"
6603 "uniform vec3 uInfo;\n"
6604 "\n"
6605 "out vec2 aUv;\n"
6606 "out vec4 aNorm;\n"
6607 "out vec3 aCo;\n"
6608 "out vec3 aWorldCo;\n"
6609 "\n"
6610 "void main()\n"
6611 "{\n"
6612 " float w = ((a_norm.w)-0.5)*2.0 + fract(uInfo.z) - 0.0;\n"
6613 " float c = -cos(w*0.6);\n"
6614 " float s = -sin(w*0.6);\n"
6615 " float r = 0.2;\n"
6616 "\n"
6617 " float w1 = clamp( w*4.0 - a_co.y*10.0, -1.0, 1.0 ) * (3.14159265*0.5);\n"
6618 " float c1 = cos(w1);\n"
6619 " float s1 = sin(w1);\n"
6620 "\n"
6621 " float yoff = step(0.01,fract(uInfo.z))*-0.5;\n"
6622 "\n"
6623 " mat4x3 mlocal;\n"
6624 " mlocal[0] = vec3(c1, s1,0.0);\n"
6625 " mlocal[1] = vec3(-s1,c1,0.0);\n"
6626 " mlocal[2] = vec3(0.0,0.0,1.0);\n"
6627 " mlocal[3] = vec3(c*r,uInfo.y*0.875 + s*r,uInfo.x*0.5);\n"
6628 "\n"
6629 " vec3 local_pos0 = mlocal * vec4( a_co, 1.0 );\n"
6630 " vec3 world_pos0 = uMdl * vec4( local_pos0, 1.0 );\n"
6631 "\n"
6632 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
6633 " vec4 vproj1 = uPvmPrev * vec4( local_pos0, 1.0 );\n"
6634 "\n"
6635 " vs_motion_out( vproj0, vproj1 );\n"
6636 "\n"
6637 " gl_Position = vproj0;\n"
6638 "\n"
6639 " aUv = a_uv + vec2( floor(uInfo.z+0.5)*(1.0/64.0), yoff );\n"
6640 " aNorm = vec4( mat3(uMdl) * mat3(mlocal) * a_norm.xyz, a_norm.w );\n"
6641 " aCo = a_co;\n"
6642 " aWorldCo = world_pos0;\n"
6643 "}\n"
6644 ""},
6645 .fs =
6646 {
6647 .orig_file = "shaders/scene_standard.fs",
6648 .static_src =
6649 "uniform sampler2D uTexGarbage;\n"
6650 "uniform sampler2D uTexMain;\n"
6651 "uniform vec3 uCamera;\n"
6652 "uniform vec4 uPlane;\n"
6653 "\n"
6654 "#line 1 1 \n"
6655 "// :D\n"
6656 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
6657 "\n"
6658 "#line 7 0 \n"
6659 "#line 1 2 \n"
6660 "// :D\n"
6661 "\n"
6662 "in vec2 aUv;\n"
6663 "in vec4 aNorm;\n"
6664 "in vec3 aCo;\n"
6665 "in vec3 aWorldCo;\n"
6666 "\n"
6667 "#line 1 1 \n"
6668 "layout (location = 0) out vec4 oColour;\n"
6669 "\n"
6670 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
6671 "layout (std140) uniform ub_world_lighting\n"
6672 "{\n"
6673 " vec4 g_cube_min;\n"
6674 " vec4 g_cube_inv_range;\n"
6675 "\n"
6676 " vec4 g_water_plane;\n"
6677 " vec4 g_depth_bounds;\n"
6678 "\n"
6679 " vec4 g_daysky_colour;\n"
6680 " vec4 g_nightsky_colour;\n"
6681 " vec4 g_sunset_colour;\n"
6682 " vec4 g_ambient_colour;\n"
6683 " vec4 g_sunset_ambient;\n"
6684 " vec4 g_sun_colour;\n"
6685 " vec4 g_sun_dir;\n"
6686 " vec4 g_board_0;\n"
6687 " vec4 g_board_1;\n"
6688 "\n"
6689 " float g_water_fog;\n"
6690 " float g_time;\n"
6691 " float g_realtime;\n"
6692 " float g_shadow_length;\n"
6693 " float g_shadow_spread;\n"
6694 "\n"
6695 " float g_time_of_day;\n"
6696 " float g_day_phase;\n"
6697 " float g_sunset_phase;\n"
6698 "\n"
6699 " int g_light_preview;\n"
6700 " int g_shadow_samples;\n"
6701 "\n"
6702 " int g_debug_indices;\n"
6703 " int g_debug_complexity;\n"
6704 "};\n"
6705 "\n"
6706 "uniform sampler2D g_world_depth;\n"
6707 "uniform samplerBuffer uLightsArray;\n"
6708 "uniform usampler3D uLightsIndex;\n"
6709 "\n"
6710 "#line 1 1 \n"
6711 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
6712 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
6713 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
6714 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
6715 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
6716 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
6717 "\n"
6718 "const float SUN_ANGLE = 0.0001;\n"
6719 "const float PI = 3.14159265358979323846264;\n"
6720 "\n"
6721 "//struct world_info\n"
6722 "//{\n"
6723 "// float time,\n"
6724 "// time_of_day,\n"
6725 "// day_phase,\n"
6726 "// sunset_phase;\n"
6727 "// \n"
6728 "// vec3 sun_dir;\n"
6729 "//};\n"
6730 "\n"
6731 "vec3 rand33(vec3 p3)\n"
6732 "{\n"
6733 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
6734 " p3 += dot(p3, p3.yxz+33.33);\n"
6735 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
6736 "}\n"
6737 "\n"
6738 "float stars( vec3 rd, float rr, float size ){\n"
6739 " vec3 co = rd * rr;\n"
6740 "\n"
6741 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
6742 "\n"
6743 " float spaces = 1.0 / rr;\n"
6744 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
6745 " a -= mod(a, spaces) - spaces * 0.5;\n"
6746 "\n"
6747 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
6748 " \n"
6749 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
6750 " plane = plane - mod(plane, PI / count);\n"
6751 "\n"
6752 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
6753 "\n"
6754 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
6755 " float ydist = sqrt(rr * rr - level * level);\n"
6756 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
6757 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
6758 " float star = smoothstep(size, 0.0, distance(center, co));\n"
6759 " return star;\n"
6760 "}\n"
6761 "\n"
6762 "float luminance( vec3 v )\n"
6763 "{\n"
6764 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
6765 "}\n"
6766 "\n"
6767 "vec3 clearskies_ambient( vec3 dir )\n"
6768 "{\n"
6769 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
6770 " float sky_gradient = dir.y;\n"
6771 " \n"
6772 " /* Blend phase colours */\n"
6773 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
6774 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
6775 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
6776 " \n"
6777 " /* Add gradient */\n"
6778 " ambient -= sky_gradient * luminance(ambient);\n"
6779 " \n"
6780 " return ambient;\n"
6781 "}\n"
6782 "\n"
6783 "vec3 clearskies_sky( vec3 ray_dir )\n"
6784 "{\n"
6785 " ray_dir.y = abs( ray_dir.y );\n"
6786 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
6787 " \n"
6788 " /* Sun */\n"
6789 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
6790 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
6791 " float sun_shape = pow( sun_size, 2000.0 );\n"
6792 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
6793 " \n"
6794 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
6795 " sun_colour *= sun_shape;\n"
6796 "\n"
6797 " \n"
6798 " float star = 0.0;\n"
6799 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
6800 "\n"
6801 " if( star_blend > 0.001 ){\n"
6802 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
6803 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
6804 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
6805 " }\n"
6806 " }\n"
6807 " \n"
6808 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
6809 " return composite;\n"
6810 "}\n"
6811 "\n"
6812 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
6813 "{\n"
6814 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
6815 "\n"
6816 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
6817 " g_sunset_phase );\n"
6818 "\n"
6819 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
6820 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
6821 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
6822 " ) * g_sun_colour.rgb * g_day_phase;\n"
6823 "\n"
6824 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
6825 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
6826 " g_sunset_phase );\n"
6827 "\n"
6828 " return ambient + (light_sun + sky_reflection) * shadow;\n"
6829 "}\n"
6830 "\n"
6831 "#line 44 0 \n"
6832 "\n"
6833 "float world_depth_sample( vec3 pos )\n"
6834 "{\n"
6835 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
6836 " return texture( g_world_depth, depth_coord ).r;\n"
6837 "}\n"
6838 "\n"
6839 "float world_water_depth( vec3 pos )\n"
6840 "{\n"
6841 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
6842 " return world_depth_sample( pos ) - ref_depth;\n"
6843 "}\n"
6844 "\n"
6845 "float shadow_sample( vec3 co ){\n"
6846 " float height_sample = world_depth_sample( co );\n"
6847 "\n"
6848 " float fdelta = height_sample - co.y;\n"
6849 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
6850 "}\n"
6851 "\n"
6852 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
6853 " if( g_shadow_samples == 0 ){\n"
6854 " return 1.0;\n"
6855 " }\n"
6856 "\n"
6857 " float fspread = g_shadow_spread;\n"
6858 " float flength = g_shadow_length;\n"
6859 "\n"
6860 " float famt = 0.0;\n"
6861 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
6862 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
6863 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
6864 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
6865 "\n"
6866 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
6867 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
6868 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
6869 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
6870 "\n"
6871 " return 1.0 - famt;\n"
6872 "}\n"
6873 "\n"
6874 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
6875 "{\n"
6876 " vec3 specdir = reflect( -dir, wnormal );\n"
6877 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
6878 "}\n"
6879 "\n"
6880 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
6881 " float dist = pow(fdist*0.0010,0.78);\n"
6882 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
6883 "}\n"
6884 "\n"
6885 "vec3 scene_calculate_light( int light_index, \n"
6886 " vec3 halfview, vec3 co, vec3 normal )\n"
6887 "{\n"
6888 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
6889 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
6890 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
6891 "\n"
6892 " vec3 light_delta = light_co.xyz-co;\n"
6893 " float dist2 = dot(light_delta,light_delta);\n"
6894 "\n"
6895 " light_delta = normalize( light_delta );\n"
6896 "\n"
6897 " float quadratic = dist2*100.0;\n"
6898 " float attenuation = 1.0/( 1.0 + quadratic );\n"
6899 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
6900 "\n"
6901 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
6902 "\n"
6903 " if( light_dir.w < 0.999999 ){\n"
6904 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
6905 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
6906 " }\n"
6907 "\n"
6908 " return light_colour.rgb * attenuation * falloff \n"
6909 " * step( g_day_phase, light_colour.w );\n"
6910 "}\n"
6911 "\n"
6912 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
6913 " vec3 halfview, vec3 co, vec3 normal )\n"
6914 "{\n"
6915 " uint light_count = packed_index & 0x3u;\n"
6916 "\n"
6917 " vec3 l = vec3(0.0);\n"
6918 "\n"
6919 " if( light_count >= 1u ){\n"
6920 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
6921 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
6922 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
6923 "\n"
6924 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
6925 "\n"
6926 " if( light_count >= 2u ){\n"
6927 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
6928 "\n"
6929 " if( light_count >= 3u ){\n"
6930 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
6931 " }\n"
6932 " }\n"
6933 " }\n"
6934 "\n"
6935 " return l;\n"
6936 "}\n"
6937 "\n"
6938 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
6939 " float light_mask )\n"
6940 "{\n"
6941 " if( g_light_preview == 1 )\n"
6942 " diffuse = vec3(0.75);\n"
6943 "\n"
6944 " // Lighting\n"
6945 " vec3 halfview = uCamera - co;\n"
6946 " float fdist = length(halfview);\n"
6947 " halfview /= fdist;\n"
6948 "\n"
6949 " float world_shadow = newlight_compute_sun_shadow( \n"
6950 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
6951 "\n"
6952 " vec3 total_light = clearskies_lighting( \n"
6953 " normal, min( light_mask, world_shadow ), halfview );\n"
6954 "\n"
6955 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
6956 " cube_coord = floor( cube_coord );\n"
6957 "\n"
6958 " if( g_debug_indices == 1 )\n"
6959 " {\n"
6960 " return rand33(cube_coord);\n"
6961 " }\n"
6962 "\n"
6963 " if( g_debug_complexity == 1 )\n"
6964 " {\n"
6965 " ivec3 coord = ivec3( cube_coord );\n"
6966 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
6967 "\n"
6968 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
6969 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
6970 " }\n"
6971 "\n"
6972 " // FIXME: this coord should absolutely must be clamped!\n"
6973 " \n"
6974 " ivec3 coord = ivec3( cube_coord );\n"
6975 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
6976 "\n"
6977 " total_light += \n"
6978 " scene_calculate_packed_light_patch( index_sample.x,\n"
6979 " halfview, co, normal ) \n"
6980 " * light_mask;\n"
6981 " total_light += \n"
6982 " scene_calculate_packed_light_patch( index_sample.y,\n"
6983 " halfview, co, normal )\n"
6984 " * light_mask;\n"
6985 "\n"
6986 " // Take a section of the sky function to give us a matching fog colour\n"
6987 "\n"
6988 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
6989 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
6990 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
6991 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
6992 " \n"
6993 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
6994 " sun_colour *= sun_shape;\n"
6995 "\n"
6996 " fog_colour += sun_colour;\n"
6997 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
6998 "}\n"
6999 "\n"
7000 "#line 9 0 \n"
7001 "\n"
7002 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
7003 "{\n"
7004 " vec3 pa = p - a;\n"
7005 " vec3 ba = b - a;\n"
7006 "\n"
7007 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
7008 " return length( pa - ba*h );\n"
7009 "}\n"
7010 "\n"
7011 "float compute_board_shadow()\n"
7012 "{\n"
7013 " // player shadow\n"
7014 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
7015 " g_board_1.xyz )-0.1 );\n"
7016 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
7017 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
7018 "\n"
7019 " return 1.0 - player_shadow*0.8;\n"
7020 "}\n"
7021 "\n"
7022 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
7023 "{\n"
7024 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
7025 "}\n"
7026 "\n"
7027 "#line 8 0 \n"
7028 "#line 1 3 \n"
7029 "const float k_motion_lerp_amount = 0.01;\n"
7030 "\n"
7031 "#line 2 0 \n"
7032 "\n"
7033 "layout (location = 1) out vec2 oMotionVec;\n"
7034 "\n"
7035 "in vec3 aMotionVec0;\n"
7036 "in vec3 aMotionVec1;\n"
7037 "\n"
7038 "void compute_motion_vectors()\n"
7039 "{\n"
7040 " // Write motion vectors\n"
7041 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
7042 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
7043 "\n"
7044 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
7045 "}\n"
7046 "\n"
7047 "#line 9 0 \n"
7048 "\n"
7049 "void main()\n"
7050 "{\n"
7051 " compute_motion_vectors();\n"
7052 "\n"
7053 " vec3 vfrag = vec3(0.5,0.5,0.5);\n"
7054 " vec4 vsamplemain = texture( uTexMain, aUv );\n"
7055 " vec3 qnorm = aNorm.xyz;\n"
7056 "\n"
7057 " vfrag = vsamplemain.rgb;\n"
7058 "\n"
7059 " if( g_light_preview == 1 )\n"
7060 " {\n"
7061 " vfrag = vec3(0.5);\n"
7062 " }\n"
7063 "\n"
7064 " vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n"
7065 " oColour = vec4( vfrag, 1.0 );\n"
7066 "}\n"
7067 ""},
7068 };
7069
7070 GLuint _uniform_scene_scoretext_uMdl;
7071 GLuint _uniform_scene_scoretext_uPv;
7072 GLuint _uniform_scene_scoretext_uPvmPrev;
7073 GLuint _uniform_scene_scoretext_uInfo;
7074 GLuint _uniform_scene_scoretext_uTexGarbage;
7075 GLuint _uniform_scene_scoretext_uTexMain;
7076 GLuint _uniform_scene_scoretext_uCamera;
7077 GLuint _uniform_scene_scoretext_uPlane;
7078 GLuint _uniform_scene_scoretext_g_world_depth;
7079 GLuint _uniform_scene_scoretext_uLightsArray;
7080 GLuint _uniform_scene_scoretext_uLightsIndex;
7081 #include "shaders/scene_font.h"
7082 struct vg_shader _shader_scene_font = {
7083 .name = "scene_font",
7084 .vs =
7085 {
7086 .orig_file = "shaders/model_font.vs",
7087 .static_src =
7088 "layout (location=0) in vec3 a_co;\n"
7089 "layout (location=1) in vec3 a_norm;\n"
7090 "layout (location=2) in vec2 a_uv;\n"
7091 "\n"
7092 "#line 1 1 \n"
7093 "const float k_motion_lerp_amount = 0.01;\n"
7094 "\n"
7095 "#line 2 0 \n"
7096 "\n"
7097 "out vec3 aMotionVec0;\n"
7098 "out vec3 aMotionVec1;\n"
7099 "\n"
7100 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
7101 "{\n"
7102 " // This magically solves some artifacting errors!\n"
7103 " //\n"
7104 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
7105 "\n"
7106 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
7107 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
7108 "}\n"
7109 "\n"
7110 "#line 6 0 \n"
7111 "\n"
7112 "uniform mat4x3 uMdl;\n"
7113 "uniform mat4 uPv;\n"
7114 "uniform mat4 uPvmPrev;\n"
7115 "uniform vec4 uOffset;\n"
7116 "\n"
7117 "out vec2 aUv;\n"
7118 "out vec4 aNorm;\n"
7119 "out vec3 aCo;\n"
7120 "out vec3 aWorldCo;\n"
7121 "\n"
7122 "void main()\n"
7123 "{\n"
7124 " vec3 co = a_co*uOffset.w+uOffset.xyz;\n"
7125 " vec3 world_pos0 = uMdl * vec4( co, 1.0 );\n"
7126 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
7127 " vec4 vproj1 = uPvmPrev * vec4( co, 1.0 );\n"
7128 "\n"
7129 " vs_motion_out( vproj0, vproj1 );\n"
7130 "\n"
7131 " gl_Position = vproj0;\n"
7132 "\n"
7133 " aUv = a_uv;\n"
7134 " aNorm = vec4( mat3(uMdl) * a_norm, 0.0 );\n"
7135 " aCo = co;\n"
7136 " aWorldCo = world_pos0;\n"
7137 "}\n"
7138 ""},
7139 .fs =
7140 {
7141 .orig_file = "shaders/scene_font.fs",
7142 .static_src =
7143 "uniform sampler2D uTexGarbage; // unused\n"
7144 "uniform sampler2D uTexMain; // unused\n"
7145 "uniform vec3 uCamera;\n"
7146 "uniform float uTime;\n"
7147 "uniform float uOpacity;\n"
7148 "uniform float uColourize;\n"
7149 "\n"
7150 "#line 1 1 \n"
7151 "// :D\n"
7152 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
7153 "\n"
7154 "#line 9 0 \n"
7155 "#line 1 2 \n"
7156 "// :D\n"
7157 "\n"
7158 "in vec2 aUv;\n"
7159 "in vec4 aNorm;\n"
7160 "in vec3 aCo;\n"
7161 "in vec3 aWorldCo;\n"
7162 "\n"
7163 "#line 1 1 \n"
7164 "layout (location = 0) out vec4 oColour;\n"
7165 "\n"
7166 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
7167 "layout (std140) uniform ub_world_lighting\n"
7168 "{\n"
7169 " vec4 g_cube_min;\n"
7170 " vec4 g_cube_inv_range;\n"
7171 "\n"
7172 " vec4 g_water_plane;\n"
7173 " vec4 g_depth_bounds;\n"
7174 "\n"
7175 " vec4 g_daysky_colour;\n"
7176 " vec4 g_nightsky_colour;\n"
7177 " vec4 g_sunset_colour;\n"
7178 " vec4 g_ambient_colour;\n"
7179 " vec4 g_sunset_ambient;\n"
7180 " vec4 g_sun_colour;\n"
7181 " vec4 g_sun_dir;\n"
7182 " vec4 g_board_0;\n"
7183 " vec4 g_board_1;\n"
7184 "\n"
7185 " float g_water_fog;\n"
7186 " float g_time;\n"
7187 " float g_realtime;\n"
7188 " float g_shadow_length;\n"
7189 " float g_shadow_spread;\n"
7190 "\n"
7191 " float g_time_of_day;\n"
7192 " float g_day_phase;\n"
7193 " float g_sunset_phase;\n"
7194 "\n"
7195 " int g_light_preview;\n"
7196 " int g_shadow_samples;\n"
7197 "\n"
7198 " int g_debug_indices;\n"
7199 " int g_debug_complexity;\n"
7200 "};\n"
7201 "\n"
7202 "uniform sampler2D g_world_depth;\n"
7203 "uniform samplerBuffer uLightsArray;\n"
7204 "uniform usampler3D uLightsIndex;\n"
7205 "\n"
7206 "#line 1 1 \n"
7207 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
7208 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
7209 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
7210 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
7211 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
7212 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
7213 "\n"
7214 "const float SUN_ANGLE = 0.0001;\n"
7215 "const float PI = 3.14159265358979323846264;\n"
7216 "\n"
7217 "//struct world_info\n"
7218 "//{\n"
7219 "// float time,\n"
7220 "// time_of_day,\n"
7221 "// day_phase,\n"
7222 "// sunset_phase;\n"
7223 "// \n"
7224 "// vec3 sun_dir;\n"
7225 "//};\n"
7226 "\n"
7227 "vec3 rand33(vec3 p3)\n"
7228 "{\n"
7229 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
7230 " p3 += dot(p3, p3.yxz+33.33);\n"
7231 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
7232 "}\n"
7233 "\n"
7234 "float stars( vec3 rd, float rr, float size ){\n"
7235 " vec3 co = rd * rr;\n"
7236 "\n"
7237 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
7238 "\n"
7239 " float spaces = 1.0 / rr;\n"
7240 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
7241 " a -= mod(a, spaces) - spaces * 0.5;\n"
7242 "\n"
7243 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
7244 " \n"
7245 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
7246 " plane = plane - mod(plane, PI / count);\n"
7247 "\n"
7248 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
7249 "\n"
7250 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
7251 " float ydist = sqrt(rr * rr - level * level);\n"
7252 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
7253 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
7254 " float star = smoothstep(size, 0.0, distance(center, co));\n"
7255 " return star;\n"
7256 "}\n"
7257 "\n"
7258 "float luminance( vec3 v )\n"
7259 "{\n"
7260 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
7261 "}\n"
7262 "\n"
7263 "vec3 clearskies_ambient( vec3 dir )\n"
7264 "{\n"
7265 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
7266 " float sky_gradient = dir.y;\n"
7267 " \n"
7268 " /* Blend phase colours */\n"
7269 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
7270 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
7271 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
7272 " \n"
7273 " /* Add gradient */\n"
7274 " ambient -= sky_gradient * luminance(ambient);\n"
7275 " \n"
7276 " return ambient;\n"
7277 "}\n"
7278 "\n"
7279 "vec3 clearskies_sky( vec3 ray_dir )\n"
7280 "{\n"
7281 " ray_dir.y = abs( ray_dir.y );\n"
7282 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
7283 " \n"
7284 " /* Sun */\n"
7285 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
7286 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
7287 " float sun_shape = pow( sun_size, 2000.0 );\n"
7288 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
7289 " \n"
7290 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
7291 " sun_colour *= sun_shape;\n"
7292 "\n"
7293 " \n"
7294 " float star = 0.0;\n"
7295 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
7296 "\n"
7297 " if( star_blend > 0.001 ){\n"
7298 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
7299 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
7300 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
7301 " }\n"
7302 " }\n"
7303 " \n"
7304 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
7305 " return composite;\n"
7306 "}\n"
7307 "\n"
7308 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
7309 "{\n"
7310 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
7311 "\n"
7312 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
7313 " g_sunset_phase );\n"
7314 "\n"
7315 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
7316 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
7317 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
7318 " ) * g_sun_colour.rgb * g_day_phase;\n"
7319 "\n"
7320 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
7321 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
7322 " g_sunset_phase );\n"
7323 "\n"
7324 " return ambient + (light_sun + sky_reflection) * shadow;\n"
7325 "}\n"
7326 "\n"
7327 "#line 44 0 \n"
7328 "\n"
7329 "float world_depth_sample( vec3 pos )\n"
7330 "{\n"
7331 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
7332 " return texture( g_world_depth, depth_coord ).r;\n"
7333 "}\n"
7334 "\n"
7335 "float world_water_depth( vec3 pos )\n"
7336 "{\n"
7337 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
7338 " return world_depth_sample( pos ) - ref_depth;\n"
7339 "}\n"
7340 "\n"
7341 "float shadow_sample( vec3 co ){\n"
7342 " float height_sample = world_depth_sample( co );\n"
7343 "\n"
7344 " float fdelta = height_sample - co.y;\n"
7345 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
7346 "}\n"
7347 "\n"
7348 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
7349 " if( g_shadow_samples == 0 ){\n"
7350 " return 1.0;\n"
7351 " }\n"
7352 "\n"
7353 " float fspread = g_shadow_spread;\n"
7354 " float flength = g_shadow_length;\n"
7355 "\n"
7356 " float famt = 0.0;\n"
7357 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
7358 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
7359 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
7360 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
7361 "\n"
7362 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
7363 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
7364 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
7365 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
7366 "\n"
7367 " return 1.0 - famt;\n"
7368 "}\n"
7369 "\n"
7370 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
7371 "{\n"
7372 " vec3 specdir = reflect( -dir, wnormal );\n"
7373 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
7374 "}\n"
7375 "\n"
7376 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
7377 " float dist = pow(fdist*0.0010,0.78);\n"
7378 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
7379 "}\n"
7380 "\n"
7381 "vec3 scene_calculate_light( int light_index, \n"
7382 " vec3 halfview, vec3 co, vec3 normal )\n"
7383 "{\n"
7384 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
7385 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
7386 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
7387 "\n"
7388 " vec3 light_delta = light_co.xyz-co;\n"
7389 " float dist2 = dot(light_delta,light_delta);\n"
7390 "\n"
7391 " light_delta = normalize( light_delta );\n"
7392 "\n"
7393 " float quadratic = dist2*100.0;\n"
7394 " float attenuation = 1.0/( 1.0 + quadratic );\n"
7395 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
7396 "\n"
7397 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
7398 "\n"
7399 " if( light_dir.w < 0.999999 ){\n"
7400 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
7401 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
7402 " }\n"
7403 "\n"
7404 " return light_colour.rgb * attenuation * falloff \n"
7405 " * step( g_day_phase, light_colour.w );\n"
7406 "}\n"
7407 "\n"
7408 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
7409 " vec3 halfview, vec3 co, vec3 normal )\n"
7410 "{\n"
7411 " uint light_count = packed_index & 0x3u;\n"
7412 "\n"
7413 " vec3 l = vec3(0.0);\n"
7414 "\n"
7415 " if( light_count >= 1u ){\n"
7416 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
7417 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
7418 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
7419 "\n"
7420 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
7421 "\n"
7422 " if( light_count >= 2u ){\n"
7423 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
7424 "\n"
7425 " if( light_count >= 3u ){\n"
7426 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
7427 " }\n"
7428 " }\n"
7429 " }\n"
7430 "\n"
7431 " return l;\n"
7432 "}\n"
7433 "\n"
7434 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
7435 " float light_mask )\n"
7436 "{\n"
7437 " if( g_light_preview == 1 )\n"
7438 " diffuse = vec3(0.75);\n"
7439 "\n"
7440 " // Lighting\n"
7441 " vec3 halfview = uCamera - co;\n"
7442 " float fdist = length(halfview);\n"
7443 " halfview /= fdist;\n"
7444 "\n"
7445 " float world_shadow = newlight_compute_sun_shadow( \n"
7446 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
7447 "\n"
7448 " vec3 total_light = clearskies_lighting( \n"
7449 " normal, min( light_mask, world_shadow ), halfview );\n"
7450 "\n"
7451 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
7452 " cube_coord = floor( cube_coord );\n"
7453 "\n"
7454 " if( g_debug_indices == 1 )\n"
7455 " {\n"
7456 " return rand33(cube_coord);\n"
7457 " }\n"
7458 "\n"
7459 " if( g_debug_complexity == 1 )\n"
7460 " {\n"
7461 " ivec3 coord = ivec3( cube_coord );\n"
7462 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
7463 "\n"
7464 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
7465 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
7466 " }\n"
7467 "\n"
7468 " // FIXME: this coord should absolutely must be clamped!\n"
7469 " \n"
7470 " ivec3 coord = ivec3( cube_coord );\n"
7471 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
7472 "\n"
7473 " total_light += \n"
7474 " scene_calculate_packed_light_patch( index_sample.x,\n"
7475 " halfview, co, normal ) \n"
7476 " * light_mask;\n"
7477 " total_light += \n"
7478 " scene_calculate_packed_light_patch( index_sample.y,\n"
7479 " halfview, co, normal )\n"
7480 " * light_mask;\n"
7481 "\n"
7482 " // Take a section of the sky function to give us a matching fog colour\n"
7483 "\n"
7484 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
7485 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
7486 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
7487 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
7488 " \n"
7489 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
7490 " sun_colour *= sun_shape;\n"
7491 "\n"
7492 " fog_colour += sun_colour;\n"
7493 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
7494 "}\n"
7495 "\n"
7496 "#line 9 0 \n"
7497 "\n"
7498 "float sdLine( vec3 p, vec3 a, vec3 b )\n"
7499 "{\n"
7500 " vec3 pa = p - a;\n"
7501 " vec3 ba = b - a;\n"
7502 "\n"
7503 " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
7504 " return length( pa - ba*h );\n"
7505 "}\n"
7506 "\n"
7507 "float compute_board_shadow()\n"
7508 "{\n"
7509 " // player shadow\n"
7510 " float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n"
7511 " g_board_1.xyz )-0.1 );\n"
7512 " float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n"
7513 " player_shadow *= player_shadow*player_shadow*player_shadow;\n"
7514 "\n"
7515 " return 1.0 - player_shadow*0.8;\n"
7516 "}\n"
7517 "\n"
7518 "vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n"
7519 "{\n"
7520 " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n"
7521 "}\n"
7522 "\n"
7523 "#line 10 0 \n"
7524 "#line 1 3 \n"
7525 "const float k_motion_lerp_amount = 0.01;\n"
7526 "\n"
7527 "#line 2 0 \n"
7528 "\n"
7529 "layout (location = 1) out vec2 oMotionVec;\n"
7530 "\n"
7531 "in vec3 aMotionVec0;\n"
7532 "in vec3 aMotionVec1;\n"
7533 "\n"
7534 "void compute_motion_vectors()\n"
7535 "{\n"
7536 " // Write motion vectors\n"
7537 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
7538 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
7539 "\n"
7540 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
7541 "}\n"
7542 "\n"
7543 "#line 11 0 \n"
7544 "\n"
7545 "vec3 pal( float t ){\n"
7546 " vec3 a = vec3(0.30,0.3,0.3);\n"
7547 " vec3 b = vec3(0.8);\n"
7548 " vec3 c = vec3(0.28,0.3,0.4);\n"
7549 " vec3 d = vec3(0.00,0.1,0.1);\n"
7550 " return a + b*cos( 6.28318*(c*t+d) );\n"
7551 "}\n"
7552 "\n"
7553 "void main(){\n"
7554 " compute_motion_vectors();\n"
7555 " vec3 vfrag = vec3(0.5,0.5,0.5);\n"
7556 " vec3 qnorm = aNorm.xyz;\n"
7557 "\n"
7558 " //vec4 vsamplemain = texture( uTexMain, aUv );\n"
7559 " //vfrag = vsamplemain.rgb;\n"
7560 "\n"
7561 " vec4 spread0 = uTime*0.0002*vec4( 17.3,-19.6, 23.2,-47.7 );\n"
7562 " vec4 spread1 = uTime*0.0002*vec4( -13.3, 12.6,-28.2, 14.7 );\n"
7563 "\n"
7564 " vec2 p = aCo.xy + vec2(0.3);\n"
7565 " float a = atan( p.y/p.x );\n"
7566 " vec4 v0 = step( vec4(0.5), fract(vec4(a) + spread0) );\n"
7567 " vec4 v1 = step( vec4(0.5), fract(vec4(a) + spread1) );\n"
7568 "\n"
7569 " float d = ( v0.x+v0.y+v0.z+v0.w +\n"
7570 " v1.x+v1.y+v1.z+v1.w ) * 0.125;\n"
7571 " \n"
7572 " float dither = fract(dot(vec2(171.0,231.0),gl_FragCoord.xy)/71.0);\n"
7573 " float x = d*0.8+length(p)*0.3;\n"
7574 " x = (floor(x*8.0) + step(dither, fract(x * 8.0))) / 8.0;\n"
7575 "\n"
7576 " if( x + (uOpacity*2.0-1.0) < 0.5 ) \n"
7577 " discard;\n"
7578 "\n"
7579 " vfrag = mix( vec3(x), pal( x ), uColourize );\n"
7580 "\n"
7581 " if( g_light_preview == 1 ){\n"
7582 " vfrag = vec3(0.5);\n"
7583 " }\n"
7584 "\n"
7585 " vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n"
7586 " oColour = vec4( vfrag, 1.0 );\n"
7587 "}\n"
7588 ""},
7589 };
7590
7591 GLuint _uniform_scene_font_uMdl;
7592 GLuint _uniform_scene_font_uPv;
7593 GLuint _uniform_scene_font_uPvmPrev;
7594 GLuint _uniform_scene_font_uOffset;
7595 GLuint _uniform_scene_font_uTexGarbage;
7596 GLuint _uniform_scene_font_uTexMain;
7597 GLuint _uniform_scene_font_uCamera;
7598 GLuint _uniform_scene_font_uTime;
7599 GLuint _uniform_scene_font_uOpacity;
7600 GLuint _uniform_scene_font_uColourize;
7601 GLuint _uniform_scene_font_g_world_depth;
7602 GLuint _uniform_scene_font_uLightsArray;
7603 GLuint _uniform_scene_font_uLightsIndex;
7604 #include "shaders/model_sky.h"
7605 struct vg_shader _shader_model_sky = {
7606 .name = "model_sky",
7607 .vs =
7608 {
7609 .orig_file = "shaders/model.vs",
7610 .static_src =
7611 "layout (location=0) in vec3 a_co;\n"
7612 "layout (location=1) in vec3 a_norm;\n"
7613 "layout (location=2) in vec2 a_uv;\n"
7614 "layout (location=3) in vec4 a_colour;\n"
7615 "layout (location=4) in vec4 a_weights;\n"
7616 "layout (location=5) in ivec4 a_groups;\n"
7617 "\n"
7618 "#line 1 1 \n"
7619 "const float k_motion_lerp_amount = 0.01;\n"
7620 "\n"
7621 "#line 2 0 \n"
7622 "\n"
7623 "out vec3 aMotionVec0;\n"
7624 "out vec3 aMotionVec1;\n"
7625 "\n"
7626 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
7627 "{\n"
7628 " // This magically solves some artifacting errors!\n"
7629 " //\n"
7630 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
7631 "\n"
7632 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
7633 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
7634 "}\n"
7635 "\n"
7636 "#line 9 0 \n"
7637 "\n"
7638 "uniform mat4x3 uMdl;\n"
7639 "uniform mat4 uPv;\n"
7640 "uniform mat4 uPvmPrev;\n"
7641 "\n"
7642 "out vec4 aColour;\n"
7643 "out vec2 aUv;\n"
7644 "out vec3 aNorm;\n"
7645 "out vec3 aCo;\n"
7646 "out vec3 aWorldCo;\n"
7647 "\n"
7648 "void main()\n"
7649 "{\n"
7650 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
7651 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
7652 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
7653 "\n"
7654 " vs_motion_out( vproj0, vproj1 );\n"
7655 "\n"
7656 " gl_Position = vproj0;\n"
7657 " aWorldCo = world_pos0;\n"
7658 " aColour = a_colour;\n"
7659 " aUv = a_uv;\n"
7660 " aNorm = normalize( mat3(uMdl) * a_norm );\n"
7661 " aCo = a_co;\n"
7662 "}\n"
7663 ""},
7664 .fs =
7665 {
7666 .orig_file = "shaders/model_sky.fs",
7667 .static_src =
7668 "uniform sampler2D uTexGarbage;\n"
7669 "\n"
7670 "in vec4 aColour;\n"
7671 "in vec2 aUv;\n"
7672 "in vec3 aNorm;\n"
7673 "in vec3 aCo;\n"
7674 "in vec3 aWorldCo;\n"
7675 "\n"
7676 "// Spooky!\n"
7677 "const vec3 uCamera = vec3(0.0);\n"
7678 "\n"
7679 "#line 1 1 \n"
7680 "// :D\n"
7681 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
7682 "\n"
7683 "#line 13 0 \n"
7684 "#line 1 2 \n"
7685 "layout (location = 0) out vec4 oColour;\n"
7686 "\n"
7687 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
7688 "layout (std140) uniform ub_world_lighting\n"
7689 "{\n"
7690 " vec4 g_cube_min;\n"
7691 " vec4 g_cube_inv_range;\n"
7692 "\n"
7693 " vec4 g_water_plane;\n"
7694 " vec4 g_depth_bounds;\n"
7695 "\n"
7696 " vec4 g_daysky_colour;\n"
7697 " vec4 g_nightsky_colour;\n"
7698 " vec4 g_sunset_colour;\n"
7699 " vec4 g_ambient_colour;\n"
7700 " vec4 g_sunset_ambient;\n"
7701 " vec4 g_sun_colour;\n"
7702 " vec4 g_sun_dir;\n"
7703 " vec4 g_board_0;\n"
7704 " vec4 g_board_1;\n"
7705 "\n"
7706 " float g_water_fog;\n"
7707 " float g_time;\n"
7708 " float g_realtime;\n"
7709 " float g_shadow_length;\n"
7710 " float g_shadow_spread;\n"
7711 "\n"
7712 " float g_time_of_day;\n"
7713 " float g_day_phase;\n"
7714 " float g_sunset_phase;\n"
7715 "\n"
7716 " int g_light_preview;\n"
7717 " int g_shadow_samples;\n"
7718 "\n"
7719 " int g_debug_indices;\n"
7720 " int g_debug_complexity;\n"
7721 "};\n"
7722 "\n"
7723 "uniform sampler2D g_world_depth;\n"
7724 "uniform samplerBuffer uLightsArray;\n"
7725 "uniform usampler3D uLightsIndex;\n"
7726 "\n"
7727 "#line 1 1 \n"
7728 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
7729 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
7730 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
7731 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
7732 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
7733 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
7734 "\n"
7735 "const float SUN_ANGLE = 0.0001;\n"
7736 "const float PI = 3.14159265358979323846264;\n"
7737 "\n"
7738 "//struct world_info\n"
7739 "//{\n"
7740 "// float time,\n"
7741 "// time_of_day,\n"
7742 "// day_phase,\n"
7743 "// sunset_phase;\n"
7744 "// \n"
7745 "// vec3 sun_dir;\n"
7746 "//};\n"
7747 "\n"
7748 "vec3 rand33(vec3 p3)\n"
7749 "{\n"
7750 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
7751 " p3 += dot(p3, p3.yxz+33.33);\n"
7752 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
7753 "}\n"
7754 "\n"
7755 "float stars( vec3 rd, float rr, float size ){\n"
7756 " vec3 co = rd * rr;\n"
7757 "\n"
7758 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
7759 "\n"
7760 " float spaces = 1.0 / rr;\n"
7761 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
7762 " a -= mod(a, spaces) - spaces * 0.5;\n"
7763 "\n"
7764 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
7765 " \n"
7766 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
7767 " plane = plane - mod(plane, PI / count);\n"
7768 "\n"
7769 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
7770 "\n"
7771 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
7772 " float ydist = sqrt(rr * rr - level * level);\n"
7773 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
7774 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
7775 " float star = smoothstep(size, 0.0, distance(center, co));\n"
7776 " return star;\n"
7777 "}\n"
7778 "\n"
7779 "float luminance( vec3 v )\n"
7780 "{\n"
7781 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
7782 "}\n"
7783 "\n"
7784 "vec3 clearskies_ambient( vec3 dir )\n"
7785 "{\n"
7786 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
7787 " float sky_gradient = dir.y;\n"
7788 " \n"
7789 " /* Blend phase colours */\n"
7790 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
7791 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
7792 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
7793 " \n"
7794 " /* Add gradient */\n"
7795 " ambient -= sky_gradient * luminance(ambient);\n"
7796 " \n"
7797 " return ambient;\n"
7798 "}\n"
7799 "\n"
7800 "vec3 clearskies_sky( vec3 ray_dir )\n"
7801 "{\n"
7802 " ray_dir.y = abs( ray_dir.y );\n"
7803 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
7804 " \n"
7805 " /* Sun */\n"
7806 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
7807 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
7808 " float sun_shape = pow( sun_size, 2000.0 );\n"
7809 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
7810 " \n"
7811 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
7812 " sun_colour *= sun_shape;\n"
7813 "\n"
7814 " \n"
7815 " float star = 0.0;\n"
7816 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
7817 "\n"
7818 " if( star_blend > 0.001 ){\n"
7819 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
7820 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
7821 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
7822 " }\n"
7823 " }\n"
7824 " \n"
7825 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
7826 " return composite;\n"
7827 "}\n"
7828 "\n"
7829 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
7830 "{\n"
7831 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
7832 "\n"
7833 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
7834 " g_sunset_phase );\n"
7835 "\n"
7836 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
7837 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
7838 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
7839 " ) * g_sun_colour.rgb * g_day_phase;\n"
7840 "\n"
7841 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
7842 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
7843 " g_sunset_phase );\n"
7844 "\n"
7845 " return ambient + (light_sun + sky_reflection) * shadow;\n"
7846 "}\n"
7847 "\n"
7848 "#line 44 0 \n"
7849 "\n"
7850 "float world_depth_sample( vec3 pos )\n"
7851 "{\n"
7852 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
7853 " return texture( g_world_depth, depth_coord ).r;\n"
7854 "}\n"
7855 "\n"
7856 "float world_water_depth( vec3 pos )\n"
7857 "{\n"
7858 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
7859 " return world_depth_sample( pos ) - ref_depth;\n"
7860 "}\n"
7861 "\n"
7862 "float shadow_sample( vec3 co ){\n"
7863 " float height_sample = world_depth_sample( co );\n"
7864 "\n"
7865 " float fdelta = height_sample - co.y;\n"
7866 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
7867 "}\n"
7868 "\n"
7869 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
7870 " if( g_shadow_samples == 0 ){\n"
7871 " return 1.0;\n"
7872 " }\n"
7873 "\n"
7874 " float fspread = g_shadow_spread;\n"
7875 " float flength = g_shadow_length;\n"
7876 "\n"
7877 " float famt = 0.0;\n"
7878 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
7879 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
7880 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
7881 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
7882 "\n"
7883 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
7884 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
7885 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
7886 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
7887 "\n"
7888 " return 1.0 - famt;\n"
7889 "}\n"
7890 "\n"
7891 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
7892 "{\n"
7893 " vec3 specdir = reflect( -dir, wnormal );\n"
7894 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
7895 "}\n"
7896 "\n"
7897 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
7898 " float dist = pow(fdist*0.0010,0.78);\n"
7899 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
7900 "}\n"
7901 "\n"
7902 "vec3 scene_calculate_light( int light_index, \n"
7903 " vec3 halfview, vec3 co, vec3 normal )\n"
7904 "{\n"
7905 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
7906 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
7907 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
7908 "\n"
7909 " vec3 light_delta = light_co.xyz-co;\n"
7910 " float dist2 = dot(light_delta,light_delta);\n"
7911 "\n"
7912 " light_delta = normalize( light_delta );\n"
7913 "\n"
7914 " float quadratic = dist2*100.0;\n"
7915 " float attenuation = 1.0/( 1.0 + quadratic );\n"
7916 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
7917 "\n"
7918 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
7919 "\n"
7920 " if( light_dir.w < 0.999999 ){\n"
7921 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
7922 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
7923 " }\n"
7924 "\n"
7925 " return light_colour.rgb * attenuation * falloff \n"
7926 " * step( g_day_phase, light_colour.w );\n"
7927 "}\n"
7928 "\n"
7929 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
7930 " vec3 halfview, vec3 co, vec3 normal )\n"
7931 "{\n"
7932 " uint light_count = packed_index & 0x3u;\n"
7933 "\n"
7934 " vec3 l = vec3(0.0);\n"
7935 "\n"
7936 " if( light_count >= 1u ){\n"
7937 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
7938 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
7939 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
7940 "\n"
7941 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
7942 "\n"
7943 " if( light_count >= 2u ){\n"
7944 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
7945 "\n"
7946 " if( light_count >= 3u ){\n"
7947 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
7948 " }\n"
7949 " }\n"
7950 " }\n"
7951 "\n"
7952 " return l;\n"
7953 "}\n"
7954 "\n"
7955 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
7956 " float light_mask )\n"
7957 "{\n"
7958 " if( g_light_preview == 1 )\n"
7959 " diffuse = vec3(0.75);\n"
7960 "\n"
7961 " // Lighting\n"
7962 " vec3 halfview = uCamera - co;\n"
7963 " float fdist = length(halfview);\n"
7964 " halfview /= fdist;\n"
7965 "\n"
7966 " float world_shadow = newlight_compute_sun_shadow( \n"
7967 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
7968 "\n"
7969 " vec3 total_light = clearskies_lighting( \n"
7970 " normal, min( light_mask, world_shadow ), halfview );\n"
7971 "\n"
7972 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
7973 " cube_coord = floor( cube_coord );\n"
7974 "\n"
7975 " if( g_debug_indices == 1 )\n"
7976 " {\n"
7977 " return rand33(cube_coord);\n"
7978 " }\n"
7979 "\n"
7980 " if( g_debug_complexity == 1 )\n"
7981 " {\n"
7982 " ivec3 coord = ivec3( cube_coord );\n"
7983 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
7984 "\n"
7985 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
7986 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
7987 " }\n"
7988 "\n"
7989 " // FIXME: this coord should absolutely must be clamped!\n"
7990 " \n"
7991 " ivec3 coord = ivec3( cube_coord );\n"
7992 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
7993 "\n"
7994 " total_light += \n"
7995 " scene_calculate_packed_light_patch( index_sample.x,\n"
7996 " halfview, co, normal ) \n"
7997 " * light_mask;\n"
7998 " total_light += \n"
7999 " scene_calculate_packed_light_patch( index_sample.y,\n"
8000 " halfview, co, normal )\n"
8001 " * light_mask;\n"
8002 "\n"
8003 " // Take a section of the sky function to give us a matching fog colour\n"
8004 "\n"
8005 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
8006 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
8007 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
8008 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
8009 " \n"
8010 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
8011 " sun_colour *= sun_shape;\n"
8012 "\n"
8013 " fog_colour += sun_colour;\n"
8014 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
8015 "}\n"
8016 "\n"
8017 "#line 14 0 \n"
8018 "#line 1 3 \n"
8019 "const float k_motion_lerp_amount = 0.01;\n"
8020 "\n"
8021 "#line 2 0 \n"
8022 "\n"
8023 "layout (location = 1) out vec2 oMotionVec;\n"
8024 "\n"
8025 "in vec3 aMotionVec0;\n"
8026 "in vec3 aMotionVec1;\n"
8027 "\n"
8028 "void compute_motion_vectors()\n"
8029 "{\n"
8030 " // Write motion vectors\n"
8031 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
8032 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
8033 "\n"
8034 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
8035 "}\n"
8036 "\n"
8037 "#line 15 0 \n"
8038 "\n"
8039 "void main()\n"
8040 "{\n"
8041 " compute_motion_vectors();\n"
8042 "\n"
8043 " vec3 rd = normalize(aNorm);\n"
8044 "\n"
8045 " float fmove = g_time * 5.0;\n"
8046 " vec2 cloudplane = (rd.xz / (rd.y*sign(rd.y))) * 0.025;\n"
8047 " vec4 clouds1 = texture( uTexGarbage, cloudplane + vec2(0.1,0.4)*fmove*2.0 );\n"
8048 " vec4 clouds2 = texture( uTexGarbage, cloudplane*2.0 + vec2(0.3,0.1)*fmove );\n"
8049 "\n"
8050 " float cloud_d = max(clouds1.b*clouds2.r -0.2 - clouds2.g*0.4,0.0);\n"
8051 " float cloud_e = pow(cloud_d,1.5)*pow(abs(rd.y),0.3)*2.0;\n"
8052 "\n"
8053 " oColour = vec4( clearskies_sky( -rd ) ,1.0);\n"
8054 "\n"
8055 " vec3 cloud_colour = mix( mix(g_nightsky_colour.rgb,vec3(1.0),g_day_phase), \n"
8056 " g_sunset_colour.rgb, g_sunset_phase );\n"
8057 "\n"
8058 " oColour.rgb = mix( oColour.rgb, cloud_colour, cloud_e );\n"
8059 "}\n"
8060 ""},
8061 };
8062
8063 GLuint _uniform_model_sky_uMdl;
8064 GLuint _uniform_model_sky_uPv;
8065 GLuint _uniform_model_sky_uPvmPrev;
8066 GLuint _uniform_model_sky_uTexGarbage;
8067 GLuint _uniform_model_sky_g_world_depth;
8068 GLuint _uniform_model_sky_uLightsArray;
8069 GLuint _uniform_model_sky_uLightsIndex;
8070 #include "shaders/model_sky_space.h"
8071 struct vg_shader _shader_model_sky_space = {
8072 .name = "model_sky_space",
8073 .vs =
8074 {
8075 .orig_file = "shaders/model.vs",
8076 .static_src =
8077 "layout (location=0) in vec3 a_co;\n"
8078 "layout (location=1) in vec3 a_norm;\n"
8079 "layout (location=2) in vec2 a_uv;\n"
8080 "layout (location=3) in vec4 a_colour;\n"
8081 "layout (location=4) in vec4 a_weights;\n"
8082 "layout (location=5) in ivec4 a_groups;\n"
8083 "\n"
8084 "#line 1 1 \n"
8085 "const float k_motion_lerp_amount = 0.01;\n"
8086 "\n"
8087 "#line 2 0 \n"
8088 "\n"
8089 "out vec3 aMotionVec0;\n"
8090 "out vec3 aMotionVec1;\n"
8091 "\n"
8092 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
8093 "{\n"
8094 " // This magically solves some artifacting errors!\n"
8095 " //\n"
8096 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
8097 "\n"
8098 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
8099 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
8100 "}\n"
8101 "\n"
8102 "#line 9 0 \n"
8103 "\n"
8104 "uniform mat4x3 uMdl;\n"
8105 "uniform mat4 uPv;\n"
8106 "uniform mat4 uPvmPrev;\n"
8107 "\n"
8108 "out vec4 aColour;\n"
8109 "out vec2 aUv;\n"
8110 "out vec3 aNorm;\n"
8111 "out vec3 aCo;\n"
8112 "out vec3 aWorldCo;\n"
8113 "\n"
8114 "void main()\n"
8115 "{\n"
8116 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
8117 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
8118 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
8119 "\n"
8120 " vs_motion_out( vproj0, vproj1 );\n"
8121 "\n"
8122 " gl_Position = vproj0;\n"
8123 " aWorldCo = world_pos0;\n"
8124 " aColour = a_colour;\n"
8125 " aUv = a_uv;\n"
8126 " aNorm = normalize( mat3(uMdl) * a_norm );\n"
8127 " aCo = a_co;\n"
8128 "}\n"
8129 ""},
8130 .fs =
8131 {
8132 .orig_file = "shaders/model_sky_space.fs",
8133 .static_src =
8134 "uniform sampler2D uTexGarbage;\n"
8135 "\n"
8136 "in vec4 aColour;\n"
8137 "in vec2 aUv;\n"
8138 "in vec3 aNorm;\n"
8139 "in vec3 aCo;\n"
8140 "in vec3 aWorldCo;\n"
8141 "\n"
8142 "// Spooky!\n"
8143 "const vec3 uCamera = vec3(0.0);\n"
8144 "\n"
8145 "#line 1 1 \n"
8146 "// :D\n"
8147 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
8148 "\n"
8149 "#line 13 0 \n"
8150 "#line 1 2 \n"
8151 "layout (location = 0) out vec4 oColour;\n"
8152 "\n"
8153 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
8154 "layout (std140) uniform ub_world_lighting\n"
8155 "{\n"
8156 " vec4 g_cube_min;\n"
8157 " vec4 g_cube_inv_range;\n"
8158 "\n"
8159 " vec4 g_water_plane;\n"
8160 " vec4 g_depth_bounds;\n"
8161 "\n"
8162 " vec4 g_daysky_colour;\n"
8163 " vec4 g_nightsky_colour;\n"
8164 " vec4 g_sunset_colour;\n"
8165 " vec4 g_ambient_colour;\n"
8166 " vec4 g_sunset_ambient;\n"
8167 " vec4 g_sun_colour;\n"
8168 " vec4 g_sun_dir;\n"
8169 " vec4 g_board_0;\n"
8170 " vec4 g_board_1;\n"
8171 "\n"
8172 " float g_water_fog;\n"
8173 " float g_time;\n"
8174 " float g_realtime;\n"
8175 " float g_shadow_length;\n"
8176 " float g_shadow_spread;\n"
8177 "\n"
8178 " float g_time_of_day;\n"
8179 " float g_day_phase;\n"
8180 " float g_sunset_phase;\n"
8181 "\n"
8182 " int g_light_preview;\n"
8183 " int g_shadow_samples;\n"
8184 "\n"
8185 " int g_debug_indices;\n"
8186 " int g_debug_complexity;\n"
8187 "};\n"
8188 "\n"
8189 "uniform sampler2D g_world_depth;\n"
8190 "uniform samplerBuffer uLightsArray;\n"
8191 "uniform usampler3D uLightsIndex;\n"
8192 "\n"
8193 "#line 1 1 \n"
8194 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
8195 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
8196 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
8197 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
8198 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
8199 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
8200 "\n"
8201 "const float SUN_ANGLE = 0.0001;\n"
8202 "const float PI = 3.14159265358979323846264;\n"
8203 "\n"
8204 "//struct world_info\n"
8205 "//{\n"
8206 "// float time,\n"
8207 "// time_of_day,\n"
8208 "// day_phase,\n"
8209 "// sunset_phase;\n"
8210 "// \n"
8211 "// vec3 sun_dir;\n"
8212 "//};\n"
8213 "\n"
8214 "vec3 rand33(vec3 p3)\n"
8215 "{\n"
8216 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
8217 " p3 += dot(p3, p3.yxz+33.33);\n"
8218 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
8219 "}\n"
8220 "\n"
8221 "float stars( vec3 rd, float rr, float size ){\n"
8222 " vec3 co = rd * rr;\n"
8223 "\n"
8224 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
8225 "\n"
8226 " float spaces = 1.0 / rr;\n"
8227 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
8228 " a -= mod(a, spaces) - spaces * 0.5;\n"
8229 "\n"
8230 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
8231 " \n"
8232 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
8233 " plane = plane - mod(plane, PI / count);\n"
8234 "\n"
8235 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
8236 "\n"
8237 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
8238 " float ydist = sqrt(rr * rr - level * level);\n"
8239 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
8240 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
8241 " float star = smoothstep(size, 0.0, distance(center, co));\n"
8242 " return star;\n"
8243 "}\n"
8244 "\n"
8245 "float luminance( vec3 v )\n"
8246 "{\n"
8247 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
8248 "}\n"
8249 "\n"
8250 "vec3 clearskies_ambient( vec3 dir )\n"
8251 "{\n"
8252 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
8253 " float sky_gradient = dir.y;\n"
8254 " \n"
8255 " /* Blend phase colours */\n"
8256 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
8257 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
8258 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
8259 " \n"
8260 " /* Add gradient */\n"
8261 " ambient -= sky_gradient * luminance(ambient);\n"
8262 " \n"
8263 " return ambient;\n"
8264 "}\n"
8265 "\n"
8266 "vec3 clearskies_sky( vec3 ray_dir )\n"
8267 "{\n"
8268 " ray_dir.y = abs( ray_dir.y );\n"
8269 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
8270 " \n"
8271 " /* Sun */\n"
8272 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
8273 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
8274 " float sun_shape = pow( sun_size, 2000.0 );\n"
8275 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
8276 " \n"
8277 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
8278 " sun_colour *= sun_shape;\n"
8279 "\n"
8280 " \n"
8281 " float star = 0.0;\n"
8282 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
8283 "\n"
8284 " if( star_blend > 0.001 ){\n"
8285 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
8286 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
8287 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
8288 " }\n"
8289 " }\n"
8290 " \n"
8291 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
8292 " return composite;\n"
8293 "}\n"
8294 "\n"
8295 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
8296 "{\n"
8297 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
8298 "\n"
8299 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
8300 " g_sunset_phase );\n"
8301 "\n"
8302 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
8303 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
8304 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
8305 " ) * g_sun_colour.rgb * g_day_phase;\n"
8306 "\n"
8307 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
8308 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
8309 " g_sunset_phase );\n"
8310 "\n"
8311 " return ambient + (light_sun + sky_reflection) * shadow;\n"
8312 "}\n"
8313 "\n"
8314 "#line 44 0 \n"
8315 "\n"
8316 "float world_depth_sample( vec3 pos )\n"
8317 "{\n"
8318 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
8319 " return texture( g_world_depth, depth_coord ).r;\n"
8320 "}\n"
8321 "\n"
8322 "float world_water_depth( vec3 pos )\n"
8323 "{\n"
8324 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
8325 " return world_depth_sample( pos ) - ref_depth;\n"
8326 "}\n"
8327 "\n"
8328 "float shadow_sample( vec3 co ){\n"
8329 " float height_sample = world_depth_sample( co );\n"
8330 "\n"
8331 " float fdelta = height_sample - co.y;\n"
8332 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
8333 "}\n"
8334 "\n"
8335 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
8336 " if( g_shadow_samples == 0 ){\n"
8337 " return 1.0;\n"
8338 " }\n"
8339 "\n"
8340 " float fspread = g_shadow_spread;\n"
8341 " float flength = g_shadow_length;\n"
8342 "\n"
8343 " float famt = 0.0;\n"
8344 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
8345 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
8346 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
8347 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
8348 "\n"
8349 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
8350 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
8351 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
8352 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
8353 "\n"
8354 " return 1.0 - famt;\n"
8355 "}\n"
8356 "\n"
8357 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
8358 "{\n"
8359 " vec3 specdir = reflect( -dir, wnormal );\n"
8360 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
8361 "}\n"
8362 "\n"
8363 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
8364 " float dist = pow(fdist*0.0010,0.78);\n"
8365 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
8366 "}\n"
8367 "\n"
8368 "vec3 scene_calculate_light( int light_index, \n"
8369 " vec3 halfview, vec3 co, vec3 normal )\n"
8370 "{\n"
8371 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
8372 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
8373 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
8374 "\n"
8375 " vec3 light_delta = light_co.xyz-co;\n"
8376 " float dist2 = dot(light_delta,light_delta);\n"
8377 "\n"
8378 " light_delta = normalize( light_delta );\n"
8379 "\n"
8380 " float quadratic = dist2*100.0;\n"
8381 " float attenuation = 1.0/( 1.0 + quadratic );\n"
8382 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
8383 "\n"
8384 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
8385 "\n"
8386 " if( light_dir.w < 0.999999 ){\n"
8387 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
8388 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
8389 " }\n"
8390 "\n"
8391 " return light_colour.rgb * attenuation * falloff \n"
8392 " * step( g_day_phase, light_colour.w );\n"
8393 "}\n"
8394 "\n"
8395 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
8396 " vec3 halfview, vec3 co, vec3 normal )\n"
8397 "{\n"
8398 " uint light_count = packed_index & 0x3u;\n"
8399 "\n"
8400 " vec3 l = vec3(0.0);\n"
8401 "\n"
8402 " if( light_count >= 1u ){\n"
8403 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
8404 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
8405 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
8406 "\n"
8407 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
8408 "\n"
8409 " if( light_count >= 2u ){\n"
8410 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
8411 "\n"
8412 " if( light_count >= 3u ){\n"
8413 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
8414 " }\n"
8415 " }\n"
8416 " }\n"
8417 "\n"
8418 " return l;\n"
8419 "}\n"
8420 "\n"
8421 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
8422 " float light_mask )\n"
8423 "{\n"
8424 " if( g_light_preview == 1 )\n"
8425 " diffuse = vec3(0.75);\n"
8426 "\n"
8427 " // Lighting\n"
8428 " vec3 halfview = uCamera - co;\n"
8429 " float fdist = length(halfview);\n"
8430 " halfview /= fdist;\n"
8431 "\n"
8432 " float world_shadow = newlight_compute_sun_shadow( \n"
8433 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
8434 "\n"
8435 " vec3 total_light = clearskies_lighting( \n"
8436 " normal, min( light_mask, world_shadow ), halfview );\n"
8437 "\n"
8438 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
8439 " cube_coord = floor( cube_coord );\n"
8440 "\n"
8441 " if( g_debug_indices == 1 )\n"
8442 " {\n"
8443 " return rand33(cube_coord);\n"
8444 " }\n"
8445 "\n"
8446 " if( g_debug_complexity == 1 )\n"
8447 " {\n"
8448 " ivec3 coord = ivec3( cube_coord );\n"
8449 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
8450 "\n"
8451 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
8452 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
8453 " }\n"
8454 "\n"
8455 " // FIXME: this coord should absolutely must be clamped!\n"
8456 " \n"
8457 " ivec3 coord = ivec3( cube_coord );\n"
8458 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
8459 "\n"
8460 " total_light += \n"
8461 " scene_calculate_packed_light_patch( index_sample.x,\n"
8462 " halfview, co, normal ) \n"
8463 " * light_mask;\n"
8464 " total_light += \n"
8465 " scene_calculate_packed_light_patch( index_sample.y,\n"
8466 " halfview, co, normal )\n"
8467 " * light_mask;\n"
8468 "\n"
8469 " // Take a section of the sky function to give us a matching fog colour\n"
8470 "\n"
8471 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
8472 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
8473 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
8474 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
8475 " \n"
8476 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
8477 " sun_colour *= sun_shape;\n"
8478 "\n"
8479 " fog_colour += sun_colour;\n"
8480 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
8481 "}\n"
8482 "\n"
8483 "#line 14 0 \n"
8484 "#line 1 3 \n"
8485 "const float k_motion_lerp_amount = 0.01;\n"
8486 "\n"
8487 "#line 2 0 \n"
8488 "\n"
8489 "layout (location = 1) out vec2 oMotionVec;\n"
8490 "\n"
8491 "in vec3 aMotionVec0;\n"
8492 "in vec3 aMotionVec1;\n"
8493 "\n"
8494 "void compute_motion_vectors()\n"
8495 "{\n"
8496 " // Write motion vectors\n"
8497 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
8498 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
8499 "\n"
8500 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
8501 "}\n"
8502 "\n"
8503 "#line 15 0 \n"
8504 "\n"
8505 "float stars1( vec3 rd, float rr, float size ){\n"
8506 " vec3 co = rd * rr;\n"
8507 "\n"
8508 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
8509 "\n"
8510 " float spaces = 1.0 / rr;\n"
8511 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
8512 " a -= mod(a, spaces) - spaces * 0.5;\n"
8513 "\n"
8514 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
8515 " \n"
8516 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
8517 " plane = plane - mod(plane, PI / count);\n"
8518 "\n"
8519 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
8520 "\n"
8521 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
8522 " float ydist = sqrt(rr * rr - level * level);\n"
8523 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
8524 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
8525 " float star = smoothstep(size, 0.0, distance(center, co));\n"
8526 " return star;\n"
8527 "}\n"
8528 "\n"
8529 "void main(){\n"
8530 " compute_motion_vectors();\n"
8531 "\n"
8532 " vec3 rd = -normalize(aNorm);\n"
8533 "\n"
8534 " float star = 0.0;\n"
8535 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
8536 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
8537 " star += stars( rd, 1.94 * pow( 1.64, j ), m ) * (1.0 / pow(4.0, j));\n"
8538 " }\n"
8539 "\n"
8540 " oColour = vec4( vec3(star*20.0), 1.0);\n"
8541 "}\n"
8542 ""},
8543 };
8544
8545 GLuint _uniform_model_sky_space_uMdl;
8546 GLuint _uniform_model_sky_space_uPv;
8547 GLuint _uniform_model_sky_space_uPvmPrev;
8548 GLuint _uniform_model_sky_space_uTexGarbage;
8549 GLuint _uniform_model_sky_space_g_world_depth;
8550 GLuint _uniform_model_sky_space_uLightsArray;
8551 GLuint _uniform_model_sky_space_uLightsIndex;
8552 #include "shaders/model_menu.h"
8553 struct vg_shader _shader_model_menu = {
8554 .name = "model_menu",
8555 .vs =
8556 {
8557 .orig_file = "shaders/model.vs",
8558 .static_src =
8559 "layout (location=0) in vec3 a_co;\n"
8560 "layout (location=1) in vec3 a_norm;\n"
8561 "layout (location=2) in vec2 a_uv;\n"
8562 "layout (location=3) in vec4 a_colour;\n"
8563 "layout (location=4) in vec4 a_weights;\n"
8564 "layout (location=5) in ivec4 a_groups;\n"
8565 "\n"
8566 "#line 1 1 \n"
8567 "const float k_motion_lerp_amount = 0.01;\n"
8568 "\n"
8569 "#line 2 0 \n"
8570 "\n"
8571 "out vec3 aMotionVec0;\n"
8572 "out vec3 aMotionVec1;\n"
8573 "\n"
8574 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
8575 "{\n"
8576 " // This magically solves some artifacting errors!\n"
8577 " //\n"
8578 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
8579 "\n"
8580 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
8581 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
8582 "}\n"
8583 "\n"
8584 "#line 9 0 \n"
8585 "\n"
8586 "uniform mat4x3 uMdl;\n"
8587 "uniform mat4 uPv;\n"
8588 "uniform mat4 uPvmPrev;\n"
8589 "\n"
8590 "out vec4 aColour;\n"
8591 "out vec2 aUv;\n"
8592 "out vec3 aNorm;\n"
8593 "out vec3 aCo;\n"
8594 "out vec3 aWorldCo;\n"
8595 "\n"
8596 "void main()\n"
8597 "{\n"
8598 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
8599 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
8600 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
8601 "\n"
8602 " vs_motion_out( vproj0, vproj1 );\n"
8603 "\n"
8604 " gl_Position = vproj0;\n"
8605 " aWorldCo = world_pos0;\n"
8606 " aColour = a_colour;\n"
8607 " aUv = a_uv;\n"
8608 " aNorm = normalize( mat3(uMdl) * a_norm );\n"
8609 " aCo = a_co;\n"
8610 "}\n"
8611 ""},
8612 .fs =
8613 {
8614 .orig_file = "shaders/model_menu.fs",
8615 .static_src =
8616 "out vec4 FragColor;\n"
8617 "\n"
8618 "uniform sampler2D uTexMain;\n"
8619 "uniform vec4 uColour;\n"
8620 "\n"
8621 "in vec4 aColour;\n"
8622 "in vec2 aUv;\n"
8623 "in vec3 aNorm;\n"
8624 "in vec3 aCo;\n"
8625 "\n"
8626 "void main()\n"
8627 "{\n"
8628 " vec4 diffuse = texture( uTexMain, aUv );\n"
8629 "\n"
8630 " if( diffuse.a < 0.5 )\n"
8631 " discard;\n"
8632 "\n"
8633 " FragColor = vec4( diffuse.rgb, 1.0 ) * uColour;\n"
8634 "}\n"
8635 ""},
8636 };
8637
8638 GLuint _uniform_model_menu_uMdl;
8639 GLuint _uniform_model_menu_uPv;
8640 GLuint _uniform_model_menu_uPvmPrev;
8641 GLuint _uniform_model_menu_uTexMain;
8642 GLuint _uniform_model_menu_uColour;
8643 #include "shaders/model_character_view.h"
8644 struct vg_shader _shader_model_character_view = {
8645 .name = "model_character_view",
8646 .vs =
8647 {
8648 .orig_file = "shaders/model_skinned.vs",
8649 .static_src =
8650 "layout (location=0) in vec3 a_co;\n"
8651 "layout (location=1) in vec3 a_norm;\n"
8652 "layout (location=2) in vec2 a_uv;\n"
8653 "layout (location=3) in vec4 a_colour;\n"
8654 "layout (location=4) in vec4 a_weights;\n"
8655 "layout (location=5) in ivec4 a_groups;\n"
8656 "\n"
8657 "#line 1 1 \n"
8658 "const float k_motion_lerp_amount = 0.01;\n"
8659 "\n"
8660 "#line 2 0 \n"
8661 "\n"
8662 "out vec3 aMotionVec0;\n"
8663 "out vec3 aMotionVec1;\n"
8664 "\n"
8665 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
8666 "{\n"
8667 " // This magically solves some artifacting errors!\n"
8668 " //\n"
8669 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
8670 "\n"
8671 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
8672 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
8673 "}\n"
8674 "\n"
8675 "#line 9 0 \n"
8676 "\n"
8677 "uniform mat4 uPv;\n"
8678 "uniform mat4x3 uTransforms[32];\n"
8679 "\n"
8680 "out vec4 aColour;\n"
8681 "out vec2 aUv;\n"
8682 "out vec3 aNorm;\n"
8683 "out vec3 aCo;\n"
8684 "out vec3 aWorldCo;\n"
8685 "\n"
8686 "void main()\n"
8687 "{\n"
8688 " vec4 co_local = vec4( a_co, 1.0 );\n"
8689 " vec3 co0 = uTransforms[ a_groups[0] ] * co_local;\n"
8690 " vec3 co1 = uTransforms[ a_groups[1] ] * co_local;\n"
8691 " vec3 co2 = uTransforms[ a_groups[2] ] * co_local;\n"
8692 " vec3 n0 = mat3(uTransforms[ a_groups[0] ]) * a_norm;\n"
8693 " vec3 n1 = mat3(uTransforms[ a_groups[1] ]) * a_norm;\n"
8694 " vec3 n2 = mat3(uTransforms[ a_groups[2] ]) * a_norm;\n"
8695 "\n"
8696 " vec3 world_pos = co0*a_weights[0] + co1*a_weights[1] + co2*a_weights[2];\n"
8697 " vec3 world_normal = n0*a_weights[0] + n1*a_weights[1] + n2*a_weights[2];\n"
8698 " \n"
8699 " gl_Position = uPv * vec4( world_pos, 1.0 );\n"
8700 " aColour = a_colour;\n"
8701 " aUv = a_uv;\n"
8702 " aNorm = world_normal;\n"
8703 " aCo = a_co;\n"
8704 " aWorldCo = world_pos;\n"
8705 "\n"
8706 " // TODO: motion vectors\n"
8707 " aMotionVec0 = vec3(1.0);\n"
8708 " aMotionVec1 = vec3(1.0);\n"
8709 "}\n"
8710 ""},
8711 .fs =
8712 {
8713 .orig_file = "shaders/model_character_view.fs",
8714 .static_src =
8715 "uniform sampler2D uTexMain;\n"
8716 "uniform vec3 uCamera;\n"
8717 "\n"
8718 "in vec4 aColour;\n"
8719 "in vec2 aUv;\n"
8720 "in vec3 aNorm;\n"
8721 "in vec3 aCo;\n"
8722 "in vec3 aWorldCo;\n"
8723 "\n"
8724 "#line 1 1 \n"
8725 "// :D\n"
8726 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
8727 "\n"
8728 "#line 11 0 \n"
8729 "#line 1 2 \n"
8730 "layout (location = 0) out vec4 oColour;\n"
8731 "\n"
8732 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
8733 "layout (std140) uniform ub_world_lighting\n"
8734 "{\n"
8735 " vec4 g_cube_min;\n"
8736 " vec4 g_cube_inv_range;\n"
8737 "\n"
8738 " vec4 g_water_plane;\n"
8739 " vec4 g_depth_bounds;\n"
8740 "\n"
8741 " vec4 g_daysky_colour;\n"
8742 " vec4 g_nightsky_colour;\n"
8743 " vec4 g_sunset_colour;\n"
8744 " vec4 g_ambient_colour;\n"
8745 " vec4 g_sunset_ambient;\n"
8746 " vec4 g_sun_colour;\n"
8747 " vec4 g_sun_dir;\n"
8748 " vec4 g_board_0;\n"
8749 " vec4 g_board_1;\n"
8750 "\n"
8751 " float g_water_fog;\n"
8752 " float g_time;\n"
8753 " float g_realtime;\n"
8754 " float g_shadow_length;\n"
8755 " float g_shadow_spread;\n"
8756 "\n"
8757 " float g_time_of_day;\n"
8758 " float g_day_phase;\n"
8759 " float g_sunset_phase;\n"
8760 "\n"
8761 " int g_light_preview;\n"
8762 " int g_shadow_samples;\n"
8763 "\n"
8764 " int g_debug_indices;\n"
8765 " int g_debug_complexity;\n"
8766 "};\n"
8767 "\n"
8768 "uniform sampler2D g_world_depth;\n"
8769 "uniform samplerBuffer uLightsArray;\n"
8770 "uniform usampler3D uLightsIndex;\n"
8771 "\n"
8772 "#line 1 1 \n"
8773 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
8774 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
8775 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
8776 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
8777 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
8778 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
8779 "\n"
8780 "const float SUN_ANGLE = 0.0001;\n"
8781 "const float PI = 3.14159265358979323846264;\n"
8782 "\n"
8783 "//struct world_info\n"
8784 "//{\n"
8785 "// float time,\n"
8786 "// time_of_day,\n"
8787 "// day_phase,\n"
8788 "// sunset_phase;\n"
8789 "// \n"
8790 "// vec3 sun_dir;\n"
8791 "//};\n"
8792 "\n"
8793 "vec3 rand33(vec3 p3)\n"
8794 "{\n"
8795 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
8796 " p3 += dot(p3, p3.yxz+33.33);\n"
8797 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
8798 "}\n"
8799 "\n"
8800 "float stars( vec3 rd, float rr, float size ){\n"
8801 " vec3 co = rd * rr;\n"
8802 "\n"
8803 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
8804 "\n"
8805 " float spaces = 1.0 / rr;\n"
8806 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
8807 " a -= mod(a, spaces) - spaces * 0.5;\n"
8808 "\n"
8809 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
8810 " \n"
8811 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
8812 " plane = plane - mod(plane, PI / count);\n"
8813 "\n"
8814 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
8815 "\n"
8816 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
8817 " float ydist = sqrt(rr * rr - level * level);\n"
8818 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
8819 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
8820 " float star = smoothstep(size, 0.0, distance(center, co));\n"
8821 " return star;\n"
8822 "}\n"
8823 "\n"
8824 "float luminance( vec3 v )\n"
8825 "{\n"
8826 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
8827 "}\n"
8828 "\n"
8829 "vec3 clearskies_ambient( vec3 dir )\n"
8830 "{\n"
8831 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
8832 " float sky_gradient = dir.y;\n"
8833 " \n"
8834 " /* Blend phase colours */\n"
8835 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
8836 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
8837 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
8838 " \n"
8839 " /* Add gradient */\n"
8840 " ambient -= sky_gradient * luminance(ambient);\n"
8841 " \n"
8842 " return ambient;\n"
8843 "}\n"
8844 "\n"
8845 "vec3 clearskies_sky( vec3 ray_dir )\n"
8846 "{\n"
8847 " ray_dir.y = abs( ray_dir.y );\n"
8848 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
8849 " \n"
8850 " /* Sun */\n"
8851 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
8852 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
8853 " float sun_shape = pow( sun_size, 2000.0 );\n"
8854 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
8855 " \n"
8856 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
8857 " sun_colour *= sun_shape;\n"
8858 "\n"
8859 " \n"
8860 " float star = 0.0;\n"
8861 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
8862 "\n"
8863 " if( star_blend > 0.001 ){\n"
8864 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
8865 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
8866 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
8867 " }\n"
8868 " }\n"
8869 " \n"
8870 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
8871 " return composite;\n"
8872 "}\n"
8873 "\n"
8874 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
8875 "{\n"
8876 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
8877 "\n"
8878 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
8879 " g_sunset_phase );\n"
8880 "\n"
8881 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
8882 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
8883 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
8884 " ) * g_sun_colour.rgb * g_day_phase;\n"
8885 "\n"
8886 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
8887 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
8888 " g_sunset_phase );\n"
8889 "\n"
8890 " return ambient + (light_sun + sky_reflection) * shadow;\n"
8891 "}\n"
8892 "\n"
8893 "#line 44 0 \n"
8894 "\n"
8895 "float world_depth_sample( vec3 pos )\n"
8896 "{\n"
8897 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
8898 " return texture( g_world_depth, depth_coord ).r;\n"
8899 "}\n"
8900 "\n"
8901 "float world_water_depth( vec3 pos )\n"
8902 "{\n"
8903 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
8904 " return world_depth_sample( pos ) - ref_depth;\n"
8905 "}\n"
8906 "\n"
8907 "float shadow_sample( vec3 co ){\n"
8908 " float height_sample = world_depth_sample( co );\n"
8909 "\n"
8910 " float fdelta = height_sample - co.y;\n"
8911 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
8912 "}\n"
8913 "\n"
8914 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
8915 " if( g_shadow_samples == 0 ){\n"
8916 " return 1.0;\n"
8917 " }\n"
8918 "\n"
8919 " float fspread = g_shadow_spread;\n"
8920 " float flength = g_shadow_length;\n"
8921 "\n"
8922 " float famt = 0.0;\n"
8923 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
8924 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
8925 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
8926 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
8927 "\n"
8928 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
8929 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
8930 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
8931 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
8932 "\n"
8933 " return 1.0 - famt;\n"
8934 "}\n"
8935 "\n"
8936 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
8937 "{\n"
8938 " vec3 specdir = reflect( -dir, wnormal );\n"
8939 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
8940 "}\n"
8941 "\n"
8942 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
8943 " float dist = pow(fdist*0.0010,0.78);\n"
8944 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
8945 "}\n"
8946 "\n"
8947 "vec3 scene_calculate_light( int light_index, \n"
8948 " vec3 halfview, vec3 co, vec3 normal )\n"
8949 "{\n"
8950 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
8951 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
8952 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
8953 "\n"
8954 " vec3 light_delta = light_co.xyz-co;\n"
8955 " float dist2 = dot(light_delta,light_delta);\n"
8956 "\n"
8957 " light_delta = normalize( light_delta );\n"
8958 "\n"
8959 " float quadratic = dist2*100.0;\n"
8960 " float attenuation = 1.0/( 1.0 + quadratic );\n"
8961 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
8962 "\n"
8963 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
8964 "\n"
8965 " if( light_dir.w < 0.999999 ){\n"
8966 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
8967 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
8968 " }\n"
8969 "\n"
8970 " return light_colour.rgb * attenuation * falloff \n"
8971 " * step( g_day_phase, light_colour.w );\n"
8972 "}\n"
8973 "\n"
8974 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
8975 " vec3 halfview, vec3 co, vec3 normal )\n"
8976 "{\n"
8977 " uint light_count = packed_index & 0x3u;\n"
8978 "\n"
8979 " vec3 l = vec3(0.0);\n"
8980 "\n"
8981 " if( light_count >= 1u ){\n"
8982 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
8983 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
8984 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
8985 "\n"
8986 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
8987 "\n"
8988 " if( light_count >= 2u ){\n"
8989 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
8990 "\n"
8991 " if( light_count >= 3u ){\n"
8992 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
8993 " }\n"
8994 " }\n"
8995 " }\n"
8996 "\n"
8997 " return l;\n"
8998 "}\n"
8999 "\n"
9000 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
9001 " float light_mask )\n"
9002 "{\n"
9003 " if( g_light_preview == 1 )\n"
9004 " diffuse = vec3(0.75);\n"
9005 "\n"
9006 " // Lighting\n"
9007 " vec3 halfview = uCamera - co;\n"
9008 " float fdist = length(halfview);\n"
9009 " halfview /= fdist;\n"
9010 "\n"
9011 " float world_shadow = newlight_compute_sun_shadow( \n"
9012 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
9013 "\n"
9014 " vec3 total_light = clearskies_lighting( \n"
9015 " normal, min( light_mask, world_shadow ), halfview );\n"
9016 "\n"
9017 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
9018 " cube_coord = floor( cube_coord );\n"
9019 "\n"
9020 " if( g_debug_indices == 1 )\n"
9021 " {\n"
9022 " return rand33(cube_coord);\n"
9023 " }\n"
9024 "\n"
9025 " if( g_debug_complexity == 1 )\n"
9026 " {\n"
9027 " ivec3 coord = ivec3( cube_coord );\n"
9028 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
9029 "\n"
9030 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
9031 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
9032 " }\n"
9033 "\n"
9034 " // FIXME: this coord should absolutely must be clamped!\n"
9035 " \n"
9036 " ivec3 coord = ivec3( cube_coord );\n"
9037 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
9038 "\n"
9039 " total_light += \n"
9040 " scene_calculate_packed_light_patch( index_sample.x,\n"
9041 " halfview, co, normal ) \n"
9042 " * light_mask;\n"
9043 " total_light += \n"
9044 " scene_calculate_packed_light_patch( index_sample.y,\n"
9045 " halfview, co, normal )\n"
9046 " * light_mask;\n"
9047 "\n"
9048 " // Take a section of the sky function to give us a matching fog colour\n"
9049 "\n"
9050 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
9051 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
9052 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
9053 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
9054 " \n"
9055 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
9056 " sun_colour *= sun_shape;\n"
9057 "\n"
9058 " fog_colour += sun_colour;\n"
9059 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
9060 "}\n"
9061 "\n"
9062 "#line 12 0 \n"
9063 "#line 1 3 \n"
9064 "const float k_motion_lerp_amount = 0.01;\n"
9065 "\n"
9066 "#line 2 0 \n"
9067 "\n"
9068 "layout (location = 1) out vec2 oMotionVec;\n"
9069 "\n"
9070 "in vec3 aMotionVec0;\n"
9071 "in vec3 aMotionVec1;\n"
9072 "\n"
9073 "void compute_motion_vectors()\n"
9074 "{\n"
9075 " // Write motion vectors\n"
9076 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
9077 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
9078 "\n"
9079 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
9080 "}\n"
9081 "\n"
9082 "#line 13 0 \n"
9083 "#line 1 4 \n"
9084 "uniform sampler2D uTexSceneDepth;\n"
9085 "uniform vec3 uInverseRatioDepth;\n"
9086 "uniform vec3 uInverseRatioMain;\n"
9087 "uniform int uDepthMode;\n"
9088 "uniform float uDitherCutoff;\n"
9089 "\n"
9090 "float linear_depth( float depth, float near, float far ) {\n"
9091 " float z = depth * 2.0 - 1.0;\n"
9092 " return (2.0 * near * far) / (far + near - z * (far - near)); \n"
9093 "}\n"
9094 "\n"
9095 "void depth_compare_dither()\n"
9096 "{\n"
9097 " if( uDepthMode == 1 )\n"
9098 " {\n"
9099 " vec2 back_coord = gl_FragCoord.xy * uInverseRatioMain.xy \n"
9100 " * uInverseRatioDepth.xy;\n"
9101 " float back_depth = texture( uTexSceneDepth, back_coord ).r;\n"
9102 " float front_depth = gl_FragCoord.z/gl_FragCoord.w;\n"
9103 "\n"
9104 " back_depth = linear_depth( back_depth, 0.1, 2100.0 );\n"
9105 " float diff = back_depth - front_depth;\n"
9106 "\n"
9107 " vec2 ssuv = gl_FragCoord.xy;\n"
9108 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
9109 " float dither = fract( vDither.g / 71.0 ) - 0.5;\n"
9110 "\n"
9111 " if( step(0.0,diff)+dither<0.3 )\n"
9112 " discard;\n"
9113 " }\n"
9114 "\n"
9115 " if( uDepthMode == 2 )\n"
9116 " {\n"
9117 " vec2 ssuv = gl_FragCoord.xy;\n"
9118 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
9119 " float dither = fract( vDither.g / 71.0 );\n"
9120 " if( dither<uDitherCutoff ) discard;\n"
9121 " }\n"
9122 "}\n"
9123 "\n"
9124 "#line 14 0 \n"
9125 "\n"
9126 "vec3 character_clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
9127 "{\n"
9128 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
9129 "\n"
9130 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
9131 " g_sunset_phase );\n"
9132 "\n"
9133 "\n"
9134 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
9135 " vec3 light_sun = max(0.0, dot(normal,g_sun_dir.xyz)*0.5+0.5) \n"
9136 " * g_sun_colour.rgb * g_day_phase;\n"
9137 "\n"
9138 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
9139 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
9140 " g_sunset_phase );\n"
9141 "\n"
9142 " return ambient + (light_sun + sky_reflection) * shadow;\n"
9143 "}\n"
9144 "\n"
9145 "vec3 character_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
9146 " float light_mask )\n"
9147 "{\n"
9148 " if( g_light_preview == 1 )\n"
9149 " diffuse = vec3(0.75);\n"
9150 "\n"
9151 " // Lighting\n"
9152 " vec3 halfview = uCamera - co;\n"
9153 " float fdist = length(halfview);\n"
9154 " halfview /= fdist;\n"
9155 "\n"
9156 " float world_shadow = newlight_compute_sun_shadow( \n"
9157 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
9158 "\n"
9159 " vec3 total_light = character_clearskies_lighting( \n"
9160 " normal, min( light_mask, world_shadow ), halfview );\n"
9161 "\n"
9162 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
9163 " cube_coord = floor( cube_coord );\n"
9164 "\n"
9165 " if( g_debug_indices == 1 )\n"
9166 " {\n"
9167 " return rand33(cube_coord);\n"
9168 " }\n"
9169 "\n"
9170 " if( g_debug_complexity == 1 )\n"
9171 " {\n"
9172 " ivec3 coord = ivec3( cube_coord );\n"
9173 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
9174 "\n"
9175 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
9176 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
9177 " }\n"
9178 "\n"
9179 " // FIXME: this coord should absolutely must be clamped!\n"
9180 " \n"
9181 " ivec3 coord = ivec3( cube_coord );\n"
9182 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
9183 "\n"
9184 " total_light += \n"
9185 " scene_calculate_packed_light_patch( index_sample.x,\n"
9186 " halfview, co, normal ) \n"
9187 " * light_mask;\n"
9188 " total_light += \n"
9189 " scene_calculate_packed_light_patch( index_sample.y,\n"
9190 " halfview, co, normal )\n"
9191 " * light_mask;\n"
9192 "\n"
9193 " // Take a section of the sky function to give us a matching fog colour\n"
9194 "\n"
9195 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
9196 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
9197 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
9198 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
9199 " \n"
9200 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
9201 " sun_colour *= sun_shape;\n"
9202 "\n"
9203 " fog_colour += sun_colour;\n"
9204 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
9205 "}\n"
9206 "\n"
9207 "void main(){\n"
9208 " depth_compare_dither();\n"
9209 " compute_motion_vectors();\n"
9210 "\n"
9211 " vec3 qnorm = aNorm;\n"
9212 " vec3 diffuse = texture( uTexMain, aUv ).rgb;\n"
9213 " vec3 composite = character_compute_lighting( diffuse, qnorm, aWorldCo, 1.0 );\n"
9214 "\n"
9215 " float dist = distance( aWorldCo, uCamera ) - 0.08;\n"
9216 " float opacity = clamp( dist*dist, 0.0, 1.0 );\n"
9217 "\n"
9218 " oColour = vec4( composite, opacity );\n"
9219 "}\n"
9220 ""},
9221 };
9222
9223 GLuint _uniform_model_character_view_uPv;
9224 GLuint _uniform_model_character_view_uTransforms;
9225 GLuint _uniform_model_character_view_uTexMain;
9226 GLuint _uniform_model_character_view_uCamera;
9227 GLuint _uniform_model_character_view_g_world_depth;
9228 GLuint _uniform_model_character_view_uLightsArray;
9229 GLuint _uniform_model_character_view_uLightsIndex;
9230 GLuint _uniform_model_character_view_uTexSceneDepth;
9231 GLuint _uniform_model_character_view_uInverseRatioDepth;
9232 GLuint _uniform_model_character_view_uInverseRatioMain;
9233 GLuint _uniform_model_character_view_uDepthMode;
9234 GLuint _uniform_model_character_view_uDitherCutoff;
9235 #include "shaders/model_board_view.h"
9236 struct vg_shader _shader_model_board_view = {
9237 .name = "model_board_view",
9238 .vs =
9239 {
9240 .orig_file = "shaders/model.vs",
9241 .static_src =
9242 "layout (location=0) in vec3 a_co;\n"
9243 "layout (location=1) in vec3 a_norm;\n"
9244 "layout (location=2) in vec2 a_uv;\n"
9245 "layout (location=3) in vec4 a_colour;\n"
9246 "layout (location=4) in vec4 a_weights;\n"
9247 "layout (location=5) in ivec4 a_groups;\n"
9248 "\n"
9249 "#line 1 1 \n"
9250 "const float k_motion_lerp_amount = 0.01;\n"
9251 "\n"
9252 "#line 2 0 \n"
9253 "\n"
9254 "out vec3 aMotionVec0;\n"
9255 "out vec3 aMotionVec1;\n"
9256 "\n"
9257 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
9258 "{\n"
9259 " // This magically solves some artifacting errors!\n"
9260 " //\n"
9261 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
9262 "\n"
9263 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
9264 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
9265 "}\n"
9266 "\n"
9267 "#line 9 0 \n"
9268 "\n"
9269 "uniform mat4x3 uMdl;\n"
9270 "uniform mat4 uPv;\n"
9271 "uniform mat4 uPvmPrev;\n"
9272 "\n"
9273 "out vec4 aColour;\n"
9274 "out vec2 aUv;\n"
9275 "out vec3 aNorm;\n"
9276 "out vec3 aCo;\n"
9277 "out vec3 aWorldCo;\n"
9278 "\n"
9279 "void main()\n"
9280 "{\n"
9281 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
9282 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
9283 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
9284 "\n"
9285 " vs_motion_out( vproj0, vproj1 );\n"
9286 "\n"
9287 " gl_Position = vproj0;\n"
9288 " aWorldCo = world_pos0;\n"
9289 " aColour = a_colour;\n"
9290 " aUv = a_uv;\n"
9291 " aNorm = normalize( mat3(uMdl) * a_norm );\n"
9292 " aCo = a_co;\n"
9293 "}\n"
9294 ""},
9295 .fs =
9296 {
9297 .orig_file = "shaders/model_character_view.fs",
9298 .static_src =
9299 "uniform sampler2D uTexMain;\n"
9300 "uniform vec3 uCamera;\n"
9301 "\n"
9302 "in vec4 aColour;\n"
9303 "in vec2 aUv;\n"
9304 "in vec3 aNorm;\n"
9305 "in vec3 aCo;\n"
9306 "in vec3 aWorldCo;\n"
9307 "\n"
9308 "#line 1 1 \n"
9309 "// :D\n"
9310 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
9311 "\n"
9312 "#line 11 0 \n"
9313 "#line 1 2 \n"
9314 "layout (location = 0) out vec4 oColour;\n"
9315 "\n"
9316 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
9317 "layout (std140) uniform ub_world_lighting\n"
9318 "{\n"
9319 " vec4 g_cube_min;\n"
9320 " vec4 g_cube_inv_range;\n"
9321 "\n"
9322 " vec4 g_water_plane;\n"
9323 " vec4 g_depth_bounds;\n"
9324 "\n"
9325 " vec4 g_daysky_colour;\n"
9326 " vec4 g_nightsky_colour;\n"
9327 " vec4 g_sunset_colour;\n"
9328 " vec4 g_ambient_colour;\n"
9329 " vec4 g_sunset_ambient;\n"
9330 " vec4 g_sun_colour;\n"
9331 " vec4 g_sun_dir;\n"
9332 " vec4 g_board_0;\n"
9333 " vec4 g_board_1;\n"
9334 "\n"
9335 " float g_water_fog;\n"
9336 " float g_time;\n"
9337 " float g_realtime;\n"
9338 " float g_shadow_length;\n"
9339 " float g_shadow_spread;\n"
9340 "\n"
9341 " float g_time_of_day;\n"
9342 " float g_day_phase;\n"
9343 " float g_sunset_phase;\n"
9344 "\n"
9345 " int g_light_preview;\n"
9346 " int g_shadow_samples;\n"
9347 "\n"
9348 " int g_debug_indices;\n"
9349 " int g_debug_complexity;\n"
9350 "};\n"
9351 "\n"
9352 "uniform sampler2D g_world_depth;\n"
9353 "uniform samplerBuffer uLightsArray;\n"
9354 "uniform usampler3D uLightsIndex;\n"
9355 "\n"
9356 "#line 1 1 \n"
9357 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
9358 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
9359 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
9360 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
9361 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
9362 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
9363 "\n"
9364 "const float SUN_ANGLE = 0.0001;\n"
9365 "const float PI = 3.14159265358979323846264;\n"
9366 "\n"
9367 "//struct world_info\n"
9368 "//{\n"
9369 "// float time,\n"
9370 "// time_of_day,\n"
9371 "// day_phase,\n"
9372 "// sunset_phase;\n"
9373 "// \n"
9374 "// vec3 sun_dir;\n"
9375 "//};\n"
9376 "\n"
9377 "vec3 rand33(vec3 p3)\n"
9378 "{\n"
9379 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
9380 " p3 += dot(p3, p3.yxz+33.33);\n"
9381 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
9382 "}\n"
9383 "\n"
9384 "float stars( vec3 rd, float rr, float size ){\n"
9385 " vec3 co = rd * rr;\n"
9386 "\n"
9387 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
9388 "\n"
9389 " float spaces = 1.0 / rr;\n"
9390 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
9391 " a -= mod(a, spaces) - spaces * 0.5;\n"
9392 "\n"
9393 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
9394 " \n"
9395 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
9396 " plane = plane - mod(plane, PI / count);\n"
9397 "\n"
9398 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
9399 "\n"
9400 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
9401 " float ydist = sqrt(rr * rr - level * level);\n"
9402 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
9403 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
9404 " float star = smoothstep(size, 0.0, distance(center, co));\n"
9405 " return star;\n"
9406 "}\n"
9407 "\n"
9408 "float luminance( vec3 v )\n"
9409 "{\n"
9410 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
9411 "}\n"
9412 "\n"
9413 "vec3 clearskies_ambient( vec3 dir )\n"
9414 "{\n"
9415 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
9416 " float sky_gradient = dir.y;\n"
9417 " \n"
9418 " /* Blend phase colours */\n"
9419 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
9420 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
9421 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
9422 " \n"
9423 " /* Add gradient */\n"
9424 " ambient -= sky_gradient * luminance(ambient);\n"
9425 " \n"
9426 " return ambient;\n"
9427 "}\n"
9428 "\n"
9429 "vec3 clearskies_sky( vec3 ray_dir )\n"
9430 "{\n"
9431 " ray_dir.y = abs( ray_dir.y );\n"
9432 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
9433 " \n"
9434 " /* Sun */\n"
9435 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
9436 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
9437 " float sun_shape = pow( sun_size, 2000.0 );\n"
9438 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
9439 " \n"
9440 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
9441 " sun_colour *= sun_shape;\n"
9442 "\n"
9443 " \n"
9444 " float star = 0.0;\n"
9445 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
9446 "\n"
9447 " if( star_blend > 0.001 ){\n"
9448 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
9449 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
9450 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
9451 " }\n"
9452 " }\n"
9453 " \n"
9454 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
9455 " return composite;\n"
9456 "}\n"
9457 "\n"
9458 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
9459 "{\n"
9460 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
9461 "\n"
9462 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
9463 " g_sunset_phase );\n"
9464 "\n"
9465 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
9466 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
9467 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
9468 " ) * g_sun_colour.rgb * g_day_phase;\n"
9469 "\n"
9470 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
9471 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
9472 " g_sunset_phase );\n"
9473 "\n"
9474 " return ambient + (light_sun + sky_reflection) * shadow;\n"
9475 "}\n"
9476 "\n"
9477 "#line 44 0 \n"
9478 "\n"
9479 "float world_depth_sample( vec3 pos )\n"
9480 "{\n"
9481 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
9482 " return texture( g_world_depth, depth_coord ).r;\n"
9483 "}\n"
9484 "\n"
9485 "float world_water_depth( vec3 pos )\n"
9486 "{\n"
9487 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
9488 " return world_depth_sample( pos ) - ref_depth;\n"
9489 "}\n"
9490 "\n"
9491 "float shadow_sample( vec3 co ){\n"
9492 " float height_sample = world_depth_sample( co );\n"
9493 "\n"
9494 " float fdelta = height_sample - co.y;\n"
9495 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
9496 "}\n"
9497 "\n"
9498 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
9499 " if( g_shadow_samples == 0 ){\n"
9500 " return 1.0;\n"
9501 " }\n"
9502 "\n"
9503 " float fspread = g_shadow_spread;\n"
9504 " float flength = g_shadow_length;\n"
9505 "\n"
9506 " float famt = 0.0;\n"
9507 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
9508 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
9509 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
9510 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
9511 "\n"
9512 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
9513 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
9514 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
9515 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
9516 "\n"
9517 " return 1.0 - famt;\n"
9518 "}\n"
9519 "\n"
9520 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
9521 "{\n"
9522 " vec3 specdir = reflect( -dir, wnormal );\n"
9523 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
9524 "}\n"
9525 "\n"
9526 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
9527 " float dist = pow(fdist*0.0010,0.78);\n"
9528 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
9529 "}\n"
9530 "\n"
9531 "vec3 scene_calculate_light( int light_index, \n"
9532 " vec3 halfview, vec3 co, vec3 normal )\n"
9533 "{\n"
9534 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
9535 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
9536 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
9537 "\n"
9538 " vec3 light_delta = light_co.xyz-co;\n"
9539 " float dist2 = dot(light_delta,light_delta);\n"
9540 "\n"
9541 " light_delta = normalize( light_delta );\n"
9542 "\n"
9543 " float quadratic = dist2*100.0;\n"
9544 " float attenuation = 1.0/( 1.0 + quadratic );\n"
9545 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
9546 "\n"
9547 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
9548 "\n"
9549 " if( light_dir.w < 0.999999 ){\n"
9550 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
9551 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
9552 " }\n"
9553 "\n"
9554 " return light_colour.rgb * attenuation * falloff \n"
9555 " * step( g_day_phase, light_colour.w );\n"
9556 "}\n"
9557 "\n"
9558 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
9559 " vec3 halfview, vec3 co, vec3 normal )\n"
9560 "{\n"
9561 " uint light_count = packed_index & 0x3u;\n"
9562 "\n"
9563 " vec3 l = vec3(0.0);\n"
9564 "\n"
9565 " if( light_count >= 1u ){\n"
9566 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
9567 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
9568 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
9569 "\n"
9570 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
9571 "\n"
9572 " if( light_count >= 2u ){\n"
9573 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
9574 "\n"
9575 " if( light_count >= 3u ){\n"
9576 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
9577 " }\n"
9578 " }\n"
9579 " }\n"
9580 "\n"
9581 " return l;\n"
9582 "}\n"
9583 "\n"
9584 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
9585 " float light_mask )\n"
9586 "{\n"
9587 " if( g_light_preview == 1 )\n"
9588 " diffuse = vec3(0.75);\n"
9589 "\n"
9590 " // Lighting\n"
9591 " vec3 halfview = uCamera - co;\n"
9592 " float fdist = length(halfview);\n"
9593 " halfview /= fdist;\n"
9594 "\n"
9595 " float world_shadow = newlight_compute_sun_shadow( \n"
9596 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
9597 "\n"
9598 " vec3 total_light = clearskies_lighting( \n"
9599 " normal, min( light_mask, world_shadow ), halfview );\n"
9600 "\n"
9601 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
9602 " cube_coord = floor( cube_coord );\n"
9603 "\n"
9604 " if( g_debug_indices == 1 )\n"
9605 " {\n"
9606 " return rand33(cube_coord);\n"
9607 " }\n"
9608 "\n"
9609 " if( g_debug_complexity == 1 )\n"
9610 " {\n"
9611 " ivec3 coord = ivec3( cube_coord );\n"
9612 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
9613 "\n"
9614 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
9615 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
9616 " }\n"
9617 "\n"
9618 " // FIXME: this coord should absolutely must be clamped!\n"
9619 " \n"
9620 " ivec3 coord = ivec3( cube_coord );\n"
9621 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
9622 "\n"
9623 " total_light += \n"
9624 " scene_calculate_packed_light_patch( index_sample.x,\n"
9625 " halfview, co, normal ) \n"
9626 " * light_mask;\n"
9627 " total_light += \n"
9628 " scene_calculate_packed_light_patch( index_sample.y,\n"
9629 " halfview, co, normal )\n"
9630 " * light_mask;\n"
9631 "\n"
9632 " // Take a section of the sky function to give us a matching fog colour\n"
9633 "\n"
9634 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
9635 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
9636 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
9637 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
9638 " \n"
9639 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
9640 " sun_colour *= sun_shape;\n"
9641 "\n"
9642 " fog_colour += sun_colour;\n"
9643 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
9644 "}\n"
9645 "\n"
9646 "#line 12 0 \n"
9647 "#line 1 3 \n"
9648 "const float k_motion_lerp_amount = 0.01;\n"
9649 "\n"
9650 "#line 2 0 \n"
9651 "\n"
9652 "layout (location = 1) out vec2 oMotionVec;\n"
9653 "\n"
9654 "in vec3 aMotionVec0;\n"
9655 "in vec3 aMotionVec1;\n"
9656 "\n"
9657 "void compute_motion_vectors()\n"
9658 "{\n"
9659 " // Write motion vectors\n"
9660 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
9661 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
9662 "\n"
9663 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
9664 "}\n"
9665 "\n"
9666 "#line 13 0 \n"
9667 "#line 1 4 \n"
9668 "uniform sampler2D uTexSceneDepth;\n"
9669 "uniform vec3 uInverseRatioDepth;\n"
9670 "uniform vec3 uInverseRatioMain;\n"
9671 "uniform int uDepthMode;\n"
9672 "uniform float uDitherCutoff;\n"
9673 "\n"
9674 "float linear_depth( float depth, float near, float far ) {\n"
9675 " float z = depth * 2.0 - 1.0;\n"
9676 " return (2.0 * near * far) / (far + near - z * (far - near)); \n"
9677 "}\n"
9678 "\n"
9679 "void depth_compare_dither()\n"
9680 "{\n"
9681 " if( uDepthMode == 1 )\n"
9682 " {\n"
9683 " vec2 back_coord = gl_FragCoord.xy * uInverseRatioMain.xy \n"
9684 " * uInverseRatioDepth.xy;\n"
9685 " float back_depth = texture( uTexSceneDepth, back_coord ).r;\n"
9686 " float front_depth = gl_FragCoord.z/gl_FragCoord.w;\n"
9687 "\n"
9688 " back_depth = linear_depth( back_depth, 0.1, 2100.0 );\n"
9689 " float diff = back_depth - front_depth;\n"
9690 "\n"
9691 " vec2 ssuv = gl_FragCoord.xy;\n"
9692 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
9693 " float dither = fract( vDither.g / 71.0 ) - 0.5;\n"
9694 "\n"
9695 " if( step(0.0,diff)+dither<0.3 )\n"
9696 " discard;\n"
9697 " }\n"
9698 "\n"
9699 " if( uDepthMode == 2 )\n"
9700 " {\n"
9701 " vec2 ssuv = gl_FragCoord.xy;\n"
9702 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
9703 " float dither = fract( vDither.g / 71.0 );\n"
9704 " if( dither<uDitherCutoff ) discard;\n"
9705 " }\n"
9706 "}\n"
9707 "\n"
9708 "#line 14 0 \n"
9709 "\n"
9710 "vec3 character_clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
9711 "{\n"
9712 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
9713 "\n"
9714 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
9715 " g_sunset_phase );\n"
9716 "\n"
9717 "\n"
9718 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
9719 " vec3 light_sun = max(0.0, dot(normal,g_sun_dir.xyz)*0.5+0.5) \n"
9720 " * g_sun_colour.rgb * g_day_phase;\n"
9721 "\n"
9722 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
9723 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
9724 " g_sunset_phase );\n"
9725 "\n"
9726 " return ambient + (light_sun + sky_reflection) * shadow;\n"
9727 "}\n"
9728 "\n"
9729 "vec3 character_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
9730 " float light_mask )\n"
9731 "{\n"
9732 " if( g_light_preview == 1 )\n"
9733 " diffuse = vec3(0.75);\n"
9734 "\n"
9735 " // Lighting\n"
9736 " vec3 halfview = uCamera - co;\n"
9737 " float fdist = length(halfview);\n"
9738 " halfview /= fdist;\n"
9739 "\n"
9740 " float world_shadow = newlight_compute_sun_shadow( \n"
9741 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
9742 "\n"
9743 " vec3 total_light = character_clearskies_lighting( \n"
9744 " normal, min( light_mask, world_shadow ), halfview );\n"
9745 "\n"
9746 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
9747 " cube_coord = floor( cube_coord );\n"
9748 "\n"
9749 " if( g_debug_indices == 1 )\n"
9750 " {\n"
9751 " return rand33(cube_coord);\n"
9752 " }\n"
9753 "\n"
9754 " if( g_debug_complexity == 1 )\n"
9755 " {\n"
9756 " ivec3 coord = ivec3( cube_coord );\n"
9757 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
9758 "\n"
9759 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
9760 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
9761 " }\n"
9762 "\n"
9763 " // FIXME: this coord should absolutely must be clamped!\n"
9764 " \n"
9765 " ivec3 coord = ivec3( cube_coord );\n"
9766 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
9767 "\n"
9768 " total_light += \n"
9769 " scene_calculate_packed_light_patch( index_sample.x,\n"
9770 " halfview, co, normal ) \n"
9771 " * light_mask;\n"
9772 " total_light += \n"
9773 " scene_calculate_packed_light_patch( index_sample.y,\n"
9774 " halfview, co, normal )\n"
9775 " * light_mask;\n"
9776 "\n"
9777 " // Take a section of the sky function to give us a matching fog colour\n"
9778 "\n"
9779 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
9780 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
9781 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
9782 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
9783 " \n"
9784 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
9785 " sun_colour *= sun_shape;\n"
9786 "\n"
9787 " fog_colour += sun_colour;\n"
9788 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
9789 "}\n"
9790 "\n"
9791 "void main(){\n"
9792 " depth_compare_dither();\n"
9793 " compute_motion_vectors();\n"
9794 "\n"
9795 " vec3 qnorm = aNorm;\n"
9796 " vec3 diffuse = texture( uTexMain, aUv ).rgb;\n"
9797 " vec3 composite = character_compute_lighting( diffuse, qnorm, aWorldCo, 1.0 );\n"
9798 "\n"
9799 " float dist = distance( aWorldCo, uCamera ) - 0.08;\n"
9800 " float opacity = clamp( dist*dist, 0.0, 1.0 );\n"
9801 "\n"
9802 " oColour = vec4( composite, opacity );\n"
9803 "}\n"
9804 ""},
9805 };
9806
9807 GLuint _uniform_model_board_view_uMdl;
9808 GLuint _uniform_model_board_view_uPv;
9809 GLuint _uniform_model_board_view_uPvmPrev;
9810 GLuint _uniform_model_board_view_uTexMain;
9811 GLuint _uniform_model_board_view_uCamera;
9812 GLuint _uniform_model_board_view_g_world_depth;
9813 GLuint _uniform_model_board_view_uLightsArray;
9814 GLuint _uniform_model_board_view_uLightsIndex;
9815 GLuint _uniform_model_board_view_uTexSceneDepth;
9816 GLuint _uniform_model_board_view_uInverseRatioDepth;
9817 GLuint _uniform_model_board_view_uInverseRatioMain;
9818 GLuint _uniform_model_board_view_uDepthMode;
9819 GLuint _uniform_model_board_view_uDitherCutoff;
9820 #include "shaders/model_entity.h"
9821 struct vg_shader _shader_model_entity = {
9822 .name = "model_entity",
9823 .vs =
9824 {
9825 .orig_file = "shaders/model.vs",
9826 .static_src =
9827 "layout (location=0) in vec3 a_co;\n"
9828 "layout (location=1) in vec3 a_norm;\n"
9829 "layout (location=2) in vec2 a_uv;\n"
9830 "layout (location=3) in vec4 a_colour;\n"
9831 "layout (location=4) in vec4 a_weights;\n"
9832 "layout (location=5) in ivec4 a_groups;\n"
9833 "\n"
9834 "#line 1 1 \n"
9835 "const float k_motion_lerp_amount = 0.01;\n"
9836 "\n"
9837 "#line 2 0 \n"
9838 "\n"
9839 "out vec3 aMotionVec0;\n"
9840 "out vec3 aMotionVec1;\n"
9841 "\n"
9842 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
9843 "{\n"
9844 " // This magically solves some artifacting errors!\n"
9845 " //\n"
9846 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
9847 "\n"
9848 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
9849 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
9850 "}\n"
9851 "\n"
9852 "#line 9 0 \n"
9853 "\n"
9854 "uniform mat4x3 uMdl;\n"
9855 "uniform mat4 uPv;\n"
9856 "uniform mat4 uPvmPrev;\n"
9857 "\n"
9858 "out vec4 aColour;\n"
9859 "out vec2 aUv;\n"
9860 "out vec3 aNorm;\n"
9861 "out vec3 aCo;\n"
9862 "out vec3 aWorldCo;\n"
9863 "\n"
9864 "void main()\n"
9865 "{\n"
9866 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
9867 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
9868 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
9869 "\n"
9870 " vs_motion_out( vproj0, vproj1 );\n"
9871 "\n"
9872 " gl_Position = vproj0;\n"
9873 " aWorldCo = world_pos0;\n"
9874 " aColour = a_colour;\n"
9875 " aUv = a_uv;\n"
9876 " aNorm = normalize( mat3(uMdl) * a_norm );\n"
9877 " aCo = a_co;\n"
9878 "}\n"
9879 ""},
9880 .fs =
9881 {
9882 .orig_file = "shaders/model_entity.fs",
9883 .static_src =
9884 "uniform sampler2D uTexMain;\n"
9885 "uniform vec3 uCamera;\n"
9886 "\n"
9887 "in vec4 aColour;\n"
9888 "in vec2 aUv;\n"
9889 "in vec3 aNorm;\n"
9890 "in vec3 aCo;\n"
9891 "in vec3 aWorldCo;\n"
9892 "\n"
9893 "#line 1 1 \n"
9894 "// :D\n"
9895 "const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n"
9896 "\n"
9897 "#line 11 0 \n"
9898 "#line 1 2 \n"
9899 "layout (location = 0) out vec4 oColour;\n"
9900 "\n"
9901 "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n"
9902 "layout (std140) uniform ub_world_lighting\n"
9903 "{\n"
9904 " vec4 g_cube_min;\n"
9905 " vec4 g_cube_inv_range;\n"
9906 "\n"
9907 " vec4 g_water_plane;\n"
9908 " vec4 g_depth_bounds;\n"
9909 "\n"
9910 " vec4 g_daysky_colour;\n"
9911 " vec4 g_nightsky_colour;\n"
9912 " vec4 g_sunset_colour;\n"
9913 " vec4 g_ambient_colour;\n"
9914 " vec4 g_sunset_ambient;\n"
9915 " vec4 g_sun_colour;\n"
9916 " vec4 g_sun_dir;\n"
9917 " vec4 g_board_0;\n"
9918 " vec4 g_board_1;\n"
9919 "\n"
9920 " float g_water_fog;\n"
9921 " float g_time;\n"
9922 " float g_realtime;\n"
9923 " float g_shadow_length;\n"
9924 " float g_shadow_spread;\n"
9925 "\n"
9926 " float g_time_of_day;\n"
9927 " float g_day_phase;\n"
9928 " float g_sunset_phase;\n"
9929 "\n"
9930 " int g_light_preview;\n"
9931 " int g_shadow_samples;\n"
9932 "\n"
9933 " int g_debug_indices;\n"
9934 " int g_debug_complexity;\n"
9935 "};\n"
9936 "\n"
9937 "uniform sampler2D g_world_depth;\n"
9938 "uniform samplerBuffer uLightsArray;\n"
9939 "uniform usampler3D uLightsIndex;\n"
9940 "\n"
9941 "#line 1 1 \n"
9942 "//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n"
9943 "//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n"
9944 "//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n"
9945 "//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n"
9946 "//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n"
9947 "//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n"
9948 "\n"
9949 "const float SUN_ANGLE = 0.0001;\n"
9950 "const float PI = 3.14159265358979323846264;\n"
9951 "\n"
9952 "//struct world_info\n"
9953 "//{\n"
9954 "// float time,\n"
9955 "// time_of_day,\n"
9956 "// day_phase,\n"
9957 "// sunset_phase;\n"
9958 "// \n"
9959 "// vec3 sun_dir;\n"
9960 "//};\n"
9961 "\n"
9962 "vec3 rand33(vec3 p3)\n"
9963 "{\n"
9964 " p3 = fract(p3 * vec3(.1031, .1030, .0973));\n"
9965 " p3 += dot(p3, p3.yxz+33.33);\n"
9966 " return fract((p3.xxy + p3.yxx)*p3.zyx);\n"
9967 "}\n"
9968 "\n"
9969 "float stars( vec3 rd, float rr, float size ){\n"
9970 " vec3 co = rd * rr;\n"
9971 "\n"
9972 " float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n"
9973 "\n"
9974 " float spaces = 1.0 / rr;\n"
9975 " size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n"
9976 " a -= mod(a, spaces) - spaces * 0.5;\n"
9977 "\n"
9978 " float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n"
9979 " \n"
9980 " float plane = atan(co.z, co.x) + 4.0 * PI;\n"
9981 " plane = plane - mod(plane, PI / count);\n"
9982 "\n"
9983 " vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n"
9984 "\n"
9985 " float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n"
9986 " float ydist = sqrt(rr * rr - level * level);\n"
9987 " float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n"
9988 " vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n"
9989 " float star = smoothstep(size, 0.0, distance(center, co));\n"
9990 " return star;\n"
9991 "}\n"
9992 "\n"
9993 "float luminance( vec3 v )\n"
9994 "{\n"
9995 " return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n"
9996 "}\n"
9997 "\n"
9998 "vec3 clearskies_ambient( vec3 dir )\n"
9999 "{\n"
10000 " float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n"
10001 " float sky_gradient = dir.y;\n"
10002 " \n"
10003 " /* Blend phase colours */\n"
10004 " vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n"
10005 " ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n"
10006 " ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n"
10007 " \n"
10008 " /* Add gradient */\n"
10009 " ambient -= sky_gradient * luminance(ambient);\n"
10010 " \n"
10011 " return ambient;\n"
10012 "}\n"
10013 "\n"
10014 "vec3 clearskies_sky( vec3 ray_dir )\n"
10015 "{\n"
10016 " ray_dir.y = abs( ray_dir.y );\n"
10017 " vec3 sky_colour = clearskies_ambient( ray_dir );\n"
10018 " \n"
10019 " /* Sun */\n"
10020 " float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n"
10021 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n"
10022 " float sun_shape = pow( sun_size, 2000.0 );\n"
10023 " sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
10024 " \n"
10025 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
10026 " sun_colour *= sun_shape;\n"
10027 "\n"
10028 " \n"
10029 " float star = 0.0;\n"
10030 " float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n"
10031 "\n"
10032 " if( star_blend > 0.001 ){\n"
10033 " for( float j = 1.0; j <= 4.1; j += 1.0 ){\n"
10034 " float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n"
10035 " star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n"
10036 " }\n"
10037 " }\n"
10038 " \n"
10039 " vec3 composite = sky_colour + sun_colour + star*star_blend;\n"
10040 " return composite;\n"
10041 "}\n"
10042 "\n"
10043 "vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
10044 "{\n"
10045 " float fresnel = 1.0 - abs(dot(normal,halfview));\n"
10046 "\n"
10047 " vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
10048 " g_sunset_phase );\n"
10049 "\n"
10050 " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n"
10051 " vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n"
10052 " dot(normal,g_sun_dir.xyz)*0.75+0.25\n"
10053 " ) * g_sun_colour.rgb * g_day_phase;\n"
10054 "\n"
10055 " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n"
10056 " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n"
10057 " g_sunset_phase );\n"
10058 "\n"
10059 " return ambient + (light_sun + sky_reflection) * shadow;\n"
10060 "}\n"
10061 "\n"
10062 "#line 44 0 \n"
10063 "\n"
10064 "float world_depth_sample( vec3 pos )\n"
10065 "{\n"
10066 " vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n"
10067 " return texture( g_world_depth, depth_coord ).r;\n"
10068 "}\n"
10069 "\n"
10070 "float world_water_depth( vec3 pos )\n"
10071 "{\n"
10072 " float ref_depth = g_water_plane.y*g_water_plane.w;\n"
10073 " return world_depth_sample( pos ) - ref_depth;\n"
10074 "}\n"
10075 "\n"
10076 "float shadow_sample( vec3 co ){\n"
10077 " float height_sample = world_depth_sample( co );\n"
10078 "\n"
10079 " float fdelta = height_sample - co.y;\n"
10080 " return clamp( fdelta, 0.2, 0.4 )-0.2;\n"
10081 "}\n"
10082 "\n"
10083 "float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n"
10084 " if( g_shadow_samples == 0 ){\n"
10085 " return 1.0;\n"
10086 " }\n"
10087 "\n"
10088 " float fspread = g_shadow_spread;\n"
10089 " float flength = g_shadow_length;\n"
10090 "\n"
10091 " float famt = 0.0;\n"
10092 " famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n"
10093 " famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n"
10094 " famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n"
10095 " famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n"
10096 "\n"
10097 " //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n"
10098 " //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
10099 " //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
10100 " //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
10101 "\n"
10102 " return 1.0 - famt;\n"
10103 "}\n"
10104 "\n"
10105 "float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n"
10106 "{\n"
10107 " vec3 specdir = reflect( -dir, wnormal );\n"
10108 " return pow(max(dot( halfview, specdir ), 0.0), exponent);\n"
10109 "}\n"
10110 "\n"
10111 "vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n"
10112 " float dist = pow(fdist*0.0010,0.78);\n"
10113 " return mix( vfrag, colour, min( 1.0, dist ) );\n"
10114 "}\n"
10115 "\n"
10116 "vec3 scene_calculate_light( int light_index, \n"
10117 " vec3 halfview, vec3 co, vec3 normal )\n"
10118 "{\n"
10119 " vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n"
10120 " vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n"
10121 " vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n"
10122 "\n"
10123 " vec3 light_delta = light_co.xyz-co;\n"
10124 " float dist2 = dot(light_delta,light_delta);\n"
10125 "\n"
10126 " light_delta = normalize( light_delta );\n"
10127 "\n"
10128 " float quadratic = dist2*100.0;\n"
10129 " float attenuation = 1.0/( 1.0 + quadratic );\n"
10130 " attenuation *= max( dot( light_delta, normal ), 0.0 );\n"
10131 "\n"
10132 " float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n"
10133 "\n"
10134 " if( light_dir.w < 0.999999 ){\n"
10135 " float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n"
10136 " falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n"
10137 " }\n"
10138 "\n"
10139 " return light_colour.rgb * attenuation * falloff \n"
10140 " * step( g_day_phase, light_colour.w );\n"
10141 "}\n"
10142 "\n"
10143 "vec3 scene_calculate_packed_light_patch( uint packed_index, \n"
10144 " vec3 halfview, vec3 co, vec3 normal )\n"
10145 "{\n"
10146 " uint light_count = packed_index & 0x3u;\n"
10147 "\n"
10148 " vec3 l = vec3(0.0);\n"
10149 "\n"
10150 " if( light_count >= 1u ){\n"
10151 " int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n"
10152 " int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n"
10153 " int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n"
10154 "\n"
10155 " l += scene_calculate_light( index_0, halfview, co, normal );\n"
10156 "\n"
10157 " if( light_count >= 2u ){\n"
10158 " l += scene_calculate_light( index_1, halfview, co, normal );\n"
10159 "\n"
10160 " if( light_count >= 3u ){\n"
10161 " l += scene_calculate_light( index_2, halfview, co, normal );\n"
10162 " }\n"
10163 " }\n"
10164 " }\n"
10165 "\n"
10166 " return l;\n"
10167 "}\n"
10168 "\n"
10169 "vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n"
10170 " float light_mask )\n"
10171 "{\n"
10172 " if( g_light_preview == 1 )\n"
10173 " diffuse = vec3(0.75);\n"
10174 "\n"
10175 " // Lighting\n"
10176 " vec3 halfview = uCamera - co;\n"
10177 " float fdist = length(halfview);\n"
10178 " halfview /= fdist;\n"
10179 "\n"
10180 " float world_shadow = newlight_compute_sun_shadow( \n"
10181 " co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n"
10182 "\n"
10183 " vec3 total_light = clearskies_lighting( \n"
10184 " normal, min( light_mask, world_shadow ), halfview );\n"
10185 "\n"
10186 " vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n"
10187 " cube_coord = floor( cube_coord );\n"
10188 "\n"
10189 " if( g_debug_indices == 1 )\n"
10190 " {\n"
10191 " return rand33(cube_coord);\n"
10192 " }\n"
10193 "\n"
10194 " if( g_debug_complexity == 1 )\n"
10195 " {\n"
10196 " ivec3 coord = ivec3( cube_coord );\n"
10197 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
10198 "\n"
10199 " uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n"
10200 " return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n"
10201 " }\n"
10202 "\n"
10203 " // FIXME: this coord should absolutely must be clamped!\n"
10204 " \n"
10205 " ivec3 coord = ivec3( cube_coord );\n"
10206 " uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n"
10207 "\n"
10208 " total_light += \n"
10209 " scene_calculate_packed_light_patch( index_sample.x,\n"
10210 " halfview, co, normal ) \n"
10211 " * light_mask;\n"
10212 " total_light += \n"
10213 " scene_calculate_packed_light_patch( index_sample.y,\n"
10214 " halfview, co, normal )\n"
10215 " * light_mask;\n"
10216 "\n"
10217 " // Take a section of the sky function to give us a matching fog colour\n"
10218 "\n"
10219 " vec3 fog_colour = clearskies_ambient( -halfview );\n"
10220 " float sun_theta = dot( -halfview, g_sun_dir.xyz );\n"
10221 " float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n"
10222 " float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n"
10223 " \n"
10224 " vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n"
10225 " sun_colour *= sun_shape;\n"
10226 "\n"
10227 " fog_colour += sun_colour;\n"
10228 " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n"
10229 "}\n"
10230 "\n"
10231 "#line 12 0 \n"
10232 "#line 1 3 \n"
10233 "const float k_motion_lerp_amount = 0.01;\n"
10234 "\n"
10235 "#line 2 0 \n"
10236 "\n"
10237 "layout (location = 1) out vec2 oMotionVec;\n"
10238 "\n"
10239 "in vec3 aMotionVec0;\n"
10240 "in vec3 aMotionVec1;\n"
10241 "\n"
10242 "void compute_motion_vectors()\n"
10243 "{\n"
10244 " // Write motion vectors\n"
10245 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
10246 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
10247 "\n"
10248 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
10249 "}\n"
10250 "\n"
10251 "#line 13 0 \n"
10252 "\n"
10253 "void main()\n"
10254 "{\n"
10255 " compute_motion_vectors();\n"
10256 "\n"
10257 " vec3 qnorm = normalize(floor(aNorm*2.0)*0.5) + vec3(0.001,0.0,0.0);\n"
10258 " vec3 diffuse = texture( uTexMain, aUv ).rgb;\n"
10259 " vec3 composite = world_compute_lighting( diffuse, qnorm, aWorldCo, 1.0 );\n"
10260 "\n"
10261 " oColour = vec4( composite, 1.0 );\n"
10262 "}\n"
10263 ""},
10264 };
10265
10266 GLuint _uniform_model_entity_uMdl;
10267 GLuint _uniform_model_entity_uPv;
10268 GLuint _uniform_model_entity_uPvmPrev;
10269 GLuint _uniform_model_entity_uTexMain;
10270 GLuint _uniform_model_entity_uCamera;
10271 GLuint _uniform_model_entity_g_world_depth;
10272 GLuint _uniform_model_entity_uLightsArray;
10273 GLuint _uniform_model_entity_uLightsIndex;
10274 #include "shaders/model_gate.h"
10275 struct vg_shader _shader_model_gate = {
10276 .name = "model_gate",
10277 .vs =
10278 {
10279 .orig_file = "shaders/model.vs",
10280 .static_src =
10281 "layout (location=0) in vec3 a_co;\n"
10282 "layout (location=1) in vec3 a_norm;\n"
10283 "layout (location=2) in vec2 a_uv;\n"
10284 "layout (location=3) in vec4 a_colour;\n"
10285 "layout (location=4) in vec4 a_weights;\n"
10286 "layout (location=5) in ivec4 a_groups;\n"
10287 "\n"
10288 "#line 1 1 \n"
10289 "const float k_motion_lerp_amount = 0.01;\n"
10290 "\n"
10291 "#line 2 0 \n"
10292 "\n"
10293 "out vec3 aMotionVec0;\n"
10294 "out vec3 aMotionVec1;\n"
10295 "\n"
10296 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
10297 "{\n"
10298 " // This magically solves some artifacting errors!\n"
10299 " //\n"
10300 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
10301 "\n"
10302 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
10303 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
10304 "}\n"
10305 "\n"
10306 "#line 9 0 \n"
10307 "\n"
10308 "uniform mat4x3 uMdl;\n"
10309 "uniform mat4 uPv;\n"
10310 "uniform mat4 uPvmPrev;\n"
10311 "\n"
10312 "out vec4 aColour;\n"
10313 "out vec2 aUv;\n"
10314 "out vec3 aNorm;\n"
10315 "out vec3 aCo;\n"
10316 "out vec3 aWorldCo;\n"
10317 "\n"
10318 "void main()\n"
10319 "{\n"
10320 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
10321 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
10322 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
10323 "\n"
10324 " vs_motion_out( vproj0, vproj1 );\n"
10325 "\n"
10326 " gl_Position = vproj0;\n"
10327 " aWorldCo = world_pos0;\n"
10328 " aColour = a_colour;\n"
10329 " aUv = a_uv;\n"
10330 " aNorm = normalize( mat3(uMdl) * a_norm );\n"
10331 " aCo = a_co;\n"
10332 "}\n"
10333 ""},
10334 .fs =
10335 {
10336 .orig_file = "shaders/model_gate_lq.fs",
10337 .static_src =
10338 "out vec4 FragColor;\n"
10339 "\n"
10340 "uniform float uTime;\n"
10341 "uniform vec3 uCam;\n"
10342 "uniform vec2 uInvRes;\n"
10343 "uniform vec4 uColour;\n"
10344 "\n"
10345 "in vec3 aNorm;\n"
10346 "in vec2 aUv;\n"
10347 "in vec3 aCo;\n"
10348 "\n"
10349 "void main()\n"
10350 "{\n"
10351 " vec2 ssuv = gl_FragCoord.xy;\n"
10352 " float opacity = 1.0-smoothstep(0.0,1.0,aUv.y+uColour.a);\n"
10353 " \n"
10354 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
10355 " float dither = fract( vDither.g / 71.0 ) - 0.5;\n"
10356 "\n"
10357 " if( opacity+dither<0.5 )\n"
10358 " discard;\n"
10359 "\n"
10360 " FragColor = uColour;\n"
10361 "}\n"
10362 ""},
10363 };
10364
10365 GLuint _uniform_model_gate_uMdl;
10366 GLuint _uniform_model_gate_uPv;
10367 GLuint _uniform_model_gate_uPvmPrev;
10368 GLuint _uniform_model_gate_uTime;
10369 GLuint _uniform_model_gate_uCam;
10370 GLuint _uniform_model_gate_uInvRes;
10371 GLuint _uniform_model_gate_uColour;
10372 #include "shaders/model_gate_unlinked.h"
10373 struct vg_shader _shader_model_gate_unlinked = {
10374 .name = "model_gate_unlinked",
10375 .vs =
10376 {
10377 .orig_file = "shaders/model.vs",
10378 .static_src =
10379 "layout (location=0) in vec3 a_co;\n"
10380 "layout (location=1) in vec3 a_norm;\n"
10381 "layout (location=2) in vec2 a_uv;\n"
10382 "layout (location=3) in vec4 a_colour;\n"
10383 "layout (location=4) in vec4 a_weights;\n"
10384 "layout (location=5) in ivec4 a_groups;\n"
10385 "\n"
10386 "#line 1 1 \n"
10387 "const float k_motion_lerp_amount = 0.01;\n"
10388 "\n"
10389 "#line 2 0 \n"
10390 "\n"
10391 "out vec3 aMotionVec0;\n"
10392 "out vec3 aMotionVec1;\n"
10393 "\n"
10394 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
10395 "{\n"
10396 " // This magically solves some artifacting errors!\n"
10397 " //\n"
10398 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
10399 "\n"
10400 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
10401 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
10402 "}\n"
10403 "\n"
10404 "#line 9 0 \n"
10405 "\n"
10406 "uniform mat4x3 uMdl;\n"
10407 "uniform mat4 uPv;\n"
10408 "uniform mat4 uPvmPrev;\n"
10409 "\n"
10410 "out vec4 aColour;\n"
10411 "out vec2 aUv;\n"
10412 "out vec3 aNorm;\n"
10413 "out vec3 aCo;\n"
10414 "out vec3 aWorldCo;\n"
10415 "\n"
10416 "void main()\n"
10417 "{\n"
10418 " vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
10419 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
10420 " vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
10421 "\n"
10422 " vs_motion_out( vproj0, vproj1 );\n"
10423 "\n"
10424 " gl_Position = vproj0;\n"
10425 " aWorldCo = world_pos0;\n"
10426 " aColour = a_colour;\n"
10427 " aUv = a_uv;\n"
10428 " aNorm = normalize( mat3(uMdl) * a_norm );\n"
10429 " aCo = a_co;\n"
10430 "}\n"
10431 ""},
10432 .fs =
10433 {
10434 .orig_file = "shaders/model_gate_unlinked.fs",
10435 .static_src =
10436 "out vec4 FragColor;\n"
10437 "\n"
10438 "uniform float uTime;\n"
10439 "uniform vec3 uCam;\n"
10440 "uniform vec4 uColour;\n"
10441 "\n"
10442 "in vec3 aNorm;\n"
10443 "in vec2 aUv;\n"
10444 "in vec3 aCo;\n"
10445 "\n"
10446 "#line 1 1 \n"
10447 "const float k_motion_lerp_amount = 0.01;\n"
10448 "\n"
10449 "#line 2 0 \n"
10450 "\n"
10451 "layout (location = 1) out vec2 oMotionVec;\n"
10452 "\n"
10453 "in vec3 aMotionVec0;\n"
10454 "in vec3 aMotionVec1;\n"
10455 "\n"
10456 "void compute_motion_vectors()\n"
10457 "{\n"
10458 " // Write motion vectors\n"
10459 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
10460 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
10461 "\n"
10462 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
10463 "}\n"
10464 "\n"
10465 "#line 12 0 \n"
10466 "\n"
10467 "const int NOISE_LOOP = 3;\n"
10468 "vec3 digital_noise( uvec3 iuv ){\n"
10469 " iuv *=uvec3(8,2524,7552);\n"
10470 " for( int i=0; i<NOISE_LOOP; i++ )\n"
10471 " iuv += (iuv.yzx<<2) ^ (iuv.yxz)+iuv.z;\n"
10472 " return vec3(iuv)*(1.0/float(0xffffffffU));\n"
10473 "}\n"
10474 "\n"
10475 "vec2 rand_hash22( vec2 p ){\n"
10476 " vec3 p3 = fract(vec3(p.xyx) * 213.8976123);\n"
10477 " p3 += dot(p3, p3.yzx+19.19);\n"
10478 " return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));\n"
10479 "}\n"
10480 "\n"
10481 "void main(){\n"
10482 " compute_motion_vectors();\n"
10483 "\n"
10484 " vec2 ssuv = gl_FragCoord.xy;\n"
10485 " float grad = 1.0-aUv.y*0.1;\n"
10486 " float opacity = rand_hash22( vec2(floor(aUv.y*100.0),floor(aCo.z*10.0+uTime*40.0)) ).r*grad;\n"
10487 " \n"
10488 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
10489 " float dither = fract( vDither.g / 71.0 ) - 0.5;\n"
10490 "\n"
10491 " if( opacity<0.9 )\n"
10492 " discard;\n"
10493 "\n"
10494 " FragColor = vec4(0.7,0.5,0.5,1.0);\n"
10495 "}\n"
10496 ""},
10497 };
10498
10499 GLuint _uniform_model_gate_unlinked_uMdl;
10500 GLuint _uniform_model_gate_unlinked_uPv;
10501 GLuint _uniform_model_gate_unlinked_uPvmPrev;
10502 GLuint _uniform_model_gate_unlinked_uTime;
10503 GLuint _uniform_model_gate_unlinked_uCam;
10504 GLuint _uniform_model_gate_unlinked_uColour;
10505 #include "shaders/model_font.h"
10506 struct vg_shader _shader_model_font = {
10507 .name = "model_font",
10508 .vs =
10509 {
10510 .orig_file = "shaders/model_font.vs",
10511 .static_src =
10512 "layout (location=0) in vec3 a_co;\n"
10513 "layout (location=1) in vec3 a_norm;\n"
10514 "layout (location=2) in vec2 a_uv;\n"
10515 "\n"
10516 "#line 1 1 \n"
10517 "const float k_motion_lerp_amount = 0.01;\n"
10518 "\n"
10519 "#line 2 0 \n"
10520 "\n"
10521 "out vec3 aMotionVec0;\n"
10522 "out vec3 aMotionVec1;\n"
10523 "\n"
10524 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
10525 "{\n"
10526 " // This magically solves some artifacting errors!\n"
10527 " //\n"
10528 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
10529 "\n"
10530 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
10531 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
10532 "}\n"
10533 "\n"
10534 "#line 6 0 \n"
10535 "\n"
10536 "uniform mat4x3 uMdl;\n"
10537 "uniform mat4 uPv;\n"
10538 "uniform mat4 uPvmPrev;\n"
10539 "uniform vec4 uOffset;\n"
10540 "\n"
10541 "out vec2 aUv;\n"
10542 "out vec4 aNorm;\n"
10543 "out vec3 aCo;\n"
10544 "out vec3 aWorldCo;\n"
10545 "\n"
10546 "void main()\n"
10547 "{\n"
10548 " vec3 co = a_co*uOffset.w+uOffset.xyz;\n"
10549 " vec3 world_pos0 = uMdl * vec4( co, 1.0 );\n"
10550 " vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
10551 " vec4 vproj1 = uPvmPrev * vec4( co, 1.0 );\n"
10552 "\n"
10553 " vs_motion_out( vproj0, vproj1 );\n"
10554 "\n"
10555 " gl_Position = vproj0;\n"
10556 "\n"
10557 " aUv = a_uv;\n"
10558 " aNorm = vec4( mat3(uMdl) * a_norm, 0.0 );\n"
10559 " aCo = co;\n"
10560 " aWorldCo = world_pos0;\n"
10561 "}\n"
10562 ""},
10563 .fs =
10564 {
10565 .orig_file = "shaders/model_font.fs",
10566 .static_src =
10567 "layout (location = 0) out vec4 oColour;\n"
10568 "\n"
10569 "uniform sampler2D uTexMain;\n"
10570 "uniform vec4 uColour;\n"
10571 "\n"
10572 "in vec2 aUv;\n"
10573 "in vec4 aNorm;\n"
10574 "in vec3 aCo;\n"
10575 "\n"
10576 "#line 1 1 \n"
10577 "const float k_motion_lerp_amount = 0.01;\n"
10578 "\n"
10579 "#line 2 0 \n"
10580 "\n"
10581 "layout (location = 1) out vec2 oMotionVec;\n"
10582 "\n"
10583 "in vec3 aMotionVec0;\n"
10584 "in vec3 aMotionVec1;\n"
10585 "\n"
10586 "void compute_motion_vectors()\n"
10587 "{\n"
10588 " // Write motion vectors\n"
10589 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
10590 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
10591 "\n"
10592 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
10593 "}\n"
10594 "\n"
10595 "#line 11 0 \n"
10596 "#line 1 2 \n"
10597 "uniform sampler2D uTexSceneDepth;\n"
10598 "uniform vec3 uInverseRatioDepth;\n"
10599 "uniform vec3 uInverseRatioMain;\n"
10600 "uniform int uDepthMode;\n"
10601 "uniform float uDitherCutoff;\n"
10602 "\n"
10603 "float linear_depth( float depth, float near, float far ) {\n"
10604 " float z = depth * 2.0 - 1.0;\n"
10605 " return (2.0 * near * far) / (far + near - z * (far - near)); \n"
10606 "}\n"
10607 "\n"
10608 "void depth_compare_dither()\n"
10609 "{\n"
10610 " if( uDepthMode == 1 )\n"
10611 " {\n"
10612 " vec2 back_coord = gl_FragCoord.xy * uInverseRatioMain.xy \n"
10613 " * uInverseRatioDepth.xy;\n"
10614 " float back_depth = texture( uTexSceneDepth, back_coord ).r;\n"
10615 " float front_depth = gl_FragCoord.z/gl_FragCoord.w;\n"
10616 "\n"
10617 " back_depth = linear_depth( back_depth, 0.1, 2100.0 );\n"
10618 " float diff = back_depth - front_depth;\n"
10619 "\n"
10620 " vec2 ssuv = gl_FragCoord.xy;\n"
10621 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
10622 " float dither = fract( vDither.g / 71.0 ) - 0.5;\n"
10623 "\n"
10624 " if( step(0.0,diff)+dither<0.3 )\n"
10625 " discard;\n"
10626 " }\n"
10627 "\n"
10628 " if( uDepthMode == 2 )\n"
10629 " {\n"
10630 " vec2 ssuv = gl_FragCoord.xy;\n"
10631 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
10632 " float dither = fract( vDither.g / 71.0 );\n"
10633 " if( dither<uDitherCutoff ) discard;\n"
10634 " }\n"
10635 "}\n"
10636 "\n"
10637 "#line 12 0 \n"
10638 "\n"
10639 "void main(){\n"
10640 " depth_compare_dither();\n"
10641 " compute_motion_vectors();\n"
10642 " oColour = texture( uTexMain, aUv ) * uColour;\n"
10643 "}\n"
10644 ""},
10645 };
10646
10647 GLuint _uniform_model_font_uMdl;
10648 GLuint _uniform_model_font_uPv;
10649 GLuint _uniform_model_font_uPvmPrev;
10650 GLuint _uniform_model_font_uOffset;
10651 GLuint _uniform_model_font_uTexMain;
10652 GLuint _uniform_model_font_uColour;
10653 GLuint _uniform_model_font_uTexSceneDepth;
10654 GLuint _uniform_model_font_uInverseRatioDepth;
10655 GLuint _uniform_model_font_uInverseRatioMain;
10656 GLuint _uniform_model_font_uDepthMode;
10657 GLuint _uniform_model_font_uDitherCutoff;
10658 #include "shaders/particle.h"
10659 struct vg_shader _shader_particle = {
10660 .name = "particle",
10661 .vs =
10662 {
10663 .orig_file = "shaders/particle.vs",
10664 .static_src =
10665 "layout (location=0) in vec3 a_co;\n"
10666 "layout (location=1) in vec4 a_colour;\n"
10667 "\n"
10668 "#line 1 1 \n"
10669 "const float k_motion_lerp_amount = 0.01;\n"
10670 "\n"
10671 "#line 2 0 \n"
10672 "\n"
10673 "out vec3 aMotionVec0;\n"
10674 "out vec3 aMotionVec1;\n"
10675 "\n"
10676 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
10677 "{\n"
10678 " // This magically solves some artifacting errors!\n"
10679 " //\n"
10680 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
10681 "\n"
10682 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
10683 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
10684 "}\n"
10685 "\n"
10686 "#line 5 0 \n"
10687 "\n"
10688 "uniform mat4 uPv;\n"
10689 "uniform mat4 uPvPrev;\n"
10690 "\n"
10691 "out vec4 aColour;\n"
10692 "\n"
10693 "void main(){\n"
10694 " vec4 vproj0 = uPv * vec4( a_co, 1.0 );\n"
10695 " vec4 vproj1 = uPvPrev * vec4( a_co, 1.0 );\n"
10696 " vs_motion_out( vproj0, vproj1 );\n"
10697 "\n"
10698 " gl_Position = vproj0;\n"
10699 " aColour = a_colour;\n"
10700 "}\n"
10701 ""},
10702 .fs =
10703 {
10704 .orig_file = "shaders/particle.fs",
10705 .static_src =
10706 "layout (location = 0) out vec4 oColour;\n"
10707 "in vec4 aColour;\n"
10708 "\n"
10709 "#line 1 1 \n"
10710 "const float k_motion_lerp_amount = 0.01;\n"
10711 "\n"
10712 "#line 2 0 \n"
10713 "\n"
10714 "layout (location = 1) out vec2 oMotionVec;\n"
10715 "\n"
10716 "in vec3 aMotionVec0;\n"
10717 "in vec3 aMotionVec1;\n"
10718 "\n"
10719 "void compute_motion_vectors()\n"
10720 "{\n"
10721 " // Write motion vectors\n"
10722 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
10723 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
10724 "\n"
10725 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
10726 "}\n"
10727 "\n"
10728 "#line 5 0 \n"
10729 "\n"
10730 "void main(){\n"
10731 " compute_motion_vectors();\n"
10732 "\n"
10733 " //vec2 ssuv = gl_FragCoord.xy;\n"
10734 " //vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
10735 " //float dither = fract( vDither.g / 71.0 ) - 0.5;\n"
10736 "\n"
10737 " //if( vsamplemain.a+dither<0.5 )\n"
10738 " // discard;\n"
10739 "\n"
10740 " oColour = aColour;\n"
10741 "}\n"
10742 ""},
10743 };
10744
10745 GLuint _uniform_particle_uPv;
10746 GLuint _uniform_particle_uPvPrev;
10747 #include "shaders/trail.h"
10748 struct vg_shader _shader_trail = {
10749 .name = "trail",
10750 .vs =
10751 {
10752 .orig_file = "shaders/trail.vs",
10753 .static_src =
10754 "layout (location=0) in vec4 a_co;\n"
10755 "\n"
10756 "#line 1 1 \n"
10757 "const float k_motion_lerp_amount = 0.01;\n"
10758 "\n"
10759 "#line 2 0 \n"
10760 "\n"
10761 "out vec3 aMotionVec0;\n"
10762 "out vec3 aMotionVec1;\n"
10763 "\n"
10764 "void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
10765 "{\n"
10766 " // This magically solves some artifacting errors!\n"
10767 " //\n"
10768 " vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
10769 "\n"
10770 " aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
10771 " aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
10772 "}\n"
10773 "\n"
10774 "#line 4 0 \n"
10775 "\n"
10776 "uniform mat4 uPv;\n"
10777 "uniform mat4 uPvPrev;\n"
10778 "\n"
10779 "out float aAlpha;\n"
10780 "\n"
10781 "void main(){\n"
10782 " vec4 vproj0 = uPv * vec4( a_co.xyz, 1.0 );\n"
10783 " vec4 vproj1 = uPvPrev * vec4( a_co.xyz, 1.0 );\n"
10784 " vs_motion_out( vproj0, vproj1 );\n"
10785 "\n"
10786 " gl_Position = vproj0;\n"
10787 " aAlpha = a_co.w;\n"
10788 "}\n"
10789 ""},
10790 .fs =
10791 {
10792 .orig_file = "shaders/trail.fs",
10793 .static_src =
10794 "layout (location = 0) out vec4 oColour;\n"
10795 "in float aAlpha;\n"
10796 "uniform vec4 uColour;\n"
10797 "\n"
10798 "#line 1 1 \n"
10799 "const float k_motion_lerp_amount = 0.01;\n"
10800 "\n"
10801 "#line 2 0 \n"
10802 "\n"
10803 "layout (location = 1) out vec2 oMotionVec;\n"
10804 "\n"
10805 "in vec3 aMotionVec0;\n"
10806 "in vec3 aMotionVec1;\n"
10807 "\n"
10808 "void compute_motion_vectors()\n"
10809 "{\n"
10810 " // Write motion vectors\n"
10811 " vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n"
10812 " vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n"
10813 "\n"
10814 " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
10815 "}\n"
10816 "\n"
10817 "#line 6 0 \n"
10818 "\n"
10819 "void main(){\n"
10820 " compute_motion_vectors();\n"
10821 "\n"
10822 " vec2 ssuv = gl_FragCoord.xy;\n"
10823 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
10824 " float dither = fract( vDither.g / 71.0 ) - 0.5;\n"
10825 "\n"
10826 " if( aAlpha+dither<0.5 )\n"
10827 " discard;\n"
10828 "\n"
10829 " oColour = vec4( uColour.rgb, uColour.a * aAlpha );\n"
10830 "}\n"
10831 ""},
10832 };
10833
10834 GLuint _uniform_trail_uPv;
10835 GLuint _uniform_trail_uPvPrev;
10836 GLuint _uniform_trail_uColour;
10837 #include "shaders/blit.h"
10838 struct vg_shader _shader_blit = {
10839 .name = "blit",
10840 .vs =
10841 {
10842 .orig_file = "shaders/blit.vs",
10843 .static_src =
10844 "layout (location=0) in vec2 a_co;\n"
10845 "out vec2 aUv;\n"
10846 "\n"
10847 "uniform vec2 uInverseRatio;\n"
10848 "\n"
10849 "void main()\n"
10850 "{\n"
10851 " gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);\n"
10852 " aUv = a_co * uInverseRatio;\n"
10853 "}\n"
10854 ""},
10855 .fs =
10856 {
10857 .orig_file = "shaders/blit.fs",
10858 .static_src =
10859 "out vec4 FragColor;\n"
10860 "uniform sampler2D uTexMain;\n"
10861 "\n"
10862 "in vec2 aUv;\n"
10863 "\n"
10864 "float kPi = 3.14159265358979;\n"
10865 "\n"
10866 "vec2 fisheye_distort(vec2 xy)\n"
10867 "{\n"
10868 " float aperture = 1350.0;\n"
10869 " float apertureHalf = 0.5 * aperture * (kPi / 180.0);\n"
10870 " float maxFactor = sin(apertureHalf);\n"
10871 "\n"
10872 " vec2 uv;\n"
10873 " float d = length(xy);\n"
10874 " if(d < (2.0-maxFactor))\n"
10875 " {\n"
10876 " d = length(xy * maxFactor);\n"
10877 " float z = sqrt(1.0 - d * d);\n"
10878 " float r = atan(d, z) / kPi;\n"
10879 " float phi = atan(xy.y, xy.x);\n"
10880 "\n"
10881 " uv.x = r * cos(phi) + 0.5;\n"
10882 " uv.y = r * sin(phi) + 0.5;\n"
10883 " }\n"
10884 " else\n"
10885 " {\n"
10886 " uv = 0.5*xy + 0.5;\n"
10887 " }\n"
10888 " \n"
10889 " return uv;\n"
10890 "}\n"
10891 "\n"
10892 "\n"
10893 "void main()\n"
10894 "{\n"
10895 " vec2 vwarp = 2.0*aUv - 1.0;\n"
10896 " vwarp = fisheye_distort( vwarp );\n"
10897 "\n"
10898 " FragColor = texture( uTexMain, aUv );\n"
10899 "}\n"
10900 ""},
10901 };
10902
10903 GLuint _uniform_blit_uInverseRatio;
10904 GLuint _uniform_blit_uTexMain;
10905 #include "shaders/blitblur.h"
10906 struct vg_shader _shader_blitblur = {
10907 .name = "blitblur",
10908 .vs =
10909 {
10910 .orig_file = "shaders/blit.vs",
10911 .static_src =
10912 "layout (location=0) in vec2 a_co;\n"
10913 "out vec2 aUv;\n"
10914 "\n"
10915 "uniform vec2 uInverseRatio;\n"
10916 "\n"
10917 "void main()\n"
10918 "{\n"
10919 " gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);\n"
10920 " aUv = a_co * uInverseRatio;\n"
10921 "}\n"
10922 ""},
10923 .fs =
10924 {
10925 .orig_file = "shaders/blitblur.fs",
10926 .static_src =
10927 "out vec4 FragColor;\n"
10928 "uniform sampler2D uTexMain;\n"
10929 "uniform sampler2D uTexMotion;\n"
10930 "uniform float uBlurStrength;\n"
10931 "uniform vec2 uOverrideDir;\n"
10932 "uniform float uTime;\n"
10933 "uniform float uGlitchStrength;\n"
10934 "uniform vec2 uClampUv;\n"
10935 "\n"
10936 "in vec2 aUv;\n"
10937 "\n"
10938 "vec2 rand_hash22( vec2 p ){\n"
10939 " vec3 p3 = fract(vec3(p.xyx) * 213.8976123);\n"
10940 " p3 += dot(p3, p3.yzx+19.19);\n"
10941 " return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));\n"
10942 "}\n"
10943 "\n"
10944 "const int NOISE_LOOP = 3;\n"
10945 "vec3 digital_noise( uvec3 iuv ){\n"
10946 " iuv *=uvec3(8,2524,7552);\n"
10947 " for( int i=0; i<NOISE_LOOP; i++ )\n"
10948 " iuv += (iuv.yzx<<2) ^ (iuv.yxz)+iuv.z;\n"
10949 " return vec3(iuv)*(1.0/float(0xffffffffU));\n"
10950 "}\n"
10951 "\n"
10952 "void main(){\n"
10953 " vec2 vuv = aUv; \n"
10954 "\n"
10955 " //if( uGlitchStrength > 0.0 ){\n"
10956 " // uvec3 p = uvec3( gl_FragCoord.xy, uint(uTime*30.0) );\n"
10957 " // vec2 g = digital_noise(p).xy;\n"
10958 " // vuv = aUv + g.xy*uGlitchStrength - uGlitchStrength*0.5;\n"
10959 " //}\n"
10960 "\n"
10961 " vec2 vrand = rand_hash22( vuv ) * 2.0 - vec2(1.0);\n"
10962 " vec2 vrand1 = rand_hash22( vrand ) * 2.0 - vec2(1.0);\n"
10963 " \n"
10964 " vec2 vdir = texture( uTexMotion, vuv ).xy * uBlurStrength + uOverrideDir;\n"
10965 "\n"
10966 " vec4 vcolour0 = texture( uTexMain, min(vuv + vdir*vrand.x,uClampUv) );\n"
10967 " vec4 vcolour1 = texture( uTexMain, min(vuv + vdir*vrand.y,uClampUv) );\n"
10968 " vec4 vcolour2 = texture( uTexMain, min(vuv + vdir*vrand1.x,uClampUv) );\n"
10969 " vec4 vcolour3 = texture( uTexMain, min(vuv + vdir*vrand1.y,uClampUv) );\n"
10970 "\n"
10971 " FragColor = ( vcolour0 + vcolour1 + vcolour2 + vcolour3 ) * 0.25;\n"
10972 "}\n"
10973 ""},
10974 };
10975
10976 GLuint _uniform_blitblur_uInverseRatio;
10977 GLuint _uniform_blitblur_uTexMain;
10978 GLuint _uniform_blitblur_uTexMotion;
10979 GLuint _uniform_blitblur_uBlurStrength;
10980 GLuint _uniform_blitblur_uOverrideDir;
10981 GLuint _uniform_blitblur_uTime;
10982 GLuint _uniform_blitblur_uGlitchStrength;
10983 GLuint _uniform_blitblur_uClampUv;
10984 #include "shaders/blitcolour.h"
10985 struct vg_shader _shader_blitcolour = {
10986 .name = "blitcolour",
10987 .vs =
10988 {
10989 .orig_file = "shaders/blit.vs",
10990 .static_src =
10991 "layout (location=0) in vec2 a_co;\n"
10992 "out vec2 aUv;\n"
10993 "\n"
10994 "uniform vec2 uInverseRatio;\n"
10995 "\n"
10996 "void main()\n"
10997 "{\n"
10998 " gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);\n"
10999 " aUv = a_co * uInverseRatio;\n"
11000 "}\n"
11001 ""},
11002 .fs =
11003 {
11004 .orig_file = "shaders/colour.fs",
11005 .static_src =
11006 "out vec4 FragColor;\n"
11007 "uniform vec4 uColour;\n"
11008 "\n"
11009 "in vec2 aUv;\n"
11010 "\n"
11011 "void main()\n"
11012 "{\n"
11013 " FragColor = uColour;\n"
11014 "}\n"
11015 ""},
11016 };
11017
11018 GLuint _uniform_blitcolour_uInverseRatio;
11019 GLuint _uniform_blitcolour_uColour;
11020 #include "shaders/blit_transition.h"
11021 struct vg_shader _shader_blit_transition = {
11022 .name = "blit_transition",
11023 .vs =
11024 {
11025 .orig_file = "shaders/blit.vs",
11026 .static_src =
11027 "layout (location=0) in vec2 a_co;\n"
11028 "out vec2 aUv;\n"
11029 "\n"
11030 "uniform vec2 uInverseRatio;\n"
11031 "\n"
11032 "void main()\n"
11033 "{\n"
11034 " gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);\n"
11035 " aUv = a_co * uInverseRatio;\n"
11036 "}\n"
11037 ""},
11038 .fs =
11039 {
11040 .orig_file = "shaders/blit_transition.fs",
11041 .static_src =
11042 "out vec4 FragColor;\n"
11043 "in vec2 aUv;\n"
11044 "uniform float uT;\n"
11045 "\n"
11046 "void main(){\n"
11047 " float d = uT + distance( aUv, vec2(0.5,0.5) );\n"
11048 "\n"
11049 " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), gl_FragCoord.xy) );\n"
11050 " float dither = fract( vDither.g / 71.0 ) - 0.5;\n"
11051 "\n"
11052 " if( d+dither < -0.5 )\n"
11053 " discard;\n"
11054 "\n"
11055 " FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n"
11056 "}\n"
11057 ""},
11058 };
11059
11060 GLuint _uniform_blit_transition_uInverseRatio;
11061 GLuint _uniform_blit_transition_uT;
11062 #include "shaders/routeui.h"
11063 struct vg_shader _shader_routeui = {
11064 .name = "routeui",
11065 .vs =
11066 {
11067 .orig_file = "shaders/routeui.vs",
11068 .static_src =
11069 "layout (location=0) in vec2 a_co;\n"
11070 "\n"
11071 "uniform vec4 uOffset;\n"
11072 "\n"
11073 "void main()\n"
11074 "{\n"
11075 " vec2 vpos = a_co * uOffset.zw + uOffset.xy;\n"
11076 " gl_Position = vec4(vpos,0.0,1.0);\n"
11077 "}\n"
11078 ""},
11079 .fs =
11080 {
11081 .orig_file = "shaders/routeui.fs",
11082 .static_src =
11083 "out vec4 FragColor;\n"
11084 "\n"
11085 "uniform vec4 uColour;\n"
11086 "\n"
11087 "void main()\n"
11088 "{\n"
11089 " FragColor = uColour;\n"
11090 "}\n"
11091 ""},
11092 };
11093
11094 GLuint _uniform_routeui_uOffset;
11095 GLuint _uniform_routeui_uColour;
11096
11097
11098 void vg_auto_shader_link(void)
11099 {
11100 _uniform_scene_standard_uMdl = glGetUniformLocation( _shader_scene_standard.id, "uMdl" );
11101 _uniform_scene_standard_uPv = glGetUniformLocation( _shader_scene_standard.id, "uPv" );
11102 _uniform_scene_standard_uPvmPrev = glGetUniformLocation( _shader_scene_standard.id, "uPvmPrev" );
11103 _uniform_scene_standard_uTexGarbage = glGetUniformLocation( _shader_scene_standard.id, "uTexGarbage" );
11104 _uniform_scene_standard_uTexMain = glGetUniformLocation( _shader_scene_standard.id, "uTexMain" );
11105 _uniform_scene_standard_uCamera = glGetUniformLocation( _shader_scene_standard.id, "uCamera" );
11106 _uniform_scene_standard_uPlane = glGetUniformLocation( _shader_scene_standard.id, "uPlane" );
11107 _uniform_scene_standard_g_world_depth = glGetUniformLocation( _shader_scene_standard.id, "g_world_depth" );
11108 _uniform_scene_standard_uLightsArray = glGetUniformLocation( _shader_scene_standard.id, "uLightsArray" );
11109 _uniform_scene_standard_uLightsIndex = glGetUniformLocation( _shader_scene_standard.id, "uLightsIndex" );
11110 _uniform_scene_standard_alphatest_uMdl = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uMdl" );
11111 _uniform_scene_standard_alphatest_uPv = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uPv" );
11112 _uniform_scene_standard_alphatest_uPvmPrev = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uPvmPrev" );
11113 _uniform_scene_standard_alphatest_uTexGarbage = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uTexGarbage" );
11114 _uniform_scene_standard_alphatest_uTexMain = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uTexMain" );
11115 _uniform_scene_standard_alphatest_uCamera = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uCamera" );
11116 _uniform_scene_standard_alphatest_uPlane = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uPlane" );
11117 _uniform_scene_standard_alphatest_g_world_depth = glGetUniformLocation( _shader_scene_standard_alphatest.id, "g_world_depth" );
11118 _uniform_scene_standard_alphatest_uLightsArray = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uLightsArray" );
11119 _uniform_scene_standard_alphatest_uLightsIndex = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uLightsIndex" );
11120 _uniform_scene_foliage_uMdl = glGetUniformLocation( _shader_scene_foliage.id, "uMdl" );
11121 _uniform_scene_foliage_uPv = glGetUniformLocation( _shader_scene_foliage.id, "uPv" );
11122 _uniform_scene_foliage_uPvmPrev = glGetUniformLocation( _shader_scene_foliage.id, "uPvmPrev" );
11123 _uniform_scene_foliage_uTime = glGetUniformLocation( _shader_scene_foliage.id, "uTime" );
11124 _uniform_scene_foliage_uTexGarbage = glGetUniformLocation( _shader_scene_foliage.id, "uTexGarbage" );
11125 _uniform_scene_foliage_uTexMain = glGetUniformLocation( _shader_scene_foliage.id, "uTexMain" );
11126 _uniform_scene_foliage_uCamera = glGetUniformLocation( _shader_scene_foliage.id, "uCamera" );
11127 _uniform_scene_foliage_uPlane = glGetUniformLocation( _shader_scene_foliage.id, "uPlane" );
11128 _uniform_scene_foliage_g_world_depth = glGetUniformLocation( _shader_scene_foliage.id, "g_world_depth" );
11129 _uniform_scene_foliage_uLightsArray = glGetUniformLocation( _shader_scene_foliage.id, "uLightsArray" );
11130 _uniform_scene_foliage_uLightsIndex = glGetUniformLocation( _shader_scene_foliage.id, "uLightsIndex" );
11131 _uniform_scene_override_uMdl = glGetUniformLocation( _shader_scene_override.id, "uMdl" );
11132 _uniform_scene_override_uPv = glGetUniformLocation( _shader_scene_override.id, "uPv" );
11133 _uniform_scene_override_uPvmPrev = glGetUniformLocation( _shader_scene_override.id, "uPvmPrev" );
11134 _uniform_scene_override_uNormalMtx = glGetUniformLocation( _shader_scene_override.id, "uNormalMtx" );
11135 _uniform_scene_override_uTexGarbage = glGetUniformLocation( _shader_scene_override.id, "uTexGarbage" );
11136 _uniform_scene_override_uTexMain = glGetUniformLocation( _shader_scene_override.id, "uTexMain" );
11137 _uniform_scene_override_uCamera = glGetUniformLocation( _shader_scene_override.id, "uCamera" );
11138 _uniform_scene_override_uPlane = glGetUniformLocation( _shader_scene_override.id, "uPlane" );
11139 _uniform_scene_override_uPlayerPos = glGetUniformLocation( _shader_scene_override.id, "uPlayerPos" );
11140 _uniform_scene_override_uSpawnPos = glGetUniformLocation( _shader_scene_override.id, "uSpawnPos" );
11141 _uniform_scene_override_uAlphatest = glGetUniformLocation( _shader_scene_override.id, "uAlphatest" );
11142 _uniform_scene_override_uMapInfo = glGetUniformLocation( _shader_scene_override.id, "uMapInfo" );
11143 _uniform_scene_override_g_world_depth = glGetUniformLocation( _shader_scene_override.id, "g_world_depth" );
11144 _uniform_scene_override_uLightsArray = glGetUniformLocation( _shader_scene_override.id, "uLightsArray" );
11145 _uniform_scene_override_uLightsIndex = glGetUniformLocation( _shader_scene_override.id, "uLightsIndex" );
11146 _uniform_scene_fxglow_uMdl = glGetUniformLocation( _shader_scene_fxglow.id, "uMdl" );
11147 _uniform_scene_fxglow_uPv = glGetUniformLocation( _shader_scene_fxglow.id, "uPv" );
11148 _uniform_scene_fxglow_uPvmPrev = glGetUniformLocation( _shader_scene_fxglow.id, "uPvmPrev" );
11149 _uniform_scene_fxglow_uUvOffset = glGetUniformLocation( _shader_scene_fxglow.id, "uUvOffset" );
11150 _uniform_scene_fxglow_uTexMain = glGetUniformLocation( _shader_scene_fxglow.id, "uTexMain" );
11151 _uniform_scene_fxglow_uCamera = glGetUniformLocation( _shader_scene_fxglow.id, "uCamera" );
11152 _uniform_scene_fxglow_g_world_depth = glGetUniformLocation( _shader_scene_fxglow.id, "g_world_depth" );
11153 _uniform_scene_fxglow_uLightsArray = glGetUniformLocation( _shader_scene_fxglow.id, "uLightsArray" );
11154 _uniform_scene_fxglow_uLightsIndex = glGetUniformLocation( _shader_scene_fxglow.id, "uLightsIndex" );
11155 _uniform_scene_vertex_blend_uMdl = glGetUniformLocation( _shader_scene_vertex_blend.id, "uMdl" );
11156 _uniform_scene_vertex_blend_uPv = glGetUniformLocation( _shader_scene_vertex_blend.id, "uPv" );
11157 _uniform_scene_vertex_blend_uPvmPrev = glGetUniformLocation( _shader_scene_vertex_blend.id, "uPvmPrev" );
11158 _uniform_scene_vertex_blend_uTexGarbage = glGetUniformLocation( _shader_scene_vertex_blend.id, "uTexGarbage" );
11159 _uniform_scene_vertex_blend_uTexGradients = glGetUniformLocation( _shader_scene_vertex_blend.id, "uTexGradients" );
11160 _uniform_scene_vertex_blend_uCamera = glGetUniformLocation( _shader_scene_vertex_blend.id, "uCamera" );
11161 _uniform_scene_vertex_blend_g_world_depth = glGetUniformLocation( _shader_scene_vertex_blend.id, "g_world_depth" );
11162 _uniform_scene_vertex_blend_uLightsArray = glGetUniformLocation( _shader_scene_vertex_blend.id, "uLightsArray" );
11163 _uniform_scene_vertex_blend_uLightsIndex = glGetUniformLocation( _shader_scene_vertex_blend.id, "uLightsIndex" );
11164 _uniform_scene_terrain_uMdl = glGetUniformLocation( _shader_scene_terrain.id, "uMdl" );
11165 _uniform_scene_terrain_uPv = glGetUniformLocation( _shader_scene_terrain.id, "uPv" );
11166 _uniform_scene_terrain_uPvmPrev = glGetUniformLocation( _shader_scene_terrain.id, "uPvmPrev" );
11167 _uniform_scene_terrain_uTexGarbage = glGetUniformLocation( _shader_scene_terrain.id, "uTexGarbage" );
11168 _uniform_scene_terrain_uTexGradients = glGetUniformLocation( _shader_scene_terrain.id, "uTexGradients" );
11169 _uniform_scene_terrain_uCamera = glGetUniformLocation( _shader_scene_terrain.id, "uCamera" );
11170 _uniform_scene_terrain_uSandColour = glGetUniformLocation( _shader_scene_terrain.id, "uSandColour" );
11171 _uniform_scene_terrain_uBlendOffset = glGetUniformLocation( _shader_scene_terrain.id, "uBlendOffset" );
11172 _uniform_scene_terrain_g_world_depth = glGetUniformLocation( _shader_scene_terrain.id, "g_world_depth" );
11173 _uniform_scene_terrain_uLightsArray = glGetUniformLocation( _shader_scene_terrain.id, "uLightsArray" );
11174 _uniform_scene_terrain_uLightsIndex = glGetUniformLocation( _shader_scene_terrain.id, "uLightsIndex" );
11175 _uniform_scene_route_uMdl = glGetUniformLocation( _shader_scene_route.id, "uMdl" );
11176 _uniform_scene_route_uPv = glGetUniformLocation( _shader_scene_route.id, "uPv" );
11177 _uniform_scene_route_uPvmPrev = glGetUniformLocation( _shader_scene_route.id, "uPvmPrev" );
11178 _uniform_scene_route_uNormalMtx = glGetUniformLocation( _shader_scene_route.id, "uNormalMtx" );
11179 _uniform_scene_route_uTexGarbage = glGetUniformLocation( _shader_scene_route.id, "uTexGarbage" );
11180 _uniform_scene_route_uTexGradients = glGetUniformLocation( _shader_scene_route.id, "uTexGradients" );
11181 _uniform_scene_route_uCamera = glGetUniformLocation( _shader_scene_route.id, "uCamera" );
11182 _uniform_scene_route_uColour = glGetUniformLocation( _shader_scene_route.id, "uColour" );
11183 _uniform_scene_route_g_world_depth = glGetUniformLocation( _shader_scene_route.id, "g_world_depth" );
11184 _uniform_scene_route_uLightsArray = glGetUniformLocation( _shader_scene_route.id, "uLightsArray" );
11185 _uniform_scene_route_uLightsIndex = glGetUniformLocation( _shader_scene_route.id, "uLightsIndex" );
11186 _uniform_scene_depth_uMdl = glGetUniformLocation( _shader_scene_depth.id, "uMdl" );
11187 _uniform_scene_depth_uPv = glGetUniformLocation( _shader_scene_depth.id, "uPv" );
11188 _uniform_scene_depth_uPvmPrev = glGetUniformLocation( _shader_scene_depth.id, "uPvmPrev" );
11189 _uniform_scene_depth_uCamera = glGetUniformLocation( _shader_scene_depth.id, "uCamera" );
11190 _uniform_scene_depth_uBoard0 = glGetUniformLocation( _shader_scene_depth.id, "uBoard0" );
11191 _uniform_scene_depth_uBoard1 = glGetUniformLocation( _shader_scene_depth.id, "uBoard1" );
11192 _uniform_scene_depth_g_world_depth = glGetUniformLocation( _shader_scene_depth.id, "g_world_depth" );
11193 _uniform_scene_depth_uLightsArray = glGetUniformLocation( _shader_scene_depth.id, "uLightsArray" );
11194 _uniform_scene_depth_uLightsIndex = glGetUniformLocation( _shader_scene_depth.id, "uLightsIndex" );
11195 _uniform_scene_position_uMdl = glGetUniformLocation( _shader_scene_position.id, "uMdl" );
11196 _uniform_scene_position_uPv = glGetUniformLocation( _shader_scene_position.id, "uPv" );
11197 _uniform_scene_position_uPvmPrev = glGetUniformLocation( _shader_scene_position.id, "uPvmPrev" );
11198 _uniform_scene_position_uCamera = glGetUniformLocation( _shader_scene_position.id, "uCamera" );
11199 _uniform_scene_position_uBoard0 = glGetUniformLocation( _shader_scene_position.id, "uBoard0" );
11200 _uniform_scene_position_uBoard1 = glGetUniformLocation( _shader_scene_position.id, "uBoard1" );
11201 _uniform_scene_position_g_world_depth = glGetUniformLocation( _shader_scene_position.id, "g_world_depth" );
11202 _uniform_scene_position_uLightsArray = glGetUniformLocation( _shader_scene_position.id, "uLightsArray" );
11203 _uniform_scene_position_uLightsIndex = glGetUniformLocation( _shader_scene_position.id, "uLightsIndex" );
11204 _uniform_scene_cubemapped_uMdl = glGetUniformLocation( _shader_scene_cubemapped.id, "uMdl" );
11205 _uniform_scene_cubemapped_uPv = glGetUniformLocation( _shader_scene_cubemapped.id, "uPv" );
11206 _uniform_scene_cubemapped_uPvmPrev = glGetUniformLocation( _shader_scene_cubemapped.id, "uPvmPrev" );
11207 _uniform_scene_cubemapped_uTexGarbage = glGetUniformLocation( _shader_scene_cubemapped.id, "uTexGarbage" );
11208 _uniform_scene_cubemapped_uTexMain = glGetUniformLocation( _shader_scene_cubemapped.id, "uTexMain" );
11209 _uniform_scene_cubemapped_uTexCubemap = glGetUniformLocation( _shader_scene_cubemapped.id, "uTexCubemap" );
11210 _uniform_scene_cubemapped_uCamera = glGetUniformLocation( _shader_scene_cubemapped.id, "uCamera" );
11211 _uniform_scene_cubemapped_uPlane = glGetUniformLocation( _shader_scene_cubemapped.id, "uPlane" );
11212 _uniform_scene_cubemapped_uColour = glGetUniformLocation( _shader_scene_cubemapped.id, "uColour" );
11213 _uniform_scene_cubemapped_g_world_depth = glGetUniformLocation( _shader_scene_cubemapped.id, "g_world_depth" );
11214 _uniform_scene_cubemapped_uLightsArray = glGetUniformLocation( _shader_scene_cubemapped.id, "uLightsArray" );
11215 _uniform_scene_cubemapped_uLightsIndex = glGetUniformLocation( _shader_scene_cubemapped.id, "uLightsIndex" );
11216 _uniform_scene_water_uMdl = glGetUniformLocation( _shader_scene_water.id, "uMdl" );
11217 _uniform_scene_water_uPv = glGetUniformLocation( _shader_scene_water.id, "uPv" );
11218 _uniform_scene_water_uPvmPrev = glGetUniformLocation( _shader_scene_water.id, "uPvmPrev" );
11219 _uniform_scene_water_uTexMain = glGetUniformLocation( _shader_scene_water.id, "uTexMain" );
11220 _uniform_scene_water_uTexDudv = glGetUniformLocation( _shader_scene_water.id, "uTexDudv" );
11221 _uniform_scene_water_uTexBack = glGetUniformLocation( _shader_scene_water.id, "uTexBack" );
11222 _uniform_scene_water_uInvRes = glGetUniformLocation( _shader_scene_water.id, "uInvRes" );
11223 _uniform_scene_water_uTime = glGetUniformLocation( _shader_scene_water.id, "uTime" );
11224 _uniform_scene_water_uCamera = glGetUniformLocation( _shader_scene_water.id, "uCamera" );
11225 _uniform_scene_water_uSurfaceY = glGetUniformLocation( _shader_scene_water.id, "uSurfaceY" );
11226 _uniform_scene_water_uBoard0 = glGetUniformLocation( _shader_scene_water.id, "uBoard0" );
11227 _uniform_scene_water_uBoard1 = glGetUniformLocation( _shader_scene_water.id, "uBoard1" );
11228 _uniform_scene_water_uShoreColour = glGetUniformLocation( _shader_scene_water.id, "uShoreColour" );
11229 _uniform_scene_water_uOceanColour = glGetUniformLocation( _shader_scene_water.id, "uOceanColour" );
11230 _uniform_scene_water_g_world_depth = glGetUniformLocation( _shader_scene_water.id, "g_world_depth" );
11231 _uniform_scene_water_uLightsArray = glGetUniformLocation( _shader_scene_water.id, "uLightsArray" );
11232 _uniform_scene_water_uLightsIndex = glGetUniformLocation( _shader_scene_water.id, "uLightsIndex" );
11233 _uniform_scene_water_fast_uMdl = glGetUniformLocation( _shader_scene_water_fast.id, "uMdl" );
11234 _uniform_scene_water_fast_uPv = glGetUniformLocation( _shader_scene_water_fast.id, "uPv" );
11235 _uniform_scene_water_fast_uPvmPrev = glGetUniformLocation( _shader_scene_water_fast.id, "uPvmPrev" );
11236 _uniform_scene_water_fast_uTexDudv = glGetUniformLocation( _shader_scene_water_fast.id, "uTexDudv" );
11237 _uniform_scene_water_fast_uTime = glGetUniformLocation( _shader_scene_water_fast.id, "uTime" );
11238 _uniform_scene_water_fast_uCamera = glGetUniformLocation( _shader_scene_water_fast.id, "uCamera" );
11239 _uniform_scene_water_fast_uSurfaceY = glGetUniformLocation( _shader_scene_water_fast.id, "uSurfaceY" );
11240 _uniform_scene_water_fast_uBoard0 = glGetUniformLocation( _shader_scene_water_fast.id, "uBoard0" );
11241 _uniform_scene_water_fast_uBoard1 = glGetUniformLocation( _shader_scene_water_fast.id, "uBoard1" );
11242 _uniform_scene_water_fast_uShoreColour = glGetUniformLocation( _shader_scene_water_fast.id, "uShoreColour" );
11243 _uniform_scene_water_fast_uOceanColour = glGetUniformLocation( _shader_scene_water_fast.id, "uOceanColour" );
11244 _uniform_scene_water_fast_g_world_depth = glGetUniformLocation( _shader_scene_water_fast.id, "g_world_depth" );
11245 _uniform_scene_water_fast_uLightsArray = glGetUniformLocation( _shader_scene_water_fast.id, "uLightsArray" );
11246 _uniform_scene_water_fast_uLightsIndex = glGetUniformLocation( _shader_scene_water_fast.id, "uLightsIndex" );
11247 _uniform_scene_scoretext_uMdl = glGetUniformLocation( _shader_scene_scoretext.id, "uMdl" );
11248 _uniform_scene_scoretext_uPv = glGetUniformLocation( _shader_scene_scoretext.id, "uPv" );
11249 _uniform_scene_scoretext_uPvmPrev = glGetUniformLocation( _shader_scene_scoretext.id, "uPvmPrev" );
11250 _uniform_scene_scoretext_uInfo = glGetUniformLocation( _shader_scene_scoretext.id, "uInfo" );
11251 _uniform_scene_scoretext_uTexGarbage = glGetUniformLocation( _shader_scene_scoretext.id, "uTexGarbage" );
11252 _uniform_scene_scoretext_uTexMain = glGetUniformLocation( _shader_scene_scoretext.id, "uTexMain" );
11253 _uniform_scene_scoretext_uCamera = glGetUniformLocation( _shader_scene_scoretext.id, "uCamera" );
11254 _uniform_scene_scoretext_uPlane = glGetUniformLocation( _shader_scene_scoretext.id, "uPlane" );
11255 _uniform_scene_scoretext_g_world_depth = glGetUniformLocation( _shader_scene_scoretext.id, "g_world_depth" );
11256 _uniform_scene_scoretext_uLightsArray = glGetUniformLocation( _shader_scene_scoretext.id, "uLightsArray" );
11257 _uniform_scene_scoretext_uLightsIndex = glGetUniformLocation( _shader_scene_scoretext.id, "uLightsIndex" );
11258 _uniform_scene_font_uMdl = glGetUniformLocation( _shader_scene_font.id, "uMdl" );
11259 _uniform_scene_font_uPv = glGetUniformLocation( _shader_scene_font.id, "uPv" );
11260 _uniform_scene_font_uPvmPrev = glGetUniformLocation( _shader_scene_font.id, "uPvmPrev" );
11261 _uniform_scene_font_uOffset = glGetUniformLocation( _shader_scene_font.id, "uOffset" );
11262 _uniform_scene_font_uTexGarbage = glGetUniformLocation( _shader_scene_font.id, "uTexGarbage" );
11263 _uniform_scene_font_uTexMain = glGetUniformLocation( _shader_scene_font.id, "uTexMain" );
11264 _uniform_scene_font_uCamera = glGetUniformLocation( _shader_scene_font.id, "uCamera" );
11265 _uniform_scene_font_uTime = glGetUniformLocation( _shader_scene_font.id, "uTime" );
11266 _uniform_scene_font_uOpacity = glGetUniformLocation( _shader_scene_font.id, "uOpacity" );
11267 _uniform_scene_font_uColourize = glGetUniformLocation( _shader_scene_font.id, "uColourize" );
11268 _uniform_scene_font_g_world_depth = glGetUniformLocation( _shader_scene_font.id, "g_world_depth" );
11269 _uniform_scene_font_uLightsArray = glGetUniformLocation( _shader_scene_font.id, "uLightsArray" );
11270 _uniform_scene_font_uLightsIndex = glGetUniformLocation( _shader_scene_font.id, "uLightsIndex" );
11271 _uniform_model_sky_uMdl = glGetUniformLocation( _shader_model_sky.id, "uMdl" );
11272 _uniform_model_sky_uPv = glGetUniformLocation( _shader_model_sky.id, "uPv" );
11273 _uniform_model_sky_uPvmPrev = glGetUniformLocation( _shader_model_sky.id, "uPvmPrev" );
11274 _uniform_model_sky_uTexGarbage = glGetUniformLocation( _shader_model_sky.id, "uTexGarbage" );
11275 _uniform_model_sky_g_world_depth = glGetUniformLocation( _shader_model_sky.id, "g_world_depth" );
11276 _uniform_model_sky_uLightsArray = glGetUniformLocation( _shader_model_sky.id, "uLightsArray" );
11277 _uniform_model_sky_uLightsIndex = glGetUniformLocation( _shader_model_sky.id, "uLightsIndex" );
11278 _uniform_model_sky_space_uMdl = glGetUniformLocation( _shader_model_sky_space.id, "uMdl" );
11279 _uniform_model_sky_space_uPv = glGetUniformLocation( _shader_model_sky_space.id, "uPv" );
11280 _uniform_model_sky_space_uPvmPrev = glGetUniformLocation( _shader_model_sky_space.id, "uPvmPrev" );
11281 _uniform_model_sky_space_uTexGarbage = glGetUniformLocation( _shader_model_sky_space.id, "uTexGarbage" );
11282 _uniform_model_sky_space_g_world_depth = glGetUniformLocation( _shader_model_sky_space.id, "g_world_depth" );
11283 _uniform_model_sky_space_uLightsArray = glGetUniformLocation( _shader_model_sky_space.id, "uLightsArray" );
11284 _uniform_model_sky_space_uLightsIndex = glGetUniformLocation( _shader_model_sky_space.id, "uLightsIndex" );
11285 _uniform_model_menu_uMdl = glGetUniformLocation( _shader_model_menu.id, "uMdl" );
11286 _uniform_model_menu_uPv = glGetUniformLocation( _shader_model_menu.id, "uPv" );
11287 _uniform_model_menu_uPvmPrev = glGetUniformLocation( _shader_model_menu.id, "uPvmPrev" );
11288 _uniform_model_menu_uTexMain = glGetUniformLocation( _shader_model_menu.id, "uTexMain" );
11289 _uniform_model_menu_uColour = glGetUniformLocation( _shader_model_menu.id, "uColour" );
11290 _uniform_model_character_view_uPv = glGetUniformLocation( _shader_model_character_view.id, "uPv" );
11291 _uniform_model_character_view_uTransforms = glGetUniformLocation( _shader_model_character_view.id, "uTransforms" );
11292 _uniform_model_character_view_uTexMain = glGetUniformLocation( _shader_model_character_view.id, "uTexMain" );
11293 _uniform_model_character_view_uCamera = glGetUniformLocation( _shader_model_character_view.id, "uCamera" );
11294 _uniform_model_character_view_g_world_depth = glGetUniformLocation( _shader_model_character_view.id, "g_world_depth" );
11295 _uniform_model_character_view_uLightsArray = glGetUniformLocation( _shader_model_character_view.id, "uLightsArray" );
11296 _uniform_model_character_view_uLightsIndex = glGetUniformLocation( _shader_model_character_view.id, "uLightsIndex" );
11297 _uniform_model_character_view_uTexSceneDepth = glGetUniformLocation( _shader_model_character_view.id, "uTexSceneDepth" );
11298 _uniform_model_character_view_uInverseRatioDepth = glGetUniformLocation( _shader_model_character_view.id, "uInverseRatioDepth" );
11299 _uniform_model_character_view_uInverseRatioMain = glGetUniformLocation( _shader_model_character_view.id, "uInverseRatioMain" );
11300 _uniform_model_character_view_uDepthMode = glGetUniformLocation( _shader_model_character_view.id, "uDepthMode" );
11301 _uniform_model_character_view_uDitherCutoff = glGetUniformLocation( _shader_model_character_view.id, "uDitherCutoff" );
11302 _uniform_model_board_view_uMdl = glGetUniformLocation( _shader_model_board_view.id, "uMdl" );
11303 _uniform_model_board_view_uPv = glGetUniformLocation( _shader_model_board_view.id, "uPv" );
11304 _uniform_model_board_view_uPvmPrev = glGetUniformLocation( _shader_model_board_view.id, "uPvmPrev" );
11305 _uniform_model_board_view_uTexMain = glGetUniformLocation( _shader_model_board_view.id, "uTexMain" );
11306 _uniform_model_board_view_uCamera = glGetUniformLocation( _shader_model_board_view.id, "uCamera" );
11307 _uniform_model_board_view_g_world_depth = glGetUniformLocation( _shader_model_board_view.id, "g_world_depth" );
11308 _uniform_model_board_view_uLightsArray = glGetUniformLocation( _shader_model_board_view.id, "uLightsArray" );
11309 _uniform_model_board_view_uLightsIndex = glGetUniformLocation( _shader_model_board_view.id, "uLightsIndex" );
11310 _uniform_model_board_view_uTexSceneDepth = glGetUniformLocation( _shader_model_board_view.id, "uTexSceneDepth" );
11311 _uniform_model_board_view_uInverseRatioDepth = glGetUniformLocation( _shader_model_board_view.id, "uInverseRatioDepth" );
11312 _uniform_model_board_view_uInverseRatioMain = glGetUniformLocation( _shader_model_board_view.id, "uInverseRatioMain" );
11313 _uniform_model_board_view_uDepthMode = glGetUniformLocation( _shader_model_board_view.id, "uDepthMode" );
11314 _uniform_model_board_view_uDitherCutoff = glGetUniformLocation( _shader_model_board_view.id, "uDitherCutoff" );
11315 _uniform_model_entity_uMdl = glGetUniformLocation( _shader_model_entity.id, "uMdl" );
11316 _uniform_model_entity_uPv = glGetUniformLocation( _shader_model_entity.id, "uPv" );
11317 _uniform_model_entity_uPvmPrev = glGetUniformLocation( _shader_model_entity.id, "uPvmPrev" );
11318 _uniform_model_entity_uTexMain = glGetUniformLocation( _shader_model_entity.id, "uTexMain" );
11319 _uniform_model_entity_uCamera = glGetUniformLocation( _shader_model_entity.id, "uCamera" );
11320 _uniform_model_entity_g_world_depth = glGetUniformLocation( _shader_model_entity.id, "g_world_depth" );
11321 _uniform_model_entity_uLightsArray = glGetUniformLocation( _shader_model_entity.id, "uLightsArray" );
11322 _uniform_model_entity_uLightsIndex = glGetUniformLocation( _shader_model_entity.id, "uLightsIndex" );
11323 _uniform_model_gate_uMdl = glGetUniformLocation( _shader_model_gate.id, "uMdl" );
11324 _uniform_model_gate_uPv = glGetUniformLocation( _shader_model_gate.id, "uPv" );
11325 _uniform_model_gate_uPvmPrev = glGetUniformLocation( _shader_model_gate.id, "uPvmPrev" );
11326 _uniform_model_gate_uTime = glGetUniformLocation( _shader_model_gate.id, "uTime" );
11327 _uniform_model_gate_uCam = glGetUniformLocation( _shader_model_gate.id, "uCam" );
11328 _uniform_model_gate_uInvRes = glGetUniformLocation( _shader_model_gate.id, "uInvRes" );
11329 _uniform_model_gate_uColour = glGetUniformLocation( _shader_model_gate.id, "uColour" );
11330 _uniform_model_gate_unlinked_uMdl = glGetUniformLocation( _shader_model_gate_unlinked.id, "uMdl" );
11331 _uniform_model_gate_unlinked_uPv = glGetUniformLocation( _shader_model_gate_unlinked.id, "uPv" );
11332 _uniform_model_gate_unlinked_uPvmPrev = glGetUniformLocation( _shader_model_gate_unlinked.id, "uPvmPrev" );
11333 _uniform_model_gate_unlinked_uTime = glGetUniformLocation( _shader_model_gate_unlinked.id, "uTime" );
11334 _uniform_model_gate_unlinked_uCam = glGetUniformLocation( _shader_model_gate_unlinked.id, "uCam" );
11335 _uniform_model_gate_unlinked_uColour = glGetUniformLocation( _shader_model_gate_unlinked.id, "uColour" );
11336 _uniform_model_font_uMdl = glGetUniformLocation( _shader_model_font.id, "uMdl" );
11337 _uniform_model_font_uPv = glGetUniformLocation( _shader_model_font.id, "uPv" );
11338 _uniform_model_font_uPvmPrev = glGetUniformLocation( _shader_model_font.id, "uPvmPrev" );
11339 _uniform_model_font_uOffset = glGetUniformLocation( _shader_model_font.id, "uOffset" );
11340 _uniform_model_font_uTexMain = glGetUniformLocation( _shader_model_font.id, "uTexMain" );
11341 _uniform_model_font_uColour = glGetUniformLocation( _shader_model_font.id, "uColour" );
11342 _uniform_model_font_uTexSceneDepth = glGetUniformLocation( _shader_model_font.id, "uTexSceneDepth" );
11343 _uniform_model_font_uInverseRatioDepth = glGetUniformLocation( _shader_model_font.id, "uInverseRatioDepth" );
11344 _uniform_model_font_uInverseRatioMain = glGetUniformLocation( _shader_model_font.id, "uInverseRatioMain" );
11345 _uniform_model_font_uDepthMode = glGetUniformLocation( _shader_model_font.id, "uDepthMode" );
11346 _uniform_model_font_uDitherCutoff = glGetUniformLocation( _shader_model_font.id, "uDitherCutoff" );
11347 _uniform_particle_uPv = glGetUniformLocation( _shader_particle.id, "uPv" );
11348 _uniform_particle_uPvPrev = glGetUniformLocation( _shader_particle.id, "uPvPrev" );
11349 _uniform_trail_uPv = glGetUniformLocation( _shader_trail.id, "uPv" );
11350 _uniform_trail_uPvPrev = glGetUniformLocation( _shader_trail.id, "uPvPrev" );
11351 _uniform_trail_uColour = glGetUniformLocation( _shader_trail.id, "uColour" );
11352 _uniform_blit_uInverseRatio = glGetUniformLocation( _shader_blit.id, "uInverseRatio" );
11353 _uniform_blit_uTexMain = glGetUniformLocation( _shader_blit.id, "uTexMain" );
11354 _uniform_blitblur_uInverseRatio = glGetUniformLocation( _shader_blitblur.id, "uInverseRatio" );
11355 _uniform_blitblur_uTexMain = glGetUniformLocation( _shader_blitblur.id, "uTexMain" );
11356 _uniform_blitblur_uTexMotion = glGetUniformLocation( _shader_blitblur.id, "uTexMotion" );
11357 _uniform_blitblur_uBlurStrength = glGetUniformLocation( _shader_blitblur.id, "uBlurStrength" );
11358 _uniform_blitblur_uOverrideDir = glGetUniformLocation( _shader_blitblur.id, "uOverrideDir" );
11359 _uniform_blitblur_uTime = glGetUniformLocation( _shader_blitblur.id, "uTime" );
11360 _uniform_blitblur_uGlitchStrength = glGetUniformLocation( _shader_blitblur.id, "uGlitchStrength" );
11361 _uniform_blitblur_uClampUv = glGetUniformLocation( _shader_blitblur.id, "uClampUv" );
11362 _uniform_blitcolour_uInverseRatio = glGetUniformLocation( _shader_blitcolour.id, "uInverseRatio" );
11363 _uniform_blitcolour_uColour = glGetUniformLocation( _shader_blitcolour.id, "uColour" );
11364 _uniform_blit_transition_uInverseRatio = glGetUniformLocation( _shader_blit_transition.id, "uInverseRatio" );
11365 _uniform_blit_transition_uT = glGetUniformLocation( _shader_blit_transition.id, "uT" );
11366 _uniform_routeui_uOffset = glGetUniformLocation( _shader_routeui.id, "uOffset" );
11367 _uniform_routeui_uColour = glGetUniformLocation( _shader_routeui.id, "uColour" );
11368 }
11369
11370 void vg_auto_shader_register(void)
11371 {
11372 vg_shader_register( &_shader_scene_standard );
11373 vg_shader_register( &_shader_scene_standard_alphatest );
11374 vg_shader_register( &_shader_scene_foliage );
11375 vg_shader_register( &_shader_scene_override );
11376 vg_shader_register( &_shader_scene_fxglow );
11377 vg_shader_register( &_shader_scene_vertex_blend );
11378 vg_shader_register( &_shader_scene_terrain );
11379 vg_shader_register( &_shader_scene_route );
11380 vg_shader_register( &_shader_scene_depth );
11381 vg_shader_register( &_shader_scene_position );
11382 vg_shader_register( &_shader_scene_cubemapped );
11383 vg_shader_register( &_shader_scene_water );
11384 vg_shader_register( &_shader_scene_water_fast );
11385 vg_shader_register( &_shader_scene_scoretext );
11386 vg_shader_register( &_shader_scene_font );
11387 vg_shader_register( &_shader_model_sky );
11388 vg_shader_register( &_shader_model_sky_space );
11389 vg_shader_register( &_shader_model_menu );
11390 vg_shader_register( &_shader_model_character_view );
11391 vg_shader_register( &_shader_model_board_view );
11392 vg_shader_register( &_shader_model_entity );
11393 vg_shader_register( &_shader_model_gate );
11394 vg_shader_register( &_shader_model_gate_unlinked );
11395 vg_shader_register( &_shader_model_font );
11396 vg_shader_register( &_shader_particle );
11397 vg_shader_register( &_shader_trail );
11398 vg_shader_register( &_shader_blit );
11399 vg_shader_register( &_shader_blitblur );
11400 vg_shader_register( &_shader_blitcolour );
11401 vg_shader_register( &_shader_blit_transition );
11402 vg_shader_register( &_shader_routeui );
11403 }
11404