Mercurial > hg > dmlib
changeset 330:af04394e9620
And some more work.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 15 Oct 2012 02:45:32 +0300 |
parents | a4a6082a9055 |
children | c200edce230d |
files | dmtimeline.c dmtimeline.h |
diffstat | 2 files changed, 82 insertions(+), 25 deletions(-) [+] |
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; }
--- a/dmtimeline.h Mon Oct 15 00:01:42 2012 +0300 +++ b/dmtimeline.h Mon Oct 15 02:45:32 2012 +0300 @@ -124,20 +124,6 @@ typedef struct { - DMTimelineTrack *track; - DMTimelineEvent *event; -} DMPreparedEvent; - - -typedef struct -{ - int start, end, nevents; - DMPreparedEvent *events; -} DMPreparedEventGroup; - - -typedef struct -{ char magic[8]; char name[DT_MAX_NAME_LENGTH]; Uint32 ntracks; @@ -150,11 +136,30 @@ char *name; int ntracks, nallocated, duration; DMTimelineTrack **tracks; +} DMTimeline; - // Prepared data - int nevents; - DMPreparedEventGroup *pevents; -} DMTimeline; + +typedef struct +{ + DMTimelineTrack *track; + DMTimelineEvent *event; +} DMPreparedEvent; + + +typedef struct _DMPreparedEventGroup +{ + int start, end, nevents, nallocated; + DMPreparedEvent *events; + + struct _DMPreparedEventGroup *next, *prev; +} DMPreparedEventGroup; + + +typedef struct +{ + int duration, ngroups, pos; + DMPreparedEventGroup **groups; +} DMPreparedTimeline; extern DMEffect *dmEffects; @@ -174,9 +179,9 @@ // Execution related -int dmPrepareTimeline(DMTimeline *tl); -int dmSeekTimeline(DMTimeline *tl, int time); -int dmExecuteTimeline(DMTimeline *tl, SDL_Surface *screen, int time); +int dmPrepareTimeline(DMTimeline *tl, DMPreparedTimeline *ptl); +int dmSeekTimeline(DMPreparedTimeline *tl, int time); +int dmExecuteTimeline(DMPreparedTimeline *tl, SDL_Surface *screen, int time); // Editing/saving related functions