136 lines
3.9 KiB
GLSL
136 lines
3.9 KiB
GLSL
in vec4 gl_FragCoord;
|
|
|
|
#request uniform "screen" screen
|
|
uniform ivec2 screen;
|
|
|
|
#request uniform "audio_sz" audio_sz
|
|
uniform int audio_sz;
|
|
|
|
#include "@bars.glsl"
|
|
#include ":bars.glsl"
|
|
|
|
#request uniform "audio_l" audio_l
|
|
#request transform audio_l "window"
|
|
#request transform audio_l "fft"
|
|
#request transform audio_l "gravity"
|
|
#request transform audio_l "avg"
|
|
uniform sampler1D audio_l;
|
|
|
|
#request uniform "audio_r" audio_r
|
|
#request transform audio_r "window"
|
|
#request transform audio_r "fft"
|
|
#request transform audio_r "gravity"
|
|
#request transform audio_r "avg"
|
|
uniform sampler1D audio_r;
|
|
|
|
out vec4 fragment;
|
|
#include ":util/smooth.glsl"
|
|
|
|
#define TWOPI 6.28318530718
|
|
#define PI 3.14159265359
|
|
|
|
#if DISABLE_MONO == 1
|
|
#define _CHANNELS 2
|
|
#endif
|
|
|
|
void main() {
|
|
|
|
#if MIRROR_YX == 0
|
|
#define AREA_WIDTH screen.x
|
|
#define AREA_HEIGHT screen.y
|
|
#define AREA_X gl_FragCoord.x
|
|
#define AREA_Y gl_FragCoord.y
|
|
#else
|
|
#define AREA_WIDTH screen.y
|
|
#define AREA_HEIGHT screen.x
|
|
#define AREA_X gl_FragCoord.y
|
|
#define AREA_Y gl_FragCoord.x
|
|
#endif
|
|
|
|
#if _CHANNELS == 2
|
|
float dx = (AREA_X - (AREA_WIDTH / 2));
|
|
#else
|
|
#if INVERT == 1
|
|
float dx = AREA_WIDTH - AREA_X;
|
|
#else
|
|
float dx = AREA_X;
|
|
#endif
|
|
#endif
|
|
#if FLIP == 0
|
|
float d = AREA_Y;
|
|
#else
|
|
float d = AREA_HEIGHT - AREA_Y;
|
|
#endif
|
|
float section = BAR_WIDTH + BAR_GAP; /* size of section for each bar (including gap) */
|
|
float center = section / 2.0F; /* half section, distance to center */
|
|
float m = abs(mod(dx, section)); /* position in section */
|
|
float md = m - center; /* position in section from center line */
|
|
float nbars = floor((AREA_WIDTH * 0.5F) / section) * 2;
|
|
float p, s;
|
|
if (md < ceil(float(BAR_WIDTH) / 2) && md >= -floor(float(BAR_WIDTH) / 2)) { /* if not in gap */
|
|
s = dx / section;
|
|
p = (sign(s) == 1.0 ? ceil(s) : floor(s));
|
|
#if _CHANNELS == 2
|
|
p /= float(nbars / 2);
|
|
#else
|
|
p /= float(nbars);
|
|
#endif
|
|
p += sign(p) * ((0.5F + center) / AREA_WIDTH); /* index center of bar position */
|
|
/* Apply smooth function and index texture */
|
|
#define smooth_f(tex, p) smooth_audio(tex, audio_sz, p)
|
|
float v;
|
|
/* ignore out of bounds values */
|
|
if (p > 1.0F || p < -1.0F) {
|
|
fragment = vec4(0, 0, 0, 0);
|
|
return;
|
|
}
|
|
/* handle user options and store result of indexing in 'v' */
|
|
if (p > 0.0F) {
|
|
#if DIRECTION == 1
|
|
p = 1.0F - p;
|
|
#endif
|
|
#if _CHANNELS == 1
|
|
v = smooth_f(audio_l, p);
|
|
#elif INVERT > 0
|
|
v = smooth_f(audio_l, p);
|
|
#else
|
|
v = smooth_f(audio_r, p);
|
|
#endif
|
|
} else {
|
|
p = abs(p);
|
|
#if DIRECTION == 1
|
|
p = 1.0F - p;
|
|
#endif
|
|
#if _CHANNELS == 1
|
|
v = smooth_f(audio_l, p);
|
|
#elif INVERT > 0
|
|
v = smooth_f(audio_r, p);
|
|
#else
|
|
v = smooth_f(audio_l, p);
|
|
#endif
|
|
}
|
|
#undef smooth_f
|
|
|
|
v *= AMPLIFY; /* amplify result */
|
|
if (d < v - BAR_OUTLINE_WIDTH) { /* if within range of the reported frequency, draw */
|
|
#if BAR_OUTLINE_WIDTH > 0
|
|
if (md < ceil(float(BAR_WIDTH) / 2) - BAR_OUTLINE_WIDTH && md >= -floor(float(BAR_WIDTH) / 2) + BAR_OUTLINE_WIDTH)
|
|
fragment = COLOR;
|
|
else
|
|
fragment = BAR_OUTLINE;
|
|
#else
|
|
fragment = COLOR;
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
#if BAR_OUTLINE_WIDTH > 0
|
|
if (d <= v) {
|
|
fragment = BAR_OUTLINE;
|
|
return;
|
|
}
|
|
#endif
|
|
}
|
|
fragment = vec4(0, 0, 0, 0); /* default frag color */
|
|
}
|