Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenInventor/src/G4OpenInventorSceneHandler.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/G4OpenInventorSceneHandler.cc (Version 11.3.0) and /visualization/OpenInventor/src/G4OpenInventorSceneHandler.cc (Version 8.3.p2)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 //                                                 26 //
                                                   >>  27 // $Id: G4OpenInventorSceneHandler.cc,v 1.51 2007/01/05 16:52:47 allison Exp $
                                                   >>  28 // GEANT4 tag $Name: geant4-08-03-patch-02 $
 27 //                                                 29 //
 28 //                                                 30 // 
 29 // Jeff Kallenbach 01 Aug 1996                     31 // Jeff Kallenbach 01 Aug 1996
 30 // OpenInventor stored scene - creates OpenInv     32 // OpenInventor stored scene - creates OpenInventor display lists.
                                                   >>  33 #ifdef G4VIS_BUILD_OI_DRIVER
 31                                                    34 
 32 // this :                                          35 // this :
 33 #include "G4OpenInventorSceneHandler.hh"           36 #include "G4OpenInventorSceneHandler.hh"
 34                                                    37 
 35 #include <Inventor/SoPath.h>                       38 #include <Inventor/SoPath.h>
 36 #include <Inventor/SoNodeKitPath.h>                39 #include <Inventor/SoNodeKitPath.h>
 37 #include <Inventor/nodes/SoCoordinate3.h>          40 #include <Inventor/nodes/SoCoordinate3.h>
 38 #include <Inventor/nodes/SoCoordinate4.h>          41 #include <Inventor/nodes/SoCoordinate4.h>
 39 #include <Inventor/nodes/SoSeparator.h>            42 #include <Inventor/nodes/SoSeparator.h>
 40 #include <Inventor/nodes/SoDrawStyle.h>            43 #include <Inventor/nodes/SoDrawStyle.h>
 41 #include <Inventor/nodes/SoLightModel.h>           44 #include <Inventor/nodes/SoLightModel.h>
 42 #include <Inventor/nodes/SoMaterial.h>             45 #include <Inventor/nodes/SoMaterial.h>
 43 #include <Inventor/nodes/SoLineSet.h>              46 #include <Inventor/nodes/SoLineSet.h>
 44 #include <Inventor/nodes/SoCube.h>                 47 #include <Inventor/nodes/SoCube.h>
                                                   >>  48 #include <Inventor/nodes/SoSphere.h>
 45 #include <Inventor/nodes/SoFont.h>                 49 #include <Inventor/nodes/SoFont.h>
 46 #include <Inventor/nodes/SoText2.h>                50 #include <Inventor/nodes/SoText2.h>
 47 #include <Inventor/nodes/SoFaceSet.h>              51 #include <Inventor/nodes/SoFaceSet.h>
 48 #include <Inventor/nodes/SoNormal.h>               52 #include <Inventor/nodes/SoNormal.h>
 49 #include <Inventor/nodes/SoNormalBinding.h>        53 #include <Inventor/nodes/SoNormalBinding.h>
 50 #include <Inventor/nodes/SoComplexity.h>           54 #include <Inventor/nodes/SoComplexity.h>
                                                   >>  55 #include <Inventor/nodes/SoNurbsSurface.h>
 51 #include <Inventor/nodes/SoTranslation.h>          56 #include <Inventor/nodes/SoTranslation.h>
 52 #include <Inventor/nodes/SoTransform.h>            57 #include <Inventor/nodes/SoTransform.h>
 53 #include <Inventor/nodes/SoResetTransform.h>       58 #include <Inventor/nodes/SoResetTransform.h>
 54 #include <Inventor/nodes/SoMatrixTransform.h>      59 #include <Inventor/nodes/SoMatrixTransform.h>
 55                                                    60 
 56 #define USE_SOPOLYHEDRON                           61 #define USE_SOPOLYHEDRON
 57                                                    62 
 58 #ifndef USE_SOPOLYHEDRON                           63 #ifndef USE_SOPOLYHEDRON
 59 #include "HEPVis/nodes/SoBox.h"                    64 #include "HEPVis/nodes/SoBox.h"
 60 #include "HEPVis/nodes/SoTubs.h"                   65 #include "HEPVis/nodes/SoTubs.h"
 61 #include "HEPVis/nodes/SoCons.h"                   66 #include "HEPVis/nodes/SoCons.h"
 62 #include "HEPVis/nodes/SoTrd.h"                    67 #include "HEPVis/nodes/SoTrd.h"
 63 #include "HEPVis/nodes/SoTrap.h"                   68 #include "HEPVis/nodes/SoTrap.h"
 64 #endif                                             69 #endif
 65 #include "HEPVis/nodes/SoMarkerSet.h"              70 #include "HEPVis/nodes/SoMarkerSet.h"
 66                                                <<  71 typedef HEPVis_SoMarkerSet SoMarkerSet;
 67 using SoMarkerSet = HEPVis_SoMarkerSet;        << 
 68                                                << 
 69 #include "HEPVis/nodekits/SoDetectorTreeKit.h"     72 #include "HEPVis/nodekits/SoDetectorTreeKit.h"
 70 #include "HEPVis/misc/SoStyleCache.h"              73 #include "HEPVis/misc/SoStyleCache.h"
 71                                                    74 
 72 #include "SoG4Polyhedron.h"                        75 #include "SoG4Polyhedron.h"
 73 #include "SoG4LineSet.h"                           76 #include "SoG4LineSet.h"
 74 #include "SoG4MarkerSet.h"                         77 #include "SoG4MarkerSet.h"
 75                                                    78 
 76 #include "G4Scene.hh"                              79 #include "G4Scene.hh"
                                                   >>  80 #include "G4NURBS.hh"
 77 #include "G4OpenInventor.hh"                       81 #include "G4OpenInventor.hh"
 78 #include "G4OpenInventorTransform3D.hh"            82 #include "G4OpenInventorTransform3D.hh"
 79 #include "G4ThreeVector.hh"                        83 #include "G4ThreeVector.hh"
 80 #include "G4Point3D.hh"                            84 #include "G4Point3D.hh"
 81 #include "G4Normal3D.hh"                           85 #include "G4Normal3D.hh"
 82 #include "G4Transform3D.hh"                        86 #include "G4Transform3D.hh"
 83 #include "G4Polyline.hh"                           87 #include "G4Polyline.hh"
 84 #include "G4Text.hh"                               88 #include "G4Text.hh"
 85 #include "G4Circle.hh"                             89 #include "G4Circle.hh"
 86 #include "G4Square.hh"                             90 #include "G4Square.hh"
 87 #include "G4Polymarker.hh"                         91 #include "G4Polymarker.hh"
 88 #include "G4Polyhedron.hh"                         92 #include "G4Polyhedron.hh"
 89 #include "G4Box.hh"                                93 #include "G4Box.hh"
 90 #include "G4Tubs.hh"                               94 #include "G4Tubs.hh"
 91 #include "G4Cons.hh"                               95 #include "G4Cons.hh"
 92 #include "G4Trap.hh"                               96 #include "G4Trap.hh"
 93 #include "G4Trd.hh"                                97 #include "G4Trd.hh"
 94 #include "G4ModelingParameters.hh"                 98 #include "G4ModelingParameters.hh"
 95 #include "G4VPhysicalVolume.hh"                    99 #include "G4VPhysicalVolume.hh"
 96 #include "G4LogicalVolume.hh"                     100 #include "G4LogicalVolume.hh"
 97 #include "G4Material.hh"                          101 #include "G4Material.hh"
 98 #include "G4VisAttributes.hh"                     102 #include "G4VisAttributes.hh"
 99                                                   103 
100 #define G4warn G4cout                          << 
101                                                << 
102 G4int G4OpenInventorSceneHandler::fSceneIdCoun    104 G4int G4OpenInventorSceneHandler::fSceneIdCount = 0;
103                                                   105 
104 G4OpenInventorSceneHandler::G4OpenInventorScen    106 G4OpenInventorSceneHandler::G4OpenInventorSceneHandler (G4OpenInventor& system,
105                                           cons    107                                           const G4String& name)
106 :G4VSceneHandler (system, fSceneIdCount++, nam    108 :G4VSceneHandler (system, fSceneIdCount++, name)
107 ,fRoot(0)                                         109 ,fRoot(0)
108 ,fDetectorRoot(0)                                 110 ,fDetectorRoot(0)
109 ,fTransientRoot(0)                                111 ,fTransientRoot(0)
110 ,fCurrentSeparator(0)                             112 ,fCurrentSeparator(0)
111 ,fModelingSolid(false)                            113 ,fModelingSolid(false)
112 ,fReducedWireFrame(true)                          114 ,fReducedWireFrame(true)
113 ,fStyleCache(0)                                   115 ,fStyleCache(0)
114 ,fPreviewAndFull(true)                         << 116 ,fPreviewAndFull(false)
115 {                                                 117 {
116   fStyleCache = new SoStyleCache;                 118   fStyleCache = new SoStyleCache;
117   fStyleCache->ref();                             119   fStyleCache->ref();
118                                                   120 
119   fRoot = new SoSeparator;                        121   fRoot = new SoSeparator;
120   fRoot->ref();                                   122   fRoot->ref();
121   fRoot->setName("Root");                         123   fRoot->setName("Root");
122                                                   124   
123   fDetectorRoot = new SoSeparator;                125   fDetectorRoot = new SoSeparator;
124   fDetectorRoot->setName("StaticRoot");           126   fDetectorRoot->setName("StaticRoot");
125   fRoot->addChild(fDetectorRoot);                 127   fRoot->addChild(fDetectorRoot);
126                                                   128   
127   fTransientRoot = new SoSeparator;               129   fTransientRoot = new SoSeparator;
128   fTransientRoot->setName("TransientRoot");       130   fTransientRoot->setName("TransientRoot");
129   fRoot->addChild(fTransientRoot);                131   fRoot->addChild(fTransientRoot);
130                                                   132   
131   fCurrentSeparator = fTransientRoot;             133   fCurrentSeparator = fTransientRoot;
132 }                                                 134 }
133                                                   135 
134 G4OpenInventorSceneHandler::~G4OpenInventorSce    136 G4OpenInventorSceneHandler::~G4OpenInventorSceneHandler ()
135 {                                                 137 {
136   fRoot->unref();                                 138   fRoot->unref();
137   fStyleCache->unref();                           139   fStyleCache->unref();
138 }                                                 140 }
139                                                   141 
140 void G4OpenInventorSceneHandler::ClearStore () << 142 void G4OpenInventorSceneHandler::ClearStore () {
141 {                                              << 143   G4VSceneHandler::ClearStore();
                                                   >> 144 
142   fDetectorRoot->removeAllChildren();             145   fDetectorRoot->removeAllChildren();
143   fSeparatorMap.clear();                          146   fSeparatorMap.clear();
144                                                   147 
145   fTransientRoot->removeAllChildren();            148   fTransientRoot->removeAllChildren();
146 }                                                 149 }
147                                                   150 
148 void G4OpenInventorSceneHandler::ClearTransien << 151 void G4OpenInventorSceneHandler::ClearTransientStore () {
149 {                                              << 152   G4VSceneHandler::ClearTransientStore ();
                                                   >> 153 
150   fTransientRoot->removeAllChildren();            154   fTransientRoot->removeAllChildren();
151 }                                                 155 }
152                                                   156 
153 //                                                157 //
154 // Generates prerequisites for solids             158 // Generates prerequisites for solids
155 //                                                159 //  
156 void G4OpenInventorSceneHandler::PreAddSolid      160 void G4OpenInventorSceneHandler::PreAddSolid
157 (const G4Transform3D& objectTransformation,       161 (const G4Transform3D& objectTransformation,
158  const G4VisAttributes& visAttribs)               162  const G4VisAttributes& visAttribs)
159 {                                                 163 {
160   G4VSceneHandler::PreAddSolid (objectTransfor    164   G4VSceneHandler::PreAddSolid (objectTransformation, visAttribs);
161   // Stores arguments away for future use, e.g    165   // Stores arguments away for future use, e.g., AddPrimitives.
162                                                   166 
163   GeneratePrerequisites();                        167   GeneratePrerequisites();
164 }                                                 168 }
165                                                   169 
166 //                                                170 //
167 // Generates prerequisites for primitives         171 // Generates prerequisites for primitives
168 //                                                172 //  
169 void G4OpenInventorSceneHandler::BeginPrimitiv    173 void G4OpenInventorSceneHandler::BeginPrimitives
170 (const G4Transform3D& objectTransformation) {     174 (const G4Transform3D& objectTransformation) {
171                                                   175 
172   G4VSceneHandler::BeginPrimitives (objectTran    176   G4VSceneHandler::BeginPrimitives (objectTransformation);
173                                                   177 
174   // If thread of control has already passed t    178   // If thread of control has already passed through PreAddSolid,
175   // avoid opening a graphical data base compo    179   // avoid opening a graphical data base component again.
176   if (!fProcessingSolid) {                        180   if (!fProcessingSolid) {
177     GeneratePrerequisites();                      181     GeneratePrerequisites();
178   }                                               182   }
179 }                                                 183 }
180                                                   184 
181 //                                                185 //
182 // Method for handling G4Polyline objects (fro    186 // Method for handling G4Polyline objects (from tracking).
183 //                                                187 //
184 void G4OpenInventorSceneHandler::AddPrimitive  << 188 void G4OpenInventorSceneHandler::AddPrimitive (const G4Polyline& line) {
185 {                                              << 189   G4int nPoints = line.size();
186   if (fProcessing2D) {                         << 
187     static G4bool warned = false;              << 
188     if (!warned) {                             << 
189       warned = true;                           << 
190       G4Exception                              << 
191   ("G4OpenInventorSceneHandler::AddPrimitive ( << 
192    "OpenInventor-0001", JustWarning,           << 
193    "2D polylines not implemented.  Ignored."); << 
194     }                                          << 
195     return;                                    << 
196   }                                            << 
197                                                << 
198   // Get vis attributes - pick up defaults if  << 
199   const G4VisAttributes* pVA =                 << 
200   fpViewer -> GetApplicableVisAttributes (line << 
201                                                << 
202   AddProperties(pVA);  // Colour, etc.         << 
203   AddTransform();      // Transformation       << 
204                                                << 
205   G4int nPoints = (G4int)line.size();          << 
206   SbVec3f* pCoords = new SbVec3f[nPoints];        190   SbVec3f* pCoords = new SbVec3f[nPoints];
207                                                   191 
208   for (G4int iPoint = 0; iPoint < nPoints ; ++ << 192   for (G4int iPoint = 0; iPoint < nPoints ; iPoint++) {
209     pCoords[iPoint].setValue((G4float)line[iPo << 193     pCoords[iPoint].setValue((float)line[iPoint].x(),
210                              (G4float)line[iPo << 194                              (float)line[iPoint].y(),
211                              (G4float)line[iPo << 195                              (float)line[iPoint].z());
212   }                                               196   }
213                                                   197 
                                                   >> 198   // Don't understand why I have to do this again (done in
                                                   >> 199   // GeneratePrerequisites) - JA.
                                                   >> 200   //
                                                   >> 201   // Color
                                                   >> 202   //
                                                   >> 203   const G4Colour& c = GetColour(line);
                                                   >> 204   SoMaterial* material = 
                                                   >> 205     fStyleCache->getMaterial((float)c.GetRed(),
                                                   >> 206                              (float)c.GetGreen(),
                                                   >> 207                              (float)c.GetBlue(),
                                                   >> 208                              (float)(1-c.GetAlpha()));
                                                   >> 209   fCurrentSeparator->addChild(material);
                                                   >> 210   
214   //                                              211   //
215   // Point Set                                    212   // Point Set
216   //                                              213   // 
217   SoCoordinate3 *polyCoords = new SoCoordinate    214   SoCoordinate3 *polyCoords = new SoCoordinate3;
218   polyCoords->point.setValues(0,nPoints,pCoord    215   polyCoords->point.setValues(0,nPoints,pCoords);
219   fCurrentSeparator->addChild(polyCoords);        216   fCurrentSeparator->addChild(polyCoords);
220                                                   217   
221   //                                              218   //
222   // Wireframe                                    219   // Wireframe
223   //                                              220   // 
224   SoDrawStyle* drawStyle = fStyleCache->getLin    221   SoDrawStyle* drawStyle = fStyleCache->getLineStyle();
225   fCurrentSeparator->addChild(drawStyle);         222   fCurrentSeparator->addChild(drawStyle);
226                                                   223 
227   SoG4LineSet *pLine = new SoG4LineSet;           224   SoG4LineSet *pLine = new SoG4LineSet;
228                                                   225 
229   // Loads G4Atts for picking...                  226   // Loads G4Atts for picking...
230   if (fpViewer->GetViewParameters().IsPicking( << 227   LoadAtts(line, pLine);
231                                                   228 
232 #ifdef INVENTOR2_0                                229 #ifdef INVENTOR2_0
233   pLine->numVertices.setValues(0,1,(const G4lo << 230   pLine->numVertices.setValues(0,1,(const long *)&nPoints);
234 #else                                             231 #else 
235   pLine->numVertices.setValues(0,1,&nPoints);     232   pLine->numVertices.setValues(0,1,&nPoints);
236 #endif                                            233 #endif
237                                                   234 
238   fCurrentSeparator->addChild(pLine);             235   fCurrentSeparator->addChild(pLine);
239                                                   236 
240   delete [] pCoords;                              237   delete [] pCoords;
241 }                                                 238 }
242                                                   239 
243 void G4OpenInventorSceneHandler::AddPrimitive  << 240 void G4OpenInventorSceneHandler::AddPrimitive (const G4Polymarker& polymarker) {
244 {                                              << 241   G4int pointn = polymarker.size();
245   if (fProcessing2D) {                         << 
246     static G4bool warned = false;              << 
247     if (!warned) {                             << 
248       warned = true;                           << 
249       G4Exception                              << 
250   ("G4OpenInventorSceneHandler::AddPrimitive ( << 
251    "OpenInventor-0002", JustWarning,           << 
252    "2D polymarkers not implemented.  Ignored." << 
253     }                                          << 
254     return;                                    << 
255   }                                            << 
256                                                << 
257   // Get vis attributes - pick up defaults if  << 
258   const G4VisAttributes* pVA =                 << 
259   fpViewer -> GetApplicableVisAttributes (poly << 
260                                                << 
261   AddProperties(pVA);  // Colour, etc.         << 
262   AddTransform();      // Transformation       << 
263                                                << 
264   G4int pointn = (G4int)polymarker.size();     << 
265   if(pointn<=0) return;                           242   if(pointn<=0) return;
266                                                   243 
267   SbVec3f* points = new SbVec3f[pointn];          244   SbVec3f* points = new SbVec3f[pointn];
268   for (G4int iPoint = 0; iPoint < pointn ; ++i << 245   for (G4int iPoint = 0; iPoint < pointn ; iPoint++) {
269     points[iPoint].setValue((G4float)polymarke << 246     points[iPoint].setValue((float)polymarker[iPoint].x(),
270                             (G4float)polymarke << 247                             (float)polymarker[iPoint].y(),
271                             (G4float)polymarke << 248                             (float)polymarker[iPoint].z());
272   }                                               249   }
273                                                   250 
                                                   >> 251   // Don't understand why I have to do this again (done in
                                                   >> 252   // GeneratePrerequisites) - JA.
                                                   >> 253   const G4Colour& c = GetColour(polymarker);
                                                   >> 254   SoMaterial* material = 
                                                   >> 255     fStyleCache->getMaterial((float)c.GetRed(),
                                                   >> 256                              (float)c.GetGreen(),
                                                   >> 257                              (float)c.GetBlue(),
                                                   >> 258                              (float)(1-c.GetAlpha()));
                                                   >> 259   fCurrentSeparator->addChild(material);
                                                   >> 260   
274   SoCoordinate3* coordinate3 = new SoCoordinat    261   SoCoordinate3* coordinate3 = new SoCoordinate3;
275   coordinate3->point.setValues(0,pointn,points    262   coordinate3->point.setValues(0,pointn,points);
276   fCurrentSeparator->addChild(coordinate3);       263   fCurrentSeparator->addChild(coordinate3);
277                                                   264 
278   MarkerSizeType sizeType;                        265   MarkerSizeType sizeType;
279   G4double screenSize = GetMarkerSize (polymar    266   G4double screenSize = GetMarkerSize (polymarker, sizeType);
280   switch (sizeType) {                             267   switch (sizeType) {
281   default:                                        268   default:
282   case screen:                                    269   case screen:
283     // Draw in screen coordinates.  OK.           270     // Draw in screen coordinates.  OK.
284     break;                                        271     break;
285   case world:                                     272   case world:
286     // Draw in world coordinates.   Not implem    273     // Draw in world coordinates.   Not implemented.  Use screenSize = 10.
287     screenSize = 10.;                             274     screenSize = 10.;
288     break;                                        275     break;
289   }                                               276   }
290                                                   277   
291   SoG4MarkerSet* markerSet = new SoG4MarkerSet    278   SoG4MarkerSet* markerSet = new SoG4MarkerSet;
292   markerSet->numPoints = pointn;                  279   markerSet->numPoints = pointn;
293                                                   280 
294   // Loads G4Atts for picking...                  281   // Loads G4Atts for picking...
295   if (fpViewer->GetViewParameters().IsPicking( << 282   LoadAtts(polymarker, markerSet);
296     LoadAtts(polymarker, markerSet);           << 
297                                                   283 
298   G4VMarker::FillStyle style = polymarker.GetF    284   G4VMarker::FillStyle style = polymarker.GetFillStyle();
299   switch (polymarker.GetMarkerType()) {           285   switch (polymarker.GetMarkerType()) {
300   default:                                        286   default:
301     // Are available 5_5, 7_7 and 9_9             287     // Are available 5_5, 7_7 and 9_9
302   case G4Polymarker::dots:                        288   case G4Polymarker::dots:
303     if (screenSize <= 5.) {                       289     if (screenSize <= 5.) {
304       markerSet->markerIndex = SoMarkerSet::CI    290       markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_5_5;
305     } else if (screenSize <= 7.) {                291     } else if (screenSize <= 7.) {
306       markerSet->markerIndex = SoMarkerSet::CI    292       markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_7_7;
307     } else {                                      293     } else {
308       markerSet->markerIndex = SoMarkerSet::CI    294       markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_9_9;
309     }                                             295     }
310     break;                                        296     break;
311   case G4Polymarker::circles:                     297   case G4Polymarker::circles:
312     if (screenSize <= 5.) {                       298     if (screenSize <= 5.) {
313       if (style == G4VMarker::filled) {           299       if (style == G4VMarker::filled) {
314   markerSet->markerIndex = SoMarkerSet::CIRCLE    300   markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_5_5;
315       } else {                                    301       } else {
316   markerSet->markerIndex = SoMarkerSet::CIRCLE    302   markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_5_5;
317       }                                           303       }
318     } else if (screenSize <= 7.) {                304     } else if (screenSize <= 7.) {
319       if (style == G4VMarker::filled) {           305       if (style == G4VMarker::filled) {
320   markerSet->markerIndex = SoMarkerSet::CIRCLE    306   markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_7_7;
321       } else {                                    307       } else {
322   markerSet->markerIndex = SoMarkerSet::CIRCLE    308   markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_7_7;
323       }                                           309       }
324     } else {                                      310     } else {
325       if (style == G4VMarker::filled) {           311       if (style == G4VMarker::filled) {
326   markerSet->markerIndex = SoMarkerSet::CIRCLE    312   markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_9_9;
327       } else {                                    313       } else {
328   markerSet->markerIndex = SoMarkerSet::CIRCLE    314   markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_9_9;
329       }                                           315       }
330     }                                             316     }
331     break;                                        317     break;
332   case G4Polymarker::squares:                     318   case G4Polymarker::squares:
333     if (screenSize <= 5.) {                       319     if (screenSize <= 5.) {
334       if (style == G4VMarker::filled) {           320       if (style == G4VMarker::filled) {
335   markerSet->markerIndex = SoMarkerSet::SQUARE    321   markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_5_5;
336       } else {                                    322       } else {
337   markerSet->markerIndex = SoMarkerSet::SQUARE    323   markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_5_5;
338       }                                           324       }
339     } else if (screenSize <= 7.) {                325     } else if (screenSize <= 7.) {
340       if (style == G4VMarker::filled) {           326       if (style == G4VMarker::filled) {
341   markerSet->markerIndex = SoMarkerSet::SQUARE    327   markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_7_7;
342       } else {                                    328       } else {
343   markerSet->markerIndex = SoMarkerSet::SQUARE    329   markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_7_7;
344       }                                           330       }
345     } else {                                      331     } else {
346       if (style == G4VMarker::filled) {           332       if (style == G4VMarker::filled) {
347   markerSet->markerIndex = SoMarkerSet::SQUARE    333   markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_9_9;
348       } else {                                    334       } else {
349   markerSet->markerIndex = SoMarkerSet::SQUARE    335   markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_9_9;
350       }                                           336       }
351     }                                             337     }
352   }                                               338   }
353   fCurrentSeparator->addChild(markerSet);         339   fCurrentSeparator->addChild(markerSet);
354                                                   340 
355   delete [] points;                               341   delete [] points;
356 }                                                 342 }
357                                                   343 
                                                   >> 344 // ********* NOTE ********* NOTE ********* NOTE ********* NOTE *********
                                                   >> 345 //
                                                   >> 346 //  This method (Text) has not been tested, as it is 
                                                   >> 347 //  innaccessible from the menu in the current configuration
                                                   >> 348 //
                                                   >> 349 //  Currently draws at the origin!  How do I get it to draw at
                                                   >> 350 //  text.GetPosition()?  JA
                                                   >> 351 //
                                                   >> 352 // ********* NOTE ********* NOTE ********* NOTE ********* NOTE *********
                                                   >> 353 //
358 // Method for handling G4Text objects             354 // Method for handling G4Text objects
359 //                                                355 //
360 void G4OpenInventorSceneHandler::AddPrimitive  << 356 void G4OpenInventorSceneHandler::AddPrimitive (const G4Text& text) {
361 {                                              << 
362   if (fProcessing2D) {                         << 
363     static G4bool warned = false;              << 
364     if (!warned) {                             << 
365       warned = true;                           << 
366       G4Exception                              << 
367   ("G4OpenInventorSceneHandler::AddPrimitive ( << 
368    "OpenInventor-0003", JustWarning,           << 
369    "2D text not implemented.  Ignored.");      << 
370     }                                          << 
371     return;                                    << 
372   }                                            << 
373                                                << 
374   AddProperties(text.GetVisAttributes());  //  << 
375   AddTransform(text.GetPosition());        //  << 
376                                                << 
377   //                                              357   //
378   // Color.  Note: text colour is worked out d    358   // Color.  Note: text colour is worked out differently.  This
379   // over-rides the colour added in AddPropert << 359   // over-rides the colour added in GeneratePrerequisites...
380   //                                              360   //
381   const G4Colour& c = GetTextColour (text);       361   const G4Colour& c = GetTextColour (text);
382   SoMaterial* material =                          362   SoMaterial* material = 
383     fStyleCache->getMaterial((G4float)c.GetRed << 363     fStyleCache->getMaterial((float)c.GetRed(),
384                              (G4float)c.GetGre << 364                              (float)c.GetGreen(),
385                              (G4float)c.GetBlu << 365                              (float)c.GetBlue(),
386                              (G4float)(1-c.Get << 366                              (float)(1-c.GetAlpha()));
387   fCurrentSeparator->addChild(material);          367   fCurrentSeparator->addChild(material);
388                                                   368 
389   MarkerSizeType sizeType;                        369   MarkerSizeType sizeType;
390   G4double size = GetMarkerSize (text, sizeTyp    370   G4double size = GetMarkerSize (text, sizeType);
391   switch (sizeType) {                             371   switch (sizeType) {
392   default:                                        372   default:
393   case screen:                                    373   case screen:
394     // Draw in screen coordinates.  OK.           374     // Draw in screen coordinates.  OK.
395     break;                                        375     break;
396   case world:                                     376   case world:
397     // Draw in world coordinates.   Not implem    377     // Draw in world coordinates.   Not implemented.  Use size = 20.
398     size = 20.;                                   378     size = 20.;
399     break;                                        379     break;
400   }                                               380   }
401                                                   381 
402   //                                              382   //
403   // Font                                         383   // Font
404   //                                              384   // 
405   SoFont *g4Font = new SoFont();                  385   SoFont *g4Font = new SoFont();
406   g4Font->size = size;                            386   g4Font->size = size;
407   fCurrentSeparator->addChild(g4Font);            387   fCurrentSeparator->addChild(g4Font);
408                                                   388 
409   //                                              389   //
410   // Text                                         390   // Text
411   //                                              391   // 
412   SoText2 *g4String = new SoText2();              392   SoText2 *g4String = new SoText2();
413   g4String->string.setValue(text.GetText());      393   g4String->string.setValue(text.GetText());
414   g4String->spacing = 2.0;                        394   g4String->spacing = 2.0;
415   switch (text.GetLayout()) {                     395   switch (text.GetLayout()) {
416   default:                                        396   default:
417   case G4Text::left:                              397   case G4Text::left:
418     g4String->justification = SoText2::LEFT; b    398     g4String->justification = SoText2::LEFT; break;
419   case G4Text::centre:                            399   case G4Text::centre:
420     g4String->justification = SoText2::CENTER;    400     g4String->justification = SoText2::CENTER; break;
421   case G4Text::right:                             401   case G4Text::right:
422     g4String->justification = SoText2::RIGHT;     402     g4String->justification = SoText2::RIGHT; break;
423   }                                               403   }
424   fCurrentSeparator->addChild(g4String);          404   fCurrentSeparator->addChild(g4String);
425 }                                                 405 }
426                                                   406 
427 //                                                407 //
428 // Method for handling G4Circle objects           408 // Method for handling G4Circle objects
429 //                                                409 //
430 void G4OpenInventorSceneHandler::AddPrimitive     410 void G4OpenInventorSceneHandler::AddPrimitive (const G4Circle& circle) {
431   AddCircleSquare(G4OICircle, circle);            411   AddCircleSquare(G4OICircle, circle);
432 }                                                 412 }
433                                                   413 
434 //                                                414 //
435 // Method for handling G4Square objects - defa    415 // Method for handling G4Square objects - defaults to wireframe
436 //                                                416 //
437 void G4OpenInventorSceneHandler::AddPrimitive     417 void G4OpenInventorSceneHandler::AddPrimitive (const G4Square& square) {
438   AddCircleSquare(G4OISquare, square);            418   AddCircleSquare(G4OISquare, square);
439 }                                                 419 }
440                                                   420 
441 void G4OpenInventorSceneHandler::AddCircleSqua    421 void G4OpenInventorSceneHandler::AddCircleSquare
442 (G4OIMarker markerType, const G4VMarker& marke << 422 (G4OIMarker markerType, const G4VMarker& marker) {
443 {                                              << 
444   if (fProcessing2D) {                         << 
445     static G4bool warned = false;              << 
446     if (!warned) {                             << 
447       warned = true;                           << 
448       G4Exception                              << 
449   ("G4OpenInventorSceneHandler::AddCircleSquar << 
450    "OpenInventor-0004", JustWarning,           << 
451    "2D circles and squares not implemented.  I << 
452     }                                          << 
453     return;                                    << 
454   }                                            << 
455                                                   423 
456   // Get vis attributes - pick up defaults if  << 424   // Don't understand why I have to do this again (done in
457   const G4VisAttributes* pVA =                 << 425   // GeneratePrerequisites) - JA.
458   fpViewer -> GetApplicableVisAttributes (mark << 426   //
459                                                << 427   // Color
460   AddProperties(pVA);  // Colour, etc.         << 428   //
461   AddTransform();      // Transformation       << 429   const G4Colour& c = GetColour(marker);
                                                   >> 430   SoMaterial* material = 
                                                   >> 431     fStyleCache->getMaterial((float)c.GetRed(),
                                                   >> 432                              (float)c.GetGreen(),
                                                   >> 433                              (float)c.GetBlue(),
                                                   >> 434                              (float)(1-c.GetAlpha()));
                                                   >> 435   fCurrentSeparator->addChild(material);
462                                                   436 
463   MarkerSizeType sizeType;                        437   MarkerSizeType sizeType;
464   G4double screenSize = GetMarkerSize (marker,    438   G4double screenSize = GetMarkerSize (marker, sizeType);
465   switch (sizeType) {                             439   switch (sizeType) {
466   default:                                        440   default:
467   case screen:                                    441   case screen:
468     // Draw in screen coordinates.  OK.           442     // Draw in screen coordinates.  OK.
469     break;                                        443     break;
470   case world:                                     444   case world:
471     // Draw in world coordinates.   Not implem    445     // Draw in world coordinates.   Not implemented.  Use size = 10.
472     screenSize = 10.;                             446     screenSize = 10.;
473     break;                                        447     break;
474   }                                               448   }
475                                                   449 
476   G4Point3D centre = marker.GetPosition();        450   G4Point3D centre = marker.GetPosition();
477                                                   451 
478   // Borrowed from AddPrimitive(G4Polymarker)     452   // Borrowed from AddPrimitive(G4Polymarker) - inefficient? JA
479   SbVec3f* points = new SbVec3f[1];               453   SbVec3f* points = new SbVec3f[1];
480   points[0].setValue((G4float)centre.x(),      << 454   points[0].setValue((float)centre.x(),
481          (G4float)centre.y(),                  << 455          (float)centre.y(),
482          (G4float)centre.z());                 << 456          (float)centre.z());
483   SoCoordinate3* coordinate3 = new SoCoordinat    457   SoCoordinate3* coordinate3 = new SoCoordinate3;
484   coordinate3->point.setValues(0,1,points);       458   coordinate3->point.setValues(0,1,points);
485   fCurrentSeparator->addChild(coordinate3);       459   fCurrentSeparator->addChild(coordinate3);
486                                                   460 
487   SoG4MarkerSet* markerSet = new SoG4MarkerSet    461   SoG4MarkerSet* markerSet = new SoG4MarkerSet;
488   markerSet->numPoints = 1;                       462   markerSet->numPoints = 1;
489                                                   463 
490   // Loads G4Atts for picking...                  464   // Loads G4Atts for picking...
491   if (fpViewer->GetViewParameters().IsPicking( << 465   LoadAtts(marker, markerSet);
492                                                   466 
493   G4VMarker::FillStyle style = marker.GetFillS    467   G4VMarker::FillStyle style = marker.GetFillStyle();
494   switch (markerType) {                           468   switch (markerType) {
495   case G4OICircle:                                469   case G4OICircle:
496     if (screenSize <= 5.) {                       470     if (screenSize <= 5.) {
497       if (style == G4VMarker::filled) {           471       if (style == G4VMarker::filled) {
498   markerSet->markerIndex = SoMarkerSet::CIRCLE    472   markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_5_5;
499       } else {                                    473       } else {
500   markerSet->markerIndex = SoMarkerSet::CIRCLE    474   markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_5_5;
501       }                                           475       }
502     } else if (screenSize <= 7.) {                476     } else if (screenSize <= 7.) {
503       if (style == G4VMarker::filled) {           477       if (style == G4VMarker::filled) {
504   markerSet->markerIndex = SoMarkerSet::CIRCLE    478   markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_7_7;
505       } else {                                    479       } else {
506   markerSet->markerIndex = SoMarkerSet::CIRCLE    480   markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_7_7;
507       }                                           481       }
508     } else {                                      482     } else {
509       if (style == G4VMarker::filled) {           483       if (style == G4VMarker::filled) {
510   markerSet->markerIndex = SoMarkerSet::CIRCLE    484   markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_9_9;
511       } else {                                    485       } else {
512   markerSet->markerIndex = SoMarkerSet::CIRCLE    486   markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_9_9;
513       }                                           487       }
514     }                                             488     }
515     break;                                        489     break;
516   case G4OISquare:                                490   case G4OISquare:
517     if (screenSize <= 5.) {                       491     if (screenSize <= 5.) {
518       if (style == G4VMarker::filled) {           492       if (style == G4VMarker::filled) {
519   markerSet->markerIndex = SoMarkerSet::SQUARE    493   markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_5_5;
520       } else {                                    494       } else {
521   markerSet->markerIndex = SoMarkerSet::SQUARE    495   markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_5_5;
522       }                                           496       }
523     } else if (screenSize <= 7.) {                497     } else if (screenSize <= 7.) {
524       if (style == G4VMarker::filled) {           498       if (style == G4VMarker::filled) {
525   markerSet->markerIndex = SoMarkerSet::SQUARE    499   markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_7_7;
526       } else {                                    500       } else {
527   markerSet->markerIndex = SoMarkerSet::SQUARE    501   markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_7_7;
528       }                                           502       }
529     } else {                                      503     } else {
530       if (style == G4VMarker::filled) {           504       if (style == G4VMarker::filled) {
531   markerSet->markerIndex = SoMarkerSet::SQUARE    505   markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_9_9;
532       } else {                                    506       } else {
533   markerSet->markerIndex = SoMarkerSet::SQUARE    507   markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_9_9;
534       }                                           508       }
535     }                                             509     }
536   break;                                          510   break;
537   }                                               511   }
538   fCurrentSeparator->addChild(markerSet);         512   fCurrentSeparator->addChild(markerSet);
539                                                   513 
540   delete [] points;                               514   delete [] points;
541 }                                                 515 }
542                                                   516 
543 //                                                517 //
544 // Method for handling G4Polyhedron objects fo    518 // Method for handling G4Polyhedron objects for drawing solids.
545 //                                                519 //
546 void G4OpenInventorSceneHandler::AddPrimitive  << 520 void G4OpenInventorSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron) {
547 {                                              << 
548   if (polyhedron.GetNoFacets() == 0) return;      521   if (polyhedron.GetNoFacets() == 0) return;
549                                                   522 
550   if (fProcessing2D) {                         << 
551     static G4bool warned = false;              << 
552     if (!warned) {                             << 
553       warned = true;                           << 
554       G4Exception                              << 
555   ("G4OpenInventorSceneHandler::AddPrimitive ( << 
556    "OpenInventor-0005", JustWarning,           << 
557    "2D polyhedra not implemented.  Ignored."); << 
558     }                                          << 
559     return;                                    << 
560   }                                            << 
561                                                << 
562   // Get vis attributes - pick up defaults if  << 
563   const G4VisAttributes* pVA =                 << 
564   fpViewer -> GetApplicableVisAttributes (poly << 
565                                                << 
566   AddProperties(pVA);  // Colour, etc.         << 
567   AddTransform();      // Transformation       << 
568                                                << 
569   SoG4Polyhedron* soPolyhedron = new SoG4Polyh    523   SoG4Polyhedron* soPolyhedron = new SoG4Polyhedron(polyhedron);
570                                                   524 
571   // Loads G4Atts for picking...                  525   // Loads G4Atts for picking...
572   if (fpViewer->GetViewParameters().IsPicking( << 526   LoadAtts(polyhedron, soPolyhedron);
573     LoadAtts(polyhedron, soPolyhedron);        << 
574                                                   527 
575   SbString name = "Non-geometry";                 528   SbString name = "Non-geometry";
576   G4PhysicalVolumeModel* pPVModel =               529   G4PhysicalVolumeModel* pPVModel =
577     dynamic_cast<G4PhysicalVolumeModel*>(fpMod    530     dynamic_cast<G4PhysicalVolumeModel*>(fpModel);
578   if (pPVModel) {                                 531   if (pPVModel) {
579     name = pPVModel->GetCurrentLV()->GetName()    532     name = pPVModel->GetCurrentLV()->GetName().c_str();
580   }                                               533   }
581   SbName sbName(name);                            534   SbName sbName(name);
582   soPolyhedron->setName(sbName);                  535   soPolyhedron->setName(sbName);
583   soPolyhedron->solid.setValue(fModelingSolid)    536   soPolyhedron->solid.setValue(fModelingSolid);
584   soPolyhedron->reducedWireFrame.setValue(fRed    537   soPolyhedron->reducedWireFrame.setValue(fReducedWireFrame?TRUE:FALSE);
585   fCurrentSeparator->addChild(soPolyhedron);      538   fCurrentSeparator->addChild(soPolyhedron);  
586 }                                                 539 }
587                                                   540 
588 void G4OpenInventorSceneHandler::AddCompound(c << 541 //
589   StandardSpecialMeshRendering(mesh);          << 542 // Method for handling G4NURBS objects for drawing solids.
                                                   >> 543 // Knots and Ctrl Pnts MUST be arrays of GLfloats.
                                                   >> 544 //
                                                   >> 545 void G4OpenInventorSceneHandler::AddPrimitive (const G4NURBS& nurb) {
                                                   >> 546 
                                                   >> 547   G4float *u_knot_array, *u_knot_array_ptr;
                                                   >> 548   u_knot_array = u_knot_array_ptr = new G4float [nurb.GetnbrKnots(G4NURBS::U)];
                                                   >> 549   G4NURBS::KnotsIterator u_iterator (nurb, G4NURBS::U);
                                                   >> 550   while (u_iterator.pick (u_knot_array_ptr++));
                                                   >> 551 
                                                   >> 552   G4float *v_knot_array, *v_knot_array_ptr;
                                                   >> 553   v_knot_array = v_knot_array_ptr = new G4float [nurb.GetnbrKnots(G4NURBS::V)];
                                                   >> 554   G4NURBS::KnotsIterator v_iterator (nurb, G4NURBS::V);
                                                   >> 555   while (v_iterator.pick (v_knot_array_ptr++));
                                                   >> 556 
                                                   >> 557   G4float *ctrl_pnt_array, *ctrl_pnt_array_ptr;
                                                   >> 558   ctrl_pnt_array = ctrl_pnt_array_ptr =
                                                   >> 559     new G4float [nurb.GettotalnbrCtrlPts () * G4NURBS::NofC*sizeof(G4float)];
                                                   >> 560   G4NURBS::CtrlPtsCoordsIterator c_p_iterator (nurb);
                                                   >> 561   while (c_p_iterator.pick (ctrl_pnt_array_ptr++));
                                                   >> 562   
                                                   >> 563   SoSeparator *surfSep = new SoSeparator();
                                                   >> 564 
                                                   >> 565   //
                                                   >> 566   // Color
                                                   >> 567   //  
                                                   >> 568   const G4Colour& c = GetColour(nurb);
                                                   >> 569   SoMaterial* material = 
                                                   >> 570     fStyleCache->getMaterial((float)c.GetRed(),
                                                   >> 571                              (float)c.GetGreen(),
                                                   >> 572                              (float)c.GetBlue(),
                                                   >> 573                              (float)(1-c.GetAlpha()));
                                                   >> 574   surfSep->addChild(material);
                                                   >> 575 
                                                   >> 576   //
                                                   >> 577   // Set up NURBS
                                                   >> 578   //
                                                   >> 579   SoComplexity *complexity = new SoComplexity;
                                                   >> 580   SoCoordinate4 *ctlPts = new SoCoordinate4;
                                                   >> 581   SoNurbsSurface *oi_nurb = new SoNurbsSurface;
                                                   >> 582   
                                                   >> 583   complexity->value = (float)0.6;
                                                   >> 584   G4int    nPoints = nurb.GettotalnbrCtrlPts ();
                                                   >> 585   SbVec4f* points  = new SbVec4f[nPoints];
                                                   >> 586   for (G4int iPoint = 0; iPoint < nPoints ; iPoint++) {
                                                   >> 587     points[iPoint].setValue(
                                                   >> 588                             ctrl_pnt_array[iPoint*4 + 0],
                                                   >> 589                             ctrl_pnt_array[iPoint*4 + 1],
                                                   >> 590                             ctrl_pnt_array[iPoint*4 + 2],
                                                   >> 591                             ctrl_pnt_array[iPoint*4 + 3]);
                                                   >> 592   }
                                                   >> 593   ctlPts->point.setValues (0,nPoints,points);
                                                   >> 594   oi_nurb->numUControlPoints = nurb.GetnbrCtrlPts(G4NURBS::U);
                                                   >> 595   oi_nurb->numVControlPoints = nurb.GetnbrCtrlPts(G4NURBS::V);
                                                   >> 596   oi_nurb->uKnotVector.setValues(0,nurb.GetnbrKnots(G4NURBS::U),u_knot_array);
                                                   >> 597   oi_nurb->vKnotVector.setValues(0,nurb.GetnbrKnots(G4NURBS::V),v_knot_array);
                                                   >> 598 
                                                   >> 599   surfSep->addChild(complexity);
                                                   >> 600   surfSep->addChild(ctlPts);
                                                   >> 601   surfSep->addChild(oi_nurb);
                                                   >> 602   
                                                   >> 603   fCurrentSeparator->addChild(surfSep);
                                                   >> 604 
                                                   >> 605   //
                                                   >> 606   // Clean-up
                                                   >> 607   //
                                                   >> 608   delete [] u_knot_array;
                                                   >> 609   delete [] v_knot_array;
                                                   >> 610   delete [] ctrl_pnt_array;
                                                   >> 611   delete [] points;
590 }                                                 612 }
591                                                   613 
592 void G4OpenInventorSceneHandler::GeneratePrere    614 void G4OpenInventorSceneHandler::GeneratePrerequisites()
593 {                                                 615 {
594   // Utility for PreAddSolid and BeginPrimitiv    616   // Utility for PreAddSolid and BeginPrimitives.
595                                                   617 
596   // This routines prepares for adding items t    618   // This routines prepares for adding items to the scene database.  We
597   // are expecting two kinds of solids: leaf p    619   // are expecting two kinds of solids: leaf parts and non-leaf parts.
598   // For non-leaf parts, we create a detector     620   // For non-leaf parts, we create a detector tree kit.  This has two
599   // separators.  The solid itself goes in the    621   // separators.  The solid itself goes in the preview separator, the
600   // full separator is forseen for daughters.     622   // full separator is forseen for daughters.  This separator is not
601   // only created--it is also put in a diction    623   // only created--it is also put in a dictionary for future use by
602   // the leaf part.                               624   // the leaf part.
603                                                   625 
604   // For leaf parts, we first locate the mothe    626   // For leaf parts, we first locate the mother volume and find its
605   // separator through the dictionary.            627   // separator through the dictionary.
606                                                   628 
607   // The private member fCurrentSeparator is s    629   // The private member fCurrentSeparator is set to the proper
608   // location on in the scene database so that    630   // location on in the scene database so that when the solid is
609   // actually added (in addthis), it is put in    631   // actually added (in addthis), it is put in the right place.
610                                                   632 
                                                   >> 633   // Use the applicable vis attributes...
                                                   >> 634   const G4VisAttributes* pApplicableVisAttribs =
                                                   >> 635     fpViewer->GetApplicableVisAttributes (fpVisAttribs);
                                                   >> 636 
                                                   >> 637   // First find the color attributes...
                                                   >> 638   const G4Colour& g4Col =  pApplicableVisAttribs->GetColour ();
                                                   >> 639   const double red = g4Col.GetRed ();
                                                   >> 640   const double green = g4Col.GetGreen ();
                                                   >> 641   const double blue = g4Col.GetBlue ();
                                                   >> 642   double transparency = 1 - g4Col.GetAlpha();
                                                   >> 643 
                                                   >> 644   // Drawing style...
                                                   >> 645   G4ViewParameters::DrawingStyle drawing_style =
                                                   >> 646     GetDrawingStyle(pApplicableVisAttribs);
                                                   >> 647   switch (drawing_style) {
                                                   >> 648   case (G4ViewParameters::wireframe):    
                                                   >> 649     fModelingSolid = false;
                                                   >> 650     break;
                                                   >> 651   case (G4ViewParameters::hlr):
                                                   >> 652   case (G4ViewParameters::hsr):
                                                   >> 653   case (G4ViewParameters::hlhsr):
                                                   >> 654     fModelingSolid = true;
                                                   >> 655     break;
                                                   >> 656   } 
                                                   >> 657 
                                                   >> 658   // Edge visibility...
                                                   >> 659   G4bool isAuxEdgeVisible = GetAuxEdgeVisible (pApplicableVisAttribs);
                                                   >> 660   fReducedWireFrame = !isAuxEdgeVisible;
                                                   >> 661 
611   G4PhysicalVolumeModel* pPVModel =               662   G4PhysicalVolumeModel* pPVModel =
612     dynamic_cast<G4PhysicalVolumeModel*>(fpMod    663     dynamic_cast<G4PhysicalVolumeModel*>(fpModel);
613                                                   664   
614   if (pPVModel) {                                 665   if (pPVModel) {
615                                                   666 
616     // This call comes from a G4PhysicalVolume    667     // This call comes from a G4PhysicalVolumeModel.  drawnPVPath is
617     // the path of the current drawn (non-cull    668     // the path of the current drawn (non-culled) volume in terms of
618     // drawn (non-culled) ancestors.  Each nod << 669     // drawn (non-culled) ancesters.  Each node is identified by a
619     // PVNodeID object, which is a physical vo    670     // PVNodeID object, which is a physical volume and copy number.  It
620     // is a vector of PVNodeIDs corresponding     671     // is a vector of PVNodeIDs corresponding to the geometry hierarchy
621     // actually selected, i.e., not culled.       672     // actually selected, i.e., not culled.
622     using PVNodeID = G4PhysicalVolumeModel::G4 << 673     typedef G4PhysicalVolumeModel::G4PhysicalVolumeNodeID PVNodeID;
623     using PVPath = std::vector<PVNodeID>;      << 674     typedef std::vector<PVNodeID> PVPath;
624     const PVPath& drawnPVPath = pPVModel->GetD    675     const PVPath& drawnPVPath = pPVModel->GetDrawnPVPath();
625     //G4int currentDepth = pPVModel->GetCurren    676     //G4int currentDepth = pPVModel->GetCurrentDepth();
626     G4VPhysicalVolume* pCurrentPV = pPVModel->    677     G4VPhysicalVolume* pCurrentPV = pPVModel->GetCurrentPV();
627     G4LogicalVolume* pCurrentLV = pPVModel->Ge    678     G4LogicalVolume* pCurrentLV = pPVModel->GetCurrentLV();
628     //G4Material* pCurrentMaterial = pPVModel-    679     //G4Material* pCurrentMaterial = pPVModel->GetCurrentMaterial();
629     // Note: pCurrentMaterial may be zero (par    680     // Note: pCurrentMaterial may be zero (parallel world).
630                                                   681 
631     // The simplest algorithm, used by the Ope    682     // The simplest algorithm, used by the Open Inventor Driver
632     // developers, is to rely on the fact the     683     // developers, is to rely on the fact the G4PhysicalVolumeModel
633     // traverses the geometry hierarchy in an     684     // traverses the geometry hierarchy in an orderly manner.  The last
634     // mother, if any, will be the node to whi    685     // mother, if any, will be the node to which the volume should be
635     // added.  So it is enough to keep a map o    686     // added.  So it is enough to keep a map of scene graph nodes keyed
636     // on the volume path ID.  Actually, it is    687     // on the volume path ID.  Actually, it is enough to use the logical
637     // volume as the key.  (An alternative wou    688     // volume as the key.  (An alternative would be to keep the PVNodeID
638     // in the tree and match the PVPath from t    689     // in the tree and match the PVPath from the root down.)
639                                                   690 
640     // Find mother.  ri points to mother, if a    691     // Find mother.  ri points to mother, if any...
641     PVPath::const_reverse_iterator ri;            692     PVPath::const_reverse_iterator ri;
642     G4LogicalVolume* MotherVolume = 0;            693     G4LogicalVolume* MotherVolume = 0;
643     ri = ++drawnPVPath.rbegin();                  694     ri = ++drawnPVPath.rbegin();
644     if (ri != drawnPVPath.rend()) {               695     if (ri != drawnPVPath.rend()) {
645       // This volume has a mother.                696       // This volume has a mother.
646       MotherVolume = ri->GetPhysicalVolume()->    697       MotherVolume = ri->GetPhysicalVolume()->GetLogicalVolume();
647     }                                             698     }
648                                                   699 
649     if (pCurrentLV->GetNoDaughters()!=0 ||        700     if (pCurrentLV->GetNoDaughters()!=0 ||
650   pCurrentPV->IsReplicated()) {  //????Don't u    701   pCurrentPV->IsReplicated()) {  //????Don't understand this???? JA
651       // This block of code is executed for no    702       // This block of code is executed for non-leaf parts:
652                                                   703 
653       // Make the detector tree kit:              704       // Make the detector tree kit:
654       SoDetectorTreeKit* detectorTreeKit = new    705       SoDetectorTreeKit* detectorTreeKit = new SoDetectorTreeKit();  
655                                                   706 
656       SoSeparator* previewSeparator   =           707       SoSeparator* previewSeparator   =  
657   (SoSeparator*) detectorTreeKit->getPart("pre    708   (SoSeparator*) detectorTreeKit->getPart("previewSeparator",TRUE);
658       previewSeparator->renderCaching = SoSepa    709       previewSeparator->renderCaching = SoSeparator::OFF;
659                                                   710 
660       SoSeparator* fullSeparator =                711       SoSeparator* fullSeparator =  
661   (SoSeparator*) detectorTreeKit->getPart("ful    712   (SoSeparator*) detectorTreeKit->getPart("fullSeparator",   TRUE);
662       fullSeparator->renderCaching = SoSeparat    713       fullSeparator->renderCaching = SoSeparator::OFF;
663                                                   714 
664       if(fPreviewAndFull) detectorTreeKit->set    715       if(fPreviewAndFull) detectorTreeKit->setPreviewAndFull();
665       else detectorTreeKit->setPreview(TRUE);     716       else detectorTreeKit->setPreview(TRUE);
666                                                   717 
667       // Colour, etc., for SoDetectorTreeKit.  << 
668       // othere SoNodes(?).  Use fpVisAttribs  << 
669       // PreAddSolid...                        << 
670       const G4VisAttributes* pApplicableVisAtt << 
671   fpViewer->GetApplicableVisAttributes (fpVisA << 
672                                                << 
673       // First find the color attributes...    << 
674       const G4Colour& g4Col =  pApplicableVisA << 
675       const G4double red = g4Col.GetRed ();    << 
676       const G4double green = g4Col.GetGreen () << 
677       const G4double blue = g4Col.GetBlue ();  << 
678       G4double transparency = 1 - g4Col.GetAlp << 
679                                                << 
680       // Drawing style...                      << 
681       G4ViewParameters::DrawingStyle drawing_s << 
682   GetDrawingStyle(pApplicableVisAttribs);      << 
683       switch (drawing_style) {                 << 
684       case (G4ViewParameters::wireframe):      << 
685   fModelingSolid = false;                      << 
686   break;                                       << 
687       case (G4ViewParameters::hlr):            << 
688       case (G4ViewParameters::hsr):            << 
689       case (G4ViewParameters::hlhsr):          << 
690   fModelingSolid = true;                       << 
691   break;                                       << 
692       case (G4ViewParameters::cloud):          << 
693         fModelingSolid = false;                << 
694         break;                                 << 
695       }                                        << 
696                                                << 
697       SoMaterial* material =                      718       SoMaterial* material = 
698   fStyleCache->getMaterial((G4float)red,       << 719   fStyleCache->getMaterial((float)red,
699          (G4float)green,                       << 720          (float)green,
700          (G4float)blue,                        << 721          (float)blue,
701          (G4float)transparency);               << 722          (float)transparency);
702       detectorTreeKit->setPart("appearance.mat    723       detectorTreeKit->setPart("appearance.material",material);
703                                                   724 
704       SoLightModel* lightModel =                  725       SoLightModel* lightModel = 
705   fModelingSolid ? fStyleCache->getLightModelP    726   fModelingSolid ? fStyleCache->getLightModelPhong() : 
706   fStyleCache->getLightModelBaseColor();          727   fStyleCache->getLightModelBaseColor();
707       detectorTreeKit->setPart("appearance.lig    728       detectorTreeKit->setPart("appearance.lightModel",lightModel);
708                                                   729 
709       // Add the full separator to the diction    730       // Add the full separator to the dictionary; it is indexed by the 
710       // address of the logical volume!           731       // address of the logical volume!
711       fSeparatorMap[pCurrentLV] = fullSeparato    732       fSeparatorMap[pCurrentLV] = fullSeparator;
712                                                   733 
713       // Find out where to add this volume.       734       // Find out where to add this volume.
714       // If no mother can be found, it goes un    735       // If no mother can be found, it goes under root.
715       if (MotherVolume) {                         736       if (MotherVolume) {
716   if (fSeparatorMap.find(MotherVolume) != fSep    737   if (fSeparatorMap.find(MotherVolume) != fSeparatorMap.end()) {
717     //printf("debug : PreAddSolid : mother %s     738     //printf("debug : PreAddSolid : mother %s found in map\n",
718     //     MotherVolume->GetName().c_str());      739     //     MotherVolume->GetName().c_str());
719     fSeparatorMap[MotherVolume]->addChild(dete    740     fSeparatorMap[MotherVolume]->addChild(detectorTreeKit);
720   } else {                                        741   } else {
721     // Mother not previously encountered.  Sho    742     // Mother not previously encountered.  Shouldn't happen, since
722     // G4PhysicalVolumeModel sends volumes as     743     // G4PhysicalVolumeModel sends volumes as it encounters them,
723     // i.e., mothers before daughters, in its     744     // i.e., mothers before daughters, in its descent of the
724     // geometry tree.  Error!                     745     // geometry tree.  Error!
725     G4warn <<                                  << 746     G4cout <<
726       "ERROR: G4OpenInventorSceneHandler::Gene    747       "ERROR: G4OpenInventorSceneHandler::GeneratePrerequisites: Mother "
727      << ri->GetPhysicalVolume()->GetName()        748      << ri->GetPhysicalVolume()->GetName()
728      << ':' << ri->GetCopyNo()                    749      << ':' << ri->GetCopyNo()
729      << " not previously encountered."            750      << " not previously encountered."
730       "\nShouldn't happen!  Please report to v    751       "\nShouldn't happen!  Please report to visualization coordinator."
731      << G4endl;                                   752      << G4endl;
732     // Continue anyway.  Add to root of scene     753     // Continue anyway.  Add to root of scene graph tree...
733     //printf("debug : PreAddSolid : mother %s     754     //printf("debug : PreAddSolid : mother %s not found in map !!!\n",
734     //     MotherVolume->GetName().c_str());      755     //     MotherVolume->GetName().c_str());
735     fDetectorRoot->addChild(detectorTreeKit);     756     fDetectorRoot->addChild(detectorTreeKit);
736   }                                               757   }
737       } else {                                    758       } else {
738   //printf("debug : PreAddSolid : has no mothe    759   //printf("debug : PreAddSolid : has no mother\n");
739   fDetectorRoot->addChild(detectorTreeKit);       760   fDetectorRoot->addChild(detectorTreeKit);
740       }                                           761       }
741                                                   762 
742       fCurrentSeparator = previewSeparator;       763       fCurrentSeparator = previewSeparator;
743                                                   764 
744     } else {                                      765     } else {
745       // This block of code is executed for le    766       // This block of code is executed for leaf parts.
746                                                   767 
747       if (MotherVolume) {                         768       if (MotherVolume) {
748   if (fSeparatorMap.find(MotherVolume) != fSep    769   if (fSeparatorMap.find(MotherVolume) != fSeparatorMap.end()) {
749     fCurrentSeparator = fSeparatorMap[MotherVo    770     fCurrentSeparator = fSeparatorMap[MotherVolume];
750   } else {                                        771   } else {
751     // Mother not previously encountered.  Sho    772     // Mother not previously encountered.  Shouldn't happen, since
752     // G4PhysicalVolumeModel sends volumes as     773     // G4PhysicalVolumeModel sends volumes as it encounters them,
753     // i.e., mothers before daughters, in its     774     // i.e., mothers before daughters, in its descent of the
754     // geometry tree.  Error!                     775     // geometry tree.  Error!
755     G4warn << "ERROR: G4OpenInventorSceneHandl << 776     G4cout << "ERROR: G4OpenInventorSceneHandler::PreAddSolid: Mother "
756      << ri->GetPhysicalVolume()->GetName()        777      << ri->GetPhysicalVolume()->GetName()
757      << ':' << ri->GetCopyNo()                    778      << ':' << ri->GetCopyNo()
758      << " not previously encountered."            779      << " not previously encountered."
759       "\nShouldn't happen!  Please report to v    780       "\nShouldn't happen!  Please report to visualization coordinator."
760      << G4endl;                                   781      << G4endl;
761     // Continue anyway.  Add to root of scene     782     // Continue anyway.  Add to root of scene graph tree...
762     fCurrentSeparator = fDetectorRoot;            783     fCurrentSeparator = fDetectorRoot;
763   }                                               784   }
764       } else {                                    785       } else {
765   fCurrentSeparator = fDetectorRoot;              786   fCurrentSeparator = fDetectorRoot;
766       }                                           787       }
767     }                                             788     }
768                                                   789 
769   } else {                                        790   } else {
770     // Not from G4PhysicalVolumeModel, so add     791     // Not from G4PhysicalVolumeModel, so add to root as leaf part...
771                                                   792 
772     if (fReadyForTransients) {                    793     if (fReadyForTransients) {
773       fCurrentSeparator = fTransientRoot;         794       fCurrentSeparator = fTransientRoot;
774     } else {                                      795     } else {
775       fCurrentSeparator = fDetectorRoot;          796       fCurrentSeparator = fDetectorRoot;
776     }                                             797     }
777   }                                               798   }
778 }                                              << 
779                                                << 
780 void G4OpenInventorSceneHandler::AddProperties << 
781 {                                              << 
782   // Use the applicable vis attributes...      << 
783   const G4VisAttributes* pApplicableVisAttribs << 
784     fpViewer->GetApplicableVisAttributes (visA << 
785                                                << 
786   // First find the color attributes...        << 
787   const G4Colour& g4Col =  pApplicableVisAttri << 
788   const G4double red = g4Col.GetRed ();        << 
789   const G4double green = g4Col.GetGreen ();    << 
790   const G4double blue = g4Col.GetBlue ();      << 
791   G4double transparency = 1 - g4Col.GetAlpha() << 
792                                                << 
793   // Drawing style...                          << 
794   G4ViewParameters::DrawingStyle drawing_style << 
795     GetDrawingStyle(pApplicableVisAttribs);    << 
796   switch (drawing_style) {                     << 
797   case (G4ViewParameters::wireframe):          << 
798     fModelingSolid = false;                    << 
799     break;                                     << 
800   case (G4ViewParameters::hlr):                << 
801   case (G4ViewParameters::hsr):                << 
802   case (G4ViewParameters::hlhsr):              << 
803     fModelingSolid = true;                     << 
804     break;                                     << 
805   case (G4ViewParameters::cloud):              << 
806     fModelingSolid = false;                    << 
807     break;                                     << 
808   }                                            << 
809                                                << 
810   // Edge visibility...                        << 
811   G4bool isAuxEdgeVisible = GetAuxEdgeVisible  << 
812   fReducedWireFrame = !isAuxEdgeVisible;       << 
813                                                   799 
814   SoMaterial* material =                          800   SoMaterial* material = 
815     fStyleCache->getMaterial((G4float)red,     << 801     fStyleCache->getMaterial((float)red,
816            (G4float)green,                     << 802            (float)green,
817            (G4float)blue,                      << 803            (float)blue,
818            (G4float)transparency);             << 804            (float)transparency);
819   fCurrentSeparator->addChild(material);          805   fCurrentSeparator->addChild(material);
820                                                   806 
821   SoLightModel* lightModel =                      807   SoLightModel* lightModel = 
822     fModelingSolid ? fStyleCache->getLightMode    808     fModelingSolid ? fStyleCache->getLightModelPhong() : 
823     fStyleCache->getLightModelBaseColor();        809     fStyleCache->getLightModelBaseColor();
824   fCurrentSeparator->addChild(lightModel);        810   fCurrentSeparator->addChild(lightModel);
825 }                                              << 
826                                                   811 
827 void G4OpenInventorSceneHandler::AddTransform( << 812   // Set up the geometrical transformation for the coming 
828 {                                              << 
829   // AddTransform takes fObjectTransformation  << 
830   // Set up the geometrical transformation for << 
831   fCurrentSeparator->addChild(fStyleCache->get    813   fCurrentSeparator->addChild(fStyleCache->getResetTransform());
832                                                   814 
833   SoMatrixTransform* matrixTransform = new SoM    815   SoMatrixTransform* matrixTransform = new SoMatrixTransform;
834   G4OpenInventorTransform3D oiTran             << 816   G4OpenInventorTransform3D oiTran(*fpObjectTransformation);
835   (fObjectTransformation * G4Translate3D(trans << 
836   SbMatrix* sbMatrix = oiTran.GetSbMatrix();      817   SbMatrix* sbMatrix = oiTran.GetSbMatrix();
837                                                   818 
838   const G4Vector3D scale = fpViewer->GetViewPa    819   const G4Vector3D scale = fpViewer->GetViewParameters().GetScaleFactor();
839   SbMatrix sbScale;                               820   SbMatrix sbScale;
840   sbScale.setScale                                821   sbScale.setScale
841     (SbVec3f((G4float)scale.x(),(G4float)scale << 822     (SbVec3f((float)scale.x(),(float)scale.y(),(float)scale.z()));
842   sbMatrix->multRight(sbScale);                   823   sbMatrix->multRight(sbScale);
843                                                   824 
844   matrixTransform->matrix.setValue(*sbMatrix);    825   matrixTransform->matrix.setValue(*sbMatrix);
845   delete sbMatrix;                                826   delete sbMatrix;
846   fCurrentSeparator->addChild(matrixTransform)    827   fCurrentSeparator->addChild(matrixTransform);
847 }                                                 828 }
                                                   >> 829 
                                                   >> 830 #endif
848                                                   831