home *** CD-ROM | disk | FTP | other *** search
/ Graphics Programming Black Book (Special Edition) / BlackBook.bin / disk1 / xsharp22 / polygon.h < prev    next >
Text File  |  1997-06-18  |  11KB  |  265 lines

  1. /* POLYGON.H: Header file for filled polygon drawing and 3D animation. */
  2.  
  3. #define MAX_OBJECTS  100   /* max simultaneous # objects supported */
  4. #define MAX_POLY_LENGTH 4  /* four vertices is the max per poly */
  5. #define SCREEN_WIDTH 320
  6. #define SCREEN_HEIGHT 240
  7. #define PAGE0_START_OFFSET 0
  8. #define PAGE1_START_OFFSET (((long)SCREEN_HEIGHT*SCREEN_WIDTH)/4)
  9.  
  10. /* Ball movement flags */
  11. #define MOVE_LEFT       0x0001
  12. #define MOVE_RIGHT      0x0002
  13. #define MOVE_UP         0x0004
  14. #define MOVE_DOWN       0x0008
  15. #define MOVE_TOWARD     0x0010
  16. #define MOVE_AWAY       0x0020
  17. #define FLIP_SPIN_AXIS  0x0040
  18.  
  19. /* Maximum number of simultaneously active spotlights */
  20. #define MAX_SPOTS 3
  21.  
  22. /* Ratio: distance from viewpoint to projection plane / width of
  23.    projection plane. Defines the width of the field of view. Lower
  24.    absolute values = wider fields of view; higher values = narrower */
  25. #define PROJECTION_RATIO -2.0 /* negative because visible Z
  26.                                  coordinates are negative */
  27.  
  28. /* Draws the polygon described by the point list PointList in color
  29.    Color with all vertices offset by (X,Y) */
  30. #define DRAW_POLYGON(PointList,NumPoints,Color,X,Y)          \
  31.    Polygon.Length = NumPoints; Polygon.PointPtr = PointList; \
  32.    FillConvexPolygon(&Polygon, Color, X, Y);
  33.  
  34. /* Draws the polygon described by the point list PointList with a bitmap
  35.    texture mapped onto it */
  36. #define DRAW_TEXTURED_POLYGON(PointList,NumPoints,TexVerts,TexMap) \
  37.    Polygon.Length = NumPoints; Polygon.PointPtr = PointList;       \
  38.    DrawTexturedPolygon(&Polygon, TexVerts, TexMap);
  39.  
  40. #define INT_TO_FIXED(x) (((long)(int)x) << 16)
  41. #define DOUBLE_TO_FIXED(x) ((long) (x * 65536.0 + 0.5))
  42. #define FIXED_TO_DOUBLE(x) (((double)x) / 65536.0)
  43. #define FIXED_TO_INT(FixedVal) ((int) (FixedVal >> 16))
  44. #define ROUND_FIXED_TO_INT(FixedVal) \
  45.    ((int) ((FixedVal + DOUBLE_TO_FIXED(0.5)) >> 16))
  46.  
  47. /* Sets a color intensity to the specified levels */
  48. #define SET_INTENSITY(IntensityTemp, R, G, B) \
  49.    IntensityTemp.Red = DOUBLE_TO_FIXED(R);       \
  50.    IntensityTemp.Green = DOUBLE_TO_FIXED(G);     \
  51.    IntensityTemp.Blue = DOUBLE_TO_FIXED(B);
  52.  
  53. /* Converts a color component value between 0 and 1 to an R, G, or B
  54.    value between 0 and 255. Allows expressing color components as fractions
  55.    in the range 0 and 1, although internally (in ModelColor structures)
  56.    they're actually represented as values between 0 and 255 */
  57. #define CCOMP(Color) ((Color<0) ? 0 : \
  58.    ((Color>=1) ? 255 : ((double)Color*255.0+0.5)))
  59.  
  60. /* Calculates dot product */
  61. #define DOT_PRODUCT(V1,V2) \
  62.    (FixedMul(V1.X,V2.X)+FixedMul(V1.Y,V2.Y)+FixedMul(V1.Z,V2.Z))
  63.  
  64. /* Retrieves the specified pixel from the specified image bitmap of the
  65.    specified width. */
  66. #define GET_IMAGE_PIXEL(TexMapBits, TexMapWidth, X, Y) \
  67.    TexMapBits[(Y * TexMapWidth) + X]
  68.  
  69. /* Masks to mark shading types in Face structure */
  70. #define NO_SHADING      0x0000
  71. #define AMBIENT_SHADING 0x0001
  72. #define DIFFUSE_SHADING 0x0002
  73. #define TEXTURE_MAPPED_SHADING 0x0004
  74.  
  75. typedef long Fixedpoint;
  76. typedef unsigned int TAngle;  /* angle in tenths of degrees */
  77. typedef Fixedpoint Xform[3][4];
  78.  
  79. /* Describes a single 2D point */
  80. typedef struct _Point {
  81.    int X;
  82.    int Y;
  83. } Point;
  84.  
  85. /* Describes a color in the current color model, the RGB color cube */
  86. typedef struct _ModelColor {
  87.    unsigned char Red;   /* 255 = max red, 0 = no red */
  88.    unsigned char Green; /* 255 = max green, 0 = no green */
  89.    unsigned char Blue;  /* 255 = max blue, 0 = no blue */
  90. } ModelColor;
  91.  
  92. /* Describes an intensity in the current color model, the RGB color cube */
  93. typedef struct _ModelIntensity {
  94.    Fixedpoint Red;
  95.    Fixedpoint Green;
  96.    Fixedpoint Blue;
  97. } ModelIntensity;
  98.  
  99. /* Describes a single 3D point in homogeneous coordinates; the W
  100.    coordinate isn't present, though; assumed to be 1 and implied */
  101. typedef struct _Point3 {
  102.    Fixedpoint X;
  103.    Fixedpoint Y;
  104.    Fixedpoint Z;
  105. } Point3;
  106.  
  107. typedef struct {
  108.    int X;
  109.    int Y;
  110.    int Z;
  111. } IntPoint3;
  112.  
  113. /* Describes a series of points (used to store a list of vertices that
  114.    describe a polygon; each vertex is assumed to connect to the two
  115.    adjacent vertices; last vertex is assumed to connect to first) */
  116. typedef struct {
  117.    int Length;
  118.    Point * PointPtr;
  119. } PointListHeader;
  120.  
  121. /* Describes the beginning and ending X coordinates of a single
  122.    horizontal line */
  123. typedef struct {
  124.    int XStart;
  125.    int XEnd;
  126. } HLine;
  127.  
  128. /* Describes a Length-long series of horizontal lines, all assumed to
  129.    be on contiguous scan lines starting at YStart and proceeding
  130.    downward (used to describe a scan-converted polygon to the
  131.    low-level hardware-dependent drawing code) */
  132. typedef struct {
  133.    int Length;
  134.    int YStart;
  135.    HLine * HLinePtr;
  136. } HLineList;
  137.  
  138. /* Describes a rectangle */
  139. typedef struct {
  140.    int Left;
  141.    int Top;
  142.    int Right;
  143.    int Bottom;
  144. } Rect;
  145.  
  146. /* Describes a texture map */
  147. typedef struct {
  148.    int TexMapWidth;  /* texture map width in bytes */
  149.    char *TexMapBits; /* pointer to texture bitmap */
  150. } TextureMap;
  151.  
  152. /* Structure describing one face of an object (one polygon) */
  153. typedef struct {
  154.    int * VertNums;   /* pointer to list of indexes of this polygon's
  155.                         vertices in the object's vertex list. The first two
  156.                         indexes must select the end and start points,
  157.                         respectively, of this polygon's unit normal vector.
  158.                         The second point should also be an active polygon
  159.                         vertex */
  160.    int NumVerts;     /* # of verts in face, not including the initial
  161.                         vertex, which must be the end of a unit normal vector
  162.                         that starts at the second index in VertNums */
  163.    int ColorIndex;   /* direct palette index; used only for non-shaded
  164.                         faces */
  165.    ModelColor FullColor; /* polygon's color */
  166.    int ShadingType;  /* none, ambient, diffuse, texture mapped, etc. */
  167.    TextureMap * TexMap; /* pointer to bitmap for texture mapping, if any */
  168.    Point * TexVerts; /* pointer to list of this polygon's vertices, in
  169.                         TextureMap coordinates. Index n must map to index
  170.                         n + 1 in VertNums, (the + 1 is to skip over the unit
  171.                         normal endpoint in VertNums) */
  172. } Face;
  173.  
  174. typedef struct { TAngle RotateX, RotateY, RotateZ; } RotateControl;
  175.  
  176. /* Fields common to every object */
  177. #define BASE_OBJECT                                              \
  178.    struct _Object *NextObject;                                   \
  179.    struct _Object *PreviousObject;                               \
  180.    Point3 CenterInView;    /* coord of center in view space */   \
  181.    void (*DrawFunc)();     /* draws object */                    \
  182.    void (*RecalcFunc)();   /* prepares object for drawing */     \
  183.    void (*MoveFunc)();     /* moves object */                    \
  184.    int RecalcXform;        /* 1 to indicate need to recalc */    \
  185.    Rect EraseRect[2];      /* rectangle to erase in each page */
  186. /* Basic object */
  187. typedef struct _Object { BASE_OBJECT } Object;
  188. /* Structure describing a polygon-based object */
  189. typedef struct {
  190.    BASE_OBJECT
  191.    int RDelayCount, RDelayCountBase; /* controls rotation speed */
  192.    int MDelayCount, MDelayCountBase; /* controls movement speed */
  193.    Xform XformToWorld;        /* transform from object->world space */
  194.    Xform XformToView;         /* transform from object->view space */
  195.    RotateControl Rotate;      /* controls rotation change over time */
  196.    int NumVerts;              /* # vertices in VertexList */
  197.    int NumRealVerts;          /* # vertices that aren't unit normal
  198.                                  endpoints. Unit normal endpoints must appear
  199.                                  last in VertexList, and aren't transformed
  200.                                  into screen space or screen coordinates */
  201.    Point3 * VertexList;       /* untransformed vertices */
  202.    Point3 * XformedVertexList;   /* transformed into view space */
  203.    Point3 * ProjectedVertexList; /* projected into screen space */
  204.    Point * ScreenVertexList;     /* converted to screen coordinates */
  205.    int NumFaces;              /* # of faces in object */
  206.    Face * FaceList;           /* pointer to face info */
  207. } PObject;
  208.  
  209. extern void XformVec(Xform, Fixedpoint *, Fixedpoint *);
  210. extern void ConcatXforms(Xform, Xform, Xform);
  211. extern int FillConvexPolygon(PointListHeader *, int, int, int);
  212. extern void SetGraphicsMode(void);
  213. extern void ShowPage(unsigned int);
  214. extern void FillRectangleX(int, int, int, int, unsigned int, int);
  215. extern void XformAndProjectPObject(PObject *);
  216. extern void DrawPObject(PObject *);
  217. extern void AppendRotationX(Xform, TAngle);
  218. extern void AppendRotationY(Xform, TAngle);
  219. extern void AppendRotationZ(Xform, TAngle);
  220. extern Fixedpoint FixedMul(Fixedpoint, Fixedpoint);
  221. extern Fixedpoint FixedDiv(Fixedpoint, Fixedpoint);
  222. extern void InitializeFixedPoint(void);
  223. extern void RotateAndMoveBall(PObject *);
  224. extern void InitializeCubes(void);
  225. extern void InitializeBalls(void);
  226. extern void CosSin(TAngle, Fixedpoint *, Fixedpoint *);
  227. extern void AddObject(Object *);
  228. extern void SortObjects(void);
  229. extern void InitializeObjectList(void);
  230. extern int ModelColorToColorIndex(ModelColor * Color);
  231. extern void IntensityAdjustColor(ModelColor *, ModelColor *,
  232.    ModelIntensity *);
  233. extern void InitializeLighting(void);
  234. extern void SetAmbientIntensity(ModelIntensity *);
  235. extern ModelIntensity * GetAmbientIntensity(void);
  236. extern void TurnSpotOn(int);
  237. extern void TurnSpotOff(int);
  238. extern void SetSpotDirection(int, Point3 *);
  239. extern void SetSpotIntensity(int, ModelIntensity *);
  240. extern Point3 * GetSpotDirection(int);
  241. extern ModelIntensity * GetSpotIntensity(int);
  242. extern int GetSpotState(int);
  243. extern void TurnAmbientOn(void);
  244. extern void TurnAmbientOff(void);
  245. extern int GetAmbientState(void);
  246. extern void DrawTexturedPolygon(PointListHeader *, Point *, TextureMap *);
  247. extern void WritePixelX(int, int, int);
  248. extern int DisplayedPage, NonDisplayedPage, RecalcAllXforms;
  249. extern int NumObjects;
  250. extern Object ObjectListStart, ObjectListEnd;
  251. extern Xform WorldViewXform;
  252. extern Object *ObjectList[];
  253. extern Point3 CubeVerts[];
  254. extern unsigned int CurrentPageBase;
  255. extern unsigned int PageStartOffsets[2];
  256. extern int ClipMinX, ClipMinY, ClipMaxX, ClipMaxY;
  257. extern ModelIntensity AmbientIntensity;
  258. extern Point3 SpotDirectionWorld[];
  259. extern Point3 SpotDirectionView[];
  260. extern ModelIntensity SpotIntensity[];
  261. extern int SpotOn[];
  262. extern int AmbientOn;
  263. extern int BallEvent;
  264.  
  265.