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
| #include "scene.h"
#include "window.h"
#include "Shader.h"
#include <glm/glm.hpp>
#include <glm/gtx/transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include "scene.h"
SceneOpenGL::SceneOpenGL(QString titreFenetre, QGLFormat format) : m_titreFenetre(titreFenetre), m_contexteOpenGL(format)
{
m_contexteOpenGL.create();
}
SceneOpenGL::~SceneOpenGL()
{
m_fenetre->close();
}
void SceneOpenGL::bouclePrincipale()
{
// Variables
bool terminer(false);
float vertices[] = {-0.5, -0.5, -1.0, 0.0, 0.5, -1.0, 0.5, -0.5, -1.0};
float couleurs[] = {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
// Shader
Shader shaderCouleur("Shaders\\couleur3D.vert", "Shaders\\couleur3D.frag", &m_contexteOpenGL);
shaderCouleur.charger();
// Matrices
glm::mat4 projection;
glm::mat4 modelview;
projection = glm::perspective(70.0, (double) m_largeurFenetre / m_hauteurFenetre, 1.0, 100.0);
modelview = glm::mat4(1.0);
// Boucle principale
while(!terminer)
{
// Nettoyage de l'écran
glClear(GL_COLOR_BUFFER_BIT);
// Réinitialisation de la matrice modelview
modelview = glm::mat4(1.0);
// On spécifie quel shader utiliser
f.glUseProgram(shaderCouleur.getProgramID());
// On remplie puis on active le tableau Vertex Attrib 0
f.glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices);
f.glEnableVertexAttribArray(0);
// Même chose avec le tableau Vertex Attrib 1
f.glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, couleurs);
f.glEnableVertexAttribArray(1);
// On envoie les matrices au shader
f.glUniformMatrix4fv(f.glGetUniformLocation(shaderCouleur.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(modelview));
f.glUniformMatrix4fv(f.glGetUniformLocation(shaderCouleur.getProgramID(), "projection"), 1, GL_FALSE, glm::value_ptr(projection));
// On affiche le polygone
glDrawArrays(GL_TRIANGLES, 0, 3);
// On désactive les tableaux Vertex Attrib puisque l'on n'en a plus besoin
f.glDisableVertexAttribArray(1);
f.glDisableVertexAttribArray(0);
// On n'utilise plus le shader
f.glUseProgram(0);
// Actualisation de la fenêtre
m_fenetre->updateGL();
}
}
bool SceneOpenGL::initialiserFenetre()
{
// Création de la fenêtre
QDesktopWidget bureau;
QGLFormat format;
format.setDoubleBuffer(true);
QRect surface_bureau = bureau.screenGeometry();
int w = surface_bureau.width()/2;
int h = surface_bureau.height()/2;
int x = w/2;
int y = h/2;
m_contexteOpenGL.makeCurrent();
m_fenetre = new window(m_titreFenetre, x, y, w, h, &format);
m_fenetre->setContext(&m_contexteOpenGL);
m_fenetre->makeCurrent();
f.initializeGLFunctions(&m_contexteOpenGL);
if(m_fenetre == 0)
{
std::cout << "Erreur lors de la creation de la fenetre " << std::endl;
return false;
}
if(m_contexteOpenGL.isValid() == false)
{
std::cout << "erreur contexte opengl" << std::endl;
m_fenetre->close();
delete m_fenetre;
return false;
}
m_fenetre->swapBuffers();
return true;
} |
Partager