rocket/ogl_editor/src/TrackData.c
2012-11-11 22:16:50 +01:00

164 lines
4.2 KiB
C

#include "TrackData.h"
#include "rlog.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int TrackData_createGetTrack(TrackData* trackData, const char* name)
{
int index = sync_find_track(&trackData->syncData, name);
if (index < 0)
{
index = sync_create_track(&trackData->syncData, name);
memset(&trackData->tracks[index], 0, sizeof(Track));
trackData->tracks[index].color = TrackData_getNextColor(trackData);
}
return index;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static uint32_t s_colors[] =
{
0xffb27474,
0xffb28050,
0xffa9b250,
0xff60b250,
0xff4fb292,
0xff4f71b2,
0xff8850b2,
0xffb25091,
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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);
current_group++;
}
trackData->groupCount = current_group;
rlog(R_DEBUG, "Total amount of groups (and separate tracks) %d\n", current_group);
}