8 void regscr_testa(void);
9 void regscr_testb(void);
11 static void proc_screen_script(struct demoscreen *scr, struct ts_node *node);
12 static long io_read(void *buf, size_t bytes, void *uptr);
15 int dsys_init(const char *fname)
18 struct ts_io io = {0};
19 struct ts_node *ts, *tsnode;
20 struct demoscreen *scr;
25 for(i=0; i<dsys_num_screens; i++) {
26 if(dsys_screens[i]->init() == -1) {
27 fprintf(stderr, "failed to initialize demo screen: %s\n", dsys_screens[i]->name);
32 if(!fname || !(io.data = ass_fopen(fname, "rb"))) {
33 dsys_run_screen(dsys_screens[0]);
38 if(!(ts = ts_load_io(&io)) || strcmp(ts->name, "demo") != 0) {
40 fprintf(stderr, "failed to read demoscript\n");
44 tsnode = ts->child_list;
46 if(strcmp(tsnode->name, "screen") == 0 &&
47 (scr = dsys_find_screen(ts_get_attr_str(tsnode, "name", 0)))) {
48 proc_screen_script(scr, tsnode);
50 tsnode = tsnode->next;
57 static void proc_screen_script(struct demoscreen *scr, struct ts_node *node)
62 attr = node->attr_list;
64 if(sscanf(attr->name, "key_%ld", &tm) == 1 && attr->val.type == TS_NUMBER) {
65 anm_set_value(&scr->track, tm, attr->val.fnum);
71 static long io_read(void *buf, size_t bytes, void *uptr)
73 return ass_fread(buf, 1, bytes, uptr);
77 void dsys_destroy(void)
81 for(i=0; i<dsys_num_screens; i++) {
82 anm_destroy_track(&dsys_screens[i]->track);
83 if(dsys_screens[i]->destroy) {
84 dsys_screens[i]->destroy();
90 void dsys_update(void)
92 int i, j, sort_needed = 0;
93 struct demoscreen *scr;
95 dsys_time = time_msec;
98 for(i=0; i<dsys_num_screens; i++) {
99 scr = dsys_screens[i];
100 scr->vis = anm_get_value(&scr->track, dsys_time);
102 if(scr->vis > 0.0f) {
104 if(scr->start) scr->start();
107 if(scr->update) scr->update(dsys_time);
109 if(dsys_num_act && scr->prio != dsys_act[dsys_num_act - 1]->prio) {
112 dsys_act[dsys_num_act++] = scr;
115 if(scr->stop) scr->stop();
122 for(i=0; i<dsys_num_act; i++) {
123 for(j=i+1; j<dsys_num_act; j++) {
124 if(dsys_act[j]->prio > dsys_act[j - 1]->prio) {
125 void *tmp = dsys_act[j];
126 dsys_act[j] = dsys_act[j - 1];
127 dsys_act[j - 1] = tmp;
134 /* TODO: do something about draw ordering of the active screens */
138 for(i=0; i<dsys_num_act; i++) {
151 void dsys_seek_abs(long tm)
155 void dsys_seek_rel(long dt)
159 void dsys_seek_norm(float t)
164 struct demoscreen *dsys_find_screen(const char *name)
170 for(i=0; i<dsys_num_screens; i++) {
171 if(strcmp(dsys_screens[i]->name, name) == 0) {
172 return dsys_screens[i];
178 void dsys_run_screen(struct demoscreen *scr)
183 if(dsys_num_act == 1 && dsys_act[0] == scr) return;
185 for(i=0; i<dsys_num_act; i++) {
186 if(dsys_act[i]->stop) dsys_act[i]->stop();
187 dsys_act[i]->active = 0;
193 if(scr->start) scr->start();
198 int dsys_add_screen(struct demoscreen *scr)
200 if(!scr->name || !scr->init || !scr->draw) {
201 fprintf(stderr, "dsys_add_screen: invalid screen\n");
204 if(anm_init_track(&scr->track) == -1) {
205 fprintf(stderr, "dsys_add_screen: failed to initialize keyframe track\n");
208 anm_set_track_interpolator(&scr->track, ANM_INTERP_LINEAR);
209 anm_set_track_extrapolator(&scr->track, ANM_EXTRAP_CLAMP);
210 anm_set_track_default(&scr->track, 0);
212 dsys_screens[dsys_num_screens++] = scr;