/* POLYGON.H: Header file for polygon-filling code, also includes a number of useful items for 3D animation. */ #define MAX_OBJECTS 100 /* max simultaneous # objects supported */ #define MAX_POLY_LENGTH 4 /* four vertices is the max per poly */ #define SCREEN_WIDTH 320 #define SCREEN_HEIGHT 240 #define PAGE0_START_OFFSET 0 #define PAGE1_START_OFFSET (((long)SCREEN_HEIGHT*SCREEN_WIDTH)/4) #define NUM_CUBE_VERTS 8 /* # of vertices per cube */ #define NUM_CUBE_FACES 6 /* # of faces per cube */ /* Ratio: distance from viewpoint to projection plane / width of projection plane. Defines the width of the field of view. Lower absolute values = wider fields of view; higher values = narrower */ #define PROJECTION_RATIO -2.0 /* negative because visible Z coordinates are negative */ /* Draws the polygon described by the point list PointList in color Color with all vertices offset by (X,Y) */ #define DRAW_POLYGON(PointList,NumPoints,Color,X,Y) \ Polygon.Length = NumPoints; Polygon.PointPtr = PointList; \ FillConvexPolygon(&Polygon, Color, X, Y); #define INT_TO_FIXED(x) (((long)(int)x) << 16) #define DOUBLE_TO_FIXED(x) ((long) (x * 65536.0 + 0.5)) typedef long Fixedpoint; typedef unsigned int TAngle; /* angle in tenths of degrees */ typedef Fixedpoint Xform[3][4]; /* Describes a single 2D point */ typedef struct _Point { int X; int Y; } Point; /* Describes a single 3D point in homogeneous coordinates; the W coordinate isn't present, though; assumed to be 1 and implied */ typedef struct _Point3 { Fixedpoint X, Y, Z; } Point3; typedef struct { int X; int Y; int Z; } IntPoint3; /* Describes a series of points (used to store a list of vertices that describe a polygon; each vertex is assumed to connect to the two adjacent vertices; last vertex is assumed to connect to first) */ typedef struct { int Length; Point * PointPtr; } PointListHeader; /* Describes the beginning and ending X coordinates of a single horizontal line */ typedef struct { int XStart; int XEnd; } HLine; /* Describes a Length-long series of horizontal lines, all assumed to be on contiguous scan lines starting at YStart and proceeding downward (used to describe a scan-converted polygon to the low-level hardware-dependent drawing code) */ typedef struct { int Length; int YStart; HLine * HLinePtr;} HLineList; typedef struct { int Left, Top, Right, Bottom; } Rect; /* Structure describing one face of an object (one polygon) */ typedef struct { int * VertNums; int NumVerts; int Color; } Face; typedef struct { TAngle RotateX, RotateY, RotateZ; } RotateControl; typedef struct { Fixedpoint MoveX, MoveY, MoveZ, MinX, MinY, MinZ, MaxX, MaxY, MaxZ; } MoveControl; /* Fields common to every object */ #define BASE_OBJECT \ struct _Object *NextObject; \ struct _Object *PreviousObject; \ Point3 CenterInView; /* coord of center in view space */ \ void (*DrawFunc)(); /* draws object */ \ void (*RecalcFunc)(); /* prepares object for drawing */ \ void (*MoveFunc)(); /* moves object */ \ int RecalcXform; /* 1 to indicate need to recalc */ \ Rect EraseRect[2]; /* rectangle to erase in each page */ /* Basic object */ typedef struct _Object { BASE_OBJECT } Object; /* Structure describing a polygon-based object */ typedef struct { BASE_OBJECT int RDelayCount, RDelayCountBase; /* controls rotation speed */ int MDelayCount, MDelayCountBase; /* controls movement speed */ Xform XformToWorld; /* transform from object->world space */ Xform XformToView; /* transform from object->view space */ RotateControl Rotate; /* controls rotation change over time */ MoveControl Move; /* controls object movement over time */ int NumVerts; /* # vertices in VertexList */ Point3 * VertexList; /* untransformed vertices */ Point3 * XformedVertexList; /* transformed into view space */ Point3 * ProjectedVertexList; /* projected into screen space */ Point * ScreenVertexList; /* converted to screen coordinates */ int NumFaces; /* # of faces in object */ Face * FaceList; /* pointer to face info */ } PObject; extern void XformVec(Xform, Fixedpoint *, Fixedpoint *); extern void ConcatXforms(Xform, Xform, Xform); extern int FillConvexPolygon(PointListHeader *, int, int, int); extern void Set320x240Mode(void); extern void ShowPage(unsigned int); extern void FillRectangleX(int, int, int, int, unsigned int, int); extern void XformAndProjectPObject(PObject *); extern void DrawPObject(PObject *); extern void AppendRotationX(Xform, TAngle); extern void AppendRotationY(Xform, TAngle); extern void AppendRotationZ(Xform, TAngle); extern near Fixedpoint FixedMul(Fixedpoint, Fixedpoint); extern near Fixedpoint FixedDiv(Fixedpoint, Fixedpoint); extern void InitializeFixedPoint(void); extern void RotateAndMovePObject(PObject *); extern void InitializeCubes(void); extern void InitializeBalls(void); extern int DisplayedPage, NonDisplayedPage, RecalcAllXforms; extern int NumObjects; extern Object ObjectListStart, ObjectListEnd; extern Xform WorldViewXform; extern Object *ObjectList[]; extern Point3 CubeVerts[]; extern void CosSin(TAngle, Fixedpoint *, Fixedpoint *); extern void AddObject(Object *); extern void SortObjects(void); extern void InitializeObjectList(void);