added curves for start/end points to prevent clipping
[fishladder.git] / fishladder_resources.h
1 // TEXTURES
2 // ===========================================================================================================
3
4 vg_tex2d tex_tile_data = { .path = "textures/tileset.png" };
5 vg_tex2d tex_tile_detail = { .path = "textures/tile_overlays.png" };
6 vg_tex2d tex_wood = { .path = "textures/wood.png" };
7 vg_tex2d tex_ball = { .path = "textures/ball.png", .flags = VG_TEXTURE_CLAMP };
8 vg_tex2d tex_background = { .path = "textures/background.png" };
9
10 vg_tex2d *texture_list[] = { &tex_tile_detail, &tex_tile_data, &tex_wood, &tex_ball, &tex_background };
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 vec2 aTexCoords;"
148 ""
149 "void main()"
150 "{"
151 // Create texture coords
152 "aTexCoords = a_co;"
153
154 // Vertex transform
155 "vec3 worldpos = vec3( a_co * 0.5 - 0.25 + uOffset, 1.0 );"
156 "gl_Position = vec4( uPv * worldpos, 1.0 );"
157 "}",
158
159 // FRAGMENT
160 "out vec4 FragColor;"
161 ""
162 "uniform sampler2D uTexMain;"
163 "uniform vec3 uColour;"
164 ""
165 "in vec2 aTexCoords;"
166 ""
167 "void main()"
168 "{"
169 "vec4 glyph = texture( uTexMain, aTexCoords );"
170 "FragColor = vec4( uColour + glyph.rgb * 0.2, glyph.a );"
171 "}"
172 ,
173 UNIFORMS({ "uTexMain", "uColour", "uOffset", "uPv" })
174 )
175
176 SHADER_DEFINE( shader_tile_main,
177 // VERTEX
178 "layout (location=0) in vec2 a_co;"
179 "uniform vec4 uOffset;" // Tile x/y, uv x/y
180 "uniform mat3 uPv;"
181 "uniform mat2 uSubTransform;"
182 ""
183 "out vec4 aTexCoords;"
184 "out vec2 aWorldCoords;"
185 ""
186 "vec2 hash22(vec2 p)"
187 "{"
188 "vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));"
189 "p3 += dot(p3, p3.yzx+33.33);"
190 "return fract((p3.xx+p3.yz)*p3.zy);"
191 "}"
192 ""
193 "void main()"
194 "{"
195 // Vertex transform
196 "vec2 subtransform = uSubTransform * (a_co-0.5) + 0.5;"
197 "vec3 worldpos = vec3( subtransform + uOffset.xy, 1.0 );"
198 "gl_Position = vec4( uPv * worldpos, 1.0 );"
199
200 // Create texture coords
201 "vec2 random_offset = floor(hash22(uOffset.xy) * 4.0) * 0.25;"
202 "vec2 edge_safe_coords = a_co * 0.98 + 0.01;"
203 "aTexCoords = vec4((edge_safe_coords + uOffset.zw) * 0.25, edge_safe_coords * 0.25 + random_offset );"
204 "aWorldCoords = worldpos.xy;"
205 "}",
206
207 // FRAGMENT
208 "out vec4 FragColor;"
209 ""
210 "uniform sampler2D uTexGlyphs;"
211 "uniform sampler2D uTexWood;"
212 "uniform float uGhost;"
213 "uniform float uForeground;"
214 "uniform vec2 uMousePos;"
215 "uniform vec4 uColour;"
216 ""
217 "in vec4 aTexCoords;"
218 "in vec2 aWorldCoords;"
219 ""
220 "void main()"
221 "{"
222 "vec3 shadowing_colour = vec3( 0.93, 0.88536, 0.8184 );"
223 "vec4 glyph = texture( uTexGlyphs, aTexCoords.xy );"
224 "vec4 wood = texture( uTexWood, aTexCoords.zw );"
225 "vec4 wood_secondary = texture( uTexWood, aTexCoords.zw + 0.25 );"
226 "vec3 wood_comp = mix( wood_secondary.rgb * shadowing_colour, wood.rgb, clamp( glyph.b * 2.0 - 1.0, 0.0, 1.0 ) );"
227
228 "vec3 shadows = mix( vec3( 0.85, 0.7344, 0.561 ), vec3(1.0,1.0,1.0), glyph.r );"
229
230 "vec4 output_regular = vec4( wood_comp * shadows, mix( glyph.a, glyph.b, uForeground ) );"
231
232 "float ghost_dist = clamp( 1.5 - distance(uMousePos, aWorldCoords), 0.0, 1.0 );"
233 "vec4 output_ghost = vec4( 1.0, 1.0, 1.0, glyph.g * ghost_dist );"
234
235 "FragColor = mix( output_regular, output_ghost, uGhost ) * uColour;"
236 "}"
237 ,
238 UNIFORMS({ "uPv", "uOffset", "uTexGlyphs", "uTexWood", "uSubTransform", "uGhost", "uMousePos", "uColour", "uForeground" })
239 )
240
241 SHADER_DEFINE( shader_background,
242 // VERTEX
243 "layout (location=0) in vec2 a_co;"
244 "uniform mat3 uPv;"
245 "uniform vec3 uOffset;"
246 ""
247 "out vec2 aTexCoords;"
248 ""
249 "void main()"
250 "{"
251 "vec2 world_pos = a_co * uOffset.z + uOffset.xy;"
252 "gl_Position = vec4( uPv * vec3( world_pos, 1.0 ), 1.0 );"
253 "aTexCoords = a_co;"
254 "}",
255
256 // FRAGMENT
257 "out vec4 FragColor;"
258 ""
259 "uniform sampler2D uTexMain;"
260 "uniform sampler2D uSamplerNoise;"
261 "uniform float uVariance;"
262 ""
263 "in vec2 aTexCoords;"
264 ""
265 "void main()"
266 "{"
267 "float ao_accum = 0.0;"
268 "for( int i=0; i<10; ++i )"
269 "{"
270 "vec2 random_noise = (texture( uSamplerNoise, aTexCoords * 20.0 + float(i) * 0.2 ).xy - vec2( 0.5, 0.5 )) * uVariance;"
271 "vec4 background = texture( uTexMain, aTexCoords + random_noise );"
272 "ao_accum += background.r * clamp((1.0 - length( random_noise )), 0.0, 1.0);"
273 "}"
274 "ao_accum *= 0.15;"
275
276 "vec4 data_this_tile = texture( uTexMain, aTexCoords );"
277
278 "ao_accum -= data_this_tile.r;"
279
280 "vec3 colour_main = vec3( 0.369768, 0.3654, 0.42 );"
281
282 "vec2 square_coords = fract( aTexCoords * 64.0 );"
283 "vec2 grid_coords = abs( square_coords - 0.5 );"
284 "float edge_contrast = (1.0-ao_accum*0.2);"
285
286 "float gridline = step( 0.49, max(grid_coords.x,grid_coords.y) );"
287 "float gridline_fadeout = min(max(edge_contrast-1.0, 0.0)*40.0 + data_this_tile.g,10.0);"
288
289 "FragColor = vec4( colour_main * edge_contrast + gridline * 0.02 * gridline_fadeout, 1.0 );"
290 "}"
291 ,
292 UNIFORMS({ "uPv", "uOffset", "uTexMain", "uVariance", "uSamplerNoise" })
293 )
294
295 void vg_register(void)
296 {
297 SHADER_INIT( shader_tile_colour );
298 SHADER_INIT( shader_tile_main );
299 SHADER_INIT( shader_ball );
300 SHADER_INIT( shader_background );
301 }
302
303 /*
304 0000 0 | 0001 1 | 0010 2 | 0011 3
305 | | | | |
306 X | X= | X | X=
307 | | |
308 0100 4 | 0101 5 | 0110 6 | 0111 7
309 | | | | |
310 =X | =X= | =X | =X=
311 | | |
312 1000 8 | 1001 9 | 1010 10 | 1011 11
313 | | | | |
314 X | X= | X | X=
315 | | | | | | |
316 1100 12 | 1101 13 | 1110 14 | 1111 15
317 | | | | |
318 =X | =X= | =X | =X=
319 | | | | | | |
320 */