Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenGL/src/G4OpenGLViewer.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /visualization/OpenGL/src/G4OpenGLViewer.cc (Version 11.3.0) and /visualization/OpenGL/src/G4OpenGLViewer.cc (Version 10.1.p3)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 //                                                 26 //
                                                   >>  27 // $Id: G4OpenGLViewer.cc 87443 2014-12-04 12:26:31Z gunter $
 27 //                                                 28 //
 28 //                                                 29 // 
 29 // Andrew Walkden  27th March 1996                 30 // Andrew Walkden  27th March 1996
 30 // OpenGL view - opens window, hard copy, etc.     31 // OpenGL view - opens window, hard copy, etc.
 31                                                    32 
                                                   >>  33 #ifdef G4VIS_BUILD_OPENGL_DRIVER
                                                   >>  34 
 32 #include "G4ios.hh"                                35 #include "G4ios.hh"
 33 #include <CLHEP/Units/SystemOfUnits.h>         <<  36 #include "G4SystemOfUnits.hh"
 34 #include "G4OpenGLViewer.hh"                       37 #include "G4OpenGLViewer.hh"
 35 #include "G4OpenGLSceneHandler.hh"                 38 #include "G4OpenGLSceneHandler.hh"
 36 #include "G4OpenGLTransform3D.hh"                  39 #include "G4OpenGLTransform3D.hh"
 37                                                <<  40 #include "G4OpenGL2PSAction.hh"
 38 #include "G4gl2ps.hh"                          << 
 39 #define GL2PS_TEXT_B  TOOLS_GL2PS_TEXT_B       << 
 40 #define GL2PS_TEXT_BL TOOLS_GL2PS_TEXT_BL      << 
 41 #define GL2PS_TEXT_BR TOOLS_GL2PS_TEXT_BR      << 
 42                                                    41 
 43 #include "G4Scene.hh"                              42 #include "G4Scene.hh"
 44 #include "G4VisExtent.hh"                          43 #include "G4VisExtent.hh"
 45 #include "G4LogicalVolume.hh"                      44 #include "G4LogicalVolume.hh"
 46 #include "G4VSolid.hh"                             45 #include "G4VSolid.hh"
 47 #include "G4Point3D.hh"                            46 #include "G4Point3D.hh"
 48 #include "G4Normal3D.hh"                           47 #include "G4Normal3D.hh"
 49 #include "G4Plane3D.hh"                            48 #include "G4Plane3D.hh"
 50 #include "G4AttHolder.hh"                          49 #include "G4AttHolder.hh"
 51 #include "G4AttCheck.hh"                           50 #include "G4AttCheck.hh"
 52 #include "G4Text.hh"                               51 #include "G4Text.hh"
 53                                                    52 
                                                   >>  53 #ifdef G4OPENGL_VERSION_2
                                                   >>  54 // We need to have a Wt gl drawer because we will draw inside the WtGL component (ImmediateWtViewer)
                                                   >>  55 #include "G4OpenGLVboDrawer.hh"
                                                   >>  56 #endif
                                                   >>  57 
                                                   >>  58 // GL2PS
                                                   >>  59 #include "Geant4_gl2ps.h"
                                                   >>  60 
 54 #include <sstream>                                 61 #include <sstream>
 55 #include <string>                                  62 #include <string>
 56 #include <iomanip>                             <<  63 
                                                   >>  64 //#define G4DEBUG_VIS_OGL 1
 57                                                    65 
 58 G4OpenGLViewer::G4OpenGLViewer (G4OpenGLSceneH     66 G4OpenGLViewer::G4OpenGLViewer (G4OpenGLSceneHandler& scene):
 59 G4VViewer (scene, -1),                             67 G4VViewer (scene, -1),
                                                   >>  68 #ifdef G4OPENGL_VERSION_2
                                                   >>  69 fVboDrawer(NULL),
                                                   >>  70 #endif
 60 fPrintColour (true),                               71 fPrintColour (true),
 61 fVectoredPs (true),                                72 fVectoredPs (true),
 62 fOpenGLSceneHandler(scene),                        73 fOpenGLSceneHandler(scene),
 63 background (G4Colour(0.,0.,0.)),                   74 background (G4Colour(0.,0.,0.)),
 64 transparency_enabled (true),                       75 transparency_enabled (true),
 65 antialiasing_enabled (false),                      76 antialiasing_enabled (false),
 66 haloing_enabled (false),                           77 haloing_enabled (false),
                                                   >>  78 fStartTime(-DBL_MAX),
                                                   >>  79 fEndTime(DBL_MAX),
                                                   >>  80 fFadeFactor(0.),
                                                   >>  81 fDisplayHeadTime(false),
                                                   >>  82 fDisplayHeadTimeX(-0.9),
                                                   >>  83 fDisplayHeadTimeY(-0.9),
                                                   >>  84 fDisplayHeadTimeSize(24.),
                                                   >>  85 fDisplayHeadTimeRed(0.),
                                                   >>  86 fDisplayHeadTimeGreen(1.),
                                                   >>  87 fDisplayHeadTimeBlue(1.),
                                                   >>  88 fDisplayLightFront(false),
                                                   >>  89 fDisplayLightFrontX(0.),
                                                   >>  90 fDisplayLightFrontY(0.),
                                                   >>  91 fDisplayLightFrontZ(0.),
                                                   >>  92 fDisplayLightFrontT(0.),
                                                   >>  93 fDisplayLightFrontRed(0.),
                                                   >>  94 fDisplayLightFrontGreen(1.),
                                                   >>  95 fDisplayLightFrontBlue(0.),
 67 fRot_sens(1.),                                     96 fRot_sens(1.),
 68 fPan_sens(0.01),                                   97 fPan_sens(0.01),
 69 fWinSize_x(0),                                     98 fWinSize_x(0),
 70 fWinSize_y(0),                                     99 fWinSize_y(0),
 71 fDefaultExportImageFormat("pdf"),                 100 fDefaultExportImageFormat("pdf"),
 72 fExportImageFormat("pdf"),                        101 fExportImageFormat("pdf"),
 73 fExportFilenameIndex(0),                          102 fExportFilenameIndex(0),
 74 fPrintSizeX(-1),                                  103 fPrintSizeX(-1),
 75 fPrintSizeY(-1),                                  104 fPrintSizeY(-1),
 76 fPointSize (0),                                   105 fPointSize (0),
 77 fDefaultExportFilename("G4OpenGL"),               106 fDefaultExportFilename("G4OpenGL"),
 78 fSizeHasChanged(0),                               107 fSizeHasChanged(0),
 79 fGl2psDefaultLineWith(1),                         108 fGl2psDefaultLineWith(1),
 80 fGl2psDefaultPointSize(2),                        109 fGl2psDefaultPointSize(2),
 81 fGlViewInitialized(false),                        110 fGlViewInitialized(false),
 82 fIsGettingPickInfos(false)                        111 fIsGettingPickInfos(false)
                                                   >> 112 #ifdef G4OPENGL_VERSION_2
                                                   >> 113 ,fShaderProgram(0)
                                                   >> 114 ,fVertexPositionAttribute(0)
                                                   >> 115 ,fVertexNormalAttribute(0)
                                                   >> 116 ,fpMatrixUniform(0)
                                                   >> 117 ,fcMatrixUniform(0)
                                                   >> 118 ,fmvMatrixUniform(0)
                                                   >> 119 ,fnMatrixUniform(0)
                                                   >> 120 #endif
 83 {                                                 121 {
                                                   >> 122 #ifdef G4DEBUG_VIS_OGL
                                                   >> 123   printf("G4OpenGLViewer:: Creation\n");
                                                   >> 124 #endif
 84   // Make changes to view parameters for OpenG    125   // Make changes to view parameters for OpenGL...
 85   fVP.SetAutoRefresh(true);                       126   fVP.SetAutoRefresh(true);
 86   fDefaultVP.SetAutoRefresh(true);                127   fDefaultVP.SetAutoRefresh(true);
 87   fGL2PSAction = new G4gl2ps();                << 128 
 88   tools_gl2ps_gl_funcs_t _funcs = {            << 129   fGL2PSAction = new G4OpenGL2PSAction();
 89     (tools_glIsEnabled_func)glIsEnabled,       << 130 
 90     (tools_glBegin_func)glBegin,               << 
 91     (tools_glEnd_func)glEnd,                   << 
 92     (tools_glGetFloatv_func)glGetFloatv,       << 
 93     (tools_glVertex3f_func)glVertex3f,         << 
 94     (tools_glGetBooleanv_func)glGetBooleanv,   << 
 95     (tools_glGetIntegerv_func)glGetIntegerv,   << 
 96     (tools_glRenderMode_func)glRenderMode,     << 
 97     (tools_glFeedbackBuffer_func)glFeedbackBuf << 
 98     (tools_glPassThrough_func)glPassThrough    << 
 99   };                                           << 
100   fGL2PSAction->setOpenGLFunctions(&_funcs);   << 
101                                                << 
102   // add supported export image format            131   // add supported export image format
103   addExportImageFormat("eps");                    132   addExportImageFormat("eps");
104   addExportImageFormat("ps");                     133   addExportImageFormat("ps");
105   addExportImageFormat("pdf");                    134   addExportImageFormat("pdf");
106   addExportImageFormat("svg");                    135   addExportImageFormat("svg");
107                                                   136 
108   // Change the default name                      137   // Change the default name
109   fExportFilename += fDefaultExportFilename +     138   fExportFilename += fDefaultExportFilename + "_" + GetShortName().data();
110                                                   139   
111   //  glClearColor (0.0, 0.0, 0.0, 0.0);          140   //  glClearColor (0.0, 0.0, 0.0, 0.0);
112   //  glClearDepth (1.0);                         141   //  glClearDepth (1.0);
113   //  glDisable (GL_BLEND);                       142   //  glDisable (GL_BLEND);
114   //  glDisable (GL_LINE_SMOOTH);                 143   //  glDisable (GL_LINE_SMOOTH);
115   //  glDisable (GL_POLYGON_SMOOTH);              144   //  glDisable (GL_POLYGON_SMOOTH);
116                                                   145 
117 }                                                 146 }
118                                                   147 
119 G4OpenGLViewer::~G4OpenGLViewer ()                148 G4OpenGLViewer::~G4OpenGLViewer ()
120 {                                                 149 {
121   delete fGL2PSAction;                            150   delete fGL2PSAction;
122 }                                                 151 }
123                                                   152 
124 void G4OpenGLViewer::InitializeGLView ()          153 void G4OpenGLViewer::InitializeGLView () 
125 {                                                 154 {
126   if (fWinSize_x == 0) {                       << 155 #ifdef G4OPENGL_VERSION_2
127     fWinSize_x = fVP.GetWindowSizeHintX();     << 156   if (fVboDrawer) {
128   }                                            << 157     
129   if (fWinSize_y == 0) {                       << 158     // First, load a simple shader
130     fWinSize_y = fVP.GetWindowSizeHintY();     << 159     fShaderProgram = glCreateProgram();
                                                   >> 160     Shader vertexShader = glCreateShader(GL_VERTEX_SHADER);
                                                   >> 161     const char * vSrc = fVboDrawer->getVertexShaderSrc();
                                                   >> 162     glShaderSource(vertexShader, 1, &vSrc, NULL);
                                                   >> 163     glCompileShader(vertexShader);
                                                   >> 164     glAttachShader(fShaderProgram, vertexShader);
                                                   >> 165     
                                                   >> 166     Shader fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
                                                   >> 167     const char * fSrc = fVboDrawer->getFragmentShaderSrc();
                                                   >> 168     glShaderSource(fragmentShader, 1, &fSrc, NULL);
                                                   >> 169     glCompileShader(fragmentShader);
                                                   >> 170     
                                                   >> 171     glAttachShader(fShaderProgram, fragmentShader);
                                                   >> 172     glLinkProgram(fShaderProgram);
                                                   >> 173     glUseProgram(fShaderProgram);
                                                   >> 174     
                                                   >> 175     //   UniformLocation uColor = getUniformLocation(fShaderProgram, "uColor");
                                                   >> 176     //   uniform4fv(uColor, [0.0, 0.3, 0.0, 1.0]);
                                                   >> 177     
                                                   >> 178     // Extract the references to the attributes from the shader.
                                                   >> 179     
                                                   >> 180     fVertexPositionAttribute =
                                                   >> 181     glGetAttribLocation(fShaderProgram, "aVertexPosition");
                                                   >> 182     
                                                   >> 183     
                                                   >> 184     glEnableVertexAttribArray(fVertexPositionAttribute);
                                                   >> 185     
                                                   >> 186     // Extract the references the uniforms from the shader
                                                   >> 187     fpMatrixUniform  = glGetUniformLocation(fShaderProgram, "uPMatrix");
                                                   >> 188     fcMatrixUniform  = glGetUniformLocation(fShaderProgram, "uCMatrix");
                                                   >> 189     fmvMatrixUniform = glGetUniformLocation(fShaderProgram, "uMVMatrix");
                                                   >> 190     fnMatrixUniform  = glGetUniformLocation(fShaderProgram, "uNMatrix");
                                                   >> 191     ftMatrixUniform  = glGetUniformLocation(fShaderProgram, "uTMatrix");
                                                   >> 192     
                                                   >> 193     /*    glUniformMatrix4fv(fcMatrixUniform, 1, 0, identity);
                                                   >> 194      glUniformMatrix4fv(fpMatrixUniform, 1, 0, identity);
                                                   >> 195      glUniformMatrix4fv(ftMatrixUniform, 1, 0, identity);
                                                   >> 196      glUniformMatrix4fv(fmvMatrixUniform, 1, 0, identity);
                                                   >> 197      */
                                                   >> 198     // We have to set that in order to avoid calls on opengl commands before all is ready
                                                   >> 199     fGlViewInitialized = true;
131   }                                               200   }
                                                   >> 201 #endif
                                                   >> 202   
                                                   >> 203 #ifdef G4DEBUG_VIS_OGL
                                                   >> 204   printf("G4OpenGLViewer::InitializeGLView\n");
                                                   >> 205 #endif
                                                   >> 206 
                                                   >> 207   fWinSize_x = fVP.GetWindowSizeHintX();
                                                   >> 208   fWinSize_y = fVP.GetWindowSizeHintY();
132                                                   209 
133   glClearColor (0.0, 0.0, 0.0, 0.0);              210   glClearColor (0.0, 0.0, 0.0, 0.0);
134   glClearDepth (1.0);                             211   glClearDepth (1.0);
                                                   >> 212 #ifndef G4OPENGL_VERSION_2
135   glDisable (GL_LINE_SMOOTH);                     213   glDisable (GL_LINE_SMOOTH);
136   glDisable (GL_POLYGON_SMOOTH);                  214   glDisable (GL_POLYGON_SMOOTH);
                                                   >> 215 #endif
137                                                   216 
138 // clear the buffers and window?                  217 // clear the buffers and window?
139   ClearView ();                                   218   ClearView ();
140   FinishView ();                                  219   FinishView ();
141                                                   220   
142   glDepthFunc (GL_LEQUAL);                        221   glDepthFunc (GL_LEQUAL);
143   glDepthMask (GL_TRUE);                          222   glDepthMask (GL_TRUE);
144                                                   223   
145   glEnable (GL_BLEND);                            224   glEnable (GL_BLEND);
146   glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_    225   glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
147                                                   226   
148 }                                              << 227 #ifdef G4DEBUG_VIS_OGL
                                                   >> 228   printf("G4OpenGLViewer::InitializeGLView END\n");
                                                   >> 229 #endif
                                                   >> 230 }  
149                                                   231 
150 void G4OpenGLViewer::ClearView () {               232 void G4OpenGLViewer::ClearView () {
151   ClearViewWithoutFlush();                        233   ClearViewWithoutFlush();
152                                                << 
153   if(!isFramebufferReady()) {                  << 
154     return;                                    << 
155   }                                            << 
156                                                << 
157   glFlush();                                      234   glFlush();
158 }                                                 235 }
159                                                   236 
160                                                   237 
161 void G4OpenGLViewer::ClearViewWithoutFlush ()     238 void G4OpenGLViewer::ClearViewWithoutFlush () {
162   // Ready for clear ?                            239   // Ready for clear ?
163   // See : http://lists.apple.com/archives/mac    240   // See : http://lists.apple.com/archives/mac-opengl/2012/Jul/msg00038.html
164   if(!isFramebufferReady()) {                  << 241 #if GL_EXT_framebuffer_object
165     return;                                    << 242 //  if ( glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_UNDEFINED) {
166   }                                            << 243 //    return;
                                                   >> 244 //  }
                                                   >> 245 #endif
167                                                   246   
168   glClearColor (background.GetRed(),              247   glClearColor (background.GetRed(),
169                 background.GetGreen(),            248                 background.GetGreen(),
170                 background.GetBlue(),             249                 background.GetBlue(),
171                 1.);                              250                 1.);
172   glClearDepth (1.0);                             251   glClearDepth (1.0);
173   //Below line does not compile with Mesa incl    252   //Below line does not compile with Mesa includes.
174   //glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BU    253   //glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
175   glClear (GL_COLOR_BUFFER_BIT);                  254   glClear (GL_COLOR_BUFFER_BIT);
176   glClear (GL_DEPTH_BUFFER_BIT);                  255   glClear (GL_DEPTH_BUFFER_BIT);
177   glClear (GL_STENCIL_BUFFER_BIT);                256   glClear (GL_STENCIL_BUFFER_BIT);
178 }                                                 257 }
179                                                   258 
180                                                   259 
181 void G4OpenGLViewer::ResizeWindow(unsigned int    260 void G4OpenGLViewer::ResizeWindow(unsigned int aWidth, unsigned int aHeight) {
182   if ((fWinSize_x != aWidth) || (fWinSize_y !=    261   if ((fWinSize_x != aWidth) || (fWinSize_y != aHeight)) {
183     fWinSize_x = aWidth;                          262     fWinSize_x = aWidth;
184     fWinSize_y = aHeight;                         263     fWinSize_y = aHeight;
185     fSizeHasChanged = true;                       264     fSizeHasChanged = true;
186   } else {                                        265   } else {
187     fSizeHasChanged = false;                      266     fSizeHasChanged = false;
188   }                                               267   }
189 }                                                 268 }
190                                                   269 
191 /**                                               270 /**
192  * Set the viewport of the scene                  271  * Set the viewport of the scene
193  * MAXIMUM SIZE is :                              272  * MAXIMUM SIZE is :
194  * GLint dims[2];                                 273  * GLint dims[2];
195  * glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims);     274  * glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims);
196  */                                               275  */
197 void G4OpenGLViewer::ResizeGLView()               276 void G4OpenGLViewer::ResizeGLView()
198 {                                                 277 {
                                                   >> 278 #ifdef G4DEBUG_VIS_OGL
                                                   >> 279   printf("G4OpenGLViewer::ResizeGLView %d %d %#lx\n",fWinSize_x,fWinSize_y,(unsigned long)this);
                                                   >> 280 #endif
199   // Check size                                   281   // Check size
200   GLint dims[2];                                  282   GLint dims[2];
201   dims[0] = 0;                                    283   dims[0] = 0;
202   dims[1] = 0;                                    284   dims[1] = 0;
203                                                   285 
204   glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims);      286   glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims);
205                                                   287 
206   if ((dims[0] !=0 ) && (dims[1] !=0)) {          288   if ((dims[0] !=0 ) && (dims[1] !=0)) {
207                                                   289 
208     if (fWinSize_x > (unsigned)dims[0]) {         290     if (fWinSize_x > (unsigned)dims[0]) {
209       G4cerr << "Try to resize view greater th    291       G4cerr << "Try to resize view greater than max X viewport dimension. Desired size "<<fWinSize_x <<" is resize to "<<  dims[0] << G4endl;
210       fWinSize_x = dims[0];                       292       fWinSize_x = dims[0];
211     }                                             293     }
212     if (fWinSize_y > (unsigned)dims[1]) {         294     if (fWinSize_y > (unsigned)dims[1]) {
213       G4cerr << "Try to resize view greater th    295       G4cerr << "Try to resize view greater than max Y viewport dimension. Desired size "<<fWinSize_y <<" is resize to "<<  dims[1] << G4endl;
214       fWinSize_y = dims[1];                       296       fWinSize_y = dims[1];
215     }                                             297     }
216   }                                               298   }
217                                                   299     
218   glViewport(0, 0, fWinSize_x,fWinSize_y);        300   glViewport(0, 0, fWinSize_x,fWinSize_y);   
219                                                   301 
220                                                   302 
221 }                                                 303 }
222                                                   304 
223                                                   305 
224 void G4OpenGLViewer::SetView () {                 306 void G4OpenGLViewer::SetView () {
225   // if getting pick infos, should not resize     307   // if getting pick infos, should not resize the view.
226   if (fIsGettingPickInfos) return;                308   if (fIsGettingPickInfos) return;
227                                                   309   
228   if (!fSceneHandler.GetScene()) {                310   if (!fSceneHandler.GetScene()) {
229     return;                                       311     return;
230   }                                               312   }
231   // Calculates view representation based on e    313   // Calculates view representation based on extent of object being
232   // viewed and (initial) viewpoint.  (Note: i    314   // viewed and (initial) viewpoint.  (Note: it can change later due
233   // to user interaction via visualization sys    315   // to user interaction via visualization system's GUI.)
234                                                   316   
235   // Lighting.                                    317   // Lighting.
236   GLfloat lightPosition [4];                      318   GLfloat lightPosition [4];
237   lightPosition [0] = fVP.GetActualLightpointD    319   lightPosition [0] = fVP.GetActualLightpointDirection().x();
238   lightPosition [1] = fVP.GetActualLightpointD    320   lightPosition [1] = fVP.GetActualLightpointDirection().y();
239   lightPosition [2] = fVP.GetActualLightpointD    321   lightPosition [2] = fVP.GetActualLightpointDirection().z();
240   lightPosition [3] = 0.;                         322   lightPosition [3] = 0.;
241   // Light position is "true" light direction,    323   // Light position is "true" light direction, so must come after gluLookAt.
242   GLfloat ambient [] = { 0.2f, 0.2f, 0.2f, 1.f << 324   GLfloat ambient [] = { 0.2, 0.2, 0.2, 1.};
243   GLfloat diffuse [] = { 0.8f, 0.8f, 0.8f, 1.f << 325   GLfloat diffuse [] = { 0.8, 0.8, 0.8, 1.};
244   glEnable (GL_LIGHT0);                           326   glEnable (GL_LIGHT0);
245   glLightfv (GL_LIGHT0, GL_AMBIENT, ambient);     327   glLightfv (GL_LIGHT0, GL_AMBIENT, ambient);
246   glLightfv (GL_LIGHT0, GL_DIFFUSE, diffuse);     328   glLightfv (GL_LIGHT0, GL_DIFFUSE, diffuse);
247                                                   329   
248   G4double ratioX = 1;                            330   G4double ratioX = 1;
249   G4double ratioY = 1;                            331   G4double ratioY = 1;
250   if (fWinSize_y > fWinSize_x) {                  332   if (fWinSize_y > fWinSize_x) {
251     ratioX = ((G4double)fWinSize_y) / ((G4doub    333     ratioX = ((G4double)fWinSize_y) / ((G4double)fWinSize_x);
252   }                                               334   }
253   if (fWinSize_x > fWinSize_y) {                  335   if (fWinSize_x > fWinSize_y) {
254     ratioY = ((G4double)fWinSize_x) / ((G4doub    336     ratioY = ((G4double)fWinSize_x) / ((G4double)fWinSize_y);
255   }                                               337   }
256                                                   338   
257   // Get radius of scene, etc.                    339   // Get radius of scene, etc.
258   // Note that this procedure properly takes i    340   // Note that this procedure properly takes into account zoom, dolly and pan.
259   const G4Point3D targetPoint                     341   const G4Point3D targetPoint
260     = fSceneHandler.GetScene()->GetStandardTar    342     = fSceneHandler.GetScene()->GetStandardTargetPoint()
261     + fVP.GetCurrentTargetPoint ();               343     + fVP.GetCurrentTargetPoint ();
262   G4double radius = fSceneHandler.GetScene()->    344   G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius();
263   if(radius<=0.) radius = 1.;                     345   if(radius<=0.) radius = 1.;
264   const G4double cameraDistance = fVP.GetCamer    346   const G4double cameraDistance = fVP.GetCameraDistance (radius);
265   const G4Point3D cameraPosition =                347   const G4Point3D cameraPosition =
266     targetPoint + cameraDistance * fVP.GetView    348     targetPoint + cameraDistance * fVP.GetViewpointDirection().unit();
267   const GLdouble pnear  = fVP.GetNearDistance     349   const GLdouble pnear  = fVP.GetNearDistance (cameraDistance, radius);
268   const GLdouble pfar   = fVP.GetFarDistance      350   const GLdouble pfar   = fVP.GetFarDistance  (cameraDistance, pnear, radius);
269   const GLdouble right  = fVP.GetFrontHalfHeig    351   const GLdouble right  = fVP.GetFrontHalfHeight (pnear, radius) * ratioY;
270   const GLdouble left   = -right;                 352   const GLdouble left   = -right;
271   const GLdouble top    = fVP.GetFrontHalfHeig    353   const GLdouble top    = fVP.GetFrontHalfHeight (pnear, radius) * ratioX;
272   const GLdouble bottom = -top;                   354   const GLdouble bottom = -top;
273                                                   355   
274   // FIXME                                        356   // FIXME
275   ResizeGLView();                                 357   ResizeGLView();
276   //SHOULD SetWindowsSizeHint()...                358   //SHOULD SetWindowsSizeHint()...
277                                                   359 
278   glMatrixMode (GL_PROJECTION); // set up Frus    360   glMatrixMode (GL_PROJECTION); // set up Frustum.
279   glLoadIdentity();                               361   glLoadIdentity();
280                                                   362 
281   const G4Vector3D scaleFactor = fVP.GetScaleF    363   const G4Vector3D scaleFactor = fVP.GetScaleFactor();
282   glScaled(scaleFactor.x(),scaleFactor.y(),sca    364   glScaled(scaleFactor.x(),scaleFactor.y(),scaleFactor.z());
283                                                   365   
284   if (fVP.GetFieldHalfAngle() == 0.) {            366   if (fVP.GetFieldHalfAngle() == 0.) {
285     g4GlOrtho (left, right, bottom, top, pnear << 367     glOrtho (left, right, bottom, top, pnear, pfar);
286   }                                               368   }
287   else {                                          369   else {
288     g4GlFrustum (left, right, bottom, top, pne << 370     glFrustum (left, right, bottom, top, pnear, pfar);
289   }                                               371   }  
290                                                   372 
291   glMatrixMode (GL_MODELVIEW); // apply furthe    373   glMatrixMode (GL_MODELVIEW); // apply further transformations to scene.
292   glLoadIdentity();                               374   glLoadIdentity();
293                                                   375   
294   const G4Normal3D& upVector = fVP.GetUpVector    376   const G4Normal3D& upVector = fVP.GetUpVector ();  
295   G4Point3D gltarget;                             377   G4Point3D gltarget;
296   if (cameraDistance > 1.e-6 * radius) {          378   if (cameraDistance > 1.e-6 * radius) {
297     gltarget = targetPoint;                       379     gltarget = targetPoint;
298   }                                               380   }
299   else {                                          381   else {
300     gltarget = targetPoint - radius * fVP.GetV    382     gltarget = targetPoint - radius * fVP.GetViewpointDirection().unit();
301   }                                               383   }
302                                                   384 
303   const G4Point3D& pCamera = cameraPosition;      385   const G4Point3D& pCamera = cameraPosition;  // An alias for brevity.
304                                                   386 
305   g4GluLookAt (pCamera.x(),  pCamera.y(),  pCa    387   g4GluLookAt (pCamera.x(),  pCamera.y(),  pCamera.z(),       // Viewpoint.
306              gltarget.x(), gltarget.y(), gltar    388              gltarget.x(), gltarget.y(), gltarget.z(),      // Target point.
307              upVector.x(), upVector.y(), upVec    389              upVector.x(), upVector.y(), upVector.z());     // Up vector.
308   // Light position is "true" light direction,    390   // Light position is "true" light direction, so must come after gluLookAt.
309   glLightfv (GL_LIGHT0, GL_POSITION, lightPosi    391   glLightfv (GL_LIGHT0, GL_POSITION, lightPosition);
310                                                   392 
311   // The idea is to use back-to-back clipping  << 393   // OpenGL no longer seems to reconstruct clipped edges, so, when the
312   // down to just a few pixels, which can make << 394   // BooleanProcessor is up to it, abandon this and use generic
313   // now, comment this out and use the generic << 395   // clipping in G4OpenGLSceneHandler::CreateSectionPolyhedron.  Also,
314   // G4VSolid* G4OpenGLSceneHandler::CreateSec << 396   // force kernel visit on change of clipping plane in
315   // { return G4VSceneHandler::CreateSectionSo << 397   // G4OpenGLStoredViewer::CompareForKernelVisit.
316 //  if (fVP.IsSection () ) {  // pair of back  << 398   //if (fVP.IsSection () ) {  // pair of back to back clip planes.
317 //    const G4Plane3D& sp = fVP.GetSectionPlan << 399   if (false) {  // pair of back to back clip planes.
318 //    double sArray[4];                        << 400     const G4Plane3D& sp = fVP.GetSectionPlane ();
319 //    sArray[0] = sp.a();                      << 401     double sArray[4];
320 //    sArray[1] = sp.b();                      << 402     sArray[0] = sp.a();
321 //    sArray[2] = sp.c();                      << 403     sArray[1] = sp.b();
322 //    sArray[3] = sp.d() + radius * 1.e-05;    << 404     sArray[2] = sp.c();
323 //    glClipPlane (GL_CLIP_PLANE0, sArray);    << 405     sArray[3] = sp.d() + radius * 1.e-05;
324 //    glEnable (GL_CLIP_PLANE0);               << 406     glClipPlane (GL_CLIP_PLANE0, sArray);
325 //    sArray[0] = -sp.a();                     << 407     glEnable (GL_CLIP_PLANE0);
326 //    sArray[1] = -sp.b();                     << 408     sArray[0] = -sp.a();
327 //    sArray[2] = -sp.c();                     << 409     sArray[1] = -sp.b();
328 //    sArray[3] = -sp.d() + radius * 1.e-05;   << 410     sArray[2] = -sp.c();
329 //    glClipPlane (GL_CLIP_PLANE1, sArray);    << 411     sArray[3] = -sp.d() + radius * 1.e-05;
330 //    glEnable (GL_CLIP_PLANE1);               << 412     glClipPlane (GL_CLIP_PLANE1, sArray);
331 //  } else {                                   << 413     glEnable (GL_CLIP_PLANE1);
332 //    glDisable (GL_CLIP_PLANE0);              << 414   } else {
333 //    glDisable (GL_CLIP_PLANE1);              << 415     glDisable (GL_CLIP_PLANE0);
334 //  }                                          << 416     glDisable (GL_CLIP_PLANE1);
                                                   >> 417   }
335                                                   418 
336   // What we call intersection of cutaways is     419   // What we call intersection of cutaways is easy in OpenGL.  You
337   // just keep cutting.  Unions are more trick    420   // just keep cutting.  Unions are more tricky - you have to have
338   // multiple passes and this is handled in       421   // multiple passes and this is handled in
339   // G4OpenGLImmediate/StoredViewer::ProcessVi    422   // G4OpenGLImmediate/StoredViewer::ProcessView.
340   const G4Planes& cutaways = fVP.GetCutawayPla    423   const G4Planes& cutaways = fVP.GetCutawayPlanes();
341   size_t nPlanes = cutaways.size();               424   size_t nPlanes = cutaways.size();
342   if (fVP.IsCutaway() &&                          425   if (fVP.IsCutaway() &&
343       fVP.GetCutawayMode() == G4ViewParameters << 426       fVP.GetCutawayMode() == G4ViewParameters::cutawayIntersection &&
                                                   >> 427       nPlanes > 0) {
344     double a[4];                                  428     double a[4];
345     a[0] = cutaways[0].a();                       429     a[0] = cutaways[0].a();
346     a[1] = cutaways[0].b();                       430     a[1] = cutaways[0].b();
347     a[2] = cutaways[0].c();                       431     a[2] = cutaways[0].c();
348     a[3] = cutaways[0].d();                       432     a[3] = cutaways[0].d();
349     glClipPlane (GL_CLIP_PLANE2, a);              433     glClipPlane (GL_CLIP_PLANE2, a);
350     glEnable (GL_CLIP_PLANE2);                    434     glEnable (GL_CLIP_PLANE2);
351     if (nPlanes > 1) {                            435     if (nPlanes > 1) {
352       a[0] = cutaways[1].a();                     436       a[0] = cutaways[1].a();
353       a[1] = cutaways[1].b();                     437       a[1] = cutaways[1].b();
354       a[2] = cutaways[1].c();                     438       a[2] = cutaways[1].c();
355       a[3] = cutaways[1].d();                     439       a[3] = cutaways[1].d();
356       glClipPlane (GL_CLIP_PLANE3, a);            440       glClipPlane (GL_CLIP_PLANE3, a);
357       glEnable (GL_CLIP_PLANE3);                  441       glEnable (GL_CLIP_PLANE3);
358     }                                             442     }
359     if (nPlanes > 2) {                            443     if (nPlanes > 2) {
360       a[0] = cutaways[2].a();                     444       a[0] = cutaways[2].a();
361       a[1] = cutaways[2].b();                     445       a[1] = cutaways[2].b();
362       a[2] = cutaways[2].c();                     446       a[2] = cutaways[2].c();
363       a[3] = cutaways[2].d();                     447       a[3] = cutaways[2].d();
364       glClipPlane (GL_CLIP_PLANE4, a);            448       glClipPlane (GL_CLIP_PLANE4, a);
365       glEnable (GL_CLIP_PLANE4);                  449       glEnable (GL_CLIP_PLANE4);
366     }                                             450     }
367   } else {                                        451   } else {
368     glDisable (GL_CLIP_PLANE2);                   452     glDisable (GL_CLIP_PLANE2);
369     glDisable (GL_CLIP_PLANE3);                   453     glDisable (GL_CLIP_PLANE3);
370     glDisable (GL_CLIP_PLANE4);                   454     glDisable (GL_CLIP_PLANE4);
371   }                                               455   }
372                                                   456 
373   // Background.                                  457   // Background.
374   background = fVP.GetBackgroundColour ();        458   background = fVP.GetBackgroundColour ();
375                                                   459 
376 }                                                 460 }
377                                                   461 
378                                                   462 
379                                                   463 
380 void G4OpenGLViewer::ResetView () {               464 void G4OpenGLViewer::ResetView () {
381   G4VViewer::ResetView();                         465   G4VViewer::ResetView();
382   fRot_sens = 1;                                  466   fRot_sens = 1;
383   fPan_sens = 0.01;                               467   fPan_sens = 0.01;
384 }                                                 468 }
385                                                   469 
386                                                   470 
387 void G4OpenGLViewer::HaloingFirstPass () {        471 void G4OpenGLViewer::HaloingFirstPass () {
388                                                   472   
389   //To perform haloing, first Draw all informa    473   //To perform haloing, first Draw all information to the depth buffer
390   //alone, using a chunky line width, and then    474   //alone, using a chunky line width, and then Draw all info again, to
391   //the colour buffer, setting a thinner line     475   //the colour buffer, setting a thinner line width an the depth testing 
392   //function to less than or equal, so if two     476   //function to less than or equal, so if two lines cross, the one 
393   //passing behind the other will not pass the    477   //passing behind the other will not pass the depth test, and so not
394   //get rendered either side of the infront li    478   //get rendered either side of the infront line for a short distance.
395                                                   479 
396   //First, disable writing to the colo(u)r buf    480   //First, disable writing to the colo(u)r buffer...
397   glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, G    481   glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
398                                                   482 
399   //Now enable writing to the depth buffer...     483   //Now enable writing to the depth buffer...
400   glDepthMask (GL_TRUE);                          484   glDepthMask (GL_TRUE);
401   glDepthFunc (GL_LESS);                          485   glDepthFunc (GL_LESS);
402   glClearDepth (1.0);                             486   glClearDepth (1.0);
403                                                   487 
404   //Finally, set the line width to something w    488   //Finally, set the line width to something wide...
405   ChangeLineWidth(3.0);                           489   ChangeLineWidth(3.0);
406                                                   490 
407 }                                                 491 }
408                                                   492 
409 void G4OpenGLViewer::HaloingSecondPass () {       493 void G4OpenGLViewer::HaloingSecondPass () {
410                                                   494 
411   //And finally, turn the colour buffer back o    495   //And finally, turn the colour buffer back on with a sesible line width...
412   glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_T    496   glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
413   glDepthFunc (GL_LEQUAL);                        497   glDepthFunc (GL_LEQUAL);
414   ChangeLineWidth(1.0);                           498   ChangeLineWidth(1.0);
415                                                   499 
416 }                                                 500 }
417                                                   501 
418 G4String G4OpenGLViewer::Pick(GLdouble x, GLdo    502 G4String G4OpenGLViewer::Pick(GLdouble x, GLdouble y)
419 {                                                 503 {
420   const std::vector < G4OpenGLViewerPickMap* > << 504   std::vector < G4OpenGLViewerPickMap* >  pickMap = GetPickDetails(x,y);
421   G4String txt = "";                              505   G4String txt = "";
422   if (pickMap.size() == 0) {                      506   if (pickMap.size() == 0) {
423 //        txt += "No hits recorded.";;         << 507     txt += "Too many hits.  Zoom in to reduce overlaps.";;
424   } else {                                        508   } else {
425     for (unsigned int a=0; a < pickMap.size(); << 509     for (unsigned int a=0; a< pickMap.size(); a++) {
426       if (pickMap[a]->getAttributes().size() > << 510       txt += pickMap[a]->print();
427         txt += pickMap[a]->print();            << 
428       }                                        << 
429     }                                             511     }
430   }                                               512   }
431   return txt;                                     513   return txt;
432 }                                                 514 }
433                                                   515 
434 const std::vector < G4OpenGLViewerPickMap* > & << 516 std::vector < G4OpenGLViewerPickMap* > G4OpenGLViewer::GetPickDetails(GLdouble x, GLdouble y)
435 {                                                 517 {
436   static std::vector < G4OpenGLViewerPickMap*  << 518   std::vector < G4OpenGLViewerPickMap* > pickMapVector;
437   for (auto pickMap: pickMapVector) {          << 
438     delete pickMap;                            << 
439   }                                            << 
440   pickMapVector.clear();                       << 
441                                                   519   
                                                   >> 520   std::ostringstream oss;
442   const G4int BUFSIZE = 512;                      521   const G4int BUFSIZE = 512;
443   GLuint selectBuffer[BUFSIZE];                   522   GLuint selectBuffer[BUFSIZE];
444   glSelectBuffer(BUFSIZE, selectBuffer);          523   glSelectBuffer(BUFSIZE, selectBuffer);
445   glRenderMode(GL_SELECT);                        524   glRenderMode(GL_SELECT);
446   glInitNames();                                  525   glInitNames();
447   glPushName(0);                                  526   glPushName(0);
448   glMatrixMode(GL_PROJECTION);                    527   glMatrixMode(GL_PROJECTION);
449   G4double currentProjectionMatrix[16];           528   G4double currentProjectionMatrix[16];
450   glGetDoublev(GL_PROJECTION_MATRIX, currentPr    529   glGetDoublev(GL_PROJECTION_MATRIX, currentProjectionMatrix);
451   glPushMatrix();                                 530   glPushMatrix();
452   glLoadIdentity();                               531   glLoadIdentity();
453   GLint viewport[4];                              532   GLint viewport[4];
454   glGetIntegerv(GL_VIEWPORT, viewport);           533   glGetIntegerv(GL_VIEWPORT, viewport);
455 /*  G4cout                                     << 
456   << "viewport, x,y: "                         << 
457   << viewport[0] << ',' << viewport[1] << ','  << 
458   << ", " << x << ',' << y                     << 
459   << G4endl;                                   << 
460 */                                             << 
461   fIsGettingPickInfos = true;                     534   fIsGettingPickInfos = true;
462   // Define 5x5 pixel pick area                   535   // Define 5x5 pixel pick area
463   g4GluPickMatrix(x, viewport[3] - y, 5., 5.,     536   g4GluPickMatrix(x, viewport[3] - y, 5., 5., viewport);
464   glMultMatrixd(currentProjectionMatrix);         537   glMultMatrixd(currentProjectionMatrix);
465   glMatrixMode(GL_MODELVIEW);                     538   glMatrixMode(GL_MODELVIEW);
466   DrawView();                                     539   DrawView();
467   GLint hits = glRenderMode(GL_RENDER);           540   GLint hits = glRenderMode(GL_RENDER);
468   fIsGettingPickInfos = false;                    541   fIsGettingPickInfos = false;
469   if (hits < 0) {                              << 
470     G4cout << "Too many hits.  Zoom in to redu << 
471     goto restoreMatrices;                      << 
472   }                                            << 
473   if (hits > 0) {                                 542   if (hits > 0) {
                                                   >> 543     
474     GLuint* p = selectBuffer;                     544     GLuint* p = selectBuffer;
475     for (GLint i = 0; i < hits; ++i) {            545     for (GLint i = 0; i < hits; ++i) {
                                                   >> 546       G4OpenGLViewerPickMap* pickMap = new G4OpenGLViewerPickMap();
476       GLuint nnames = *p++;                       547       GLuint nnames = *p++;
477       // This bit of debug code or...             548       // This bit of debug code or...
478       //GLuint zmin = *p++;                       549       //GLuint zmin = *p++;
479       //GLuint zmax = *p++;                       550       //GLuint zmax = *p++;
480       //G4cout << "Hit " << i << ": " << nname    551       //G4cout << "Hit " << i << ": " << nnames << " names"
481       //       << "\nzmin: " << zmin << ", zma    552       //       << "\nzmin: " << zmin << ", zmax: " << zmax << G4endl;
482       // ...just increment the pointer            553       // ...just increment the pointer
483       p++;                                        554       p++;
484       p++;                                        555       p++;
485       for (GLuint j = 0; j < nnames; ++j) {       556       for (GLuint j = 0; j < nnames; ++j) {
486         GLuint name = *p++;                       557         GLuint name = *p++;
                                                   >> 558         pickMap->setHitNumber(i);
                                                   >> 559         pickMap->setSubHitNumber(j);
                                                   >> 560         pickMap->setPickName(name);
487   std::map<GLuint, G4AttHolder*>::iterator ite    561   std::map<GLuint, G4AttHolder*>::iterator iter =
488     fOpenGLSceneHandler.fPickMap.find(name);      562     fOpenGLSceneHandler.fPickMap.find(name);
489   if (iter != fOpenGLSceneHandler.fPickMap.end    563   if (iter != fOpenGLSceneHandler.fPickMap.end()) {
490     G4AttHolder* attHolder = iter->second;        564     G4AttHolder* attHolder = iter->second;
491     if(attHolder && attHolder->GetAttDefs().si    565     if(attHolder && attHolder->GetAttDefs().size()) {
492       for (size_t iAtt = 0;                       566       for (size_t iAtt = 0;
493      iAtt < attHolder->GetAttDefs().size(); ++    567      iAtt < attHolder->GetAttDefs().size(); ++iAtt) {
494               std::ostringstream oss;          << 
495         oss << G4AttCheck(attHolder->GetAttVal    568         oss << G4AttCheck(attHolder->GetAttValues()[iAtt],
496                                 attHolder->Get    569                                 attHolder->GetAttDefs()[iAtt]);
497               G4OpenGLViewerPickMap* pickMap = << 
498 //              G4cout                         << 
499 //              << "i,j, attHolder->GetAttDefs << 
500 //              << i << ',' << j               << 
501 //              << ", " << attHolder->GetAttDe << 
502 //              << G4endl;                     << 
503 //              G4cout << "G4OpenGLViewer::Get << 
504               pickMap->addAttributes(oss.str()    570               pickMap->addAttributes(oss.str());
505               pickMap->setHitNumber(i);        << 
506               pickMap->setSubHitNumber(j);     << 
507               pickMap->setPickName(name);      << 
508               pickMapVector.push_back(pickMap) << 
509             }                                     571             }
510           }                                       572           }
511         }                                         573         }
512       }                                           574       }
                                                   >> 575       pickMapVector.push_back(pickMap);
513     }                                             576     }
514   }                                               577   }
515                                                << 
516 restoreMatrices:                               << 
517   glMatrixMode(GL_PROJECTION);                    578   glMatrixMode(GL_PROJECTION);
518   glPopMatrix();                                  579   glPopMatrix();
519   glMatrixMode(GL_MODELVIEW);                     580   glMatrixMode(GL_MODELVIEW);
520                                                << 
521   return pickMapVector;                           581   return pickMapVector;
522 }                                                 582 }
523                                                   583 
524 GLubyte* G4OpenGLViewer::grabPixels               584 GLubyte* G4OpenGLViewer::grabPixels
525 (int inColor, unsigned int width, unsigned int    585 (int inColor, unsigned int width, unsigned int height) {
526                                                   586   
527   GLubyte* buffer;                                587   GLubyte* buffer;
528   GLint swapbytes, lsbfirst, rowlength;           588   GLint swapbytes, lsbfirst, rowlength;
529   GLint skiprows, skippixels, alignment;          589   GLint skiprows, skippixels, alignment;
530   GLenum format;                                  590   GLenum format;
531   int size;                                       591   int size;
532                                                   592 
533   if (inColor) {                                  593   if (inColor) {
534     format = GL_RGB;                              594     format = GL_RGB;
535     size = width*height*3;                        595     size = width*height*3;
536   } else {                                        596   } else {
537     format = GL_LUMINANCE;                        597     format = GL_LUMINANCE;
538     size = width*height*1;                        598     size = width*height*1;
539   }                                               599   }
540                                                   600 
541   buffer = new GLubyte[size];                     601   buffer = new GLubyte[size];
542   if (buffer == NULL)                             602   if (buffer == NULL)
543     return NULL;                                  603     return NULL;
544                                                   604 
545   glGetIntegerv (GL_UNPACK_SWAP_BYTES, &swapby    605   glGetIntegerv (GL_UNPACK_SWAP_BYTES, &swapbytes);
546   glGetIntegerv (GL_UNPACK_LSB_FIRST, &lsbfirs    606   glGetIntegerv (GL_UNPACK_LSB_FIRST, &lsbfirst);
547   glGetIntegerv (GL_UNPACK_ROW_LENGTH, &rowlen    607   glGetIntegerv (GL_UNPACK_ROW_LENGTH, &rowlength);
548                                                   608 
549   glGetIntegerv (GL_UNPACK_SKIP_ROWS, &skiprow    609   glGetIntegerv (GL_UNPACK_SKIP_ROWS, &skiprows);
550   glGetIntegerv (GL_UNPACK_SKIP_PIXELS, &skipp    610   glGetIntegerv (GL_UNPACK_SKIP_PIXELS, &skippixels);
551   glGetIntegerv (GL_UNPACK_ALIGNMENT, &alignme    611   glGetIntegerv (GL_UNPACK_ALIGNMENT, &alignment);
552                                                   612 
553   glPixelStorei (GL_UNPACK_SWAP_BYTES, GL_FALS    613   glPixelStorei (GL_UNPACK_SWAP_BYTES, GL_FALSE);
554   glPixelStorei (GL_UNPACK_LSB_FIRST, GL_FALSE    614   glPixelStorei (GL_UNPACK_LSB_FIRST, GL_FALSE);
555   glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);        615   glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
556                                                   616 
557   glPixelStorei (GL_UNPACK_SKIP_ROWS, 0);         617   glPixelStorei (GL_UNPACK_SKIP_ROWS, 0);
558   glPixelStorei (GL_UNPACK_SKIP_PIXELS, 0);       618   glPixelStorei (GL_UNPACK_SKIP_PIXELS, 0);
559   glPixelStorei (GL_UNPACK_ALIGNMENT, 1);         619   glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
560                                                   620 
561   glReadBuffer(GL_FRONT);                         621   glReadBuffer(GL_FRONT);
562   glReadPixels (0, 0, (GLsizei)width, (GLsizei    622   glReadPixels (0, 0, (GLsizei)width, (GLsizei)height, format, GL_UNSIGNED_BYTE, (GLvoid*) buffer);
563                                                   623 
564   glPixelStorei (GL_UNPACK_SWAP_BYTES, swapbyt    624   glPixelStorei (GL_UNPACK_SWAP_BYTES, swapbytes);
565   glPixelStorei (GL_UNPACK_LSB_FIRST, lsbfirst    625   glPixelStorei (GL_UNPACK_LSB_FIRST, lsbfirst);
566   glPixelStorei (GL_UNPACK_ROW_LENGTH, rowleng    626   glPixelStorei (GL_UNPACK_ROW_LENGTH, rowlength);
567                                                   627   
568   glPixelStorei (GL_UNPACK_SKIP_ROWS, skiprows    628   glPixelStorei (GL_UNPACK_SKIP_ROWS, skiprows);
569   glPixelStorei (GL_UNPACK_SKIP_PIXELS, skippi    629   glPixelStorei (GL_UNPACK_SKIP_PIXELS, skippixels);
570   glPixelStorei (GL_UNPACK_ALIGNMENT, alignmen    630   glPixelStorei (GL_UNPACK_ALIGNMENT, alignment);
571                                                   631   
572   return buffer;                                  632   return buffer;
573 }                                                 633 }
574                                                   634 
                                                   >> 635 bool G4OpenGLViewer::printEPS() {
                                                   >> 636   bool res;
                                                   >> 637 #ifdef G4DEBUG_VIS_OGL
                                                   >> 638   printf("G4OpenGLViewer::printEPS file:%s Vec:%d Name:%s\n",getRealPrintFilename().c_str(),fVectoredPs,GetName().c_str());
                                                   >> 639 #endif
                                                   >> 640 
                                                   >> 641   // Change the LC_NUMERIC value in order to have "." separtor and not ","
                                                   >> 642   // This case is only useful for French, Canadien...
                                                   >> 643   size_t len = strlen(setlocale(LC_NUMERIC,NULL));
                                                   >> 644   char* oldLocale = (char*)(malloc(len+1));
                                                   >> 645   if(oldLocale!=NULL) strncpy(oldLocale,setlocale(LC_NUMERIC,NULL),len);
                                                   >> 646   setlocale(LC_NUMERIC,"C");
                                                   >> 647 
                                                   >> 648   if (((fExportImageFormat == "eps") || (fExportImageFormat == "ps")) && (!fVectoredPs)) {
                                                   >> 649     res = printNonVectoredEPS();
                                                   >> 650   } else {
                                                   >> 651     res = printVectoredEPS();
                                                   >> 652   }
                                                   >> 653 
                                                   >> 654   // restore the local
                                                   >> 655   if (oldLocale) {
                                                   >> 656     setlocale(LC_NUMERIC,oldLocale);
                                                   >> 657     free(oldLocale);
                                                   >> 658   }
                                                   >> 659 
                                                   >> 660   if (res == false) {
                                                   >> 661     G4cerr << "Error saving file... " << getRealPrintFilename().c_str() << G4endl;
                                                   >> 662   } else {
                                                   >> 663     G4cout << "File " << getRealPrintFilename().c_str() << " size: " << getRealExportWidth() << "x" << getRealExportHeight() << " has been saved " << G4endl;
                                                   >> 664 
                                                   >> 665     // increment index if necessary
                                                   >> 666     if ( fExportFilenameIndex != -1) {
                                                   >> 667       fExportFilenameIndex++;
                                                   >> 668     }
                                                   >> 669   }
                                                   >> 670 
                                                   >> 671 
                                                   >> 672 #ifdef G4DEBUG_VIS_OGL
                                                   >> 673   printf("G4OpenGLViewer::printEPS END\n");
                                                   >> 674 #endif
                                                   >> 675   return res;
                                                   >> 676 }
                                                   >> 677 
575 bool G4OpenGLViewer::printVectoredEPS() {         678 bool G4OpenGLViewer::printVectoredEPS() {
576   return printGl2PS();                            679   return printGl2PS();
577 }                                                 680 }
578                                                   681 
579 bool G4OpenGLViewer::printNonVectoredEPS () {     682 bool G4OpenGLViewer::printNonVectoredEPS () {
580                                                   683 
581   int width = getRealExportWidth();               684   int width = getRealExportWidth();
582   int height = getRealExportHeight();             685   int height = getRealExportHeight();
583                                                   686 
                                                   >> 687 #ifdef G4DEBUG_VIS_OGL
                                                   >> 688   printf("G4OpenGLViewer::printNonVectoredEPS file:%s Vec:%d X:%d Y:%d col:%d fWinX:%d fWinY:%d\n",getRealPrintFilename().c_str(),fVectoredPs,width,height,fPrintColour,fWinSize_x,fWinSize_y);
                                                   >> 689 #endif
584   FILE* fp;                                       690   FILE* fp;
585   GLubyte* pixels;                                691   GLubyte* pixels;
586   GLubyte* curpix;                                692   GLubyte* curpix;
587   int components, pos, i;                         693   int components, pos, i;
588                                                   694 
589   pixels = grabPixels (fPrintColour, width, he    695   pixels = grabPixels (fPrintColour, width, height);
590                                                   696 
591   if (pixels == NULL) {                           697   if (pixels == NULL) {
592       G4cerr << "Failed to get pixels from Ope    698       G4cerr << "Failed to get pixels from OpenGl viewport" << G4endl;
593     return false;                                 699     return false;
594   }                                               700   }
595   if (fPrintColour) {                             701   if (fPrintColour) {
596     components = 3;                               702     components = 3;
597   } else {                                        703   } else {
598     components = 1;                               704     components = 1;
599   }                                               705   }
600   std::string name = getRealPrintFilename();      706   std::string name = getRealPrintFilename();
601   fp = fopen (name.c_str(), "w");                 707   fp = fopen (name.c_str(), "w");
602   if (fp == NULL) {                               708   if (fp == NULL) {
603     G4cerr << "Can't open filename " << name.c    709     G4cerr << "Can't open filename " << name.c_str() << G4endl;
604     return false;                                 710     return false;
605   }                                               711   }
606                                                   712   
607   fprintf (fp, "%%!PS-Adobe-2.0 EPSF-1.2\n");     713   fprintf (fp, "%%!PS-Adobe-2.0 EPSF-1.2\n");
608   fprintf (fp, "%%%%Title: %s\n", name.c_str()    714   fprintf (fp, "%%%%Title: %s\n", name.c_str());
609   fprintf (fp, "%%%%Creator: OpenGL pixmap ren    715   fprintf (fp, "%%%%Creator: OpenGL pixmap render output\n");
610   fprintf (fp, "%%%%BoundingBox: 0 0 %d %d\n",    716   fprintf (fp, "%%%%BoundingBox: 0 0 %d %d\n", width, height);
611   fprintf (fp, "%%%%EndComments\n");              717   fprintf (fp, "%%%%EndComments\n");
612   fprintf (fp, "gsave\n");                        718   fprintf (fp, "gsave\n");
613   fprintf (fp, "/bwproc {\n");                    719   fprintf (fp, "/bwproc {\n");
614   fprintf (fp, "    rgbproc\n");                  720   fprintf (fp, "    rgbproc\n");
615   fprintf (fp, "    dup length 3 idiv string 0    721   fprintf (fp, "    dup length 3 idiv string 0 3 0 \n");
616   fprintf (fp, "    5 -1 roll {\n");              722   fprintf (fp, "    5 -1 roll {\n");
617   fprintf (fp, "    add 2 1 roll 1 sub dup 0 e    723   fprintf (fp, "    add 2 1 roll 1 sub dup 0 eq\n");
618   fprintf (fp, "    { pop 3 idiv 3 -1 roll dup    724   fprintf (fp, "    { pop 3 idiv 3 -1 roll dup 4 -1 roll dup\n");
619   fprintf (fp, "       3 1 roll 5 -1 roll } pu    725   fprintf (fp, "       3 1 roll 5 -1 roll } put 1 add 3 0 \n");
620   fprintf (fp, "    { 2 1 roll } ifelse\n");      726   fprintf (fp, "    { 2 1 roll } ifelse\n");
621   fprintf (fp, "    }forall\n");                  727   fprintf (fp, "    }forall\n");
622   fprintf (fp, "    pop pop pop\n");              728   fprintf (fp, "    pop pop pop\n");
623   fprintf (fp, "} def\n");                        729   fprintf (fp, "} def\n");
624   fprintf (fp, "systemdict /colorimage known n    730   fprintf (fp, "systemdict /colorimage known not {\n");
625   fprintf (fp, "   /colorimage {\n");             731   fprintf (fp, "   /colorimage {\n");
626   fprintf (fp, "       pop\n");                   732   fprintf (fp, "       pop\n");
627   fprintf (fp, "       pop\n");                   733   fprintf (fp, "       pop\n");
628   fprintf (fp, "       /rgbproc exch def\n");     734   fprintf (fp, "       /rgbproc exch def\n");
629   fprintf (fp, "       { bwproc } image\n");      735   fprintf (fp, "       { bwproc } image\n");
630   fprintf (fp, "   }  def\n");                    736   fprintf (fp, "   }  def\n");
631   fprintf (fp, "} if\n");                         737   fprintf (fp, "} if\n");
632   fprintf (fp, "/picstr %d string def\n", widt    738   fprintf (fp, "/picstr %d string def\n", width * components);
633   fprintf (fp, "%d %d scale\n", width, height)    739   fprintf (fp, "%d %d scale\n", width, height);
634   fprintf (fp, "%d %d %d\n", width, height, 8)    740   fprintf (fp, "%d %d %d\n", width, height, 8);
635   fprintf (fp, "[%d 0 0 %d 0 0]\n", width, hei    741   fprintf (fp, "[%d 0 0 %d 0 0]\n", width, height);
636   fprintf (fp, "{currentfile picstr readhexstr    742   fprintf (fp, "{currentfile picstr readhexstring pop}\n");
637   fprintf (fp, "false %d\n", components);         743   fprintf (fp, "false %d\n", components);
638   fprintf (fp, "colorimage\n");                   744   fprintf (fp, "colorimage\n");
639                                                   745   
640   curpix = (GLubyte*) pixels;                     746   curpix = (GLubyte*) pixels;
641   pos = 0;                                        747   pos = 0;
642   for (i = width*height*components; i>0; i--)     748   for (i = width*height*components; i>0; i--) {
643     fprintf (fp, "%02hx ", (unsigned short)(*(    749     fprintf (fp, "%02hx ", (unsigned short)(*(curpix++)));
644     if (++pos >= 32) {                            750     if (++pos >= 32) {
645       fprintf (fp, "\n");                         751       fprintf (fp, "\n");
646       pos = 0;                                    752       pos = 0; 
647     }                                             753     }
648   }                                               754   }
649   if (pos)                                        755   if (pos)
650     fprintf (fp, "\n");                           756     fprintf (fp, "\n");
651                                                   757 
652   fprintf (fp, "grestore\n");                     758   fprintf (fp, "grestore\n");
653   fprintf (fp, "showpage\n");                     759   fprintf (fp, "showpage\n");
654   delete [] pixels;                               760   delete [] pixels;
655   fclose (fp);                                    761   fclose (fp);
656                                                   762 
657   // Reset for next time (useful if size chang << 763   // Reset for next time (useful is size change)
658   //  fPrintSizeX = -1;                           764   //  fPrintSizeX = -1;
659   //  fPrintSizeY = -1;                           765   //  fPrintSizeY = -1;
660                                                   766 
661   return true;                                    767   return true;
662 }                                                 768 }
663                                                   769 
664 /** Return if gl2ps is currently writing          770 /** Return if gl2ps is currently writing
665  */                                               771  */
666 bool G4OpenGLViewer::isGl2psWriting() {           772 bool G4OpenGLViewer::isGl2psWriting() {
667                                                   773 
668   if (!fGL2PSAction) return false;                774   if (!fGL2PSAction) return false;
669   if (fGL2PSAction->fileWritingEnabled()) {       775   if (fGL2PSAction->fileWritingEnabled()) {
670     return true;                                  776     return true;
671   }                                               777   }
672   return false;                                   778   return false;
673 }                                                 779 }
674                                                   780 
675                                                   781 
676 G4bool G4OpenGLViewer::isFramebufferReady() {  << 
677   bool check = false;                          << 
678 #ifdef G4VIS_BUILD_OPENGLQT_DRIVER             << 
679   check = true;                                << 
680 #endif                                         << 
681 #ifdef G4VIS_BUILD_OPENGLX_DRIVER              << 
682   check = false;                               << 
683 #endif                                         << 
684 #ifdef G4VIS_BUILD_OPENGLXM_DRIVER             << 
685   check = false;                               << 
686 #endif                                         << 
687 #ifdef G4VIS_BUILD_OPENGLWIN32_DRIVER          << 
688   check = false;                               << 
689 #endif                                         << 
690                                                << 
691 #if GL_ARB_framebuffer_object                  << 
692   if (check) {                                 << 
693 //    if ( glCheckFramebufferStatus(GL_FRAMEBU << 
694 //      return false;                          << 
695 //    }                                        << 
696   }                                            << 
697 #endif                                         << 
698     return true;                               << 
699 }                                              << 
700                                                << 
701                                                << 
702 /* Draw Gl2Ps text if needed                      782 /* Draw Gl2Ps text if needed
703  */                                               783  */
704 void G4OpenGLViewer::DrawText(const G4Text& g4    784 void G4OpenGLViewer::DrawText(const G4Text& g4text)
705 {                                                 785 {
706   // gl2ps or GL window ?                         786   // gl2ps or GL window ?
707   if (isGl2psWriting()) {                         787   if (isGl2psWriting()) {
708                                                   788 
709     G4VSceneHandler::MarkerSizeType sizeType;     789     G4VSceneHandler::MarkerSizeType sizeType;
710     G4double size = fSceneHandler.GetMarkerSiz    790     G4double size = fSceneHandler.GetMarkerSize(g4text,sizeType);
711     G4Point3D position = g4text.GetPosition();    791     G4Point3D position = g4text.GetPosition();
712                                                   792 
713     G4String textString = g4text.GetText();       793     G4String textString = g4text.GetText();
714                                                   794     
715     glRasterPos3d(position.x(),position.y(),po    795     glRasterPos3d(position.x(),position.y(),position.z());
716     GLint align = GL2PS_TEXT_B;                   796     GLint align = GL2PS_TEXT_B;
717                                                   797 
718     switch (g4text.GetLayout()) {                 798     switch (g4text.GetLayout()) {
719     case G4Text::left: align = GL2PS_TEXT_BL;     799     case G4Text::left: align = GL2PS_TEXT_BL; break;
720     case G4Text::centre: align = GL2PS_TEXT_B;    800     case G4Text::centre: align = GL2PS_TEXT_B; break;
721     case G4Text::right: align = GL2PS_TEXT_BR;    801     case G4Text::right: align = GL2PS_TEXT_BR;
722     }                                             802     }
723                                                   803     
724     fGL2PSAction->addTextOpt(textString.c_str( << 804     gl2psTextOpt(textString.c_str(),"Times-Roman",GLshort(size),align,0);
725                                                   805 
726   } else {                                        806   } else {
727                                                   807 
728     static G4int callCount = 0;                   808     static G4int callCount = 0;
729     ++callCount;                                  809     ++callCount;
730     //if (callCount <= 10 || callCount%100 ==     810     //if (callCount <= 10 || callCount%100 == 0) {
731     if (callCount <= 1) {                         811     if (callCount <= 1) {
732       G4cout <<                                   812       G4cout <<
733   "G4OpenGLViewer::DrawText: Not implemented f    813   "G4OpenGLViewer::DrawText: Not implemented for \""
734        << fName <<                                814        << fName <<
735   "\"\n  Called with "                            815   "\"\n  Called with "
736        << g4text                                  816        << g4text
737        << G4endl;                                 817        << G4endl;
738     }                                             818     }
739   }                                               819   }
740 }                                                 820 }
741                                                   821 
742 /** Change PointSize on gl2ps if needed           822 /** Change PointSize on gl2ps if needed
743  */                                               823  */
744 void G4OpenGLViewer::ChangePointSize(G4double     824 void G4OpenGLViewer::ChangePointSize(G4double size) {
745                                                   825 
746   if (isGl2psWriting()) {                         826   if (isGl2psWriting()) {
747     fGL2PSAction->setPointSize(int(size));        827     fGL2PSAction->setPointSize(int(size));
748   } else {                                        828   } else {
749     glPointSize (size);                           829     glPointSize (size);
750   }                                               830   }
751 }                                                 831 }
752                                                   832 
753                                                   833 
754 /** Change LineSize on gl2ps if needed            834 /** Change LineSize on gl2ps if needed
755  */                                               835  */
756 void G4OpenGLViewer::ChangeLineWidth(G4double     836 void G4OpenGLViewer::ChangeLineWidth(G4double width) {
757                                                   837 
758   if (isGl2psWriting()) {                         838   if (isGl2psWriting()) {
759     fGL2PSAction->setLineWidth(int(width));       839     fGL2PSAction->setLineWidth(int(width));
760   } else {                                        840   } else {
761     glLineWidth (width);                          841     glLineWidth (width);
762   }                                               842   }
763 }                                                 843 }
764                                                   844 
765 /**                                               845 /**
766  Export image with the given name with width a    846  Export image with the given name with width and height
767  Several cases :                                  847  Several cases :
768  If name is "", filename will have the default    848  If name is "", filename will have the default value
769  If name is "toto.png", set the name to "toto"    849  If name is "toto.png", set the name to "toto" and the format to "png". No incremented suffix is added.
770  If name is "toto", set the name to "toto" and    850  If name is "toto", set the name to "toto" and the format to default (or current format if specify).
771    Will also add an incremented suffix at the     851    Will also add an incremented suffix at the end of the file
772 */                                                852 */
773 bool G4OpenGLViewer::exportImage(std::string n    853 bool G4OpenGLViewer::exportImage(std::string name, int width, int height) {
774                                                   854 
775   if (! setExportFilename(name)) {                855   if (! setExportFilename(name)) {
776     return false;                                 856     return false;
777   }                                               857   }
778                                                   858 
779   if ((width != -1) && (height != -1)) {       << 859   if ((width =! -1) && (height != -1)) {
780     setExportSize(width, height);                 860     setExportSize(width, height);
781   }                                               861   }
782                                                   862 
783   if (fExportImageFormat == "eps") {              863   if (fExportImageFormat == "eps") {
784     fGL2PSAction->setExportImageFormat_EPS();  << 864     fGL2PSAction->setExportImageFormat(GL2PS_EPS);
785   } else if (fExportImageFormat == "ps") {        865   } else if (fExportImageFormat == "ps") {
786     fGL2PSAction->setExportImageFormat_PS();   << 866     fGL2PSAction->setExportImageFormat(GL2PS_PS);
787   } else if (fExportImageFormat == "svg") {       867   } else if (fExportImageFormat == "svg") {
788     fGL2PSAction->setExportImageFormat_SVG();  << 868     fGL2PSAction->setExportImageFormat(GL2PS_SVG);
789   } else if (fExportImageFormat == "pdf") {       869   } else if (fExportImageFormat == "pdf") {
790     fGL2PSAction->setExportImageFormat_PDF();  << 870     fGL2PSAction->setExportImageFormat(GL2PS_PDF);
791   } else {                                        871   } else {
792     setExportImageFormat(fExportImageFormat,tr    872     setExportImageFormat(fExportImageFormat,true); // will display a message if this format is not correct for the current viewer
793     return false;                                 873     return false;
794   }                                               874   }
795                                                << 875   return printEPS();
796   bool res;                                    << 
797                                                << 
798   // Change the LC_NUMERIC value in order to h << 
799   // This case is only useful for French, Cana << 
800   size_t len = strlen(setlocale(LC_NUMERIC,NUL << 
801   char* oldLocale = (char*)(malloc(len+1));    << 
802   if(oldLocale!=NULL) strncpy(oldLocale,setloc << 
803   setlocale(LC_NUMERIC,"C");                   << 
804                                                << 
805   if (((fExportImageFormat == "eps") || (fExpo << 
806     res = printNonVectoredEPS();               << 
807   } else {                                     << 
808     res = printVectoredEPS();                  << 
809   }                                            << 
810                                                << 
811   // restore the local                         << 
812   if (oldLocale) {                             << 
813     setlocale(LC_NUMERIC,oldLocale);           << 
814     free(oldLocale);                           << 
815   }                                            << 
816                                                << 
817   if (res == false) {                          << 
818     G4cerr << "Error saving file... " << getRe << 
819   } else {                                     << 
820     G4cout << "File " << getRealPrintFilename( << 
821                                                << 
822     // increment index if necessary            << 
823     if ( fExportFilenameIndex != -1) {         << 
824       fExportFilenameIndex++;                  << 
825     }                                          << 
826   }                                            << 
827                                                << 
828   return res;                                  << 
829 }                                                 876 }
830                                                   877 
831                                                   878 
832 bool G4OpenGLViewer::printGl2PS() {               879 bool G4OpenGLViewer::printGl2PS() {
833                                                   880 
834   int width = getRealExportWidth();               881   int width = getRealExportWidth();
835   int height = getRealExportHeight();             882   int height = getRealExportHeight();
836   bool res = true;                                883   bool res = true;
837                                                   884 
838   // no need to redraw at each new primitive f    885   // no need to redraw at each new primitive for printgl2PS
839   G4OpenGLSceneHandler& oglSceneHandler = dyna    886   G4OpenGLSceneHandler& oglSceneHandler = dynamic_cast<G4OpenGLSceneHandler&>(fSceneHandler);
840   G4OpenGLSceneHandler::FlushAction originalFl << 887   G4int drawInterval = oglSceneHandler.GetEventsDrawInterval();
841   oglSceneHandler.SetFlushAction(G4OpenGLScene << 888   oglSceneHandler.SetEventsDrawInterval(1000); // some big value but not too big to not crash memory
842                                                   889 
843   if (!fGL2PSAction) return false;                890   if (!fGL2PSAction) return false;
844                                                   891 
845   fGL2PSAction->setFileName(getRealPrintFilena    892   fGL2PSAction->setFileName(getRealPrintFilename().c_str());
846   // try to resize                                893   // try to resize
847   int X = fWinSize_x;                             894   int X = fWinSize_x;
848   int Y = fWinSize_y;                             895   int Y = fWinSize_y;
849                                                   896 
850   fWinSize_x = width;                             897   fWinSize_x = width;
851   fWinSize_y = height;                            898   fWinSize_y = height;
852   // Laurent G. 16/03/10 : Not the good way to    899   // Laurent G. 16/03/10 : Not the good way to do. 
853   // We should draw in a new offscreen context    900   // We should draw in a new offscreen context instead of
854   // resizing and drawing in current window...    901   // resizing and drawing in current window...
855   // This should be solve when we will do an o    902   // This should be solve when we will do an offscreen method
856   // to render OpenGL                             903   // to render OpenGL
857   // See :                                        904   // See : 
858   // http://developer.apple.com/Mac/library/do    905   // http://developer.apple.com/Mac/library/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_offscreen/opengl_offscreen.html
859   // http://www.songho.ca/opengl/gl_fbo.html      906   // http://www.songho.ca/opengl/gl_fbo.html
860                                                   907 
861    ResizeGLView();                                908    ResizeGLView();
862    bool extendBuffer = true;                      909    bool extendBuffer = true;
863    bool endWriteAction = false;                   910    bool endWriteAction = false;
864    bool beginWriteAction = true;                  911    bool beginWriteAction = true;
865    bool filePointerOk = true;                     912    bool filePointerOk = true;
866    while ((extendBuffer) && (! endWriteAction)    913    while ((extendBuffer) && (! endWriteAction) && (filePointerOk)) {
867                                                << 914      
868      beginWriteAction = fGL2PSAction->enableFi    915      beginWriteAction = fGL2PSAction->enableFileWriting();
869      if(beginWriteAction) {                    << 
870        GLint vp[4];                            << 
871        ::glGetIntegerv(GL_VIEWPORT,vp);        << 
872        fGL2PSAction->setViewport(vp[0],vp[1],v << 
873        beginWriteAction = fGL2PSAction->beginP << 
874      }                                         << 
875                                                << 
876      // 3 cases :                                 916      // 3 cases :
877      // - true                                    917      // - true
878      // - false && ! fGL2PSAction->fileWriting    918      // - false && ! fGL2PSAction->fileWritingEnabled() => bad file name
879      // - false && fGL2PSAction->fileWritingEn    919      // - false && fGL2PSAction->fileWritingEnabled() => buffer size problem ?
880                                                   920 
881      filePointerOk = fGL2PSAction->fileWriting    921      filePointerOk = fGL2PSAction->fileWritingEnabled();
882                                                   922        
883      if (beginWriteAction) {                      923      if (beginWriteAction) {
884                                                << 924        
885        // Set the viewport                        925        // Set the viewport
886        // By default, we choose the line width    926        // By default, we choose the line width (trajectories...)
887        fGL2PSAction->setLineWidth(fGl2psDefaul    927        fGL2PSAction->setLineWidth(fGl2psDefaultLineWith);
888        // By default, we choose the point size    928        // By default, we choose the point size (markers...)
889        fGL2PSAction->setPointSize(fGl2psDefaul    929        fGL2PSAction->setPointSize(fGl2psDefaultPointSize);
890                                                   930        
891        DrawView ();                               931        DrawView ();
892                                                << 932        endWriteAction = fGL2PSAction->disableFileWriting();
893        endWriteAction = fGL2PSAction->endPage( << 
894        fGL2PSAction->disableFileWriting();     << 
895      }                                            933      }
896      if (filePointerOk) {                         934      if (filePointerOk) {
897        if ((! endWriteAction) || (! beginWrite    935        if ((! endWriteAction) || (! beginWriteAction)) {
898          extendBuffer = fGL2PSAction->extendBu    936          extendBuffer = fGL2PSAction->extendBufferSize();
899        }                                          937        }
900      }                                            938      }
901    }                                              939    }
902    fGL2PSAction->resetBufferSizeParameters();     940    fGL2PSAction->resetBufferSizeParameters();
903                                                   941 
904    if (!extendBuffer ) {                          942    if (!extendBuffer ) {
905      G4cerr << "ERROR: gl2ps buffer size is no    943      G4cerr << "ERROR: gl2ps buffer size is not big enough to print this geometry. Try to extend it. No output produced"<< G4endl;
906      res = false;                                 944      res = false;
907    }                                              945    }
908    if (!beginWriteAction ) {                      946    if (!beginWriteAction ) {
909      G4cerr << "ERROR: saving file "<<getRealP    947      G4cerr << "ERROR: saving file "<<getRealPrintFilename().c_str()<<". Check read/write access. No output produced" << G4endl;
910      res = false;                                 948      res = false;
911    }                                              949    }
912    if (!endWriteAction ) {                        950    if (!endWriteAction ) {
913      G4cerr << "gl2ps error. No output produce    951      G4cerr << "gl2ps error. No output produced" << G4endl;
914      res = false;                                 952      res = false;
915    }                                              953    }
916   fWinSize_x = X;                                 954   fWinSize_x = X;
917   fWinSize_y = Y;                                 955   fWinSize_y = Y;
918                                                   956 
919   oglSceneHandler.SetFlushAction(originalFlush << 957   oglSceneHandler.SetEventsDrawInterval(drawInterval);
920                                                   958 
921   // Reset for next time (useful is size chang    959   // Reset for next time (useful is size change)
922   //  fPrintSizeX = 0;                            960   //  fPrintSizeX = 0;
923   //  fPrintSizeY = 0;                            961   //  fPrintSizeY = 0;
924                                                   962 
925   return res;                                     963   return res;
926 }                                                 964 }
927                                                   965 
928 unsigned int G4OpenGLViewer::getWinWidth() con    966 unsigned int G4OpenGLViewer::getWinWidth() const{
929   return fWinSize_x;                              967   return fWinSize_x;
930 }                                                 968 }
931                                                   969 
932 unsigned int G4OpenGLViewer::getWinHeight() co    970 unsigned int G4OpenGLViewer::getWinHeight() const{
933   return fWinSize_y;                              971   return fWinSize_y;
934 }                                                 972 }
935                                                   973 
936 G4bool G4OpenGLViewer::sizeHasChanged() {         974 G4bool G4OpenGLViewer::sizeHasChanged() {
937   return fSizeHasChanged;                         975   return fSizeHasChanged;
938 }                                                 976 }
939                                                   977 
940 G4int G4OpenGLViewer::getRealExportWidth() {      978 G4int G4OpenGLViewer::getRealExportWidth() {
941   if (fPrintSizeX == -1) {                        979   if (fPrintSizeX == -1) {
942     return fWinSize_x;                            980     return fWinSize_x;
943   }                                               981   }
944   GLint dims[2];                                  982   GLint dims[2];
945   glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims);      983   glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims);
946                                                   984 
947   // L.Garnier 01-2010: Some problems with mac    985   // L.Garnier 01-2010: Some problems with mac 10.6
948   if ((dims[0] !=0 ) && (dims[1] !=0)) {          986   if ((dims[0] !=0 ) && (dims[1] !=0)) {
949     if (fPrintSizeX > dims[0]){                   987     if (fPrintSizeX > dims[0]){
950       return dims[0];                             988       return dims[0];
951     }                                             989     }
952   }                                               990   }
953   if (fPrintSizeX < -1){                          991   if (fPrintSizeX < -1){
954     return 0;                                     992     return 0;
955   }                                               993   }
956   return fPrintSizeX;                             994   return fPrintSizeX;
957 }                                                 995 }
958                                                   996 
959 G4int G4OpenGLViewer::getRealExportHeight() {     997 G4int G4OpenGLViewer::getRealExportHeight() {
960   if (fPrintSizeY == -1) {                        998   if (fPrintSizeY == -1) {
961     return fWinSize_y;                            999     return fWinSize_y;
962   }                                               1000   }
963   GLint dims[2];                                  1001   GLint dims[2];
964   glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims);      1002   glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims);
965                                                   1003 
966   // L.Garnier 01-2010: Some problems with mac    1004   // L.Garnier 01-2010: Some problems with mac 10.6
967   if ((dims[0] !=0 ) && (dims[1] !=0)) {          1005   if ((dims[0] !=0 ) && (dims[1] !=0)) {
968     if (fPrintSizeY > dims[1]){                   1006     if (fPrintSizeY > dims[1]){
969       return dims[1];                             1007       return dims[1];
970     }                                             1008     }
971   }                                               1009   }
972   if (fPrintSizeY < -1){                          1010   if (fPrintSizeY < -1){
973     return 0;                                     1011     return 0;
974   }                                               1012   }
975   return fPrintSizeY;                             1013   return fPrintSizeY;
976 }                                                 1014 }
977                                                   1015 
978 void G4OpenGLViewer::setExportSize(G4int X, G4    1016 void G4OpenGLViewer::setExportSize(G4int X, G4int Y) {
979   fPrintSizeX = X;                                1017   fPrintSizeX = X;
980   fPrintSizeY = Y;                                1018   fPrintSizeY = Y;
981 }                                                 1019 }
982                                                   1020 
983 /**                                               1021 /**
984  If name is "" or "!", filename and extension     1022  If name is "" or "!", filename and extension will have the default value.
985  If name is "toto.png", set the name to "toto"    1023  If name is "toto.png", set the name to "toto" and the format to "png". No incremented suffix is added.
986  If name is "toto", set the name to "toto" and    1024  If name is "toto", set the name to "toto" and the format to default (or current format if specify).
987  If name is the same as previous, do not reset    1025  If name is the same as previous, do not reset incremented suffix.
988 */                                                1026 */
989 bool G4OpenGLViewer::setExportFilename(G4Strin    1027 bool G4OpenGLViewer::setExportFilename(G4String name,G4bool inc) {
990   if (name == "!") {                              1028   if (name == "!") {
991     name = "";                                    1029     name = "";
992   }                                               1030   }
993                                                   1031 
994   if (inc) {                                      1032   if (inc) {
995     if ((name != "") && (fExportFilename != na    1033     if ((name != "") && (fExportFilename != name)) {
996       fExportFilenameIndex=0;                     1034       fExportFilenameIndex=0;
997     }                                             1035     }
998   } else {                                        1036   } else {
999     fExportFilenameIndex=-1;                      1037     fExportFilenameIndex=-1;
1000   }                                              1038   }
1001                                                  1039 
1002   if (name.size() == 0) {                        1040   if (name.size() == 0) {
1003     name = getRealPrintFilename().c_str();       1041     name = getRealPrintFilename().c_str();
1004   } else {                                       1042   } else {
1005     // guess format by extention                 1043     // guess format by extention
1006     std::string extension = name.substr(name.    1044     std::string extension = name.substr(name.find_last_of(".") + 1);
1007     // If there is a dot in the name the abov << 1045     // no format
1008     if (extension.size() >= 3 && extension.si << 1046     if (name.size() != extension.size()) {
1009       if (setExportImageFormat(extension, fal << 1047       if (! setExportImageFormat(extension, false)) {
1010         fExportFilename = name.substr(0,name. << 
1011       } else {  // No viable extension found  << 
1012         return false;                            1048         return false;
1013       }                                          1049       }
1014     } else {  // Assume name is already the r << 
1015         fExportFilename = name;               << 
1016     }                                            1050     }
                                                   >> 1051     // get the name
                                                   >> 1052     fExportFilename = name.substr(0,name.find_last_of("."));
1017   }                                              1053   }
1018   return true;                                   1054   return true;
1019 }                                                1055 }
1020                                                  1056 
1021 std::string G4OpenGLViewer::getRealPrintFilen    1057 std::string G4OpenGLViewer::getRealPrintFilename() {
1022   std::string temp = fExportFilename;            1058   std::string temp = fExportFilename;
1023   if (fExportFilenameIndex != -1) {              1059   if (fExportFilenameIndex != -1) {
1024     temp += std::string("_");                    1060     temp += std::string("_");
1025     std::ostringstream os;                       1061     std::ostringstream os;
1026     os << std::setw(4) << std::setfill('0') < << 1062     os << fExportFilenameIndex;
1027     std::string nb_str = os.str();               1063     std::string nb_str = os.str();
1028     temp += nb_str;                              1064     temp += nb_str;
1029   }                                              1065   }
1030   temp += "."+fExportImageFormat;                1066   temp += "."+fExportImageFormat;
1031   return temp;                                   1067   return temp;
1032 }                                                1068 }
1033                                                  1069 
1034 GLdouble G4OpenGLViewer::getSceneNearWidth()     1070 GLdouble G4OpenGLViewer::getSceneNearWidth()
1035 {                                                1071 {
1036   if (!fSceneHandler.GetScene()) {               1072   if (!fSceneHandler.GetScene()) {
1037     return 0;                                    1073     return 0;
1038   }                                              1074   }
1039   const G4Point3D targetPoint                    1075   const G4Point3D targetPoint
1040     = fSceneHandler.GetScene()->GetStandardTa    1076     = fSceneHandler.GetScene()->GetStandardTargetPoint()
1041     + fVP.GetCurrentTargetPoint ();              1077     + fVP.GetCurrentTargetPoint ();
1042   G4double radius = fSceneHandler.GetScene()-    1078   G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius();
1043   if(radius<=0.) radius = 1.;                    1079   if(radius<=0.) radius = 1.;
1044   const G4double cameraDistance = fVP.GetCame    1080   const G4double cameraDistance = fVP.GetCameraDistance (radius);
1045   const GLdouble pnear   = fVP.GetNearDistanc    1081   const GLdouble pnear   = fVP.GetNearDistance (cameraDistance, radius);
1046   return 2 * fVP.GetFrontHalfHeight (pnear, r    1082   return 2 * fVP.GetFrontHalfHeight (pnear, radius);
1047 }                                                1083 }
1048                                                  1084 
1049 GLdouble G4OpenGLViewer::getSceneFarWidth()      1085 GLdouble G4OpenGLViewer::getSceneFarWidth()
1050 {                                                1086 {
1051   if (!fSceneHandler.GetScene()) {               1087   if (!fSceneHandler.GetScene()) {
1052     return 0;                                    1088     return 0;
1053   }                                              1089   }
1054   const G4Point3D targetPoint                    1090   const G4Point3D targetPoint
1055     = fSceneHandler.GetScene()->GetStandardTa    1091     = fSceneHandler.GetScene()->GetStandardTargetPoint()
1056     + fVP.GetCurrentTargetPoint ();              1092     + fVP.GetCurrentTargetPoint ();
1057   G4double radius = fSceneHandler.GetScene()-    1093   G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius();
1058   if(radius<=0.) radius = 1.;                    1094   if(radius<=0.) radius = 1.;
1059   const G4double cameraDistance = fVP.GetCame    1095   const G4double cameraDistance = fVP.GetCameraDistance (radius);
1060   const GLdouble pnear   = fVP.GetNearDistanc    1096   const GLdouble pnear   = fVP.GetNearDistance (cameraDistance, radius);
1061   const GLdouble pfar    = fVP.GetFarDistance    1097   const GLdouble pfar    = fVP.GetFarDistance  (cameraDistance, pnear, radius);
1062   return 2 * fVP.GetFrontHalfHeight (pfar, ra    1098   return 2 * fVP.GetFrontHalfHeight (pfar, radius);
1063 }                                                1099 }
1064                                                  1100 
1065                                                  1101 
1066 GLdouble G4OpenGLViewer::getSceneDepth()         1102 GLdouble G4OpenGLViewer::getSceneDepth()
1067 {                                                1103 {
1068   if (!fSceneHandler.GetScene()) {               1104   if (!fSceneHandler.GetScene()) {
1069     return 0;                                    1105     return 0;
1070   }                                              1106   }
1071   const G4Point3D targetPoint                    1107   const G4Point3D targetPoint
1072     = fSceneHandler.GetScene()->GetStandardTa    1108     = fSceneHandler.GetScene()->GetStandardTargetPoint()
1073     + fVP.GetCurrentTargetPoint ();              1109     + fVP.GetCurrentTargetPoint ();
1074   G4double radius = fSceneHandler.GetScene()-    1110   G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius();
1075   if(radius<=0.) radius = 1.;                    1111   if(radius<=0.) radius = 1.;
1076   const G4double cameraDistance = fVP.GetCame    1112   const G4double cameraDistance = fVP.GetCameraDistance (radius);
1077   const GLdouble pnear   = fVP.GetNearDistanc    1113   const GLdouble pnear   = fVP.GetNearDistance (cameraDistance, radius);
1078   return fVP.GetFarDistance  (cameraDistance,    1114   return fVP.GetFarDistance  (cameraDistance, pnear, radius)- pnear;
1079 }                                                1115 }
1080                                                  1116 
1081                                                  1117 
1082                                                  1118 
1083 void G4OpenGLViewer::rotateScene(G4double dx,    1119 void G4OpenGLViewer::rotateScene(G4double dx, G4double dy)
1084 {                                                1120 {
1085   if (fVP.GetRotationStyle() == G4ViewParamet    1121   if (fVP.GetRotationStyle() == G4ViewParameters::freeRotation) {
1086     rotateSceneInViewDirection(dx,dy);           1122     rotateSceneInViewDirection(dx,dy);
1087   } else {                                       1123   } else {
1088     if( dx != 0) {                               1124     if( dx != 0) {
1089       rotateSceneThetaPhi(dx,0);                 1125       rotateSceneThetaPhi(dx,0);
1090     }                                            1126     }
1091     if( dy != 0) {                               1127     if( dy != 0) {
1092       rotateSceneThetaPhi(0,dy);                 1128       rotateSceneThetaPhi(0,dy);
1093     }                                            1129     }
1094   }                                              1130   }
1095 }                                                1131 }
1096                                                  1132 
1097                                                  1133 
1098 void G4OpenGLViewer::rotateSceneToggle(G4doub    1134 void G4OpenGLViewer::rotateSceneToggle(G4double dx, G4double dy)
1099 {                                                1135 {
1100   if (fVP.GetRotationStyle() != G4ViewParamet    1136   if (fVP.GetRotationStyle() != G4ViewParameters::freeRotation) {
1101     rotateSceneInViewDirection(dx,dy);           1137     rotateSceneInViewDirection(dx,dy);
1102   } else {                                       1138   } else {
1103     if( dx != 0) {                               1139     if( dx != 0) {
1104       rotateSceneThetaPhi(dx,0);                 1140       rotateSceneThetaPhi(dx,0);
1105     }                                            1141     }
1106     if( dy != 0) {                               1142     if( dy != 0) {
1107       rotateSceneThetaPhi(0,dy);                 1143       rotateSceneThetaPhi(0,dy);
1108     }                                            1144     }
1109   }                                              1145   }
1110 }                                                1146 }
1111                                                  1147 
1112 void G4OpenGLViewer::rotateSceneThetaPhi(G4do    1148 void G4OpenGLViewer::rotateSceneThetaPhi(G4double dx, G4double dy)
1113 {                                                1149 {
1114   if (!fSceneHandler.GetScene()) {               1150   if (!fSceneHandler.GetScene()) {
1115     return;                                      1151     return;
1116   }                                              1152   }
1117                                                  1153 
1118   G4Vector3D vp;                                 1154   G4Vector3D vp;
1119   G4Vector3D up;                                 1155   G4Vector3D up;
1120                                                  1156   
1121   G4Vector3D xprime;                             1157   G4Vector3D xprime;
1122   G4Vector3D yprime;                             1158   G4Vector3D yprime;
1123   G4Vector3D zprime;                             1159   G4Vector3D zprime;
1124                                                  1160   
1125   G4double delta_alpha;                          1161   G4double delta_alpha;
1126   G4double delta_theta;                          1162   G4double delta_theta;
1127                                                  1163   
1128   G4Vector3D new_vp;                             1164   G4Vector3D new_vp;
1129   G4Vector3D new_up;                             1165   G4Vector3D new_up;
1130                                                  1166   
1131   G4double cosalpha;                             1167   G4double cosalpha;
1132   G4double sinalpha;                             1168   G4double sinalpha;
1133                                                  1169   
1134   G4Vector3D a1;                                 1170   G4Vector3D a1;
1135   G4Vector3D a2;                                 1171   G4Vector3D a2;
1136   G4Vector3D delta;                              1172   G4Vector3D delta;
1137   G4Vector3D viewPoint;                          1173   G4Vector3D viewPoint;
1138                                                  1174 
1139                                                  1175     
1140   //phi spin stuff here                          1176   //phi spin stuff here
1141                                                  1177   
1142   vp = fVP.GetViewpointDirection ().unit ();     1178   vp = fVP.GetViewpointDirection ().unit ();
1143   up = fVP.GetUpVector ().unit ();               1179   up = fVP.GetUpVector ().unit ();
1144                                                  1180   
1145   yprime = (up.cross(vp)).unit();                1181   yprime = (up.cross(vp)).unit();
1146   zprime = (vp.cross(yprime)).unit();            1182   zprime = (vp.cross(yprime)).unit();
1147                                                  1183   
1148   if (fVP.GetLightsMoveWithCamera()) {           1184   if (fVP.GetLightsMoveWithCamera()) {
1149     delta_alpha = dy * fRot_sens;                1185     delta_alpha = dy * fRot_sens;
1150     delta_theta = -dx * fRot_sens;               1186     delta_theta = -dx * fRot_sens;
1151   } else {                                       1187   } else {
1152     delta_alpha = -dy * fRot_sens;               1188     delta_alpha = -dy * fRot_sens;
1153     delta_theta = dx * fRot_sens;                1189     delta_theta = dx * fRot_sens;
1154   }                                              1190   }    
1155                                                  1191   
1156   delta_alpha *= CLHEP::deg;                  << 1192   delta_alpha *= deg;
1157   delta_theta *= CLHEP::deg;                  << 1193   delta_theta *= deg;
1158                                                  1194   
1159   new_vp = std::cos(delta_alpha) * vp + std::    1195   new_vp = std::cos(delta_alpha) * vp + std::sin(delta_alpha) * zprime;
1160                                                  1196   
1161   // to avoid z rotation flipping                1197   // to avoid z rotation flipping
1162   // to allow more than 360° rotation        << 1198   // to allow more than 360∞ rotation
1163                                                  1199 
1164   if (fVP.GetLightsMoveWithCamera()) {           1200   if (fVP.GetLightsMoveWithCamera()) {
1165     new_up = (new_vp.cross(yprime)).unit();      1201     new_up = (new_vp.cross(yprime)).unit();
1166     if (new_vp.z()*vp.z() <0) {                  1202     if (new_vp.z()*vp.z() <0) {
1167       new_up.set(new_up.x(),-new_up.y(),new_u    1203       new_up.set(new_up.x(),-new_up.y(),new_up.z());
1168     }                                            1204     }
1169   } else {                                       1205   } else {
1170     new_up = up;                                 1206     new_up = up;
1171     if (new_vp.z()*vp.z() <0) {                  1207     if (new_vp.z()*vp.z() <0) {
1172       new_up.set(new_up.x(),-new_up.y(),new_u    1208       new_up.set(new_up.x(),-new_up.y(),new_up.z());
1173     }                                            1209     }
1174   }                                              1210   }
1175   fVP.SetUpVector(new_up);                       1211   fVP.SetUpVector(new_up);
1176   ////////////////                               1212   ////////////////
1177   // Rotates by fixed azimuthal angle delta_t    1213   // Rotates by fixed azimuthal angle delta_theta.
1178                                                  1214   
1179   cosalpha = new_up.dot (new_vp.unit());         1215   cosalpha = new_up.dot (new_vp.unit());
1180   sinalpha = std::sqrt (1. - std::pow (cosalp    1216   sinalpha = std::sqrt (1. - std::pow (cosalpha, 2));
1181   yprime = (new_up.cross (new_vp.unit())).uni    1217   yprime = (new_up.cross (new_vp.unit())).unit ();
1182   xprime = yprime.cross (new_up);                1218   xprime = yprime.cross (new_up);
1183   // Projection of vp on plane perpendicular     1219   // Projection of vp on plane perpendicular to up...
1184   a1 = sinalpha * xprime;                        1220   a1 = sinalpha * xprime;
1185   // Required new projection...                  1221   // Required new projection...
1186   a2 = sinalpha * (std::cos (delta_theta) * x    1222   a2 = sinalpha * (std::cos (delta_theta) * xprime + std::sin (delta_theta) * yprime);
1187   // Required Increment vector...                1223   // Required Increment vector...
1188   delta = a2 - a1;                               1224   delta = a2 - a1;
1189   // So new viewpoint is...                      1225   // So new viewpoint is...
1190   viewPoint = new_vp.unit() + delta;             1226   viewPoint = new_vp.unit() + delta;
1191                                                  1227   
1192   fVP.SetViewAndLights (viewPoint);              1228   fVP.SetViewAndLights (viewPoint);
1193 }                                                1229 }
1194                                                  1230 
1195                                                  1231 
1196 void G4OpenGLViewer::rotateSceneInViewDirecti    1232 void G4OpenGLViewer::rotateSceneInViewDirection(G4double dx, G4double dy)
1197 {                                                1233 {
1198   if (!fSceneHandler.GetScene()) {               1234   if (!fSceneHandler.GetScene()) {
1199     return;                                      1235     return;
1200   }                                              1236   }
1201                                                  1237 
1202   G4Vector3D vp;                                 1238   G4Vector3D vp;
1203   G4Vector3D up;                                 1239   G4Vector3D up;
1204                                                  1240   
1205   G4Vector3D xprime;                             1241   G4Vector3D xprime;
1206   G4Vector3D yprime;                             1242   G4Vector3D yprime;
1207   G4Vector3D zprime;                             1243   G4Vector3D zprime;
1208                                                  1244   
1209   G4Vector3D new_vp;                             1245   G4Vector3D new_vp;
1210   G4Vector3D new_up;                             1246   G4Vector3D new_up;
1211                                                  1247   
1212   G4Vector3D a1;                                 1248   G4Vector3D a1;
1213   G4Vector3D a2;                                 1249   G4Vector3D a2;
1214   G4Vector3D delta;                              1250   G4Vector3D delta;
1215   G4Vector3D viewPoint;                          1251   G4Vector3D viewPoint;
1216                                                  1252 
1217   dx = dx/100;                                   1253   dx = dx/100;
1218   dy = dy/100;                                   1254   dy = dy/100;
1219                                                  1255 
1220   //phi spin stuff here                          1256   //phi spin stuff here
1221                                                  1257   
                                                   >> 1258 #ifdef G4DEBUG_VIS_OGL
                                                   >> 1259   printf("G4OpenGLViewer::rotateScene dx:%f dy:%f delta:%f\n",dx,dy, fRot_sens);
                                                   >> 1260 #endif
                                                   >> 1261 
1222   vp = fVP.GetViewpointDirection ().unit();      1262   vp = fVP.GetViewpointDirection ().unit();
1223   up = fVP.GetUpVector ().unit();                1263   up = fVP.GetUpVector ().unit();
1224                                                  1264 
1225   G4Vector3D zPrimeVector = G4Vector3D(up.y()    1265   G4Vector3D zPrimeVector = G4Vector3D(up.y()*vp.z()-up.z()*vp.y(),
1226                              up.z()*vp.x()-up    1266                              up.z()*vp.x()-up.x()*vp.z(),
1227                              up.x()*vp.y()-up    1267                              up.x()*vp.y()-up.y()*vp.x());
1228                                                  1268 
1229   viewPoint = vp/fRot_sens + (zPrimeVector*dx    1269   viewPoint = vp/fRot_sens + (zPrimeVector*dx - up*dy) ;
1230   new_up = G4Vector3D(viewPoint.y()*zPrimeVec    1270   new_up = G4Vector3D(viewPoint.y()*zPrimeVector.z()-viewPoint.z()*zPrimeVector.y(),
1231                        viewPoint.z()*zPrimeVe    1271                        viewPoint.z()*zPrimeVector.x()-viewPoint.x()*zPrimeVector.z(),
1232                        viewPoint.x()*zPrimeVe    1272                        viewPoint.x()*zPrimeVector.y()-viewPoint.y()*zPrimeVector.x());
1233                                                  1273 
1234   G4Vector3D new_upUnit = new_up.unit();         1274   G4Vector3D new_upUnit = new_up.unit();
1235                                                  1275   
1236                                                  1276   
1237                                                  1277 
1238    fVP.SetUpVector(new_upUnit);                  1278    fVP.SetUpVector(new_upUnit);
1239    fVP.SetViewAndLights (viewPoint);             1279    fVP.SetViewAndLights (viewPoint);
1240 }                                                1280 }
1241                                                  1281 
1242                                                  1282 
1243 void G4OpenGLViewer::addExportImageFormat(std    1283 void G4OpenGLViewer::addExportImageFormat(std::string format) {
1244   fExportImageFormatVector.push_back(format);    1284   fExportImageFormatVector.push_back(format);
1245 }                                                1285 }
1246                                                  1286 
1247 bool G4OpenGLViewer::setExportImageFormat(std    1287 bool G4OpenGLViewer::setExportImageFormat(std::string format, bool quiet) {
1248   bool found = false;                            1288   bool found = false;
1249   std::string list;                              1289   std::string list;
1250   for (unsigned int a=0; a<fExportImageFormat    1290   for (unsigned int a=0; a<fExportImageFormatVector.size(); a++) {
1251     list +=fExportImageFormatVector.at(a) + "    1291     list +=fExportImageFormatVector.at(a) + " ";
1252                                                  1292 
1253     if (fExportImageFormatVector.at(a) == for    1293     if (fExportImageFormatVector.at(a) == format) {
1254       if (! quiet) {                             1294       if (! quiet) {
1255         G4cout << " Changing export format to    1295         G4cout << " Changing export format to \"" << format << "\"" << G4endl;
1256       }                                          1296       }
1257       if (format != fExportImageFormat) {        1297       if (format != fExportImageFormat) {
1258         fExportFilenameIndex = 0;                1298         fExportFilenameIndex = 0;
1259         fExportImageFormat = format;             1299         fExportImageFormat = format;
1260       }                                          1300       }
1261       return true;                               1301       return true;
1262     }                                            1302     }
1263   }                                              1303   }
1264   if (! found) {                                 1304   if (! found) {
1265     if (format.size() == 0) {                    1305     if (format.size() == 0) {
1266       G4cout << " Current formats availables     1306       G4cout << " Current formats availables are : " << list << G4endl;
1267     } else {                                     1307     } else {
1268       G4cerr << " Format \"" << format << "\"    1308       G4cerr << " Format \"" << format << "\" is not available for the selected viewer. Current formats availables are : " << list << G4endl;
1269     }                                            1309     }
1270   }                                              1310   }
1271   return false;                                  1311   return false;
1272 }                                                1312 }
1273                                                  1313 
1274                                                  1314 
1275 // From MESA implementation :                    1315 // From MESA implementation :
1276 // http://www.techques.com/question/1-8660454    1316 // http://www.techques.com/question/1-8660454/gluPickMatrix-code-from-Mesa
1277                                                  1317 
1278 void G4OpenGLViewer::g4GluPickMatrix(GLdouble    1318 void G4OpenGLViewer::g4GluPickMatrix(GLdouble x, GLdouble y, GLdouble width, GLdouble height,
1279                      GLint viewport[4])          1319                      GLint viewport[4])
1280   {                                              1320   {
1281     GLdouble mat[16];                         << 1321     GLfloat mat[16];
1282     GLdouble sx, sy;                          << 1322     GLfloat sx, sy;
1283     GLdouble tx, ty;                          << 1323     GLfloat tx, ty;
1284                                                  1324     
1285     sx = viewport[2] / width;                    1325     sx = viewport[2] / width;
1286     sy = viewport[3] / height;                   1326     sy = viewport[3] / height;
1287     tx = (viewport[2] + 2.0 * (viewport[0] -     1327     tx = (viewport[2] + 2.0 * (viewport[0] - x)) / width;
1288     ty = (viewport[3] + 2.0 * (viewport[1] -     1328     ty = (viewport[3] + 2.0 * (viewport[1] - y)) / height;
1289                                                  1329     
1290 #define M(row, col) mat[col*4+row]               1330 #define M(row, col) mat[col*4+row]
1291     M(0, 0) = sx;                                1331     M(0, 0) = sx;
1292     M(0, 1) = 0.0;                               1332     M(0, 1) = 0.0;
1293     M(0, 2) = 0.0;                               1333     M(0, 2) = 0.0;
1294     M(0, 3) = tx;                                1334     M(0, 3) = tx;
1295     M(1, 0) = 0.0;                               1335     M(1, 0) = 0.0;
1296     M(1, 1) = sy;                                1336     M(1, 1) = sy;
1297     M(1, 2) = 0.0;                               1337     M(1, 2) = 0.0;
1298     M(1, 3) = ty;                                1338     M(1, 3) = ty;
1299     M(2, 0) = 0.0;                               1339     M(2, 0) = 0.0;
1300     M(2, 1) = 0.0;                               1340     M(2, 1) = 0.0;
1301     M(2, 2) = 1.0;                               1341     M(2, 2) = 1.0;
1302     M(2, 3) = 0.0;                               1342     M(2, 3) = 0.0;
1303     M(3, 0) = 0.0;                               1343     M(3, 0) = 0.0;
1304     M(3, 1) = 0.0;                               1344     M(3, 1) = 0.0;
1305     M(3, 2) = 0.0;                               1345     M(3, 2) = 0.0;
1306     M(3, 3) = 1.0;                               1346     M(3, 3) = 1.0;
1307 #undef M                                         1347 #undef M
1308                                                  1348     
1309     glMultMatrixd(mat);                       << 1349     glMultMatrixf(mat);
1310 }                                                1350 }
1311                                                  1351 
1312                                                  1352 
1313                                                  1353 
1314                                                  1354 
1315                                                  1355 
1316 // From MESA implementation :                    1356 // From MESA implementation :
1317 // https://github.com/jlamarche/iOS-OpenGLES-    1357 // https://github.com/jlamarche/iOS-OpenGLES-Stuff/blob/master/Wavefront%20OBJ%20Loader/Classes/gluLookAt.m
1318 // or http://www.daniweb.com/software-develop    1358 // or http://www.daniweb.com/software-development/game-development/threads/308901/lookat-matrix-source-code
1319                                                  1359 
1320 void G4OpenGLViewer::g4GluLookAt( GLdouble ey    1360 void G4OpenGLViewer::g4GluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez,
1321                         GLdouble centerx, GLd    1361                         GLdouble centerx, GLdouble centery, GLdouble
1322                         centerz,                 1362                         centerz,
1323                         GLdouble upx, GLdoubl    1363                         GLdouble upx, GLdouble upy, GLdouble upz )
1324 {                                                1364 {
1325   GLdouble mat[16];                           << 1365   GLfloat mat[16];
1326   GLdouble x[3], y[3], z[3];                  << 1366   GLfloat x[3], y[3], z[3];
1327   GLdouble mag;                               << 1367   GLfloat mag;
1328                                                  1368   
1329   /* Make rotation matrix */                     1369   /* Make rotation matrix */
1330                                                  1370   
1331   /* Z vector */                                 1371   /* Z vector */
1332   z[0] = eyex - centerx;                         1372   z[0] = eyex - centerx;
1333   z[1] = eyey - centery;                         1373   z[1] = eyey - centery;
1334   z[2] = eyez - centerz;                         1374   z[2] = eyez - centerz;
1335   mag = std::sqrt(z[0] * z[0] + z[1] * z[1] +    1375   mag = std::sqrt(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]);
1336   if (mag) {      /* mpichler, 19950515 */       1376   if (mag) {      /* mpichler, 19950515 */
1337     z[0] /= mag;                                 1377     z[0] /= mag;
1338     z[1] /= mag;                                 1378     z[1] /= mag;
1339     z[2] /= mag;                                 1379     z[2] /= mag;
1340   }                                              1380   }
1341                                                  1381   
1342   /* Y vector */                                 1382   /* Y vector */
1343   y[0] = upx;                                    1383   y[0] = upx;
1344   y[1] = upy;                                    1384   y[1] = upy;
1345   y[2] = upz;                                    1385   y[2] = upz;
1346                                                  1386   
1347   /* X vector = Y cross Z */                     1387   /* X vector = Y cross Z */
1348   x[0] = y[1] * z[2] - y[2] * z[1];              1388   x[0] = y[1] * z[2] - y[2] * z[1];
1349   x[1] = -y[0] * z[2] + y[2] * z[0];             1389   x[1] = -y[0] * z[2] + y[2] * z[0];
1350   x[2] = y[0] * z[1] - y[1] * z[0];              1390   x[2] = y[0] * z[1] - y[1] * z[0];
1351                                                  1391   
1352   /* Recompute Y = Z cross X */                  1392   /* Recompute Y = Z cross X */
1353   y[0] = z[1] * x[2] - z[2] * x[1];              1393   y[0] = z[1] * x[2] - z[2] * x[1];
1354   y[1] = -z[0] * x[2] + z[2] * x[0];             1394   y[1] = -z[0] * x[2] + z[2] * x[0];
1355   y[2] = z[0] * x[1] - z[1] * x[0];              1395   y[2] = z[0] * x[1] - z[1] * x[0];
1356                                                  1396   
1357   /* mpichler, 19950515 */                       1397   /* mpichler, 19950515 */
1358   /* cross product gives area of parallelogra    1398   /* cross product gives area of parallelogram, which is < 1.0 for
1359    * non-perpendicular unit-length vectors; s    1399    * non-perpendicular unit-length vectors; so normalize x, y here
1360    */                                            1400    */
1361                                                  1401   
1362   mag = std::sqrt(x[0] * x[0] + x[1] * x[1] +    1402   mag = std::sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
1363   if (mag) {                                     1403   if (mag) {
1364     x[0] /= mag;                                 1404     x[0] /= mag;
1365     x[1] /= mag;                                 1405     x[1] /= mag;
1366     x[2] /= mag;                                 1406     x[2] /= mag;
1367   }                                              1407   }
1368                                                  1408   
1369   mag = std::sqrt(y[0] * y[0] + y[1] * y[1] +    1409   mag = std::sqrt(y[0] * y[0] + y[1] * y[1] + y[2] * y[2]);
1370   if (mag) {                                     1410   if (mag) {
1371     y[0] /= mag;                                 1411     y[0] /= mag;
1372     y[1] /= mag;                                 1412     y[1] /= mag;
1373     y[2] /= mag;                                 1413     y[2] /= mag;
1374   }                                              1414   }
1375                                                  1415   
1376 #define M(row,col)  mat[col*4+row]               1416 #define M(row,col)  mat[col*4+row]
1377   M(0, 0) = x[0];                                1417   M(0, 0) = x[0];
1378   M(0, 1) = x[1];                                1418   M(0, 1) = x[1];
1379   M(0, 2) = x[2];                                1419   M(0, 2) = x[2];
1380   M(0, 3) = 0.0;                                 1420   M(0, 3) = 0.0;
1381   M(1, 0) = y[0];                                1421   M(1, 0) = y[0];
1382   M(1, 1) = y[1];                                1422   M(1, 1) = y[1];
1383   M(1, 2) = y[2];                                1423   M(1, 2) = y[2];
1384   M(1, 3) = 0.0;                                 1424   M(1, 3) = 0.0;
1385   M(2, 0) = z[0];                                1425   M(2, 0) = z[0];
1386   M(2, 1) = z[1];                                1426   M(2, 1) = z[1];
1387   M(2, 2) = z[2];                                1427   M(2, 2) = z[2];
1388   M(2, 3) = 0.0;                                 1428   M(2, 3) = 0.0;
1389   M(3, 0) = 0.0;                                 1429   M(3, 0) = 0.0;
1390   M(3, 1) = 0.0;                                 1430   M(3, 1) = 0.0;
1391   M(3, 2) = 0.0;                                 1431   M(3, 2) = 0.0;
1392   M(3, 3) = 1.0;                                 1432   M(3, 3) = 1.0;
1393 #undef M                                         1433 #undef M
1394   glMultMatrixd(mat);                         << 1434   glMultMatrixf(mat);
1395                                                  1435   
1396   /* Translate Eye to Origin */                  1436   /* Translate Eye to Origin */
1397   glTranslated(-eyex, -eyey, -eyez);          << 1437   glTranslatef(-eyex, -eyey, -eyez);
1398 }                                                1438 }
1399                                                  1439 
1400 void G4OpenGLViewer::g4GlOrtho (GLdouble left << 
1401   //  glOrtho (left, right, bottom, top, near << 
1402                                               << 
1403   GLdouble a = 2.0 / (right - left);          << 
1404   GLdouble b = 2.0 / (top - bottom);          << 
1405   GLdouble c = -2.0 / (zFar - zNear);         << 
1406                                               << 
1407   GLdouble tx = - (right + left)/(right - lef << 
1408   GLdouble ty = - (top + bottom)/(top - botto << 
1409   GLdouble tz = - (zFar + zNear)/(zFar - zNea << 
1410                                               << 
1411   GLdouble ortho[16] = {                      << 
1412     a, 0, 0, 0,                               << 
1413     0, b, 0, 0,                               << 
1414     0, 0, c, 0,                               << 
1415     tx, ty, tz, 1                             << 
1416   };                                          << 
1417   glMultMatrixd(ortho);                       << 
1418                                               << 
1419 }                                             << 
1420                                                  1440 
1421                                                  1441 
1422 void G4OpenGLViewer::g4GlFrustum (GLdouble le << 1442 #ifdef G4OPENGL_VERSION_2
1423   //  glFrustum (left, right, bottom, top, ne << 1443 
1424                                               << 1444 // Associate the VBO drawer to the OpenGLViewer and the OpenGLSceneHandler
1425   GLdouble deltaX = right - left;             << 1445 void G4OpenGLViewer::setVboDrawer(G4OpenGLVboDrawer* drawer) {
1426   GLdouble deltaY = top - bottom;             << 1446   fVboDrawer = drawer;
1427   GLdouble deltaZ = zFar - zNear;             << 1447   try {
1428                                               << 1448     G4OpenGLSceneHandler& sh = dynamic_cast<G4OpenGLSceneHandler&>(fSceneHandler);
1429   GLdouble a = 2.0f * zNear / deltaX;         << 1449     sh.setVboDrawer(fVboDrawer);
1430   GLdouble b = 2.0f * zNear / deltaY;         << 1450   } catch(std::bad_cast exp) { }
1431   GLdouble c = (right + left) / deltaX;       << 
1432   GLdouble d = (top + bottom) / deltaY;       << 
1433   GLdouble e = -(zFar + zNear) / (zFar - zNea << 
1434   GLdouble f = -2.0f * zFar * zNear / deltaZ; << 
1435                                               << 
1436   GLdouble proj[16] = {                       << 
1437     a, 0, 0, 0,                               << 
1438     0, b, 0, 0,                               << 
1439     c, d, e, -1.0f,                           << 
1440     0, 0, f, 0                                << 
1441   };                                          << 
1442                                               << 
1443   glMultMatrixd(proj);                        << 
1444                                               << 
1445 }                                                1451 }
1446                                                  1452 
                                                   >> 1453 #endif
                                                   >> 1454 
                                                   >> 1455 
1447 G4String G4OpenGLViewerPickMap::print() {        1456 G4String G4OpenGLViewerPickMap::print() {
1448   std::ostringstream txt;                        1457   std::ostringstream txt;
                                                   >> 1458 
                                                   >> 1459   txt << fName;
                                                   >> 1460 
                                                   >> 1461   txt << "Hit: " << fHitNumber << ", Sub-hit: " << fSubHitNumber << ", PickName: " << fPickName << "\n";
                                                   >> 1462   
1449   for (unsigned int a=0; a<fAttributes.size()    1463   for (unsigned int a=0; a<fAttributes.size(); a++) {
1450     txt << fAttributes[a];                    << 1464     txt << fAttributes[a] << "\n";
1451     if (a < fAttributes.size() - 1) txt << "\ << 
1452   }                                              1465   }
1453   return txt.str();                              1466   return txt.str();
1454 }                                                1467 }
                                                   >> 1468 
                                                   >> 1469 #endif
1455                                                  1470