Pipeline graphique
 Tout Structures de données Espaces de nommage Fichiers Fonctions Variables Définitions de type Énumérations Valeurs énumérées Macros
mainwindow.cpp
Aller à la documentation de ce fichier.
1 #include "mainwindow.h"
2 #define SIZE_X 800
3 #define SIZE_Y 800
4 
5 using namespace Math;
6 
12 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
13 {
14  m_menu_quiter = new QAction("Quitter",this);
15  connect(m_menu_quiter,SIGNAL(triggered()),this,SLOT(close()));
16 
17  m_menu_addobject = new QAction("Ajouter Object",this);
18  connect(m_menu_addobject,SIGNAL(triggered()),this,SLOT(openaddobject()));
19 
20  m_menu_addligth = new QAction("Ajouter Lampe",this);
21  connect(m_menu_addligth,SIGNAL(triggered()),this,SLOT(openaddligth()));
22 
23  m_menu_save = new QAction("Export Image",this);
24  connect(m_menu_save,SIGNAL(triggered()),this,SLOT(exportimage()));
25 
26  m_menu_save_zbuffer = new QAction("Export Image zbuffer",this);
27  connect(m_menu_save_zbuffer,SIGNAL(triggered()),this,SLOT(exportimagezbuffer()));
28 
29  m_menu_Phong = new QAction("Phong",this);
30  m_menu_Phong->setCheckable(true);
31  m_menu_Phong->setChecked(true);
32  connect(m_menu_Phong,SIGNAL(triggered()),this,SLOT(ChangeShadertoPhong()));
33 
34  m_menu_Goureau = new QAction("Goureau",this);
35  m_menu_Goureau->setCheckable(true);
36  m_menu_Goureau->setChecked(false);
37  connect(m_menu_Goureau,SIGNAL(triggered()),this,SLOT(ChangeShadertoGoureau()));
38 
39 
40  m_menu_point = new QAction("Point",this);
41  m_menu_point->setCheckable(true);
42  m_menu_point->setChecked(false);
43  connect(m_menu_point,SIGNAL(triggered()),this,SLOT(ChangeViewPoint()));
44 
45  m_menu_maille = new QAction("Maille",this);
46  m_menu_maille->setCheckable(true);
47  m_menu_maille->setChecked(false);
48  connect(m_menu_maille,SIGNAL(triggered()),this,SLOT(ChangeViewMaille()));
49 
50  m_menu_remplissage = new QAction("Remplisage",this);
51  m_menu_remplissage->setCheckable(true);
52  m_menu_remplissage->setChecked(true);
53  connect(m_menu_remplissage,SIGNAL(triggered()),this,SLOT(ChangeViewRemplisage()));
54 
55  m_menu_culling = new QAction("Culling",this);
56  m_menu_culling->setCheckable(true);
57  m_menu_culling->setChecked(false);
58  connect(m_menu_culling,SIGNAL(triggered()),this,SLOT(ChangeDoCulling()));
59 
60  m_menu_cliping = new QAction("Cliping",this);
61  m_menu_cliping->setCheckable(true);
62  m_menu_cliping->setChecked(true);
63  connect(m_menu_cliping,SIGNAL(triggered()),this,SLOT(ChangeDoCliping()));
64 
65  QMenu *me_fichier = menuBar()->addMenu("Fichier");
66  me_fichier->addAction(m_menu_addobject);
67  me_fichier->addAction(m_menu_addligth);
68  me_fichier->addAction(m_menu_save);
69  me_fichier->addAction(m_menu_save_zbuffer);
70  me_fichier->addAction(m_menu_quiter);
71 
72  QMenu *me_rendu = menuBar()->addMenu("Model Rendu");
73  me_rendu->addAction(m_menu_Phong);
74  me_rendu->addAction(m_menu_Goureau);
75 
76 
77  QMenu *me_vue = menuBar()->addMenu("Vue");
78  me_vue->addAction(m_menu_point);
79  me_vue->addAction(m_menu_maille);
80  me_vue->addAction(m_menu_remplissage);
81 
82  QMenu *me_util = menuBar()->addMenu("Util");
83  me_util->addAction(m_menu_culling);
84  me_util->addAction(m_menu_cliping);
85 
86 
87 
88 
89  // utilisation du pipeline
91 
92 
93  object = new QVector<BaseObject*>();
94 
95 
96 
97 
98  //
99 
100 
101  /*Obj.world->rotationZ(90);
102  Obj.world->rotationY(-90);
103  Obj.world->rotationX(90);*/
104  Pos = new vecteur3d(1.f,0.5,1);
105  At = new vecteur3d(0.f,0.f,0.f);
106  Up = new vecteur3d(0.f,0.f,1.f);
107 
108 
109  Cam.SetPosAtUpFov(*Pos, *At, *Up, 5 );
110  Cam.Update();
111 
112  shader = new ShaderPhong();
113  // initialisation du shader
114  shader->SetCamera(&Cam);
115 
116 
117 
119 
120  render = new QImage(pipeline->getDisplay(), SIZE_X,SIZE_Y, QImage::Format_RGB888);
121 
122  afficheur = new widgetimage(&render,this);
123  this->setCentralWidget(afficheur);
124  this->installEventFilter(this);
125 
126 }
127 
133 {
134  delete render;
135  delete pipeline;
136  delete m_menu_quiter;
137  delete m_menu_addobject;
138  delete m_menu_addligth;
139  delete m_menu_save;
140  delete m_menu_save_zbuffer;
141  delete m_menu_Phong;
142  delete m_menu_Goureau;
143  delete m_menu_point;
144  delete m_menu_maille;
145  delete m_menu_remplissage;
146  delete m_menu_culling;
147  delete m_menu_cliping;
148  delete Pos;
149  delete At;
150  delete Up;
151  for(int i = 0; i < object->count(); i++)
152  {
153  delete object->at(i);
154  }
155  delete object;
156  delete afficheur;
157 }
163 {
164  AddLight *fen = new AddLight(pipeline->getShader(),this);
165  fen->setModal(true);
166  fen->show();
167  connect(fen,SIGNAL(finished(int)),this,SLOT(rend()));
168 }
174 {
175  QString fileName = QFileDialog::getSaveFileName(this,
176  "Save Image", QDir::currentPath(), "Image Files (*.ppm)");
177  if(!fileName.isEmpty())
178  {
179  pipeline->SaveRenderTarget(fileName.toStdString());
180  }
181 }
187 {
188  QString fileName = QFileDialog::getSaveFileName(this,
189  "Save Image", QDir::currentPath(), "Image Files (*.pgm)");
190  if(!fileName.isEmpty())
191  {
192  pipeline->SaveZBuffer(fileName.toStdString());
193  }
194 }
200 {
201  if(m_menu_Phong->isChecked())
202  {
203 
204  ShaderGoureau * var = new ShaderGoureau();
205  var->SetCamera(&Cam);
206 
207  for(unsigned int i = 0; i < shader->getNbLight();i++)
208  {
209  var->AddLights(shader->pointLight(i));
210  }
211 
212  delete shader;
213  shader = var;
215  m_menu_Phong->setChecked(false);
216  rend();
217  }
218  else
219  {
220  m_menu_Goureau->setChecked(!m_menu_Goureau->isChecked());
221  }
222 
223 
224 }
230 {
231  if(m_menu_Goureau->isChecked())
232  {
233  ShaderPhong * var = new ShaderPhong();
234  var->SetCamera(&Cam);
235 
236  for(unsigned int i = 0; i < shader->getNbLight();i++)
237  {
238  var->AddLights(shader->pointLight(i));
239  }
240 
241  delete shader;
242  shader = var;
244  m_menu_Goureau->setChecked(false);
245  rend();
246  }
247  else
248  {
249  m_menu_Phong->setChecked(!m_menu_Phong->isChecked());
250  }
251 
252 }
258 {
259  bool var = m_menu_point->isChecked();
260  pipeline->setViewPoint(var);
261  rend();
262 
263 }
269 {
270  pipeline->setViewMaille(m_menu_maille->isChecked());
271  rend();
272 }
278 {
280  rend();
281 }
287 {
288  pipeline->setCulling(m_menu_culling->isChecked());
289  rend();
290 }
296 {
297  pipeline->setCliping(m_menu_cliping->isChecked());
298  rend();
299 }
306 {
307  AddObject *fen = new AddObject(object,this);
308  fen->setModal(true);
309  fen->show();
310  connect(fen,SIGNAL(finished(int)),this,SLOT(rend()));
311 }
316 bool MainWindow::event(QEvent *event)
317 {
318  if(event->type() == QEvent::KeyRelease)
319  {
320  QKeyEvent *c = dynamic_cast<QKeyEvent *>(event);
321  if(c && c->key() == Qt::Key_Z)
322  {
323  Pos->x -= 0.1;
324  Cam.SetPosAtUpFov(*Pos, *At, *Up, 5 );
325  Cam.Update();
326  rend();
327 
328  }
329  if(c && c->key() == Qt::Key_S)
330  {
331  Pos->x += 0.1;
332  Cam.SetPosAtUpFov(*Pos, *At, *Up, 5 );
333  Cam.Update();
334  rend();
335  }
336  if(c && c->key() == Qt::Key_Q)
337  {
338  Pos->y -= 0.1;
339  Cam.SetPosAtUpFov(*Pos, *At, *Up, 5 );
340  Cam.Update();
341  rend();
342  }
343  if(c && c->key() == Qt::Key_D)
344  {
345  Pos->y += 0.1;
346  Cam.SetPosAtUpFov(*Pos, *At, *Up, 5 );
347  Cam.Update();
348  rend();
349  }
350  if(c && c->key() == Qt::Key_A)
351  {
352  Pos->z += 0.1;
353  Cam.SetPosAtUpFov(*Pos, *At, *Up, 5 );
354  Cam.Update();
355  rend();
356  }
357  if(c && c->key() == Qt::Key_E)
358  {
359  Pos->z -= 0.1;
360  Cam.SetPosAtUpFov(*Pos, *At, *Up, 5 );
361  Cam.Update();
362  rend();
363  }
364  }
365  return false;
366 }
367 
373 {
376 
377  for(int i = 0; i < object->count(); i++)
378  {
379  pipeline->SetVertexBuffer(object->at(i)->getNbVertex(),object->at(i)->getVertexBuffer(),object->at(i)->getStride());
380  pipeline->SetIndexBuffer (object->at(i)->getNbFace()*3,object->at(i)->getIndexBuffer());
381 
382  for(unsigned int u = 0; u < object->at(i)->getNbInstance();u++)
383  {
384  shader->SetMaterial(object->at(i)->getInstance(u).material); // passage du materiau au shader
385  shader->SetWorldTransform(object->at(i)->getInstance(u).world); // passage de la transformation global au shader
386  shader->Update();
388  }
389  }
390  delete render;
391  render = new QImage(pipeline->getDisplay(), SIZE_X, SIZE_Y, QImage::Format_RGB888);
392 
393  //render->loadFromData(pipeline->getDisplay(),SIZE_X*SIZE_X*3*sizeof(unsigned char),"JPG");
394  afficheur->repaint();
395 
396 }
void SetShader(ShaderBase *VS)
Pipeline::SetShader(ShaderBase *VS) Permet de definir le shader qui sera utiliser pour le traitement...
Definition: Pipeline.cpp:861
bool event(QEvent *event)
MainWindow::event(QEvent *event) Permet de gerer les evenement dans l'aplication notament les touche ...
Definition: mainwindow.cpp:316
QAction * m_menu_maille
Definition: mainwindow.h:65
QImage * render
Definition: mainwindow.h:49
QVector< BaseObject * > * object
Definition: mainwindow.h:74
unsigned char * getDisplay()
Pipeline::getDisplay() Permet de recuperer le tableau de unsigned char du buffer de rendu...
Definition: Pipeline.cpp:809
void SaveRenderTarget(std::string fichier)
Pipeline::SaveRenderTarget(std::string name) Sauvegarde le resultat du rendu dans un fichier...
Definition: Pipeline.cpp:907
void SetMaterial(Material &material)
Fixe le matériau utilisé par le shader.
Definition: ShaderBase.cpp:130
void setCliping(bool var)
Pipeline::setCliping(bool var) Slot permetant de changer si le pipeline utilise le cliping...
Definition: Pipeline.cpp:129
void ChangeDoCliping()
MainWindow::ChangeDoCliping() Permet de changer si on fait du cliping ou pas.
Definition: mainwindow.cpp:295
ShaderBase * getShader()
Definition: Pipeline.h:79
void exportimage()
MainWindow::exportimage() Permet d'ouvrir une fenetre pour exporter l'image de rendu final...
Definition: mainwindow.cpp:173
void SetVertexBuffer(unsigned int VBsz, void *VB, unsigned int VSstride)
Pipeline::SetVertexBuffer(unsigned int VBsz, void *VB, unsigned int VSstride) Permet de definir le ve...
Definition: Pipeline.cpp:836
void setViewPoint(bool var)
Pipeline::setViewPoint(bool var) Slot permetant de changer la vue du Pipeline en desactivant ou activ...
Definition: Pipeline.cpp:90
Camera Cam
Definition: mainwindow.h:51
Light_Global * pointLight(unsigned int id)
Definition: ShaderBase.h:45
ShaderBase * shader
Definition: mainwindow.h:53
QAction * m_menu_Phong
Definition: mainwindow.h:61
vecteur3d * Up
Definition: mainwindow.h:73
~MainWindow()
MainWindow::~MainWindow() Destructeur de la fenetre principale, suprimme tout les ellement allouer dy...
Definition: mainwindow.cpp:132
QAction * m_menu_point
Definition: mainwindow.h:64
void Update()
ShaderBase::Update() Fonction permetant de metre a jour le shader pour prendre en compte de nouvelle ...
Definition: ShaderBase.cpp:75
void exportimagezbuffer()
MainWindow::exportimagezbuffer() Permet d'ouvrir une fenetre pour exporter l'image de zbuffer...
Definition: mainwindow.cpp:186
QAction * m_menu_cliping
Definition: mainwindow.h:69
void ChangeViewRemplisage()
MainWindow::ChangeViewRemplisage() Permet d'afficher ou pas le remplisage et deffectuer après un rend...
Definition: mainwindow.cpp:277
QAction * m_menu_save_zbuffer
Definition: mainwindow.h:59
widgetimage * afficheur
Definition: mainwindow.h:75
void ChangeDoCulling()
MainWindow::ChangeDoCulling() Permet de changer si on fait du culling ou pas.
Definition: mainwindow.cpp:286
void DrawTriangles()
Pipeline::DrawTriangles() Lance l'execution du pipeline ! Il commence par envoiyer 3 sommet au vertex...
Definition: Pipeline.cpp:139
void ChangeShadertoGoureau()
MainWindow::ChangeShadertoGoureau() Permet de changer le shader du pipeline en shader de goureau...
Definition: mainwindow.cpp:199
void SetWorldTransform(Math::matrice44 &mat)
Fixe la transformation globale de l'objet.
Definition: ShaderBase.cpp:146
#define SIZE_X
Definition: mainwindow.cpp:2
#define SIZE_Y
Definition: mainwindow.cpp:3
unsigned int getNbLight()
Definition: ShaderBase.h:43
void ClearRenderTarget(defColor::color Couleur)
Pipeline::ClearRenderTarget(defColor::color Couleur) Permet de remplir l'image de buffer avec une cou...
Definition: Pipeline.cpp:794
QAction * m_menu_remplissage
Definition: mainwindow.h:66
void ChangeShadertoPhong()
MainWindow::ChangeShadertoPhong() Permet de changer le shader du pipeline en shader de phong...
Definition: mainwindow.cpp:229
void SetPosAtUpFov(Math::vecteur3d &, Math::vecteur3d &, Math::vecteur3d &, float)
setter : valeurs de pObs, pAt, vV et phi
Definition: Camera.cpp:79
void openaddobject()
MainWindow::openaddobject() Permet d'afficher une fenetre pour ajouter un object dans la scene Une fo...
Definition: mainwindow.cpp:305
QAction * m_menu_Goureau
Definition: mainwindow.h:62
void SaveZBuffer(std::string name)
Pipeline::SaveZBuffer(std::string name) Sauvegarde le contenu du Zbuffer sous la forme d'une image en...
Definition: Pipeline.cpp:871
Definition: libMath.h:16
Classe de gestion du pipeline.
Definition: Pipeline.h:11
void openaddligth()
MainWindow::openaddligth() Permet d'ouvrir une fenetre pour ajouter une lampe.
Definition: mainwindow.cpp:162
Pipeline * pipeline
Definition: mainwindow.h:50
void SetCamera(Camera *camera)
Fixe la définition de la caméra.
Definition: ShaderBase.cpp:138
void setViewRemplisage(bool var)
Pipeline::setViewRemplisage(bool var) Slot permetant de changer la vue du Pipeline en desactivant ou ...
Definition: Pipeline.cpp:110
void Update()
mise à jour de la base et des matrices de projection et d'observation
Definition: Camera.cpp:145
void setViewMaille(bool var)
Pipeline::setViewMaille(bool var) Slot permetant de changer la vue du Pipeline en desactivant ou acti...
Definition: Pipeline.cpp:99
void ChangeViewPoint()
MainWindow::ChangeViewPoint() Permet d'afficher ou pas les point et deffectuer après un rendu...
Definition: mainwindow.cpp:257
void SetIndexBuffer(unsigned int IBsz, unsigned int *IB)
Pipeline::SetIndexBuffer(unsigned int IBsz, unsigned int *IB) Permet de definir le vertex buffer qui ...
Definition: Pipeline.cpp:850
void rend()
MainWindow::rend() Permet d'effectuer un rendu et de metre a jour le widget d'affichage.
Definition: mainwindow.cpp:372
vecteur3d * Pos
Definition: mainwindow.h:71
MainWindow(QWidget *parent=0)
MainWindow::MainWindow(QWidget *parent) Construit la fenetre principale.
Definition: mainwindow.cpp:12
void AddLights(Light_Global *light)
ShaderBase::AddLights(Light_Global * light) Fonction permetant d'ajouter une lampe a la scene...
Definition: ShaderBase.cpp:107
QAction * m_menu_save
Definition: mainwindow.h:57
const color black
Definition: definition.h:54
void ChangeViewMaille()
MainWindow::ChangeViewMaille() Permet d'afficher ou pas le mailliage et deffectuer après un rendu...
Definition: mainwindow.cpp:268
void setCulling(bool var)
Pipeline::setCulling(bool var) Slot permetant de changer si le pipeline utilise le culling...
Definition: Pipeline.cpp:120
vecteur3d * At
Definition: mainwindow.h:72
QAction * m_menu_quiter
Definition: mainwindow.h:54
QAction * m_menu_addligth
Definition: mainwindow.h:56
QAction * m_menu_addobject
Definition: mainwindow.h:55
QAction * m_menu_culling
Definition: mainwindow.h:68
void ClearZBuffer(float Zmax=FLT_MAX)
Pipeline::ClearZBuffer(float Zmax) Permet de remplir le ZBuffer avec la valeur Zmax a toute les cordo...
Definition: Pipeline.cpp:818