Skip to content

Commit 006995f

Browse files
committed
added bar spectrum glsl shader with gradient karlstav#431
1 parent af6c20e commit 006995f

File tree

6 files changed

+102
-12
lines changed

6 files changed

+102
-12
lines changed

SHADERS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ under [output] set `method` to 'sdl_glsl'
1111

1212
use the config options `vertex_shader` and `fragment_shader` to select file.
1313

14-
look in the `normalized_bars.frag` shader for how the shaders interact with cava.
14+
look in the `bar_spectrum.frag` shader for how the shaders interact with cava.
1515

1616
the custom shaders will use some of the same config parameters as the other output modes, like number of bars.
1717

cava.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,9 @@ as of 0.4.0 all options are specified in config file, see in '/home/username/.co
519519
#ifdef SDL_GLSL
520520
// output: get sdl window size
521521
case OUTPUT_SDL_GLSL:
522-
init_sdl_glsl_surface(&width, &height, p.color, p.bcolor);
522+
init_sdl_glsl_surface(&width, &height, p.color, p.bcolor, p.bar_width,
523+
p.bar_spacing, p.gradient, p.gradient_count,
524+
p.gradient_colors);
523525
break;
524526
#endif
525527
case OUTPUT_NONCURSES:

config.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#include <stdbool.h>
1717
#include <sys/stat.h>
1818

19-
#define NUMBER_OF_SHADERS 2
19+
#define NUMBER_OF_SHADERS 3
2020

2121
#ifdef _MSC_VER
2222
#include "Windows.h"
@@ -30,15 +30,17 @@
3030
INCTXT(ConfigFile, "example_files/config");
3131

3232
// add your custom shaders to be installed here
33+
INCTXT(bar_spectrum, "output/shaders/bar_spectrum.frag");
3334
INCTXT(normalized_barsfrag, "output/shaders/normalized_bars.frag");
3435
INCTXT(pass_throughvert, "output/shaders/pass_through.vert");
3536

3637
// INCTXT will create a char g<name>Data
3738
const char *default_shader_data[NUMBER_OF_SHADERS] = {gnormalized_barsfragData,
38-
gpass_throughvertData};
39+
gpass_throughvertData, gbar_spectrumData};
3940
#endif // _MSC_VER
4041
// name of the installed shader file, technically does not have to be the same as in the source
41-
const char *default_shader_name[NUMBER_OF_SHADERS] = {"normalized_bars.frag", "pass_through.vert"};
42+
const char *default_shader_name[NUMBER_OF_SHADERS] = {"normalized_bars.frag", "pass_through.vert",
43+
"bar_spectrum.frag"};
4244

4345
double smoothDef[5] = {1, 1, 1, 1, 1};
4446

@@ -634,10 +636,6 @@ bool load_config(char configPath[PATH_MAX], struct config_params *p, bool colors
634636
p->bar_width = iniparser_getint(ini, "general:bar_width", 20);
635637
p->bar_spacing = iniparser_getint(ini, "general:bar_spacing", 5);
636638
}
637-
if (strcmp(outputMethod, "sdl_glsl") == 0) {
638-
p->bar_width = iniparser_getint(ini, "general:bar_width", 1);
639-
p->bar_spacing = iniparser_getint(ini, "general:bar_spacing", 0);
640-
}
641639

642640
p->continuous_rendering = iniparser_getint(ini, "output:continuous_rendering", 0);
643641

output/sdl_glsl.c

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,9 @@ void init_sdl_glsl_window(int width, int height, int x, int y, char *const verte
140140
}
141141
}
142142

143-
void init_sdl_glsl_surface(int *w, int *h, char *const fg_color_string,
144-
char *const bg_color_string) {
143+
void init_sdl_glsl_surface(int *w, int *h, char *const fg_color_string, char *const bg_color_string,
144+
int bar_width, int bar_spacing, int gradient, int gradient_count,
145+
char **gradient_color_strings) {
145146
struct colors color = {0};
146147

147148
GLint uniform_bg_col;
@@ -161,6 +162,31 @@ void init_sdl_glsl_surface(int *w, int *h, char *const fg_color_string,
161162
SDL_GetWindowSize(glWindow, w, h);
162163
glUniform3f(uniform_res, (float)*w, (float)*h, 0.0f);
163164

165+
GLint uniform_bar_width;
166+
uniform_bar_width = glGetUniformLocation(shading_program, "bar_width");
167+
glUniform1i(uniform_bar_width, bar_width);
168+
169+
GLint uniform_bar_spacing;
170+
uniform_bar_spacing = glGetUniformLocation(shading_program, "bar_spacing");
171+
glUniform1i(uniform_bar_spacing, bar_spacing);
172+
173+
GLint uniform_gradient_count;
174+
uniform_gradient_count = glGetUniformLocation(shading_program, "gradient_count");
175+
if (gradient == 0)
176+
gradient_count = 0;
177+
glUniform1i(uniform_gradient_count, gradient_count);
178+
179+
GLint uniform_gradient_colors;
180+
uniform_gradient_colors = glGetUniformLocation(shading_program, "gradient_colors");
181+
float gradient_colors[8][3];
182+
for (int i = 0; i < gradient_count; i++) {
183+
parse_color(gradient_color_strings[i], &color);
184+
gradient_colors[i][0] = (float)color.R / 255.0;
185+
gradient_colors[i][1] = (float)color.G / 255.0;
186+
gradient_colors[i][2] = (float)color.B / 255.0;
187+
}
188+
glUniform3fv(uniform_gradient_colors, 8, (const GLfloat *)gradient_colors);
189+
164190
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
165191
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_INT, NULL);
166192
SDL_GL_SwapWindow(glWindow);

output/sdl_glsl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
void init_sdl_glsl_window(int width, int height, int x, int y, char *const vertex_shader,
44
char *const fragment_shader);
55
void init_sdl_glsl_surface(int *width, int *height, char *const fg_color_string,
6-
char *const bg_color_string);
6+
char *const bg_color_string, int bar_width, int bar_spacing,
7+
int gradient, int gradient_count, char **gradient_color_strings);
78
int draw_sdl_glsl(int bars_count, const float bars[], int frame_timer, int re_paint,
89
int continuous_rendering);
910
void cleanup_sdl_glsl(void);

output/shaders/bar_spectrum.frag

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#version 330
2+
3+
in vec2 fragCoord;
4+
out vec4 fragColor;
5+
6+
// bar values. defaults to left channels first (low to high), then right (high to low).
7+
uniform float bars[512];
8+
9+
uniform int bars_count; // number of bars (left + right) (configurable)
10+
uniform int bar_width; // bar width (configurable), not used here
11+
uniform int bar_spacing; // space bewteen bars (configurable)
12+
13+
uniform vec3 u_resolution; // window resolution
14+
15+
//colors, configurable in cava config file (r,g,b) (0.0 - 1.0)
16+
uniform vec3 bg_color; // background color
17+
uniform vec3 fg_color; // foreground color
18+
19+
uniform int gradient_count;
20+
uniform vec3 gradient_colors[8]; // gradient colors
21+
22+
vec3 normalize_C(float y,vec3 col_1, vec3 col_2, float y_min, float y_max)
23+
{
24+
float yr = (y - y_min) / (y_max - y_min);
25+
return col_1 * (1.0 - yr) + col_2 * yr;
26+
}
27+
28+
void main()
29+
{
30+
// find which bar to use based on where we are on the x axis
31+
float x = u_resolution.x * fragCoord.x;
32+
int bar = int(bars_count * fragCoord.x);
33+
float bar_size = u_resolution.x / bars_count;
34+
35+
36+
float y = bars[bar];
37+
if (y > fragCoord.y)
38+
{
39+
40+
if (x > (bar + 1) * (bar_size) - bar_spacing)
41+
{
42+
fragColor = vec4(bg_color,1.0);
43+
}
44+
else
45+
{
46+
if (gradient_count == 0)
47+
{
48+
fragColor = vec4(fg_color,1.0);
49+
}
50+
else
51+
{
52+
int color = int((gradient_count - 1) * fragCoord.y);
53+
float y_min = color / (gradient_count - 1.0);
54+
float y_max = (color + 1.0) / (gradient_count - 1.0);
55+
fragColor = vec4(normalize_C(fragCoord.y, gradient_colors[color], gradient_colors[color + 1], y_min, y_max), 1.0);
56+
}
57+
}
58+
}
59+
else
60+
{
61+
fragColor = vec4(bg_color,1.0);
62+
}
63+
}

0 commit comments

Comments
 (0)