// // SAMPLE TOD ANIMATION PROGRAM // // by Jason Spreadborough // INCLUDE FILES //--------------- #include #include #include "pad.h" /* pad control */ #include "tod.h" /* definition for TOD functions */ #include "IDLists.h" /* TMD ID list (not used) */ #include "graphics.h" /* Various graphic and animation*/ #include "addrs.h" /* Model and TOD addresses */ // DEFINES //------------ #define STOPPED (0) #define PLAYING (1) #define FFWD (2) #define RWD (3) #define SLOWMO (4) // PROTOTYPES //-------- void UpdateWorld(); void RenderWorld(); long ProcessInput(); void ScaleModel(GsCOORDINATE2 * theCoord); // GLOBALS //---------- u_long pad; // For controller GsRVIEW2 view; // For viewing int AnimationState; // State animation is in. i.e. playing or stopped. LinkObjectStruct theModel; // The animated model // FUNCTIONS //---------- ////////////////////////////////////////////////////////////////////////////////// // Update the animation keeping track of frame speeds // and controlling the animation according to the // animationState varible. void UpdateWorld() { static u_long frame_counter=0; // control playback. // case 0: sum = (((v_count/3000)%60)/10); break; // case 1: sum = (((v_count/3000)%60)%10); break; // case 2: sum = (((v_count/50)%60)/10); break; // case 3: sum = (((v_count/50)%60)%10); break; // v_count ++; switch(AnimationState) { case STOPPED: break; case PLAYING: NextFrame(&theModel,TRUE); break; case FFWD: for(;;) { NextFrame(&theModel,TRUE); } break; case RWD: for(;;) {NextFrame(&theModel,TRUE);} break; } ScaleModel(&theModel.obj_coord[0]); ScaleModel(&theModel.obj_coord[1]); ScaleModel(&theModel.obj_coord[2]); ScaleModel(&theModel.obj_coord[3]); ScaleModel(&theModel.obj_coord[4]); ScaleModel(&theModel.obj_coord[5]); if(++frame_counter > 0) {} } // Handle Object drawing function calls void RenderWorld() { RenderPrepare(); DrawObjectLink(theModel.objs); RenderFinish(); } // Process Joypad controller input. Controls // camera positioning. long ProcessInput() { static int camera=9; static int pressed=0; pad = PadRead(); if(pressed==0) { if((pad & PADRright) > 0) { ResetAnim(&theModel,0); } if((pad & PADRleft) > 0) { ResetAnim(&theModel,0); } if((pad & PADRdown) > 0) { AnimationState = STOPPED; } if((pad & PADRup) > 0) { AnimationState = PLAYING; } if ((pad & PADo)>0){ } if((pad & PADLleft)>0) { camera--; if(camera<0) camera = 9; pressed=1; } if ((pad & PADLright)>0) { camera++; if(camera>9) camera = 0; pressed=1; } if ((pad & PADLdown)>0){} if ((pad & PADLup)>0){} if ((pad & PADh)>0){} if ((pad & PADk)>0) { return FALSE; } } if(pressed==1) { if(!(pad & PADLleft) && !(pad & PADLright)) { pressed=0; } } // set camera position. switch(camera) { case 0:InitialiseView(&view,100,0,-3310,-30000,32382,theModel.obj_coord[16].coord.t[0],theModel.obj_coord[16].coord.t[1],theModel.obj_coord[16].coord.t[2]);break; case 1:InitialiseView(&view,100,0,-95419,-30000,49159,theModel.obj_coord[16].coord.t[0],theModel.obj_coord[16].coord.t[1],theModel.obj_coord[16].coord.t[2]);break; case 2:InitialiseView(&view,100,0,0,-4000,-15000,0,0,0);break; case 3:InitialiseView(&view,100,0,0,-4000,-15000,theModel.obj_coord[16].coord.t[0],theModel.obj_coord[16].coord.t[1],theModel.obj_coord[16].coord.t[2]);break; case 4:InitialiseView(&view,100,0,-2000,-4000,-5000,0,0,0);break; case 5:InitialiseView(&view,100,0,-2000,-4000,-5000,theModel.obj_coord[16].coord.t[0],theModel.obj_coord[16].coord.t[1],theModel.obj_coord[16].coord.t[2]);break; case 6:InitialiseView(&view,100,0,-4000,-4000,-8000,0,0,0);break; case 7:InitialiseView(&view,100,0,theModel.obj_coord[16].coord.t[0]-14000,theModel.obj_coord[16].coord.t[1]-12000,theModel.obj_coord[16].coord.t[2]-16000,theModel.obj_coord[16].coord.t[0],theModel.obj_coord[16].coord.t[1],theModel.obj_coord[16].coord.t[2]);break; case 8:InitialiseView(&view,100,0,theModel.obj_coord[16].coord.t[0]+14000,theModel.obj_coord[16].coord.t[1]+12000,theModel.obj_coord[16].coord.t[2]+16000,theModel.obj_coord[16].coord.t[0],theModel.obj_coord[16].coord.t[1],theModel.obj_coord[16].coord.t[2]);break; case 9:InitialiseView(&view,100,0,theModel.obj_coord[16].coord.t[0]+8000,theModel.obj_coord[16].coord.t[1]+2000,theModel.obj_coord[16].coord.t[2]+8000,theModel.obj_coord[16].coord.t[0],theModel.obj_coord[16].coord.t[1],theModel.obj_coord[16].coord.t[2]);break; } GsSetRefView2(&view); //update camera. //printf("x= %d ,y=%d ,z= %d\n",theModel.obj_coord[16].coord.t[0],theModel.obj_coord[16].coord.t[1],theModel.obj_coord[16].coord.t[2]); return TRUE; } //Scale model manually void ScaleModel(GsCOORDINATE2 * theCoord) { MATRIX mat; VECTOR vec; vec.vx = 4096; vec.vy=4096; vec.vz=4096; // theCoord->coord.m[0][0]*= 2; // theCoord->coord.m[1][1]*= 2; // theCoord->coord.m[2][2]*= 2; ScaleMatrix(&theCoord->coord.m,&vec); theCoord->flg=0; } /************************************************************************************************/ // Main routine //-------------- void main() { long running = TRUE; // Program loop state. AnimationState = STOPPED; // set global varible. // General Initialisations for graphics. PadInit(); Initialise3DGraphics(); InitialiseView(&view,100,0,0,-2000,-4000,0,0,0); InitialiseLights(); //Initialise Model + TOD. LoadTextures(); InitialiseModelLink(&theModel,23,1,0,0,0,(u_long *)MODEL_TMD); initTod(&theModel,0,NULL,(u_long *)SHORT_TOD); //Set animation to first frame. ResetAnim(&theModel,0); //Main program loop while(running) { if(ProcessInput() == FALSE) running = FALSE; UpdateWorld(); RenderWorld(); } ResetGraph(3); }