-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmoteur.h
164 lines (145 loc) · 5.28 KB
/
moteur.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*!\file moteur.h
*
* \brief structures de données et protos de fonctions externes
* (primitives.c transformations.c et scene.c (pas encore créé)) pour
* réaliser un moteur de rendu par rastérisation.
*
* \author Farès BELHADJ, [email protected]
* \date November 25, 2020.
*/
#ifndef MOTEUR_H_SEEN
# define MOTEUR_H_SEEN
# include <GL4D/gl4dp.h>
# include <GL4D/gl4dm.h>
#include <float.h>
#define EPSILON ((double)FLT_EPSILON)
# ifdef __cplusplus
extern "C" {
# endif
typedef enum pstate_t pstate_t;
typedef enum soptions_t soptions_t;
typedef struct vec4 vec4;
typedef struct vec3 vec3;
typedef struct vec2 vec2;
typedef struct vertex_t vertex_t;
typedef struct triangle_t triangle_t;
typedef struct surface_t surface_t;
/*!\brief états pour les sommets ou les triangles */
enum pstate_t {
PS_NONE = 0,
PS_TOTALLY_OUT = 1,
PS_PARTIALLY_OUT = 2,
PS_CULL = 4, /* si en BACKFACE et que
SO_CULL_BACKFACES est actif */
PS_TOO_FAR = 8,
PS_OUT_LEFT = 16,
PS_OUT_RIGHT = 32,
PS_OUT_BOTTOM = 64,
PS_OUT_TOP = 128,
PS_OUT_NEAR = 256,
PS_OUT_FAR = 512
};
/*!\brief options pour les surfaces */
enum soptions_t {
SO_NONE = 0, /* la surface n'a pas de rendu
"couleur" */
SO_USE_TEXTURE = 1, /* utiliser la texture pour
colorer (multiplication si
SO_USE_COLOR est actif) */
SO_USE_COLOR = 2, /* utiliser la couleur de la
surface ou des sommets pour
colorer (multiplication si
SO_USE_TEXTURE est actif) */
SO_COLOR_MATERIAL = 4, /* utiliser la couleur aux
sommets si actif
(nécessite aussi
l'activation de
SO_USE_COLOR) */
SO_CULL_BACKFACES = 8, /* active le fait de cacher
les faces arrières */
SO_USE_LIGHTING = 16, /* active le calcul d'ombre
propre (Gouraud sur
diffus) */
SO_DEFAULT = SO_CULL_BACKFACES | SO_USE_COLOR /* comportement
par
défaut */
};
struct vec4 {
float x /* r */, y/* g */, z /* b */, w /* a */;
};
struct vec2 {
float x /* s */, y /* t */;
};
struct vec3 {
float x /* r */, y/* g */, z/* b */;
};
/*!\brief le sommet et l'ensemble de ses attributs */
struct vertex_t {
vec4 position;
vec4 color0;
/* début des données à partir desquelles on peut interpoler en masse */
vec2 texCoord; /* coordonnée de texture */
vec4 icolor; /* couleur à interpoler */
float li; /* intensité de lumière (lambertien) */
float zmod; /* z après modelview, sert à corriger
l'interpolation par rapport à une projection en
perspective */
float z; /* ce z représente la depth */
/* fin des données à partir desquelles on peut interpoler */
vec3 normal; /* interpolez les normales si vous implémentez Phong */
int x, y;
enum pstate_t state;
};
/*!\brief le triangle */
struct triangle_t {
vertex_t v[3];
vec3 normal;
enum pstate_t state;
};
/*!\brief la surface englobe plusieurs triangles et des options
* telles que le type de rendu, la couleur diffuse ou la texture.
*/
struct surface_t {
int n;
triangle_t * t;
GLuint texId;
vec4 dcolor; /* couleur diffuse, ajoutez une couleur ambiante et
spéculaire si vous souhaitez compléter le
modèle */
soptions_t options; /* paramétrage du rendu de la surface */
void (*interpolatefunc)(vertex_t *, vertex_t *, vertex_t *, float, float);
void (*shadingfunc)(surface_t *, GLuint *, vertex_t *);
};
/* dans primitives.c */
extern void transform_n_raster(surface_t * s, float * mvMat, float * projMat);
extern void clearDepth(void);
extern void setTexture(GLuint screen);
extern void updatesfuncs(surface_t * s);
extern void drawLine(int x0, int y0, int x1, int y1, GLuint color);
/* dans tranformations.c */
extern vertex_t vtransform(surface_t * s, vertex_t v, float * mvMat, float * timvMat, float * projMat, float * viewport);
extern void stransform(surface_t * s, float * mvMat, float * projMat, float * viewport);
extern void multMatrix(float * res, float * m);
extern void translate(float * m, float tx, float ty, float tz);
extern void rotate(float * m, float angle, float x, float y, float z);
extern void scale(float * m, float sx, float sy, float sz);
extern void lookAt(float * m, float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ);
/* dans scene.c */
extern void tnormal(triangle_t * t);
extern void snormals(surface_t * s);
extern void tnormals2vertices(surface_t * s);
extern void setTexId(surface_t * s, GLuint texId);
extern void setDiffuseColor(surface_t * s, vec4 dcolor);
extern void enableSurfaceOption(surface_t * s, soptions_t option);
extern void disableSurfaceOption(surface_t * s, soptions_t option);
extern surface_t * newSurface(triangle_t * t, int n, int duplicateTriangles, int hasNormals);
extern void freeSurface(surface_t * s);
extern GLuint getTexFromBMP(const char * filename);
/* dans geometry.c */
extern surface_t * mkQuad(void);
extern surface_t * mkCube(void);
extern surface_t * mkSphere(int longitudes, int latitudes);
# ifdef __cplusplus
}
# endif
#endif