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