home *** CD-ROM | disk | FTP | other *** search
- /* 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);