implement repeating sound effects
[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
9 vg_tex2d *texture_list[] = { &tex_tile_detail, &tex_tile_data, &tex_wood, &tex_ball };
10
11 // AUDIO
12 // ===========================================================================================================
13
14 sfx_vol_control audio_volume_sfx = { .val = 1.0f, .name = "Sound effects" };
15 sfx_vol_control audio_volume_music = { .val = 1.0f, .name = "Music" };
16
17 sfx_system audio_system_sfx =
18 {
19 .vol = 1.f,
20 .ch = 1,
21 .vol_src = &audio_volume_sfx,
22 .fadeout_length = FADEOUT_LENGTH,
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 // One two or three layers of rolling noise
52 sfx_system audio_system_balls_rolling =
53 {
54 .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx,
55 .name = "Balls Rolling", .flags = SFX_FLAG_REPEAT
56 };
57
58 // Various oneshots
59 sfx_system audio_system_balls_switching =
60 {
61 .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx,
62 .name = "Balls Switching", .fadeout_length = FADEOUT_LENGTH
63 };
64
65 // Gameplay critical sounds eg. splitter sound rocking
66 sfx_system audio_system_balls_important =
67 {
68 .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx,
69 .name = "Balls Gameplay", .fadeout_length = FADEOUT_LENGTH
70 };
71
72 // Suplemental sounds
73 sfx_system audio_system_balls_extra =
74 {
75 .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx,
76 .name = "Balls Extra", .fadeout_length = FADEOUT_LENGTH
77 };
78
79 static void resource_load_main(void)
80 {
81 // Textures
82 vg_tex2d_init( texture_list, vg_list_size( texture_list ) );
83
84 // Audio
85 sfx_set_init( &audio_tile_mod, NULL );
86 sfx_set_init( &audio_splitter, NULL );
87 sfx_set_init( &audio_rolls, NULL );
88 }
89
90 static void resource_free_main(void)
91 {
92 vg_tex2d_free( texture_list, vg_list_size( texture_list ) );
93 sfx_set_free( &audio_tile_mod );
94 sfx_set_free( &audio_splitter );
95 sfx_set_free( &audio_rolls );
96 }
97
98 // SHADERS
99 // ===========================================================================================================
100
101 SHADER_DEFINE( shader_tile_colour,
102
103 // VERTEX
104 "layout (location=0) in vec2 a_co;"
105 "uniform mat3 uPv;"
106 "uniform vec3 uOffset;"
107 ""
108 "void main()"
109 "{"
110 "gl_Position = vec4( uPv * vec3( a_co * uOffset.z + uOffset.xy, 1.0 ), 1.0 );"
111 "}",
112
113 // FRAGMENT
114 "out vec4 FragColor;"
115 "uniform vec4 uColour;"
116 ""
117 "void main()"
118 "{"
119 "FragColor = uColour;"
120 "}"
121 ,
122 UNIFORMS({ "uPv", "uOffset", "uColour" })
123 )
124
125 SHADER_DEFINE( shader_ball,
126 // VERTEX
127 "layout (location=0) in vec2 a_co;"
128 "uniform vec2 uOffset;"
129 "uniform mat3 uPv;"
130 ""
131 "out vec2 aTexCoords;"
132 ""
133 "void main()"
134 "{"
135 // Create texture coords
136 "aTexCoords = a_co;"
137
138 // Vertex transform
139 "vec3 worldpos = vec3( a_co * 0.5 - 0.25 + uOffset, 1.0 );"
140 "gl_Position = vec4( uPv * worldpos, 1.0 );"
141 "}",
142
143 // FRAGMENT
144 "out vec4 FragColor;"
145 ""
146 "uniform sampler2D uTexMain;"
147 "uniform vec3 uColour;"
148 ""
149 "in vec2 aTexCoords;"
150 ""
151 "void main()"
152 "{"
153 "vec4 glyph = texture( uTexMain, aTexCoords );"
154 "FragColor = vec4( uColour + glyph.rgb * 0.2, glyph.a );"
155 "}"
156 ,
157 UNIFORMS({ "uTexMain", "uColour", "uOffset", "uPv" })
158 )
159
160 SHADER_DEFINE( shader_tile_main,
161 // VERTEX
162 "layout (location=0) in vec2 a_co;"
163 "uniform vec4 uOffset;" // Tile x/y, uv x/y
164 "uniform mat3 uPv;"
165 "uniform mat2 uSubTransform;"
166 ""
167 "out vec4 aTexCoords;"
168 "out vec2 aWorldCoords;"
169 ""
170 "vec2 hash22(vec2 p)"
171 "{"
172 "vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));"
173 "p3 += dot(p3, p3.yzx+33.33);"
174 "return fract((p3.xx+p3.yz)*p3.zy);"
175 "}"
176 ""
177 "void main()"
178 "{"
179 // Vertex transform
180 "vec2 subtransform = uSubTransform * (a_co-0.5) + 0.5;"
181 "vec3 worldpos = vec3( subtransform + uOffset.xy, 1.0 );"
182 "gl_Position = vec4( uPv * worldpos, 1.0 );"
183
184 // Create texture coords
185 "vec2 random_offset = floor(hash22(uOffset.xy) * 4.0) * 0.25;"
186 "vec2 edge_safe_coords = a_co * 0.98 + 0.01;"
187 "aTexCoords = vec4((edge_safe_coords + uOffset.zw) * 0.25, edge_safe_coords * 0.25 + random_offset );"
188 "aWorldCoords = worldpos.xy;"
189 "}",
190
191 // FRAGMENT
192 "out vec4 FragColor;"
193 ""
194 "uniform sampler2D uTexGlyphs;"
195 "uniform sampler2D uTexWood;"
196 "uniform float uGhost;"
197 "uniform vec2 uMousePos;"
198 "uniform vec4 uColour;"
199 ""
200 "in vec4 aTexCoords;"
201 "in vec2 aWorldCoords;"
202 ""
203 "void main()"
204 "{"
205 "vec3 shadowing_colour = vec3( 0.93, 0.88536, 0.8184 );"
206 "vec4 glyph = texture( uTexGlyphs, aTexCoords.xy );"
207 "vec4 wood = texture( uTexWood, aTexCoords.zw );"
208 "vec4 wood_secondary = texture( uTexWood, aTexCoords.zw + 0.25 );"
209 "vec3 wood_comp = mix( wood_secondary.rgb * shadowing_colour, wood.rgb, clamp( glyph.b * 2.0 - 1.0, 0.0, 1.0 ) );"
210
211 "vec3 shadows = mix( vec3( 0.85, 0.7344, 0.561 ), vec3(1.0,1.0,1.0), glyph.r );"
212
213 "vec4 output_regular = vec4( wood_comp * shadows, glyph.b );"
214
215 "float ghost_dist = clamp( 1.5 - distance(uMousePos, aWorldCoords), 0.0, 1.0 );"
216 "vec4 output_ghost = vec4( 1.0, 1.0, 1.0, glyph.g * ghost_dist );"
217
218 "FragColor = mix( output_regular, output_ghost, uGhost ) * uColour;"
219 "}"
220 ,
221 UNIFORMS({ "uPv", "uOffset", "uTexGlyphs", "uTexWood", "uSubTransform", "uGhost", "uMousePos", "uColour" })
222 )
223
224 void vg_register(void)
225 {
226 SHADER_INIT( shader_tile_colour );
227 SHADER_INIT( shader_tile_main );
228 SHADER_INIT( shader_ball );
229 }