Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenGL/src/G4OpenGLWin32Viewer.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/G4OpenGLWin32Viewer.cc (Version 11.3.0) and /visualization/OpenGL/src/G4OpenGLWin32Viewer.cc (Version 8.0)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                    <<   3 // * DISCLAIMER                                                       *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th <<   5 // * The following disclaimer summarizes all the specific disclaimers *
  6 // * the Geant4 Collaboration.  It is provided <<   6 // * of contributors to this software. The specific disclaimers,which *
  7 // * conditions of the Geant4 Software License <<   7 // * govern, are listed with their locations in:                      *
  8 // * LICENSE and available at  http://cern.ch/ <<   8 // *   http://cern.ch/geant4/license                                  *
  9 // * include a list of copyright holders.      << 
 10 // *                                                9 // *                                                                  *
 11 // * Neither the authors of this software syst     10 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     11 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     12 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     13 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  <<  14 // * use.                                                             *
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                               15 // *                                                                  *
 18 // * This  code  implementation is the result  <<  16 // * This  code  implementation is the  intellectual property  of the *
 19 // * technical work of the GEANT4 collaboratio <<  17 // * GEANT4 collaboration.                                            *
 20 // * By using,  copying,  modifying or  distri <<  18 // * By copying,  distributing  or modifying the Program (or any work *
 21 // * any work based  on the software)  you  ag <<  19 // * based  on  the Program)  you indicate  your  acceptance of  this *
 22 // * use  in  resulting  scientific  publicati <<  20 // * statement, and all its terms.                                    *
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // *******************************************     21 // ********************************************************************
                                                   >>  22 //
                                                   >>  23 //
                                                   >>  24 // $Id: G4OpenGLWin32Viewer.cc,v 1.14 2004/11/15 12:13:08 gbarrand Exp $
                                                   >>  25 // GEANT4 tag $Name: geant4-08-00 $
                                                   >>  26 //
 25 //                                                 27 // 
 26 // G4OpenGLWin32Viewer : Class to provide Wind <<  28 // G4OpenGLWin32Viewer : Class to provide WindowsNT specific
 27 //                       functionality for Ope <<  29 //                     functionality for OpenGL in GEANT4
 28 //                                                 30 //
 29 // 27/06/2003 : G.Barrand : implementation (at     31 // 27/06/2003 : G.Barrand : implementation (at last !).
 30                                                    32 
                                                   >>  33 #ifdef G4VIS_BUILD_OPENGLWIN32_DRIVER
                                                   >>  34 
 31 #include "G4OpenGLWin32Viewer.hh"                  35 #include "G4OpenGLWin32Viewer.hh"
 32 #include "G4VViewer.hh"                        << 
 33 #include "G4VSceneHandler.hh"                  << 
 34 #include "G4OpenGLSceneHandler.hh"             << 
 35 #include "G4Scene.hh"                          << 
 36                                                    36 
 37 #include "G4ios.hh"                                37 #include "G4ios.hh"
 38 #include "G4VisExtent.hh"                          38 #include "G4VisExtent.hh"
 39 #include "G4LogicalVolume.hh"                      39 #include "G4LogicalVolume.hh"
 40 #include "G4VSolid.hh"                             40 #include "G4VSolid.hh"
 41 #include "G4Point3D.hh"                            41 #include "G4Point3D.hh"
 42 #include "G4Normal3D.hh"                           42 #include "G4Normal3D.hh"
 43                                                    43 
 44 #include "G4SystemOfUnits.hh"                  << 
 45                                                    44 
 46 //////////////////////////////////////////////     45 //////////////////////////////////////////////////////////////////////////////
 47 void G4OpenGLWin32Viewer::SetView (                46 void G4OpenGLWin32Viewer::SetView (
 48 )                                                  47 ) 
 49 //////////////////////////////////////////////     48 //////////////////////////////////////////////////////////////////////////////
 50 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!     49 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
 51 {                                                  50 {
 52   if(!fHDC) return;                                51   if(!fHDC) return;
 53   if(!fHGLRC) return;                              52   if(!fHGLRC) return;
 54   ::wglMakeCurrent(fHDC,fHGLRC);                   53   ::wglMakeCurrent(fHDC,fHGLRC);
 55   G4OpenGLViewer::SetView ();                      54   G4OpenGLViewer::SetView ();  
 56 }                                                  55 }
 57                                                    56 
 58 //////////////////////////////////////////////     57 //////////////////////////////////////////////////////////////////////////////
 59 void G4OpenGLWin32Viewer::ShowView (               58 void G4OpenGLWin32Viewer::ShowView (
 60 )                                                  59 ) 
 61 //////////////////////////////////////////////     60 //////////////////////////////////////////////////////////////////////////////
 62 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!     61 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
 63 {                                                  62 {
                                                   >>  63   FinishView();
                                                   >>  64 }
                                                   >>  65 
                                                   >>  66 //////////////////////////////////////////////////////////////////////////////
                                                   >>  67 void G4OpenGLWin32Viewer::FinishView (
                                                   >>  68 ) 
                                                   >>  69 //////////////////////////////////////////////////////////////////////////////
                                                   >>  70 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
                                                   >>  71 {
 64   if(!fHDC) return;                                72   if(!fHDC) return;
 65   glFlush ();                                      73   glFlush ();
                                                   >>  74   ::SwapBuffers(fHDC);
 66   // Empty the Windows message queue :             75   // Empty the Windows message queue :
 67   MSG event;                                       76   MSG event;
 68   while ( ::PeekMessage(&event, NULL, 0, 0, PM     77   while ( ::PeekMessage(&event, NULL, 0, 0, PM_REMOVE) ) {
 69     ::TranslateMessage(&event);                    78     ::TranslateMessage(&event);
 70     ::DispatchMessage (&event);                    79     ::DispatchMessage (&event);
 71   }                                                80   }
 72 }                                                  81 }
 73                                                    82 
 74 //////////////////////////////////////////////     83 //////////////////////////////////////////////////////////////////////////////
 75 void G4OpenGLWin32Viewer::GetWin32Connection (     84 void G4OpenGLWin32Viewer::GetWin32Connection (
 76 )                                                  85 ) 
 77 //////////////////////////////////////////////     86 //////////////////////////////////////////////////////////////////////////////
 78 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!     87 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
 79 {                                                  88 {
 80 }                                                  89 }
 81                                                    90 
 82 //////////////////////////////////////////////     91 //////////////////////////////////////////////////////////////////////////////
 83 void G4OpenGLWin32Viewer::CreateGLWin32Context     92 void G4OpenGLWin32Viewer::CreateGLWin32Context (
 84 )                                                  93 ) 
 85 //////////////////////////////////////////////     94 //////////////////////////////////////////////////////////////////////////////
 86 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!     95 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
 87 {                                                  96 {
 88 }                                                  97 }
 89                                                    98 
 90 //////////////////////////////////////////////     99 //////////////////////////////////////////////////////////////////////////////
 91 void G4OpenGLWin32Viewer::CreateMainWindow (      100 void G4OpenGLWin32Viewer::CreateMainWindow (
 92 )                                                 101 ) 
 93 //////////////////////////////////////////////    102 //////////////////////////////////////////////////////////////////////////////
 94 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    103 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
 95 {                                                 104 {
 96   if(fWindow) return; //Done.                     105   if(fWindow) return; //Done.
 97                                                   106 
 98   // Bill Gates stuff...                          107   // Bill Gates stuff...
 99   static const char className[] = "G4OpenGLWin    108   static const char className[] = "G4OpenGLWin32";
100   static G4bool done = false;                  << 109   static bool done = false;
101   if(done==false) {                               110   if(done==false) {
102     WNDCLASS wc;                                  111     WNDCLASS wc;
103     wc.style = CS_HREDRAW | CS_VREDRAW;           112     wc.style = CS_HREDRAW | CS_VREDRAW;
104     wc.lpfnWndProc = (WNDPROC)WindowProc;         113     wc.lpfnWndProc = (WNDPROC)WindowProc;
105     wc.cbClsExtra = 0;                            114     wc.cbClsExtra = 0;
106     wc.cbWndExtra = 0;                            115     wc.cbWndExtra = 0;
107     wc.hInstance = ::GetModuleHandle(NULL);       116     wc.hInstance = ::GetModuleHandle(NULL);
108     wc.hIcon = LoadIcon  (NULL, IDI_APPLICATIO    117     wc.hIcon = LoadIcon  (NULL, IDI_APPLICATION);
109     wc.hCursor = LoadCursor(NULL,IDC_CROSS);      118     wc.hCursor = LoadCursor(NULL,IDC_CROSS);
110     wc.hbrBackground = NULL;                      119     wc.hbrBackground = NULL;
111     wc.lpszMenuName = className;                  120     wc.lpszMenuName = className;
112     wc.lpszClassName = className;                 121     wc.lpszClassName = className;
113     ::RegisterClass(&wc);                         122     ::RegisterClass(&wc);
114     done = true;                                  123     done = true;
115   }                                               124   }  
116                                                   125   
117   ResizeWindow(fVP.GetWindowSizeHintX(),fVP.Ge << 126   WinSize_x = 400;
                                                   >> 127   WinSize_y = 400;
                                                   >> 128   if (WinSize_x < fVP.GetWindowSizeHintX ())
                                                   >> 129     WinSize_x = fVP.GetWindowSizeHintX ();
                                                   >> 130   if (WinSize_y < fVP.GetWindowSizeHintY ())
                                                   >> 131     WinSize_y = fVP.GetWindowSizeHintY ();
118                                                   132 
119   G4int x_res=GetSystemMetrics(SM_CXSCREEN);   << 133   fWindow = ::CreateWindow(className,fName.c_str(), 
120   G4int y_res=GetSystemMetrics(SM_CYSCREEN);   << 
121                                                << 
122   //FIXME : NOT tested !                       << 
123   fWindow = ::CreateWindowEx(0, className,fNam << 
124          WS_OVERLAPPEDWINDOW,                     134          WS_OVERLAPPEDWINDOW,
125          //WS_CHILD | WS_VISIBLE,                 135          //WS_CHILD | WS_VISIBLE,
126                            //        0,0,      << 136          0,0,
127                            fVP.GetWindowAbsolu << 137          WinSize_x,WinSize_y,
128                            fVP.GetWindowAbsolu << 
129          getWinWidth(), getWinHeight(),        << 
130          NULL, NULL,                              138          NULL, NULL, 
131          ::GetModuleHandle(NULL),                 139          ::GetModuleHandle(NULL),
132          NULL);                                   140          NULL);
133   if(!fWindow) return;                            141   if(!fWindow) return;
134                                                   142 
135   ::SetWindowLongPtr(fWindow,GWLP_USERDATA,LON << 143   ::SetWindowLong(fWindow,GWL_USERDATA,LONG(this));
136                                                   144 
137   // initialize OpenGL rendering :                145   // initialize OpenGL rendering :
138   fHDC = ::GetDC(fWindow);                        146   fHDC = ::GetDC(fWindow);
139   if( fHDC && (SetWindowPixelFormat(fHDC)==TRU    147   if( fHDC && (SetWindowPixelFormat(fHDC)==TRUE) ) {
140     fHGLRC = ::wglCreateContext(fHDC);            148     fHGLRC = ::wglCreateContext(fHDC);
141   }                                               149   }
142                                                   150   
143   if(fHDC && fHGLRC) {                            151   if(fHDC && fHGLRC) {
144     ::wglMakeCurrent(fHDC,fHGLRC);                152     ::wglMakeCurrent(fHDC,fHGLRC);
145   }                                               153   }
146                                                   154 
147   //G.Barrand : avoid to indirectly pass in    << 
148   //              WindowProc/[WM_SIZE,WM_PAINT << 
149   //            from this method. Else we have << 
150   fInCreateWindow = true;                      << 
151                                                << 
152   ::SetForegroundWindow(fWindow);                 155   ::SetForegroundWindow(fWindow);
153   ::ShowWindow(fWindow,SW_SHOWDEFAULT);           156   ::ShowWindow(fWindow,SW_SHOWDEFAULT);
154   ::UpdateWindow(fWindow);                        157   ::UpdateWindow(fWindow);
155   ::DrawMenuBar(fWindow);                         158   ::DrawMenuBar(fWindow);
156                                                << 
157   fInCreateWindow = false;                     << 
158 }                                                 159 }
159                                                   160 
160 //////////////////////////////////////////////    161 //////////////////////////////////////////////////////////////////////////////
161 G4OpenGLWin32Viewer::G4OpenGLWin32Viewer (        162 G4OpenGLWin32Viewer::G4OpenGLWin32Viewer (
162  G4OpenGLSceneHandler& scene                      163  G4OpenGLSceneHandler& scene
163 )                                                 164 )
164 :G4VViewer (scene, -1)                            165 :G4VViewer (scene, -1)
165 ,G4OpenGLViewer (scene)                           166 ,G4OpenGLViewer (scene)
166 ,fMouseHovered(false)                          << 
167 ,fMousePressed(false)                          << 
168 ,fMousePressedX(0)                             << 
169 ,fMousePressedY(0)                             << 
170 ,fHDC(0)                                       << 
171 ,fWindow(0)                                       167 ,fWindow(0)
                                                   >> 168 ,fHDC(0)
172 ,fHGLRC(0)                                        169 ,fHGLRC(0)
173 ,fInCreateWindow(false)                        << 
174 //////////////////////////////////////////////    170 //////////////////////////////////////////////////////////////////////////////
175 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    171 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
176 {                                                 172 {
177 }                                                 173 }
178                                                   174 
179 //////////////////////////////////////////////    175 //////////////////////////////////////////////////////////////////////////////
180 G4OpenGLWin32Viewer::~G4OpenGLWin32Viewer (       176 G4OpenGLWin32Viewer::~G4OpenGLWin32Viewer (
181 )                                                 177 ) 
182 //////////////////////////////////////////////    178 //////////////////////////////////////////////////////////////////////////////
183 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    179 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
184 {                                                 180 {
185   // This is the end (Jim Morisson).              181   // This is the end (Jim Morisson).
186   if (fViewId >= 0) {                             182   if (fViewId >= 0) {
187     if(wglGetCurrentContext()!=NULL) wglMakeCu    183     if(wglGetCurrentContext()!=NULL) wglMakeCurrent(NULL,NULL);
188     if(fHGLRC)  {                                 184     if(fHGLRC)  {
189       wglDeleteContext(fHGLRC);                   185       wglDeleteContext(fHGLRC);
190       fHGLRC = NULL;                              186       fHGLRC = NULL;
191     }                                             187     }
192                                                   188     
193     if(fWindow) {                                 189     if(fWindow) {
194       ::SetWindowLongPtr(fWindow,GWLP_USERDATA << 190       ::SetWindowLong(fWindow,GWL_USERDATA,LONG(NULL));
195       if(fHDC) ::ReleaseDC(fWindow,fHDC);         191       if(fHDC) ::ReleaseDC(fWindow,fHDC);
196       ::DestroyWindow(fWindow);                   192       ::DestroyWindow(fWindow);
197     }                                             193     }
198   }                                               194   }
199 }                                                 195 }
200                                                   196 
201 //////////////////////////////////////////////    197 //////////////////////////////////////////////////////////////////////////////
202 LRESULT CALLBACK G4OpenGLWin32Viewer::WindowPr << 198 LRESULT CALLBACK G4OpenGLWin32Viewer::WindowProc ( 
203  HWND aWindow                                  << 199  HWND   aWindow
204 ,UINT aMessage                                 << 200 ,UINT   aMessage
205 ,WPARAM aWParam                                   201 ,WPARAM aWParam
206 ,LPARAM aLParam                                   202 ,LPARAM aLParam
207 )                                                 203 )
208 //////////////////////////////////////////////    204 //////////////////////////////////////////////////////////////////////////////
209 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    205 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
210 {                                                 206 {
211   switch (aMessage) {                          << 207 /*
212     case WM_SIZE: {                            << 208   switch (aMessage) { 
213       //FIXME : have to handle WM_RESIZE       << 209   case WM_PAINT:{
214       // Seems to be done (ovidio.pena AT upm. << 210     printf("debug : PAINT\n");
215       auto* This = (G4OpenGLWin32Viewer*)      << 211     HDC hDC;
216                    ::GetWindowLongPtr(aWindow, << 212     PAINTSTRUCT ps;
217       if (This) {                              << 213     hDC = BeginPaint(aWindow,&ps);
218         This->fWinSize_x = (G4int) LOWORD(aLPa << 214     if(This) {
219         This->fWinSize_y = (G4int) HIWORD(aLPa << 215       // FIXME : To have an automatic refresh someone have to redraw here.
220         if (!This->fInCreateWindow) {          << 216     }
221           This->SetView();                     << 217     EndPaint(aWindow, &ps);
222           glViewport(0, 0, This->fWinSize_x, T << 218 
223           This->DrawView();                    << 219     //FIXME : have to handle WM_RESIZE
224         }                                      << 220     //pView->WinSize_x = (G4int) width;
225       }                                        << 221     //pView->WinSize_y = (G4int) height;
226       return 0;                                << 222     G4OpenGLWin32Viewer* This = 
227     }                                          << 223       (G4OpenGLWin32Viewer*)::GetWindowLong(aWindow,GWL_USERDATA);
228                                                << 224     if(This) {
229     case WM_PAINT: {                           << 
230       PAINTSTRUCT ps;                          << 
231       BeginPaint(aWindow, &ps);                << 
232       auto* This = (G4OpenGLWin32Viewer*)      << 
233                    ::GetWindowLongPtr(aWindow, << 
234       if (This) {                              << 
235         //FIXME : To have an automatic refresh << 
236         // Seems to be done (ovidio.pena AT up << 
237         if(!This->fInCreateWindow) {           << 
238           This->SetView();                     << 
239           This->ClearView();                   << 
240           This->DrawView();                    << 
241         }                                      << 
242       }                                        << 
243       EndPaint(aWindow, &ps);                  << 
244       return 0;                                << 
245     }                                          << 
246                                                << 
247     case WM_LBUTTONDOWN: {                     << 
248       auto* This = (G4OpenGLWin32Viewer*)      << 
249                    ::GetWindowLongPtr(aWindow, << 
250       This->TrackMouse(LOWORD(aLParam), HIWORD << 
251       return 0;                                << 
252     }                                          << 
253                                                << 
254     case WM_RBUTTONDOWN: {                     << 
255       auto* This = (G4OpenGLWin32Viewer*)      << 
256                    ::GetWindowLongPtr(aWindow, << 
257       This->TrackMouse(LOWORD(aLParam), HIWORD << 
258       return 0;                                << 
259     }                                          << 
260                                                << 
261     case WM_LBUTTONUP: {                       << 
262       auto* This = (G4OpenGLWin32Viewer*)      << 
263                    ::GetWindowLongPtr(aWindow, << 
264       This->ReleaseMouse();                    << 
265       return 0;                                << 
266     }                                          << 
267                                                << 
268     case WM_RBUTTONUP: {                       << 
269       auto* This = (G4OpenGLWin32Viewer*)      << 
270                    ::GetWindowLongPtr(aWindow, << 
271       This->ReleaseMouse();                    << 
272       return 0;                                << 
273     }                                          << 
274                                                << 
275     case WM_MOUSEHOVER: {                      << 
276       auto* This = (G4OpenGLWin32Viewer*)      << 
277                    ::GetWindowLongPtr(aWindow, << 
278       This->fMouseHovered = true;              << 
279             return 0;                          << 
280     }                                          << 
281                                                << 
282     case WM_MOUSELEAVE: {                      << 
283       auto* This = (G4OpenGLWin32Viewer*)      << 
284                    ::GetWindowLongPtr(aWindow, << 
285       This->fMouseHovered = false;             << 
286       return 0;                                << 
287     }                                          << 
288                                                << 
289     case WM_MOUSEMOVE: {                       << 
290       auto* This = (G4OpenGLWin32Viewer*)      << 
291                    ::GetWindowLongPtr(aWindow, << 
292                                                << 
293       if (!This->fMouseHovered) {              << 
294         // mouse hover/leave tracking          << 
295         TRACKMOUSEEVENT tme;                   << 
296         tme.cbSize = sizeof(tme);              << 
297         tme.dwFlags = TME_HOVER | TME_LEAVE;   << 
298         tme.hwndTrack = aWindow;               << 
299         tme.dwHoverTime = HOVER_DEFAULT;       << 
300         ::TrackMouseEvent(&tme);               << 
301         This->fMouseHovered = true;            << 
302       }                                        << 
303                                                << 
304       if (This->fMousePressed) {               << 
305         G4int x = (G4int) LOWORD(aLParam);     << 
306         G4int y = (G4int) HIWORD(aLParam);     << 
307         G4int dx = x - This->fMousePressedX;   << 
308         G4int dy = y - This->fMousePressedY;   << 
309         This->fMousePressedX = x;              << 
310         This->fMousePressedY = y;              << 
311                                                << 
312         if (aWParam == MK_LBUTTON) {  // Rotat << 
313           This->SetRotation(dx, dy);           << 
314         }                                      << 
315                                                << 
316         if (aWParam == MK_RBUTTON) {  // Shift << 
317           This->SetShift(dx, dy);              << 
318         }                                      << 
319                                                << 
320         This->SetView();                       << 
321         This->ClearView();                     << 
322         This->DrawView();                      << 
323       }                                        << 
324                                                << 
325       return 0;                                << 
326     }                                          << 
327                                                << 
328     case WM_MOUSEWHEEL: {                      << 
329       auto* This = (G4OpenGLWin32Viewer*)      << 
330                    ::GetWindowLongPtr(aWindow, << 
331                                                << 
332       G4int delta = (short) HIWORD(aWParam);   << 
333                                                << 
334       This->SetZoom(delta);                    << 
335                                                << 
336       This->SetView();                            225       This->SetView();
                                                   >> 226       glViewport(0,0,This->WinSize_x,This->WinSize_y);
337       This->ClearView();                          227       This->ClearView();
338       This->DrawView();                           228       This->DrawView();
339       return 0;                                << 229       // WARNING : the below empty the Windows message queue...
                                                   >> 230       This->FinishView();
340     }                                             231     }
341                                                << 232   } return 0;
342     default:                                   << 233   default:
343       return DefWindowProc(aWindow, aMessage,  << 234     return DefWindowProc(aWindow,aMessage,aWParam,aLParam);
344   }                                               235   }
345 //  return DefWindowProc(aWindow,aMessage,aWPa << 236 */
                                                   >> 237   return DefWindowProc(aWindow,aMessage,aWParam,aLParam);
346 }                                                 238 }
347                                                   239 
348 //////////////////////////////////////////////    240 //////////////////////////////////////////////////////////////////////////////
349 G4bool G4OpenGLWin32Viewer::SetWindowPixelForm << 241 bool G4OpenGLWin32Viewer::SetWindowPixelFormat(
350  HDC aHdc                                         242  HDC aHdc
351 )                                                 243 )
352 //////////////////////////////////////////////    244 //////////////////////////////////////////////////////////////////////////////
353 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    245 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
354 {                                                 246 {
355   // The ungessable...                            247   // The ungessable...
356                                                   248 
357   PIXELFORMATDESCRIPTOR pfd;                      249   PIXELFORMATDESCRIPTOR pfd;
358   pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);      250   pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
359   pfd.nVersion = 1;                               251   pfd.nVersion = 1;
360   pfd.dwFlags =                                   252   pfd.dwFlags = 
361     PFD_DRAW_TO_WINDOW |                          253     PFD_DRAW_TO_WINDOW | 
362     PFD_SUPPORT_OPENGL |                          254     PFD_SUPPORT_OPENGL | 
363     PFD_DOUBLEBUFFER |                            255     PFD_DOUBLEBUFFER | 
364     PFD_STEREO_DONTCARE;                          256     PFD_STEREO_DONTCARE;  
365   pfd.iPixelType = PFD_TYPE_RGBA;                 257   pfd.iPixelType = PFD_TYPE_RGBA;
366   pfd.cColorBits = 32;                            258   pfd.cColorBits = 32;
367   pfd.cRedBits = 8;                               259   pfd.cRedBits = 8;
368   pfd.cRedShift = 16;                             260   pfd.cRedShift = 16;
369   pfd.cGreenBits = 8;                             261   pfd.cGreenBits = 8;
370   pfd.cGreenShift = 8;                            262   pfd.cGreenShift = 8;
371   pfd.cBlueBits = 8;                              263   pfd.cBlueBits = 8;
372   pfd.cBlueShift = 0;                             264   pfd.cBlueShift = 0;
373   pfd.cAlphaBits = 0;                             265   pfd.cAlphaBits = 0;
374   pfd.cAlphaShift = 0;                            266   pfd.cAlphaShift = 0;
375   pfd.cAccumBits = 64;                            267   pfd.cAccumBits = 64;  
376   pfd.cAccumRedBits = 16;                         268   pfd.cAccumRedBits = 16;
377   pfd.cAccumGreenBits = 16;                       269   pfd.cAccumGreenBits = 16;
378   pfd.cAccumBlueBits = 16;                        270   pfd.cAccumBlueBits = 16;
379   pfd.cAccumAlphaBits = 0;                        271   pfd.cAccumAlphaBits = 0;
380   pfd.cDepthBits = 32;                            272   pfd.cDepthBits = 32;
381   pfd.cStencilBits = 8;                           273   pfd.cStencilBits = 8;
382   pfd.cAuxBuffers = 0;                            274   pfd.cAuxBuffers = 0;
383   pfd.iLayerType = PFD_MAIN_PLANE;                275   pfd.iLayerType = PFD_MAIN_PLANE;
384   pfd.bReserved = 0;                              276   pfd.bReserved = 0;
385   pfd.dwLayerMask = 0;                            277   pfd.dwLayerMask = 0;
386   pfd.dwVisibleMask = 0;                          278   pfd.dwVisibleMask = 0;
387   pfd.dwDamageMask = 0;                           279   pfd.dwDamageMask = 0;
388                                                   280   
389   G4int pixelIndex = ::ChoosePixelFormat(aHdc, << 281   int pixelIndex = ::ChoosePixelFormat(aHdc,&pfd);
390   if (pixelIndex==0) {                            282   if (pixelIndex==0) {
391     pixelIndex = 1;                               283     pixelIndex = 1; 
392     if (::DescribePixelFormat(aHdc,               284     if (::DescribePixelFormat(aHdc, 
393             pixelIndex,                           285             pixelIndex, 
394             sizeof(PIXELFORMATDESCRIPTOR),        286             sizeof(PIXELFORMATDESCRIPTOR), 
395             &pfd)==0) {                           287             &pfd)==0) {
396       return false;                               288       return false;
397     }                                             289     }
398   }                                               290   }
399   if (::SetPixelFormat(aHdc,pixelIndex,&pfd)==    291   if (::SetPixelFormat(aHdc,pixelIndex,&pfd)==FALSE) return false;
400   return true;                                    292   return true;
401 }                                                 293 }
402                                                   294 
403 ////////////////////////////////////////////// << 
404 void G4OpenGLWin32Viewer::TrackMouse(          << 
405  G4int x                                       << 
406 ,G4int y                                       << 
407 )                                              << 
408 ////////////////////////////////////////////// << 
409 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! << 
410 {                                              << 
411   fMousePressed = true;                        << 
412   fMousePressedX = x;                          << 
413   fMousePressedY = y;                          << 
414 }                                              << 
415                                                << 
416 ////////////////////////////////////////////// << 
417 void G4OpenGLWin32Viewer::ReleaseMouse(        << 
418 )                                              << 
419 ////////////////////////////////////////////// << 
420 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! << 
421 {                                              << 
422   fMousePressed = false;                       << 
423   fMousePressedX = 0;                          << 
424   fMousePressedY = 0;                          << 
425 }                                              << 
426                                                << 
427 ////////////////////////////////////////////// << 
428 void G4OpenGLWin32Viewer::SetShift(            << 
429  G4int dx                                      << 
430 ,G4int dy                                      << 
431 )                                              << 
432 ////////////////////////////////////////////// << 
433 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! << 
434 {                                              << 
435   const G4double sceneRadius = GetSceneHandler << 
436                              ->GetExtent().Get << 
437   const G4double scale = 300;  // Roughly pixe << 
438   const G4double dxScene = dx*sceneRadius/scal << 
439   const G4double dyScene = dy*sceneRadius/scal << 
440   fVP.IncrementPan(-dxScene,dyScene);          << 
441 }                                              << 
442                                                << 
443 ////////////////////////////////////////////// << 
444 void G4OpenGLWin32Viewer::SetRotation(         << 
445  G4int dx                                      << 
446 ,G4int dy                                      << 
447 )                                              << 
448 ////////////////////////////////////////////// << 
449 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! << 
450 {                                              << 
451   // Simple ad-hoc algorithms (borrowed from G << 
452   const G4Vector3D& x_prime = fVP.GetViewpoint << 
453                               .cross(fVP.GetUp << 
454   const G4Vector3D& y_prime = x_prime.cross(fV << 
455   const G4double scale = 200;  // Roughly pixe << 
456   G4Vector3D newViewpointDirection = fVP.GetVi << 
457   newViewpointDirection += dx*x_prime/scale;   << 
458   newViewpointDirection += dy*y_prime/scale;   << 
459   fVP.SetViewpointDirection(newViewpointDirect << 
460                                                << 
461   if (fVP.GetRotationStyle() == G4ViewParamete << 
462       G4Vector3D newUpVector = fVP.GetUpVector << 
463       newUpVector += dx*x_prime/scale;         << 
464       newUpVector += dy*y_prime/scale;         << 
465       fVP.SetUpVector(newUpVector.unit());     << 
466   }                                            << 
467 }                                              << 
468                                                << 
469 ////////////////////////////////////////////// << 
470 void G4OpenGLWin32Viewer::SetZoom(             << 
471  G4int delta                                   << 
472 )                                              << 
473 ////////////////////////////////////////////// << 
474 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! << 
475 {                                              << 
476     if (fVP.GetFieldHalfAngle() == 0.) {  // O << 
477         const G4double scale = 500;  // Empiri << 
478         fVP.MultiplyZoomFactor(1. + delta/scal << 
479     } else {                              // P << 
480         const G4double scale = fVP.GetFieldHal << 
481         fVP.SetDolly(fVP.GetDolly() + delta/sc << 
482     }                                          << 
483 }                                              << 
484                                                   295 
                                                   >> 296 #endif
485                                                   297