Mercurial > hg > dmlib
diff dmtimeline.c @ 330:af04394e9620
And some more work.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 15 Oct 2012 02:45:32 +0300 |
parents | dd7b1356d726 |
children | 1c5e7d66312d |
line wrap: on
line diff
--- a/dmtimeline.c Mon Oct 15 00:01:42 2012 +0300 +++ b/dmtimeline.c Mon Oct 15 02:45:32 2012 +0300 @@ -389,16 +389,68 @@ dmFree(tl->tracks); dmFree(tl->name); - dmFree(tl->pevents); } } +void dmFreePreparedEventGroup(DMPreparedEventGroup *group) +{ + dmFree(group->events); + dmFree(group); +} + + /* Prepare a loaded timeline for execution. Creates the "stacked" structure * of timeline data for efficient rendering. */ -int dmPrepareTimeline(DMTimeline *tl) +int dmAddSplitPreparedEventGroup(DMPreparedEventGroup **groups, DMTimelineTrack *track, DMTimelineEvent *event) +{ + DMPreparedEventGroup *node; + + for (node = *groups; node != NULL; node = node->next) + { + } + + return DMERR_OK; +} + + +int dmPrepareTimeline(DMTimeline *tl, DMPreparedTimeline *ptl) { + int group, ntrack, event, err; + DMPreparedEventGroup *groups = NULL, *node; + + // Free previous data + for (group = 0; group < ptl->ngroups; group++) + dmFreePreparedEventGroup(ptl->groups[group]); + dmFree(ptl->groups); + ptl->groups = NULL; + + // Process tracks + for (ntrack = 0; ntrack < tl->ntracks; ntrack++) + { + DMTimelineTrack *track = tl->tracks[ntrack]; + for (event = 0; event < track->nevents; event++) + { + if ((err = dmAddSplitPreparedEventGroup(&groups, track, track->events[event])) != DMERR_OK) + return err; + } + } + + // Compute number of groups + ptl->ngroups = 0; + for (node = groups; node != NULL; node = node->next) + ptl->ngroups++; + + // Allocate linear array for fast access + ptl->groups = dmMalloc(sizeof(DMPreparedEventGroup) * ptl->ngroups); + if (ptl->groups == NULL) + return DMERR_MALLOC; + + // Store pointers in the array + for (group = 0, node = groups; node != NULL; node = node->next) + ptl->groups[group++] = node; + return DMERR_OK; } @@ -407,7 +459,7 @@ * only handles monotonously increasing time, going backwards will not work * there correctly, thus to seek freely this function must be used. */ -int dmSeekTimeline(DMTimeline *tl, int time) +int dmSeekTimeline(DMPreparedTimeline *tl, int time) { return DMERR_OK; } @@ -415,7 +467,7 @@ /* "Executes", or rather renders a frame on the specified timeline position. */ -int dmExecuteTimeline(DMTimeline *tl, SDL_Surface *screen, int time) +int dmExecuteTimeline(DMPreparedTimeline *tl, SDL_Surface *screen, int time) { return DMERR_OK; }