/* 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_OBJECTS 100 /* nombre maximal d'objets simultanément supportés */ #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) #define NUM_CUBE_VERTS 8 /* nombre de points par cube */ #define NUM_CUBE_FACES 6 /* nombre de faces par cube */ /* 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. Les valeurs absolues inférieures = champs de vision plus larges; les valeurs supérieures = champs de vision plus étroits */ #define PROJECTION_RATIO -2.0 /* négatif 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 déplacés par (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 Fixedpoint Xform[3][4]; /* Décrit un seul point 2D */ typedef struct { int X; int Y; } Point; /* Décrit un seul point 3D en coordonnées homogènes; la coordonnée W n'est pas présente; supposée être à 1 et sous-entendue */ typedef struct { Fixedpoint X, Y, Z; } Point3; typedef struct { int X; int Y; int Z; } IntPoint3; /* 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; le dernier point supposé se connecter au premier) */ typedef struct { int Length; Point * PointPtr; } PointListHeader; /* Décrit les coordonnées X de début et de fin d'une seule ligne horizontale */ typedef struct { int XStart; int XEnd; } HLine; /* Décrit une série Length-long de 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 numérisé dans le code de tracé de bas niveau dépendant du matériel) */ typedef struct { int Length; int YStart; HLine * HLinePtr;} HLineList; typedef struct { int Left, Top, Right, Bottom; } Rect; /* Structure décrivant une face d'un objet (un polygone) */ typedef struct { int * VertNums; int NumVerts; int Color; } Face; typedef struct { double RotateX, RotateY, RotateZ; } RotateControl; typedef struct { Fixedpoint MoveX, MoveY, MoveZ, MinX, MinY, MinZ, MaxX, MaxY, MaxZ; } MoveControl; /* Champs communs à chaque objet */ #define BASE_OBJECT \ void (*DrawFunc)(); /* affiche l'objet */ \ void (*RecalcFunc)(); /* prépare l'objet pour afficher */ \ void (*MoveFunc)(); /* déplace l'objet */ \ int RecalcXform; /* 1 pour indiquer la nécessité de recalculer */ \ Rect EraseRect[2]; /* rectangle à supprimer dans chaque page */ /* Objet de base */ typedef struct { BASE_OBJECT } Object; /* Structure décrivant un objet basé sur des polygones */ typedef struct { BASE_OBJECT int RDelayCount, RDelayCountBase; /* contrôle la vitesse de rotation */ int MDelayCount, MDelayCountBase; /* contrôle la vitesse du mouvement */ Xform XformToWorld; /* transforme objet->espace monde */ Xform XformToView; /* transforme objet->espace de visualisation */ RotateControl Rotate; /* contrôle le changement de rotation dans le temps */ MoveControl Move; /* contrôle le mouvement de l'objet dans le temps */ int NumVerts; /* nombre de points dans VertexList */ Point3 * VertexList; /* points non transformés */ Point3 * XformedVertexList; /* transformé dans l'espace de visualisation */ Point3 * ProjectedVertexList; /* projeté dans l'espace écran */ Point * ScreenVertexList; /* converti en coordonnées d'écran */ int NumFaces; /* nombre de faces de l'objet */ Face * FaceList; /* pointeur sur l'info de la face */ } 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, double); extern void AppendRotationY(Xform, double); extern void AppendRotationZ(Xform, double); 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 int DisplayedPage, NonDisplayedPage, RecalcAllXforms; extern int NumObjects; extern Xform WorldViewXform; extern Object *ObjectList[]; extern Point3 CubeVerts[];