Previous | Table of Contents | Next

LISTING 50.4 POLYGON.H

    /* POLYGON.H: Header file for polygon-filling code, also includes
       a number of useful items for 3-D 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 2-D point */
    struct Point {
       int X;   /* X coordinate */
       int Y;   /* Y coordinate */
    };
    /* Describes a single 3-D 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; };

    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 int DisplayedPage, NonDisplayedPage;
    extern struct Rect EraseRect[];

Previous | Table of Contents | Next

Graphics Programming Black Book © 2001 Michael Abrash