Code_TYMPAN  4.4.0
Industrial site acoustic simulation
TYRenderWindow.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) <2012-2024> <EDF-DTG> <FRANCE>
3  * This file is part of Code_TYMPAN (R).
4  * Code_TYMPAN (R) is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  * Code_TYMPAN (R) is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  * See the GNU General Public License for more details.
12  * You should have received a copy of the GNU General Public License along
13  * with Code_TYMPAN (R). If not, see <https://www.gnu.org/licenses/>.
14  */
15 
24 #include <numeric>
25 #include <qglobal.h>
26 #include <qmatrix4x4.h>
27 #include <qopengldebug.h>
28 #include <qopenglwidget.h>
29 #include <qpoint.h>
30 #include <qsurfaceformat.h>
31 #include <qtextstream.h>
32 #include <qvector3d.h>
33 #include "TYRenderWindow.h"
34 #include "gui/app/TYModelerFrame.h"
37 
38 #define IMG(id) OLocalizator::getPicture("TYRenderWindow", (id))
39 
40 TYRenderWindow::TYRenderWindow(QWidget* parent, const char* name)
41  : QOpenGLWidget(parent), _cachedViewport(nullptr, QRect())
42 {
43  _viewportNeedsUpdate = true;
44  // The cached viewport is initially invalid but getViewport will eventually set it to a valid value
45  setObjectName(name);
47 }
48 
50 {
51  _initNeeded = true;
52  _showInfos = false;
53 
54  _pGLLogger = new QOpenGLDebugLogger(context());
55  connect(_pGLLogger, &QOpenGLDebugLogger::messageLogged, this, &TYRenderWindow::handleLoggedMessage);
56 
58 
59  // Label info
60  OColor oColor;
63  oColor.r = oColor.g = oColor.b = 0.5;
65  _pOGLTextInfoLabel->setFont(IMG("id_font"));
69 
70  // just enable one double buffering
71  // by default, we use the one of vtk
72  /*#ifdef QT_DOUBLEBUFFER
73  // use the double buffering of QT
74  _pRenderWindow->SetSwapBuffers(0);
75  #else
76  // use the double buffering of vtk
77  setAutoBufferSwap(false);
78  #endif*/
79 
80  // Gestion du focus
81  setFocusProxy(parentWidget());
82 }
83 
85 {
86  makeCurrent();
87  delete _pGLLogger;
88  delete _pOGLTextInfoLabel;
89  //_pInfoLabelMapper->Delete();
90  delete _pRenderer; // az++
91  doneCurrent();
92 }
93 
95 {
96  return _pRenderer;
97 }
98 
99 void TYRenderWindow::showInfos(bool state)
100 {
101  _showInfos = state;
103 
104  // if (!_showInfos) {
105  // _pInfoLabelMapper->SetInput("");
106  // }
107 
108  update();
109 }
110 
112 {
113  _pGLLogger->initialize();
114 
115  if (!qEnvironmentVariableIsSet("TYMPAN_DEBUG_OPENGL_ALL_MESSAGES"))
116  {
117  // Only show errors by default
118  _pGLLogger->disableMessages();
119  _pGLLogger->enableMessages(QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::ErrorType);
120  }
121 
122  if (qEnvironmentVariableIsSet("TYMPAN_DEBUG_OPENGL_SYNC"))
123  {
124  _pGLLogger->startLogging(QOpenGLDebugLogger::SynchronousLogging);
125  }
126  else
127  {
128  _pGLLogger->startLogging(QOpenGLDebugLogger::AsynchronousLogging);
129  }
131 }
132 
133 void TYRenderWindow::resizeGL(int w, int h)
134 {
135  _viewportNeedsUpdate = true;
136  _pActiveCamera->setSize(width() * devicePixelRatioF(), height() * devicePixelRatioF());
137 }
138 
140 {
141  _pRenderer->init();
142 
143  clock_t timeBefore = clock();
144  TYModelerFrame* modelerFrame = (TYModelerFrame*)parent();
145  TYRenderContext renderContext = modelerFrame->createRenderContext();
146 
147  _pRenderer->OpenGLRender(renderContext);
148  clock_t timeAfter = clock();
149 
150  double timeElaspedInSec = ((double)(timeAfter - timeBefore)) / (double)CLOCKS_PER_SEC;
151  renderTime[renderCount % renderTime.size()] = timeElaspedInSec;
152  renderCount++;
153 
154  if (_showInfos)
155  {
156  double meanRenderTime = std::reduce(renderTime.begin(), renderTime.end()) / renderTime.size();
157  // writeOutputMsg(QString("FPS = %1").arg(1.0 / timeElaspedInSec, 0, 'f', 2));
158  _pOGLTextInfoLabel->setTextToDisplay(QString("FPS = %1").arg(1.0 / meanRenderTime, 0, 'f', 2));
159  }
160 }
161 
163 {
165  {
167  _pActiveCamera, QRect(0, 0, width() * devicePixelRatioF(), height() * devicePixelRatioF()));
168  _viewportNeedsUpdate = false;
169  }
170  return _cachedViewport;
171 }
172 
173 QPoint TYRenderWindow::toViewport(QPoint point)
174 {
175  return point * devicePixelRatioF();
176 }
177 
178 static inline const char* printableDebugMessageSource(QOpenGLDebugMessage::Source source)
179 {
180  switch (source)
181  {
182  case QOpenGLDebugMessage::APISource:
183  return "API";
184  case QOpenGLDebugMessage::WindowSystemSource:
185  return "Window system";
186  case QOpenGLDebugMessage::ShaderCompilerSource:
187  return "Shader compiler";
188  case QOpenGLDebugMessage::ThirdPartySource:
189  return "Third party";
190  case QOpenGLDebugMessage::ApplicationSource:
191  return "Application";
192  case QOpenGLDebugMessage::OtherSource:
193  return "Other";
194  case QOpenGLDebugMessage::AnySource:
195  case QOpenGLDebugMessage::InvalidSource:
196  default:
197  return ""; // Shouldn't happen
198  }
199 }
200 
201 static inline const char* printableDebugMessageType(QOpenGLDebugMessage::Type messageType)
202 {
203  switch (messageType)
204  {
205  case QOpenGLDebugMessage::ErrorType:
206  return "Error";
207  case QOpenGLDebugMessage::DeprecatedBehaviorType:
208  return "Deprecated behavior";
209  case QOpenGLDebugMessage::UndefinedBehaviorType:
210  return "Undefined behavior";
211  case QOpenGLDebugMessage::PortabilityType:
212  return "Portability";
213  case QOpenGLDebugMessage::PerformanceType:
214  return "Performance";
215  case QOpenGLDebugMessage::MarkerType:
216  return "Marker";
217  case QOpenGLDebugMessage::GroupPushType:
218  return "Group Push";
219  case QOpenGLDebugMessage::GroupPopType:
220  return "Group Pop";
221  case QOpenGLDebugMessage::OtherType:
222  return "Other";
223  case QOpenGLDebugMessage::InvalidType:
224  case QOpenGLDebugMessage::AnyType:
225  default:
226  return ""; // Shouldn't happen
227  }
228 }
229 
230 static inline const char* printableDebugMessageSeverity(QOpenGLDebugMessage::Severity severity)
231 {
232  switch (severity)
233  {
234  case QOpenGLDebugMessage::HighSeverity:
235  return "High";
236  case QOpenGLDebugMessage::MediumSeverity:
237  return "Medium";
238  case QOpenGLDebugMessage::LowSeverity:
239  return "Low";
240  case QOpenGLDebugMessage::NotificationSeverity:
241  return "Notification";
242  case QOpenGLDebugMessage::InvalidSeverity:
243  case QOpenGLDebugMessage::AnySeverity:
244  default:
245  return ""; // Shouldn't happen
246  }
247 }
248 
249 static const char* OGL_DEBUG_MESSAGE_FORMAT = "OpenGL message\n"
250  "==============\n"
251  "Type = %1\n"
252  "Source = %2\n"
253  "Severity = %3\n"
254  "Message = %4\n";
255 
256 void TYRenderWindow::handleLoggedMessage(QOpenGLDebugMessage message)
257 {
258  QString output = QString(OGL_DEBUG_MESSAGE_FORMAT)
259  .arg(printableDebugMessageType(message.type()))
260  .arg(printableDebugMessageSource(message.source()))
261  .arg(printableDebugMessageSeverity(message.severity()))
262  .arg(message.message());
263  QTextStream(stdout) << output << Qt::endl;
264 }
pour l'application Tympan (fichier header)
Classe generique pour une fenetre de modeleur (fichier header)
Contexte de rendu utilisé par les fonctions d'affichage.
#define IMG(id)
association du graphic (OpenGL) au modeleur (fichier header)
const char * name
Definition: color.h:36
float b
Definition: color.h:38
float r
Definition: color.h:38
float g
Definition: color.h:38
void setSize(int w, int h)
Definition: OGLCamera.cpp:78
void setVisibility(bool bVisible)
Definition: OGLElement.h:51
void setDisplayPosition(double displayPositionX, double displayPositionY)
Definition: OGLElement.h:46
void setColor(const OColor &oColor)
void setTextToDisplay(const QString &qsText)
void setFont(const QString &qsFontPath)
Generic class for a modeler window.
virtual TYRenderContext createRenderContext()
Realise le rendu VTK et le rendu OpenGL.
void addOGLElement(OGLElement *pOGLElement)
void OpenGLRender(TYRenderContext &renderContext, int x=0, int y=0)
void handleLoggedMessage(QOpenGLDebugMessage debugMessage)
std::array< double, 50 > renderTime
virtual void initializeGL()
const TYRenderViewport & getViewport() const
OGLCamera * _pActiveCamera
TYRenderViewport _cachedViewport
virtual void resizeGL(int w, int h)
QPoint toViewport(QPoint point)
QOpenGLDebugLogger * _pGLLogger
TYOpenGLRenderer * _pRenderer
void showInfos(bool state)
TYOpenGLRenderer * getRenderer()
virtual void paintGL()
OGLTextElement * _pOGLTextInfoLabel
TYRenderWindow(QWidget *pParent=0, const char *name=0)