X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fdemosys.c;h=06aa8c2141d609dd1681ce7fb5a2a5b372df00fa;hb=86b5ef7c43c2a3485850b8a4f58c33aaf6ca2566;hp=f16f58958357e188574059f3509dde91fd8fc3dd;hpb=8779bb586efd94381dacd5ffd8de35e62531a540;p=andemo diff --git a/src/demosys.c b/src/demosys.c index f16f589..06aa8c2 100644 --- a/src/demosys.c +++ b/src/demosys.c @@ -13,6 +13,7 @@ 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 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) @@ -26,6 +27,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); @@ -151,6 +154,18 @@ void dsys_update(void) dsys.tmsec = time_msec; + /* evaluate tracks */ + for(i=0; ivis = 1; + if(scr->update) scr->update(dsys.tmsec); + return; + } + dsys.num_act = 0; for(i=0; idraw(); + return; + } + for(i=0; idraw(); } @@ -241,16 +257,22 @@ void dsys_run_screen(struct demoscreen *scr) { int i; - if(!scr) return; - if(dsys.num_act == 1 && dsys.act[0] == scr) return; + if(!scr) { + if(dsys.scr_override) { + scr = dsys.scr_override; + if(scr->stop) scr->stop(); + } + dsys.scr_override = 0; + return; + } for(i=0; istop) dsys.act[i]->stop(); dsys.act[i]->active = 0; } + dsys.num_act = 0; - dsys.act[0] = scr; - dsys.num_act = 1; + dsys.scr_override = scr; if(scr->start) scr->start(); scr->active = 1; @@ -291,7 +313,7 @@ int dsys_add_track(const char *name) anm_init_track(dsys.track + idx); - if(rb_insert(dsys.trackmap, (char*)name, (void*)(intptr_t)idx) == -1) { + if(rb_insert(dsys.trackmap, (char*)strdup_nf(name), (void*)(intptr_t)idx) == -1) { fprintf(stderr, "failed to insert to track map: %s\n", name); abort(); } @@ -312,3 +334,8 @@ 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); +}