/* POLYGON.H: Header file for polygon-filling code, also includes a number of useful items for 3D animation. */ #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) /* 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); /* Describes a single 2D point */ struct Point { int X; /* X coordinate */ int Y; /* Y coordinate */ }; /* Describes a single 3D point in homogeneous coordinates */ struct Point3 { double X; /* X coordinate */ double Y; /* Y coordinate */ double Z; /* Z coordinate */ double W; }; /* 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, and the last vertex is assumed to connect to the first) */ struct PointListHeader { int Length; /* # of points */ struct Point * PointPtr; /* pointer to list of points */ }; /* Describes the beginning and ending X coordinates of a single horizontal line */ struct HLine { int XStart; /* X coordinate of leftmost pixel in line */ int XEnd; /* X coordinate of rightmost pixel in line */ }; /* 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) */ struct HLineList { int Length; /* # of horizontal lines */ int YStart; /* Y coordinate of topmost line */ struct HLine * HLinePtr; /* pointer to list of horz lines */ }; struct Rect { int Left, Top, Right, Bottom; }; /* Structure describing one face of an object (one polygon) */ struct Face { int * VertNums; /* pointer to vertex ptrs */ int NumVerts; /* # of vertices */ int Color; /* polygon color */ }; /* Structure describing an object */ struct Object { int NumVerts; struct Point3 * VertexList; struct Point3 * XformedVertexList; struct Point3 * ProjectedVertexList; struct Point * ScreenVertexList; int NumFaces; struct Face * FaceList; }; extern void XformVec(double Xform[4][4], double * SourceVec, double * DestVec); extern void ConcatXforms(double SourceXform1[4][4], double SourceXform2[4][4], double DestXform[4][4]); extern void XformAndProjectPoly(double Xform[4][4], struct Point3 * Poly, int PolyLength, int Color); extern int FillConvexPolygon(struct PointListHeader *, int, int, int); extern void Set320x240Mode(void); extern void ShowPage(unsigned int StartOffset); extern void FillRectangleX(int StartX, int StartY, int EndX, int EndY, unsigned int PageBase, int Color); extern void XformAndProjectPoints(double Xform[4][4], struct Object * ObjectToXform); extern void DrawVisibleFaces(struct Object * ObjectToXform); extern void AppendRotationX(double XformToChange[4][4], double Angle); extern void AppendRotationY(double XformToChange[4][4], double Angle); extern void AppendRotationZ(double XformToChange[4][4], double Angle); extern int DisplayedPage, NonDisplayedPage; extern struct Rect EraseRect[];