Geant4  10.01.p03
G4OpenGLImmediateQtViewer.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 // $Id: G4OpenGLImmediateQtViewer.cc 87164 2014-11-26 08:48:31Z gcosmo $
28 //
29 //
30 // Class G4OpenGLImmediateQtViewer : a class derived from G4OpenGLQtViewer and
31 // G4OpenGLImmediateViewer.
32 
33 #ifdef G4VIS_BUILD_OPENGLQT_DRIVER
34 
37 
38 #include "G4ios.hh"
39 #ifdef G4MULTITHREADED
40 #include "G4Threading.hh"
41 #endif
42 #include <qapplication.h>
43 #include <qevent.h>
44 
45 #ifdef G4OPENGL_VERSION_2
46 #include <qglshaderprogram.h>
47 #endif
48 
49 
50 G4OpenGLImmediateQtViewer::G4OpenGLImmediateQtViewer
51 (G4OpenGLImmediateSceneHandler& sceneHandler,
52  const G4String& name):
53  G4VViewer (sceneHandler, sceneHandler.IncrementViewCount (), name),
54  G4OpenGLViewer (sceneHandler),
55  G4OpenGLQtViewer (sceneHandler),
56  G4OpenGLImmediateViewer (sceneHandler)
57 {
58 
59  setFocusPolicy(Qt::StrongFocus); // enable keybord events
60  fHasToRepaint = false;
61  fPaintEventLock = false;
62 
63  // Create a new drawer
64  // register the QtDrawer to the OpenGLViewer
65 #ifdef G4OPENGL_VERSION_2
66  setVboDrawer(new G4OpenGLVboDrawer(this,"OGL-VBO"));
67 #endif
68 
69  resize(fVP.GetWindowSizeHintX(),fVP.GetWindowSizeHintY());
70 
71  if (fViewId < 0) return; // In case error in base class instantiation.
72 }
73 
74 G4OpenGLImmediateQtViewer::~G4OpenGLImmediateQtViewer() {
75  makeCurrent();
76 }
77 
78 void G4OpenGLImmediateQtViewer::Initialise() {
79 #ifdef G4DEBUG_VIS_OGL
80  printf("G4OpenGLImmediateQtViewer::Initialise \n");
81 #endif
82  fQGLWidgetInitialiseCompleted = false;
83  CreateMainWindow (this,QString(GetName()));
84  CreateFontLists ();
85 
86  fQGLWidgetInitialiseCompleted = true;
87 }
88 
89 void G4OpenGLImmediateQtViewer::initializeGL () {
90 
91 #ifndef G4OPENGL_VERSION_2
92  InitializeGLView ();
93 #else
94  QGLShaderProgram *aQGLShaderProgram = new QGLShaderProgram (context());
95  fShaderProgram = aQGLShaderProgram->programId ();
96 
97  aQGLShaderProgram->addShaderFromSourceCode(QGLShader::Vertex,
98  fVboDrawer->getVertexShaderSrc());
99 
100  aQGLShaderProgram->addShaderFromSourceCode(QGLShader::Fragment,
101  fVboDrawer->getFragmentShaderSrc());
102 
103  aQGLShaderProgram->link();
104  aQGLShaderProgram->bind();
105 
106  fVertexPositionAttribute = glGetAttribLocation(fShaderProgram, "aVertexPosition");
107  fcMatrixUniform = glGetUniformLocation(fShaderProgram, "uCMatrix");
108  fpMatrixUniform = glGetUniformLocation(fShaderProgram, "uPMatrix");
109  ftMatrixUniform = glGetUniformLocation(fShaderProgram, "uTMatrix");
110  fmvMatrixUniform = glGetUniformLocation(fShaderProgram, "uMVMatrix");
111 
112  // Load identity at beginning
113  float identity[16] = {
114  1.0f, 0, 0, 0,
115  0, 1.0f, 0, 0,
116  0, 0, 1.0f, 0,
117  0, 0, 0, 1.0f
118  };
119  glUniformMatrix4fv (fcMatrixUniform, 1, 0, identity);
120  glUniformMatrix4fv (fpMatrixUniform, 1, 0, identity);
121  glUniformMatrix4fv (ftMatrixUniform, 1, 0, identity);
122  glUniformMatrix4fv(fmvMatrixUniform, 1, 0, identity);
123 
124  glUseProgram(fShaderProgram);
125 
126  setInitialized(); // Should be removed when fuse Wt and Qt
127 
128 #endif
129 
130  // If a double buffer context has been forced upon us, ignore the
131  // back buffer for this OpenGLImmediate view.
132  // glDrawBuffer (GL_FRONT); // FIXME : Ne marche pas avec cette ligne, mais affiche le run correctement...
133 
134  if (fSceneHandler.GetScene() == 0) {
135  fHasToRepaint =false;
136  } else {
137  fHasToRepaint =true;
138  }
139 
140  // Set the component visible
141  setVisible(true) ;
142 
143  // and update it immediatly before wait for SessionStart() (batch mode)
144  QCoreApplication::sendPostedEvents () ;
145 }
146 
147 
148 void G4OpenGLImmediateQtViewer::DrawView() {
149 #ifdef G4MULTITHREADED
151  updateQWidget();
152  }
153 #else
154  updateQWidget();
155 #endif
156 }
157 
158 
159 void G4OpenGLImmediateQtViewer::ComputeView () {
160 
161 #ifdef G4DEBUG_VIS_OGL
162  printf("G4OpenGLImmediateQtViewer::ComputeView %d %d VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\n",getWinWidth(), getWinHeight());
163 #endif
164  makeCurrent();
165  // If a double buffer context has been forced upon us, ignore the
166  // back buffer for this OpenGLImmediate view.
167  // glDrawBuffer (GL_FRONT);
168 
169  G4ViewParameters::DrawingStyle dstyle = GetViewParameters().GetDrawingStyle();
170 
171  if(dstyle!=G4ViewParameters::hlr &&
172  haloing_enabled) {
173 
174  HaloingFirstPass ();
175  NeedKernelVisit ();
176  ProcessView ();
177  FinishView();
178 #ifdef G4DEBUG_VIS_OGL
179  printf("G4OpenGLImmediateQtViewer::ComputeView First ProcessView ok\n");
180 #endif
181  HaloingSecondPass ();
182 
183  }
184 
185  NeedKernelVisit (); // Always need to visit G4 kernel.
186  ProcessView ();
187 
188  if (isRecording()) {
189  savePPMToTemp();
190  }
191 
192 #ifdef G4DEBUG_VIS_OGL
193  printf("G4OpenGLImmediateQtViewer::ComputeView %d %d ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ \n",getWinWidth(), getWinHeight());
194 #endif
195  fHasToRepaint = true;
196 }
197 
201 void G4OpenGLImmediateQtViewer::resizeGL(
202  int aWidth
203 ,int aHeight)
204 {
205  if ((aWidth > 0) && (aHeight > 0)) {
206  ResizeWindow(aWidth,aHeight);
207  fHasToRepaint = sizeHasChanged();
208  }
209 }
210 
211 
212 void G4OpenGLImmediateQtViewer::paintGL()
213 {
214  updateToolbarAndMouseContextMenu();
215 
216  if (fPaintEventLock) {
217 // return ;
218  }
219  if (!fQGLWidgetInitialiseCompleted) {
220  fQGLWidgetInitialiseCompleted= true;
221  return;
222  }
223  if ((getWinWidth() == 0) && (getWinHeight() == 0)) {
224  return;
225  }
226 
227  // DO NOT RESIZE IF SIZE HAS NOT CHANGE
228  if ( !fHasToRepaint) {
229  // L. Garnier : Trap to get the size with mac OSX 10.6 and Qt 4.6(devel)
230  // Tested on Qt4.5 on mac, 4.4 on windows, 4.5 on unbuntu
231  int sw = 0;
232  int sh = 0;
233  if (!isMaximized() && !isFullScreen()) {
234  sw = normalGeometry().width();
235  sh = normalGeometry().height();
236  } else {
237  sw = frameGeometry().width();
238  sh = frameGeometry().height();
239  }
240  if ((getWinWidth() == (unsigned int)sw) &&(getWinHeight() == (unsigned int)sh)) {
241  return;
242 
243  } else if ((sw == 0) && (sh == 0)) { // NOT A TOP LEVEL WIDGET
244  if (((getWinWidth() == (unsigned int)width())) &&(getWinHeight() == (unsigned int) height())) {
245  return;
246  }
247  }
248  }
249 #ifdef G4DEBUG_VIS_OGL
250  printf("G4OpenGLImmediateQtViewer::paintGL VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV ready %d\n",fReadyToPaint);
251 #endif
252 
253  SetView();
254 
255  ClearView (); //ok, put the background correct
256  ComputeView();
257 
258  fHasToRepaint = false; // could be set to false by ComputeView
259 
260 #ifdef G4DEBUG_VIS_OGL
261  printf("G4OpenGLImmediateQtViewer::paintGL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ready %d\n\n\n",fReadyToPaint);
262 #endif
263  fPaintEventLock = false;
264 }
265 
266 void G4OpenGLImmediateQtViewer::mousePressEvent(QMouseEvent *event)
267 {
268  G4MousePressEvent(event);
269 }
270 
271 void G4OpenGLImmediateQtViewer::keyPressEvent (QKeyEvent * event)
272 {
273  G4keyPressEvent(event);
274 }
275 
276 void G4OpenGLImmediateQtViewer::keyReleaseEvent (QKeyEvent * event)
277 {
278  G4keyReleaseEvent(event);
279 }
280 
281 void G4OpenGLImmediateQtViewer::wheelEvent (QWheelEvent * event)
282 {
283  G4wheelEvent(event);
284 }
285 
286 void G4OpenGLImmediateQtViewer::showEvent (QShowEvent *)
287 {
288  fHasToRepaint = true;
289 }
290 
291 
296 void G4OpenGLImmediateQtViewer::mouseDoubleClickEvent(QMouseEvent *)
297 {
298  G4MouseDoubleClickEvent();
299 }
300 
301 void G4OpenGLImmediateQtViewer::mouseReleaseEvent(QMouseEvent *event)
302 {
303  G4MouseReleaseEvent(event);
304 }
305 
306 void G4OpenGLImmediateQtViewer::mouseMoveEvent(QMouseEvent *event)
307 {
308  G4MouseMoveEvent(event);
309 }
310 
311 
312 void G4OpenGLImmediateQtViewer::contextMenuEvent(QContextMenuEvent *e)
313 {
314  G4manageContextMenuEvent(e);
315 }
316 
317 void G4OpenGLImmediateQtViewer::paintEvent(QPaintEvent *) {
318  if ( fHasToRepaint) {
319  updateGL();
320  }
321 }
322 
323 
324 void G4OpenGLImmediateQtViewer::updateQWidget() {
325  fHasToRepaint= true;
326  updateGL();
327  updateSceneTreeComponentTreeWidgetInfos();
328  repaint();
329  fHasToRepaint= false;
330 }
331 
332 
333 void G4OpenGLImmediateQtViewer::ShowView (
334 )
335 {
338  fHasToRepaint = true;
339  activateWindow();
340 }
341 #endif
G4String name
Definition: TRTMaterials.hh:40
#define width
G4int G4GetThreadId()
Definition: G4Threading.cc:127