L'avantage d'utiliser les macro est que l'on a pas à réécrire un fichier en entier, et donc, que l'on garde une certaine cohérence dans le projet.
Modifions le destructeur :
1
2
3
4
5
6
7
|
PAppSdlOpenGl3::~PAppSdlOpenGl3(){
#ifdef USE_NEW_MATRICE_C
freePMat4fGl3(p_matModelview);
freePMat4fGl3(p_matProjection);
#endif
SDL_Quit();
}
|
Modifions la fonction executer
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
|
int PAppSdlOpenGl3::executer(){
if(!p_isOpenGlSdlInit) return 1;
p_isRun = true;
while(p_isRun){
p_start_time = SDL_GetTicks();
this->clearKeyStatesNoRepeat();
while(SDL_PollEvent(&p_evenements)){
this->updateWithEvent(&p_evenements);
this->getEvent(&p_evenements);
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
this->update(p_timeForOneFrame*DTFACTOR);
#ifdef USE_NEW_MATRICE_C
loadIdentityPMat4fGl3(p_matModelview);
#else
p_matModelview.loadIdentity();
#endif
p_cameraGL.see(p_matModelview);
this->draw3d();
SDL_GL_SwapWindow(p_fenetre); p_ellapsed_time = SDL_GetTicks() - p_start_time;
if(p_ellapsed_time < p_timeForOneFrame){SDL_Delay(p_timeForOneFrame - p_ellapsed_time);}
}
return 0;
}
|
Les fonctions sendMatProjectionToShader et sendMatModelViewToShader :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void PAppSdlOpenGl3::sendMatProjectionToShader(GLint idMatProjection){
#ifdef USE_NEW_MATRICE_C
glUniformMatrix4fv(idMatProjection, 1, GL_TRUE, p_matProjection->mat);
#else
glUniformMatrix4fv(idMatProjection, 1, GL_TRUE, p_matProjection.getValue());
#endif
}
void PAppSdlOpenGl3::sendMatModelViewToShader(GLint idMatModelView){
#ifdef USE_NEW_MATRICE_C
glUniformMatrix4fv(idMatModelView, 1, GL_TRUE, p_matModelview->mat);
#else
glUniformMatrix4fv(idMatModelView, 1, GL_TRUE, p_matModelview.getValue());
#endif
}
|
Les fonctions pushMatModelView et popMatModelView :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void PAppSdlOpenGl3::pushMatModelView(){
#ifdef USE_NEW_MATRICE_C
pushPMat4fGl3(p_matModelview);
#else
p_matModelview.push();
#endif
}
void PAppSdlOpenGl3::popMatModelView(){
#ifdef USE_NEW_MATRICE_C
popPMat4fGl3(p_matModelview);
#else
p_matModelview.pop();
#endif
}
|
Les fonctions pour manipuler les matrices :
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
|
void PAppSdlOpenGl3::loadIdentityMV(){
#ifdef USE_NEW_MATRICE_C
loadIdentityPMat4fGl3(p_matModelview);
#else
p_matModelview.loadIdentity();
#endif
}
void PAppSdlOpenGl3::translateMV(float x, float y, float z){
#ifdef USE_NEW_MATRICE_C
translatePMat4fGl3(p_matModelview, x, y, z);
#else
p_matModelview.translated(x, y, z);
#endif
}
void PAppSdlOpenGl3::scaleMV(float x, float y, float z){
#ifdef USE_NEW_MATRICE_C
scalePMat4fGl3(p_matModelview, x, y, z);
#else
p_matModelview.scale(x, y, z);
#endif
}
void PAppSdlOpenGl3::rotateMVRad(float angleRad, float x, float y, float z){
#ifdef USE_NEW_MATRICE_C
rotatePMat4fGl3Rad(p_matModelview, angleRad, x, y, z);
#else
p_matModelview.rotateRad(angleRad, x, y, z);
#endif
}
void PAppSdlOpenGl3::rotateMVDeg(float angleDeg, float x, float y, float z){
#ifdef USE_NEW_MATRICE_C
rotatePMat4fGl3Rad(p_matModelview, angleDeg, x, y, z);
#else
p_matModelview.rotateDeg(angleDeg, x, y, z);
#endif
}
|
Les fonctions setPerpectiveDeg et setPerpectiveRad :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void PAppSdlOpenGl3::setPerpectiveDeg(float angleDeg, float near, float far){
#ifdef USE_NEW_MATRICE_C
perspectivePMat4fGl3Deg(p_matProjection, angleDeg, getRatio(), near, far);
#else
p_matProjection.perspectiveDeg(angleDeg, getRatio(), near, far);
#endif
}
void PAppSdlOpenGl3::setPerpectiveRad(float angleRad, float near, float far){
#ifdef USE_NEW_MATRICE_C
perspectivePMat4fGl3Rad(p_matProjection, angleRad, getRatio(), near, far);
#else
p_matProjection.perspectiveRad(angleRad, getRatio(), near, far);
#endif
}
|
La fonction d'affichage pour le mode debug :
1
2
3
4
5
6
7
8
9
10
11
12
13
|
void PAppSdlOpenGl3::printMatPMV(){
#ifdef USE_NEW_MATRICE_C
cout << "Matrice ModelView :" << endl;
printPtMat4f(p_matModelview->mat);
cout << "Matrice de projection :" << endl;
printPtMat4f(p_matProjection->mat);
#else
cout << "Matrice ModelView :" << endl;
cout << p_matModelview << endl;
cout << "Matrice de projection :" << endl;
cout << p_matProjection << endl;
#endif
}
|
La fonction d'initialisation :
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
|
void PAppSdlOpenGl3::initialisationPAppSdlOpenGl3(const std::string& titreFenetre, int largeurFenetre, int hauteurFenetre){
p_titreFenetre = titreFenetre;
p_largeurFenetre = largeurFenetre;
p_hauteurFenetre = hauteurFenetre;
if(SDL_Init(SDL_INIT_VIDEO) < 0){ std::cout << "Erreur lors de l'initialisation de la SDL : " << SDL_GetError() << std::endl;
p_isOpenGlSdlInit = false;
return;
}else{
std::cout << "Mode vidéo de SDL initialisé." << std::endl;
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
p_fenetre = SDL_CreateWindow(p_titreFenetre.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, p_largeurFenetre, p_hauteurFenetre, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
if(p_fenetre == NULL){
std::cerr << "Impossible de créer la fenêtre : " << SDL_GetError() << std::endl;
p_isOpenGlSdlInit = false;
dontRun();
return;
}else{
std::cout << "Création de la fenêtre." << std::endl;
}
p_contexteOpenGL = SDL_GL_CreateContext(p_fenetre);
glEnable(GL_DEPTH_TEST);
p_isOpenGlSdlInit = true;
#ifdef USE_NEW_MATRICE_C
p_matModelview = createPMat4fGl3();
p_matProjection = createPMat4fGl3();
loadIdentityPMat4fGl3(p_matModelview);
loadIdentityPMat4fGl3(p_matProjection);
#else
p_matModelview.loadIdentity();
p_matProjection.loadIdentity();
#endif
setFPS(30.0);
p_cameraGL.setWindowID(p_fenetre);
}
|
Et voilà, c'est fini pour les modifications de la classe PAppSdlOpenGl3.
|