typedef struct Cue {
STRING* entname;
VECTOR* startpos;
VECTOR* endpos;
ANGLE* startang;
ANGLE* endang;
VECTOR* startscale;
VECTOR* endscale;
STRING* anim; //animation name- or NULL
var animloops;
var starttime;
var duration;
struct Cue* next; //used when the cue is in the linked list of active cues
struct Cue* prev;
} Cue;
typedef struct Keyframe {
var cuetime;
var actions_count;
Cue* actions[64];
} Keyframe;
Keyframe* scene;
Cue* active_cues[300];
var keyframe_count;
Cue* active_cues_head = NULL;
function newCue()
{
Cue* newcue = malloc(sizeof(Cue));
memset(newcue,0,sizeof(Cue));
return newcue;
}
function newKeyframe()
{
Keyframe* newkeyframe = malloc(sizeof(Keyframe));
memset(newkeyframe,0,sizeof(Keyframe));
return newkeyframe;
}
function loadScene(STRING* filename)
{
str_cpy(delimit_str," ");
var filehandle = file_open_read(filename);
var length = file_var_read(filehandle); //first number is number of keyframes to malloc
scene = malloc(length * sizeof(Keyframe));
var i;
for(i = 0; i < length; i++)
{
memcpy(scene[i],newKeyframe(),sizeof(Keyframe));
scene[i].cuetime = file_var_read(filehandle);
scene[i].actions_count = file_var_read(filehandle);
if(scene[i].actions_count > 0)
{
scene[i].actions = malloc(scene[i].actions_count * sizeof(Cue));
var k;
for(k = 0; i < scene[i].actions_count; i++)
{
scene[i].actions[k] = newCue();
scene[i].actions[k].entname = str_create("#20");
file_str_read(filehandle,scene[i].actions[k].entname);
scene[i].actions[k].startpos = vector(0,0,0);
scene[i].actions[k].endpos = vector(0,0,0);
scene[i].actions[k].startang = vector(0,0,0);
scene[i].actions[k].endang = vector(0,0,0);
scene[i].actions[k].startscale = vector(0,0,0);
scene[i].actions[k].endscale = vector(0,0,0);
scene[i].actions[k].startpos.x = file_var_read(filehandle);
scene[i].actions[k].startpos.y = file_var_read(filehandle);
scene[i].actions[k].startpos.z = file_var_read(filehandle);
scene[i].actions[k].endpos.x = file_var_read(filehandle);
scene[i].actions[k].endpos.y = file_var_read(filehandle);
scene[i].actions[k].endpos.z = file_var_read(filehandle);
scene[i].actions[k].startang.pan = file_var_read(filehandle);
scene[i].actions[k].startang.tilt = file_var_read(filehandle);
scene[i].actions[k].startang.roll = file_var_read(filehandle);
scene[i].actions[k].endang.pan = file_var_read(filehandle);
scene[i].actions[k].endang.tilt = file_var_read(filehandle);
scene[i].actions[k].endang.roll = file_var_read(filehandle);
scene[i].actions[k].startscale.x = file_var_read(filehandle);
scene[i].actions[k].startscale.y = file_var_read(filehandle);
scene[i].actions[k].startscale.z = file_var_read(filehandle);
scene[i].actions[k].endscale.x = file_var_read(filehandle);
scene[i].actions[k].endscale.y = file_var_read(filehandle);
scene[i].actions[k].endscale.z = file_var_read(filehandle);
file_str_read(filehandle,scene[i].actions[k].anim);
scene[i].actions[k].animloops = file_var_read(filehandle);
scene[i].actions[k].starttime = scene[i].cuetime;
scene[i].actions[k].duration = file_var_read(filehandle);
scene[i].actions[k].next = NULL;
scene[i].actions[k].prev = NULL;
}
}
}
file_close(filehandle);
}