dsys2

annotate src/dsys.c @ 2:1705e550bd91

foo
author John Tsiombikas <nuclear@siggraph.org>
date Wed, 31 Aug 2011 05:08:54 +0300
parents
children eec499998960
rev   line source
nuclear@2 1 #include <stdio.h>
nuclear@2 2 #include <math.h>
nuclear@2 3 #include <stdlib.h>
nuclear@2 4 #include <string.h>
nuclear@2 5 #include <errno.h>
nuclear@2 6 #include "dsys2.h"
nuclear@2 7 #include "dsys_impl.h"
nuclear@2 8
nuclear@2 9 static float eval_step(struct dsys_event *ev, demotime_t t);
nuclear@2 10 static float eval_lerp(struct dsys_event *ev, demotime_t t);
nuclear@2 11 static float eval_sigmoid(struct dsys_event *ev, demotime_t t);
nuclear@2 12
nuclear@2 13 static void free_event(struct dsys_event *ev);
nuclear@2 14
nuclear@2 15
nuclear@2 16
nuclear@2 17 struct dsys_demo *dsys_open(const char *fname)
nuclear@2 18 {
nuclear@2 19 FILE *fp;
nuclear@2 20 struct dsys_demo *res;
nuclear@2 21
nuclear@2 22 if(!(fp = fopen(fname, "r"))) {
nuclear@2 23 fprintf(stderr, "failed to open demoscript: %s: %s\n", fname, strerror(errno));
nuclear@2 24 return 0;
nuclear@2 25 }
nuclear@2 26
nuclear@2 27 res = dsys_open_stream(fp);
nuclear@2 28 fclose(fp);
nuclear@2 29 return res;
nuclear@2 30 }
nuclear@2 31
nuclear@2 32 struct dsys_demo *dsys_open_stream(FILE *fp)
nuclear@2 33 {
nuclear@2 34 struct dsys_demo *demo;
nuclear@2 35
nuclear@2 36 if(!(demo = malloc(sizeof *demo))) {
nuclear@2 37 perror("failed to allocate memory");
nuclear@2 38 return 0;
nuclear@2 39 }
nuclear@2 40 memset(demo, 0, sizeof *demo);
nuclear@2 41
nuclear@2 42 demo->src_tm = demo->start_tm = -1;
nuclear@2 43
nuclear@2 44 /* TODO */
nuclear@2 45 return demo;
nuclear@2 46 }
nuclear@2 47
nuclear@2 48 void dsys_close(struct dsys_demo *demo)
nuclear@2 49 {
nuclear@2 50 while(demo->ev) {
nuclear@2 51 struct dsys_event *ev = demo->ev;
nuclear@2 52 demo->ev = demo->ev->next;
nuclear@2 53 free_event(ev);
nuclear@2 54 }
nuclear@2 55
nuclear@2 56 free(demo);
nuclear@2 57 }
nuclear@2 58
nuclear@2 59
nuclear@2 60 void dsys_update(struct dsys_demo *demo, demotime_t tm)
nuclear@2 61 {
nuclear@2 62 demo->src_tm = tm;
nuclear@2 63
nuclear@2 64 if(demo->start_tm == -1) {
nuclear@2 65 dsys_start(demo);
nuclear@2 66 }
nuclear@2 67
nuclear@2 68 if(demo->running) {
nuclear@2 69 demo->tm = tm - demo->start_tm - demo->stoppage_tm;
nuclear@2 70 }
nuclear@2 71
nuclear@2 72 /* TODO check the events list etc etc */
nuclear@2 73 }
nuclear@2 74
nuclear@2 75 void dsys_start(struct dsys_demo *demo)
nuclear@2 76 {
nuclear@2 77 if(demo->running) {
nuclear@2 78 return;
nuclear@2 79 }
nuclear@2 80
nuclear@2 81 if(demo->start_tm == -1) {
nuclear@2 82 demo->start_tm = demo->src_tm;
nuclear@2 83 } else {
nuclear@2 84 demo->stoppage_tm += demo->src_tm - demo->stop_tm;
nuclear@2 85 }
nuclear@2 86
nuclear@2 87 demo->running = 1;
nuclear@2 88 }
nuclear@2 89
nuclear@2 90 void dsys_stop(struct dsys_demo *demo)
nuclear@2 91 {
nuclear@2 92 if(!demo->running) {
nuclear@2 93 return;
nuclear@2 94 }
nuclear@2 95
nuclear@2 96 demo->stop_tm = demo->src_tm;
nuclear@2 97 demo->running = 0;
nuclear@2 98 }
nuclear@2 99
nuclear@2 100 int dsys_is_running(struct dsys_demo *demo)
nuclear@2 101 {
nuclear@2 102 return demo->running;
nuclear@2 103 }
nuclear@2 104
nuclear@2 105
nuclear@2 106 demotime_t dsys_duration(struct dsys_demo *demo)
nuclear@2 107 {
nuclear@2 108 return demo->duration;
nuclear@2 109 }
nuclear@2 110
nuclear@2 111 demotime_t dsys_time(struct dsys_demo *demo)
nuclear@2 112 {
nuclear@2 113 return demo->tm;
nuclear@2 114 }
nuclear@2 115
nuclear@2 116 float dsys_progress(struct dsys_demo *demo)
nuclear@2 117 {
nuclear@2 118 return demo->tm / demo->duration;
nuclear@2 119 }
nuclear@2 120
nuclear@2 121 /* seek without continuity */
nuclear@2 122 void dsys_seek(struct dsys_demo *demo, demotime_t tm)
nuclear@2 123 {
nuclear@2 124 /* TODO */
nuclear@2 125 }
nuclear@2 126
nuclear@2 127 void dsys_seek_norm(struct dsys_demo *demo, float t)
nuclear@2 128 {
nuclear@2 129 dsys_seek(demo, t * demo->duration);
nuclear@2 130 }
nuclear@2 131
nuclear@2 132 /* seek by accelerating time */
nuclear@2 133 void dsys_warp(struct dsys_demo *demo, demotime_t tm);
nuclear@2 134 void dsys_warp_norm(struct dsys_demo *demo, float t);
nuclear@2 135
nuclear@2 136
nuclear@2 137 /* events */
nuclear@2 138 struct dsys_event *dsys_event(struct dsys_demo *demo, const char *name);
nuclear@2 139
nuclear@2 140 enum dsys_evtype dsys_event_type(struct dsys_event *ev);
nuclear@2 141 float dsys_event_value(struct dsys_event *ev);
nuclear@2 142
nuclear@2 143 void dsys_event_callback(struct dsys_event *ev, void (*func)(void*), void *cls);
nuclear@2 144 void dsys_event_link(struct dsys_event *ev, float *link);
nuclear@2 145
nuclear@2 146
nuclear@2 147 /* time conversion */
nuclear@2 148 demotime_t dsys_sec_to_dtime(float sec)
nuclear@2 149 {
nuclear@2 150 return sec;
nuclear@2 151 }
nuclear@2 152
nuclear@2 153 demotime_t dsys_msec_to_dtime(unsigned long msec)
nuclear@2 154 {
nuclear@2 155 return (demotime_t)msec / 1000.0;
nuclear@2 156 }
nuclear@2 157
nuclear@2 158 float dsys_dtime_to_sec(demotime_t tm)
nuclear@2 159 {
nuclear@2 160 return tm;
nuclear@2 161 }
nuclear@2 162
nuclear@2 163 unsigned long dsys_dtime_to_msec(demotime_t tm)
nuclear@2 164 {
nuclear@2 165 return (unsigned long)(tm * 1000.0);
nuclear@2 166 }
nuclear@2 167
nuclear@2 168
nuclear@2 169 static float eval_step(struct dsys_event *ev, demotime_t t)
nuclear@2 170 {
nuclear@2 171 return t >= ev->t1 ? 1.0 : 0.0;
nuclear@2 172 }
nuclear@2 173
nuclear@2 174 static float eval_lerp(struct dsys_event *ev, demotime_t t)
nuclear@2 175 {
nuclear@2 176 return (t - ev->t0) / (ev->t1 - ev->t0);
nuclear@2 177 }
nuclear@2 178
nuclear@2 179 static float eval_sigmoid(struct dsys_event *ev, demotime_t t)
nuclear@2 180 {
nuclear@2 181 t = eval_lerp(ev, t);
nuclear@2 182 return 1.0 - (cos(t * M_PI) * 0.5 + 0.5);
nuclear@2 183 }
nuclear@2 184
nuclear@2 185 static void free_event(struct dsys_event *ev)
nuclear@2 186 {
nuclear@2 187 while(ev->cblist) {
nuclear@2 188 struct callback *cb = ev->cblist;
nuclear@2 189 ev->cblist = ev->cblist->next;
nuclear@2 190 free(cb);
nuclear@2 191 }
nuclear@2 192 }