Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/management/src/G4ViewParameters.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/management/src/G4ViewParameters.cc (Version 11.3.0) and /visualization/management/src/G4ViewParameters.cc (Version 1.1)


                                                   >>   1 // This code implementation is the intellectual property of
                                                   >>   2 // the GEANT4 collaboration.
  1 //                                                  3 //
  2 // ******************************************* <<   4 // By copying, distributing or modifying the Program (or any work
  3 // * License and Disclaimer                    <<   5 // based on the Program) you indicate your acceptance of this statement,
  4 // *                                           <<   6 // and all its terms.
  5 // * The  Geant4 software  is  copyright of th << 
  6 // * the Geant4 Collaboration.  It is provided << 
  7 // * conditions of the Geant4 Software License << 
  8 // * LICENSE and available at  http://cern.ch/ << 
  9 // * include a list of copyright holders.      << 
 10 // *                                           << 
 11 // * Neither the authors of this software syst << 
 12 // * institutes,nor the agencies providing fin << 
 13 // * work  make  any representation or  warran << 
 14 // * regarding  this  software system or assum << 
 15 // * use.  Please see the license in the file  << 
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                           << 
 18 // * This  code  implementation is the result  << 
 19 // * technical work of the GEANT4 collaboratio << 
 20 // * By using,  copying,  modifying or  distri << 
 21 // * any work based  on the software)  you  ag << 
 22 // * use  in  resulting  scientific  publicati << 
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // ******************************************* << 
 25 //                                             << 
 26 //                                                  7 //
                                                   >>   8 // $Id: G4ViewParameters.cc,v 1.5 1999/12/15 14:54:25 gunter Exp $
                                                   >>   9 // GEANT4 tag $Name: geant4-01-01 $
 27 //                                                 10 //
 28 //                                                 11 // 
 29 // John Allison  19th July 1996                    12 // John Allison  19th July 1996
 30 // View parameters and options.                    13 // View parameters and options.
 31                                                    14 
 32 #include "G4ViewParameters.hh"                     15 #include "G4ViewParameters.hh"
 33                                                    16 
 34 #include "G4VisManager.hh"                         17 #include "G4VisManager.hh"
 35 #include "G4VPhysicalVolume.hh"                <<  18 #include "G4ios.hh"
 36 #include "G4UnitsTable.hh"                     << 
 37 #include "G4SystemOfUnits.hh"                  << 
 38 #include "G4Polyhedron.hh"                     << 
 39                                                << 
 40 #include <sstream>                             << 
 41 #include <cmath>                               << 
 42                                                << 
 43 #define G4warn G4cout                          << 
 44                                                    19 
 45 G4ViewParameters::G4ViewParameters ():             20 G4ViewParameters::G4ViewParameters ():
 46   fDrawingStyle (wireframe),                       21   fDrawingStyle (wireframe),
 47   fNumberOfCloudPoints(10000),                 <<  22   fRepStyle (polyhedron),
 48   fAuxEdgeVisible (false),                     << 
 49   fCulling (true),                                 23   fCulling (true),
 50   fCullInvisible (true),                           24   fCullInvisible (true),
 51   fDensityCulling (false),                         25   fDensityCulling (false),
 52   fVisibleDensity (0.01 * g / cm3),                26   fVisibleDensity (0.01 * g / cm3),
 53   fCullCovered (false),                            27   fCullCovered (false),
 54   fCBDAlgorithmNumber (0),                     << 
 55   fSection (false),                                28   fSection (false),
 56   fSectionPlane (),                            <<  29   fCutaway (false),
 57   fCutawayMode (cutawayUnion),                 <<  30   fExplode (false),
 58   fCutawayPlanes (),                           << 
 59   fExplodeFactor (1.),                             31   fExplodeFactor (1.),
 60   fNoOfSides (),                               <<  32   fNoOfSides (24),
 61   fViewpointDirection (G4Vector3D (0., 0., 1.)     33   fViewpointDirection (G4Vector3D (0., 0., 1.)),  // On z-axis.
 62   fUpVector (G4Vector3D (0., 1., 0.)),             34   fUpVector (G4Vector3D (0., 1., 0.)),            // y-axis up.
 63   fFieldHalfAngle (0.),                            35   fFieldHalfAngle (0.),                           // Orthogonal projection.
 64   fZoomFactor (1.),                                36   fZoomFactor (1.),
 65   fScaleFactor (G4Vector3D (1., 1., 1.)),      << 
 66   fCurrentTargetPoint (),                      << 
 67   fDolly (0.),                                     37   fDolly (0.),
 68   fLightsMoveWithCamera (false),               << 
 69   fRelativeLightpointDirection (G4Vector3D (1.     38   fRelativeLightpointDirection (G4Vector3D (1., 1., 1.)),
 70   fActualLightpointDirection (G4Vector3D (1.,      39   fActualLightpointDirection (G4Vector3D (1., 1., 1.)),
 71   fDefaultVisAttributes (),                    <<  40   fLightsMoveWithCamera (false),
                                                   >>  41   fViewGeom (true),
                                                   >>  42   fViewHits (true),
                                                   >>  43   fViewDigis (true),
 72   fDefaultTextVisAttributes (G4Colour (0., 0.,     44   fDefaultTextVisAttributes (G4Colour (0., 0., 1.)),
 73   fDefaultMarker (),                           << 
 74   fGlobalMarkerScale (1.),                         45   fGlobalMarkerScale (1.),
 75   fGlobalLineWidthScale (1.),                  << 
 76   fMarkerNotHidden (true),                         46   fMarkerNotHidden (true),
 77   fWindowSizeHintX (600),                          47   fWindowSizeHintX (600),
 78   fWindowSizeHintY (600),                      <<  48   fWindowSizeHintY (600)
 79   fWindowLocationHintX(0),                     <<  49 // Note: all other parameters use default constructors.
 80   fWindowLocationHintY(0),                     << 
 81   fWindowLocationHintXNegative(true),          << 
 82   fWindowLocationHintYNegative(false),         << 
 83   fGeometryMask(0),                            << 
 84   fAutoRefresh (false),                        << 
 85   fBackgroundColour (G4Colour(0.,0.,0.)),      << 
 86   fPicking (false),                            << 
 87   fRotationStyle (constrainUpDirection),       << 
 88   fStartTime(-G4VisAttributes::fVeryLongTime), << 
 89   fEndTime(G4VisAttributes::fVeryLongTime),    << 
 90   fFadeFactor(0.),                             << 
 91   fDisplayHeadTime(false),                     << 
 92   fDisplayHeadTimeX(-0.9),                     << 
 93   fDisplayHeadTimeY(-0.9),                     << 
 94   fDisplayHeadTimeSize(24.),                   << 
 95   fDisplayHeadTimeRed(0.),                     << 
 96   fDisplayHeadTimeGreen(1.),                   << 
 97   fDisplayHeadTimeBlue(1.),                    << 
 98   fDisplayLightFront(false),                   << 
 99   fDisplayLightFrontX(0.),                     << 
100   fDisplayLightFrontY(0.),                     << 
101   fDisplayLightFrontZ(0.),                     << 
102   fDisplayLightFrontT(0.),                     << 
103   fDisplayLightFrontRed(0.),                   << 
104   fDisplayLightFrontGreen(1.),                 << 
105   fDisplayLightFrontBlue(0.),                  << 
106   fSpecialMeshRendering(false),                << 
107   fSpecialMeshRenderingOption(meshAsDefault)   << 
108 {                                                  50 {
109   // Pick up default no of sides from G4Polyhe << 
110   // Note that this parameter is variously cal << 
111   //   No of sides                             << 
112   //   NumberOfRotationSteps                   << 
113   //   Line segments per circle                << 
114   // It refers to the approximation of a circl << 
115   // stated number of sides.                   << 
116   fNoOfSides = G4Polyhedron::GetNumberOfRotati << 
117                                                << 
118   fDefaultMarker.SetScreenSize (5.);               51   fDefaultMarker.SetScreenSize (5.);
119   // Markers are 5 pixels "overall" size, i.e. <<  52   // Markers are 5 pixels radius, 10 pixels diameter.
120 }                                                  53 }
121                                                    54 
122 G4ViewParameters::~G4ViewParameters () {}      <<  55 G4ViewParameters::~G4ViewParameters () {
123                                                <<  56 // Clear cutaway planes?  Rogue Wave probably destroys OK.
124 void G4ViewParameters::MultiplyScaleFactor     << 
125 (const G4Vector3D& scaleFactorMultiplier) {    << 
126   fScaleFactor.setX(fScaleFactor.x() * scaleFa << 
127   fScaleFactor.setY(fScaleFactor.y() * scaleFa << 
128   fScaleFactor.setZ(fScaleFactor.z() * scaleFa << 
129 }                                                  57 }
130                                                    58 
131 G4Vector3D& G4ViewParameters::GetActualLightpo     59 G4Vector3D& G4ViewParameters::GetActualLightpointDirection () {
132   SetViewAndLights (fViewpointDirection);          60   SetViewAndLights (fViewpointDirection);
133   return fActualLightpointDirection;               61   return fActualLightpointDirection;
134 }                                                  62 }
135                                                    63 
136 // Useful quantities - begin snippet.              64 // Useful quantities - begin snippet.
137 // Here Follow functions to evaluate the above     65 // Here Follow functions to evaluate the above algorithms as a
138 // function of the radius of the Bounding Sphe     66 // function of the radius of the Bounding Sphere of the object being
139 // viewed.  Call them in the order given - for     67 // viewed.  Call them in the order given - for efficiency, later
140 // functions depend on the results of earlier      68 // functions depend on the results of earlier ones (Store the
141 // results of earlier functions in your own te     69 // results of earlier functions in your own temporary variables -
142 // see, for example, G4OpenGLView::SetView ().     70 // see, for example, G4OpenGLView::SetView ().)
143                                                    71 
144 G4double G4ViewParameters::GetCameraDistance (     72 G4double G4ViewParameters::GetCameraDistance (G4double radius) const {
145   G4double cameraDistance;                         73   G4double cameraDistance;
146   if (fFieldHalfAngle == 0.) {                     74   if (fFieldHalfAngle == 0.) {
147     cameraDistance = radius;                       75     cameraDistance = radius;
148   }                                                76   }
149   else {                                           77   else {
150     cameraDistance = radius / std::sin (fField <<  78     cameraDistance = radius / sin (fFieldHalfAngle) - fDolly;
151   }                                                79   }
152   return cameraDistance;                           80   return cameraDistance;
153 }                                                  81 }
154                                                    82 
155 G4double G4ViewParameters::GetNearDistance (G4     83 G4double G4ViewParameters::GetNearDistance (G4double cameraDistance,
156               G4double radius) const {             84               G4double radius) const {
157   const G4double small = 1.e-6 * radius;           85   const G4double small = 1.e-6 * radius;
158   G4double nearDistance = cameraDistance - rad     86   G4double nearDistance = cameraDistance - radius;
159   if (nearDistance < small) nearDistance = sma     87   if (nearDistance < small) nearDistance = small;
160   return nearDistance;                             88   return nearDistance;
161 }                                                  89 }
162                                                    90 
163 G4double G4ViewParameters::GetFarDistance (G4d     91 G4double G4ViewParameters::GetFarDistance (G4double cameraDistance,
164              G4double nearDistance,                92              G4double nearDistance,
165              G4double radius) const {              93              G4double radius) const {
166   G4double farDistance = cameraDistance + radi     94   G4double farDistance = cameraDistance + radius;
167   if (farDistance < nearDistance) farDistance      95   if (farDistance < nearDistance) farDistance = nearDistance;
168   return farDistance;                              96   return farDistance;
169 }                                                  97 }
170                                                    98 
171 G4double G4ViewParameters::GetFrontHalfHeight      99 G4double G4ViewParameters::GetFrontHalfHeight (G4double nearDistance,
172                  G4double radius) const {         100                  G4double radius) const {
173   G4double frontHalfHeight;                       101   G4double frontHalfHeight;
174   if (fFieldHalfAngle == 0.) {                    102   if (fFieldHalfAngle == 0.) {
175     frontHalfHeight = radius / fZoomFactor;       103     frontHalfHeight = radius / fZoomFactor;
176   }                                               104   }
177   else {                                          105   else {
178     frontHalfHeight = nearDistance * std::tan  << 106     frontHalfHeight = nearDistance * tan (fFieldHalfAngle) / fZoomFactor;
179   }                                               107   }
180   return frontHalfHeight;                         108   return frontHalfHeight;
181 }                                                 109 }
182 // Useful quantities - end snippet.               110 // Useful quantities - end snippet.
183                                                   111 
184 void G4ViewParameters::AddCutawayPlane (const     112 void G4ViewParameters::AddCutawayPlane (const G4Plane3D& cutawayPlane) {
185   if (fCutawayPlanes.size () < 3 ) {           << 113   fCutaway = true;
186     fCutawayPlanes.push_back (cutawayPlane);   << 114   if (fCutawayPlanes.entries () < 3 ) {
                                                   >> 115     fCutawayPlanes.insert (cutawayPlane);
187   }                                               116   }
188   else {                                          117   else {
189     G4warn <<                                  << 118     G4cerr << "A maximum of 3 cutaway planes supported." << G4endl;
190       "ERROR: G4ViewParameters::AddCutawayPlan << 
191       "\n  A maximum of 3 cutaway planes suppo << 
192   }                                               119   }
193 }                                                 120 }
194                                                   121 
195 void G4ViewParameters::ChangeCutawayPlane      << 122 void G4ViewParameters::ClearCutawayPlanes () {
196 (size_t index, const G4Plane3D& cutawayPlane)  << 123   fCutaway = false;
197   if (index >= fCutawayPlanes.size()) {        << 124   fCutawayPlanes.clear ();
198     G4warn <<                                  << 
199       "ERROR: G4ViewParameters::ChangeCutawayP << 
200       "\n  Plane " << index << " does not exis << 
201   } else {                                     << 
202     fCutawayPlanes[index] = cutawayPlane;      << 
203   }                                            << 
204 }                                                 125 }
205                                                   126 
206 void G4ViewParameters::SetVisibleDensity (G4do    127 void G4ViewParameters::SetVisibleDensity (G4double visibleDensity) {
207   const G4double reasonableMaximum = 10.0 * g     128   const G4double reasonableMaximum = 10.0 * g / cm3;
208   if (visibleDensity < 0) {                       129   if (visibleDensity < 0) {
209     G4warn << "G4ViewParameters::SetVisibleDen << 130     G4cout << "G4ViewParameters::SetVisibleDensity: attempt to set negative "
210       "density - ignored." << G4endl;             131       "density - ignored." << G4endl;
211   }                                               132   }
212   else {                                          133   else {
213     if (visibleDensity > reasonableMaximum) {  << 134     if (fVisibleDensity > reasonableMaximum) {
214       G4warn << "G4ViewParameters::SetVisibleD << 135       G4cout << "G4ViewParameters::SetVisibleDensity: density > "
215        << G4BestUnit (reasonableMaximum, "Volu << 136      << reasonableMaximum
216        << " - did you mean this?"              << 137      << " g / cm3 - did you mean this?"
217        << G4endl;                              << 138      << G4endl;
218     }                                             139     }
219     fVisibleDensity = visibleDensity;             140     fVisibleDensity = visibleDensity;
220   }                                               141   }
221 }                                                 142 }
222                                                   143 
223 G4int G4ViewParameters::SetNoOfSides (G4int nS << 144 void G4ViewParameters::SetNoOfSides (G4int nSides) {
224   const G4int nSidesMin = fDefaultVisAttribute << 145   const G4int  nSidesMin = 3;
225   if (nSides < nSidesMin) {                       146   if (nSides < nSidesMin) {
226     nSides = nSidesMin;                           147     nSides = nSidesMin;
227     G4warn << "G4ViewParameters::SetNoOfSides: << 148     G4cout << "G4ViewParameters::SetNoOfSides: attempt to set the"
228     "\nnumber of sides per circle < " << nSide << 149       "\nnumber of sides per circle < " << nSidesMin
229     << "; forced to " << nSides << G4endl;     << 150    << "; forced to" << nSides << G4endl;
230   }                                               151   }
231   fNoOfSides = nSides;                            152   fNoOfSides = nSides;
232   return fNoOfSides;                           << 
233 }                                              << 
234                                                << 
235 G4int G4ViewParameters::SetNumberOfCloudPoints << 
236   const G4int nPointsMin = 100;                << 
237   if (nPoints < nPointsMin) {                  << 
238     nPoints = nPointsMin;                      << 
239     G4warn << "G4ViewParameters::SetNumberOfCl << 
240     "\nnumber of points per cloud set to minim << 
241     << G4endl;                                 << 
242   }                                            << 
243   fNumberOfCloudPoints = nPoints;              << 
244   return fNumberOfCloudPoints;                 << 
245 }                                                 153 }
246                                                   154 
247 void G4ViewParameters::SetViewAndLights           155 void G4ViewParameters::SetViewAndLights
248 (const G4Vector3D& viewpointDirection) {          156 (const G4Vector3D& viewpointDirection) {
249                                                << 
250   fViewpointDirection = viewpointDirection;       157   fViewpointDirection = viewpointDirection;
251                                                << 
252   // If the requested viewpoint direction is p << 
253   // vector, the orientation of the view is un << 
254   if (fViewpointDirection.unit() * fUpVector.u << 
255     static G4bool firstTime = true;            << 
256     if (firstTime) {                           << 
257       firstTime = false;                       << 
258       G4warn <<                                << 
259       "WARNING: Viewpoint direction is very cl << 
260       "\n  Change the up vector or \"/vis/view << 
261       << G4endl;                               << 
262     }                                          << 
263   }                                            << 
264                                                << 
265   // Move the lights too if requested...       << 
266   if (fLightsMoveWithCamera) {                    158   if (fLightsMoveWithCamera) {
267     G4Vector3D zprime = fViewpointDirection.un << 159   G4Vector3D zprime = fViewpointDirection.unit ();
268     G4Vector3D xprime = (fUpVector.cross (zpri << 160   G4Vector3D xprime = (fUpVector.cross (zprime)).unit ();
269     G4Vector3D yprime = zprime.cross (xprime); << 161   G4Vector3D yprime = zprime.cross (xprime);
270     fActualLightpointDirection =               << 162    fActualLightpointDirection =
271       fRelativeLightpointDirection.x () * xpri << 163      fRelativeLightpointDirection.x () * xprime +
272       fRelativeLightpointDirection.y () * ypri << 164      fRelativeLightpointDirection.y () * yprime +
273       fRelativeLightpointDirection.x () * zpri << 165      fRelativeLightpointDirection.x () * zprime;     
274   } else {                                     << 166   }
                                                   >> 167   else {
275     fActualLightpointDirection = fRelativeLigh    168     fActualLightpointDirection = fRelativeLightpointDirection;
276   }                                               169   }
277 }                                                 170 }
278                                                   171 
279 void G4ViewParameters::SetLightpointDirection     172 void G4ViewParameters::SetLightpointDirection
280 (const G4Vector3D& lightpointDirection) {         173 (const G4Vector3D& lightpointDirection) {
281   fRelativeLightpointDirection = lightpointDir    174   fRelativeLightpointDirection = lightpointDirection;
282   SetViewAndLights (fViewpointDirection);         175   SetViewAndLights (fViewpointDirection);
283 }                                                 176 }
284                                                   177 
285 void G4ViewParameters::SetPan (G4double right, << 178 void G4ViewParameters::Pan (G4double right, G4double up) {
286   G4Vector3D unitRight = (fUpVector.cross (fVi << 
287   G4Vector3D unitUp    = (fViewpointDirection. << 
288   fCurrentTargetPoint  = right * unitRight + u << 
289 }                                              << 
290                                                << 
291 void G4ViewParameters::IncrementPan (G4double  << 
292   IncrementPan (right,up, 0);                  << 
293 }                                              << 
294                                                << 
295 void G4ViewParameters::IncrementPan (G4double  << 
296   G4Vector3D unitRight = (fUpVector.cross (fVi    179   G4Vector3D unitRight = (fUpVector.cross (fViewpointDirection)).unit();
297   G4Vector3D unitUp    = (fViewpointDirection.    180   G4Vector3D unitUp    = (fViewpointDirection.cross (unitRight)).unit();
298   fCurrentTargetPoint += right * unitRight + u << 181   fCurrentTargetPoint += right * unitRight + up * unitUp;
299 }                                              << 
300                                                << 
301 void G4ViewParameters::AddVisAttributesModifie << 
302 (const G4ModelingParameters::VisAttributesModi << 
303   // If target exists with same signifier just << 
304   G4bool duplicateTarget = false;              << 
305   auto i = fVisAttributesModifiers.begin();    << 
306   for (; i < fVisAttributesModifiers.end(); ++ << 
307     if (vam.GetPVNameCopyNoPath() == (*i).GetP << 
308         vam.GetVisAttributesSignifier() == (*i << 
309       duplicateTarget = true;                  << 
310       break;                                   << 
311     }                                          << 
312   }                                            << 
313   if (duplicateTarget) (*i).SetVisAttributes(v << 
314   else fVisAttributesModifiers.push_back(vam); << 
315 }                                              << 
316                                                << 
317 G4String G4ViewParameters::CameraAndLightingCo << 
318 (const G4Point3D standardTargetPoint) const    << 
319 {                                              << 
320   std::ostringstream oss;                      << 
321                                                << 
322   oss << "#\n# Camera and lights commands";    << 
323                                                << 
324   oss << "\n/vis/viewer/set/viewpointVector "  << 
325   << fViewpointDirection.x()                   << 
326   << ' ' << fViewpointDirection.y()            << 
327   << ' ' << fViewpointDirection.z();           << 
328                                                << 
329   oss << "\n/vis/viewer/set/upVector "         << 
330   << fUpVector.x()                             << 
331   << ' ' << fUpVector.y()                      << 
332   << ' ' << fUpVector.z();                     << 
333                                                << 
334   oss << "\n/vis/viewer/set/projection ";      << 
335     if (fFieldHalfAngle == 0.) {               << 
336     oss                                        << 
337     << "orthogonal";                           << 
338   } else {                                     << 
339     oss                                        << 
340     << "perspective "                          << 
341     << fFieldHalfAngle/deg                     << 
342     << " deg";                                 << 
343   }                                            << 
344                                                << 
345   oss << "\n/vis/viewer/zoomTo "               << 
346   << fZoomFactor;                              << 
347                                                << 
348   oss << "\n/vis/viewer/scaleTo "              << 
349   << fScaleFactor.x()                          << 
350   << ' ' << fScaleFactor.y()                   << 
351   << ' ' << fScaleFactor.z();                  << 
352                                                << 
353   oss << "\n/vis/viewer/set/targetPoint "      << 
354   << G4BestUnit(standardTargetPoint+fCurrentTa << 
355   << "\n# Note that if you have not set a targ << 
356   << "\n# a target point based on the scene -  << 
357   << "\n# so don't be alarmed by strange coord << 
358                                                << 
359   oss << "\n/vis/viewer/dollyTo "              << 
360   << G4BestUnit(fDolly,"Length");              << 
361                                                << 
362   oss << "\n/vis/viewer/set/lightsMove ";      << 
363   if (fLightsMoveWithCamera) {                 << 
364     oss << "camera";                           << 
365   } else {                                     << 
366     oss << "object";                           << 
367   }                                            << 
368                                                << 
369   oss << "\n/vis/viewer/set/lightsVector "     << 
370   << fRelativeLightpointDirection.x()          << 
371   << ' ' << fRelativeLightpointDirection.y()   << 
372   << ' ' << fRelativeLightpointDirection.z();  << 
373                                                << 
374   oss << "\n/vis/viewer/set/rotationStyle ";   << 
375   if (fRotationStyle == constrainUpDirection)  << 
376     oss << "constrainUpDirection";             << 
377   } else {                                     << 
378     oss << "freeRotation";                     << 
379   }                                            << 
380                                                << 
381   G4Colour c = fBackgroundColour;              << 
382   oss << "\n/vis/viewer/set/background "       << 
383   << c.GetRed()                                << 
384   << ' ' << c.GetGreen()                       << 
385   << ' ' << c.GetBlue()                        << 
386   << ' ' << c.GetAlpha();                      << 
387                                                << 
388   c = fDefaultVisAttributes.GetColour();       << 
389   oss << "\n/vis/viewer/set/defaultColour "    << 
390   << c.GetRed()                                << 
391   << ' ' << c.GetGreen()                       << 
392   << ' ' << c.GetBlue()                        << 
393   << ' ' << c.GetAlpha();                      << 
394                                                << 
395   c = fDefaultTextVisAttributes.GetColour();   << 
396   oss << "\n/vis/viewer/set/defaultTextColour  << 
397   << c.GetRed()                                << 
398   << ' ' << c.GetGreen()                       << 
399   << ' ' << c.GetBlue()                        << 
400   << ' ' << c.GetAlpha();                      << 
401                                                << 
402   oss << std::endl;                            << 
403                                                << 
404   return oss.str();                            << 
405 }                                              << 
406                                                << 
407 G4String G4ViewParameters::DrawingStyleCommand << 
408 {                                              << 
409   std::ostringstream oss;                      << 
410                                                << 
411   oss << "#\n# Drawing style commands";        << 
412                                                << 
413   oss << "\n/vis/viewer/set/style ";           << 
414   switch (fDrawingStyle) {                     << 
415     case wireframe:                            << 
416     case hlr:                                  << 
417       oss << "wireframe";                      << 
418       break;                                   << 
419     case hsr:                                  << 
420     case hlhsr:                                << 
421       oss << "surface";                        << 
422       break;                                   << 
423     case cloud:                                << 
424       oss << "cloud";                          << 
425       break;                                   << 
426   }                                            << 
427                                                << 
428   oss << "\n/vis/viewer/set/hiddenEdge ";      << 
429   if (fDrawingStyle == hlr || fDrawingStyle == << 
430     oss << "true";                             << 
431   } else {                                     << 
432     oss << "false";                            << 
433   }                                            << 
434                                                << 
435   oss << "\n/vis/viewer/set/auxiliaryEdge ";   << 
436   if (fAuxEdgeVisible) {                       << 
437     oss << "true";                             << 
438   } else {                                     << 
439     oss << "false";                            << 
440   }                                            << 
441                                                << 
442   oss << "\n/vis/viewer/set/hiddenMarker ";    << 
443   if (fMarkerNotHidden) {                      << 
444     oss << "false";                            << 
445   } else {                                     << 
446     oss << "true";                             << 
447   }                                            << 
448                                                << 
449   oss << "\n/vis/viewer/set/globalLineWidthSca << 
450   << fGlobalLineWidthScale;                    << 
451                                                << 
452   oss << "\n/vis/viewer/set/globalMarkerScale  << 
453   << fGlobalMarkerScale;                       << 
454                                                << 
455   oss << "\n/vis/viewer/set/numberOfCloudPoint << 
456   << fNumberOfCloudPoints;                     << 
457                                                << 
458   oss << "\n/vis/viewer/set/specialMeshRenderi << 
459   if (fSpecialMeshRendering) {                 << 
460     oss << "true";                             << 
461   } else {                                     << 
462     oss << "false";                            << 
463   }                                            << 
464                                                << 
465   oss << "\n/vis/viewer/set/specialMeshRenderi << 
466   << fSpecialMeshRenderingOption;              << 
467                                                << 
468   oss << "\n/vis/viewer/set/specialMeshVolumes << 
469   for (const auto& volume : fSpecialMeshVolume << 
470     oss << ' ' << volume.GetName() << ' ' << v << 
471   }                                            << 
472                                                << 
473   oss << std::endl;                            << 
474                                                << 
475   return oss.str();                            << 
476 }                                              << 
477                                                << 
478 G4String G4ViewParameters::SceneModifyingComma << 
479 {                                              << 
480   std::ostringstream oss;                      << 
481                                                << 
482   oss << "#\n# Scene-modifying commands";      << 
483                                                << 
484   oss << "\n/vis/viewer/set/culling global ";  << 
485   if (fCulling) {                              << 
486     oss << "true";                             << 
487   } else {                                     << 
488     oss << "false";                            << 
489   }                                            << 
490                                                << 
491   oss << "\n/vis/viewer/set/culling invisible  << 
492   if (fCullInvisible) {                        << 
493     oss << "true";                             << 
494   } else {                                     << 
495     oss << "false";                            << 
496   }                                            << 
497                                                << 
498   oss << "\n/vis/viewer/set/culling density "; << 
499   if (fDensityCulling) {                       << 
500     oss << "true " << fVisibleDensity/(g/cm3)  << 
501   } else {                                     << 
502     oss << "false";                            << 
503   }                                            << 
504                                                << 
505   oss << "\n/vis/viewer/set/culling coveredDau << 
506   if (fCullCovered) {                          << 
507     oss << "true";                             << 
508   } else {                                     << 
509     oss << "false";                            << 
510   }                                            << 
511                                                << 
512   oss << "\n/vis/viewer/colourByDensity "      << 
513   << fCBDAlgorithmNumber << " g/cm3";          << 
514   for (auto p: fCBDParameters) {               << 
515     oss << ' ' << p/(g/cm3);                   << 
516   }                                            << 
517                                                << 
518   oss << "\n/vis/viewer/set/sectionPlane ";    << 
519   if (fSection) {                              << 
520     oss << "on "                               << 
521     << G4BestUnit(fSectionPlane.point(),"Lengt << 
522     << fSectionPlane.normal().x()              << 
523     << ' ' << fSectionPlane.normal().y()       << 
524     << ' ' << fSectionPlane.normal().z();      << 
525   } else {                                     << 
526     oss << "off";                              << 
527   }                                            << 
528                                                << 
529   oss << "\n/vis/viewer/set/cutawayMode ";     << 
530   if (fCutawayMode == cutawayUnion) {          << 
531     oss << "union";                            << 
532   } else {                                     << 
533     oss << "intersection";                     << 
534   }                                            << 
535                                                << 
536   oss << "\n/vis/viewer/clearCutawayPlanes";   << 
537   if (fCutawayPlanes.size()) {                 << 
538     for (size_t i = 0; i < fCutawayPlanes.size << 
539       oss << "\n/vis/viewer/addCutawayPlane "  << 
540       << G4BestUnit(fCutawayPlanes[i].point(), << 
541       << fCutawayPlanes[i].normal().x()        << 
542       << ' ' << fCutawayPlanes[i].normal().y() << 
543       << ' ' << fCutawayPlanes[i].normal().z() << 
544     }                                          << 
545   } else {                                     << 
546     oss << "\n# No cutaway planes defined.";   << 
547   }                                            << 
548                                                << 
549   oss << "\n/vis/viewer/set/explodeFactor "    << 
550   << fExplodeFactor                            << 
551   << ' ' << G4BestUnit(fExplodeCentre,"Length" << 
552                                                << 
553   oss << "\n/vis/viewer/set/lineSegmentsPerCir << 
554   << fNoOfSides;                               << 
555                                                << 
556   oss << std::endl;                            << 
557                                                << 
558   return oss.str();                            << 
559 }                                              << 
560                                                << 
561 G4String G4ViewParameters::TouchableCommands() << 
562 {                                              << 
563   std::ostringstream oss;                      << 
564                                                << 
565   oss << "#\n# Touchable commands";            << 
566                                                << 
567   const std::vector<G4ModelingParameters::VisA << 
568     fVisAttributesModifiers;                   << 
569                                                << 
570   if (vams.empty()) {                          << 
571     oss                                        << 
572     << "\n# None"                              << 
573     << "\n/vis/viewer/clearVisAttributesModifi << 
574     oss << std::endl;                          << 
575     return oss.str();                          << 
576   }                                            << 
577                                                << 
578   oss                                          << 
579   << "\n/vis/viewer/clearVisAttributesModifier << 
580                                                << 
581   G4ModelingParameters::PVNameCopyNoPath lastP << 
582   std::vector<G4ModelingParameters::VisAttribu << 
583     iModifier;                                 << 
584   for (iModifier = vams.begin();               << 
585        iModifier != vams.end();                << 
586        ++iModifier) {                          << 
587     const G4ModelingParameters::PVNameCopyNoPa << 
588       iModifier->GetPVNameCopyNoPath();        << 
589     if (vamPath != lastPath) {                 << 
590       lastPath = vamPath;                      << 
591       oss << "\n/vis/set/touchable";           << 
592       G4ModelingParameters::PVNameCopyNoPathCo << 
593       for (iVAM = vamPath.begin();             << 
594            iVAM != vamPath.end();              << 
595            ++iVAM) {                           << 
596         oss << ' ' << iVAM->GetName() << ' ' < << 
597       }                                        << 
598     }                                          << 
599     const G4VisAttributes& vamVisAtts = iModif << 
600     const G4Colour& c = vamVisAtts.GetColour() << 
601     switch (iModifier->GetVisAttributesSignifi << 
602       case G4ModelingParameters::VASVisibility << 
603         oss << "\n/vis/touchable/set/visibilit << 
604         if (vamVisAtts.IsVisible()) {          << 
605           oss << "true";                       << 
606         } else {                               << 
607           oss << "false";                      << 
608         }                                      << 
609         break;                                 << 
610       case G4ModelingParameters::VASDaughtersI << 
611         oss << "\n/vis/touchable/set/daughters << 
612         if (vamVisAtts.IsDaughtersInvisible()) << 
613           oss << "true";                       << 
614         } else {                               << 
615           oss << "false";                      << 
616         }                                      << 
617         break;                                 << 
618       case G4ModelingParameters::VASColour:    << 
619         oss << "\n/vis/touchable/set/colour "  << 
620         << c.GetRed()                          << 
621         << ' ' << c.GetGreen()                 << 
622         << ' ' << c.GetBlue()                  << 
623         << ' ' << c.GetAlpha();                << 
624         break;                                 << 
625       case G4ModelingParameters::VASLineStyle: << 
626         oss << "\n/vis/touchable/set/lineStyle << 
627         switch (vamVisAtts.GetLineStyle()) {   << 
628           case G4VisAttributes::unbroken:      << 
629             oss << "unbroken";                 << 
630             break;                             << 
631           case G4VisAttributes::dashed:        << 
632             oss << "dashed";                   << 
633             break;                             << 
634           case G4VisAttributes::dotted:        << 
635           oss << "dotted";                     << 
636         }                                      << 
637         break;                                 << 
638       case G4ModelingParameters::VASLineWidth: << 
639         oss << "\n/vis/touchable/set/lineWidth << 
640         << vamVisAtts.GetLineWidth();          << 
641         break;                                 << 
642       case G4ModelingParameters::VASForceWiref << 
643         if (vamVisAtts.IsForceDrawingStyle())  << 
644           if (vamVisAtts.GetForcedDrawingStyle << 
645             oss << "\n/vis/touchable/set/force << 
646             if (vamVisAtts.IsForceDrawingStyle << 
647               oss << "true";                   << 
648             } else {                           << 
649               oss << "false";                  << 
650             }                                  << 
651           }                                    << 
652         }                                      << 
653         break;                                 << 
654       case G4ModelingParameters::VASForceSolid << 
655         if (vamVisAtts.IsForceDrawingStyle())  << 
656           if (vamVisAtts.GetForcedDrawingStyle << 
657             oss << "\n/vis/touchable/set/force << 
658             if (vamVisAtts.IsForceDrawingStyle << 
659               oss << "true";                   << 
660             } else {                           << 
661               oss << "false";                  << 
662             }                                  << 
663           }                                    << 
664         }                                      << 
665         break;                                 << 
666       case G4ModelingParameters::VASForceCloud << 
667         if (vamVisAtts.IsForceDrawingStyle())  << 
668           if (vamVisAtts.GetForcedDrawingStyle << 
669             oss << "\n/vis/touchable/set/force << 
670             if (vamVisAtts.IsForceDrawingStyle << 
671               oss << "true";                   << 
672             } else {                           << 
673               oss << "false";                  << 
674             }                                  << 
675           }                                    << 
676         }                                      << 
677         break;                                 << 
678       case G4ModelingParameters::VASForceAuxEd << 
679         if (vamVisAtts.IsForceAuxEdgeVisible() << 
680           oss << "\n/vis/touchable/set/forceAu << 
681           if (vamVisAtts.IsForcedAuxEdgeVisibl << 
682             oss << "true";                     << 
683           } else {                             << 
684             oss << "false";                    << 
685           }                                    << 
686         }                                      << 
687         break;                                 << 
688       case G4ModelingParameters::VASForceLineS << 
689         oss << "\n/vis/touchable/set/lineSegme << 
690         << vamVisAtts.GetForcedLineSegmentsPer << 
691         break;                                 << 
692       case G4ModelingParameters::VASForceNumbe << 
693         oss << "\n/vis/touchable/set/numberOfC << 
694         << vamVisAtts.GetForcedNumberOfCloudPo << 
695         break;                                 << 
696     }                                          << 
697   }                                            << 
698                                                << 
699   oss << std::endl;                            << 
700                                                << 
701   return oss.str();                            << 
702 }                                              << 
703                                                << 
704 G4String G4ViewParameters::TimeWindowCommands( << 
705 {                                              << 
706   std::ostringstream oss;                      << 
707                                                << 
708   oss <<  "#\n# Time window commands";         << 
709                                                << 
710   oss                                          << 
711   << "\n/vis/viewer/set/timeWindow/startTime " << 
712   << fStartTime/ns << " ns ";                  << 
713                                                << 
714   oss                                          << 
715   << "\n/vis/viewer/set/timeWindow/endTime "   << 
716   << fEndTime/ns << " ns ";                    << 
717                                                << 
718   oss << "\n/vis/viewer/set/timeWindow/fadeFac << 
719   << fFadeFactor;                              << 
720                                                << 
721   oss                                          << 
722   << "\n/vis/viewer/set/timeWindow/displayHead << 
723   if (!fDisplayHeadTime) {                     << 
724     oss << "false";                            << 
725   } else {                                     << 
726     oss                                        << 
727     << "true"                                  << 
728     << ' ' << fDisplayHeadTimeX                << 
729     << ' ' << fDisplayHeadTimeY                << 
730     << ' ' << fDisplayHeadTimeSize             << 
731     << ' ' << fDisplayHeadTimeRed              << 
732     << ' ' << fDisplayHeadTimeGreen            << 
733     << ' ' << fDisplayHeadTimeBlue;            << 
734   }                                            << 
735                                                << 
736   oss                                          << 
737   << "\n/vis/viewer/set/timeWindow/displayLigh << 
738   if (!fDisplayLightFront) {                   << 
739     oss << "false";                            << 
740   } else {                                     << 
741     oss                                        << 
742     << "true"                                  << 
743     << ' ' << fDisplayLightFrontX/mm           << 
744     << ' ' << fDisplayLightFrontY/mm           << 
745     << ' ' << fDisplayLightFrontZ/mm           << 
746     << " mm"                                   << 
747     << ' ' << fDisplayLightFrontT/ns           << 
748     << " ns"                                   << 
749     << ' ' << fDisplayLightFrontRed            << 
750     << ' ' << fDisplayLightFrontGreen          << 
751     << ' ' << fDisplayLightFrontBlue;          << 
752   }                                            << 
753                                                << 
754   oss << std::endl;                            << 
755                                                << 
756   return oss.str();                            << 
757 }                                                 182 }
758                                                   183 
759 void G4ViewParameters::PrintDifferences (const    184 void G4ViewParameters::PrintDifferences (const G4ViewParameters& v) const {
760                                                   185 
761   // Put performance-sensitive parameters firs    186   // Put performance-sensitive parameters first.
762   if (                                            187   if (
763       // This first to optimise spin, etc.        188       // This first to optimise spin, etc.
764       (fViewpointDirection   != v.fViewpointDi    189       (fViewpointDirection   != v.fViewpointDirection)   ||
765                                                   190 
766       // No particular order from here on.        191       // No particular order from here on.
767       (fDrawingStyle         != v.fDrawingStyl    192       (fDrawingStyle         != v.fDrawingStyle)         ||
768       (fNumberOfCloudPoints  != v.fNumberOfClo << 193       (fRepStyle             != v.fRepStyle)             ||
769       (fAuxEdgeVisible       != v.fAuxEdgeVisi << 
770       (fCulling              != v.fCulling)       194       (fCulling              != v.fCulling)              ||
771       (fCullInvisible        != v.fCullInvisib    195       (fCullInvisible        != v.fCullInvisible)        ||
772       (fDensityCulling       != v.fDensityCull    196       (fDensityCulling       != v.fDensityCulling)       ||
773       (fVisibleDensity       != v.fVisibleDens    197       (fVisibleDensity       != v.fVisibleDensity)       ||
774       (fCullCovered          != v.fCullCovered    198       (fCullCovered          != v.fCullCovered)          ||
775       (fCBDAlgorithmNumber   != v.fCBDAlgorith << 
776       (fSection              != v.fSection)       199       (fSection              != v.fSection)              ||
                                                   >> 200       (fCutaway              != v.fCutaway)              || 
                                                   >> 201       (fExplode              != v.fExplode)              ||
777       (fNoOfSides            != v.fNoOfSides)     202       (fNoOfSides            != v.fNoOfSides)            ||
778       (fUpVector             != v.fUpVector)      203       (fUpVector             != v.fUpVector)             ||
779       (fFieldHalfAngle       != v.fFieldHalfAn    204       (fFieldHalfAngle       != v.fFieldHalfAngle)       ||
780       (fZoomFactor           != v.fZoomFactor)    205       (fZoomFactor           != v.fZoomFactor)           ||
781       (fScaleFactor          != v.fScaleFactor << 
782       (fCurrentTargetPoint   != v.fCurrentTarg    206       (fCurrentTargetPoint   != v.fCurrentTargetPoint)   ||
783       (fDolly                != v.fDolly)         207       (fDolly                != v.fDolly)                ||
784       (fRelativeLightpointDirection != v.fRela    208       (fRelativeLightpointDirection != v.fRelativeLightpointDirection)  ||
785       (fLightsMoveWithCamera != v.fLightsMoveW    209       (fLightsMoveWithCamera != v.fLightsMoveWithCamera) ||
                                                   >> 210       (fViewGeom             != v.fViewGeom)             ||
                                                   >> 211       (fViewHits             != v.fViewHits)             ||
                                                   >> 212       (fViewDigis            != v.fViewDigis)            ||
786       (fDefaultVisAttributes != v.fDefaultVisA    213       (fDefaultVisAttributes != v.fDefaultVisAttributes) ||
787       (fDefaultTextVisAttributes != v.fDefault    214       (fDefaultTextVisAttributes != v.fDefaultTextVisAttributes) ||
788       (fDefaultMarker        != v.fDefaultMark    215       (fDefaultMarker        != v.fDefaultMarker)        ||
789       (fGlobalMarkerScale    != v.fGlobalMarke    216       (fGlobalMarkerScale    != v.fGlobalMarkerScale)    ||
790       (fGlobalLineWidthScale != v.fGlobalLineW << 
791       (fMarkerNotHidden      != v.fMarkerNotHi    217       (fMarkerNotHidden      != v.fMarkerNotHidden)      ||
792       (fWindowSizeHintX      != v.fWindowSizeH << 218       (fWindowSizeHintY      != v.fWindowSizeHintY))
793       (fWindowSizeHintY      != v.fWindowSizeH << 
794       (fXGeometryString      != v.fXGeometrySt << 
795       (fGeometryMask         != v.fGeometryMas << 
796       (fAutoRefresh          != v.fAutoRefresh << 
797       (fBackgroundColour     != v.fBackgroundC << 
798       (fPicking              != v.fPicking)    << 
799       (fRotationStyle        != v.fRotationSty << 
800       )                                        << 
801     G4cout << "Difference in 1st batch." << G4    219     G4cout << "Difference in 1st batch." << G4endl;
802                                                   220 
803   if (fCBDAlgorithmNumber > 0) {               << 
804     if (fCBDParameters.size() != v.fCBDParamet << 
805       G4cout << "Difference in number of colou << 
806     } else if (fCBDParameters != v.fCBDParamet << 
807       G4cout << "Difference in values of colou << 
808     }                                          << 
809   }                                            << 
810                                                << 
811   if (fSection) {                                 221   if (fSection) {
812     if (!(fSectionPlane == v.fSectionPlane))      222     if (!(fSectionPlane == v.fSectionPlane))
813       G4cout << "Difference in section planes     223       G4cout << "Difference in section planes batch." << G4endl;
814   }                                               224   }
815                                                   225 
816   if (IsCutaway()) {                           << 226   if (fCutaway) {
817     if (fCutawayPlanes.size () != v.fCutawayPl << 227     if (fCutawayPlanes.entries () != v.fCutawayPlanes.entries ()) {
818       G4cout << "Difference in no of cutaway p    228       G4cout << "Difference in no of cutaway planes." << G4endl;
819     }                                             229     }
820     else {                                        230     else {
821       for (size_t i = 0; i < fCutawayPlanes.si << 231       for (int i = 0; i < fCutawayPlanes.entries (); i++) {
822   if (!(fCutawayPlanes[i] == v.fCutawayPlanes[ << 232   if (!(fCutawayPlanes (i) == v.fCutawayPlanes (i)))
823     G4cout << "Difference in cutaway plane no.    233     G4cout << "Difference in cutaway plane no. " << i << G4endl;
824       }                                           234       }
825     }                                             235     }
826   }                                               236   }
827                                                   237 
828   if (IsExplode()) {                           << 238   if (fExplode) {
829     if (fExplodeFactor != v.fExplodeFactor)       239     if (fExplodeFactor != v.fExplodeFactor)
830       G4cout << "Difference in explode factor.    240       G4cout << "Difference in explode factor." << G4endl;
831     if (fExplodeCentre != v.fExplodeCentre)    << 
832       G4cout << "Difference in explode centre. << 
833   }                                            << 
834                                                << 
835   if (fVisAttributesModifiers != v.fVisAttribu << 
836     G4cout << "Difference in vis attributes mo << 
837   }                                            << 
838                                                << 
839   if (fStartTime != v.fStartTime ||            << 
840       fEndTime   != v.fEndTime)  {             << 
841     G4cout << "Difference in time window." <<  << 
842   }                                            << 
843                                                << 
844   if (fFadeFactor != v.fFadeFactor) {          << 
845     G4cout << "Difference in time window fade  << 
846   }                                            << 
847                                                << 
848   if (fDisplayHeadTime != v.fDisplayHeadTime)  << 
849     G4cout << "Difference in display head time << 
850   } else {                                     << 
851     if (fDisplayHeadTimeX     != v.fDisplayHea << 
852         fDisplayHeadTimeY     != v.fDisplayHea << 
853         fDisplayHeadTimeSize  != v.fDisplayHea << 
854         fDisplayHeadTimeRed   != v.fDisplayHea << 
855         fDisplayHeadTimeGreen != v.fDisplayHea << 
856         fDisplayHeadTimeBlue  != v.fDisplayHea << 
857       G4cout << "Difference in display head ti << 
858     }                                          << 
859   }                                            << 
860                                                << 
861   if (fDisplayLightFront != v.fDisplayLightFro << 
862     G4cout << "Difference in display light fro << 
863   } else {                                     << 
864     if (fDisplayLightFrontX     != v.fDisplayL << 
865         fDisplayLightFrontY     != v.fDisplayL << 
866         fDisplayLightFrontZ     != v.fDisplayL << 
867         fDisplayLightFrontT     != v.fDisplayL << 
868         fDisplayLightFrontRed   != v.fDisplayL << 
869         fDisplayLightFrontGreen != v.fDisplayL << 
870         fDisplayLightFrontBlue  != v.fDisplayL << 
871       G4cout << "Difference in display light f << 
872     }                                          << 
873   }                                               241   }
874 }                                                 242 }
875                                                   243 
876 std::ostream& operator <<                      << 244 G4std::ostream& operator << (G4std::ostream& os, const G4ViewParameters& v) {
877  (std::ostream& os, G4ViewParameters::DrawingS << 
878 {                                              << 
879   switch (style) {                             << 
880     case G4ViewParameters::wireframe:          << 
881       os << "wireframe"; break;                << 
882     case G4ViewParameters::hlr:                << 
883       os << "hlr - hidden lines removed"; brea << 
884     case G4ViewParameters::hsr:                << 
885       os << "hsr - hidden surfaces removed"; b << 
886     case G4ViewParameters::hlhsr:              << 
887       os << "hlhsr - hidden line, hidden surfa << 
888     case G4ViewParameters::cloud:              << 
889       os << "cloud - draw volume as a cloud of << 
890     default: os << "unrecognised"; break;      << 
891   }                                            << 
892   return os;                                   << 
893 }                                              << 
894                                                << 
895 std::ostream& operator <<                      << 
896 (std::ostream& os, G4ViewParameters::SMROption << 
897 {                                              << 
898   switch (option) {                            << 
899     case G4ViewParameters::meshAsDefault:      << 
900       os << "default"; break;                  << 
901     case G4ViewParameters::meshAsDots:         << 
902       os << "dots"; break;                     << 
903     case G4ViewParameters::meshAsSurfaces:     << 
904       os << "surfaces"; break;                 << 
905   }                                            << 
906   return os;                                   << 
907 }                                              << 
908                                                << 
909 std::ostream& operator << (std::ostream& os, c << 
910   os << "View parameters and options:";           245   os << "View parameters and options:";
911                                                   246 
912   os << "\n  Drawing style: " << v.fDrawingSty << 247   os << "\n  Drawing style: ";
913                                                << 248   switch (v.fDrawingStyle) {
914   os << "\n  Number of cloud points: " << v.fN << 249   case G4ViewParameters::wireframe:
                                                   >> 250     os << "wireframe"; break;
                                                   >> 251   case G4ViewParameters::hlr:
                                                   >> 252     os << "hlr - hidden lines removed"; break;
                                                   >> 253   case G4ViewParameters::hsr:
                                                   >> 254     os << "hsr - hidden surfaces removed"; break;
                                                   >> 255   case G4ViewParameters::hlhsr:
                                                   >> 256     os << "hlhsr - hidden line, hidden surface removed"; break;
                                                   >> 257   default: os << "unrecognised"; break;
                                                   >> 258   }
915                                                   259 
916   os << "\n  Auxiliary edges: ";               << 260   os << "\n  Representation style: ";
917   if (!v.fAuxEdgeVisible) os << "in";          << 261   switch (v.fRepStyle) {
918   os << "visible";                             << 262   case G4ViewParameters::polyhedron:
                                                   >> 263     os << "polyhedron"; break;
                                                   >> 264   case G4ViewParameters::nurbs:
                                                   >> 265     os << "nurbs"; break;
                                                   >> 266   default: os << "unrecognised"; break;
                                                   >> 267   }
919                                                   268 
920   os << "\n  Culling: ";                          269   os << "\n  Culling: ";
921   if (v.fCulling) os << "on";                     270   if (v.fCulling) os << "on";
922   else            os << "off";                    271   else            os << "off";
923                                                   272 
924   os << "\n  Culling invisible objects: ";        273   os << "\n  Culling invisible objects: ";
925   if (v.fCullInvisible) os << "on";               274   if (v.fCullInvisible) os << "on";
926   else                  os << "off";              275   else                  os << "off";
927                                                   276 
928   os << "\n  Density culling: ";                  277   os << "\n  Density culling: ";
929   if (v.fDensityCulling) {                        278   if (v.fDensityCulling) {
930     os << "on - invisible if density less than    279     os << "on - invisible if density less than "
931        << v.fVisibleDensity / (1. * g / cm3) <    280        << v.fVisibleDensity / (1. * g / cm3) << " g cm^-3";
932   }                                               281   }
933   else os << "off";                               282   else os << "off";
934                                                   283 
935   os << "\n  Culling daughters covered by opaq    284   os << "\n  Culling daughters covered by opaque mothers: ";
936   if (v.fCullCovered) os << "on";                 285   if (v.fCullCovered) os << "on";
937   else                os << "off";                286   else                os << "off";
938                                                   287 
939   os << "\n  Colour by density: ";             << 
940   if (v.fCBDAlgorithmNumber <= 0) {            << 
941     os << "inactive";                          << 
942   } else {                                     << 
943     os << "Algorithm " << v.fCBDAlgorithmNumbe << 
944     for (auto p: v.fCBDParameters) {           << 
945       os << ' ' << G4BestUnit(p,"Volumic Mass" << 
946     }                                          << 
947   }                                            << 
948                                                << 
949   os << "\n  Section flag: ";                     288   os << "\n  Section flag: ";
950   if (v.fSection) os << "true, section/cut pla    289   if (v.fSection) os << "true, section/cut plane: " << v.fSectionPlane;
951   else            os << "false";                  290   else            os << "false";
952                                                   291 
953   if (v.IsCutaway()) {                         << 292   os << "\n  Cutaway flag: ";
954     os << "\n  Cutaway planes: ";              << 293   if (v.fCutaway) {
955     for (size_t i = 0; i < v.fCutawayPlanes.si << 294     os << "true, cutaway planes: ";
                                                   >> 295     for (int i = 0; i < v.fCutawayPlanes.entries (); i++) {
956       os << ' ' << v.fCutawayPlanes[i];           296       os << ' ' << v.fCutawayPlanes[i];
957     }                                             297     }
958   }                                               298   }
959   else {                                          299   else {
960     os << "\n  No cutaway planes";             << 300     os << "false";
961   }                                               301   }
962                                                   302 
963   os << "\n  Explode factor: " << v.fExplodeFa << 303   os << "\n  Explode flag: ";
964      << " about centre: " << v.fExplodeCentre; << 304   if (v.fExplode) os << "true, explode factor: " << v.fExplodeFactor;
                                                   >> 305   else            os << "false";
965                                                   306 
966   os << "\n  No. of sides used in circle polyg    307   os << "\n  No. of sides used in circle polygon approximation: "
967      << v.fNoOfSides;                             308      << v.fNoOfSides;
968                                                   309 
969   os << "\n  Viewpoint direction:  " << v.fVie    310   os << "\n  Viewpoint direction:  " << v.fViewpointDirection;
970                                                   311 
971   os << "\n  Up vector:            " << v.fUpV    312   os << "\n  Up vector:            " << v.fUpVector;
972                                                   313 
973   os << "\n  Field half angle:     " << v.fFie    314   os << "\n  Field half angle:     " << v.fFieldHalfAngle;
974                                                   315 
975   os << "\n  Zoom factor:          " << v.fZoo    316   os << "\n  Zoom factor:          " << v.fZoomFactor;
976                                                   317 
977   os << "\n  Scale factor:         " << v.fSca << 
978                                                << 
979   os << "\n  Current target point: " << v.fCur    318   os << "\n  Current target point: " << v.fCurrentTargetPoint;
980                                                   319 
981   os << "\n  Dolly distance:       " << v.fDol    320   os << "\n  Dolly distance:       " << v.fDolly;
982                                                   321 
983   os << "\n  Light ";                             322   os << "\n  Light ";
984   if (v.fLightsMoveWithCamera) os << "moves";     323   if (v.fLightsMoveWithCamera) os << "moves";
985   else                         os << "does not    324   else                         os << "does not move";
986   os << " with camera";                           325   os << " with camera";
987                                                   326 
988   os << "\n  Relative lightpoint direction: "     327   os << "\n  Relative lightpoint direction: "
989      << v.fRelativeLightpointDirection;           328      << v.fRelativeLightpointDirection;
990                                                   329 
991   os << "\n  Actual lightpoint direction: "       330   os << "\n  Actual lightpoint direction: "
992      << v.fActualLightpointDirection;             331      << v.fActualLightpointDirection;
993                                                   332 
994   os << "\n  Derived parameters for standard v    333   os << "\n  Derived parameters for standard view of object of unit radius:";
995   G4ViewParameters tempVP = v;                    334   G4ViewParameters tempVP = v;
996   tempVP.fDolly = 0.;                             335   tempVP.fDolly = 0.;
997   tempVP.fZoomFactor = 1.;                        336   tempVP.fZoomFactor = 1.;
998   const G4double radius = 1.;                     337   const G4double radius = 1.;
999   const G4double cameraDistance = tempVP.GetCa    338   const G4double cameraDistance = tempVP.GetCameraDistance (radius);
1000   const G4double nearDistance =                  339   const G4double nearDistance =
1001     tempVP.GetNearDistance (cameraDistance, r    340     tempVP.GetNearDistance (cameraDistance, radius);
1002   const G4double farDistance =                   341   const G4double farDistance =
1003     tempVP.GetFarDistance  (cameraDistance, n    342     tempVP.GetFarDistance  (cameraDistance, nearDistance, radius);
1004   const G4double right  = tempVP.GetFrontHalf    343   const G4double right  = tempVP.GetFrontHalfHeight (nearDistance, radius);
1005   os << "\n    Camera distance:   " << camera    344   os << "\n    Camera distance:   " << cameraDistance;
1006   os << "\n    Near distance:     " << nearDi    345   os << "\n    Near distance:     " << nearDistance;
1007   os << "\n    Far distance:      " << farDis    346   os << "\n    Far distance:      " << farDistance;
1008   os << "\n    Front half height: " << right;    347   os << "\n    Front half height: " << right;
1009                                                  348 
                                                   >> 349   os << "\n  View geometry: ";
                                                   >> 350   if (v.fViewGeom) os << "true";
                                                   >> 351   else os << "false";
                                                   >> 352 
                                                   >> 353   os << "\n  View hits    : ";
                                                   >> 354   if (v.fViewHits) os << "true";
                                                   >> 355   else os << "false";
                                                   >> 356 
                                                   >> 357   os << "\n  View digits  : ";
                                                   >> 358   if (v.fViewDigis) os << "true";
                                                   >> 359   else os << "false";
                                                   >> 360 
1010   os << "\n  Default VisAttributes:\n  " << v    361   os << "\n  Default VisAttributes:\n  " << v.fDefaultVisAttributes;
1011                                                  362 
1012   os << "\n  Default TextVisAttributes:\n  "     363   os << "\n  Default TextVisAttributes:\n  " << v.fDefaultTextVisAttributes;
1013                                                  364 
1014   os << "\n  Default marker:\n    " << v.fDef << 365   os << "\n  Default marker: " << v.fDefaultMarker;
1015                                                  366 
1016   os << "\n  Global marker scale: " << v.fGlo    367   os << "\n  Global marker scale: " << v.fGlobalMarkerScale;
1017                                                  368 
1018   os << "\n  Global lineWidth scale: " << v.f << 
1019                                               << 
1020   os << "\n  Marker ";                           369   os << "\n  Marker ";
1021   if (v.fMarkerNotHidden) os << "not ";          370   if (v.fMarkerNotHidden) os << "not ";
1022   os << "hidden by surfaces.";                   371   os << "hidden by surfaces.";
1023                                                  372 
1024   os << "\n  Window size hint: "                 373   os << "\n  Window size hint: "
1025      << v.fWindowSizeHintX << 'x'<< v.fWindow    374      << v.fWindowSizeHintX << 'x'<< v.fWindowSizeHintX;
1026                                                  375 
1027   os << "\n  X geometry string: " << v.fXGeom << 
1028   os << "\n  X geometry mask: "               << 
1029      << std::showbase << std::hex << v.fGeome << 
1030      << std::noshowbase << std::dec;          << 
1031                                               << 
1032   os << "\n  Auto refresh: ";                 << 
1033   if (v.fAutoRefresh) os << "true";           << 
1034   else os << "false";                         << 
1035                                               << 
1036   os << "\n  Background colour: " << v.fBackg << 
1037                                               << 
1038   os << "\n  Picking requested: ";            << 
1039   if (v.fPicking) os << "true";               << 
1040   else os << "false";                         << 
1041                                               << 
1042   os << "\n  Rotation style: ";               << 
1043   switch (v.fRotationStyle) {                 << 
1044   case G4ViewParameters::constrainUpDirection << 
1045     os << "constrainUpDirection (conventional << 
1046   case G4ViewParameters::freeRotation:        << 
1047     os << "freeRotation (Google-like rotation << 
1048   default: os << "unrecognised"; break;       << 
1049   }                                           << 
1050                                               << 
1051   os << "\nVis attributes modifiers: ";       << 
1052   const std::vector<G4ModelingParameters::Vis << 
1053     v.fVisAttributesModifiers;                << 
1054   if (vams.empty()) {                         << 
1055     os << "None";                             << 
1056   } else {                                    << 
1057     os << vams;                               << 
1058   }                                           << 
1059                                               << 
1060   os << "\nTime window parameters:"           << 
1061   << "\n  Start time:  " << v.fStartTime/ns < << 
1062   << "\n  End time:    " << v.fEndTime/ns <<  << 
1063   << "\n  Fade factor: " << v.fFadeFactor;    << 
1064   if (!v.fDisplayHeadTime) {                  << 
1065     os << "\n  Head time display not requeste << 
1066   } else {                                    << 
1067     os                                        << 
1068     << "\n  Head time position: "             << 
1069     << v.fDisplayHeadTimeX << ' ' << v.fDispl << 
1070     << "\n  Head time size:     " << v.fDispl << 
1071     << "\n  Head time colour:   " << v.fDispl << 
1072     << ' ' << v.fDisplayHeadTimeGreen << ' '  << 
1073   }                                           << 
1074   if (!v.fDisplayLightFront) {                << 
1075     os << "\n  Light front display not reques << 
1076   } else {                                    << 
1077     os                                        << 
1078     << "\n  Light front position: "           << 
1079     << v.fDisplayLightFrontX/mm << ' ' << v.f << 
1080     << ' ' << v.fDisplayLightFrontZ/mm << " m << 
1081     << "\n  Light front time:     " << v.fDis << 
1082     << "\n  Light front colour:   " << v.fDis << 
1083     << ' ' << v.fDisplayLightFrontGreen << '  << 
1084   }                                           << 
1085                                               << 
1086   os << "\nSpecial Mesh Rendering";           << 
1087   if (v.fSpecialMeshRendering) {              << 
1088     os << " requested with option \"" << v.fS << 
1089     os << "\" for ";                          << 
1090     if (v.fSpecialMeshVolumes.empty()) {      << 
1091       os << "any mesh";                       << 
1092     } else {                                  << 
1093       os << "selected meshes";                << 
1094       for (const auto& vol: v.fSpecialMeshVol << 
1095   os << "\n    " << vol.GetName() << ':' << v << 
1096       }                                       << 
1097     }                                         << 
1098   } else os << ": off";                       << 
1099   return os;                                     376   return os;
1100 }                                                377 }
1101                                                  378 
1102 G4bool G4ViewParameters::operator != (const G    379 G4bool G4ViewParameters::operator != (const G4ViewParameters& v) const {
1103                                                  380 
1104   // Put performance-sensitive parameters fir    381   // Put performance-sensitive parameters first.
1105   if (                                           382   if (
1106       // This first to optimise spin, etc.       383       // This first to optimise spin, etc.
1107       (fViewpointDirection   != v.fViewpointD    384       (fViewpointDirection   != v.fViewpointDirection)   ||
1108                                                  385 
1109       // No particular order from here on.       386       // No particular order from here on.
1110       (fDrawingStyle         != v.fDrawingSty    387       (fDrawingStyle         != v.fDrawingStyle)         ||
1111       (fNumberOfCloudPoints  != v.fNumberOfCl << 388       (fRepStyle             != v.fRepStyle)             ||
1112       (fAuxEdgeVisible       != v.fAuxEdgeVis << 
1113       (fCulling              != v.fCulling)      389       (fCulling              != v.fCulling)              ||
1114       (fCullInvisible        != v.fCullInvisi    390       (fCullInvisible        != v.fCullInvisible)        ||
1115       (fDensityCulling       != v.fDensityCul    391       (fDensityCulling       != v.fDensityCulling)       ||
1116       (fCullCovered          != v.fCullCovere    392       (fCullCovered          != v.fCullCovered)          ||
1117       (fCBDAlgorithmNumber   != v.fCBDAlgorit << 
1118       (fSection              != v.fSection)      393       (fSection              != v.fSection)              ||
1119       (IsCutaway()           != v.IsCutaway() << 394       (fCutaway              != v.fCutaway)              || 
1120       (IsExplode()           != v.IsExplode() << 395       (fExplode              != v.fExplode)              ||
1121       (fNoOfSides            != v.fNoOfSides)    396       (fNoOfSides            != v.fNoOfSides)            ||
1122       (fUpVector             != v.fUpVector)     397       (fUpVector             != v.fUpVector)             ||
1123       (fFieldHalfAngle       != v.fFieldHalfA    398       (fFieldHalfAngle       != v.fFieldHalfAngle)       ||
1124       (fZoomFactor           != v.fZoomFactor    399       (fZoomFactor           != v.fZoomFactor)           ||
1125       (fScaleFactor          != v.fScaleFacto << 
1126       (fCurrentTargetPoint   != v.fCurrentTar    400       (fCurrentTargetPoint   != v.fCurrentTargetPoint)   ||
1127       (fDolly                != v.fDolly)        401       (fDolly                != v.fDolly)                ||
1128       (fRelativeLightpointDirection != v.fRel    402       (fRelativeLightpointDirection != v.fRelativeLightpointDirection)  ||
1129       (fLightsMoveWithCamera != v.fLightsMove    403       (fLightsMoveWithCamera != v.fLightsMoveWithCamera) ||
                                                   >> 404       (fViewGeom             != v.fViewGeom)             ||
                                                   >> 405       (fViewHits             != v.fViewHits)             ||
                                                   >> 406       (fViewDigis            != v.fViewDigis)            ||
1130       (fDefaultVisAttributes != v.fDefaultVis    407       (fDefaultVisAttributes != v.fDefaultVisAttributes) ||
1131       (fDefaultTextVisAttributes != v.fDefaul    408       (fDefaultTextVisAttributes != v.fDefaultTextVisAttributes) ||
1132       (fDefaultMarker        != v.fDefaultMar    409       (fDefaultMarker        != v.fDefaultMarker)        ||
1133       (fGlobalMarkerScale    != v.fGlobalMark    410       (fGlobalMarkerScale    != v.fGlobalMarkerScale)    ||
1134       (fGlobalLineWidthScale != v.fGlobalLine << 
1135       (fMarkerNotHidden      != v.fMarkerNotH    411       (fMarkerNotHidden      != v.fMarkerNotHidden)      ||
1136       (fWindowSizeHintX      != v.fWindowSize    412       (fWindowSizeHintX      != v.fWindowSizeHintX)      ||
1137       (fWindowSizeHintY      != v.fWindowSize << 413       (fWindowSizeHintY      != v.fWindowSizeHintY))
1138       (fXGeometryString      != v.fXGeometryS << 
1139       (fGeometryMask         != v.fGeometryMa << 
1140       (fAutoRefresh          != v.fAutoRefres << 
1141       (fBackgroundColour     != v.fBackground << 
1142       (fPicking              != v.fPicking)   << 
1143       (fRotationStyle        != v.fRotationSt << 
1144       (fSpecialMeshRendering != v.fSpecialMes << 
1145       (fSpecialMeshRenderingOption != v.fSpec << 
1146       )                                       << 
1147     return true;                                 414     return true;
1148                                                  415 
1149   if (fDensityCulling &&                         416   if (fDensityCulling &&
1150       (fVisibleDensity != v.fVisibleDensity))    417       (fVisibleDensity != v.fVisibleDensity)) return true;
1151                                                  418 
1152   if (fCBDAlgorithmNumber > 0) {              << 
1153     if (fCBDParameters.size() != v.fCBDParame << 
1154     else if (fCBDParameters != v.fCBDParamete << 
1155   }                                           << 
1156                                               << 
1157   if (fSection &&                                419   if (fSection &&
1158       (!(fSectionPlane == v.fSectionPlane)))     420       (!(fSectionPlane == v.fSectionPlane))) return true;
1159                                                  421 
1160   if (IsCutaway()) {                          << 422   if (fCutaway) {
1161     if (fCutawayPlanes.size () != v.fCutawayP << 423     if (fCutawayPlanes.entries () != v.fCutawayPlanes.entries ())
1162       return true;                               424       return true;
1163     else {                                       425     else {
1164       for (size_t i = 0; i < fCutawayPlanes.s << 426       for (int i = 0; i < fCutawayPlanes.entries (); i++) {
1165   if (!(fCutawayPlanes[i] == v.fCutawayPlanes << 427   if (!(fCutawayPlanes (i) == v.fCutawayPlanes (i))) return true;
1166       }                                          428       }
1167     }                                            429     }
1168   }                                              430   }
1169                                                  431 
1170   if (IsExplode() &&                          << 432   if (fExplode &&
1171       ((fExplodeFactor != v.fExplodeFactor) | << 433       (fExplodeFactor != v.fExplodeFactor)) return true;
1172        (fExplodeCentre != v.fExplodeCentre))) << 
1173                                               << 
1174   if (fVisAttributesModifiers != v.fVisAttrib << 
1175                                               << 
1176   if (fStartTime  != v.fStartTime ||          << 
1177       fEndTime    != v.fEndTime   ||          << 
1178       fFadeFactor != v.fFadeFactor) return tr << 
1179                                               << 
1180   if (fDisplayHeadTime != v.fDisplayHeadTime) << 
1181   if (fDisplayHeadTime) {                     << 
1182     if (fDisplayHeadTimeX     != v.fDisplayHe << 
1183         fDisplayHeadTimeY     != v.fDisplayHe << 
1184         fDisplayHeadTimeSize  != v.fDisplayHe << 
1185         fDisplayHeadTimeRed   != v.fDisplayHe << 
1186         fDisplayHeadTimeGreen != v.fDisplayHe << 
1187         fDisplayHeadTimeBlue  != v.fDisplayHe << 
1188       return true;                            << 
1189     }                                         << 
1190   }                                           << 
1191                                               << 
1192   if (fDisplayLightFront != v.fDisplayLightFr << 
1193   if (fDisplayLightFront) {                   << 
1194     if (fDisplayLightFrontX     != v.fDisplay << 
1195         fDisplayLightFrontY     != v.fDisplay << 
1196         fDisplayLightFrontZ     != v.fDisplay << 
1197         fDisplayLightFrontT     != v.fDisplay << 
1198         fDisplayLightFrontRed   != v.fDisplay << 
1199         fDisplayLightFrontGreen != v.fDisplay << 
1200         fDisplayLightFrontBlue  != v.fDisplay << 
1201       return true;                            << 
1202     }                                         << 
1203   }                                           << 
1204                                               << 
1205   if (fSpecialMeshRendering) {                << 
1206     if (fSpecialMeshVolumes != v.fSpecialMesh << 
1207       return true;;                           << 
1208   }                                           << 
1209                                                  434 
1210   return false;                                  435   return false;
1211 }                                             << 
1212                                               << 
1213 void G4ViewParameters::SetXGeometryString (co << 
1214 {                                             << 
1215   const G4String delimiters("xX+-");          << 
1216   G4String::size_type i = geomString.find_fir << 
1217   if (i == G4String::npos) {                  << 
1218     // Does not contain "xX+-".               << 
1219     // Is it a single number?                 << 
1220     std::istringstream iss(geomString);       << 
1221     G4int size;                               << 
1222     iss >> size;                              << 
1223     if (iss) {                                << 
1224       // It is a number                       << 
1225       fWindowSizeHintX = size;                << 
1226       fWindowSizeHintY = size;                << 
1227     }                                         << 
1228     // Accept other or all defaults (in G4Vie << 
1229     // Reconstruct a geometry string coherent << 
1230     char signX, signY;                        << 
1231     if (fWindowLocationHintXNegative) signX = << 
1232     if (fWindowLocationHintYNegative) signY = << 
1233     std::ostringstream oss;                   << 
1234     oss << fWindowSizeHintX << 'x' << fWindow << 
1235     << signX << fWindowLocationHintX << signY << 
1236     fXGeometryString = oss.str();             << 
1237     return;                                   << 
1238   }                                           << 
1239                                               << 
1240   // Assume it's a parseable X geometry strin << 
1241   G4int x = 0, y = 0;                         << 
1242   unsigned int w = 0, h = 0;                  << 
1243   fGeometryMask = ParseGeometry( geomString,  << 
1244                                               << 
1245   // Handle special case :                    << 
1246   if ((fGeometryMask & fYValue) == 0)         << 
1247     {  // Using default                       << 
1248       y =  fWindowLocationHintY;              << 
1249     }                                         << 
1250   if ((fGeometryMask & fXValue) == 0)         << 
1251     {  // Using default                       << 
1252       x =  fWindowLocationHintX;              << 
1253     }                                         << 
1254                                               << 
1255   // Check errors                             << 
1256   // if there is no Width and Height          << 
1257   if ( ((fGeometryMask & fHeightValue) == 0 ) << 
1258        ((fGeometryMask & fWidthValue)  == 0 ) << 
1259     h = fWindowSizeHintY;                     << 
1260     w = fWindowSizeHintX;                     << 
1261   } else  if ((fGeometryMask & fHeightValue)  << 
1262                                               << 
1263     // if there is only Width. Special case t << 
1264     // We set Width and Height the same to ob << 
1265                                               << 
1266     G4warn << "Unrecognised geometry string \ << 
1267            << geomString                      << 
1268            << "\".  No Height found. Using Wi << 
1269            << G4endl;                         << 
1270     h = w;                                    << 
1271   }                                           << 
1272   if ( ((fGeometryMask & fXValue) == 0 ) ||   << 
1273        ((fGeometryMask & fYValue)  == 0 )) {  << 
1274     //Using defaults                          << 
1275     x = fWindowLocationHintX;                 << 
1276     y = fWindowLocationHintY;                 << 
1277   }                                           << 
1278   // Set the string                           << 
1279   fXGeometryString = geomString;              << 
1280                                               << 
1281   // Set values                               << 
1282   fWindowSizeHintX = w;                       << 
1283   fWindowSizeHintY = h;                       << 
1284   fWindowLocationHintX = x;                   << 
1285   fWindowLocationHintY = y;                   << 
1286                                               << 
1287   if ( ((fGeometryMask & fXValue)) &&         << 
1288        ((fGeometryMask & fYValue))) {         << 
1289                                               << 
1290     if ( (fGeometryMask & fXNegative) ) {     << 
1291       fWindowLocationHintXNegative = true;    << 
1292     } else {                                  << 
1293       fWindowLocationHintXNegative = false;   << 
1294     }                                         << 
1295     if ( (fGeometryMask & fYNegative) ) {     << 
1296     fWindowLocationHintYNegative = true;      << 
1297     } else {                                  << 
1298       fWindowLocationHintYNegative = false;   << 
1299     }                                         << 
1300   }                                           << 
1301 }                                             << 
1302                                               << 
1303 G4int G4ViewParameters::GetWindowAbsoluteLoca << 
1304   if ( fWindowLocationHintXNegative ) {       << 
1305     return  sizeX  + fWindowLocationHintX - f << 
1306   }                                           << 
1307   return fWindowLocationHintX;                << 
1308 }                                             << 
1309                                               << 
1310 G4int G4ViewParameters::GetWindowAbsoluteLoca << 
1311   if (  fWindowLocationHintYNegative ) {      << 
1312     return  sizeY  + fWindowLocationHintY - f << 
1313   }                                           << 
1314   return fWindowLocationHintY;                << 
1315 }                                             << 
1316                                               << 
1317 /* Keep from :                                << 
1318  * ftp://ftp.trolltech.com/qt/source/qt-embed << 
1319  *                                            << 
1320  *    ParseGeometry parses strings of the for << 
1321  *   "=<width>x<height>{+-}<xoffset>{+-}<yoff << 
1322  *   width, height, xoffset, and yoffset are  << 
1323  *   Example:  "=80x24+300-49"                << 
1324  *   The equal sign is optional.              << 
1325  *   It returns a bitmask that indicates whic << 
1326  *   were actually found in the string. For e << 
1327  *   the corresponding argument is updated;   << 
1328  *   not found, the corresponding argument is << 
1329  */                                           << 
1330                                               << 
1331 int G4ViewParameters::ParseGeometry (         << 
1332  const char *string,                          << 
1333  G4int *x,                                    << 
1334  G4int *y,                                    << 
1335  unsigned int *width,                         << 
1336  unsigned int *height)                        << 
1337 {                                             << 
1338                                               << 
1339   G4int mask = fNoValue;                      << 
1340   char *strind;                               << 
1341   unsigned int tempWidth  = 0;                << 
1342   unsigned int tempHeight = 0;                << 
1343   G4int tempX = 0;                            << 
1344   G4int tempY = 0;                            << 
1345   char *nextCharacter;                        << 
1346   if ( (string == NULL) || (*string == '\0')) << 
1347     return(mask);                             << 
1348   }                                           << 
1349   if (*string == '=')                         << 
1350     string++;  /* ignore possible '=' at beg  << 
1351   strind = (char *)string;                    << 
1352   if (*strind != '+' && *strind != '-' && *st << 
1353     tempWidth = ReadInteger(strind, &nextChar << 
1354     if (strind == nextCharacter)              << 
1355       return (0);                             << 
1356     strind = nextCharacter;                   << 
1357     mask |= fWidthValue;                      << 
1358   }                                           << 
1359   if (*strind == 'x' || *strind == 'X') {     << 
1360     strind++;                                 << 
1361     tempHeight = ReadInteger(strind, &nextCha << 
1362     if (strind == nextCharacter)              << 
1363       return (0);                             << 
1364     strind = nextCharacter;                   << 
1365     mask |= fHeightValue;                     << 
1366   }                                           << 
1367                                               << 
1368   if ((*strind == '+') || (*strind == '-')) { << 
1369     if (*strind == '-') {                     << 
1370       strind++;                               << 
1371       tempX = -ReadInteger(strind, &nextChara << 
1372       if (strind == nextCharacter)            << 
1373         return (0);                           << 
1374       strind = nextCharacter;                 << 
1375       mask |= fXNegative;                     << 
1376                                               << 
1377     }                                         << 
1378     else                                      << 
1379       { strind++;                             << 
1380         tempX = ReadInteger(strind, &nextChar << 
1381         if (strind == nextCharacter)          << 
1382           return(0);                          << 
1383         strind = nextCharacter;               << 
1384       }                                       << 
1385     mask |= fXValue;                          << 
1386     if ((*strind == '+') || (*strind == '-')) << 
1387       if (*strind == '-') {                   << 
1388         strind++;                             << 
1389         tempY = -ReadInteger(strind, &nextCha << 
1390         if (strind == nextCharacter)          << 
1391           return(0);                          << 
1392         strind = nextCharacter;               << 
1393         mask |= fYNegative;                   << 
1394       }                                       << 
1395       else                                    << 
1396         {                                     << 
1397           strind++;                           << 
1398           tempY = ReadInteger(strind, &nextCh << 
1399           if (strind == nextCharacter)        << 
1400             return(0);                        << 
1401           strind = nextCharacter;             << 
1402         }                                     << 
1403       mask |= fYValue;                        << 
1404     }                                         << 
1405   }                                           << 
1406   /* If strind isn't at the end of the string << 
1407      geometry specification. */               << 
1408   if (*strind != '\0') return (0);            << 
1409   if (mask & fXValue)                         << 
1410     *x = tempX;                               << 
1411   if (mask & fYValue)                         << 
1412     *y = tempY;                               << 
1413   if (mask & fWidthValue)                     << 
1414     *width = tempWidth;                       << 
1415   if (mask & fHeightValue)                    << 
1416     *height = tempHeight;                     << 
1417   return (mask);                              << 
1418 }                                             << 
1419                                               << 
1420 /* Keep from :                                << 
1421  * ftp://ftp.trolltech.com/qt/source/qt-embed << 
1422  *                                            << 
1423  */                                           << 
1424 G4int G4ViewParameters::ReadInteger(char *str << 
1425 {                                             << 
1426     G4int Result = 0;                         << 
1427     G4int Sign = 1;                           << 
1428                                               << 
1429     if (*string == '+')                       << 
1430   string++;                                   << 
1431     else if (*string == '-')                  << 
1432     {                                         << 
1433   string++;                                   << 
1434   Sign = -1;                                  << 
1435     }                                         << 
1436     for (; (*string >= '0') && (*string <= '9 << 
1437     {                                         << 
1438   Result = (Result * 10) + (*string - '0');   << 
1439     }                                         << 
1440     *NextString = string;                     << 
1441     if (Sign >= 0)                            << 
1442   return (Result);                            << 
1443     else                                      << 
1444   return (-Result);                           << 
1445 }                                             << 
1446                                               << 
1447 G4ViewParameters* G4ViewParameters::CatmullRo << 
1448 (const std::vector<G4ViewParameters>& views,  << 
1449  G4int nInterpolationPoints)  // No of interp << 
1450 {                                             << 
1451   // Returns a null pointer when no more to b << 
1452   // do {                                     << 
1453   //   G4ViewParameters* vp =                 << 
1454   //   G4ViewParameters::CatmullRomCubicSplin << 
1455   //   if (!vp) break;                        << 
1456   //     ...                                  << 
1457   // } while (true);                          << 
1458                                               << 
1459   // See https://en.wikipedia.org/wiki/Cubic_ << 
1460                                               << 
1461   // Assumes equal intervals                  << 
1462                                               << 
1463   if (views.size() < 2) {                     << 
1464     G4Exception                               << 
1465     ("G4ViewParameters::CatmullRomCubicSpline << 
1466      "visman0301", JustWarning,               << 
1467      "There must be at least two views.");    << 
1468     return 0;                                 << 
1469   }                                           << 
1470                                               << 
1471   if (nInterpolationPoints < 1) {             << 
1472     G4Exception                               << 
1473     ("G4ViewParameters::CatmullRomCubicSpline << 
1474      "visman0302", JustWarning,               << 
1475      "Number of interpolation points cannot b << 
1476     return 0;                                 << 
1477   }                                           << 
1478                                               << 
1479   const size_t nIntervals = views.size() - 1; << 
1480   const G4double dt = 1./nInterpolationPoints << 
1481                                               << 
1482   static G4ViewParameters holdingValues;      << 
1483   static G4double t = 0.;  // 0. <= t <= 1.   << 
1484   static G4int iInterpolationPoint = 0;       << 
1485   static size_t iInterval = 0;                << 
1486                                               << 
1487 //  G4cout << "Interval " << iInterval << ",  << 
1488                                               << 
1489   // Hermite polynomials.                     << 
1490   const G4double h00 = 2.*t*t*t - 3.*t*t +1;  << 
1491   const G4double h10 = t*t*t -2.*t*t + t;     << 
1492   const G4double h01 = -2.*t*t*t + 3.*t*t;    << 
1493   const G4double h11 = t*t*t - t*t;           << 
1494                                               << 
1495   // Aliases (to simplify code)               << 
1496   const size_t& n = nIntervals;               << 
1497   size_t& i = iInterval;                      << 
1498   const std::vector<G4ViewParameters>& v = vi << 
1499                                               << 
1500   // The Catmull-Rom cubic spline prescriptio << 
1501   // Slope at first way point is v[1] - v[0]. << 
1502   // Slope at last way point is v[n] - v[n-1] << 
1503   // Otherwise slope at way point i is 0.5*(v << 
1504   // Result = h00*v[i] + h10*m[i] + h01*v[i+1 << 
1505   // where m[i] amd m[i+1] are the slopes at  << 
1506   // of the interval for the particular value << 
1507   // If (n == 1), linear interpolation result << 
1508   // If (n == 2), quadratic interpolation res << 
1509                                               << 
1510   // Working variables                        << 
1511   G4double mi, mi1, real, x, y, z;            << 
1512                                               << 
1513   // First, a crude interpolation of all para << 
1514   // smooth interpolation of those for which  << 
1515   holdingValues = t < 0.5? v[i]: v[i+1];      << 
1516                                               << 
1517   // Catmull-Rom cubic spline interpolation   << 
1518 #define INTERPOLATE(param) \                  << 
1519 /* This works out the interpolated param in i << 
1520 /* Assumes n >= 1 */ \                        << 
1521 if (i == 0) { \                               << 
1522 /* First interval */ \                        << 
1523 mi = v[1].param - v[0].param; \               << 
1524 /* If there is only one interval, make start  << 
1525 /* (This results in a linear interpolation) * << 
1526 if (n == 1) mi1 = mi; \                       << 
1527 /* else the end slope of the interval takes a << 
1528 else mi1 = 0.5 * (v[2].param - v[0].param); \ << 
1529 } else if (i >= n - 1) { \                    << 
1530 /* Similarly for last interval */ \           << 
1531 mi1 = v[i+1].param - v[i].param; \            << 
1532 /* If there is only one interval, make start  << 
1533 if (n == 1) mi = mi1; \                       << 
1534 /* else the start slope of the interval takes << 
1535 else mi = 0.5 * (v[i+1].param - v[i-1].param) << 
1536 } else { \                                    << 
1537 /* Full Catmull-Rom slopes use previous AND n << 
1538 mi  = 0.5 * (v[i+1].param - v[i-1].param); \  << 
1539 mi1 = 0.5 * (v[i+2].param - v[i  ].param); \  << 
1540 } \                                           << 
1541 real = h00 * v[i].param + h10 * mi + h01 * v[ << 
1542                                               << 
1543 #define INTERPOLATELOG(param) \               << 
1544 if (i == 0) { \                               << 
1545 mi = std::log(v[1].param) - std::log(v[0].par << 
1546 if (n == 1) mi1 = mi; \                       << 
1547 else mi1 = 0.5 * (std::log(v[2].param) - std: << 
1548 } else if (i >= n - 1) { \                    << 
1549 mi1 = std::log(v[i+1].param) - std::log(v[i]. << 
1550 if (n == 1) mi = mi1; \                       << 
1551 else mi = 0.5 * (std::log(v[i+1].param) - std << 
1552 } else { \                                    << 
1553 mi  = 0.5 * (std::log(v[i+1].param) - std::lo << 
1554 mi1 = 0.5 * (std::log(v[i+2].param) - std::lo << 
1555 } \                                           << 
1556 real = std::exp(h00 * std::log(v[i].param) +  << 
1557                                               << 
1558   // Real parameters                          << 
1559   INTERPOLATE(fVisibleDensity);               << 
1560   if (real < 0.) real = 0.;                   << 
1561   holdingValues.fVisibleDensity = real;       << 
1562   INTERPOLATELOG(fExplodeFactor);             << 
1563   holdingValues.fExplodeFactor = real;        << 
1564   INTERPOLATE(fFieldHalfAngle);               << 
1565   if (real < 0.) real = 0.;                   << 
1566   holdingValues.fFieldHalfAngle = real;       << 
1567   INTERPOLATELOG(fZoomFactor);                << 
1568   holdingValues.fZoomFactor = real;           << 
1569   INTERPOLATE(fDolly);                        << 
1570   holdingValues.fDolly = real;                << 
1571   INTERPOLATE(fGlobalMarkerScale);            << 
1572   if (real < 0.) real = 0.;                   << 
1573   holdingValues.fGlobalMarkerScale = real;    << 
1574   INTERPOLATE(fGlobalLineWidthScale);         << 
1575   if (real < 0.) real = 0.;                   << 
1576   holdingValues.fGlobalLineWidthScale = real; << 
1577                                               << 
1578   // Unit vectors                             << 
1579 #define INTERPOLATEUNITVECTOR(vector) \       << 
1580 INTERPOLATE(vector.x()); x = real; \          << 
1581 INTERPOLATE(vector.y()); y = real; \          << 
1582 INTERPOLATE(vector.z()); z = real;            << 
1583   INTERPOLATEUNITVECTOR(fViewpointDirection); << 
1584   holdingValues.fViewpointDirection           << 
1585   INTERPOLATEUNITVECTOR(fUpVector);           << 
1586   holdingValues.fUpVector                     << 
1587   INTERPOLATEUNITVECTOR(fRelativeLightpointDi << 
1588   holdingValues.fRelativeLightpointDirection  << 
1589   INTERPOLATEUNITVECTOR(fActualLightpointDire << 
1590   holdingValues.fActualLightpointDirection    << 
1591                                               << 
1592   // Un-normalised vectors                    << 
1593 #define INTERPOLATEVECTOR(vector) \           << 
1594 INTERPOLATE(vector.x()); x = real; \          << 
1595 INTERPOLATE(vector.y()); y = real; \          << 
1596 INTERPOLATE(vector.z()); z = real;            << 
1597   INTERPOLATEVECTOR(fScaleFactor);            << 
1598   holdingValues.fScaleFactor = G4Vector3D(x,y << 
1599                                               << 
1600   // Points                                   << 
1601 #define INTERPOLATEPOINT(point) \             << 
1602 INTERPOLATE(point.x()); x = real; \           << 
1603 INTERPOLATE(point.y()); y = real; \           << 
1604 INTERPOLATE(point.z()); z = real;             << 
1605   INTERPOLATEPOINT(fExplodeCentre);           << 
1606   holdingValues.fExplodeCentre      = G4Point << 
1607   INTERPOLATEPOINT(fCurrentTargetPoint);      << 
1608   holdingValues.fCurrentTargetPoint = G4Point << 
1609                                               << 
1610   // Colour                                   << 
1611   G4double red, green, blue, alpha;           << 
1612 #define INTERPOLATECOLOUR(colour) \           << 
1613 INTERPOLATE(colour.GetRed());   red   = real; << 
1614 INTERPOLATE(colour.GetGreen()); green = real; << 
1615 INTERPOLATE(colour.GetBlue());  blue  = real; << 
1616 INTERPOLATE(colour.GetAlpha()); alpha = real; << 
1617   INTERPOLATECOLOUR(fBackgroundColour);       << 
1618   // Components are clamped to 0. <= componen << 
1619   holdingValues.fBackgroundColour = G4Colour( << 
1620                                               << 
1621   // For some parameters we need to check som << 
1622   G4bool continuous;                          << 
1623 #define CONTINUITY(quantity) \                << 
1624   continuous = false; \                       << 
1625   /* This follows the logic of the INTERPOLAT << 
1626   if (i == 0) { \                             << 
1627     if (v[1].quantity == v[0].quantity) { \   << 
1628        if (n == 1) continuous = true; \       << 
1629        else if (v[2].quantity == v[0].quantit << 
1630        continuous = true; \                   << 
1631     } \                                       << 
1632   } else if (i >= n - 1) { \                  << 
1633     if (v[i+1].quantity == v[i].quantity) { \ << 
1634       if (n == 1) continuous = true; \        << 
1635       else if (v[i+1].quantity == v[i-1].quan << 
1636       continuous = true; \                    << 
1637     } \                                       << 
1638   } else { \                                  << 
1639     if (v[i-1].quantity == v[i].quantity && \ << 
1640         v[i+1].quantity == v[i].quantity && \ << 
1641         v[i+2].quantity == v[i].quantity) \   << 
1642     continuous = true; \                      << 
1643   }                                           << 
1644                                               << 
1645   G4double a, b, c, d;                        << 
1646 #define INTERPOLATEPLANE(plane) \             << 
1647 INTERPOLATE(plane.a()); a = real; \           << 
1648 INTERPOLATE(plane.b()); b = real; \           << 
1649 INTERPOLATE(plane.c()); c = real; \           << 
1650 INTERPOLATE(plane.d()); d = real;             << 
1651                                               << 
1652   // Section plane                            << 
1653   CONTINUITY(fSection);                       << 
1654   if (continuous) {                           << 
1655     INTERPOLATEPLANE(fSectionPlane);          << 
1656     holdingValues.fSectionPlane = G4Plane3D(a << 
1657   }                                           << 
1658                                               << 
1659   // Cutaway planes                           << 
1660   if (v[i].fCutawayPlanes.size()) {           << 
1661     CONTINUITY(fCutawayPlanes.size());        << 
1662     if (continuous) {                         << 
1663       for (size_t j = 0; j < v[i].fCutawayPla << 
1664         INTERPOLATEPLANE(fCutawayPlanes[j]);  << 
1665         holdingValues.fCutawayPlanes[j] = G4P << 
1666       }                                       << 
1667     }                                         << 
1668   }                                           << 
1669                                               << 
1670   // Vis attributes modifiers                 << 
1671   // Really, we are only interested in colour << 
1672   // the "crude" interpolation that is guaran << 
1673   static G4VisAttributes workingVA;           << 
1674   if  (v[i].fVisAttributesModifiers.size()) { << 
1675     CONTINUITY(fVisAttributesModifiers.size() << 
1676     if (continuous) {                         << 
1677       for (size_t j = 0; j < v[i].fVisAttribu << 
1678         CONTINUITY(fVisAttributesModifiers[j] << 
1679         if (continuous) {                     << 
1680           CONTINUITY(fVisAttributesModifiers[ << 
1681           if (continuous) {                   << 
1682             if (v[i].fVisAttributesModifiers[ << 
1683                 G4ModelingParameters::VASColo << 
1684               INTERPOLATECOLOUR(fVisAttribute << 
1685               workingVA = v[i].fVisAttributes << 
1686               workingVA.SetColour(G4Colour(re << 
1687               holdingValues.fVisAttributesMod << 
1688             }                                 << 
1689           }                                   << 
1690         }                                     << 
1691       }                                       << 
1692     }                                         << 
1693   }                                           << 
1694                                               << 
1695   // Time window parameters (for showing part << 
1696   // Only two parameters are interpolated. Th << 
1697   // once and for all by the user for a given << 
1698   // if not, they will be interpolated by the << 
1699   INTERPOLATE(fStartTime)                     << 
1700   holdingValues.fStartTime = real;            << 
1701   INTERPOLATE(fEndTime)                       << 
1702   holdingValues.fEndTime = real;              << 
1703                                               << 
1704   // Increment counters                       << 
1705   iInterpolationPoint++;                      << 
1706   t += dt;                                    << 
1707   if (iInterpolationPoint > nInterpolationPoi << 
1708     iInterpolationPoint = 1;  // Ready for ne << 
1709     t = dt;                                   << 
1710     iInterval++;                              << 
1711   }                                           << 
1712   if (iInterval >= nIntervals) {              << 
1713     iInterpolationPoint = 0;  // Ready for a  << 
1714     t = 0.;                                   << 
1715     iInterval = 0;                            << 
1716     return 0;                                 << 
1717   }                                           << 
1718                                               << 
1719   return &holdingValues;                      << 
1720 }                                                436 }
1721                                                  437