fix movement bugs
[fishladder.git] / fishladder_resources.h
1 // TEXTURES
2 // ===========================================================================================================
3
4 vg_tex2d tex_tile_data = { .path = "textures/tileset.qoi" };
5 vg_tex2d tex_tile_detail = { .path = "textures/tile_overlays.qoi" };
6 vg_tex2d tex_wood = { .path = "textures/wood.qoi" };
7 vg_tex2d tex_background = { .path = "textures/background.qoi" };
8 vg_tex2d tex_ball_noise = { .path = "textures/bnoise.qoi" };
9
10 vg_tex2d *texture_list[] = { &tex_tile_detail, &tex_tile_data, &tex_wood, &tex_background, &tex_ball_noise };
11
12 // AUDIO
13 // ===========================================================================================================
14
15 sfx_vol_control audio_volume_sfx = { .val = 1.0f, .name = "Sound effects" };
16 sfx_vol_control audio_volume_music = { .val = 1.0f, .name = "Music" };
17
18 sfx_system audio_system_sfx =
19 {
20 .vol = 1.f,
21 .ch = 1,
22 .vol_src = &audio_volume_sfx,
23 .name = "sfx"
24 };
25
26 sfx_set audio_tile_mod =
27 {
28 .sources = "\
29 sound/mod_01.ogg\0\
30 sound/mod_02.ogg\0\
31 sound/mod_03.ogg\0\
32 sound/mod_04.ogg\0\
33 sound/mod_05.ogg\0\
34 sound/mod_06.ogg\0",
35 .flags = 0
36 };
37
38 sfx_set audio_splitter =
39 {
40 .sources = "\
41 sound/splitter_01.ogg\0"
42 };
43
44 sfx_set audio_rolls =
45 {
46 .sources = "\
47 sound/rolling_01.ogg\0\
48 sound/rolling_02.ogg\0"
49 };
50
51 sfx_set audio_random =
52 {
53 .sources = "\
54 sound/random_01.ogg\0\
55 sound/random_02.ogg\0\
56 sound/random_03.ogg\0\
57 sound/random_04.ogg\0\
58 sound/random_05.ogg\0\
59 sound/random_06.ogg\0\
60 sound/random_07.ogg\0\
61 sound/random_08.ogg\0"
62 };
63
64 // One two or three layers of rolling noise
65 sfx_system audio_system_balls_rolling =
66 {
67 .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx,
68 .name = "Balls Rolling", .flags = SFX_FLAG_REPEAT
69 };
70
71 // Various oneshots
72 sfx_system audio_system_balls_switching =
73 {
74 .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx,
75 .name = "Balls Switching"
76 };
77
78 // Gameplay critical sounds eg. splitter sound rocking
79 sfx_system audio_system_balls_important =
80 {
81 .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx,
82 .name = "Balls Gameplay"
83 };
84
85 // Suplemental sounds
86 sfx_system audio_system_balls_extra =
87 {
88 .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx,
89 .name = "Balls Extra"
90 };
91
92 static void resource_load_main(void)
93 {
94 // Textures
95 vg_tex2d_init( texture_list, vg_list_size( texture_list ) );
96
97 // Audio
98 sfx_set_init( &audio_tile_mod, NULL );
99 sfx_set_init( &audio_splitter, NULL );
100 sfx_set_init( &audio_rolls, NULL );
101 sfx_set_init( &audio_random, NULL );
102 }
103
104 static void resource_free_main(void)
105 {
106 vg_tex2d_free( texture_list, vg_list_size( texture_list ) );
107
108 sfx_set_free( &audio_tile_mod );
109 sfx_set_free( &audio_splitter );
110 sfx_set_free( &audio_rolls );
111 sfx_set_free( &audio_random );
112 }
113
114 // SHADERS
115 // ===========================================================================================================
116
117 SHADER_DEFINE( shader_tile_colour,
118
119 // VERTEX
120 "layout (location=0) in vec2 a_co;"
121 "uniform mat3 uPv;"
122 "uniform vec3 uOffset;"
123 ""
124 "void main()"
125 "{"
126 "gl_Position = vec4( uPv * vec3( a_co * uOffset.z + uOffset.xy, 1.0 ), 1.0 );"
127 "}",
128
129 // FRAGMENT
130 "out vec4 FragColor;"
131 "uniform vec4 uColour;"
132 ""
133 "void main()"
134 "{"
135 "FragColor = uColour;"
136 "}"
137 ,
138 UNIFORMS({ "uPv", "uOffset", "uColour" })
139 )
140
141 SHADER_DEFINE( shader_ball,
142 // VERTEX
143 "layout (location=0) in vec2 a_co;"
144 "uniform vec2 uOffset;"
145 "uniform mat3 uPv;"
146 ""
147 "out vec4 aTexCoords;"
148 ""
149 "void main()"
150 "{"
151 // Vertex transform
152 "vec3 worldpos = vec3( a_co * 0.5 - 0.25 + uOffset, 1.0 );"
153 "gl_Position = vec4( uPv * worldpos, 1.0 );"
154
155 // Create texture coords
156 "aTexCoords = vec4( a_co, worldpos.xy );"
157 "}",
158
159 // FRAGMENT
160 "out vec4 FragColor;"
161 ""
162 "uniform sampler2D uTexMain;"
163 "uniform vec3 uColour;"
164 "uniform vec2 uTexOffset;"
165 ""
166 "in vec4 aTexCoords;"
167 ""
168 "void main()"
169 "{"
170 "vec2 center_coords = aTexCoords.xy - 0.5;"
171 "vec2 center_coords_sqr = center_coords*center_coords;"
172 "float circle_factor = smoothstep( 0.07, 0.0625, center_coords_sqr.x+center_coords_sqr.y );"
173
174 "float bulge_amt = center_coords_sqr.x+center_coords_sqr.y;"
175 "vec2 warped_coords = aTexCoords.zw+uTexOffset - center_coords;"
176 "vec4 noise_sample = texture( uTexMain, warped_coords );"
177
178 "float rim_light = (center_coords_sqr.x+center_coords_sqr.y)*15.0;"
179
180 "vec2 shadow_coords = center_coords + vec2(0.02,0.07);"
181 "vec2 shadow_coords_sqr = shadow_coords*shadow_coords;"
182 "float shadow = exp(-((shadow_coords_sqr.x+shadow_coords_sqr.y)-0.0125)*15.0);"
183
184 "vec3 marble_comp = uColour*0.9 + (noise_sample.x*0.7+pow(rim_light,3.0)*2.0) * 0.1;"
185 "vec4 colour_comp = mix( vec4(0.74,0.53,0.34,shadow), vec4(marble_comp,1.0), circle_factor );"
186
187 "FragColor = colour_comp;"
188 "}"
189 ,
190 UNIFORMS({ "uTexMain", "uColour", "uOffset", "uPv", "uTexOffset" })
191 )
192
193 SHADER_DEFINE( shader_tile_main,
194 // VERTEX
195 "layout (location=0) in vec2 a_co;"
196 "uniform vec4 uOffset;" // Tile x/y, uv x/y
197 "uniform mat3 uPv;"
198 "uniform mat2 uSubTransform;"
199 ""
200 "out vec4 aTexCoords;"
201 "out vec2 aWorldCoords;"
202 ""
203 "vec2 hash22(vec2 p)"
204 "{"
205 "vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));"
206 "p3 += dot(p3, p3.yzx+33.33);"
207 "return fract((p3.xx+p3.yz)*p3.zy);"
208 "}"
209 ""
210 "void main()"
211 "{"
212 // Vertex transform
213 "vec2 subtransform = uSubTransform * (a_co-0.5) + 0.5;"
214 "vec3 worldpos = vec3( subtransform + uOffset.xy, 1.0 );"
215 "gl_Position = vec4( uPv * worldpos, 1.0 );"
216
217 // Create texture coords
218 "vec2 random_offset = floor(hash22(uOffset.xy) * 4.0) * 0.25;"
219 "vec2 edge_safe_coords = a_co * 0.98 + 0.01;"
220 "aTexCoords = vec4((edge_safe_coords + uOffset.zw) * 0.25, edge_safe_coords * 0.25 + random_offset );"
221 "aWorldCoords = worldpos.xy;"
222 "}",
223
224 // FRAGMENT
225 "out vec4 FragColor;"
226 ""
227 "uniform sampler2D uTexGlyphs;"
228 "uniform sampler2D uTexWood;"
229 "uniform float uGhost;"
230 "uniform float uForeground;"
231 "uniform vec2 uMousePos;"
232 "uniform vec4 uColour;"
233 ""
234 "in vec4 aTexCoords;"
235 "in vec2 aWorldCoords;"
236 ""
237 "void main()"
238 "{"
239 "vec3 shadowing_colour = vec3( 0.93, 0.88536, 0.8184 );"
240 "vec4 glyph = texture( uTexGlyphs, aTexCoords.xy );"
241 "vec4 wood = texture( uTexWood, aTexCoords.zw );"
242 "vec4 wood_secondary = texture( uTexWood, aTexCoords.zw + 0.25 );"
243 "vec3 wood_comp = mix( wood_secondary.rgb * shadowing_colour, wood.rgb, clamp( glyph.b * 2.0 - 1.0, 0.0, 1.0 ) );"
244
245 "vec3 shadows = mix( vec3( 0.85, 0.7344, 0.561 ), vec3(1.0,1.0,1.0), glyph.r );"
246
247 "vec4 output_regular = vec4( wood_comp * shadows, mix( glyph.a, glyph.b, uForeground ) );"
248
249 "float ghost_dist = clamp( 1.5 - distance(uMousePos, aWorldCoords), 0.0, 1.0 );"
250 "vec4 output_ghost = vec4( 1.0, 1.0, 1.0, glyph.g * ghost_dist );"
251
252 "FragColor = mix( output_regular, output_ghost, uGhost ) * uColour;"
253 "}"
254 ,
255 UNIFORMS({ "uPv", "uOffset", "uTexGlyphs", "uTexWood", "uSubTransform", "uGhost", "uMousePos", "uColour", "uForeground" })
256 )
257
258 SHADER_DEFINE( shader_background,
259 // VERTEX
260 "layout (location=0) in vec2 a_co;"
261 "uniform mat3 uPv;"
262 "uniform vec3 uOffset;"
263 ""
264 "out vec2 aTexCoords;"
265 ""
266 "void main()"
267 "{"
268 "vec2 world_pos = a_co * uOffset.z + uOffset.xy;"
269 "gl_Position = vec4( uPv * vec3( world_pos, 1.0 ), 1.0 );"
270 "aTexCoords = a_co;"
271 "}",
272
273 // FRAGMENT
274 "out vec4 FragColor;"
275 ""
276 "uniform sampler2D uTexMain;"
277 "uniform sampler2D uSamplerNoise;"
278 "uniform float uVariance;"
279 ""
280 "in vec2 aTexCoords;"
281 ""
282 "void main()"
283 "{"
284 "float ao_accum = 0.0;"
285 "for( int i=0; i<10; ++i )"
286 "{"
287 "vec2 random_noise = (texture( uSamplerNoise, aTexCoords * 20.0 + float(i) * 0.2 ).xy - vec2( 0.5, 0.5 )) * uVariance;"
288 "vec4 background = texture( uTexMain, aTexCoords + random_noise );"
289 "ao_accum += background.r * clamp((1.0 - length( random_noise )), 0.0, 1.0);"
290 "}"
291 "ao_accum *= 0.15;"
292
293 "vec4 data_this_tile = texture( uTexMain, aTexCoords );"
294
295 "ao_accum -= data_this_tile.r;"
296
297 "vec3 colour_main = vec3( 0.369768, 0.3654, 0.42 );"
298
299 "vec2 square_coords = fract( aTexCoords * 64.0 );"
300 "vec2 grid_coords = abs( square_coords - 0.5 );"
301 "float edge_contrast = (1.0-ao_accum*0.2);"
302
303 "float gridline = step( 0.49, max(grid_coords.x,grid_coords.y) );"
304 "float gridline_fadeout = min(max(edge_contrast-1.0, 0.0)*40.0 + data_this_tile.g,10.0);"
305
306 "FragColor = vec4( colour_main * edge_contrast + gridline * 0.02 * gridline_fadeout, 1.0 );"
307 "}"
308 ,
309 UNIFORMS({ "uPv", "uOffset", "uTexMain", "uVariance", "uSamplerNoise" })
310 )
311
312 SHADER_DEFINE( shader_wire,
313 // VERTEX
314 "layout (location=0) in vec2 a_co;"
315 "uniform vec3 uStart;"
316 "uniform vec3 uEnd;"
317 "uniform mat3 uPv;"
318 "uniform float uCurve;"
319 ""
320 "out vec2 aTexCoords;"
321 ""
322 "vec3 sample_curve_time( float t )"
323 "{"
324 "vec3 line_coord = mix( uStart, uEnd, t );"
325
326 "float curve_amt = 1.0-(pow((t*2.0-1.0),2.0));"
327 "return vec3( line_coord.x, line_coord.y - curve_amt*uCurve, line_coord.z );"
328 "}"
329 ""
330 "void main()"
331 "{"
332 // Vertex transform
333 "vec3 p0 = sample_curve_time( a_co.x );"
334 "vec3 p1 = sample_curve_time( a_co.x + 0.025 );"
335
336 "vec2 line_tangent = normalize(p1.xy-p0.xy);"
337 "vec2 line_normal = vec2( -line_tangent.y, line_tangent.x );"
338
339 "vec2 worldfinal = p0.xy + line_normal*a_co.y*p0.z;"
340
341 "gl_Position = vec4( uPv * vec3(worldfinal, 1.0), 1.0 );"
342
343 // Create texture coords (todo: include stretch adjusted coords?)
344 "aTexCoords = vec2( a_co.x, a_co.y + 0.5 );"
345 "}",
346
347 // FRAGMENT
348 "out vec4 FragColor;"
349 ""
350 "uniform sampler2D uTexMain;"
351 "uniform vec4 uColour;"
352 ""
353 "in vec2 aTexCoords;"
354 ""
355 "void main()"
356 "{"
357 "FragColor = uColour;"
358 "}"
359 ,
360 UNIFORMS({ "uPv", "uColour", "uTexMain", "uStart", "uEnd", "uCurve" })
361 )
362
363
364 void vg_register(void)
365 {
366 SHADER_INIT( shader_tile_colour );
367 SHADER_INIT( shader_tile_main );
368 SHADER_INIT( shader_ball );
369 SHADER_INIT( shader_background );
370 SHADER_INIT( shader_wire );
371 }
372
373 /*
374 0000 0 | 0001 1 | 0010 2 | 0011 3
375 | | | | |
376 X | X= | X | X=
377 | | |
378 0100 4 | 0101 5 | 0110 6 | 0111 7
379 | | | | |
380 =X | =X= | =X | =X=
381 | | |
382 1000 8 | 1001 9 | 1010 10 | 1011 11
383 | | | | |
384 X | X= | X | X=
385 | | | | | | |
386 1100 12 | 1101 13 | 1110 14 | 1111 15
387 | | | | |
388 =X | =X= | =X | =X=
389 | | | | | | |
390 */
391
392 float const MESH_NUMBER_0[] = {
393 #include "fonts/numbers/n0.h"
394 };
395
396 float const MESH_NUMBER_1[] = {
397 #include "fonts/numbers/n1.h"
398 };
399
400 float const MESH_NUMBER_2[] = {
401 #include "fonts/numbers/n2.h"
402 };
403
404 float const MESH_NUMBER_3[] = {
405 #include "fonts/numbers/n3.h"
406 };
407
408 float const MESH_NUMBER_4[] = {
409 #include "fonts/numbers/n4.h"
410 };
411
412 float const MESH_NUMBER_5[] = {
413 #include "fonts/numbers/n5.h"
414 };
415
416 float const MESH_NUMBER_6[] = {
417 #include "fonts/numbers/n6.h"
418 };
419
420 float const MESH_NUMBER_7[] = {
421 #include "fonts/numbers/n7.h"
422 };
423
424 float const MESH_NUMBER_8[] = {
425 #include "fonts/numbers/n8.h"
426 };
427
428 float const MESH_NUMBER_9[] = {
429 #include "fonts/numbers/n9.h"
430 };
431
432 float const MESH_NUMBERS_BUFFER[] =
433 {
434 #include "fonts/numbers/n0.h"
435 #include "fonts/numbers/n1.h"
436 #include "fonts/numbers/n2.h"
437 #include "fonts/numbers/n3.h"
438 #include "fonts/numbers/n4.h"
439 #include "fonts/numbers/n5.h"
440 #include "fonts/numbers/n6.h"
441 #include "fonts/numbers/n7.h"
442 #include "fonts/numbers/n8.h"
443 #include "fonts/numbers/n9.h"
444 };
445
446 #define MESH_NUMBER_DIVISOR 6
447
448 u32 const MESH_NUMBERS_OFFSETS[][2] =
449 {
450 {
451 0,
452 vg_list_size( MESH_NUMBER_0 ) / MESH_NUMBER_DIVISOR
453 },
454 {
455 vg_list_size( MESH_NUMBER_0 ) / MESH_NUMBER_DIVISOR,
456 vg_list_size( MESH_NUMBER_1 ) / MESH_NUMBER_DIVISOR
457 },
458 {
459 (
460 vg_list_size( MESH_NUMBER_0 ) +
461 vg_list_size( MESH_NUMBER_1 )
462 ) / MESH_NUMBER_DIVISOR,
463 vg_list_size( MESH_NUMBER_2 ) / MESH_NUMBER_DIVISOR
464 },
465 {
466 (
467 vg_list_size( MESH_NUMBER_0 ) +
468 vg_list_size( MESH_NUMBER_1 ) +
469 vg_list_size( MESH_NUMBER_2 )
470 ) / MESH_NUMBER_DIVISOR,
471 vg_list_size( MESH_NUMBER_3 ) / MESH_NUMBER_DIVISOR
472 },
473 {
474 (
475 vg_list_size( MESH_NUMBER_0 ) +
476 vg_list_size( MESH_NUMBER_1 ) +
477 vg_list_size( MESH_NUMBER_2 ) +
478 vg_list_size( MESH_NUMBER_3 )
479 ) / MESH_NUMBER_DIVISOR,
480 vg_list_size( MESH_NUMBER_4 ) / MESH_NUMBER_DIVISOR
481 },
482 {
483 (
484 vg_list_size( MESH_NUMBER_0 ) +
485 vg_list_size( MESH_NUMBER_1 ) +
486 vg_list_size( MESH_NUMBER_2 ) +
487 vg_list_size( MESH_NUMBER_3 ) +
488 vg_list_size( MESH_NUMBER_4 )
489 ) / MESH_NUMBER_DIVISOR,
490 vg_list_size( MESH_NUMBER_5 ) / MESH_NUMBER_DIVISOR
491 },
492 {
493 (
494 vg_list_size( MESH_NUMBER_0 ) +
495 vg_list_size( MESH_NUMBER_1 ) +
496 vg_list_size( MESH_NUMBER_2 ) +
497 vg_list_size( MESH_NUMBER_3 ) +
498 vg_list_size( MESH_NUMBER_4 ) +
499 vg_list_size( MESH_NUMBER_5 )
500 ) / MESH_NUMBER_DIVISOR,
501 vg_list_size( MESH_NUMBER_6 ) / MESH_NUMBER_DIVISOR
502 },
503 {
504 (
505 vg_list_size( MESH_NUMBER_0 ) +
506 vg_list_size( MESH_NUMBER_1 ) +
507 vg_list_size( MESH_NUMBER_2 ) +
508 vg_list_size( MESH_NUMBER_3 ) +
509 vg_list_size( MESH_NUMBER_4 ) +
510 vg_list_size( MESH_NUMBER_5 ) +
511 vg_list_size( MESH_NUMBER_6 )
512 ) / MESH_NUMBER_DIVISOR,
513 vg_list_size( MESH_NUMBER_7 ) / MESH_NUMBER_DIVISOR
514 },
515 {
516 (
517 vg_list_size( MESH_NUMBER_0 ) +
518 vg_list_size( MESH_NUMBER_1 ) +
519 vg_list_size( MESH_NUMBER_2 ) +
520 vg_list_size( MESH_NUMBER_3 ) +
521 vg_list_size( MESH_NUMBER_4 ) +
522 vg_list_size( MESH_NUMBER_5 ) +
523 vg_list_size( MESH_NUMBER_6 ) +
524 vg_list_size( MESH_NUMBER_7 )
525 ) / MESH_NUMBER_DIVISOR,
526 vg_list_size( MESH_NUMBER_8 ) / MESH_NUMBER_DIVISOR
527 },
528 {
529 (
530 vg_list_size( MESH_NUMBER_0 ) +
531 vg_list_size( MESH_NUMBER_1 ) +
532 vg_list_size( MESH_NUMBER_2 ) +
533 vg_list_size( MESH_NUMBER_3 ) +
534 vg_list_size( MESH_NUMBER_4 ) +
535 vg_list_size( MESH_NUMBER_5 ) +
536 vg_list_size( MESH_NUMBER_6 ) +
537 vg_list_size( MESH_NUMBER_7 ) +
538 vg_list_size( MESH_NUMBER_8 )
539 ) / MESH_NUMBER_DIVISOR,
540 vg_list_size( MESH_NUMBER_9 ) / MESH_NUMBER_DIVISOR
541 }
542 };