G4OpenGLImmediateQtViewer.cc

Go to the documentation of this file.
00001 //
00002 // ********************************************************************
00003 // * License and Disclaimer                                           *
00004 // *                                                                  *
00005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
00006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
00007 // * conditions of the Geant4 Software License,  included in the file *
00008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
00009 // * include a list of copyright holders.                             *
00010 // *                                                                  *
00011 // * Neither the authors of this software system, nor their employing *
00012 // * institutes,nor the agencies providing financial support for this *
00013 // * work  make  any representation or  warranty, express or implied, *
00014 // * regarding  this  software system or assume any liability for its *
00015 // * use.  Please see the license in the file  LICENSE  and URL above *
00016 // * for the full disclaimer and the limitation of liability.         *
00017 // *                                                                  *
00018 // * This  code  implementation is the result of  the  scientific and *
00019 // * technical work of the GEANT4 collaboration.                      *
00020 // * By using,  copying,  modifying or  distributing the software (or *
00021 // * any work based  on the software)  you  agree  to acknowledge its *
00022 // * use  in  resulting  scientific  publications,  and indicate your *
00023 // * acceptance of all terms of the Geant4 Software license.          *
00024 // ********************************************************************
00025 //
00026 //
00027 // $Id$
00028 //
00029 //
00030 // Class G4OpenGLImmediateQtViewer : a class derived from G4OpenGLQtViewer and
00031 //                                G4OpenGLImmediateViewer.
00032 
00033 #ifdef G4VIS_BUILD_OPENGLQT_DRIVER
00034 
00035 #include "G4OpenGLImmediateQtViewer.hh"
00036 #include "G4OpenGLImmediateSceneHandler.hh"
00037 
00038 #include "G4ios.hh"
00039 
00040 #include <qapplication.h>
00041 
00042 G4OpenGLImmediateQtViewer::G4OpenGLImmediateQtViewer
00043 (G4OpenGLImmediateSceneHandler& sceneHandler,
00044  const G4String&  name):
00045   G4VViewer (sceneHandler, sceneHandler.IncrementViewCount (), name),
00046   G4OpenGLViewer (sceneHandler),
00047   G4OpenGLQtViewer (sceneHandler),
00048   G4OpenGLImmediateViewer (sceneHandler)
00049 {
00050 
00051   setFocusPolicy(Qt::StrongFocus); // enable keybord events
00052   fHasToRepaint = false;
00053   fIsRepainting = false;
00054 
00055   resize(fVP.GetWindowSizeHintX(),fVP.GetWindowSizeHintY());
00056 
00057   if (fViewId < 0) return;  // In case error in base class instantiation.
00058 }
00059 
00060 G4OpenGLImmediateQtViewer::~G4OpenGLImmediateQtViewer() {
00061   makeCurrent();
00062 }
00063 
00064 void G4OpenGLImmediateQtViewer::Initialise() {
00065 #ifdef G4DEBUG_VIS_OGL
00066   printf("G4OpenGLImmediateQtViewer::Initialise \n");
00067 #endif
00068   fReadyToPaint = false;
00069   CreateMainWindow (this,QString(GetName()));
00070   CreateFontLists ();
00071 
00072   fReadyToPaint = true;
00073 }
00074 
00075 void G4OpenGLImmediateQtViewer::initializeGL () {
00076 
00077   InitializeGLView ();
00078 
00079   // If a double buffer context has been forced upon us, ignore the
00080   // back buffer for this OpenGLImmediate view.
00081   //  glDrawBuffer (GL_FRONT); // FIXME : Ne marche pas avec cette ligne, mais affiche le run correctement...
00082 
00083   if (fSceneHandler.GetScene() == 0) {
00084     fHasToRepaint =false;
00085   } else {
00086     fHasToRepaint =true;
00087   }
00088 
00089   // Set the component visible
00090   setVisible(true) ;
00091   
00092   // and update it immediatly before wait for SessionStart() (batch mode)
00093   QCoreApplication::sendPostedEvents () ;
00094 }
00095 
00096 
00097 void  G4OpenGLImmediateQtViewer::DrawView() {
00098   updateQWidget();
00099 }
00100 
00101 
00102 void G4OpenGLImmediateQtViewer::ComputeView () {
00103 
00104 #ifdef G4DEBUG_VIS_OGL
00105   printf("G4OpenGLImmediateQtViewer::ComputeView %d %d   VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\n",getWinWidth(), getWinHeight());
00106 #endif
00107   makeCurrent();
00108   // If a double buffer context has been forced upon us, ignore the
00109   // back buffer for this OpenGLImmediate view.
00110   //  glDrawBuffer (GL_FRONT);
00111 
00112   G4ViewParameters::DrawingStyle dstyle = GetViewParameters().GetDrawingStyle();
00113 
00114   if(dstyle!=G4ViewParameters::hlr &&
00115      haloing_enabled) {
00116 
00117     HaloingFirstPass ();
00118     NeedKernelVisit ();
00119     ProcessView ();
00120     FinishView();
00121 #ifdef G4DEBUG_VIS_OGL
00122   printf("G4OpenGLImmediateQtViewer::ComputeView First ProcessView ok\n");
00123 #endif
00124     HaloingSecondPass ();
00125 
00126   }
00127 
00128   NeedKernelVisit ();  // Always need to visit G4 kernel.
00129   ProcessView ();
00130 
00131   if (isRecording()) {
00132     savePPMToTemp();
00133   }
00134    
00135 #ifdef G4DEBUG_VIS_OGL
00136   printf("G4OpenGLImmediateQtViewer::ComputeView %d %d ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ \n",getWinWidth(), getWinHeight());
00137 #endif
00138   fHasToRepaint = true;
00139 }
00140 
00144 void G4OpenGLImmediateQtViewer::resizeGL(
00145  int aWidth
00146 ,int aHeight)
00147 {  
00148   if ((aWidth > 0) && (aHeight > 0)) {
00149     ResizeWindow(aWidth,aHeight);
00150     fHasToRepaint = sizeHasChanged();
00151   }
00152 }
00153 
00154 
00155 void G4OpenGLImmediateQtViewer::paintGL()
00156 {
00157   updateToolbarAndMouseContextMenu();
00158 
00159   if (fIsRepainting) {
00160     //    return ;
00161   }
00162   if (!fReadyToPaint) {
00163     fReadyToPaint= true;
00164     return;
00165   }
00166   if ((getWinWidth() == 0) && (getWinHeight() == 0)) {
00167       return;
00168   }
00169 
00170   // DO NOT RESIZE IF SIZE HAS NOT CHANGE
00171   if ( !fHasToRepaint) {
00172     // L. Garnier : Trap to get the size with mac OSX 10.6 and Qt 4.6(devel)
00173     // Tested on Qt4.5 on mac, 4.4 on windows, 4.5 on unbuntu
00174     int sw = 0;
00175     int sh = 0;
00176     if (!isMaximized() && !isFullScreen()) {
00177       sw = normalGeometry().width();
00178       sh = normalGeometry().height();
00179     } else {
00180       sw = frameGeometry().width();
00181       sh = frameGeometry().height();
00182     }
00183     if ((getWinWidth() == (unsigned int)sw) &&(getWinHeight() == (unsigned int)sh)) {
00184       return;
00185 
00186     } else if ((sw == 0) && (sh == 0)) { // NOT A TOP LEVEL WIDGET
00187       if (((getWinWidth() == (unsigned int)width())) &&(getWinHeight() == (unsigned int) height())) { 
00188         return;
00189       }
00190     }
00191   }
00192 #ifdef G4DEBUG_VIS_OGL
00193   printf("G4OpenGLImmediateQtViewer::paintGL VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV ready %d\n",fReadyToPaint);
00194 #endif
00195 
00196   SetView();
00197    
00198   ClearView (); //ok, put the background correct
00199   ComputeView();
00200 
00201   fHasToRepaint = false; // could be set to false by ComputeView
00202 
00203 #ifdef G4DEBUG_VIS_OGL
00204   printf("G4OpenGLImmediateQtViewer::paintGL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ready %d\n\n\n",fReadyToPaint);
00205 #endif
00206   fIsRepainting = false;
00207 }
00208 
00209 void G4OpenGLImmediateQtViewer::mousePressEvent(QMouseEvent *event)
00210 {
00211   G4MousePressEvent(event);
00212 }
00213 
00214 void G4OpenGLImmediateQtViewer::keyPressEvent (QKeyEvent * event) 
00215 {
00216   G4keyPressEvent(event);
00217 }
00218 
00219 void G4OpenGLImmediateQtViewer::wheelEvent (QWheelEvent * event) 
00220 {
00221   G4wheelEvent(event);
00222 }
00223 
00224 void G4OpenGLImmediateQtViewer::showEvent (QShowEvent *) 
00225 {
00226   fHasToRepaint = true;
00227 }
00228 
00229 
00234 void G4OpenGLImmediateQtViewer::mouseDoubleClickEvent(QMouseEvent *)
00235 {
00236   G4MouseDoubleClickEvent();
00237 }
00238 
00239 void G4OpenGLImmediateQtViewer::mouseReleaseEvent(QMouseEvent *)
00240 {
00241   G4MouseReleaseEvent();
00242 }
00243 
00244 void G4OpenGLImmediateQtViewer::mouseMoveEvent(QMouseEvent *event)
00245 {
00246   G4MouseMoveEvent(event);
00247 }
00248 
00249 
00250 void G4OpenGLImmediateQtViewer::contextMenuEvent(QContextMenuEvent *e)
00251 {
00252   G4manageContextMenuEvent(e);
00253 }
00254 
00255 void G4OpenGLImmediateQtViewer::paintEvent(QPaintEvent *) {
00256   if ( fHasToRepaint) {
00257     updateGL();
00258   }
00259 }
00260 
00261 
00262 void G4OpenGLImmediateQtViewer::updateQWidget() {
00263   fHasToRepaint= true;
00264   updateGL();
00265   repaint();
00266   fHasToRepaint= false;
00267 }
00268 
00269 
00270 void G4OpenGLImmediateQtViewer::ShowView (
00271 ) 
00272 
00273 
00274 {
00275   fHasToRepaint = true;
00276   activateWindow();
00277 }
00278 #endif

Generated on Mon May 27 17:49:09 2013 for Geant4 by  doxygen 1.4.7