fixed crashing issue & avg transform, added gravity transform
This commit is contained in:
63
render.c
63
render.c
@@ -353,6 +353,7 @@ struct gl_data {
|
||||
int fcounter;
|
||||
bool print_fps, avg_window;
|
||||
void** t_data;
|
||||
float gravity_step;
|
||||
};
|
||||
|
||||
#ifdef GLAD_DEBUG
|
||||
@@ -385,6 +386,31 @@ static struct gl_bind_src bind_sources[] = {
|
||||
};
|
||||
|
||||
#define window(t, sz) (0.53836 - (0.46164 * cos(TWOPI * (double) t / (double)(sz - 1))))
|
||||
#define ALLOC_ONCE(u, udata, ...) \
|
||||
if (*udata == NULL) { \
|
||||
printf("alloc"); \
|
||||
u = malloc(sizeof(*u)); \
|
||||
*u = (typeof(*u)) __VA_ARGS__; \
|
||||
*udata = u; \
|
||||
} else u = (typeof(u)) *udata;
|
||||
|
||||
void transform_gravity(struct gl_data* d, void** udata, void* data) {
|
||||
struct gl_sampler_data* s = (struct gl_sampler_data*) data;
|
||||
float* b = s->buf;
|
||||
size_t sz = s->sz, t;
|
||||
|
||||
struct {
|
||||
float* applied;
|
||||
}* u;
|
||||
ALLOC_ONCE(u, udata, { .applied = calloc(sz, sizeof(float)) });
|
||||
|
||||
for (t = 0; t < sz; ++t) {
|
||||
if (b[t] >= u->applied[t]) {
|
||||
u->applied[t] = b[t] - d->gravity_step;
|
||||
} else u->applied[t] -= d->gravity_step;
|
||||
b[t] = u->applied[t];
|
||||
}
|
||||
}
|
||||
|
||||
void transform_average(struct gl_data* d, void** udata, void* data) {
|
||||
|
||||
@@ -398,12 +424,7 @@ void transform_average(struct gl_data* d, void** udata, void* data) {
|
||||
struct {
|
||||
float* bufs;
|
||||
}* u;
|
||||
if (*udata == NULL) {
|
||||
u = malloc(sizeof(*u));
|
||||
*u = (typeof(*u)) {
|
||||
.bufs = calloc(tsz, sizeof(float))
|
||||
};
|
||||
} else u = (typeof(u)) *udata;
|
||||
ALLOC_ONCE(u, udata, { .bufs = calloc(tsz, sizeof(float)) });
|
||||
|
||||
memmove(u->bufs, &u->bufs[sz], (tsz - sz) * sizeof(float));
|
||||
memcpy(&u->bufs[tsz - sz], b, sz * sizeof(float));
|
||||
@@ -508,10 +529,11 @@ void transform_fft(struct gl_data* d, void** _, void* in) {
|
||||
}
|
||||
|
||||
static struct gl_transform transform_functions[] = {
|
||||
{ .name = "window", .type = BIND_SAMPLER1D, .apply = transform_window },
|
||||
{ .name = "fft", .type = BIND_SAMPLER1D, .apply = transform_fft },
|
||||
{ .name = "wrange", .type = BIND_SAMPLER1D, .apply = transform_wrange },
|
||||
{ .name = "avg", .type = BIND_SAMPLER1D, .apply = transform_average }
|
||||
{ .name = "window", .type = BIND_SAMPLER1D, .apply = transform_window },
|
||||
{ .name = "fft", .type = BIND_SAMPLER1D, .apply = transform_fft },
|
||||
{ .name = "wrange", .type = BIND_SAMPLER1D, .apply = transform_wrange },
|
||||
{ .name = "avg", .type = BIND_SAMPLER1D, .apply = transform_average },
|
||||
{ .name = "gravity", .type = BIND_SAMPLER1D, .apply = transform_gravity }
|
||||
};
|
||||
|
||||
static struct gl_bind_src* lookup_bind_src(const char* str) {
|
||||
@@ -537,14 +559,15 @@ struct renderer* rd_new(int x, int y, int w, int h, const char* data) {
|
||||
|
||||
struct gl_data* gl = r->gl;
|
||||
*gl = (struct gl_data) {
|
||||
.stages = NULL,
|
||||
.rate = 0,
|
||||
.tcounter = 0.0D,
|
||||
.fcounter = 0,
|
||||
.print_fps = true,
|
||||
.bufscale = 1,
|
||||
.avg_frames = 4,
|
||||
.avg_window = true
|
||||
.stages = NULL,
|
||||
.rate = 0,
|
||||
.tcounter = 0.0D,
|
||||
.fcounter = 0,
|
||||
.print_fps = true,
|
||||
.bufscale = 1,
|
||||
.avg_frames = 4,
|
||||
.avg_window = true,
|
||||
.gravity_step = 0.1
|
||||
};
|
||||
|
||||
#ifdef GLAD_DEBUG
|
||||
@@ -654,6 +677,8 @@ struct renderer* rd_new(int x, int y, int w, int h, const char* data) {
|
||||
.handler = RHANDLER(name, args, { gl->avg_frames = *(int*) args[0]; }) },
|
||||
{ .name = "setavgwindow", .fmt = "b",
|
||||
.handler = RHANDLER(name, args, { gl->avg_window = *(bool*) args[0]; }) },
|
||||
{ .name = "setgravitystep", .fmt = "f",
|
||||
.handler = RHANDLER(name, args, { gl->gravity_step = *(float*) args[0]; }) },
|
||||
{
|
||||
.name = "transform", .fmt = "ss",
|
||||
.handler = RHANDLER(name, args, {
|
||||
@@ -983,7 +1008,7 @@ void rd_update(struct renderer* r, float* lb, float* rb, size_t bsz, bool modifi
|
||||
};
|
||||
|
||||
for (t = 0; t < bind->t_sz; ++t) {
|
||||
bind->transformations[t](gl, &gl->t_data[t], &d);
|
||||
bind->transformations[t](gl, &gl->t_data[c], &d);
|
||||
++c; /* index for transformation data (note: change if new transform types are added) */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,73 +10,92 @@ uniform int audio_sz;
|
||||
#request setavgframes 4
|
||||
#request setavgwindow true
|
||||
// #request interpolate true
|
||||
#request setgravitystep 0.06
|
||||
|
||||
#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 "settings.glsl"
|
||||
// #include "settings.glsl"
|
||||
|
||||
#define CUT 0.5
|
||||
#define SAMPLE_RANGE 0.2
|
||||
#define SAMPLE_AMT 22
|
||||
|
||||
#define WSCALE 11
|
||||
#define VSCALE 6000
|
||||
#define VSCALE 300
|
||||
|
||||
#define DIRECTION 1
|
||||
#define DIRECTION -1
|
||||
|
||||
#define RCOL_OFF (gl_FragCoord.x / 3000)
|
||||
#define LCOL_OFF ((screen.x - gl_FragCoord.x) / 3000)
|
||||
#define COLOR vec4(vec3(0.3 + RCOL_OFF, 0.3, 0.3 + LCOL_OFF) + (gl_FragCoord.y / 170), 1)
|
||||
#define LSTEP (gl_FragCoord.y / 170)
|
||||
#define COLOR vec4((0.3 + RCOL_OFF) + LSTEP, 0.6 - LSTEP, (0.3 + LCOL_OFF) + LSTEP, 1)
|
||||
|
||||
/* distance from center */
|
||||
#define CDIST (abs((screen.x / 2) - gl_FragCoord.x) / screen.x)
|
||||
/* distance from sides (far) */
|
||||
#define FDIST (min(gl_FragCoord.x, screen.x - gl_FragCoord.x) / screen.x)
|
||||
|
||||
#if DIRECTION < 0
|
||||
#define LEFT_IDX (gl_FragCoord.x)
|
||||
#define RIGHT_IDX (-gl_FragCoord.x + screen.x)
|
||||
/* distance from base frequencies */
|
||||
#define BDIST CDIST
|
||||
/* distance from high frequencies */
|
||||
#define HDIST FDIST
|
||||
#else
|
||||
#define LEFT_IDX (half_w - gl_FragCoord.x)
|
||||
#define RIGHT_IDX (gl_FragCoord.x - half_w)
|
||||
#define BDIST FDIST
|
||||
#define HDIST CDIST
|
||||
#endif
|
||||
|
||||
void main() {
|
||||
float half_w = (screen.x / 2);
|
||||
if (gl_FragCoord.x < half_w) {
|
||||
float s = 0, r;
|
||||
int t;
|
||||
for (t = -SAMPLE_AMT; t <= SAMPLE_AMT; ++t) {
|
||||
s += (texture(audio_l, log((LEFT_IDX + (t * SAMPLE_RANGE)) / (half_w)) / WSCALE).r);
|
||||
}
|
||||
s /= float(SAMPLE_AMT * 2) + 1;
|
||||
s *= VSCALE;
|
||||
|
||||
if (gl_FragCoord.y + 1.5 <= s) {
|
||||
fragment = COLOR;
|
||||
} else {
|
||||
fragment = vec4(0, 0, 0, 0);
|
||||
}
|
||||
float half_w;
|
||||
|
||||
void render_side(sampler1D tex, float idx) {
|
||||
float s = 0;
|
||||
int t;
|
||||
/* perform samples */
|
||||
for (t = -SAMPLE_AMT; t <= SAMPLE_AMT; ++t) {
|
||||
s += (texture(tex, log((idx + (t * SAMPLE_RANGE)) / half_w) / WSCALE).r);
|
||||
}
|
||||
/* compute average on samples */
|
||||
s /= float(SAMPLE_AMT * 2) + 1;
|
||||
/* scale the data upwards so we can see it */
|
||||
s *= VSCALE;
|
||||
/* clamp far ends of the screen down to make the ends of the graph smoother */
|
||||
s *= clamp((abs((screen.x / 2) - gl_FragCoord.x) / screen.x) * 48, 0.0F, 1.0F);
|
||||
s *= clamp((min(gl_FragCoord.x, screen.x - gl_FragCoord.x) / screen.x) * 48, 0.0F, 1.0F);
|
||||
|
||||
/* amplify higher frequencies */
|
||||
s *= 1 + BDIST;
|
||||
|
||||
/* and finally set fragment color if we are in range */
|
||||
if (gl_FragCoord.y + 1.5 <= s) {
|
||||
fragment = COLOR;
|
||||
} else {
|
||||
float s = 0, r;
|
||||
int t;
|
||||
for (t = -SAMPLE_AMT; t <= SAMPLE_AMT; ++t) {
|
||||
s += (texture(audio_r, log((RIGHT_IDX + (t * SAMPLE_RANGE)) / (half_w)) / WSCALE).r);
|
||||
}
|
||||
s /= float(SAMPLE_AMT * 2) + 1;
|
||||
s *= VSCALE;
|
||||
|
||||
if (gl_FragCoord.y + 1.5 <= s) {
|
||||
fragment = COLOR;
|
||||
} else {
|
||||
fragment = vec4(0, 0, 0, 0);
|
||||
}
|
||||
fragment = vec4(0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void main() {
|
||||
half_w = (screen.x / 2);
|
||||
if (gl_FragCoord.x < half_w) {
|
||||
render_side(audio_l, LEFT_IDX);
|
||||
} else {
|
||||
render_side(audio_r, RIGHT_IDX);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user