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 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
| #include <iostream>
#include <SDL/SDL.h>
#include <GL/GLee.h>
#include <GL/glu.h>
#include "constantes.h"
#define BUFFER_OFFSET(a) ((char*)NULL + (a))
//! Constantes de la forme.
const unsigned int NB_VERT = 8;
const unsigned int NB_INDEX = 24;
const unsigned int V_SIZE = 3;
const unsigned int C_SIZE = 3;
const unsigned int I_SIZE = 1;
float vertices[NB_VERT*V_SIZE] = {
-1.f, -1.f, -1.f,
1.f, -1.f, -1.f,
1.f, 1.f, -1.f,
-1.f, 1.f, -1.f,
-1.f, -1.f, 1.f,
1.f, -1.f, 1.f,
1.f, 1.f, 1.f,
-1.f, 1.f, 1.f
};
float colors[NB_VERT*C_SIZE] = {
1.f, 0.f, 0.f,
0.f, 1.f, 0.f,
0.f, 0.f, 1.f,
1.f, 1.f, 0.f,
1.f, 0.f, 1.f,
0.f, 1.f, 1.f,
0.5f, 0.2f, 0.8f,
0.8f, 0.4f, 0.1f
};
float index[NB_INDEX*I_SIZE] = {
0, 1, 2, 3, // Face du bas
1, 2, 6, 5, // Face de devant
2, 3, 7, 6, // Face de droite
6, 7, 4, 5, // Face du dessus
0, 1, 5, 4, // Face de gauche
0, 3, 7, 4 // Face de derrière.
};
GLuint verticesBuffer;
GLuint colorsBuffer;
GLuint indexBuffer;
//! Initialiser SDL.
bool initSDL();
//! Initialiser OpenGL.
bool initOpenGL();
//! Dessiner la scène.
void drawScene();
int main(int argc, char** argv) {
// Initialiser les bibliothèques utilisées.
if (!initSDL() || !initOpenGL())
return EXIT_FAILURE;
atexit(SDL_Quit);
SDL_Event event;
bool running = true;
// Boucle principale.
while (running) {
// Traitement des evenements.
while (SDL_PollEvent(&event)) {
// Fermeture de la fenêtre.
if (event.type == SDL_QUIT)
running = false;
// Appuie touche.
if (event.type == SDL_KEYDOWN) {
// Touche echape -> fermeture application.
if (event.key.keysym.sym == SDLK_ESCAPE)
running = false;
}
}
// Dessiner la scène.
drawScene();
}
// Supprimer les buffers.
glDeleteBuffers(1, &colorsBuffer);
glDeleteBuffers(1, &verticesBuffer);
glDeleteBuffers(1, &indexBuffer);
return EXIT_SUCCESS;
}
bool initSDL() {
// Initialiser le mode vidéo.
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cerr << "Erreur: le mode video n'a pu etre initialise." << std::endl;
return false;
}
// Définir le titre de la fenêtre.
SDL_WM_SetCaption(WIN_T.c_str(), NULL);
// Ouvrir la fenêtre avec un contexte OpenGL.
SDL_Surface* screen = SDL_SetVideoMode(WIN_W, WIN_H, WIN_BPP, SDL_OPENGL);
if (screen == NULL) {
std::cerr << "Erreur: " << SDL_GetError() << std::endl;
return false;
}
return true;
}
bool initOpenGL() {
// Définir la couleur d'arrière plan.
glClearColor(0.f, 0.70f, 0.35f, 0.f);
// Activer l'écriture dans le z-buffer.
glEnable(GL_DEPTH_TEST);
glClearDepth(1.f);
// Définir le mode de projection.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.f, (double)WIN_W/WIN_H, 1.0, 50.0);
// Création des buffer.
glGenBuffers(1, &colorsBuffer);
glGenBuffers(1, &verticesBuffer);
glGenBuffers(1, &indexBuffer);
// Chargement des données dans le colors buffer.
glBindBuffer(GL_ARRAY_BUFFER, colorsBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*NB_VERT*C_SIZE, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*NB_VERT*C_SIZE, colors);
// Chargement des données dans le vertices buffer.
glBindBuffer(GL_ARRAY_BUFFER, verticesBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*NB_VERT*V_SIZE, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*NB_VERT*V_SIZE, vertices);
// Chargement des données dans l'index buffer.
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*NB_INDEX*I_SIZE,
NULL, GL_STREAM_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(unsigned int)*NB_INDEX*I_SIZE,
index);
// Activer le tableaux de sommet et de couleur.
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
return true;
}
void drawScene() {
// Vider les tampons.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Placer la caméra.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(3.f, 3.f, 3.f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f);
// Spécification du buffer de couleur.
glBindBuffer(GL_ARRAY_BUFFER, colorsBuffer);
glColorPointer(C_SIZE, GL_FLOAT, 0, BUFFER_OFFSET(0));
// Spécification du buffer de sommet.
glBindBuffer(GL_ARRAY_BUFFER, verticesBuffer);
glVertexPointer(V_SIZE, GL_FLOAT, 0, BUFFER_OFFSET(0));
// Dessiner le carré.
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glDrawElements(GL_QUADS, NB_INDEX, GL_UNSIGNED_INT, BUFFER_OFFSET(0));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
// Mettre à jour la fenêtre.
glFlush();
SDL_GL_SwapBuffers();
} |
Partager