+
+int dsys_add_event(const char *name)
+{
+ struct demoevent ev = {0};
+ int idx;
+
+ if(rb_find(dsys.trackmap, (char*)name)) {
+ fprintf(stderr, "ignoring duplicate track: %s\n", name);
+ return -1;
+ }
+
+ 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);
+
+
+ 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_ev = idx + 1;
+ return idx;
+}
+
+int dsys_find_event(const char *name)
+{
+ struct rbnode *n = rb_find(dsys.trackmap, (char*)name);
+ if(!n) return -1;
+
+ return (intptr_t)n->data;
+}
+
+float dsys_value(const char *name)
+{
+ int idx = dsys_find_event(name);
+ return idx == -1 ? 0.0f : dsys.ev[idx].value;
+}