home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Programming Black Book (Special Edition)
/
BlackBook.bin
/
disk1
/
source
/
chapter57
/
xsharp21.exe
/
INITBALL.C
< prev
next >
Wrap
Text File
|
1992-06-10
|
13KB
|
311 lines
/* Initializes the ball(s) and adds them to the object list. */
#include <stdlib.h>
#include <math.h>
#include "polygon.h"
#define NUM_BALLS 1 /* # of balls to initialize */
#include "balvert0.inc" /* face and vertex definitions for ball */
/* X, Y, Z rotations for balls, in tenths of degrees (angles) */
static RotateControl InitialRotate[NUM_BALLS] = {
{0,10,0},};
/* Face colors for balls, in RGB forms, with each color component expressed
as a fraction of full intensity in the range 0.0 to 1.0 */
static ModelColor Colors[NUM_BALLS][NUM_FACES] = {
{{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(0)}, {CCOMP(0),CCOMP(0),CCOMP(0)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)},
{CCOMP(1),CCOMP(1),CCOMP(1)}, {CCOMP(1),CCOMP(1),CCOMP(1)}},
};
/* Shading types for faces of balls */
static int FaceShadings[NUM_BALLS][NUM_FACES] = {
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
TEXTURE_MAPPED_SHADING,
TEXTURE_MAPPED_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
NO_SHADING,
TEXTURE_MAPPED_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
DIFFUSE_SHADING | AMBIENT_SHADING,
};
/* Bear bitmap for texture mapping. Note: texture bitmaps must conform
to the pixel type of the destination; they are not device independent */
char BearBits[] = {
60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,
60,60,20,20,20,60,60,60,60,60,60,60,60,60,60,20,20,20,60,60,
60,20,20,20,20,20,60,60,60,60,60,60,60,60,20,20,20,20,20,60,
60,20,20,20,20,20,60,60,20,20,20,20,60,60,20,20,20,20,20,60,
60,20,20,20,20,20,60,20,20,20,20,20,20,60,20,20,20,20,20,60,
60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,
60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,
60,60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,60,
60,60,60,20,20,20, 3, 3, 3,20,20, 3, 3, 3,20,20,20,60,60,60,
60,60,20,20,20,20, 3, 3, 3,20,20, 3, 3, 3,20,20,20,20,60,60,
60,60,20,20,20,20, 3, 3, 3,20,20, 3, 3, 3,20,20,20,20,60,60,
60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,
60,20,20,20,20,20,20,20, 0, 0, 0, 0,20,20,20,20,20,20,20,60,
60,20,20,20,20,20,20,20, 0, 0, 0, 0,20,20,20,20,20,20,20,60,
60,20,20,20,20,20,20,20, 0, 0, 0, 0,20,20,20,20,20,20,20,60,
60,20,20,20,20,20,20,20, 0, 0, 0, 0,20,20,20,20,20,20,20,60,
60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,
60,60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,60,
60,60,60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,60,60,
60,60,60,60,60,20,20,20,20,20,20,20,20,20,20,60,60,60,60,60,
};
/* Pattern bitmap for texture mapping. Note: texture bitmaps must conform
to the pixel type of the destination; they are not device independent. */
char PatBits[] = {
12,12,12,12,12,12,12,12,12,
12,12, 3, 3, 3, 3,12,12,12,
12, 3,12,12,12,12, 3,12,12,
12,12, 3,12,12, 3,12,12,12,
12,12,12, 3, 3,12,12,12,12,
12,12,12,12,12,12,12,12,12,
};
/* Descriptor for bear texture mapping bitmap */
TextureMap BearTex = { 20, BearBits };
/* Descriptor for bear texture mapping bitmap */
TextureMap PatTex = { 9, PatBits };
/* Vertices for first face's area of BearBits. Note that the texture bitmap
is set up with a boundary row column around it; this is so that if fixed-
point imprecision causes the source pointer to wander just off the
bitmap, appropriate pixels will be found (the boundary pixels are
duplicates of their neighbors) */
Point BearVerts1[] = {
{ 0, 0 }, {19, 0}, {19, 19}, {0, 19}
};
/* Vertices for first face's area of PatBits */
Point PatVerts1[] = {
{ 0, 0 }, {4, 0}, {4, 5}, {0, 5}
};
/* Vertices for second face's area of PatBits */
Point PatVerts2[] = {
{ 4, 0 }, {8, 0}, {8, 5}, {4, 5}
};
typedef struct {
FaceNumber; /* index of face with the following texture */
TextureMap * TexMap; /* pointer to bitmap for texture mapping, if any */
Point * TexVerts; /* pointer to list of this polygon's vertices, in
TextureMap coordinates. Index n must map to index
n + 1 in VertNums, (the + 1 is to skip over the unit
normal endpoint in VertNums) */
} TexMap;
TexMap TexMaps[] = {
{ 39, &PatTex, PatVerts1 },
{ 40, &PatTex, PatVerts2 },
{ 47, &BearTex, BearVerts1 },
};
#define NUM_TEX_MAPS (sizeof(TexMaps)/sizeof(TexMap))
/* Starting coordinates for balls in world space */
static int BallStartCoords[NUM_BALLS][3] = {
{0,0,-300},
};
/* Delay counts (speed control) for balls */
static int InitRDelayCounts[NUM_BALLS] = {1};
static int BaseRDelayCounts[NUM_BALLS] = {1};
static int InitMDelayCounts[NUM_BALLS] = {1};
static int BaseMDelayCounts[NUM_BALLS] = {1};
void InitializeBalls()
{
int i, j, k, TexMapFound;
PObject *WorkingBall;
for (i=0; i<NUM_BALLS; i++) {
if ((WorkingBall = malloc(sizeof(PObject))) == NULL) {
printf("Couldn't get memory\n"); exit(1); }
WorkingBall->DrawFunc = DrawPObject;
WorkingBall->RecalcFunc = XformAndProjectPObject;
WorkingBall->MoveFunc = RotateAndMoveBall;
WorkingBall->RecalcXform = 1;
for (k=0; k<2; k++) {
WorkingBall->EraseRect[k].Left =
WorkingBall->EraseRect[k].Top = 0x7FFF;
WorkingBall->EraseRect[k].Right = 0;
WorkingBall->EraseRect[k].Bottom = 0;
}
WorkingBall->RDelayCount = InitRDelayCounts[i];
WorkingBall->RDelayCountBase = BaseRDelayCounts[i];
WorkingBall->MDelayCount = InitMDelayCounts[i];
WorkingBall->MDelayCountBase = BaseMDelayCounts[i];
/* Set the object->world xform to none */
for (j=0; j<3; j++)
for (k=0; k<4; k++)
WorkingBall->XformToWorld[j][k] = INT_TO_FIXED(0);
WorkingBall->XformToWorld[0][0] =
WorkingBall->XformToWorld[1][1] =
WorkingBall->XformToWorld[2][2] = INT_TO_FIXED(1);
/* Set the initial location */
for (j=0; j<3; j++) {
WorkingBall->XformToWorld[j][3] =
INT_TO_FIXED(BallStartCoords[i][j]);
}
/* Initial center coordinates */
WorkingBall->CenterInView.X = WorkingBall->XformToWorld[0][3];
WorkingBall->CenterInView.Y = WorkingBall->XformToWorld[1][3];
WorkingBall->CenterInView.Z = WorkingBall->XformToWorld[2][3];
WorkingBall->NumVerts = NUM_VERTS;
WorkingBall->NumRealVerts = NUM_REAL_VERTS;
WorkingBall->VertexList = Verts;
WorkingBall->NumFaces = NUM_FACES;
WorkingBall->Rotate = InitialRotate[i];
if ((WorkingBall->XformedVertexList =
malloc(NUM_VERTS*sizeof(Point3))) == NULL) {
printf("Couldn't get memory\n"); exit(1); }
if ((WorkingBall->ProjectedVertexList =
malloc(NUM_VERTS*sizeof(Point3))) == NULL) {
printf("Couldn't get memory\n"); exit(1); }
if ((WorkingBall->ScreenVertexList =
malloc(NUM_VERTS*sizeof(Point))) == NULL) {
printf("Couldn't get memory\n"); exit(1); }
if ((WorkingBall->FaceList =
malloc(NUM_FACES*sizeof(Face))) == NULL) {
printf("Couldn't get memory\n"); exit(1); }
/* Initialize the faces */
for (j=0; j<NUM_FACES; j++) {
WorkingBall->FaceList[j].VertNums = VertNumList[j];
WorkingBall->FaceList[j].NumVerts = VertsInFace[j];
WorkingBall->FaceList[j].FullColor.Red = Colors[i][j].Red;
WorkingBall->FaceList[j].FullColor.Green = Colors[i][j].Green;
WorkingBall->FaceList[j].FullColor.Blue = Colors[i][j].Blue;
if ((WorkingBall->FaceList[j].ShadingType = FaceShadings[i][j])
== NO_SHADING) {
/* If no shading is in effect, convert the color from the model
color to a color index, which we can then use directly */
WorkingBall->FaceList[j].ColorIndex =
ModelColorToColorIndex(&Colors[i][j]);
} else if (WorkingBall->FaceList[j].ShadingType ==
TEXTURE_MAPPED_SHADING) {
/* Search TexMaps for this face's texture mapping info */
TexMapFound = 0;
for (k=0; (k<NUM_TEX_MAPS) && !TexMapFound; k++) {
if (TexMaps[k].FaceNumber == j) {
WorkingBall->FaceList[j].TexMap = TexMaps[k].TexMap;
WorkingBall->FaceList[j].TexVerts = TexMaps[k].TexVerts;
TexMapFound = 1;
}
}
if (!TexMapFound) {
printf("Error: Texture mapping not found for face %d", j);
exit(1);
}
}
}
AddObject((Object *)WorkingBall);
}
}