#ifndef _SMOOTH_GLSL #define _SMOOTH_GLSL #include ":util/common.glsl" #include "@smooth_parameters.glsl" #include ":smooth_parameters.glsl" #define average 0 #define maximum 1 #define hybrid 2 float scale_audio(float idx) { return -log((-(SAMPLE_RANGE) * idx) + 1) / (SAMPLE_SCALE); } float iscale_audio(float idx) { return -log((SAMPLE_RANGE) * idx) / (SAMPLE_SCALE); } /* Note: the _SMOOTH_FACTOR macro is defined by GLava itself, from `#request setsmoothfactor`*/ float smooth_audio(in sampler1D tex, int tex_sz, highp float idx) { #if _PRE_SMOOTHED_AUDIO < 1 float smin = scale_audio(clamp(idx - _SMOOTH_FACTOR, 0, 1)) * tex_sz, smax = scale_audio(clamp(idx + _SMOOTH_FACTOR, 0, 1)) * tex_sz; float m = ((smax - smin) / 2.0F), s, w; float rm = smin + m; /* middle */ #if SAMPLE_MODE == average float avg = 0, weight = 0; for (s = smin; s <= smax; s += 1.0F) { w = ROUND_FORMULA(clamp((m - abs(rm - s)) / m, 0, 1)); weight += w; avg += texelFetch(tex, int(round(s)), 0).r * w; } avg /= weight; return avg; #elif SAMPLE_MODE == hybrid float vmax = 0, avg = 0, weight = 0, v; for (s = smin; s < smax; s += 1.0F) { w = ROUND_FORMULA(clamp((m - abs(rm - s)) / m, 0, 1)); weight += w; v = texelFetch(tex, int(round(s)), 0).r * w; avg += v; if (vmax < v) vmax = v; } return (vmax * (1 - SAMPLE_HYBRID_WEIGHT)) + ((avg / weight) * SAMPLE_HYBRID_WEIGHT); #elif SAMPLE_MODE == maximum float vmax = 0, v; for (s = smin; s < smax; s += 1.0F) { w = texelFetch(tex, int(round(s)), 0).r * ROUND_FORMULA(clamp((m - abs(rm - s)) / m, 0, 1)); if (vmax < w) vmax = w; } return vmax; #endif #else return texelFetch(tex, int(round(idx * tex_sz)), 0).r; #endif } /* Applies the audio smooth sampling function three times to the adjacent values */ float smooth_audio_adj(in sampler1D tex, int tex_sz, highp float idx, highp float pixel) { float al = smooth_audio(tex, tex_sz, max(idx - pixel, 0.0F)), am = smooth_audio(tex, tex_sz, idx), ar = smooth_audio(tex, tex_sz, min(idx + pixel, 1.0F)); return (al + am + ar) / 3.0F; } #ifdef TWOPI #undef TWOPI #endif #ifdef PI #undef PI #endif #endif /* _SMOOTH_GLSL */