Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenInventor/src/G4OpenInventorWinViewer.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/OpenInventor/src/G4OpenInventorWinViewer.cc (Version 11.3.0) and /visualization/OpenInventor/src/G4OpenInventorWinViewer.cc (Version 6.0.p1)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 //                                                
 27 //                                                
 28 /*                                                
 29  * jck : 05 Feb 1997 : Initial Implementation     
 30  * jck : 21 Apr 1997 : Mods for SoXtHepViewer     
 31  * gb : on Win32 use an SoXtExaminerViewer.       
 32  * gb : 05 April 2004 : creation.                 
 33  * gb : 09 November 2004 : Pulldown menu with     
 34  * gb 14 November 2004 : inherit G4OpenInvento    
 35  */                                               
 36                                                   
 37 // this :                                         
 38 #include "G4OpenInventorWinViewer.hh"             
 39                                                   
 40 #include <Inventor/nodes/SoSelection.h>           
 41                                                   
 42 #include <Inventor/Win/SoWin.h>                   
 43 #include <Inventor/Win/viewers/SoWinExaminerVi    
 44                                                   
 45 #include "HEPVis/actions/SoGL2PSAction.h"         
 46                                                   
 47 #include "G4OpenInventor.hh"                      
 48 #include "G4OpenInventorSceneHandler.hh"          
 49 #include "G4VInteractorManager.hh"                
 50 #include "G4VisManager.hh"                        
 51                                                   
 52 #include <windowsx.h>                             
 53                                                   
 54 // To have sizeChanged public :                   
 55 class Geant4_SoWinExaminerViewer : public SoWi    
 56 public:                                           
 57   Geant4_SoWinExaminerViewer(HWND parent,const    
 58   :SoWinExaminerViewer(parent,name,embed){}       
 59   virtual void sizeChanged(const SbVec2s & siz    
 60     SoWinExaminerViewer::sizeChanged(size);       
 61   }                                               
 62 };                                                
 63                                                   
 64 // File :                                         
 65 #define ID_FILE_POSTSCRIPT 1                      
 66 #define ID_FILE_PIXMAP_POSTSCRIPT 2               
 67 #define ID_FILE_INVENTOR 3                        
 68 #define ID_FILE_ESCAPE 4                          
 69 // Etc :                                          
 70 #define ID_ETC_ERASE_DETECTOR 101                 
 71 #define ID_ETC_ERASE_EVENT 102                    
 72 #define ID_ETC_SET_SOLID 103                      
 73 #define ID_ETC_SET_WIRE_FRAME 104                 
 74 #define ID_ETC_SET_REDUCED_WIRE_FRAME 105         
 75 #define ID_ETC_SET_FULL_WIRE_FRAME 106            
 76 #define ID_ETC_SET_PREVIEW 107                    
 77 #define ID_ETC_SET_PREVIEW_AND_FULL 108           
 78 #define ID_ETC_UPDATE_SCENE 109                   
 79 #define ID_ETC_STATS 110                          
 80 // Help :                                         
 81 #define ID_HELP_CONTROLS 201                      
 82                                                   
 83 //static void SecondaryLoopPostAction ();         
 84                                                   
 85 static const char className[] = "G4OpenInvento    
 86                                                   
 87 G4OpenInventorWinViewer::G4OpenInventorWinView    
 88  G4OpenInventorSceneHandler& sceneHandler         
 89 ,const G4String& name)                            
 90 :G4OpenInventorViewer (sceneHandler, name)        
 91 ,fShell(0)                                        
 92 ,fViewer(0)                                       
 93 {                                                 
 94   if (G4VisManager::GetVerbosity() >= G4VisMan    
 95     G4cout << "Window name: " << fName << G4en    
 96 }                                                 
 97                                                   
 98                                                   
 99 void G4OpenInventorWinViewer::Initialise() {      
100                                                   
101   G4String wName = fName;                         
102                                                   
103   int width = fVP.GetWindowSizeHintX();           
104   int height = fVP.GetWindowSizeHintY();;         
105                                                   
106   HWND parent = (HWND)fInteractorManager->GetP    
107   if(!parent) {                                   
108     //Create a shell window :                     
109     G4String shellName = wName;                   
110     shellName += "_shell";                        
111     static SbBool done = FALSE;                   
112     if(done==FALSE) {                             
113       HBRUSH brush = (HBRUSH) GetSysColorBrush    
114       WNDCLASS wc;                                
115       wc.style = CS_HREDRAW | CS_VREDRAW;         
116       wc.lpfnWndProc = (WNDPROC)WindowProc;       
117       wc.cbClsExtra = 0;                          
118       wc.cbWndExtra = 0;                          
119       wc.hInstance = ::GetModuleHandle(0);        
120       wc.hIcon = ::LoadIcon(0, IDI_APPLICATION    
121       wc.hCursor = ::LoadCursor(0, IDC_ARROW);    
122       wc.hbrBackground = brush;                   
123       wc.lpszMenuName = className;                
124       wc.lpszClassName = className;               
125       ::RegisterClass(&wc);                       
126       done = TRUE;                                
127     }                                             
128                                                   
129     width = fVP.GetWindowSizeHintX();             
130     height = fVP.GetWindowSizeHintX();            
131                                                   
132     HMENU menuBar = CreateMenu();                 
133                                                   
134    {HMENU casc = CreatePopupMenu();               
135     ::AppendMenu(menuBar,MF_POPUP,(UINT)casc,"    
136     ::AppendMenu(casc,MF_STRING,ID_FILE_POSTSC    
137     ::AppendMenu(casc,MF_STRING,ID_FILE_PIXMAP    
138     ::AppendMenu(casc,MF_STRING,ID_FILE_INVENT    
139     ::AppendMenu(casc,MF_STRING,ID_FILE_ESCAPE    
140                                                   
141    {HMENU casc = CreatePopupMenu();               
142     ::AppendMenu(menuBar,MF_POPUP,(UINT)casc,"    
143     ::AppendMenu(casc,MF_STRING,ID_ETC_ERASE_D    
144     ::AppendMenu(casc,MF_STRING,ID_ETC_ERASE_E    
145     ::AppendMenu(casc,MF_STRING,ID_ETC_SET_SOL    
146     //::AppendMenu(casc,MF_STRING,ID_ETC_SET_W    
147     ::AppendMenu(casc,MF_STRING,ID_ETC_SET_RED    
148                       "Set (G4) reduced wire f    
149     ::AppendMenu(casc,MF_STRING,ID_ETC_SET_FUL    
150                       "Set (G4) full wire fram    
151     ::AppendMenu(casc,MF_STRING,ID_ETC_SET_PRE    
152                       "Visible mothers + invis    
153     ::AppendMenu(casc,MF_STRING,ID_ETC_SET_PRE    
154                       "Visible mothers + visib    
155     ::AppendMenu(casc,MF_STRING,ID_ETC_UPDATE_    
156     ::AppendMenu(casc,MF_STRING,ID_ETC_STATS,"    
157                                                   
158    {HMENU casc = CreatePopupMenu();               
159     ::AppendMenu(menuBar,MF_POPUP,(UINT)casc,"    
160     ::AppendMenu(casc,MF_STRING,ID_HELP_CONTRO    
161                                                   
162     fShell = ::CreateWindow(className, shellNa    
163                             WS_OVERLAPPEDWINDO    
164                             WS_VISIBLE | WS_CL    
165                             CW_USEDEFAULT, CW_    
166                             width,height,         
167                             0,menuBar,::GetMod    
168     // Retreive window and client sizez :         
169     RECT wrect,crect;                             
170     GetWindowRect((HWND)fShell,&wrect);           
171     GetClientRect((HWND)fShell,&crect);           
172     int ww = wrect.right-wrect.left;              
173     int wh = wrect.bottom-wrect.top;              
174     int cw = crect.right-crect.left;              
175     int ch = crect.bottom-crect.top;              
176     // Compell client rect to be width height     
177     MoveWindow((HWND)fShell,wrect.left,wrect.t    
178     ::SetWindowLongPtr((HWND)fShell,GWLP_USERD    
179     ::SetWindowText((HWND)fShell,shellName.c_s    
180     parent = fShell;                              
181     fInteractorManager->AddShell(fShell);         
182   } else {                                        
183     char* str = fInteractorManager->GetCreatio    
184     if(str!=0) wName = str;                       
185   }                                               
186   fViewer = new Geant4_SoWinExaminerViewer(par    
187                                                   
188   // Have a GL2PS render action :                 
189   const SbViewportRegion& vpRegion = fViewer->    
190   fGL2PSAction = new SoGL2PSAction(vpRegion);     
191   fViewer->setGLRenderAction(fGL2PSAction);       
192                                                   
193   fViewer->setSize(SbVec2s(width,height));        
194   fViewer->setSceneGraph(fSoSelection);           
195   fViewer->viewAll();                             
196   fViewer->saveHomePosition();                    
197   fViewer->setTitle(fName);                       
198   fViewer->show();                                
199   if(fShell) {                                    
200     SoWin::show(fShell);                          
201     fInteractorManager->FlushAndWaitExecution     
202   }                                               
203   fInteractorManager->SetCreatedInteractor (fV    
204   fViewer->setTransparencyType(SoGLRenderActio    
205 }                                                 
206                                                   
207 G4OpenInventorWinViewer::~G4OpenInventorWinVie    
208   if(fShell) fInteractorManager->RemoveShell(f    
209   if(fViewer) {                                   
210     fViewer->setSceneGraph(0);                    
211     delete fViewer;                               
212   }                                               
213   if(fShell) {                                    
214     ::SetWindowLongPtr((HWND)fShell,GWLP_USERD    
215     ::DestroyWindow((HWND)fShell);                
216   }                                               
217 }                                                 
218                                                   
219 void G4OpenInventorWinViewer::FinishView () {     
220   if(!fViewer) return;                            
221   fViewer->viewAll();                             
222   fViewer->saveHomePosition();                    
223 }                                                 
224                                                   
225 void G4OpenInventorWinViewer::SetView () {        
226   G4OpenInventorViewer::SetView ();               
227   if(!fViewer) return;                            
228   // Background.                                  
229   G4Colour b = fVP.GetBackgroundColour ();        
230   fViewer->setBackgroundColor                     
231     (SbColor((float)b.GetRed(),(float)b.GetGre    
232 }                                                 
233 void G4OpenInventorWinViewer::ViewerRender ()     
234   if(!fViewer) return;                            
235   fViewer->render();                              
236 }                                                 
237                                                   
238 SoCamera* G4OpenInventorWinViewer::GetCamera (    
239   if(!fViewer) return 0;                          
240   return fViewer->getCamera();                    
241 }                                                 
242                                                   
243                                                   
244 //////////////////////////////////////////////    
245 LRESULT CALLBACK G4OpenInventorWinViewer::Wind    
246  HWND   aWindow                                   
247 ,UINT   aMessage                                  
248 ,WPARAM aWParam                                   
249 ,LPARAM aLParam                                   
250 )                                                 
251 //////////////////////////////////////////////    
252 //  Below treatment of WM_SIZE, WM_SETFOCUS no    
253 // with TGS, but needed with SoFree. WM_DESTRO    
254 // 'main top level window' so that 'Close wind    
255 // the end of the task.                           
256 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
257 {                                                 
258   switch (aMessage) {                             
259   case WM_SIZE:{ // Assume one child window !     
260     int width = LOWORD(aLParam);                  
261     int height = HIWORD(aLParam);                 
262     //printf("debug : G4SoWindow : WMS_SIZE :     
263     G4OpenInventorWinViewer* This =               
264       (G4OpenInventorWinViewer*)::GetWindowLon    
265     if(This && This->fViewer) {                   
266       This->fViewer->sizeChanged(SbVec2s(width    
267     }                                             
268   }return 0;                                      
269   case WM_SETFOCUS:{ // Assume one child windo    
270     HWND hwnd = ::GetFirstChild(aWindow);         
271     if(hwnd!=0) ::SetFocus(hwnd);                 
272   }return 0;                                      
273   case WM_DESTROY:{                               
274     //G4OpenInventorWinViewer* This =             
275     //  (G4OpenInventorWinViewer*)::GetWindowL    
276     //::PostQuitMessage(0);                       
277   }return 0;                                      
278   case WM_COMMAND:{                               
279     G4OpenInventorWinViewer* This =               
280       (G4OpenInventorWinViewer*)::GetWindowLon    
281     if(This) {                                    
282       if(aLParam==0) { //From menu.               
283         // File :                                 
284         if(aWParam==ID_FILE_POSTSCRIPT) {         
285           This->WritePostScript();                
286         } else if(aWParam==ID_FILE_PIXMAP_POST    
287           This->WritePixmapPostScript();          
288         } else if(aWParam==ID_FILE_INVENTOR) {    
289           This->WriteInventor();                  
290         } else if(aWParam==ID_FILE_ESCAPE) {      
291           This->Escape();                         
292         // Etc :                                  
293         } else if(aWParam==ID_ETC_ERASE_DETECT    
294           This->EraseDetector();                  
295         } else if(aWParam==ID_ETC_ERASE_EVENT)    
296           This->EraseEvent();                     
297         } else if(aWParam==ID_ETC_SET_SOLID) {    
298           This->SetSolid();                       
299         } else if(aWParam==ID_ETC_SET_WIRE_FRA    
300           This->SetWireFrame();                   
301         } else if(aWParam==ID_ETC_SET_REDUCED_    
302           This->SetReducedWireFrame(true);        
303         } else if(aWParam==ID_ETC_SET_FULL_WIR    
304           This->SetReducedWireFrame(false);       
305         } else if(aWParam==ID_ETC_SET_PREVIEW)    
306           This->SetPreview();                     
307         } else if(aWParam==ID_ETC_SET_PREVIEW_    
308           This->SetPreviewAndFull();              
309         } else if(aWParam==ID_ETC_UPDATE_SCENE    
310           This->UpdateScene();                    
311         } else if(aWParam==ID_ETC_STATS) {        
312           This->SceneGraphStatistics();           
313         // Help :                                 
314         } else if(aWParam==ID_HELP_CONTROLS) {    
315           G4cout << This->Help() << G4endl;       
316         }                                         
317       }                                           
318     }                                             
319   }return 0;                                      
320   default:                                        
321     return (::DefWindowProc(aWindow,aMessage,a    
322   }                                               
323 }                                                 
324