From 6f1680b33594925a9a6ccc82377f47dc8f62d44b Mon Sep 17 00:00:00 2001 From: Jarcode Date: Wed, 11 Sep 2019 16:20:04 -0700 Subject: [PATCH] Improve average windowing, remove smooth overrides --- glava/render.c | 20 ++++++++++++++------ shaders/glava/circle.glsl | 6 ------ shaders/glava/radial.glsl | 5 ----- shaders/glava/smooth_parameters.glsl | 2 +- shaders/glava/util/average_pass.frag | 19 ++++++++++++++----- shaders/glava/util/common.glsl | 2 ++ 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/glava/render.c b/glava/render.c index f589c43..6ce3952 100644 --- a/glava/render.c +++ b/glava/render.c @@ -657,7 +657,8 @@ static struct gl_bind_src bind_sources[] = { { .name = "time", .type = BIND_FLOAT, .src_type = SRC_SCREEN } }; -#define window(t, sz) (0.53836 - (0.46164 * cos(TWOPI * (double) t / (double)sz))) +#define window(t, sz) (0.53836 - (0.46164 * cos(TWOPI * (double) t / (double) sz))) +#define window_frame(t, sz) (0.6 - (0.4 * cos(TWOPI * (double) t / (double) sz))) #define ALLOC_ONCE(u, udata, sz) \ if (*udata == NULL) { \ u = calloc(sz, sizeof(typeof(*u))); \ @@ -762,7 +763,7 @@ void transform_average(struct gl_data* d, void** udata, void* data) { } while (0) if (use_window) - DO_AVG(window(f, d->avg_frames - 1)); + DO_AVG(window_frame(f, d->avg_frames - 1)); else DO_AVG(1); @@ -1259,7 +1260,7 @@ struct glava_renderer* rd_new(const char** paths, const char* entry, t_count += 2; } static const char* fmt = "WARNING: using \"%s\" transform explicitly " - "is deprecated; implied from \"fft\" transform.\n"; + "is deprecated (no-op); implied from \"fft\" transform.\n"; if (!strcmp(transform_functions[t].name, "gravity")) { static bool gravity_warn = false; if (!gravity_warn) { @@ -1274,6 +1275,13 @@ struct glava_renderer* rd_new(const char** paths, const char* entry, avg_warn = true; } } + if (!strcmp(transform_functions[t].name, "window")) { + static bool avg_warn = false; + if (!avg_warn) { + fprintf(stderr, fmt, transform_functions[t].name); + avg_warn = true; + } + } }) }, { .name = "uniform", .fmt = "ss", @@ -1723,7 +1731,6 @@ static void bind_1d_fbo(struct sm_fb* sm, size_t sz) { } else { /* Just bind our data if it was already allocated and setup */ glBindFramebuffer(GL_FRAMEBUFFER, sm->fbo); - glBindTexture(GL_TEXTURE_1D, sm->tex); } } @@ -2108,6 +2115,8 @@ bool rd_update(struct glava_renderer* r, float* lb, float* rb, size_t bsz, bool if (load_flags[offset]) goto bind_uniform; load_flags[offset] = true; + + bool set_opt = false; /* if bind->optimize_fft was set this frame */ /* Only apply transformations if the buffers we were given are newly copied */ if (modified) { @@ -2116,7 +2125,6 @@ bool rd_update(struct glava_renderer* r, float* lb, float* rb, size_t bsz, bool .buf = buf, .sz = sz }; - bool set_opt = false; /* if gl->optimize_fft was set this frame */ for (t = 0; t < bind->t_sz; ++t) { void (*apply)(struct gl_data*, void**, void*) = bind->transformations[t]; if (apply != NULL) { @@ -2282,7 +2290,7 @@ bool rd_update(struct glava_renderer* r, float* lb, float* rb, size_t bsz, bool drawoverlay(&gl->overlay); glViewport(0, 0, ww, wh); if (!gl->premultiply_alpha) glEnable(GL_BLEND); - + /* Return state */ glUseProgram(current->shader); if (current->indirect) diff --git a/shaders/glava/circle.glsl b/shaders/glava/circle.glsl index cc45634..30906d9 100644 --- a/shaders/glava/circle.glsl +++ b/shaders/glava/circle.glsl @@ -16,9 +16,3 @@ 1 to enable, 0 to disable. Only works with `xroot` transparency, and improves performance if disabled. */ #define C_SMOOTH 1 - -/* Gravity step, overrude frin `smooth_parameters.glsl` */ -#request setgravitystep 6.0 - -/* Smoothing factor, override from `smooth_parameters.glsl` */ -#request setsmoothfactor 0.01 diff --git a/shaders/glava/radial.glsl b/shaders/glava/radial.glsl index 6fa9aa1..ee5ea92 100644 --- a/shaders/glava/radial.glsl +++ b/shaders/glava/radial.glsl @@ -30,11 +30,6 @@ /* Offset (X) of the visualization */ #define CENTER_OFFSET_X 0 -/* Gravity step, override from `smooth_parameters.glsl` */ -#request setgravitystep 5.0 -/* Smoothing factor, override from `smooth_parameters.glsl` */ -#request setsmoothfactor 0.02 - /* (DEPRECATED) outline color */ #define BAR_OUTLINE OUTLINE /* (DEPRECATED) outline width (in pixels, set to 0 to disable outline drawing) */ diff --git a/shaders/glava/smooth_parameters.glsl b/shaders/glava/smooth_parameters.glsl index bfea307..09e829f 100644 --- a/shaders/glava/smooth_parameters.glsl +++ b/shaders/glava/smooth_parameters.glsl @@ -53,7 +53,7 @@ /* How many frames to queue and run through the average function. Increasing this value will create latency between the audio and the animation, but will make for much smoother results. */ -#request setavgframes 6 +#request setavgframes 5 /* Whether to window frames ran through the average function (new & old frames are weighted less). This massively helps smoothing out diff --git a/shaders/glava/util/average_pass.frag b/shaders/glava/util/average_pass.frag index 7bcfcec..43de1bc 100644 --- a/shaders/glava/util/average_pass.frag +++ b/shaders/glava/util/average_pass.frag @@ -19,19 +19,28 @@ in vec4 gl_FragCoord; #define SAMPLER(I) uniform sampler1D t##I; #expand SAMPLER _AVG_FRAMES +#define WIN_FUNC window_frame + void main() { float r = 0; + + /* Disable windowing for two frames (distorts results) */ + #if _AVG_FRAMES == 2 #define _AVG_WINDOW 0 + #endif + + /* Use 'shallow' windowing for 3 frames to ensure the first & last + frames have a reasonable amount of weight */ + #if _AVG_FRAMES == 3 + #define WIN_FUNC window_shallow + #endif + #if _AVG_WINDOW == 0 #define F(I) r += texelFetch(t##I, int(gl_FragCoord.x), 0).r #else #define F(I) r += window(I, _AVG_FRAMES - 1) * texelFetch(t##I, int(gl_FragCoord.x), 0).r #endif #expand F _AVG_FRAMES - /* For some reason the CPU implementation of gravity/average produces the same output but - with half the amplitude. I can't figure it out right now, so I'm just halfing the results - here to ensure they are uniform. - TODO: fix this */ - fragment.r = (r / _AVG_FRAMES) / 2; + fragment.r = r / _AVG_FRAMES; } diff --git a/shaders/glava/util/common.glsl b/shaders/glava/util/common.glsl index 1d01f77..91e0777 100644 --- a/shaders/glava/util/common.glsl +++ b/shaders/glava/util/common.glsl @@ -11,6 +11,8 @@ /* Window value t that resides in range [0, sz] */ #define window(t, sz) (0.53836 - (0.46164 * cos(TWOPI * t / sz))) +#define window_frame(t, sz) (0.6 - (0.4 * cos(TWOPI * t / sz))) +#define window_shallow(t, sz) (0.7 - (0.3 * cos(TWOPI * t / sz))) /* Do nothing (used as an option for configuration) */ #define linear(x) (x) /* Take value x that scales linearly between [0, 1) and return its sinusoidal curve */