abrash-black-book/52-05.html

185 lines
7.3 KiB
HTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="vsisbn" content="1576101746" />
<meta name="vstitle" content="Michael Abrash's Graphics Programming Black Book, Special Edition" />
<meta name="vsauthor" content="Michael Abrash" />
<meta name="vspublisher" content="The Coriolis Group" />
<meta name="vspubdate" content="07/01/97" />
<meta name="vscategory" content="Web and Software Development: Game Development,Web and Software Development: Graphics and Multimedia Development" />
<title>Michael Abrash's Graphics Programming Black Book Special Edition: Fast 3-D Animation: Meet X-Sharp</title>
<meta name="chapter" content="52" />
<meta name="pages" content="979-981" />
</head>
<body>
<center>
<table border="1">
<tr>
<td>
<a href="52-04.html">Previous</a>
</td>
<td>
<a href="index.html">Table of Contents</a>
</td>
<td>
<a href="52-06.html">Next</a>
</td>
</tr>
</table>
</center>
<p><b>LISTING 52.8 L52-8.C</b></p>
<pre>
/* Initializes the cubes and adds them to the object list. */
#include &lt;stdlib.h&gt;
#include &lt;math.h&gt;
#include &ldquo;polygon.h&rdquo;
#define ROT_6 (M_PI / 30.0) /* rotate 6 degrees at a time */
#define ROT_3 (M_PI / 60.0) /* rotate 3 degrees at a time */
#define ROT_2 (M_PI / 90.0) /* rotate 2 degrees at a time */
#define NUM_CUBES 12 /* # of cubes */
Point3 CubeVerts[NUM_CUBE_VERTS]; /* set elsewhere, from floats */
/* vertex indices for individual cube faces */
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) };
/* X, Y, Z rotations for 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}, };
/* face colors for various 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} };
/* starting coordinates for cubes in world space */
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}};
/* delay counts (speed control) for 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; i&lt;NUM_CUBES; i++) {
if ((WorkingCube = malloc(sizeof(PObject))) == NULL) {
printf(&ldquo;Couldn't get memory\n&rdquo;); exit(1); }
WorkingCube-&gt;DrawFunc = DrawPObject;
WorkingCube-&gt;RecalcFunc = XformAndProjectPObject;
WorkingCube-&gt;MoveFunc = RotateAndMovePObject;
WorkingCube-&gt;RecalcXform = 1;
for (k=0; k&lt;2; k++) {
WorkingCube-&gt;EraseRect[k].Left =
WorkingCube-&gt;EraseRect[k].Top = 0x7FFF;
WorkingCube-&gt;EraseRect[k].Right = 0;
WorkingCube-&gt;EraseRect[k].Bottom = 0;
}
WorkingCube-&gt;RDelayCount = InitRDelayCounts[i];
WorkingCube-&gt;RDelayCountBase = BaseRDelayCounts[i];
WorkingCube-&gt;MDelayCount = InitMDelayCounts[i];
WorkingCube-&gt;MDelayCountBase = BaseMDelayCounts[i];
/* Set the object-&gt;world xform to none */
for (j=0; j&lt;3; j++)
for (k=0; k&lt;4; k++)
WorkingCube-&gt;XformToWorld[j][k] = INT_TO_FIXED(0);
WorkingCube-&gt;XformToWorld[0][0] =
WorkingCube-&gt;XformToWorld[1][1] =
WorkingCube-&gt;XformToWorld[2][2] =
WorkingCube-&gt;XformToWorld[3][3] = INT_TO_FIXED(1);
/* Set the initial location */
for (j=0; j&lt;3; j++) WorkingCube-&gt;XformToWorld[j][3] =
INT_TO_FIXED(CubeStartCoords[i][j]);
WorkingCube-&gt;NumVerts = NUM_CUBE_VERTS;
WorkingCube-&gt;VertexList = CubeVerts;
WorkingCube-&gt;NumFaces = NUM_CUBE_FACES;
WorkingCube-&gt;Rotate = InitialRotate[i];
WorkingCube-&gt;Move.MoveX = INT_TO_FIXED(InitialMove[i].MoveX);
WorkingCube-&gt;Move.MoveY = INT_TO_FIXED(InitialMove[i].MoveY);
WorkingCube-&gt;Move.MoveZ = INT_TO_FIXED(InitialMove[i].MoveZ);
WorkingCube-&gt;Move.MinX = INT_TO_FIXED(InitialMove[i].MinX);
WorkingCube-&gt;Move.MinY = INT_TO_FIXED(InitialMove[i].MinY);
WorkingCube-&gt;Move.MinZ = INT_TO_FIXED(InitialMove[i].MinZ);
WorkingCube-&gt;Move.MaxX = INT_TO_FIXED(InitialMove[i].MaxX);
WorkingCube-&gt;Move.MaxY = INT_TO_FIXED(InitialMove[i].MaxY);
WorkingCube-&gt;Move.MaxZ = INT_TO_FIXED(InitialMove[i].MaxZ);
if ((WorkingCube-&gt;XformedVertexList =
malloc(NUM_CUBE_VERTS*sizeof(Point3))) == NULL) {
printf(&ldquo;Couldn't get memory\n&rdquo;); exit(1); }
if ((WorkingCube-&gt;ProjectedVertexList =
malloc(NUM_CUBE_VERTS*sizeof(Point3))) == NULL) {
printf(&ldquo;Couldn't get memory\n&rdquo;); exit(1); }
if ((WorkingCube-&gt;ScreenVertexList =
malloc(NUM_CUBE_VERTS*sizeof(Point))) == NULL) {
printf(&ldquo;Couldn't get memory\n&rdquo;); exit(1); }
if ((WorkingCube-&gt;FaceList =
malloc(NUM_CUBE_FACES*sizeof(Face))) == NULL) {
printf(&ldquo;Couldn't get memory\n&rdquo;); exit(1); }
/* Initialize the faces */
for (j=0; j&lt;NUM_CUBE_FACES; j++) {
WorkingCube-&gt;FaceList[j].VertNums = VertNumList[j];
WorkingCube-&gt;FaceList[j].NumVerts = VertsInFace[j];
WorkingCube-&gt;FaceList[j].Color = Colors[i][j];
}
ObjectList[NumObjects++] = (Object *)WorkingCube;
}
}
</pre>
<center>
<table border="1">
<tr>
<td>
<a href="52-04.html">Previous</a>
</td>
<td>
<a href="index.html">Table of Contents</a>
</td>
<td>
<a href="52-06.html">Next</a>
</td>
</tr>
</table>
</center>
<hr width="90%" size="1" noshade="noshade" />
<div align="center">
Graphics Programming Black Book &copy; 2001 Michael Abrash
</div>
</body>
</html>