/* POLYGON.H: Fichier en-tête du code de remplissage de polygone, inclut également un certain nombre d'éléments utiles pour l'animation 3D. */ #define MAX_POLY_LENGTH 4 /* quatre points maximum par polygone */ #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 entre le point de vue et le plan de projection/largeur du plan de projection. Définit la largeur du champ de vision. Plus la valeur absolue est petites et plus le champ de vision est large et inversement. */ #define PROJECTION_RATIO -2.0 /* négative car les coordonnées Z visibles sont négatives */ /* Affiche le polygone décrit par la liste de points PointList dans la couleur Color avec tous les points au format(X,Y) */ #define DRAW_POLYGON(PointList,NumPoints,Color,X,Y) \ Polygon.Length = NumPoints; Polygon.PointPtr = PointList; \ FillConvexPolygon(&Polygon, Color, X, Y); /* Décrit un point 2D */ struct Point { int X; /* X coordinate */ int Y; /* Y coordinate */ }; /* Décrit un point 3D en coordonnées homogènes */ struct Point3 { double X; /* coordonnée X */ double Y; /* coordonnée Y */ double Z; /* coordonnée Z */ double W; }; /* Décrit une série de points (utilisée pour stocker les points qui décrivent un polygone; chaque point est supposé se connecter aux deux points adjacents, et le dernier point est supposé se connecter au premier ) */ struct PointListHeader { int Length; /* nombre de points */ struct Point * PointPtr; /* pointeur sur la liste des points */ }; /* Décrit les coordonnées X de début et de fin d'une seule ligne horizontale */ struct HLine { int XStart; /* coordonnée X du pixel le plus à gauche dans la ligne */ int XEnd; /* coordonnée X du pixel le plus à droite dans la ligne */ }; /* Décrit une série de Length-long lignes horizontales, toutes supposées être sur des lignes d'affichage contiguës commençant en YStart et allant vers le bas(décrit un polygone pour le code de tracé de bas niveau dépendant du matériel) */ struct HLineList { int Length; /* nombre de lignes horizontales */ int YStart; /* coordonnée Y de la ligne la plus haute */ struct HLine * HLinePtr; /* pointeur sur la liste des lignes horizontales */ }; struct Rect { int Left, Top, Right, Bottom; }; /* Structure décrivant une face d'un objet (un polygone) */ struct Face { int * VertNums; /* pointeur sur les pointeurs des points */ int NumVerts; /* nombre de points */ int Color; /* couleur du polygone */ }; /* Structure décrivant un objet */ 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[];