/* POLYGON.H: Fichier d'en-tête du code de remplissage de polygone, inclut des d'éléments utiles pour l'animation 3D. */ #define MAX_POLY_LENGTH 4 /* quatre points max 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 du point de vue au plan de projection / largeur du plan de projection. Définit la largeur du champ visuel. Plus la valeurs absolues est petite plus le champs visuels est larges 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. Tout les points sont 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; /* coordonnée X */ int Y; /* coordonnée Y */ }; /* 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 une liste de points qui décrit 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 de points */ }; /* Décrit les coordonnées X du début et de fin d'une 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(utilisé pour décrire un polygone pour le code d'affichage de bas niveau dépendant du matériel) */ struct HLineList { int Length; /* nombre de lignes horizontales */ int YStart; /* coordonnée Y de la ligne supérieure */ struct HLine * HLinePtr; /* pointeur sur la liste de lignes horizontales */ }; 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[];