#ifndef DEFINE_H #define DEFINE_H // #define MINIMAL_PLAYER #include #include #ifndef MINIMAL_PLAYER #include // Uniquement nécessaire pour la génération #endif #include #include #include #define MODE_WIRE 0 #define MODE_HIDDEN 1 #define MODE_SOLID 2 #define SCREEN_W 320 #define SCREEN_H 200 #define SCREEN_PIXELS (SCREEN_W * SCREEN_H) #define MAX_VERTEX 5000 #define MAX_FACES 8000 #define MAX_OBJECTS 64 typedef struct { uint8_t r, g, b; } RGB; #define COLOR0 0 // 0: Noir #define COLOR1 1 // 1: Rouge vif #define COLOR2 2 // 2: Vert vif #define COLOR3 3 // 3: Bleu vif #define COLOR4 4 // 4: Jaune #define COLOR5 5 // 5: Magenta #define COLOR6 6 // 6: Cyan #define COLOR7 7 // 7: Blanc #define COLOR8 8 // 8: Rouge sombre #define COLOR9 9 // 9: Vert sombre #define COLOR10 10 // 10: Bleu sombre #define COLOR11 11 // 11: Gris #define COLOR12 12 // 12: Orange #define COLOR13 13 // 13: Citron vert #define COLOR14 14 // 14: Marron #define COLOR15 15 // 15: Bleu nuit typedef int32_t fixed; #define f_to_int(a) ((a) >> 16) #define int_to_f(a) ((a) << 16) static __inline fixed f_mul(fixed a, fixed b) { return (fixed)(((int64_t)a * b) >> 16); } static __inline fixed f_div(fixed a, fixed b) { if (b == 0) return 0; return (fixed)(((int64_t)a << 16) / b); } typedef struct { fixed m[3][3]; } Matrix3; typedef struct { fixed x, y, z; } Vector3; typedef struct { int a, b, c; uint8_t force_wire; } Face; typedef struct { int x, y; fixed z; fixed intensity; } Point2D; /* Un objet dans l'univers : tranche du pool partagé + transform */ typedef struct { int vert_start, num_verts; /* indices dans Universe.verts/v_normals */ int face_start, num_faces; /* indices dans Universe.faces */ Vector3 pos; /* position monde courante (mise à jour par orbite) */ Vector3 base_pos; /* offset par rapport au centre d'orbite */ Matrix3 rot; uint8_t color; } Object3D; /* Pool unique pour toute la scène */ typedef struct { Vector3 verts[MAX_VERTEX]; Vector3 v_normals[MAX_VERTEX]; Face faces[MAX_FACES]; int num_verts, num_faces; Object3D objects[MAX_OBJECTS]; int num_objects; } Universe; typedef struct { Vector3 pos; } Camera; /* Mesh dynamique conservé pour save/load uniquement */ typedef struct { Vector3 *verts; Vector3 *v_normals; Face *faces; int num_verts, num_faces; } Mesh; /* Globales */ extern fixed sintab[360], costab[360]; extern Point2D v_cache[MAX_VERTEX]; extern uint8_t *backbuffer; extern uint16_t *zbuffer; extern uint8_t *vga; /* Prototypes */ /* Type pour les fonctions de génération de surface : reçoit x, z et renvoie y */ typedef fixed (*SurfaceFunc)(fixed x, fixed z); void init_engine_math(void); void mat3_identity(Matrix3 *mat); void mat3_rotate_x(Matrix3 *m, int angle); void mat3_rotate_y(Matrix3 *m, int angle); void mat3_mul(Matrix3 *res, Matrix3 *a, Matrix3 *b); void set_object_pos (Object3D *obj, fixed x, fixed y, fixed z); void move_object (Object3D *obj, fixed dx, fixed dy, fixed dz); void set_object_color (Object3D *obj, uint8_t col); void bake_object_rotation(Universe *uni, Object3D *obj, int ax, int ay, int az); /* Retournent un pointeur sur le nouvel Object3D, NULL si pool saturé */ Object3D* add_box (Universe *uni, fixed x, fixed y, fixed z, fixed dx, fixed dy, fixed dz, uint8_t col, uint8_t wire); Object3D* add_sphere (Universe *uni, fixed x, fixed y, fixed z, fixed r, int det, uint8_t col, uint8_t wire); Object3D* add_cylinder (Universe *uni, fixed x, fixed y, fixed z, fixed r, fixed h, int det, uint8_t col, uint8_t wire); Object3D* add_cone (Universe *uni, fixed x, fixed y, fixed z, fixed r, fixed h, int det, uint8_t col, uint8_t wire); Object3D* add_plane (Universe *uni, fixed x, fixed y, fixed z, fixed w, fixed d, int seg_x, int seg_z, uint8_t col, uint8_t wire); Object3D* add_torus (Universe *uni, fixed x, fixed y, fixed z, fixed r_main, fixed r_tube, int seg_main, int seg_tube, uint8_t col, uint8_t wire); Object3D* add_math_surface(Universe *uni, fixed x, fixed y, fixed z, fixed w, fixed d, int seg_x, int seg_z, uint8_t col, uint8_t wire, SurfaceFunc func); void render_universe(Universe *uni, Camera *cam, int mode); int init_vga(void); void clear_buffers(uint8_t color); void flip(void); void close_vga(void); void fill_triangle_gouraud(Point2D *p1, Point2D *p2, Point2D *p3, uint8_t base_color); void draw_line_z(Point2D *p1, Point2D *p2, uint8_t col, int z_test); void save_mesh(Mesh *m, const char *fn); Mesh *load_mesh(const char *fname); void free_mesh(Mesh *m); #endif