From: John Tsiombikas Date: Thu, 30 Dec 2021 18:25:14 +0000 (+0200) Subject: screen-relative events X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=commitdiff_plain;h=628ef3345462458f2fb6be034583e61238b89f89;p=andemo screen-relative events --- diff --git a/sdr/foo-notex.p.glsl b/sdr/foo-notex.p.glsl index 8bd9162..1a7edbe 100644 --- a/sdr/foo-notex.p.glsl +++ b/sdr/foo-notex.p.glsl @@ -1,4 +1,6 @@ +varying vec4 color; + void main() { - gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); + gl_FragColor = color; } diff --git a/src/demosys.c b/src/demosys.c index 06aa8c2..67455b2 100644 --- a/src/demosys.c +++ b/src/demosys.c @@ -11,9 +11,8 @@ void regscr_testa(void); void regscr_testb(void); static void proc_screen_script(struct demoscreen *scr, struct ts_node *node); -static void proc_track(struct ts_node *node, const char *pname); +static void proc_track(struct ts_node *node, struct demoscreen *pscr); static long io_read(void *buf, size_t bytes, void *uptr); -static void del_rbnode(struct rbnode *node, void *cls); int dsys_init(const char *fname) @@ -27,10 +26,8 @@ int dsys_init(const char *fname) if(!(dsys.trackmap = rb_create(RB_KEY_STRING))) { return -1; } - rb_set_delete_func(dsys.trackmap, del_rbnode, 0); - dsys.track = darr_alloc(0, sizeof *dsys.track); - dsys.value = darr_alloc(0, sizeof *dsys.value); + dsys.ev = darr_alloc(0, sizeof *dsys.ev); regscr_testa(); regscr_testb(); @@ -87,38 +84,39 @@ static void proc_screen_script(struct demoscreen *scr, struct ts_node *node) sub = node->child_list; while(sub) { if(strcmp(sub->name, "track") == 0) { - proc_track(sub, scr->name); + proc_track(sub, scr); } sub = sub->next; } } -static void proc_track(struct ts_node *node, const char *pname) +static void proc_track(struct ts_node *node, struct demoscreen *pscr) { char *name, *buf; struct ts_attr *attr; long tm; - int tidx; - struct anm_track *trk; + int idx; + struct demoevent *ev; if(!(name = (char*)ts_get_attr_str(node, "name", 0))) { return; } - if(pname) { - buf = alloca(strlen(name) + strlen(pname) + 2); - sprintf(buf, "%s.%s", pname, name); + if(pscr) { + buf = alloca(strlen(name) + strlen(pscr->name) + 2); + sprintf(buf, "%s.%s", pscr->name, name); name = buf; } - if((tidx = dsys_add_track(name)) == -1) { + if((idx = dsys_add_event(name)) == -1) { return; } - trk = dsys.track + tidx; + ev = dsys.ev + idx; + ev->scr = pscr; attr = node->attr_list; while(attr) { if(sscanf(attr->name, "key_%ld", &tm) == 1 && attr->val.type == TS_NUMBER) { - anm_set_value(trk, tm, attr->val.fnum); + anm_set_value(&ev->track, tm, attr->val.fnum); } attr = attr->next; } @@ -142,21 +140,25 @@ void dsys_destroy(void) } dsys.num_screens = 0; - darr_free(dsys.track); - darr_free(dsys.value); + darr_free(dsys.ev); rb_free(dsys.trackmap); } void dsys_update(void) { int i, j, sort_needed = 0; + long tm; struct demoscreen *scr; dsys.tmsec = time_msec; /* evaluate tracks */ - for(i=0; istart_time >= 0) { + tm -= dsys.ev[i].scr->start_time; + } + dsys.ev[i].value = anm_get_value(&dsys.ev[i].track, tm); } if(dsys.scr_override) { @@ -172,9 +174,9 @@ void dsys_update(void) scr->vis = anm_get_value(&scr->track, dsys.tmsec); if(scr->vis > 0.0f) { - if(!scr->active) { + if(scr->start_time < 0) { if(scr->start) scr->start(); - scr->active = 1; + scr->start_time = dsys.tmsec; } if(scr->update) scr->update(dsys.tmsec); @@ -183,9 +185,9 @@ void dsys_update(void) } dsys.act[dsys.num_act++] = scr; } else { - if(scr->active) { + if(scr->start_time >= 0) { if(scr->stop) scr->stop(); - scr->active = 0; + scr->start_time = -1; } } } @@ -268,14 +270,14 @@ void dsys_run_screen(struct demoscreen *scr) for(i=0; istop) dsys.act[i]->stop(); - dsys.act[i]->active = 0; + dsys.act[i]->start_time = -1; } dsys.num_act = 0; dsys.scr_override = scr; if(scr->start) scr->start(); - scr->active = 1; + scr->start_time = dsys.tmsec; } @@ -297,9 +299,9 @@ int dsys_add_screen(struct demoscreen *scr) return 0; } -int dsys_add_track(const char *name) +int dsys_add_event(const char *name) { - struct anm_track trk; + struct demoevent ev = {0}; int idx; if(rb_find(dsys.trackmap, (char*)name)) { @@ -307,21 +309,25 @@ int dsys_add_track(const char *name) return -1; } - idx = darr_size(dsys.track); - darr_push(dsys.track, &trk); - darr_pushf(dsys.value, 0); + ev.name = strdup_nf(name); + anm_init_track(&ev.track); + anm_set_track_interpolator(&ev.track, ANM_INTERP_LINEAR); + anm_set_track_extrapolator(&ev.track, ANM_EXTRAP_CLAMP); + anm_set_track_default(&ev.track, 0); + + idx = darr_size(dsys.ev); + darr_push(dsys.ev, &ev); - anm_init_track(dsys.track + idx); - if(rb_insert(dsys.trackmap, (char*)strdup_nf(name), (void*)(intptr_t)idx) == -1) { + if(rb_insert(dsys.trackmap, ev.name, (void*)(intptr_t)idx) == -1) { fprintf(stderr, "failed to insert to track map: %s\n", name); abort(); } - dsys.num_tracks = idx + 1; + dsys.num_ev = idx + 1; return idx; } -int dsys_find_track(const char *name) +int dsys_find_event(const char *name) { struct rbnode *n = rb_find(dsys.trackmap, (char*)name); if(!n) return -1; @@ -331,11 +337,6 @@ int dsys_find_track(const char *name) float dsys_value(const char *name) { - int idx = dsys_find_track(name); - return idx == -1 ? 0.0f : dsys.value[idx]; -} - -static void del_rbnode(struct rbnode *node, void *cls) -{ - free(node->key); + int idx = dsys_find_event(name); + return idx == -1 ? 0.0f : dsys.ev[idx].value; } diff --git a/src/demosys.h b/src/demosys.h index e2bdb8a..11ec714 100644 --- a/src/demosys.h +++ b/src/demosys.h @@ -21,10 +21,18 @@ struct demoscreen { void (*motion)(int x, int y); struct anm_track track; - int active, prio; + long start_time; + int prio; float vis; }; +struct demoevent { + char *name; + struct anm_track track; + float value; + struct demoscreen *scr; +}; + #define MAX_DSYS_SCREENS 64 struct demosystem { int running; /* run/stop state */ @@ -39,9 +47,8 @@ struct demosystem { struct demoscreen *scr_override; void *trackmap; - struct anm_track *track; - float *value; /* values for each track, stored on update */ - int num_tracks; + struct demoevent *ev; + int num_ev; }; struct demosystem dsys; @@ -66,8 +73,8 @@ void dsys_run_screen(struct demoscreen *scr); int dsys_add_screen(struct demoscreen *scr); /* demo event tracks */ -int dsys_add_track(const char *name); -int dsys_find_track(const char *name); +int dsys_add_event(const char *name); +int dsys_find_event(const char *name); float dsys_value(const char *name); #endif /* DEMOSYS_H_ */ diff --git a/src/scr/testb.c b/src/scr/testb.c index a9be6a4..eb49430 100644 --- a/src/scr/testb.c +++ b/src/scr/testb.c @@ -35,6 +35,7 @@ static void draw(void) int i, j; float x, y, xr, yr, sz; float t = dsys.tmsec / 700.0f; + float foo = dsys_value("testb.hueflash"); glUseProgram(sdr_foo); gl_begin(GL_QUADS); @@ -48,6 +49,7 @@ static void draw(void) xr = sz / NX; yr = sz / NY; + gl_color3f(1, cgm_lerp(1, 0.7, foo), cgm_lerp(1, 0.3, foo)); gl_vertex2f(x - xr, y - yr); gl_vertex2f(x + xr, y - yr); gl_vertex2f(x + xr, y + yr);