diff --git a/ogl_editor/src/TrackData.c b/ogl_editor/src/TrackData.c index afd418d..1c9b395 100644 --- a/ogl_editor/src/TrackData.c +++ b/ogl_editor/src/TrackData.c @@ -1,4 +1,5 @@ #include "TrackData.h" +#include "rlog.h" /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -37,3 +38,120 @@ uint32_t TrackData_getNextColor(TrackData* trackData) 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); + } +} + diff --git a/ogl_editor/src/TrackData.h b/ogl_editor/src/TrackData.h index e995da5..f493ca0 100644 --- a/ogl_editor/src/TrackData.h +++ b/ogl_editor/src/TrackData.h @@ -33,8 +33,14 @@ typedef struct Track typedef struct Group { + const char* name; + union + { + Track* track; + Track** tracks; + } t; + enum GroupType type; - Track** track; int trackCount; } Group; @@ -45,6 +51,7 @@ typedef struct TrackData struct sync_data syncData; Track tracks[EDITOR_MAX_TRACKS]; Group groups[EDITOR_MAX_TRACKS]; + int groupCount; int activeTrack; int lastColor; int trackCount; @@ -56,4 +63,5 @@ typedef struct TrackData int TrackData_createGetTrack(TrackData* trackData, const char* name); uint32_t TrackData_getNextColor(TrackData* trackData); +void TrackData_linkGroups(TrackData* trackData); diff --git a/ogl_editor/src/loadsave.c b/ogl_editor/src/loadsave.c index 8fb3892..08d8bed 100644 --- a/ogl_editor/src/loadsave.c +++ b/ogl_editor/src/loadsave.c @@ -128,6 +128,8 @@ static void parseXml(mxml_node_t* rootNode, TrackData* trackData) default: break; } } + + TrackData_linkGroups(trackData); }