Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 // 28 // 29 // Class G4OpenGLStoredQtViewer : a class deri 30 // G4OpenGLStor 31 32 #include "G4OpenGLStoredQtViewer.hh" 33 34 #include "G4OpenGLStoredSceneHandler.hh" 35 #include "G4ios.hh" 36 #include "G4Threading.hh" 37 #include "G4UIQt.hh" 38 #if 0x060000 <= QT_VERSION 39 #include "G4Qt.hh" 40 #endif 41 42 #include <qapplication.h> 43 #include <qtabwidget.h> 44 45 G4OpenGLStoredQtViewer::G4OpenGLStoredQtViewer 46 (G4OpenGLStoredSceneHandler& sceneHandler, 47 const G4String& name): 48 G4VViewer (sceneHandler, sceneHandler.Increm 49 G4OpenGLViewer (sceneHandler), 50 G4OpenGLQtViewer (sceneHandler), 51 G4OpenGLStoredViewer (sceneHandler), 52 G4QGLWidgetType() 53 { 54 if (fViewId < 0) return; // In case error i 55 56 #if QT_VERSION < 0x060000 57 fQGLWidgetInitialiseCompleted = false; 58 59 // Indicates that the widget has no backgr 60 G4QGLWidgetType::setAttribute (Qt::WA_NoSyst 61 62 setFocusPolicy(Qt::StrongFocus); // enable k 63 fHasToRepaint = false; 64 fPaintEventLock = false; 65 fUpdateGLLock = false; 66 #else 67 // Indicates that the widget has no backgrou 68 G4QGLWidgetType::setAttribute (Qt::WA_NoSyst 69 70 setFocusPolicy(Qt::StrongFocus); // enable k 71 #endif 72 } 73 74 G4OpenGLStoredQtViewer::~G4OpenGLStoredQtViewe 75 76 void G4OpenGLStoredQtViewer::Initialise() { 77 #if QT_VERSION < 0x060000 78 79 fQGLWidgetInitialiseCompleted = false; 80 CreateMainWindow (this,QString(GetName())); 81 82 makeCurrent(); 83 glDrawBuffer (GL_BACK); 84 85 // set the good tab active 86 if (G4QGLWidgetType::parentWidget()) { 87 auto *parentTab = dynamic_cast<QTabWidget* 88 if (parentTab) { 89 parentTab->setCurrentIndex(parentTab->co 90 } 91 } 92 93 fQGLWidgetInitialiseCompleted = true; 94 #else 95 CreateMainWindow (this,QString(GetName())); 96 // Set jpg as default export format for Qt v 97 setExportImageFormat("jpg"); 98 #endif 99 } 100 101 #if QT_VERSION < 0x060000 102 void G4OpenGLStoredQtViewer::initializeGL () { 103 104 InitializeGLView (); 105 106 if (fSceneHandler.GetScene() == 0) { 107 fHasToRepaint =false; 108 } else { 109 fHasToRepaint =true; 110 } 111 112 // Set the component visible 113 // setVisible(true) ; 114 115 // Set jpg as default export format for Qt v 116 setExportImageFormat("jpg"); 117 } 118 #endif 119 120 G4bool G4OpenGLStoredQtViewer::CompareForKerne 121 { 122 // Identical to G4OpenGLStoredViewer::Compar 123 // for checking of VisAttributesModifiers, b 124 // G4OpenGLStoredQtViewer keeps track of its 125 // modifiers (fTreeItemModels, etc.). 126 if ( 127 (lastVP.GetDrawingStyle () != fVP.Get 128 (lastVP.GetNumberOfCloudPoints() != fVP 129 (lastVP.IsAuxEdgeVisible () != fVP.IsA 130 (lastVP.IsCulling () != fVP.IsC 131 (lastVP.IsCullingInvisible () != fVP.IsC 132 (lastVP.IsDensityCulling () != fVP.IsD 133 (lastVP.IsCullingCovered () != fVP.IsC 134 (lastVP.GetCBDAlgorithmNumber() != 135 fVP.GetCBDAlgorithmNumber()) 136 // Note: Section and Cutaway can reveal 137 // backface culling is implemented, the 138 // the back-facing faces are not there. 139 // (commented out) backface culling (it 140 // in fact, performance seems to improve 141 (lastVP.IsSection () != fVP.IsS 142 // Section (DCUT) is NOT implemented loc 143 // (lastVP.IsCutaway () != fVP. 144 // Cutaways are implemented locally so w 145 (lastVP.IsExplode () != fVP.IsE 146 (lastVP.GetNoOfSides () != fVP.Get 147 (lastVP.GetGlobalMarkerScale() != fVP 148 (lastVP.GetGlobalLineWidthScale() != fVP 149 (lastVP.IsMarkerNotHidden () != fVP.IsM 150 (lastVP.GetDefaultVisAttributes()->GetCo 151 fVP.GetDefaultVisAttributes()->GetColou 152 (lastVP.GetDefaultTextVisAttributes()->G 153 fVP.GetDefaultTextVisAttributes()->GetC 154 (lastVP.GetBackgroundColour ()!= fVP.Get 155 (lastVP.IsPicking () != fVP.IsP 156 (lastVP.IsSpecialMeshRendering() != fVP. 157 (lastVP.GetSpecialMeshRenderingOption() 158 return true; 159 160 // Don't check VisAttributesModifiers if thi 161 // initiated by a mouse interaction on the s 162 if (fMouseOnSceneTree) { 163 // Reset the flag. 164 fMouseOnSceneTree = false; 165 } else { 166 // Not initiated by a mouse so compare for 167 if (lastVP.GetVisAttributesModifiers() != 168 return true; 169 } 170 } 171 172 if (lastVP.IsDensityCulling () && 173 (lastVP.GetVisibleDensity () != fVP.GetV 174 return true; 175 176 // /***************************************** 177 // If section (DCUT) is implemented locally, 178 if (lastVP.IsSection () && 179 (lastVP.GetSectionPlane () != fVP.GetSec 180 return true; 181 // ***************************************** 182 183 /******************************************* 184 If cutaways are implemented locally, commen 185 if (lastVP.IsCutaway ()) { 186 if (vp.GetCutawayMode() != fVP.GetCutawayMo 187 if (lastVP.GetCutawayPlanes ().size () != 188 fVP.GetCutawayPlanes ().size ()) return tru 189 for (size_t i = 0; i < lastVP.GetCutawayPla 190 if (lastVP.GetCutawayPlanes()[i] != fVP.Get 191 return true; 192 } 193 ******************************************* 194 195 if (lastVP.GetCBDAlgorithmNumber() > 0) { 196 if (lastVP.GetCBDParameters().size() != fV 197 else if (lastVP.GetCBDParameters() != fVP. 198 } 199 200 if (lastVP.IsExplode () && 201 (lastVP.GetExplodeFactor () != fVP.GetEx 202 return true; 203 204 if (lastVP.IsSpecialMeshRendering() && 205 (lastVP.GetSpecialMeshVolumes() != fVP.G 206 return true; 207 208 return false; 209 } 210 211 G4bool G4OpenGLStoredQtViewer::POSelected(size 212 { 213 return isTouchableVisible((int)POListIndex); 214 } 215 216 G4bool G4OpenGLStoredQtViewer::TOSelected(size 217 { 218 return true; 219 } 220 221 void G4OpenGLStoredQtViewer::DrawView () { 222 #if QT_VERSION < 0x060000 223 #else 224 if(IsGettingPickInfos()) { 225 paintGL(); 226 return; 227 } 228 #endif 229 #if (QT_VERSION < 0x060000) || !defined(G4MULT 230 updateQWidget(); 231 #else 232 if (G4Threading::IsMasterThread()) { 233 updateQWidget(); 234 } else { 235 update(); //G.Barrand: updateQWidget() ind 236 } 237 #endif 238 } 239 240 void G4OpenGLStoredQtViewer::ComputeView () { 241 242 #if QT_VERSION < 0x060000 243 makeCurrent(); 244 #endif 245 246 G4ViewParameters::DrawingStyle dstyle = GetV 247 248 //Make sure current viewer is attached and c 249 250 //See if things have changed from last time 251 // The fNeedKernelVisit flag might have been 252 // /vis/viewer/rebuild, but if not, make dec 253 // if necessary... 254 if (!fNeedKernelVisit) { 255 KernelVisitDecision (); 256 } 257 fLastVP = fVP; 258 G4bool kernelVisitWasNeeded = fNeedKernelVis 259 ProcessView (); 260 261 if (kernelVisitWasNeeded) { 262 displaySceneTreeComponent(); 263 } 264 265 if(dstyle!=G4ViewParameters::hlr && 266 haloing_enabled) { 267 268 HaloingFirstPass (); 269 DrawDisplayLists (); 270 glFlush (); 271 272 HaloingSecondPass (); 273 274 DrawDisplayLists (); 275 FinishView (); 276 277 } else { 278 279 // If kernel visit was needed, drawing and 280 // have been done, so... 281 if (!kernelVisitWasNeeded) { 282 DrawDisplayLists (); 283 FinishView (); 284 } else { 285 // However, union cutaways are implement 286 // an extra pass... 287 if (fVP.IsCutaway() && 288 fVP.GetCutawayMode() == G4ViewParame 289 ClearView(); 290 DrawDisplayLists (); 291 FinishView (); 292 } else { // ADD TO AVOID KernelVisit=1 a 293 DrawDisplayLists (); 294 FinishView (); 295 } 296 } 297 } 298 299 if (isRecording()) { 300 savePPMToTemp(); 301 } 302 303 #if QT_VERSION < 0x060000 304 fHasToRepaint = true; 305 #endif 306 } 307 308 309 /** 310 - Lors du resize de la fenetre, on doit non 311 */ 312 void G4OpenGLStoredQtViewer::resizeGL( 313 int aWid 314 ,int aHe 315 { 316 // Set new size, it will be update when next 317 if ((aWidth > 0) && (aHeight > 0)) { 318 #if QT_VERSION < 0x060000 319 ResizeWindow(aWidth,aHeight); 320 fHasToRepaint = sizeHasChanged(); 321 #else 322 ResizeWindow(devicePixelRatio()*aWidth,dev 323 #endif 324 } 325 } 326 327 328 // We have to get several case : 329 // - Only activate the windows (mouse click fo 330 // - resize window -> redraw 331 // - try to avoid recompute everything if we d 332 333 void G4OpenGLStoredQtViewer::paintGL() 334 { 335 #if QT_VERSION < 0x060000 336 updateToolbarAndMouseContextMenu(); 337 #else 338 //G.Barrand: don't do any change in the GUI 339 #endif 340 341 #if QT_VERSION < 0x060000 342 if (fPaintEventLock) { 343 // return ; 344 } 345 fPaintEventLock = true; 346 if ((getWinWidth() == 0) && (getWinHeight() 347 return; 348 } 349 350 if (!fQGLWidgetInitialiseCompleted) { 351 fPaintEventLock = false; 352 return; 353 } 354 355 // DO NOT RESIZE IF SIZE HAS NOT CHANGE : 356 // WHEN CLICK ON THE FRAME FOR EXAMPLE 357 // EXECEPT WHEN MOUSE MOVE EVENT 358 if ( !fHasToRepaint) { 359 // L. Garnier : Trap to get the size with 360 // Tested on Qt4.5 on mac, 4.4 on windows, 361 int sw = 0; 362 int sh = 0; 363 if (!isMaximized() && !isFullScreen()) { 364 sw = normalGeometry().width(); 365 sh = normalGeometry().height(); 366 } else { 367 sw = frameGeometry().width(); 368 sh = frameGeometry().height(); 369 } 370 if ((getWinWidth() == (unsigned int)sw) && 371 return; 372 } 373 } 374 #else 375 if ((getWinWidth() == 0) && (getWinHeight() 376 #endif 377 378 #if QT_VERSION < 0x060000 379 #else 380 InitializeGLView (); 381 #endif 382 383 // Ensure that we really draw the BACK buffe 384 glDrawBuffer (GL_BACK); 385 386 SetView(); 387 388 ClearView (); //ok, put the background corre 389 ComputeView(); 390 391 #if QT_VERSION < 0x060000 392 fHasToRepaint = false; 393 394 fPaintEventLock = false; 395 #endif 396 } 397 398 #if QT_VERSION < 0x060000 399 void G4OpenGLStoredQtViewer::paintEvent(QPaint 400 if (! fQGLWidgetInitialiseCompleted) { 401 return; 402 } 403 // Force a repaint next time if the FRAMEBUF 404 fHasToRepaint = isFramebufferReady(); 405 if ( fHasToRepaint) { 406 // Will really update the widget by callin 407 // The widget's rendering context will bec 408 // will be called if it hasn't already bee 409 // Copies the back buffer of a double-buff 410 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) 411 updateGL(); 412 #else 413 // Not sure this is correct.... 414 paintGL(); 415 #endif 416 } 417 } 418 #endif 419 420 void G4OpenGLStoredQtViewer::mousePressEvent(Q 421 { 422 G4MousePressEvent(event); 423 } 424 425 void G4OpenGLStoredQtViewer::keyPressEvent (QK 426 { 427 G4keyPressEvent(event); 428 } 429 430 void G4OpenGLStoredQtViewer::keyReleaseEvent ( 431 { 432 G4keyReleaseEvent(event); 433 } 434 435 void G4OpenGLStoredQtViewer::wheelEvent (QWhee 436 { 437 G4wheelEvent(event); 438 } 439 440 #if QT_VERSION < 0x060000 441 void G4OpenGLStoredQtViewer::showEvent (QShowE 442 { 443 if (fQGLWidgetInitialiseCompleted) { 444 fHasToRepaint = true; 445 } 446 } 447 #endif 448 449 /** 450 * This function was build in order to make a 451 * It was think to build a rubberband on the z 452 */ 453 void G4OpenGLStoredQtViewer::mouseDoubleClickE 454 { 455 G4MouseDoubleClickEvent(); 456 } 457 458 void G4OpenGLStoredQtViewer::mouseReleaseEvent 459 { 460 G4MouseReleaseEvent(event); 461 } 462 463 void G4OpenGLStoredQtViewer::mouseMoveEvent(QM 464 { 465 G4MouseMoveEvent(event); 466 } 467 468 469 void G4OpenGLStoredQtViewer::contextMenuEvent( 470 { 471 G4manageContextMenuEvent(e); 472 } 473 474 void G4OpenGLStoredQtViewer::updateQWidget() { 475 #if QT_VERSION < 0x060000 476 if (fUpdateGLLock) { 477 return; 478 } 479 480 if (! isCurrentWidget()){ 481 return; 482 } 483 484 fUpdateGLLock = true; 485 fHasToRepaint= true; 486 // Will really update the widget by calling 487 // The widget's rendering context will becom 488 // will be called if it hasn't already been 489 // Copies the back buffer of a double-buffer 490 repaint(); // will read scene tree state 491 // updateGL() // From J.Allison picking bran 492 updateViewerPropertiesTableWidget(); 493 updateSceneTreeWidget(); 494 fUpdateGLLock = false; 495 #else 496 //if (!isCurrentWidget()) return; //G.Barran 497 //G.Barrand: don't do any change in the GUI 498 update(); 499 #endif 500 } 501 502 void G4OpenGLStoredQtViewer::ShowView () 503 { 504 activateWindow(); 505 #if 0x060000 <= QT_VERSION 506 ((QApplication*)G4Qt::getInstance ())->proce 507 #endif 508 } 509 510 511 void G4OpenGLStoredQtViewer::DisplayTimePOColo 512 G4Colour& c, 513 size_t poIndex) { 514 c = getColorForPoIndex((int)poIndex); 515 } 516