Geant4 Cross Reference

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


  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 // ********************************************************************
 25 //                                                 22 //
                                                   >>  23 //
                                                   >>  24 // $Id: G4OpenInventorViewer.cc,v 1.9 2002/11/27 12:46:07 johna Exp $
                                                   >>  25 // GEANT4 tag $Name: geant4-05-00 $
                                                   >>  26 //
                                                   >>  27 /*
                                                   >>  28  * jck 05 Feb 1997 - Initial Implementation
                                                   >>  29  * jck 21 Apr 1997 
                                                   >>  30  *  Mods for SoXtHepViewer
                                                   >>  31  * gb : on Win32 use an SoXtExaminerViewer.
                                                   >>  32  */
                                                   >>  33 #ifdef G4VIS_BUILD_OI_DRIVER
 26                                                    34 
 27 // 03-MAY-2021 F.W. Jones: removed the camera  <<  35 #include <Inventor/Xt/SoXt.h>
 28 // since the group node sensor receives all ca <<  36 #include <Inventor/nodes/SoSelection.h>
 29 // can update the view parameters, irrespectiv <<  37 #include <Inventor/nodes/SoSelection.h>
 30 // camera type.                                << 
 31                                                    38 
 32 // this :                                      <<  39 #include "G4SoWindow.hh"
 33 #include "G4OpenInventorViewer.hh"             << 
 34                                                    40 
 35 #include <Inventor/nodes/SoSelection.h>        <<  41 #ifdef WIN32
 36 #include <Inventor/nodes/SoShape.h>            <<  42 #include <Inventor/Xt/viewers/SoXtExaminerViewer.h>
 37 #include <Inventor/nodes/SoOrthographicCamera. <<  43 #else
 38 #include <Inventor/nodes/SoPerspectiveCamera.h <<  44 #include <HEPVis/Xt/viewers/SoXtHepViewer.h>
 39 #include <Inventor/actions/SoCallbackAction.h> <<  45 #endif
 40 #include <Inventor/actions/SoWriteAction.h>    << 
 41 #include <Inventor/sensors/SoNodeSensor.h>     << 
 42                                                << 
 43 #include "HEPVis/nodes/SoImageWriter.h"        << 
 44 #include "HEPVis/actions/SoGL2PSAction.h"      << 
 45 #include "HEPVis/actions/SoCounterAction.h"    << 
 46 #include "HEPVis/actions/SoAlternateRepAction. << 
 47                                                    46 
 48 #include "G4OpenInventor.hh"                       47 #include "G4OpenInventor.hh"
                                                   >>  48 #include "G4OpenInventorViewer.hh"
 49 #include "G4OpenInventorSceneHandler.hh"           49 #include "G4OpenInventorSceneHandler.hh"
                                                   >>  50 
 50 #include "G4VInteractorManager.hh"                 51 #include "G4VInteractorManager.hh"
 51 #include "G4Scene.hh"                          << 
 52 #include "Geant4_SoPolyhedron.h"               << 
 53 #include "G4AttValue.hh"                       << 
 54 #include "G4AttDef.hh"                         << 
 55 #include "G4AttCheck.hh"                       << 
 56 #include "G4AttHolder.hh"                      << 
 57                                                << 
 58 G4OpenInventorViewer::G4OpenInventorViewer(    << 
 59  G4OpenInventorSceneHandler& sceneHandler      << 
 60 ,const G4String& name)                         << 
 61 :G4VViewer(sceneHandler, sceneHandler.Incremen << 
 62 ,fG4OpenInventorSceneHandler(sceneHandler)     << 
 63 ,fInteractorManager(0)                         << 
 64 ,fSoSelection(0)                               << 
 65 ,fSoImageWriter(0)                             << 
 66 ,fGL2PSAction(0) //To be set be suclass.       << 
 67 ,fGroupCameraSensor(0)                         << 
 68  //,fCameraSensor(0)                           << 
 69 {                                              << 
 70   fVP.SetAutoRefresh(true);                    << 
 71   fDefaultVP.SetAutoRefresh(true);             << 
 72   fVP.SetPicking(true);                        << 
 73   fDefaultVP.SetPicking(true);                 << 
 74                                                << 
 75   //FIXME : G.Barrand : not convinced that we  << 
 76   // For viewing of all objects by default :   << 
 77   //fDefaultVP.SetCulling(false);              << 
 78   //fVP.SetCulling(false);                     << 
 79                                                    52 
 80   fInteractorManager =                         <<  53 //
 81     ((G4OpenInventor*)fG4OpenInventorSceneHand <<  54 // Global variables 
 82     GetInteractorManager();                    <<  55 //
                                                   >>  56 
                                                   >>  57 //static void SecondaryLoopPostAction ();
 83                                                    58 
 84   // Main user scene graph root sent to the vi <<  59 void G4OpenInventorViewer::FinishView () {
 85   fSoSelection = new SoSelection;              <<  60   if(fViewer==NULL) return;
 86   fSoSelection->ref();                         <<  61 #ifdef WIN32
 87   fSoSelection->addSelectionCallback(Selection <<  62   ((SoXtViewer*)fViewer)->viewAll();
 88   //fSoSelection->addDeselectionCallback(Desel <<  63   ((SoXtViewer*)fViewer)->saveHomePosition();
 89   fSoSelection->policy = SoSelection::SINGLE;  <<  64 #else
 90                                                <<  65   ((SoXtHepViewer*)fViewer)->getCurrentViewer()->viewAll();
 91   SoGroup* group = new SoGroup;                <<  66   ((SoXtHepViewer*)fViewer)->getCurrentViewer()->saveHomePosition();
 92   fSoSelection->addChild(group);               <<  67 #endif
 93                                                << 
 94   //  Have a camera under fSoSelection in orde << 
 95   // that the below SceneGraphSensor be notife << 
 96   // when the viewer changes the camera type.  << 
 97   //  But we put the camera under a SoGroup so << 
 98   // the SceneGraphSensor be not triggered at  << 
 99   // under the fG4OpenInventorSceneHandler.fRo << 
100   SoOrthographicCamera* camera = new SoOrthogr << 
101   camera->viewportMapping.setValue(SoCamera::A << 
102   //camera->aspectRatio.setValue(10);          << 
103   camera->position.setValue(0,0,10);           << 
104   camera->orientation.setValue(SbRotation(SbVe << 
105   camera->height.setValue(10);                 << 
106   camera->nearDistance.setValue(1);            << 
107   camera->farDistance.setValue(100);           << 
108   camera->focalDistance.setValue(10);          << 
109   group->addChild(camera);                     << 
110                                                << 
111  {SoInput soInput;                             << 
112    if(soInput.openFile("g4view.iv",TRUE)) {    << 
113     SoSeparator* separator = SoDB::readAll(&so << 
114     if(separator) fSoSelection->addChild(separ << 
115   }}                                           << 
116                                                << 
117   fSoSelection->addChild(fG4OpenInventorSceneH << 
118                                                << 
119   // SoImageWriter should be the last.         << 
120   fSoImageWriter = new SoImageWriter();        << 
121   fSoImageWriter->fileName.setValue("g4out.ps" << 
122   fSoSelection->addChild(fSoImageWriter);      << 
123                                                << 
124   // Sensors :                                 << 
125   // To detect that the viewer had changed the << 
126   fGroupCameraSensor = new SoNodeSensor(GroupC << 
127   fGroupCameraSensor->setPriority(0);//Needed  << 
128   fGroupCameraSensor->attach(group);           << 
129   // FWJ Upgraded the group sensor so the came << 
130   //  fCameraSensor = new SoNodeSensor(CameraS << 
131   //  fCameraSensor->setPriority(0);//Needed i << 
132   //  fCameraSensor->attach(camera);           << 
133 }                                                  68 }
134                                                    69 
135 G4OpenInventorViewer::~G4OpenInventorViewer () <<  70 //
136    //  fCameraSensor->detach();                <<  71 // Exit
137    //  delete fCameraSensor;                   <<  72 //
138   fGroupCameraSensor->detach();                <<  73 int quitCB(void* interactorManager) {
139   delete fGroupCameraSensor;                   <<  74   ((G4VInteractorManager*)interactorManager) -> 
140   fSoSelection->unref();                       <<  75     RequireExitSecondaryLoop (OIV_EXIT_CODE);
                                                   >>  76   return 0;
141 }                                                  77 }
142                                                    78 
                                                   >>  79 //static void SecondaryLoopPostAction ()
                                                   >>  80 //{
                                                   >>  81 //  Display *display = fViewer->getDisplay();
                                                   >>  82 //  XSync(display, False);
                                                   >>  83 //  if(interactorManager -> GetExitSecondaryLoopCode ()==OIV_EXIT_CODE) {
                                                   >>  84 //    if (fShell!=NULL) XtRealizeWidget(fShell);
                                                   >>  85 //  }
                                                   >>  86 //}
                                                   >>  87 
143 void G4OpenInventorViewer::KernelVisitDecision     88 void G4OpenInventorViewer::KernelVisitDecision () {
144                                                    89   
145   // If there's a significant difference with      90   // If there's a significant difference with the last view parameters
146   // of either the scene handler or this viewe     91   // of either the scene handler or this viewer, trigger a rebuild.
147                                                    92 
148   if (                                             93   if (
149       //??fG4OpenInventorSceneHandler.fPODLLis     94       //??fG4OpenInventorSceneHandler.fPODLList.size() == 0 ||
150       // We need a test for empty scene graph,     95       // We need a test for empty scene graph, such as
151       // staticRoot.size() or something???????     96       // staticRoot.size() or something??????????  See temporary fix
152       // in contructor.  (John Allison Aug 200     97       // in contructor.  (John Allison Aug 2001)
                                                   >>  98       CompareForKernelVisit(fG4OpenInventorSceneHandler.fLastVP)  ||
153       CompareForKernelVisit(fLastVP)) {            99       CompareForKernelVisit(fLastVP)) {
154     NeedKernelVisit ();                           100     NeedKernelVisit ();
155   }                                               101   }      
                                                   >> 102   fLastVP = fVP;
                                                   >> 103   fG4OpenInventorSceneHandler.fLastVP = fVP;
156 }                                                 104 }
157                                                   105  
158 G4bool G4OpenInventorViewer::CompareForKernelV << 106 G4bool G4OpenInventorViewer::CompareForKernelVisit
                                                   >> 107 (G4ViewParameters& lastVP) {
159                                                   108 
160   if (                                            109   if (
161       (vp.GetDrawingStyle ()    != fVP.GetDraw << 110       (fLastVP.GetDrawingStyle ()    != fVP.GetDrawingStyle ())    ||
162       (vp.GetNumberOfCloudPoints()  != fVP.Get << 111       (fLastVP.GetRepStyle ()        != fVP.GetRepStyle ())        ||
163       (vp.IsAuxEdgeVisible ()   != fVP.IsAuxEd << 112       (fLastVP.IsCulling ()          != fVP.IsCulling ())          ||
164       (vp.IsCulling ()          != fVP.IsCulli << 113       (fLastVP.IsCullingInvisible () != fVP.IsCullingInvisible ()) ||
165       (vp.IsCullingInvisible () != fVP.IsCulli << 114       (fLastVP.IsDensityCulling ()   != fVP.IsDensityCulling ())   ||
166       (vp.IsDensityCulling ()   != fVP.IsDensi << 115       (fLastVP.IsCullingCovered ()   != fVP.IsCullingCovered ())   ||
167       (vp.IsCullingCovered ()   != fVP.IsCulli << 116       (fLastVP.IsSection ()          != fVP.IsSection ())          ||
168       (vp.GetCBDAlgorithmNumber() !=           << 117       // No need to visit kernel if section plane changes.
169        fVP.GetCBDAlgorithmNumber())            << 118       (fLastVP.IsCutaway ()          != fVP.IsCutaway ())          ||
170       (vp.IsSection ()          != fVP.IsSecti << 119       (fLastVP.GetCutawayPlanes ().size () !=
171       (vp.IsCutaway ()          != fVP.IsCutaw << 120                                  fVP.GetCutawayPlanes ().size ()) ||
172       // This assumes use of generic clipping  << 121       // No need to visit kernel if cutaway planes change.
173       // DCUT, cutaway).  If a decision is mad << 122       (fLastVP.IsExplode ()          != fVP.IsExplode ())          ||
174       // this will need changing.  See G4OpenG << 123       (fLastVP.GetNoOfSides ()       != fVP.GetNoOfSides ())
175       // G4OpenGLStoredViewer.cc::CompareForKe << 124       ) {
176       // G4OpenGLStoredSceneHander::CreateSect << 125       return true;;
177       (vp.IsExplode ()          != fVP.IsExplo << 
178       (vp.GetNoOfSides ()       != fVP.GetNoOf << 
179       (vp.GetGlobalMarkerScale()    != fVP.Get << 
180       (vp.GetGlobalLineWidthScale() != fVP.Get << 
181       (vp.IsMarkerNotHidden ()  != fVP.IsMarke << 
182       (vp.GetDefaultVisAttributes()->GetColour << 
183        fVP.GetDefaultVisAttributes()->GetColou << 
184       (vp.GetDefaultTextVisAttributes()->GetCo << 
185        fVP.GetDefaultTextVisAttributes()->GetC << 
186       (vp.GetBackgroundColour ()!= fVP.GetBack << 
187       (vp.IsPicking ()          != fVP.IsPicki << 
188       // Scaling for Open Inventor is done by  << 
189       // needs a kernel visit.  (In this respe << 
190       // OpenGL drivers, where it's done in Se << 
191       (vp.GetScaleFactor ()     != fVP.GetScal << 
192       (vp.GetVisAttributesModifiers() !=       << 
193        fVP.GetVisAttributesModifiers())        << 
194       (vp.IsSpecialMeshRendering() !=          << 
195        fVP.IsSpecialMeshRendering())           << 
196       (vp.GetSpecialMeshRenderingOption() !=   << 
197        fVP.GetSpecialMeshRenderingOption())    << 
198       )                                        << 
199     return true;                               << 
200                                                << 
201   if (vp.IsDensityCulling () &&                << 
202       (vp.GetVisibleDensity () != fVP.GetVisib << 
203     return true;                               << 
204                                                << 
205   if (vp.GetCBDAlgorithmNumber() > 0) {        << 
206     if (vp.GetCBDParameters().size() != fVP.Ge << 
207     else if (vp.GetCBDParameters() != fVP.GetC << 
208   }                                               126   }
209                                                << 127   if (fLastVP.IsDensityCulling () &&
210   if (vp.IsSection () &&                       << 128       (fLastVP.GetVisibleDensity () != fVP.GetVisibleDensity ()))
211       (vp.GetSectionPlane () != fVP.GetSection << 
212     return true;                                  129     return true;
213                                                   130 
214   if (vp.IsCutaway ()) {                       << 131   if (fLastVP.IsExplode () &&
215     if (vp.GetCutawayMode() != fVP.GetCutawayM << 132       (fLastVP.GetExplodeFactor () != fVP.GetExplodeFactor ()))
216     if (vp.GetCutawayPlanes ().size () !=      << 
217   fVP.GetCutawayPlanes ().size ()) return true << 
218     for (size_t i = 0; i < vp.GetCutawayPlanes << 
219       if (vp.GetCutawayPlanes()[i] != fVP.GetC << 
220   return true;                                 << 
221   }                                            << 
222                                                << 
223   if (vp.IsExplode () &&                       << 
224       (vp.GetExplodeFactor () != fVP.GetExplod << 
225     return true;                                  133     return true;
226                                                   134       
227   if (vp.IsSpecialMeshRendering() &&           << 
228       (vp.GetSpecialMeshVolumes() != fVP.GetSp << 
229     return true;                               << 
230                                                << 
231   return false;                                   135   return false;
232 }                                                 136 }
233                                                   137 
234 void G4OpenInventorViewer::ClearView () {      << 138 G4OpenInventorViewer::G4OpenInventorViewer
235 }                                              << 139 (G4OpenInventorSceneHandler& sceneHandler,
236                                                << 140  const G4String& name)
237 void G4OpenInventorViewer::SetView () {        << 141 :G4VViewer (sceneHandler, sceneHandler.IncrementViewCount(), name)
238                                                << 142 ,fG4OpenInventorSceneHandler(sceneHandler)
239   // Get G4 camera infos :                     << 143 ,fShell(NULL)
240   const G4Point3D target                       << 144 ,fWindow(NULL)
241     = fSceneHandler.GetScene()->GetStandardTar << 145 ,fViewer(NULL)
242     + fVP.GetCurrentTargetPoint ();            << 146 ,fSelection(NULL)
243   G4double radius = fSceneHandler.GetScene()-> << 147 ,fInteractorManager(NULL)
244   if(radius<=0.) radius = 1.;                  << 
245   const G4double cameraDistance = fVP.GetCamer << 
246   const G4Vector3D& direction = fVP.GetViewpoi << 
247   const G4Point3D cameraPosition = target + ca << 
248   //const G4double pnear = fVP.GetNearDistance << 
249   //const G4double pfar  = fVP.GetFarDistance  << 
250   const G4Normal3D& up = fVP.GetUpVector ();   << 
251                                                << 
252 /*                                             << 
253   printf("debug : target : %g %g %g\n",target. << 
254                                        target. << 
255                                        target. << 
256   printf("debug : dir : %g %g %g\n",direction. << 
257                                     direction. << 
258                                     direction. << 
259   printf("debug : pos : %g %g %g\n",cameraPosi << 
260                                     cameraPosi << 
261                                     cameraPosi << 
262   //printf("debug : near %g far %g\n",pnear,pf << 
263 */                                             << 
264                                                << 
265   SoCamera* camera = GetCamera();              << 
266   if(!camera) return;                          << 
267                                                << 
268   // viewer camera setup :                     << 
269   camera->position.setValue((float)cameraPosit << 
270                                (float)cameraPo << 
271                                (float)cameraPo << 
272                                                << 
273   SbVec3f sbTarget((float)target.x(),          << 
274                    (float)target.y(),          << 
275                    (float)target.z());         << 
276   SbVec3f sbUp((float)up.x(),                  << 
277          (float)up.y(),                        << 
278          (float)up.z());                       << 
279   sbUp.normalize();                            << 
280   // Need Coin's camera->pointAt(sbTarget,sbUp << 
281   // Stole Coin's code...                      << 
282   pointAt(camera,sbTarget,sbUp);               << 
283                                                << 
284   //camera->height.setValue(10);               << 
285   //camera->nearDistance.setValue((float)pnear << 
286   //camera->farDistance.setValue((float)pfar); << 
287   //camera->focalDistance.setValue((float)came << 
288                                                << 
289   if(camera->isOfType(SoOrthographicCamera::ge << 
290     if (fVP.GetFieldHalfAngle() == 0.) {       << 
291       //FIXME : ((SoOrthographicCamera*)camera << 
292       //FIXME : (Don't think we have to do tha << 
293     } else {                                   << 
294       //FIXME : Have to set a perspective came << 
295       //FIXME : viewer->setCameraType(SoPerspe << 
296       //FIXME : ((SoPerspectiveCamera*)camera) << 
297       //FIXME :   (2.*fVP.GetFieldHalfAngle()) << 
298     }                                          << 
299   } else if(camera->isOfType(SoPerspectiveCame << 
300     if (fVP.GetFieldHalfAngle() == 0.) {       << 
301       //FIXME : Have to set an orthographic ca << 
302       //FIXME : viewer->setCameraType(SoOrthog << 
303     } else {                                   << 
304       //FIXME : ((SoPerspectiveCamera*)camera) << 
305       //FIXME :   (2.*fVP.GetFieldHalfAngle()) << 
306     }                                          << 
307   }                                            << 
308 }                                              << 
309                                                << 
310 //COIN_FUNCTION_EXTENSION                      << 
311 void                                           << 
312 G4OpenInventorViewer::pointAt(SoCamera* camera << 
313 {                                              << 
314   SbVec3f dir = targetpoint - camera->position << 
315   if (dir.normalize() == 0.0f) return;         << 
316   lookAt(camera,dir, upvector);                << 
317 }                                              << 
318                                                << 
319 //COIN_FUNCTION                                << 
320 // Private method that calculates a new orient << 
321 // direction and camera up vector. Vectors mus << 
322 void                                           << 
323 G4OpenInventorViewer::lookAt(SoCamera* camera, << 
324 {                                              << 
325   SbVec3f z = -dir;                            << 
326   SbVec3f y = up;                              << 
327   SbVec3f x = y.cross(z);                      << 
328                                                << 
329   // recompute y to create a valid coordinate  << 
330   y = z.cross(x);                              << 
331                                                << 
332   // normalize x and y to create an orthonorma << 
333   y.normalize();                               << 
334   x.normalize();                               << 
335                                                << 
336   // create a rotation matrix                  << 
337   SbMatrix rot = SbMatrix::identity();         << 
338   rot[0][0] = x[0];                            << 
339   rot[0][1] = x[1];                            << 
340   rot[0][2] = x[2];                            << 
341                                                << 
342   rot[1][0] = y[0];                            << 
343   rot[1][1] = y[1];                            << 
344   rot[1][2] = y[2];                            << 
345                                                << 
346   rot[2][0] = z[0];                            << 
347   rot[2][1] = z[1];                            << 
348   rot[2][2] = z[2];                            << 
349                                                << 
350   camera->orientation.setValue(SbRotation(rot) << 
351 }                                              << 
352                                                << 
353 void                                           << 
354 G4OpenInventorViewer::lookedAt(SoCamera* camer << 
355 {                                                 148 {
356   SbRotation rot = camera->orientation.getValu << 149   fNeedKernelVisit = true;  //?? Temporary, until KernelVisitDecision fixed.
357   SbMatrix mrot; rot.getValue(mrot);           << 
358                                                << 
359   SbVec3f x, y, z;                             << 
360                                                << 
361   // create a rotation matrix                  << 
362   x[0] = mrot[0][0];                           << 
363   x[1] = mrot[0][1];                           << 
364   x[2] = mrot[0][2];                           << 
365                                                << 
366   y[0] = mrot[1][0];                           << 
367   y[1] = mrot[1][1];                           << 
368   y[2] = mrot[1][2];                           << 
369                                                << 
370   z[0] = mrot[2][0];                           << 
371   z[1] = mrot[2][1];                           << 
372   z[2] = mrot[2][2];                           << 
373                                                << 
374   dir = -z;                                    << 
375   dir.normalize();                             << 
376   up = SbVec3f(0.f,1.f,0.f);  // Choose y-axis << 
377   if (std::abs(up.dot(z)) > 1.e-6) {           << 
378     up = y;                                    << 
379     up.normalize();                            << 
380   }                                            << 
381 }                                              << 
382                                                << 
383 void G4OpenInventorViewer::DrawView () {       << 
384   //G4cout << "debug Iv::DrawViewer " <<G4endl << 
385   if (!fNeedKernelVisit) KernelVisitDecision() << 
386   fLastVP= fVP;                                << 
387   ProcessView();                               << 
388   FinishView();                                << 
389 }                                              << 
390                                                << 
391 void G4OpenInventorViewer::ShowView () {       << 
392   fInteractorManager -> SecondaryLoop ();      << 
393 }                                              << 
394                                                << 
395 // FWJ This sensor now performs the fVP update << 
396 void G4OpenInventorViewer::GroupCameraSensorCB << 
397 {                                              << 
398   G4OpenInventorViewer* This = (G4OpenInventor << 
399                                                << 
400   SoNode* node = ((SoNodeSensor*)aSensor)->get << 
401   //  printf("debug : GroupCameraSensorCB %s\n << 
402   //         node->getTypeId().getName().getSt << 
403                                                << 
404   if(node->isOfType(SoCamera::getClassTypeId() << 
405     SoCamera* camera = (SoCamera*)node;        << 
406                                                << 
407     // FWJ DEBUG                               << 
408     //    G4cout << "   UPDATING fVP FROM CAME << 
409     SbVec3f direction, up;                     << 
410     lookedAt(camera, direction, up);           << 
411     This->fVP.SetViewpointDirection            << 
412       (G4Vector3D(-direction[0], -direction[1] << 
413     This->fVP.SetUpVector(G4Vector3D(up[0], up << 
414                                                << 
415     SbVec3f pos = camera->position.getValue(); << 
416     SbVec3f target = pos + direction * camera- << 
417                                                << 
418     This->fVP.SetCurrentTargetPoint(G4Point3D( << 
419                                                << 
420     // FWJ camera sensor no longer needed      << 
421     // Viewer had changed the camera type,     << 
422     // attach the fCameraSensor to the new cam << 
423     // FWJ DEBUG                               << 
424     //    G4cout << "   SWITCHING TO CAMERA "  << 
425     //    This->fCameraSensor->detach();       << 
426     //    This->fCameraSensor->attach(camera); << 
427   }                                            << 
428                                                << 
429 }                                              << 
430                                                << 
431 /* FWJ This sensor is no longer needed         << 
432 void G4OpenInventorViewer::CameraSensorCB(void << 
433   G4OpenInventorViewer* This = (G4OpenInventor << 
434                                                << 
435   //  printf("debug : CameraSensorCB\n");      << 
436                                                << 
437   SoNode* node = ((SoNodeSensor*)aSensor)->get << 
438 //  printf("debug : CameraSensorCB %s\n",      << 
439 //         node->getTypeId().getName().getStri << 
440                                                << 
441   if(node->isOfType(SoCamera::getClassTypeId() << 
442     SoCamera* camera = (SoCamera*)node;        << 
443                                                << 
444     SbVec3f direction, up;                     << 
445     lookedAt(camera,direction, up);            << 
446     This->fVP.SetViewpointDirection            << 
447       (G4Vector3D(-direction[0],-direction[1], << 
448     This->fVP.SetUpVector(G4Vector3D(up[0],up[ << 
449                                                   150 
450     SbVec3f pos = camera->position.getValue(); << 151   fInteractorManager = 
451     SbVec3f target = pos + direction * camera- << 152     ((G4OpenInventor*)fG4OpenInventorSceneHandler.GetGraphicsSystem())->
                                                   >> 153     GetInteractorManager();
                                                   >> 154 //Widget toplevel = (Widget)fInteractorManager->GetMainInteractor ();
452                                                   155 
453     This->fVP.SetCurrentTargetPoint(G4Point3D( << 156 //fInteractorManager->
454   }                                            << 157 //AddSecondaryLoopPostAction ((G4SecondaryLoopAction)SecondaryLoopPostAction);
455 }                                              << 
456 */                                             << 
457                                                   158 
458 void G4OpenInventorViewer::SelectionCB(        << 159   G4cout << "Window name: " << fName << G4endl;
459  void* aThis                                   << 160   // 
460 ,SoPath* aPath                                 << 161   // Selection
461 )                                              << 162   //
462 {                                              << 163   fSelection = new SoSelection;
463   G4OpenInventorViewer* This = (G4OpenInventor << 164   fSelection->policy = SoSelection::SINGLE;
464   SoNode* node = ((SoFullPath*)aPath)->getTail << 165   fSelection->ref();
465   G4AttHolder* attHolder = dynamic_cast<G4AttH << 166   fSelection->addChild(fG4OpenInventorSceneHandler.root);
466   if(attHolder && attHolder->GetAttDefs().size << 167 
467     for (size_t i = 0; i < attHolder->GetAttDe << 168   Widget    parent = (Widget)fInteractorManager->GetParentInteractor ();
468       G4cout << G4AttCheck(attHolder->GetAttVa << 169 
469          attHolder->GetAttDefs()[i]);          << 170   G4String wName = fName;
470     }                                          << 171   const char* wname = wName.data();
                                                   >> 172 
                                                   >> 173 #define SIZE 400
                                                   >> 174   if(parent==NULL) {  //Create a shell window :
                                                   >> 175     fWindow = new G4SoWindow(wname);
                                                   >> 176     fWindow->setTitle(wname);
                                                   >> 177     fWindow->setSize(SbVec2s(SIZE,SIZE));
                                                   >> 178     fShell = parent = fWindow->getWidget();
                                                   >> 179     fInteractorManager->AddShell(fShell);
471   } else {                                        180   } else {
472     G4String name((char*)node->getName().getSt << 181     char* str = fInteractorManager->GetCreationString ();
473     G4String cls((char*)node->getTypeId().getN << 182     if(str!=NULL) wname = str;
474     G4cout << "SoNode : " << node              << 
475      << " SoType : " << cls                    << 
476      << " name : " << name                     << 
477      << G4endl;                                << 
478     G4cout << "No attributes attached." << G4e << 
479   }                                               183   }
480   /*FIXME : to explore (need different button  << 184   //
481   if(node->isOfType(Geant4_SoPolyhedron::getCl << 185   // Create and Customize the Viewer
482     Geant4_SoPolyhedron* polyhedron = (Geant4_ << 186   //
483     if(polyhedron->solid.getValue()==FALSE)    << 187 #ifdef WIN32
484       polyhedron->solid.setValue(TRUE);        << 188   fViewer = new SoXtExaminerViewer(parent,wname,TRUE);
485     else                                       << 189   fViewer->setSize(SbVec2s(SIZE,SIZE));
486       polyhedron->solid.setValue(FALSE);       << 190   ((SoXtViewer*)fViewer)->setSceneGraph(fSelection);
487   }*/                                          << 191   ((SoXtViewer*)fViewer)->viewAll();
488   This->fSoSelection->deselectAll();           << 192   ((SoXtViewer*)fViewer)->saveHomePosition();
489 }                                              << 193 #else
490 /*                                             << 194   fViewer = new SoXtHepViewer (parent,wname,TRUE);
491 void G4OpenInventorViewer::DeselectionCB(      << 195   ((SoXtHepViewer*)fViewer)->hideTextArea();
492  void* aThis                                   << 196   ((SoXtHepViewer*)fViewer)->resizeMain(SIZE,SIZE);
493 ,SoPath* aPath                                 << 197   ((SoXtHepViewer*)fViewer)->setQuitCallback(quitCB, fInteractorManager);
494 )                                              << 198   ((SoXtHepViewer*)fViewer)->setSceneGraph(fSelection);
495 {                                              << 199   ((SoXtHepViewer*)fViewer)->getCurrentViewer()->viewAll();
496   //G4OpenInventorViewer* This = (G4OpenInvent << 200   ((SoXtHepViewer*)fViewer)->getCurrentViewer()->saveHomePosition();
497   G4String name((char*)aPath->getTail()->getTy << 201 #endif
498   G4cout << "Deselect : " << name << G4endl;   << 202   fViewer->setTitle(fName);
499 }                                              << 203   fViewer->show();
500 */                                             << 204  
501                                                << 205   if(fWindow!=NULL) {
502 void G4OpenInventorViewer::DrawDetector() {    << 206     fWindow->show();
503   /* Replace this... - JA                      << 207     fInteractorManager->FlushAndWaitExecution ();
504   // DrawView does a ClearStore. Do not clear  << 
505   SoSeparator* tmp = fG4OpenInventorSceneHandl << 
506   fG4OpenInventorSceneHandler.fTransientRoot = << 
507   if (!fNeedKernelVisit) KernelVisitDecision() << 
508   ProcessView();                               << 
509   fG4OpenInventorSceneHandler.fTransientRoot-> << 
510   fG4OpenInventorSceneHandler.fTransientRoot = << 
511   */                                           << 
512   // ...by this... - JA                        << 
513   DrawView();                                  << 
514 }                                              << 
515                                                << 
516 ////////////////////////////////////////////// << 
517 /// Menu items callbacks ///////////////////// << 
518 ////////////////////////////////////////////// << 
519                                                << 
520 void G4OpenInventorViewer::Escape(){           << 
521   G4cout << "Escape..." <<G4endl;              << 
522   fInteractorManager->RequireExitSecondaryLoop << 
523 }                                              << 
524                                                << 
525 void G4OpenInventorViewer::WritePostScript(con << 
526   if(!fGL2PSAction) return;                    << 
527   fGL2PSAction->setFileName(aFile.c_str());    << 
528   fGL2PSAction->setExportImageFormat_EPS();    << 
529   fGL2PSAction->setTitleAndProducer("Geant4 ou << 
530   G4cout << "Produce " << aFile << "..." << G4 << 
531   if (fGL2PSAction->enableFileWriting()) {     << 
532     ViewerRender();                            << 
533     fGL2PSAction->disableFileWriting();        << 
534   }                                               208   }
535 }                                              << 
536                                                   209 
537 void G4OpenInventorViewer::WritePDF(const G4St << 210   fInteractorManager->SetCreatedInteractor (fViewer -> getWidget());
538   if(!fGL2PSAction) return;                    << 
539   fGL2PSAction->setFileName(aFile.c_str());    << 
540   fGL2PSAction->setExportImageFormat_PDF();    << 
541   fGL2PSAction->setTitleAndProducer("Geant4 ou << 
542   G4cout << "Produce " << aFile << "..." << G4 << 
543   if (fGL2PSAction->enableFileWriting()) {     << 
544     ViewerRender();                            << 
545     fGL2PSAction->disableFileWriting();        << 
546   }                                            << 
547 }                                                 211 }
548                                                   212 
549 void G4OpenInventorViewer::WritePixmapPostScri << 213 G4OpenInventorViewer::~G4OpenInventorViewer () {
550   fSoImageWriter->fileName.setValue(aFile.c_st << 214   if(fShell!=NULL) fInteractorManager -> RemoveShell (fShell);
551   //imageWriter->format.setValue(SoImageWriter << 215   if(fViewer!=NULL) {
552   fSoImageWriter->enable();                    << 216 #ifdef WIN32
553   ViewerRender();                              << 217     delete ((SoXtExaminerViewer*)fViewer);
554   fSoImageWriter->disable();                   << 218 #else
555   if(fSoImageWriter->getStatus()) {            << 219     delete ((SoXtHepViewer*)fViewer);
556     G4cout << G4String(fSoImageWriter->fileNam << 220 #endif
557            << " produced."                     << 
558            << G4endl;                          << 
559   } else {                                     << 
560     G4cout << G4String(fSoImageWriter->fileNam << 
561            << " not produced."                 << 
562            << G4endl;                          << 
563   }                                            << 
564 }                                              << 
565                                                << 
566 void G4OpenInventorViewer::WriteInventor(const << 
567   G4cout << "Produce " << aFile << "..." << G4 << 
568                                                << 
569   SbBool genAlternateRep = TRUE;               << 
570   //SbBool binary = FALSE;                     << 
571   SbBool binary = TRUE;                        << 
572   SoAlternateRepAction alternateRepAction;     << 
573   if(genAlternateRep==TRUE) {                  << 
574     alternateRepAction.setGenerate(TRUE); //Cl << 
575     alternateRepAction.apply(fSoSelection);    << 
576   }                                            << 
577                                                << 
578   SoWriteAction writeAction;                   << 
579   writeAction.getOutput()->openFile(aFile.c_st << 
580   writeAction.getOutput()->setBinary(binary);  << 
581   writeAction.apply(fSoSelection);             << 
582   writeAction.getOutput()->closeFile();        << 
583                                                << 
584   if(genAlternateRep==TRUE) {                  << 
585     alternateRepAction.setGenerate(FALSE); //C << 
586     alternateRepAction.apply(fSoSelection);    << 
587   }                                               221   }
588                                                << 222   if(fWindow!=NULL) delete fWindow;
589                                                << 223   if(fSelection!=NULL) fSelection->unref();
590                                                << 
591 }                                                 224 }
592                                                   225 
593 struct Counter {                               << 226 void G4OpenInventorViewer::ClearView () {
594  int fTriangles;                               << 
595  int fLineSegments;                            << 
596  int fPoints;                                  << 
597 };                                             << 
598                                                << 
599 static void CountTrianglesCB(                  << 
600  void* userData                                << 
601 ,SoCallbackAction*                             << 
602 ,const SoPrimitiveVertex*                      << 
603 ,const SoPrimitiveVertex*,                     << 
604 const SoPrimitiveVertex*)                      << 
605 {                                              << 
606   Counter* counter = (Counter*)userData;       << 
607   counter->fTriangles++;                       << 
608 }                                              << 
609                                                << 
610 static void CountLineSegmentsCB(               << 
611  void* userData                                << 
612 ,SoCallbackAction*                             << 
613 ,const SoPrimitiveVertex*                      << 
614 ,const SoPrimitiveVertex*)                     << 
615 {                                              << 
616   Counter* counter = (Counter*)userData;       << 
617   counter->fLineSegments++;                    << 
618 }                                                 227 }
619                                                   228 
620 static void CountPointsCB(                     << 229 void G4OpenInventorViewer::SetView () {
621  void* userData                                << 
622 ,SoCallbackAction*                             << 
623 ,const SoPrimitiveVertex*)                     << 
624 {                                              << 
625   Counter* counter = (Counter*)userData;       << 
626   counter->fPoints++;                          << 
627 }                                                 230 }
628                                                   231 
629 void G4OpenInventorViewer::SceneGraphStatistic << 232 void G4OpenInventorViewer::DrawView () {
630   Counter counter;                             << 233   G4cout << "debug Iv::DrawViewer " <<G4endl;
631   counter.fTriangles = 0;                      << 234   KernelVisitDecision ();
632   counter.fLineSegments = 0;                   << 235   ProcessView         ();
633   counter.fPoints = 0;                         << 236   FinishView          ();
634                                                << 
635   SoCallbackAction callbackAction;             << 
636   callbackAction.addTriangleCallback           << 
637     (SoShape::getClassTypeId(),CountTrianglesC << 
638   callbackAction.addLineSegmentCallback        << 
639     (SoShape::getClassTypeId(),CountLineSegmen << 
640   callbackAction.addPointCallback              << 
641     (SoShape::getClassTypeId(),CountPointsCB,( << 
642   callbackAction.apply(fSoSelection);          << 
643                                                << 
644   SoCounterAction counterAction;               << 
645   counterAction.apply(fSoSelection);           << 
646   int nodes = counterAction.getCount();        << 
647                                                << 
648   counterAction.setLookFor(SoCounterAction::TY << 
649   counterAction.setType(SoShape::getClassTypeI << 
650   counterAction.apply(fSoSelection);           << 
651   int shapes = counterAction.getCount();       << 
652                                                << 
653   G4cout << "Number of triangles : " << counte << 
654   G4cout << "Number of line segments : " << co << 
655   G4cout << "Number of points : " << counter.f << 
656   G4cout << "Number of nodes : " << nodes << G << 
657   G4cout << "Number of shapes : " << shapes << << 
658 }                                                 237 }
659                                                   238 
660 void G4OpenInventorViewer::EraseDetector() {   << 239 void G4OpenInventorViewer::ShowView () {
661   fG4OpenInventorSceneHandler.fDetectorRoot->r << 240   fInteractorManager -> SecondaryLoop ();
662 }                                              << 
663 void G4OpenInventorViewer::EraseEvent() {      << 
664   fG4OpenInventorSceneHandler.fTransientRoot-> << 
665 }                                                 241 }
666                                                   242 
667 void G4OpenInventorViewer::SetPreviewAndFull() << 243 #endif
668   fG4OpenInventorSceneHandler.fPreviewAndFull  << 
669                                                   244 
670   NeedKernelVisit();                           << 
671   DrawDetector();                              << 
672 }                                              << 
673                                                   245 
674 void G4OpenInventorViewer::SetPreview() {      << 
675   fG4OpenInventorSceneHandler.fPreviewAndFull  << 
676                                                   246 
677   NeedKernelVisit();                           << 
678   DrawDetector();                              << 
679 }                                              << 
680                                                   247 
681 // When ViewParameter <-> SoCamera mapping rea << 
682 // uncomment the below                         << 
683 //#define USE_SET_VIEW                         << 
684                                                << 
685 void G4OpenInventorViewer::SetSolid() {        << 
686   G4ViewParameters vp = GetViewParameters();   << 
687   G4ViewParameters::DrawingStyle existingStyle << 
688   //From G4VisCommandsViewerSet : /vis/viewer/ << 
689   switch (existingStyle) {                     << 
690   case G4ViewParameters::wireframe:            << 
691     vp.SetDrawingStyle(G4ViewParameters::hsr); << 
692     break;                                     << 
693   case G4ViewParameters::hlr:                  << 
694     vp.SetDrawingStyle(G4ViewParameters::hlhsr << 
695     break;                                     << 
696   case G4ViewParameters::hsr:                  << 
697     break;                                     << 
698   case G4ViewParameters::hlhsr:                << 
699     break;                                     << 
700   case G4ViewParameters::cloud:                << 
701     vp.SetDrawingStyle(G4ViewParameters::hsr); << 
702     break;                                     << 
703   }                                            << 
704   SetViewParameters(vp);                       << 
705   DrawDetector();                              << 
706 }                                              << 
707 void G4OpenInventorViewer::SetWireFrame() {    << 
708   G4ViewParameters vp = GetViewParameters();   << 
709   G4ViewParameters::DrawingStyle existingStyle << 
710   switch (existingStyle) {                     << 
711   case G4ViewParameters::wireframe:            << 
712     break;                                     << 
713   case G4ViewParameters::hlr:                  << 
714     break;                                     << 
715   case G4ViewParameters::hsr:                  << 
716     vp.SetDrawingStyle(G4ViewParameters::wiref << 
717     break;                                     << 
718   case G4ViewParameters::hlhsr:                << 
719     vp.SetDrawingStyle(G4ViewParameters::hlr); << 
720     break;                                     << 
721   case G4ViewParameters::cloud:                << 
722     vp.SetDrawingStyle(G4ViewParameters::wiref << 
723     break;                                     << 
724   }                                            << 
725   SetViewParameters(vp);                       << 
726   DrawDetector();                              << 
727 }                                              << 
728                                                   248 
729                                                   249 
730 void G4OpenInventorViewer::SetReducedWireFrame << 
731   G4ViewParameters vp = GetViewParameters();   << 
732                                                   250 
733   // Set the wire frame kind :                 << 
734   vp.SetAuxEdgeVisible(!aValue);               << 
735                                                   251 
736   // Set wire frame :                          << 
737   G4ViewParameters::DrawingStyle existingStyle << 
738   switch (existingStyle) {                     << 
739   case G4ViewParameters::wireframe:            << 
740     break;                                     << 
741   case G4ViewParameters::hlr:                  << 
742     break;                                     << 
743   case G4ViewParameters::hsr:                  << 
744     vp.SetDrawingStyle(G4ViewParameters::wiref << 
745     break;                                     << 
746   case G4ViewParameters::hlhsr:                << 
747     vp.SetDrawingStyle(G4ViewParameters::hlr); << 
748     break;                                     << 
749   case G4ViewParameters::cloud:                << 
750     vp.SetDrawingStyle(G4ViewParameters::wiref << 
751     break;                                     << 
752   }                                            << 
753   SetViewParameters(vp);                       << 
754   NeedKernelVisit(); // Just in case it was al << 
755   DrawDetector();                              << 
756 }                                              << 
757                                                << 
758 void G4OpenInventorViewer::UpdateScene() {     << 
759   /* Replace this... - JA                      << 
760   fG4OpenInventorSceneHandler.ClearStore();    << 
761   ClearView();                                 << 
762   if (!fNeedKernelVisit) KernelVisitDecision() << 
763   ProcessView();                               << 
764   ShowView();                                  << 
765   */                                           << 
766   // ...by this - JA                           << 
767   NeedKernelVisit();                           << 
768   DrawView();                                  << 
769 }                                              << 
770 G4String G4OpenInventorViewer::Help(const G4St << 
771   if(aTopic=="controls") {                     << 
772     return G4String("\                         << 
773 Controls on an Inventor examiner viewer are :\ << 
774 - in picking mode (cursor is the upper left ar << 
775   Ctrl + pick a volume : see daughters.\n\     << 
776   Shift + pick a volume : see mother.\n\       << 
777 - in viewing mode (cursor is the hand)\n\      << 
778   Left-button + pointer move : rotate.\n\      << 
779   Ctrl+Left-button + pointer move : pan.\n\    << 
780   Ctrl+Shift+Left-button + pointer move : scal << 
781   Middle-button + pointer move : pan.\n\       << 
782   Right-button : popup menu.\n");              << 
783   } else {                                     << 
784     return "";                                 << 
785   }                                            << 
786 }                                              << 
787                                                   252