Added linking of the groups when loading .rocket files

This commit is contained in:
Daniel Collin 2012-11-11 21:38:50 +01:00
parent d33792841c
commit d03bd9e991
3 changed files with 129 additions and 1 deletions

View File

@ -1,4 +1,5 @@
#include "TrackData.h" #include "TrackData.h"
#include "rlog.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -37,3 +38,120 @@ uint32_t TrackData_getNextColor(TrackData* trackData)
return s_colors[(trackData->lastColor++) & 0x7]; return s_colors[(trackData->lastColor++) & 0x7];
} }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static int findSeparator(const char* name)
{
int i, len = strlen(name);
for (i = 0; i < len; ++i)
{
if (name[i] == ':')
return i;
}
return -1;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static int countGroup(const char* name, struct sync_data* syncData, int index)
{
int i, group_count = 0, count = syncData->num_tracks;
for (i = index; i < count; ++i)
{
if (strstr(syncData->tracks[i]->name, name))
group_count++;
}
return group_count;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void insertTracksInGroup(Group* group, const char* name, bool* processedTracks, TrackData* trackData, int index)
{
int i, group_index = 0, count = trackData->syncData.num_tracks;
struct sync_data* sync = &trackData->syncData;
for (i = index; i < count; ++i)
{
if (processedTracks[i])
continue;
if (strstr(sync->tracks[i]->name, name))
{
rlog(R_DEBUG, "Inserted track %s into group %s\n", sync->tracks[i]->name, group->name);
group->t.tracks[group_index++] = &trackData->tracks[i];
processedTracks[i] = true;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TrackData_linkGroups(TrackData* trackData)
{
int i, found, current_group = 0, track_count;
char group_name[256];
bool processed_tracks[EDITOR_MAX_TRACKS];
struct sync_data* sync = &trackData->syncData;
// set whatever we have processed a track or not
memset(processed_tracks, 0, sizeof(processed_tracks));
trackData->groupCount = 0;
if (!sync->tracks)
return;
for (i = 0, track_count = sync->num_tracks; i < track_count; ++i)
{
int group_count;
const char* track_name = sync->tracks[i]->name;
Group* group = &trackData->groups[current_group];
if (processed_tracks[i])
continue;
Track* track = &trackData->tracks[i];
found = findSeparator(track_name);
if (found == -1)
{
rlog(R_DEBUG, "Track %s didn't have any group. Adding as single track\n", track_name);
group->type = GROUP_TYPE_TRACK;
group->t.track = track;
group->trackCount = 1;
processed_tracks[i] = true;
current_group++;
continue;
}
rlog(R_DEBUG, "Found track with grouping %s\n", track_name);
// Found a group, lets dig out the groupname
memset(group_name, 0, sizeof(group_name));
memcpy(group_name, track_name, found + 1);
group->name = strdup(group_name);
group->type = GROUP_TYPE_GROUP;
rlog(R_DEBUG, "Group name %s\n", group_name);
// count tracks that are in the group and allocate space for them
group_count = countGroup(group_name, sync, i);
rlog(R_DEBUG, "Found %d tracks for group %s\n", group_count, group_name);
group->t.tracks = (Track**)malloc(sizeof(Track**) * group_count);
group->trackCount = group_count;
insertTracksInGroup(group, group_name, processed_tracks, trackData, i);
}
}

View File

@ -33,8 +33,14 @@ typedef struct Track
typedef struct Group typedef struct Group
{ {
const char* name;
union
{
Track* track;
Track** tracks;
} t;
enum GroupType type; enum GroupType type;
Track** track;
int trackCount; int trackCount;
} Group; } Group;
@ -45,6 +51,7 @@ typedef struct TrackData
struct sync_data syncData; struct sync_data syncData;
Track tracks[EDITOR_MAX_TRACKS]; Track tracks[EDITOR_MAX_TRACKS];
Group groups[EDITOR_MAX_TRACKS]; Group groups[EDITOR_MAX_TRACKS];
int groupCount;
int activeTrack; int activeTrack;
int lastColor; int lastColor;
int trackCount; int trackCount;
@ -56,4 +63,5 @@ typedef struct TrackData
int TrackData_createGetTrack(TrackData* trackData, const char* name); int TrackData_createGetTrack(TrackData* trackData, const char* name);
uint32_t TrackData_getNextColor(TrackData* trackData); uint32_t TrackData_getNextColor(TrackData* trackData);
void TrackData_linkGroups(TrackData* trackData);

View File

@ -128,6 +128,8 @@ static void parseXml(mxml_node_t* rootNode, TrackData* trackData)
default: break; default: break;
} }
} }
TrackData_linkGroups(trackData);
} }