13 static std::vector<SeqTrack> tracks;
16 static Track *load_track(struct ts_node *tnode);
17 static InterpMode str2interp(const char *str);
18 static ExtrapMode str2extrap(const char *str);
28 int ntrk = tracks.size();
29 for(int i=0; i<ntrk; i++) {
30 delete tracks[i].track;
31 delete [] tracks[i].name;
36 int add_seq_track(const char *name, InterpMode inmode, ExtrapMode exmode, float defval)
38 int idx = find_seq_track(name);
39 if(idx >= 0) return idx;
42 st.name = new char[strlen(name) + 1];
43 strcpy(st.name, name);
45 st.track->defval = defval;
46 st.track->interp = inmode;
47 st.track->extrap = exmode;
49 return tracks.size() - 1;
52 int find_seq_track(const char *name)
54 int ntrk = tracks.size();
55 for(int i=0; i<ntrk; i++) {
56 if(strcmp(tracks[i].name, name) == 0) {
63 Track *get_seq_track(int idx)
65 return tracks[idx].track;
68 void clear_seq_track(int idx)
70 tracks[idx].track->clear();
73 void clear_seq_track(const char *name)
75 int idx = find_seq_track(name);
77 tracks[idx].track->clear();
81 bool seq_track_empty(int idx)
83 return tracks[idx].track->empty();
86 bool seq_track_empty(const char *name)
88 int idx = find_seq_track(name);
90 return tracks[idx].track->empty();
95 void set_seq_value(int idx, long tm, float val)
97 tracks[idx].track->set_value(tm, val);
98 printf("track(%d): set keyframe %ld -> %f\n", idx, tm, val);
101 void set_seq_value(const char *name, long tm, float val)
103 int idx = find_seq_track(name);
105 set_seq_value(idx, tm, val);
109 float get_seq_value(int idx, long tm)
111 return (*tracks[idx].track)(tm);
114 float get_seq_value(const char *name, long tm)
116 int idx = find_seq_track(name);
120 return (*tracks[idx].track)(tm);
123 bool load_seq(const char *fname)
125 struct ts_node *tree;
126 if(!(tree = ts_load(fname))) {
129 if(strcmp(tree->name, "faros") != 0) {
130 fprintf(stderr, "invalid sequence file: %s\n", fname);
135 struct ts_node *node = tree->child_list;
137 if(strcmp(node->name, "track") == 0) {
138 Track *track = load_track(node);
139 const char *name = ts_get_attr_str(node, "name", 0);
143 sprintf(buf, "unnamed%03d", foo++);
147 int idx = find_seq_track(name);
151 st.name = new char[strlen(name) + 1];
152 strcpy(st.name, name);
153 tracks.push_back(st);
155 delete tracks[idx].track;
156 tracks[idx].track = track;
167 static Track *load_track(struct ts_node *tnode)
169 Track *track = new Track;
170 track->defval = ts_get_attr_num(tnode, "default", 0.0f);
171 track->interp = str2interp(ts_get_attr_str(tnode, "interpolation", ""));
172 track->extrap = str2extrap(ts_get_attr_str(tnode, "extrapolation", ""));
174 struct ts_node *keynode = tnode->child_list;
176 long tm = ts_get_attr_int(keynode, "time", 0);
177 float val = ts_get_attr_num(keynode, "value", 0.0f);
178 track->set_value(tm, val);
179 keynode = keynode->next;
185 static InterpMode str2interp(const char *str)
187 if(strcmp(str, "step") == 0) {
189 } else if(strcmp(str, "sigmoid") == 0) {
190 return INTERP_SIGMOID;
192 return INTERP_LINEAR;
195 static ExtrapMode str2extrap(const char *str)
197 if(strcmp(str, "repeat") == 0) {
198 return EXTRAP_REPEAT;
203 bool dump_seq(const char *fname)
205 FILE *fp = fopen(fname, "w");
207 perror("failed to open sequence dump file");
211 fprintf(fp, "faros {\n");
212 int ntrk = tracks.size();
213 for(int i=0; i<ntrk; i++) {
214 int nkeys = tracks[i].track->get_num_keys();
217 fprintf(fp, "\ttrack {\n");
218 fprintf(fp, "\t\tname = \"%s\"\n", tracks[i].name);
219 for(int j=0; j<nkeys; j++) {
220 TrackKey key = (*tracks[i].track)[j];
221 fprintf(fp, "\t\tkey {\n");
222 fprintf(fp, "\t\t\ttime = %ld\n", key.time);
223 fprintf(fp, "\t\t\tvalue = %g\n", key.value);
224 fprintf(fp, "\t\t}\n");
226 fprintf(fp, "\t}\n\n");