/* Initialise les cubes et les ajoute dans la liste des objets. Testé avec Borland C++ 4.02 en modèle small par Jim Mischel 12/16/94. */ #include #include #include "polygon.h" #define ROT_6 (M_PI / 30.0) /* effectue une rotation de 6 degrés */ #define ROT_3 (M_PI / 60.0) /* effectue une rotation de 3 degrés */ #define ROT_2 (M_PI / 90.0) /* effectue une rotation de 2 degrés */ #define NUM_CUBES 12 /* nombre de cubes */ Point3 CubeVerts[NUM_CUBE_VERTS]; /*paramètré ailleurs, avec des valeurs flottantes */ /* Indices points pour les faces individuelles du cube */ static int Face1[] = {1,3,2,0}; static int Face2[] = {5,7,3,1}; static int Face3[] = {4,5,1,0}; static int Face4[] = {3,7,6,2}; static int Face5[] = {5,4,6,7}; static int Face6[] = {0,2,6,4}; static int *VertNumList[]={Face1, Face2, Face3, Face4, Face5, Face6}; static int VertsInFace[]={ sizeof(Face1)/sizeof(int), sizeof(Face2)/sizeof(int), sizeof(Face3)/sizeof(int), sizeof(Face4)/sizeof(int), sizeof(Face5)/sizeof(int), sizeof(Face6)/sizeof(int) }; /* Rotations X, Y, Z des cubes */ static RotateControl InitialRotate[NUM_CUBES] = { {0.0,ROT_6,ROT_6},{ROT_3,0.0,ROT_3},{ROT_3,ROT_3,0.0}, {ROT_3,-ROT_3,0.0},{-ROT_3,ROT_2,0.0},{-ROT_6,-ROT_3,0.0}, {ROT_3,0.0,-ROT_6},{-ROT_2,0.0,ROT_3},{-ROT_3,0.0,-ROT_3}, {0.0,ROT_2,-ROT_2},{0.0,-ROT_3,ROT_3},{0.0,-ROT_6,-ROT_6},}; static MoveControl InitialMove[NUM_CUBES] = { {0,0,80,0,0,0,0,0,-350},{0,0,80,0,0,0,0,0,-350}, {0,0,80,0,0,0,0,0,-350},{0,0,80,0,0,0,0,0,-350}, {0,0,80,0,0,0,0,0,-350},{0,0,80,0,0,0,0,0,-350}, {0,0,80,0,0,0,0,0,-350},{0,0,80,0,0,0,0,0,-350}, {0,0,80,0,0,0,0,0,-350},{0,0,80,0,0,0,0,0,-350}, {0,0,80,0,0,0,0,0,-350},{0,0,80,0,0,0,0,0,-350}, }; /* Couleurs des faces des différents cubes */ static int Colors[NUM_CUBES][NUM_CUBE_FACES] = { {15,14,12,11,10,9},{1,2,3,4,5,6},{35,37,39,41,43,45}, {47,49,51,53,55,57},{59,61,63,65,67,69},{71,73,75,77,79,81}, {83,85,87,89,91,93},{95,97,99,101,103,105}, {107,109,111,113,115,117},{119,121,123,125,127,129}, {131,133,135,137,139,141},{143,145,147,149,151,153} }; /* Coordonnées de départ des cubes dans l'espace monde */ static int CubeStartCoords[NUM_CUBES][3] = { {100,0,-6000}, {100,70,-6000}, {100,-70,-6000}, {33,0,-6000}, {33,70,-6000}, {33,-70,-6000}, {-33,0,-6000}, {-33,70,-6000}, {-33,-70,-6000},{-100,0,-6000}, {-100,70,-6000}, {-100,-70,-6000}}; /* Compte l'attente(contrôle la vitesse) des cubes */ static int InitRDelayCounts[NUM_CUBES] = {1,2,1,2,1,1,1,1,1,2,1,1}; static int BaseRDelayCounts[NUM_CUBES] = {1,2,1,2,2,1,1,1,2,2,2,1}; static int InitMDelayCounts[NUM_CUBES] = {1,1,1,1,1,1,1,1,1,1,1,1}; static int BaseMDelayCounts[NUM_CUBES] = {1,1,1,1,1,1,1,1,1,1,1,1}; void InitializeCubes() { int i, j, k; PObject *WorkingCube; for (i=0; iDrawFunc = DrawPObject; WorkingCube->RecalcFunc = XformAndProjectPObject; WorkingCube->MoveFunc = RotateAndMovePObject; WorkingCube->RecalcXform = 1; for (k=0; k<2; k++) { WorkingCube->EraseRect[k].Left = WorkingCube->EraseRect[k].Top = 0x7FFF; WorkingCube->EraseRect[k].Right = 0; WorkingCube->EraseRect[k].Bottom = 0; } WorkingCube->RDelayCount = InitRDelayCounts[i]; WorkingCube->RDelayCountBase = BaseRDelayCounts[i]; WorkingCube->MDelayCount = InitMDelayCounts[i]; WorkingCube->MDelayCountBase = BaseMDelayCounts[i]; /* Paramètre l'objet->monde xform à rien */ for (j=0; j<3; j++) for (k=0; k<4; k++) WorkingCube->XformToWorld[j][k] = INT_TO_FIXED(0); WorkingCube->XformToWorld[0][0] = WorkingCube->XformToWorld[1][1] = WorkingCube->XformToWorld[2][2] = WorkingCube->XformToWorld[3][3] = INT_TO_FIXED(1); /* Paramètre l'emplacement initial */ for (j=0; j<3; j++) WorkingCube->XformToWorld[j][3] = INT_TO_FIXED(CubeStartCoords[i][j]); WorkingCube->NumVerts = NUM_CUBE_VERTS; WorkingCube->VertexList = CubeVerts; WorkingCube->NumFaces = NUM_CUBE_FACES; WorkingCube->Rotate = InitialRotate[i]; WorkingCube->Move.MoveX = INT_TO_FIXED(InitialMove[i].MoveX); WorkingCube->Move.MoveY = INT_TO_FIXED(InitialMove[i].MoveY); WorkingCube->Move.MoveZ = INT_TO_FIXED(InitialMove[i].MoveZ); WorkingCube->Move.MinX = INT_TO_FIXED(InitialMove[i].MinX); WorkingCube->Move.MinY = INT_TO_FIXED(InitialMove[i].MinY); WorkingCube->Move.MinZ = INT_TO_FIXED(InitialMove[i].MinZ); WorkingCube->Move.MaxX = INT_TO_FIXED(InitialMove[i].MaxX); WorkingCube->Move.MaxY = INT_TO_FIXED(InitialMove[i].MaxY); WorkingCube->Move.MaxZ = INT_TO_FIXED(InitialMove[i].MaxZ); if ((WorkingCube->XformedVertexList = malloc(NUM_CUBE_VERTS*sizeof(Point3))) == NULL) { printf("Couldn't get memory\n"); exit(1); } if ((WorkingCube->ProjectedVertexList = malloc(NUM_CUBE_VERTS*sizeof(Point3))) == NULL) { printf("Couldn't get memory\n"); exit(1); } if ((WorkingCube->ScreenVertexList = malloc(NUM_CUBE_VERTS*sizeof(Point))) == NULL) { printf("Couldn't get memory\n"); exit(1); } if ((WorkingCube->FaceList = malloc(NUM_CUBE_FACES*sizeof(Face))) == NULL) { printf("Couldn't get memory\n"); exit(1); } /* Initialise lesfaces */ for (j=0; jFaceList[j].VertNums = VertNumList[j]; WorkingCube->FaceList[j].NumVerts = VertsInFace[j]; WorkingCube->FaceList[j].Color = Colors[i][j]; } ObjectList[NumObjects++] = (Object *)WorkingCube; } }