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 10.0.p3)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 //                                                 26 //
                                                   >>  27 // $Id: G4ViewParameters.cc 81903 2014-06-06 13:52:37Z gcosmo $
 27 //                                                 28 //
 28 //                                                 29 // 
 29 // John Allison  19th July 1996                    30 // John Allison  19th July 1996
 30 // View parameters and options.                    31 // View parameters and options.
 31                                                    32 
                                                   >>  33 #include <sstream>
                                                   >>  34 
 32 #include "G4ViewParameters.hh"                     35 #include "G4ViewParameters.hh"
 33                                                    36 
 34 #include "G4VisManager.hh"                         37 #include "G4VisManager.hh"
 35 #include "G4VPhysicalVolume.hh"                << 
 36 #include "G4UnitsTable.hh"                         38 #include "G4UnitsTable.hh"
 37 #include "G4SystemOfUnits.hh"                      39 #include "G4SystemOfUnits.hh"
 38 #include "G4Polyhedron.hh"                     <<  40 #include "G4ios.hh"
 39                                                << 
 40 #include <sstream>                             << 
 41 #include <cmath>                               << 
 42                                                << 
 43 #define G4warn G4cout                          << 
 44                                                    41 
 45 G4ViewParameters::G4ViewParameters ():             42 G4ViewParameters::G4ViewParameters ():
 46   fDrawingStyle (wireframe),                       43   fDrawingStyle (wireframe),
 47   fNumberOfCloudPoints(10000),                 << 
 48   fAuxEdgeVisible (false),                         44   fAuxEdgeVisible (false),
 49   fCulling (true),                                 45   fCulling (true),
 50   fCullInvisible (true),                           46   fCullInvisible (true),
 51   fDensityCulling (false),                         47   fDensityCulling (false),
 52   fVisibleDensity (0.01 * g / cm3),                48   fVisibleDensity (0.01 * g / cm3),
 53   fCullCovered (false),                            49   fCullCovered (false),
 54   fCBDAlgorithmNumber (0),                     << 
 55   fSection (false),                                50   fSection (false),
 56   fSectionPlane (),                                51   fSectionPlane (),
 57   fCutawayMode (cutawayUnion),                     52   fCutawayMode (cutawayUnion),
 58   fCutawayPlanes (),                               53   fCutawayPlanes (),
 59   fExplodeFactor (1.),                             54   fExplodeFactor (1.),
 60   fNoOfSides (),                               <<  55   fNoOfSides (24),
 61   fViewpointDirection (G4Vector3D (0., 0., 1.)     56   fViewpointDirection (G4Vector3D (0., 0., 1.)),  // On z-axis.
 62   fUpVector (G4Vector3D (0., 1., 0.)),             57   fUpVector (G4Vector3D (0., 1., 0.)),            // y-axis up.
 63   fFieldHalfAngle (0.),                            58   fFieldHalfAngle (0.),                           // Orthogonal projection.
 64   fZoomFactor (1.),                                59   fZoomFactor (1.),
 65   fScaleFactor (G4Vector3D (1., 1., 1.)),          60   fScaleFactor (G4Vector3D (1., 1., 1.)),
 66   fCurrentTargetPoint (),                          61   fCurrentTargetPoint (),
 67   fDolly (0.),                                     62   fDolly (0.),
 68   fLightsMoveWithCamera (false),                   63   fLightsMoveWithCamera (false),
 69   fRelativeLightpointDirection (G4Vector3D (1.     64   fRelativeLightpointDirection (G4Vector3D (1., 1., 1.)),
 70   fActualLightpointDirection (G4Vector3D (1.,      65   fActualLightpointDirection (G4Vector3D (1., 1., 1.)),
 71   fDefaultVisAttributes (),                        66   fDefaultVisAttributes (),
 72   fDefaultTextVisAttributes (G4Colour (0., 0.,     67   fDefaultTextVisAttributes (G4Colour (0., 0., 1.)),
 73   fDefaultMarker (),                               68   fDefaultMarker (),
 74   fGlobalMarkerScale (1.),                         69   fGlobalMarkerScale (1.),
 75   fGlobalLineWidthScale (1.),                      70   fGlobalLineWidthScale (1.),
 76   fMarkerNotHidden (true),                         71   fMarkerNotHidden (true),
 77   fWindowSizeHintX (600),                          72   fWindowSizeHintX (600),
 78   fWindowSizeHintY (600),                          73   fWindowSizeHintY (600),
 79   fWindowLocationHintX(0),                         74   fWindowLocationHintX(0),
 80   fWindowLocationHintY(0),                         75   fWindowLocationHintY(0),
 81   fWindowLocationHintXNegative(true),              76   fWindowLocationHintXNegative(true),
 82   fWindowLocationHintYNegative(false),             77   fWindowLocationHintYNegative(false),
 83   fGeometryMask(0),                                78   fGeometryMask(0),
 84   fAutoRefresh (false),                            79   fAutoRefresh (false),
 85   fBackgroundColour (G4Colour(0.,0.,0.)),          80   fBackgroundColour (G4Colour(0.,0.,0.)),         // Black
 86   fPicking (false),                                81   fPicking (false),
 87   fRotationStyle (constrainUpDirection),       <<  82   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 {                                                  83 {
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.);               84   fDefaultMarker.SetScreenSize (5.);
119   // Markers are 5 pixels "overall" size, i.e.     85   // Markers are 5 pixels "overall" size, i.e., diameter.
120 }                                                  86 }
121                                                    87 
122 G4ViewParameters::~G4ViewParameters () {}          88 G4ViewParameters::~G4ViewParameters () {}
123                                                    89 
124 void G4ViewParameters::MultiplyScaleFactor         90 void G4ViewParameters::MultiplyScaleFactor
125 (const G4Vector3D& scaleFactorMultiplier) {        91 (const G4Vector3D& scaleFactorMultiplier) {
126   fScaleFactor.setX(fScaleFactor.x() * scaleFa     92   fScaleFactor.setX(fScaleFactor.x() * scaleFactorMultiplier.x());
127   fScaleFactor.setY(fScaleFactor.y() * scaleFa     93   fScaleFactor.setY(fScaleFactor.y() * scaleFactorMultiplier.y());
128   fScaleFactor.setZ(fScaleFactor.z() * scaleFa     94   fScaleFactor.setZ(fScaleFactor.z() * scaleFactorMultiplier.z());
129 }                                                  95 }
130                                                    96 
131 G4Vector3D& G4ViewParameters::GetActualLightpo     97 G4Vector3D& G4ViewParameters::GetActualLightpointDirection () {
132   SetViewAndLights (fViewpointDirection);          98   SetViewAndLights (fViewpointDirection);
133   return fActualLightpointDirection;               99   return fActualLightpointDirection;
134 }                                                 100 }
135                                                   101 
136 // Useful quantities - begin snippet.             102 // Useful quantities - begin snippet.
137 // Here Follow functions to evaluate the above    103 // Here Follow functions to evaluate the above algorithms as a
138 // function of the radius of the Bounding Sphe    104 // function of the radius of the Bounding Sphere of the object being
139 // viewed.  Call them in the order given - for    105 // viewed.  Call them in the order given - for efficiency, later
140 // functions depend on the results of earlier     106 // functions depend on the results of earlier ones (Store the
141 // results of earlier functions in your own te    107 // results of earlier functions in your own temporary variables -
142 // see, for example, G4OpenGLView::SetView ().    108 // see, for example, G4OpenGLView::SetView ().)
143                                                   109 
144 G4double G4ViewParameters::GetCameraDistance (    110 G4double G4ViewParameters::GetCameraDistance (G4double radius) const {
145   G4double cameraDistance;                        111   G4double cameraDistance;
146   if (fFieldHalfAngle == 0.) {                    112   if (fFieldHalfAngle == 0.) {
147     cameraDistance = radius;                      113     cameraDistance = radius;
148   }                                               114   }
149   else {                                          115   else {
150     cameraDistance = radius / std::sin (fField    116     cameraDistance = radius / std::sin (fFieldHalfAngle) - fDolly;
151   }                                               117   }
152   return cameraDistance;                          118   return cameraDistance;
153 }                                                 119 }
154                                                   120 
155 G4double G4ViewParameters::GetNearDistance (G4    121 G4double G4ViewParameters::GetNearDistance (G4double cameraDistance,
156               G4double radius) const {            122               G4double radius) const {
157   const G4double small = 1.e-6 * radius;          123   const G4double small = 1.e-6 * radius;
158   G4double nearDistance = cameraDistance - rad    124   G4double nearDistance = cameraDistance - radius;
159   if (nearDistance < small) nearDistance = sma    125   if (nearDistance < small) nearDistance = small;
160   return nearDistance;                            126   return nearDistance;
161 }                                                 127 }
162                                                   128 
163 G4double G4ViewParameters::GetFarDistance (G4d    129 G4double G4ViewParameters::GetFarDistance (G4double cameraDistance,
164              G4double nearDistance,               130              G4double nearDistance,
165              G4double radius) const {             131              G4double radius) const {
166   G4double farDistance = cameraDistance + radi    132   G4double farDistance = cameraDistance + radius;
167   if (farDistance < nearDistance) farDistance     133   if (farDistance < nearDistance) farDistance = nearDistance;
168   return farDistance;                             134   return farDistance;
169 }                                                 135 }
170                                                   136 
171 G4double G4ViewParameters::GetFrontHalfHeight     137 G4double G4ViewParameters::GetFrontHalfHeight (G4double nearDistance,
172                  G4double radius) const {         138                  G4double radius) const {
173   G4double frontHalfHeight;                       139   G4double frontHalfHeight;
174   if (fFieldHalfAngle == 0.) {                    140   if (fFieldHalfAngle == 0.) {
175     frontHalfHeight = radius / fZoomFactor;       141     frontHalfHeight = radius / fZoomFactor;
176   }                                               142   }
177   else {                                          143   else {
178     frontHalfHeight = nearDistance * std::tan     144     frontHalfHeight = nearDistance * std::tan (fFieldHalfAngle) / fZoomFactor;
179   }                                               145   }
180   return frontHalfHeight;                         146   return frontHalfHeight;
181 }                                                 147 }
182 // Useful quantities - end snippet.               148 // Useful quantities - end snippet.
183                                                   149 
184 void G4ViewParameters::AddCutawayPlane (const     150 void G4ViewParameters::AddCutawayPlane (const G4Plane3D& cutawayPlane) {
185   if (fCutawayPlanes.size () < 3 ) {              151   if (fCutawayPlanes.size () < 3 ) {
186     fCutawayPlanes.push_back (cutawayPlane);      152     fCutawayPlanes.push_back (cutawayPlane);
187   }                                               153   }
188   else {                                          154   else {
189     G4warn <<                                  << 155     G4cout <<
190       "ERROR: G4ViewParameters::AddCutawayPlan    156       "ERROR: G4ViewParameters::AddCutawayPlane:"
191       "\n  A maximum of 3 cutaway planes suppo    157       "\n  A maximum of 3 cutaway planes supported." << G4endl;
192   }                                               158   }
193 }                                                 159 }
194                                                   160 
195 void G4ViewParameters::ChangeCutawayPlane         161 void G4ViewParameters::ChangeCutawayPlane
196 (size_t index, const G4Plane3D& cutawayPlane)     162 (size_t index, const G4Plane3D& cutawayPlane) {
197   if (index >= fCutawayPlanes.size()) {           163   if (index >= fCutawayPlanes.size()) {
198     G4warn <<                                  << 164     G4cout <<
199       "ERROR: G4ViewParameters::ChangeCutawayP    165       "ERROR: G4ViewParameters::ChangeCutawayPlane:"
200       "\n  Plane " << index << " does not exis    166       "\n  Plane " << index << " does not exist." << G4endl;
201   } else {                                        167   } else {
202     fCutawayPlanes[index] = cutawayPlane;         168     fCutawayPlanes[index] = cutawayPlane;
203   }                                               169   }
204 }                                                 170 }
205                                                   171 
206 void G4ViewParameters::SetVisibleDensity (G4do    172 void G4ViewParameters::SetVisibleDensity (G4double visibleDensity) {
207   const G4double reasonableMaximum = 10.0 * g     173   const G4double reasonableMaximum = 10.0 * g / cm3;
208   if (visibleDensity < 0) {                       174   if (visibleDensity < 0) {
209     G4warn << "G4ViewParameters::SetVisibleDen << 175     G4cout << "G4ViewParameters::SetVisibleDensity: attempt to set negative "
210       "density - ignored." << G4endl;             176       "density - ignored." << G4endl;
211   }                                               177   }
212   else {                                          178   else {
213     if (visibleDensity > reasonableMaximum) {     179     if (visibleDensity > reasonableMaximum) {
214       G4warn << "G4ViewParameters::SetVisibleD << 180       G4cout << "G4ViewParameters::SetVisibleDensity: density > "
215        << G4BestUnit (reasonableMaximum, "Volu    181        << G4BestUnit (reasonableMaximum, "Volumic Mass")
216        << " - did you mean this?"                 182        << " - did you mean this?"
217        << G4endl;                                 183        << G4endl;
218     }                                             184     }
219     fVisibleDensity = visibleDensity;             185     fVisibleDensity = visibleDensity;
220   }                                               186   }
221 }                                                 187 }
222                                                   188 
223 G4int G4ViewParameters::SetNoOfSides (G4int nS    189 G4int G4ViewParameters::SetNoOfSides (G4int nSides) {
224   const G4int nSidesMin = fDefaultVisAttribute << 190   const G4int  nSidesMin = 12;
225   if (nSides < nSidesMin) {                       191   if (nSides < nSidesMin) {
226     nSides = nSidesMin;                           192     nSides = nSidesMin;
227     G4warn << "G4ViewParameters::SetNoOfSides: << 193     G4cout << "G4ViewParameters::SetNoOfSides: attempt to set the"
228     "\nnumber of sides per circle < " << nSide << 194       "\nnumber of sides per circle < " << nSidesMin
229     << "; forced to " << nSides << G4endl;     << 195    << "; forced to " << nSides << G4endl;
230   }                                               196   }
231   fNoOfSides = nSides;                            197   fNoOfSides = nSides;
232   return fNoOfSides;                              198   return fNoOfSides;
233 }                                                 199 }
234                                                   200 
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 }                                              << 
246                                                << 
247 void G4ViewParameters::SetViewAndLights           201 void G4ViewParameters::SetViewAndLights
248 (const G4Vector3D& viewpointDirection) {          202 (const G4Vector3D& viewpointDirection) {
249                                                   203 
250   fViewpointDirection = viewpointDirection;       204   fViewpointDirection = viewpointDirection;
251                                                   205 
252   // If the requested viewpoint direction is p    206   // If the requested viewpoint direction is parallel to the up
253   // vector, the orientation of the view is un    207   // vector, the orientation of the view is undefined...
254   if (fViewpointDirection.unit() * fUpVector.u    208   if (fViewpointDirection.unit() * fUpVector.unit() > .9999) {
255     static G4bool firstTime = true;            << 209     G4cout <<
256     if (firstTime) {                           << 
257       firstTime = false;                       << 
258       G4warn <<                                << 
259       "WARNING: Viewpoint direction is very cl    210       "WARNING: Viewpoint direction is very close to the up vector direction."
260       "\n  Change the up vector or \"/vis/view << 211       "\n  Consider setting the up vector to obtain definable behaviour."
261       << G4endl;                               << 212      << G4endl;
262     }                                          << 
263   }                                               213   }
264                                                   214 
265   // Move the lights too if requested...          215   // Move the lights too if requested...
266   if (fLightsMoveWithCamera) {                    216   if (fLightsMoveWithCamera) {
267     G4Vector3D zprime = fViewpointDirection.un    217     G4Vector3D zprime = fViewpointDirection.unit ();
268     G4Vector3D xprime = (fUpVector.cross (zpri    218     G4Vector3D xprime = (fUpVector.cross (zprime)).unit ();
269     G4Vector3D yprime = zprime.cross (xprime);    219     G4Vector3D yprime = zprime.cross (xprime);
270     fActualLightpointDirection =                  220     fActualLightpointDirection =
271       fRelativeLightpointDirection.x () * xpri    221       fRelativeLightpointDirection.x () * xprime +
272       fRelativeLightpointDirection.y () * ypri    222       fRelativeLightpointDirection.y () * yprime +
273       fRelativeLightpointDirection.x () * zpri    223       fRelativeLightpointDirection.x () * zprime;     
274   } else {                                        224   } else {
275     fActualLightpointDirection = fRelativeLigh    225     fActualLightpointDirection = fRelativeLightpointDirection;
276   }                                               226   }
277 }                                                 227 }
278                                                   228 
279 void G4ViewParameters::SetLightpointDirection     229 void G4ViewParameters::SetLightpointDirection
280 (const G4Vector3D& lightpointDirection) {         230 (const G4Vector3D& lightpointDirection) {
281   fRelativeLightpointDirection = lightpointDir    231   fRelativeLightpointDirection = lightpointDirection;
282   SetViewAndLights (fViewpointDirection);         232   SetViewAndLights (fViewpointDirection);
283 }                                                 233 }
284                                                   234 
285 void G4ViewParameters::SetPan (G4double right,    235 void G4ViewParameters::SetPan (G4double right, G4double up) {
286   G4Vector3D unitRight = (fUpVector.cross (fVi    236   G4Vector3D unitRight = (fUpVector.cross (fViewpointDirection)).unit();
287   G4Vector3D unitUp    = (fViewpointDirection.    237   G4Vector3D unitUp    = (fViewpointDirection.cross (unitRight)).unit();
288   fCurrentTargetPoint  = right * unitRight + u    238   fCurrentTargetPoint  = right * unitRight + up * unitUp;
289 }                                                 239 }
290                                                   240 
291 void G4ViewParameters::IncrementPan (G4double     241 void G4ViewParameters::IncrementPan (G4double right, G4double up) {
292   IncrementPan (right,up, 0);                     242   IncrementPan (right,up, 0);
293 }                                                 243 }
294                                                   244 
295 void G4ViewParameters::IncrementPan (G4double     245 void G4ViewParameters::IncrementPan (G4double right, G4double up, G4double distance) {
296   G4Vector3D unitRight = (fUpVector.cross (fVi    246   G4Vector3D unitRight = (fUpVector.cross (fViewpointDirection)).unit();
297   G4Vector3D unitUp    = (fViewpointDirection.    247   G4Vector3D unitUp    = (fViewpointDirection.cross (unitRight)).unit();
298   fCurrentTargetPoint += right * unitRight + u    248   fCurrentTargetPoint += right * unitRight + up * unitUp + distance * fViewpointDirection;
299 }                                                 249 }
300                                                   250 
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    251 G4String G4ViewParameters::CameraAndLightingCommands
318 (const G4Point3D standardTargetPoint) const       252 (const G4Point3D standardTargetPoint) const
319 {                                                 253 {
320   std::ostringstream oss;                         254   std::ostringstream oss;
321                                                   255 
322   oss << "#\n# Camera and lights commands";       256   oss << "#\n# Camera and lights commands";
323                                                   257   
324   oss << "\n/vis/viewer/set/viewpointVector "     258   oss << "\n/vis/viewer/set/viewpointVector "
325   << fViewpointDirection.x()                      259   << fViewpointDirection.x()
326   << ' ' << fViewpointDirection.y()               260   << ' ' << fViewpointDirection.y()
327   << ' ' << fViewpointDirection.z();              261   << ' ' << fViewpointDirection.z();
328                                                   262   
329   oss << "\n/vis/viewer/set/upVector "            263   oss << "\n/vis/viewer/set/upVector "
330   << fUpVector.x()                                264   << fUpVector.x()
331   << ' ' << fUpVector.y()                         265   << ' ' << fUpVector.y()
332   << ' ' << fUpVector.z();                        266   << ' ' << fUpVector.z();
333                                                   267   
334   oss << "\n/vis/viewer/set/projection ";         268   oss << "\n/vis/viewer/set/projection ";
335     if (fFieldHalfAngle == 0.) {                  269     if (fFieldHalfAngle == 0.) {
336     oss                                           270     oss
337     << "orthogonal";                              271     << "orthogonal";
338   } else {                                        272   } else {
339     oss                                           273     oss
340     << "perspective "                             274     << "perspective "
341     << fFieldHalfAngle/deg                        275     << fFieldHalfAngle/deg
342     << " deg";                                    276     << " deg";
343   }                                               277   }
344                                                   278   
345   oss << "\n/vis/viewer/zoomTo "                  279   oss << "\n/vis/viewer/zoomTo "
346   << fZoomFactor;                                 280   << fZoomFactor;
347                                                   281   
348   oss << "\n/vis/viewer/scaleTo "                 282   oss << "\n/vis/viewer/scaleTo "
349   << fScaleFactor.x()                             283   << fScaleFactor.x()
350   << ' ' << fScaleFactor.y()                      284   << ' ' << fScaleFactor.y()
351   << ' ' << fScaleFactor.z();                     285   << ' ' << fScaleFactor.z();
352                                                   286   
353   oss << "\n/vis/viewer/set/targetPoint "         287   oss << "\n/vis/viewer/set/targetPoint "
354   << G4BestUnit(standardTargetPoint+fCurrentTa    288   << G4BestUnit(standardTargetPoint+fCurrentTargetPoint,"Length")
355   << "\n# Note that if you have not set a targ    289   << "\n# Note that if you have not set a target point, the vis system sets"
356   << "\n# a target point based on the scene -     290   << "\n# a target point based on the scene - plus any panning and dollying -"
357   << "\n# so don't be alarmed by strange coord    291   << "\n# so don't be alarmed by strange coordinates here.";
358                                                   292   
359   oss << "\n/vis/viewer/dollyTo "                 293   oss << "\n/vis/viewer/dollyTo "
360   << G4BestUnit(fDolly,"Length");                 294   << G4BestUnit(fDolly,"Length");
361                                                   295   
362   oss << "\n/vis/viewer/set/lightsMove ";         296   oss << "\n/vis/viewer/set/lightsMove ";
363   if (fLightsMoveWithCamera) {                    297   if (fLightsMoveWithCamera) {
364     oss << "camera";                              298     oss << "camera";
365   } else {                                        299   } else {
366     oss << "object";                              300     oss << "object";
367   }                                               301   }
368                                                   302   
369   oss << "\n/vis/viewer/set/lightsVector "        303   oss << "\n/vis/viewer/set/lightsVector "
370   << fRelativeLightpointDirection.x()             304   << fRelativeLightpointDirection.x()
371   << ' ' << fRelativeLightpointDirection.y()      305   << ' ' << fRelativeLightpointDirection.y()
372   << ' ' << fRelativeLightpointDirection.z();     306   << ' ' << fRelativeLightpointDirection.z();
373                                                   307   
374   oss << "\n/vis/viewer/set/rotationStyle ";      308   oss << "\n/vis/viewer/set/rotationStyle ";
375   if (fRotationStyle == constrainUpDirection)     309   if (fRotationStyle == constrainUpDirection) {
376     oss << "constrainUpDirection";                310     oss << "constrainUpDirection";
377   } else {                                        311   } else {
378     oss << "freeRotation";                        312     oss << "freeRotation";
379   }                                               313   }
380                                                   314   
381   G4Colour c = fBackgroundColour;                 315   G4Colour c = fBackgroundColour;
382   oss << "\n/vis/viewer/set/background "          316   oss << "\n/vis/viewer/set/background "
383   << c.GetRed()                                   317   << c.GetRed()
384   << ' ' << c.GetGreen()                          318   << ' ' << c.GetGreen()
385   << ' ' << c.GetBlue()                           319   << ' ' << c.GetBlue()
386   << ' ' << c.GetAlpha();                         320   << ' ' << c.GetAlpha();
387                                                   321   
388   c = fDefaultVisAttributes.GetColour();          322   c = fDefaultVisAttributes.GetColour();
389   oss << "\n/vis/viewer/set/defaultColour "       323   oss << "\n/vis/viewer/set/defaultColour "
390   << c.GetRed()                                   324   << c.GetRed()
391   << ' ' << c.GetGreen()                          325   << ' ' << c.GetGreen()
392   << ' ' << c.GetBlue()                           326   << ' ' << c.GetBlue()
393   << ' ' << c.GetAlpha();                         327   << ' ' << c.GetAlpha();
394                                                   328   
395   c = fDefaultTextVisAttributes.GetColour();      329   c = fDefaultTextVisAttributes.GetColour();
396   oss << "\n/vis/viewer/set/defaultTextColour     330   oss << "\n/vis/viewer/set/defaultTextColour "
397   << c.GetRed()                                   331   << c.GetRed()
398   << ' ' << c.GetGreen()                          332   << ' ' << c.GetGreen()
399   << ' ' << c.GetBlue()                           333   << ' ' << c.GetBlue()
400   << ' ' << c.GetAlpha();                         334   << ' ' << c.GetAlpha();
401                                                   335   
402   oss << std::endl;                               336   oss << std::endl;
403                                                   337   
404   return oss.str();                               338   return oss.str();
405 }                                                 339 }
406                                                   340 
407 G4String G4ViewParameters::DrawingStyleCommand    341 G4String G4ViewParameters::DrawingStyleCommands() const
408 {                                                 342 {
409   std::ostringstream oss;                         343   std::ostringstream oss;
410                                                   344   
411   oss << "#\n# Drawing style commands";           345   oss << "#\n# Drawing style commands";
412                                                   346   
413   oss << "\n/vis/viewer/set/style ";              347   oss << "\n/vis/viewer/set/style ";
414   switch (fDrawingStyle) {                     << 348   if (fDrawingStyle == wireframe || fDrawingStyle == hlr) {
415     case wireframe:                            << 349     oss << "wireframe";
416     case hlr:                                  << 350   } else {
417       oss << "wireframe";                      << 351     oss << "surface";
418       break;                                   << 
419     case hsr:                                  << 
420     case hlhsr:                                << 
421       oss << "surface";                        << 
422       break;                                   << 
423     case cloud:                                << 
424       oss << "cloud";                          << 
425       break;                                   << 
426   }                                               352   }
427                                                << 353   
428   oss << "\n/vis/viewer/set/hiddenEdge ";         354   oss << "\n/vis/viewer/set/hiddenEdge ";
429   if (fDrawingStyle == hlr || fDrawingStyle ==    355   if (fDrawingStyle == hlr || fDrawingStyle == hlhsr) {
430     oss << "true";                                356     oss << "true";
431   } else {                                        357   } else {
432     oss << "false";                               358     oss << "false";
433   }                                               359   }
434                                                   360   
435   oss << "\n/vis/viewer/set/auxiliaryEdge ";      361   oss << "\n/vis/viewer/set/auxiliaryEdge ";
436   if (fAuxEdgeVisible) {                          362   if (fAuxEdgeVisible) {
437     oss << "true";                                363     oss << "true";
438   } else {                                        364   } else {
439     oss << "false";                               365     oss << "false";
440   }                                               366   }
441                                                   367   
442   oss << "\n/vis/viewer/set/hiddenMarker ";       368   oss << "\n/vis/viewer/set/hiddenMarker ";
443   if (fMarkerNotHidden) {                         369   if (fMarkerNotHidden) {
444     oss << "false";                               370     oss << "false";
445   } else {                                        371   } else {
446     oss << "true";                                372     oss << "true";
447   }                                               373   }
448                                                   374   
449   oss << "\n/vis/viewer/set/globalLineWidthSca    375   oss << "\n/vis/viewer/set/globalLineWidthScale "
450   << fGlobalLineWidthScale;                       376   << fGlobalLineWidthScale;
451                                                   377   
452   oss << "\n/vis/viewer/set/globalMarkerScale     378   oss << "\n/vis/viewer/set/globalMarkerScale "
453   << fGlobalMarkerScale;                          379   << fGlobalMarkerScale;
454                                                << 380   
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;                               381   oss << std::endl;
474                                                   382   
475   return oss.str();                               383   return oss.str();
476 }                                                 384 }
477                                                   385 
478 G4String G4ViewParameters::SceneModifyingComma    386 G4String G4ViewParameters::SceneModifyingCommands() const
479 {                                                 387 {
480   std::ostringstream oss;                         388   std::ostringstream oss;
481                                                   389   
482   oss << "#\n# Scene-modifying commands";         390   oss << "#\n# Scene-modifying commands";
483                                                   391   
484   oss << "\n/vis/viewer/set/culling global ";     392   oss << "\n/vis/viewer/set/culling global ";
485   if (fCulling) {                                 393   if (fCulling) {
486     oss << "true";                                394     oss << "true";
487   } else {                                        395   } else {
488     oss << "false";                               396     oss << "false";
489   }                                               397   }
490                                                   398 
491   oss << "\n/vis/viewer/set/culling invisible     399   oss << "\n/vis/viewer/set/culling invisible ";
492   if (fCullInvisible) {                           400   if (fCullInvisible) {
493     oss << "true";                                401     oss << "true";
494   } else {                                        402   } else {
495     oss << "false";                               403     oss << "false";
496   }                                               404   }
497                                                   405   
498   oss << "\n/vis/viewer/set/culling density ";    406   oss << "\n/vis/viewer/set/culling density ";
499   if (fDensityCulling) {                          407   if (fDensityCulling) {
500     oss << "true " << fVisibleDensity/(g/cm3)     408     oss << "true " << fVisibleDensity/(g/cm3) << " g/cm3";
501   } else {                                        409   } else {
502     oss << "false";                               410     oss << "false";
503   }                                               411   }
504                                                   412   
505   oss << "\n/vis/viewer/set/culling coveredDau    413   oss << "\n/vis/viewer/set/culling coveredDaughters ";
506   if (fCullCovered) {                             414   if (fCullCovered) {
507     oss << "true";                                415     oss << "true";
508   } else {                                        416   } else {
509     oss << "false";                               417     oss << "false";
510   }                                               418   }
511                                                << 419   
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 ";       420   oss << "\n/vis/viewer/set/sectionPlane ";
519   if (fSection) {                                 421   if (fSection) {
520     oss << "on "                                  422     oss << "on "
521     << G4BestUnit(fSectionPlane.point(),"Lengt    423     << G4BestUnit(fSectionPlane.point(),"Length")
522     << fSectionPlane.normal().x()                 424     << fSectionPlane.normal().x()
523     << ' ' << fSectionPlane.normal().y()          425     << ' ' << fSectionPlane.normal().y()
524     << ' ' << fSectionPlane.normal().z();         426     << ' ' << fSectionPlane.normal().z();
525   } else {                                        427   } else {
526     oss << "off";                                 428     oss << "off";
527   }                                               429   }
528                                                   430   
529   oss << "\n/vis/viewer/set/cutawayMode ";        431   oss << "\n/vis/viewer/set/cutawayMode ";
530   if (fCutawayMode == cutawayUnion) {             432   if (fCutawayMode == cutawayUnion) {
531     oss << "union";                               433     oss << "union";
532   } else {                                        434   } else {
533     oss << "intersection";                        435     oss << "intersection";
534   }                                               436   }
535                                                   437   
536   oss << "\n/vis/viewer/clearCutawayPlanes";      438   oss << "\n/vis/viewer/clearCutawayPlanes";
537   if (fCutawayPlanes.size()) {                    439   if (fCutawayPlanes.size()) {
538     for (size_t i = 0; i < fCutawayPlanes.size    440     for (size_t i = 0; i < fCutawayPlanes.size(); i++) {
539       oss << "\n/vis/viewer/addCutawayPlane "     441       oss << "\n/vis/viewer/addCutawayPlane "
540       << G4BestUnit(fCutawayPlanes[i].point(),    442       << G4BestUnit(fCutawayPlanes[i].point(),"Length")
541       << fCutawayPlanes[i].normal().x()           443       << fCutawayPlanes[i].normal().x()
542       << ' ' << fCutawayPlanes[i].normal().y()    444       << ' ' << fCutawayPlanes[i].normal().y()
543       << ' ' << fCutawayPlanes[i].normal().z()    445       << ' ' << fCutawayPlanes[i].normal().z();
544     }                                             446     }
545   } else {                                        447   } else {
546     oss << "\n# No cutaway planes defined.";      448     oss << "\n# No cutaway planes defined.";
547   }                                               449   }
548                                                   450   
549   oss << "\n/vis/viewer/set/explodeFactor "       451   oss << "\n/vis/viewer/set/explodeFactor "
550   << fExplodeFactor                               452   << fExplodeFactor
551   << ' ' << G4BestUnit(fExplodeCentre,"Length"    453   << ' ' << G4BestUnit(fExplodeCentre,"Length");
552                                                   454   
553   oss << "\n/vis/viewer/set/lineSegmentsPerCir    455   oss << "\n/vis/viewer/set/lineSegmentsPerCircle "
554   << fNoOfSides;                                  456   << fNoOfSides;
555                                                   457   
556   oss << std::endl;                               458   oss << std::endl;
557                                                   459   
558   return oss.str();                               460   return oss.str();
559 }                                                 461 }
560                                                   462 
561 G4String G4ViewParameters::TouchableCommands()    463 G4String G4ViewParameters::TouchableCommands() const
562 {                                                 464 {
563   std::ostringstream oss;                         465   std::ostringstream oss;
564                                                   466   
565   oss << "#\n# Touchable commands";               467   oss << "#\n# Touchable commands";
566                                                << 468   
567   const std::vector<G4ModelingParameters::VisA    469   const std::vector<G4ModelingParameters::VisAttributesModifier>& vams =
568     fVisAttributesModifiers;                      470     fVisAttributesModifiers;
569                                                   471 
570   if (vams.empty()) {                             472   if (vams.empty()) {
571     oss                                        << 473     oss << "\n# None";
572     << "\n# None"                              << 
573     << "\n/vis/viewer/clearVisAttributesModifi << 
574     oss << std::endl;                             474     oss << std::endl;
575     return oss.str();                             475     return oss.str();
576   }                                               476   }
577                                                << 477   
578   oss                                          << 
579   << "\n/vis/viewer/clearVisAttributesModifier << 
580                                                << 
581   G4ModelingParameters::PVNameCopyNoPath lastP << 
582   std::vector<G4ModelingParameters::VisAttribu    478   std::vector<G4ModelingParameters::VisAttributesModifier>::const_iterator
583     iModifier;                                    479     iModifier;
584   for (iModifier = vams.begin();                  480   for (iModifier = vams.begin();
585        iModifier != vams.end();                   481        iModifier != vams.end();
586        ++iModifier) {                             482        ++iModifier) {
                                                   >> 483     static G4ModelingParameters::PVNameCopyNoPath lastPath;
587     const G4ModelingParameters::PVNameCopyNoPa    484     const G4ModelingParameters::PVNameCopyNoPath& vamPath =
588       iModifier->GetPVNameCopyNoPath();           485       iModifier->GetPVNameCopyNoPath();
589     if (vamPath != lastPath) {                    486     if (vamPath != lastPath) {
590       lastPath = vamPath;                         487       lastPath = vamPath;
591       oss << "\n/vis/set/touchable";              488       oss << "\n/vis/set/touchable";
592       G4ModelingParameters::PVNameCopyNoPathCo    489       G4ModelingParameters::PVNameCopyNoPathConstIterator iVAM;
593       for (iVAM = vamPath.begin();                490       for (iVAM = vamPath.begin();
594            iVAM != vamPath.end();                 491            iVAM != vamPath.end();
595            ++iVAM) {                              492            ++iVAM) {
596         oss << ' ' << iVAM->GetName() << ' ' <    493         oss << ' ' << iVAM->GetName() << ' ' << iVAM->GetCopyNo();
597       }                                           494       }
598     }                                             495     }
599     const G4VisAttributes& vamVisAtts = iModif    496     const G4VisAttributes& vamVisAtts = iModifier->GetVisAttributes();
600     const G4Colour& c = vamVisAtts.GetColour()    497     const G4Colour& c = vamVisAtts.GetColour();
601     switch (iModifier->GetVisAttributesSignifi    498     switch (iModifier->GetVisAttributesSignifier()) {
602       case G4ModelingParameters::VASVisibility    499       case G4ModelingParameters::VASVisibility:
603         oss << "\n/vis/touchable/set/visibilit    500         oss << "\n/vis/touchable/set/visibility ";
604         if (vamVisAtts.IsVisible()) {             501         if (vamVisAtts.IsVisible()) {
605           oss << "true";                          502           oss << "true";
606         } else {                                  503         } else {
607           oss << "false";                         504           oss << "false";
608         }                                         505         }
609         break;                                    506         break;
610       case G4ModelingParameters::VASDaughtersI    507       case G4ModelingParameters::VASDaughtersInvisible:
611         oss << "\n/vis/touchable/set/daughters    508         oss << "\n/vis/touchable/set/daughtersInvisible ";
612         if (vamVisAtts.IsDaughtersInvisible())    509         if (vamVisAtts.IsDaughtersInvisible()) {
613           oss << "true";                          510           oss << "true";
614         } else {                                  511         } else {
615           oss << "false";                         512           oss << "false";
616         }                                         513         }
617         break;                                    514         break;
618       case G4ModelingParameters::VASColour:       515       case G4ModelingParameters::VASColour:
619         oss << "\n/vis/touchable/set/colour "     516         oss << "\n/vis/touchable/set/colour "
620         << c.GetRed()                             517         << c.GetRed()
621         << ' ' << c.GetGreen()                    518         << ' ' << c.GetGreen()
622         << ' ' << c.GetBlue()                     519         << ' ' << c.GetBlue()
623         << ' ' << c.GetAlpha();                   520         << ' ' << c.GetAlpha();
624         break;                                    521         break;
625       case G4ModelingParameters::VASLineStyle:    522       case G4ModelingParameters::VASLineStyle:
626         oss << "\n/vis/touchable/set/lineStyle    523         oss << "\n/vis/touchable/set/lineStyle ";
627         switch (vamVisAtts.GetLineStyle()) {      524         switch (vamVisAtts.GetLineStyle()) {
628           case G4VisAttributes::unbroken:         525           case G4VisAttributes::unbroken:
629             oss << "unbroken";                    526             oss << "unbroken";
630             break;                                527             break;
631           case G4VisAttributes::dashed:           528           case G4VisAttributes::dashed:
632             oss << "dashed";                      529             oss << "dashed";
633             break;                                530             break;
634           case G4VisAttributes::dotted:           531           case G4VisAttributes::dotted:
635           oss << "dotted";                        532           oss << "dotted";
636         }                                         533         }
637         break;                                    534         break;
638       case G4ModelingParameters::VASLineWidth:    535       case G4ModelingParameters::VASLineWidth:
639         oss << "\n/vis/touchable/set/lineWidth    536         oss << "\n/vis/touchable/set/lineWidth "
640         << vamVisAtts.GetLineWidth();             537         << vamVisAtts.GetLineWidth();
641         break;                                    538         break;
642       case G4ModelingParameters::VASForceWiref    539       case G4ModelingParameters::VASForceWireframe:
643         if (vamVisAtts.IsForceDrawingStyle())  << 540         if (vamVisAtts.GetForcedDrawingStyle() == G4VisAttributes::wireframe) {
644           if (vamVisAtts.GetForcedDrawingStyle << 541           oss << "\n/vis/touchable/set/forceWireframe ";
645             oss << "\n/vis/touchable/set/force << 542           if (vamVisAtts.IsForceDrawingStyle()) {
646             if (vamVisAtts.IsForceDrawingStyle << 543             oss << "true";
647               oss << "true";                   << 544           } else {
648             } else {                           << 545             oss << "false";
649               oss << "false";                  << 
650             }                                  << 
651           }                                       546           }
652         }                                         547         }
653         break;                                    548         break;
654       case G4ModelingParameters::VASForceSolid    549       case G4ModelingParameters::VASForceSolid:
655         if (vamVisAtts.IsForceDrawingStyle())  << 550         if (vamVisAtts.GetForcedDrawingStyle() == G4VisAttributes::solid) {
656           if (vamVisAtts.GetForcedDrawingStyle << 551           oss << "\n/vis/touchable/set/forceSolid ";
657             oss << "\n/vis/touchable/set/force << 552           if (vamVisAtts.IsForceDrawingStyle()) {
658             if (vamVisAtts.IsForceDrawingStyle << 553             oss << "true";
659               oss << "true";                   << 554           } else {
660             } else {                           << 555             oss << "false";
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           }                                       556           }
676         }                                         557         }
677         break;                                    558         break;
678       case G4ModelingParameters::VASForceAuxEd    559       case G4ModelingParameters::VASForceAuxEdgeVisible:
                                                   >> 560         oss << "\n/vis/touchable/set/forceAuxEdgeVisible ";
679         if (vamVisAtts.IsForceAuxEdgeVisible()    561         if (vamVisAtts.IsForceAuxEdgeVisible()) {
680           oss << "\n/vis/touchable/set/forceAu << 562           oss << "true";
681           if (vamVisAtts.IsForcedAuxEdgeVisibl << 563         } else {
682             oss << "true";                     << 564           oss << "false";
683           } else {                             << 
684             oss << "false";                    << 
685           }                                    << 
686         }                                         565         }
687         break;                                    566         break;
688       case G4ModelingParameters::VASForceLineS    567       case G4ModelingParameters::VASForceLineSegmentsPerCircle:
689         oss << "\n/vis/touchable/set/lineSegme    568         oss << "\n/vis/touchable/set/lineSegmentsPerCircle "
690         << vamVisAtts.GetForcedLineSegmentsPer    569         << vamVisAtts.GetForcedLineSegmentsPerCircle();
691         break;                                    570         break;
692       case G4ModelingParameters::VASForceNumbe << 
693         oss << "\n/vis/touchable/set/numberOfC << 
694         << vamVisAtts.GetForcedNumberOfCloudPo << 
695         break;                                 << 
696     }                                             571     }
697   }                                               572   }
698                                                   573   
699   oss << std::endl;                               574   oss << std::endl;
700                                                   575   
701   return oss.str();                               576   return oss.str();
702 }                                                 577 }
703                                                   578 
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 }                                              << 
758                                                << 
759 void G4ViewParameters::PrintDifferences (const    579 void G4ViewParameters::PrintDifferences (const G4ViewParameters& v) const {
760                                                   580 
761   // Put performance-sensitive parameters firs    581   // Put performance-sensitive parameters first.
762   if (                                            582   if (
763       // This first to optimise spin, etc.        583       // This first to optimise spin, etc.
764       (fViewpointDirection   != v.fViewpointDi    584       (fViewpointDirection   != v.fViewpointDirection)   ||
765                                                   585 
766       // No particular order from here on.        586       // No particular order from here on.
767       (fDrawingStyle         != v.fDrawingStyl    587       (fDrawingStyle         != v.fDrawingStyle)         ||
768       (fNumberOfCloudPoints  != v.fNumberOfClo << 
769       (fAuxEdgeVisible       != v.fAuxEdgeVisi    588       (fAuxEdgeVisible       != v.fAuxEdgeVisible)       ||
770       (fCulling              != v.fCulling)       589       (fCulling              != v.fCulling)              ||
771       (fCullInvisible        != v.fCullInvisib    590       (fCullInvisible        != v.fCullInvisible)        ||
772       (fDensityCulling       != v.fDensityCull    591       (fDensityCulling       != v.fDensityCulling)       ||
773       (fVisibleDensity       != v.fVisibleDens    592       (fVisibleDensity       != v.fVisibleDensity)       ||
774       (fCullCovered          != v.fCullCovered    593       (fCullCovered          != v.fCullCovered)          ||
775       (fCBDAlgorithmNumber   != v.fCBDAlgorith << 
776       (fSection              != v.fSection)       594       (fSection              != v.fSection)              ||
777       (fNoOfSides            != v.fNoOfSides)     595       (fNoOfSides            != v.fNoOfSides)            ||
778       (fUpVector             != v.fUpVector)      596       (fUpVector             != v.fUpVector)             ||
779       (fFieldHalfAngle       != v.fFieldHalfAn    597       (fFieldHalfAngle       != v.fFieldHalfAngle)       ||
780       (fZoomFactor           != v.fZoomFactor)    598       (fZoomFactor           != v.fZoomFactor)           ||
781       (fScaleFactor          != v.fScaleFactor    599       (fScaleFactor          != v.fScaleFactor)          ||
782       (fCurrentTargetPoint   != v.fCurrentTarg    600       (fCurrentTargetPoint   != v.fCurrentTargetPoint)   ||
783       (fDolly                != v.fDolly)         601       (fDolly                != v.fDolly)                ||
784       (fRelativeLightpointDirection != v.fRela    602       (fRelativeLightpointDirection != v.fRelativeLightpointDirection)  ||
785       (fLightsMoveWithCamera != v.fLightsMoveW    603       (fLightsMoveWithCamera != v.fLightsMoveWithCamera) ||
786       (fDefaultVisAttributes != v.fDefaultVisA    604       (fDefaultVisAttributes != v.fDefaultVisAttributes) ||
787       (fDefaultTextVisAttributes != v.fDefault    605       (fDefaultTextVisAttributes != v.fDefaultTextVisAttributes) ||
788       (fDefaultMarker        != v.fDefaultMark    606       (fDefaultMarker        != v.fDefaultMarker)        ||
789       (fGlobalMarkerScale    != v.fGlobalMarke    607       (fGlobalMarkerScale    != v.fGlobalMarkerScale)    ||
790       (fGlobalLineWidthScale != v.fGlobalLineW    608       (fGlobalLineWidthScale != v.fGlobalLineWidthScale) ||
791       (fMarkerNotHidden      != v.fMarkerNotHi    609       (fMarkerNotHidden      != v.fMarkerNotHidden)      ||
792       (fWindowSizeHintX      != v.fWindowSizeH    610       (fWindowSizeHintX      != v.fWindowSizeHintX)      ||
793       (fWindowSizeHintY      != v.fWindowSizeH    611       (fWindowSizeHintY      != v.fWindowSizeHintY)      ||
794       (fXGeometryString      != v.fXGeometrySt    612       (fXGeometryString      != v.fXGeometryString)      ||
795       (fGeometryMask         != v.fGeometryMas    613       (fGeometryMask         != v.fGeometryMask)         ||
796       (fAutoRefresh          != v.fAutoRefresh    614       (fAutoRefresh          != v.fAutoRefresh)          ||
797       (fBackgroundColour     != v.fBackgroundC    615       (fBackgroundColour     != v.fBackgroundColour)     || 
798       (fPicking              != v.fPicking)       616       (fPicking              != v.fPicking)              ||
799       (fRotationStyle        != v.fRotationSty    617       (fRotationStyle        != v.fRotationStyle)
800       )                                           618       )
801     G4cout << "Difference in 1st batch." << G4    619     G4cout << "Difference in 1st batch." << G4endl;
802                                                   620 
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) {                                 621   if (fSection) {
812     if (!(fSectionPlane == v.fSectionPlane))      622     if (!(fSectionPlane == v.fSectionPlane))
813       G4cout << "Difference in section planes     623       G4cout << "Difference in section planes batch." << G4endl;
814   }                                               624   }
815                                                   625 
816   if (IsCutaway()) {                              626   if (IsCutaway()) {
817     if (fCutawayPlanes.size () != v.fCutawayPl    627     if (fCutawayPlanes.size () != v.fCutawayPlanes.size ()) {
818       G4cout << "Difference in no of cutaway p    628       G4cout << "Difference in no of cutaway planes." << G4endl;
819     }                                             629     }
820     else {                                        630     else {
821       for (size_t i = 0; i < fCutawayPlanes.si    631       for (size_t i = 0; i < fCutawayPlanes.size (); i++) {
822   if (!(fCutawayPlanes[i] == v.fCutawayPlanes[    632   if (!(fCutawayPlanes[i] == v.fCutawayPlanes[i]))
823     G4cout << "Difference in cutaway plane no.    633     G4cout << "Difference in cutaway plane no. " << i << G4endl;
824       }                                           634       }
825     }                                             635     }
826   }                                               636   }
827                                                   637 
828   if (IsExplode()) {                              638   if (IsExplode()) {
829     if (fExplodeFactor != v.fExplodeFactor)       639     if (fExplodeFactor != v.fExplodeFactor)
830       G4cout << "Difference in explode factor.    640       G4cout << "Difference in explode factor." << G4endl;
831     if (fExplodeCentre != v.fExplodeCentre)       641     if (fExplodeCentre != v.fExplodeCentre)
832       G4cout << "Difference in explode centre.    642       G4cout << "Difference in explode centre." << G4endl;
833   }                                               643   }
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   }                                            << 
874 }                                                 644 }
875                                                   645 
876 std::ostream& operator <<                      << 646 std::ostream& operator << (std::ostream& os,
877  (std::ostream& os, G4ViewParameters::DrawingS << 647            const G4ViewParameters::DrawingStyle& style) {
878 {                                              << 
879   switch (style) {                                648   switch (style) {
880     case G4ViewParameters::wireframe:          << 649   case G4ViewParameters::wireframe:
881       os << "wireframe"; break;                << 650     os << "wireframe"; break;
882     case G4ViewParameters::hlr:                << 651   case G4ViewParameters::hlr:
883       os << "hlr - hidden lines removed"; brea << 652     os << "hlr - hidden lines removed"; break;
884     case G4ViewParameters::hsr:                << 653   case G4ViewParameters::hsr:
885       os << "hsr - hidden surfaces removed"; b << 654     os << "hsr - hidden surfaces removed"; break;
886     case G4ViewParameters::hlhsr:              << 655   case G4ViewParameters::hlhsr:
887       os << "hlhsr - hidden line, hidden surfa << 656     os << "hlhsr - hidden line, hidden surface removed"; break;
888     case G4ViewParameters::cloud:              << 657   default: os << "unrecognised"; break;
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   }                                               658   }
906   return os;                                      659   return os;
907 }                                                 660 }
908                                                   661 
909 std::ostream& operator << (std::ostream& os, c    662 std::ostream& operator << (std::ostream& os, const G4ViewParameters& v) {
910   os << "View parameters and options:";           663   os << "View parameters and options:";
911                                                   664 
912   os << "\n  Drawing style: " << v.fDrawingSty << 665   os << "\n  Drawing style: ";
913                                                << 666   switch (v.fDrawingStyle) {
914   os << "\n  Number of cloud points: " << v.fN << 667   case G4ViewParameters::wireframe:
                                                   >> 668     os << "edges, wireframe"; break;
                                                   >> 669   case G4ViewParameters::hlr:
                                                   >> 670     os << "edges, hidden line removal"; break;
                                                   >> 671   case G4ViewParameters::hsr:
                                                   >> 672     os << "surfaces, hidden surface removal"; break;
                                                   >> 673   case G4ViewParameters::hlhsr:
                                                   >> 674     os << "surfaces and edges, hidden line and surface removal"; break;
                                                   >> 675   default: os << "unrecognised"; break;
                                                   >> 676   }
915                                                   677 
916   os << "\n  Auxiliary edges: ";                  678   os << "\n  Auxiliary edges: ";
917   if (!v.fAuxEdgeVisible) os << "in";             679   if (!v.fAuxEdgeVisible) os << "in";
918   os << "visible";                                680   os << "visible";
919                                                   681 
920   os << "\n  Culling: ";                          682   os << "\n  Culling: ";
921   if (v.fCulling) os << "on";                     683   if (v.fCulling) os << "on";
922   else            os << "off";                    684   else            os << "off";
923                                                   685 
924   os << "\n  Culling invisible objects: ";        686   os << "\n  Culling invisible objects: ";
925   if (v.fCullInvisible) os << "on";               687   if (v.fCullInvisible) os << "on";
926   else                  os << "off";              688   else                  os << "off";
927                                                   689 
928   os << "\n  Density culling: ";                  690   os << "\n  Density culling: ";
929   if (v.fDensityCulling) {                        691   if (v.fDensityCulling) {
930     os << "on - invisible if density less than    692     os << "on - invisible if density less than "
931        << v.fVisibleDensity / (1. * g / cm3) <    693        << v.fVisibleDensity / (1. * g / cm3) << " g cm^-3";
932   }                                               694   }
933   else os << "off";                               695   else os << "off";
934                                                   696 
935   os << "\n  Culling daughters covered by opaq    697   os << "\n  Culling daughters covered by opaque mothers: ";
936   if (v.fCullCovered) os << "on";                 698   if (v.fCullCovered) os << "on";
937   else                os << "off";                699   else                os << "off";
938                                                   700 
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: ";                     701   os << "\n  Section flag: ";
950   if (v.fSection) os << "true, section/cut pla    702   if (v.fSection) os << "true, section/cut plane: " << v.fSectionPlane;
951   else            os << "false";                  703   else            os << "false";
952                                                   704 
953   if (v.IsCutaway()) {                            705   if (v.IsCutaway()) {
954     os << "\n  Cutaway planes: ";                 706     os << "\n  Cutaway planes: ";
955     for (size_t i = 0; i < v.fCutawayPlanes.si    707     for (size_t i = 0; i < v.fCutawayPlanes.size (); i++) {
956       os << ' ' << v.fCutawayPlanes[i];           708       os << ' ' << v.fCutawayPlanes[i];
957     }                                             709     }
958   }                                               710   }
959   else {                                          711   else {
960     os << "\n  No cutaway planes";                712     os << "\n  No cutaway planes";
961   }                                               713   }
962                                                   714 
963   os << "\n  Explode factor: " << v.fExplodeFa    715   os << "\n  Explode factor: " << v.fExplodeFactor
964      << " about centre: " << v.fExplodeCentre;    716      << " about centre: " << v.fExplodeCentre;
965                                                   717 
966   os << "\n  No. of sides used in circle polyg    718   os << "\n  No. of sides used in circle polygon approximation: "
967      << v.fNoOfSides;                             719      << v.fNoOfSides;
968                                                   720 
969   os << "\n  Viewpoint direction:  " << v.fVie    721   os << "\n  Viewpoint direction:  " << v.fViewpointDirection;
970                                                   722 
971   os << "\n  Up vector:            " << v.fUpV    723   os << "\n  Up vector:            " << v.fUpVector;
972                                                   724 
973   os << "\n  Field half angle:     " << v.fFie    725   os << "\n  Field half angle:     " << v.fFieldHalfAngle;
974                                                   726 
975   os << "\n  Zoom factor:          " << v.fZoo    727   os << "\n  Zoom factor:          " << v.fZoomFactor;
976                                                   728 
977   os << "\n  Scale factor:         " << v.fSca    729   os << "\n  Scale factor:         " << v.fScaleFactor;
978                                                   730 
979   os << "\n  Current target point: " << v.fCur    731   os << "\n  Current target point: " << v.fCurrentTargetPoint;
980                                                   732 
981   os << "\n  Dolly distance:       " << v.fDol    733   os << "\n  Dolly distance:       " << v.fDolly;
982                                                   734 
983   os << "\n  Light ";                             735   os << "\n  Light ";
984   if (v.fLightsMoveWithCamera) os << "moves";     736   if (v.fLightsMoveWithCamera) os << "moves";
985   else                         os << "does not    737   else                         os << "does not move";
986   os << " with camera";                           738   os << " with camera";
987                                                   739 
988   os << "\n  Relative lightpoint direction: "     740   os << "\n  Relative lightpoint direction: "
989      << v.fRelativeLightpointDirection;           741      << v.fRelativeLightpointDirection;
990                                                   742 
991   os << "\n  Actual lightpoint direction: "       743   os << "\n  Actual lightpoint direction: "
992      << v.fActualLightpointDirection;             744      << v.fActualLightpointDirection;
993                                                   745 
994   os << "\n  Derived parameters for standard v    746   os << "\n  Derived parameters for standard view of object of unit radius:";
995   G4ViewParameters tempVP = v;                    747   G4ViewParameters tempVP = v;
996   tempVP.fDolly = 0.;                             748   tempVP.fDolly = 0.;
997   tempVP.fZoomFactor = 1.;                        749   tempVP.fZoomFactor = 1.;
998   const G4double radius = 1.;                     750   const G4double radius = 1.;
999   const G4double cameraDistance = tempVP.GetCa    751   const G4double cameraDistance = tempVP.GetCameraDistance (radius);
1000   const G4double nearDistance =                  752   const G4double nearDistance =
1001     tempVP.GetNearDistance (cameraDistance, r    753     tempVP.GetNearDistance (cameraDistance, radius);
1002   const G4double farDistance =                   754   const G4double farDistance =
1003     tempVP.GetFarDistance  (cameraDistance, n    755     tempVP.GetFarDistance  (cameraDistance, nearDistance, radius);
1004   const G4double right  = tempVP.GetFrontHalf    756   const G4double right  = tempVP.GetFrontHalfHeight (nearDistance, radius);
1005   os << "\n    Camera distance:   " << camera    757   os << "\n    Camera distance:   " << cameraDistance;
1006   os << "\n    Near distance:     " << nearDi    758   os << "\n    Near distance:     " << nearDistance;
1007   os << "\n    Far distance:      " << farDis    759   os << "\n    Far distance:      " << farDistance;
1008   os << "\n    Front half height: " << right;    760   os << "\n    Front half height: " << right;
1009                                                  761 
1010   os << "\n  Default VisAttributes:\n  " << v    762   os << "\n  Default VisAttributes:\n  " << v.fDefaultVisAttributes;
1011                                                  763 
1012   os << "\n  Default TextVisAttributes:\n  "     764   os << "\n  Default TextVisAttributes:\n  " << v.fDefaultTextVisAttributes;
1013                                                  765 
1014   os << "\n  Default marker:\n    " << v.fDef << 766   os << "\n  Default marker: " << v.fDefaultMarker;
1015                                                  767 
1016   os << "\n  Global marker scale: " << v.fGlo    768   os << "\n  Global marker scale: " << v.fGlobalMarkerScale;
1017                                                  769 
1018   os << "\n  Global lineWidth scale: " << v.f    770   os << "\n  Global lineWidth scale: " << v.fGlobalLineWidthScale;
1019                                                  771 
1020   os << "\n  Marker ";                           772   os << "\n  Marker ";
1021   if (v.fMarkerNotHidden) os << "not ";          773   if (v.fMarkerNotHidden) os << "not ";
1022   os << "hidden by surfaces.";                   774   os << "hidden by surfaces.";
1023                                                  775 
1024   os << "\n  Window size hint: "                 776   os << "\n  Window size hint: "
1025      << v.fWindowSizeHintX << 'x'<< v.fWindow    777      << v.fWindowSizeHintX << 'x'<< v.fWindowSizeHintX;
1026                                                  778 
1027   os << "\n  X geometry string: " << v.fXGeom    779   os << "\n  X geometry string: " << v.fXGeometryString;
1028   os << "\n  X geometry mask: "                  780   os << "\n  X geometry mask: "
1029      << std::showbase << std::hex << v.fGeome    781      << std::showbase << std::hex << v.fGeometryMask
1030      << std::noshowbase << std::dec;             782      << std::noshowbase << std::dec;
1031                                                  783 
1032   os << "\n  Auto refresh: ";                    784   os << "\n  Auto refresh: ";
1033   if (v.fAutoRefresh) os << "true";              785   if (v.fAutoRefresh) os << "true";
1034   else os << "false";                            786   else os << "false";
1035                                                  787 
1036   os << "\n  Background colour: " << v.fBackg    788   os << "\n  Background colour: " << v.fBackgroundColour;
1037                                                  789 
1038   os << "\n  Picking requested: ";               790   os << "\n  Picking requested: ";
1039   if (v.fPicking) os << "true";                  791   if (v.fPicking) os << "true";
1040   else os << "false";                            792   else os << "false";
1041                                                  793 
1042   os << "\n  Rotation style: ";                  794   os << "\n  Rotation style: ";
1043   switch (v.fRotationStyle) {                    795   switch (v.fRotationStyle) {
1044   case G4ViewParameters::constrainUpDirection    796   case G4ViewParameters::constrainUpDirection:
1045     os << "constrainUpDirection (conventional    797     os << "constrainUpDirection (conventional HEP view)"; break;
1046   case G4ViewParameters::freeRotation:           798   case G4ViewParameters::freeRotation:
1047     os << "freeRotation (Google-like rotation    799     os << "freeRotation (Google-like rotation, using mouse-grab)"; break;
1048   default: os << "unrecognised"; break;          800   default: os << "unrecognised"; break;
1049   }                                              801   }
1050                                                  802 
1051   os << "\nVis attributes modifiers: ";       << 803   os << "\n  Vis attributes modifiers: ";
1052   const std::vector<G4ModelingParameters::Vis    804   const std::vector<G4ModelingParameters::VisAttributesModifier>& vams =
1053     v.fVisAttributesModifiers;                   805     v.fVisAttributesModifiers;
1054   if (vams.empty()) {                            806   if (vams.empty()) {
1055     os << "None";                                807     os << "None";
1056   } else {                                       808   } else {
1057     os << vams;                                  809     os << vams;
1058   }                                              810   }
1059                                                  811 
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;                                     812   return os;
1100 }                                                813 }
1101                                                  814 
1102 G4bool G4ViewParameters::operator != (const G    815 G4bool G4ViewParameters::operator != (const G4ViewParameters& v) const {
1103                                                  816 
1104   // Put performance-sensitive parameters fir    817   // Put performance-sensitive parameters first.
1105   if (                                           818   if (
1106       // This first to optimise spin, etc.       819       // This first to optimise spin, etc.
1107       (fViewpointDirection   != v.fViewpointD    820       (fViewpointDirection   != v.fViewpointDirection)   ||
1108                                                  821 
1109       // No particular order from here on.       822       // No particular order from here on.
1110       (fDrawingStyle         != v.fDrawingSty    823       (fDrawingStyle         != v.fDrawingStyle)         ||
1111       (fNumberOfCloudPoints  != v.fNumberOfCl << 
1112       (fAuxEdgeVisible       != v.fAuxEdgeVis    824       (fAuxEdgeVisible       != v.fAuxEdgeVisible)       ||
1113       (fCulling              != v.fCulling)      825       (fCulling              != v.fCulling)              ||
1114       (fCullInvisible        != v.fCullInvisi    826       (fCullInvisible        != v.fCullInvisible)        ||
1115       (fDensityCulling       != v.fDensityCul    827       (fDensityCulling       != v.fDensityCulling)       ||
1116       (fCullCovered          != v.fCullCovere    828       (fCullCovered          != v.fCullCovered)          ||
1117       (fCBDAlgorithmNumber   != v.fCBDAlgorit << 
1118       (fSection              != v.fSection)      829       (fSection              != v.fSection)              ||
1119       (IsCutaway()           != v.IsCutaway()    830       (IsCutaway()           != v.IsCutaway())           ||
1120       (IsExplode()           != v.IsExplode()    831       (IsExplode()           != v.IsExplode())           ||
1121       (fNoOfSides            != v.fNoOfSides)    832       (fNoOfSides            != v.fNoOfSides)            ||
1122       (fUpVector             != v.fUpVector)     833       (fUpVector             != v.fUpVector)             ||
1123       (fFieldHalfAngle       != v.fFieldHalfA    834       (fFieldHalfAngle       != v.fFieldHalfAngle)       ||
1124       (fZoomFactor           != v.fZoomFactor    835       (fZoomFactor           != v.fZoomFactor)           ||
1125       (fScaleFactor          != v.fScaleFacto    836       (fScaleFactor          != v.fScaleFactor)          ||
1126       (fCurrentTargetPoint   != v.fCurrentTar    837       (fCurrentTargetPoint   != v.fCurrentTargetPoint)   ||
1127       (fDolly                != v.fDolly)        838       (fDolly                != v.fDolly)                ||
1128       (fRelativeLightpointDirection != v.fRel    839       (fRelativeLightpointDirection != v.fRelativeLightpointDirection)  ||
1129       (fLightsMoveWithCamera != v.fLightsMove    840       (fLightsMoveWithCamera != v.fLightsMoveWithCamera) ||
1130       (fDefaultVisAttributes != v.fDefaultVis    841       (fDefaultVisAttributes != v.fDefaultVisAttributes) ||
1131       (fDefaultTextVisAttributes != v.fDefaul    842       (fDefaultTextVisAttributes != v.fDefaultTextVisAttributes) ||
1132       (fDefaultMarker        != v.fDefaultMar    843       (fDefaultMarker        != v.fDefaultMarker)        ||
1133       (fGlobalMarkerScale    != v.fGlobalMark    844       (fGlobalMarkerScale    != v.fGlobalMarkerScale)    ||
1134       (fGlobalLineWidthScale != v.fGlobalLine    845       (fGlobalLineWidthScale != v.fGlobalLineWidthScale) ||
1135       (fMarkerNotHidden      != v.fMarkerNotH    846       (fMarkerNotHidden      != v.fMarkerNotHidden)      ||
1136       (fWindowSizeHintX      != v.fWindowSize    847       (fWindowSizeHintX      != v.fWindowSizeHintX)      ||
1137       (fWindowSizeHintY      != v.fWindowSize    848       (fWindowSizeHintY      != v.fWindowSizeHintY)      ||
1138       (fXGeometryString      != v.fXGeometryS    849       (fXGeometryString      != v.fXGeometryString)      ||
1139       (fGeometryMask         != v.fGeometryMa    850       (fGeometryMask         != v.fGeometryMask)         ||
1140       (fAutoRefresh          != v.fAutoRefres    851       (fAutoRefresh          != v.fAutoRefresh)          ||
1141       (fBackgroundColour     != v.fBackground    852       (fBackgroundColour     != v.fBackgroundColour)     ||
1142       (fPicking              != v.fPicking)      853       (fPicking              != v.fPicking)              ||
1143       (fRotationStyle        != v.fRotationSt << 854       (fRotationStyle        != v.fRotationStyle)
1144       (fSpecialMeshRendering != v.fSpecialMes << 
1145       (fSpecialMeshRenderingOption != v.fSpec << 
1146       )                                          855       )
1147     return true;                                 856     return true;
1148                                                  857 
1149   if (fDensityCulling &&                         858   if (fDensityCulling &&
1150       (fVisibleDensity != v.fVisibleDensity))    859       (fVisibleDensity != v.fVisibleDensity)) return true;
1151                                                  860 
1152   if (fCBDAlgorithmNumber > 0) {              << 
1153     if (fCBDParameters.size() != v.fCBDParame << 
1154     else if (fCBDParameters != v.fCBDParamete << 
1155   }                                           << 
1156                                               << 
1157   if (fSection &&                                861   if (fSection &&
1158       (!(fSectionPlane == v.fSectionPlane)))     862       (!(fSectionPlane == v.fSectionPlane))) return true;
1159                                                  863 
1160   if (IsCutaway()) {                             864   if (IsCutaway()) {
1161     if (fCutawayPlanes.size () != v.fCutawayP    865     if (fCutawayPlanes.size () != v.fCutawayPlanes.size ())
1162       return true;                               866       return true;
1163     else {                                       867     else {
1164       for (size_t i = 0; i < fCutawayPlanes.s    868       for (size_t i = 0; i < fCutawayPlanes.size (); i++) {
1165   if (!(fCutawayPlanes[i] == v.fCutawayPlanes    869   if (!(fCutawayPlanes[i] == v.fCutawayPlanes[i])) return true;
1166       }                                          870       }
1167     }                                            871     }
1168   }                                              872   }
1169                                                  873 
1170   if (IsExplode() &&                             874   if (IsExplode() &&
1171       ((fExplodeFactor != v.fExplodeFactor) |    875       ((fExplodeFactor != v.fExplodeFactor) ||
1172        (fExplodeCentre != v.fExplodeCentre)))    876        (fExplodeCentre != v.fExplodeCentre))) return true;
1173                                                  877 
1174   if (fVisAttributesModifiers != v.fVisAttrib    878   if (fVisAttributesModifiers != v.fVisAttributesModifiers) return true;
1175                                                  879 
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                                               << 
1210   return false;                                  880   return false;
1211 }                                                881 }
1212                                                  882 
1213 void G4ViewParameters::SetXGeometryString (co << 883 
                                                   >> 884 void G4ViewParameters::SetXGeometryString (const G4String& geomStringArg)
1214 {                                                885 {
                                                   >> 886   G4int x,y = 0;
                                                   >> 887   unsigned int w,h = 0;
                                                   >> 888   G4String geomString = geomStringArg;
                                                   >> 889   // Parse windowSizeHintString for backwards compatibility...
1215   const G4String delimiters("xX+-");             890   const G4String delimiters("xX+-");
1216   G4String::size_type i = geomString.find_fir    891   G4String::size_type i = geomString.find_first_of(delimiters);
1217   if (i == G4String::npos) {                  << 892   if (i == G4String::npos) {  // Does not contain "xX+-".  Assume single number
1218     // Does not contain "xX+-".               << 
1219     // Is it a single number?                 << 
1220     std::istringstream iss(geomString);          893     std::istringstream iss(geomString);
1221     G4int size;                                  894     G4int size;
1222     iss >> size;                                 895     iss >> size;
1223     if (iss) {                                << 896     if (!iss) {
1224       // It is a number                       << 897       size = 600;
1225       fWindowSizeHintX = size;                << 898       G4cout << "Unrecognised windowSizeHint string: \""
1226       fWindowSizeHintY = size;                << 899        << geomString
                                                   >> 900        << "\".  Asuuming " << size << G4endl;
1227     }                                            901     }
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;                      902     std::ostringstream oss;
1234     oss << fWindowSizeHintX << 'x' << fWindow << 903     oss << size << 'x' << size;
1235     << signX << fWindowLocationHintX << signY << 904     geomString = oss.str();
1236     fXGeometryString = oss.str();             << 
1237     return;                                   << 
1238   }                                              905   }
1239                                               << 906  
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,     907   fGeometryMask = ParseGeometry( geomString, &x, &y, &w, &h );
1244                                                  908 
1245   // Handle special case :                       909   // Handle special case :
1246   if ((fGeometryMask & fYValue) == 0)            910   if ((fGeometryMask & fYValue) == 0)
1247     {  // Using default                          911     {  // Using default
1248       y =  fWindowLocationHintY;                 912       y =  fWindowLocationHintY;
1249     }                                            913     }
1250   if ((fGeometryMask & fXValue) == 0)            914   if ((fGeometryMask & fXValue) == 0)
1251     {  // Using default                          915     {  // Using default
1252       x =  fWindowLocationHintX;                 916       x =  fWindowLocationHintX;
1253     }                                            917     }
1254                                                  918 
1255   // Check errors                                919   // Check errors
1256   // if there is no Width and Height             920   // if there is no Width and Height
1257   if ( ((fGeometryMask & fHeightValue) == 0 )    921   if ( ((fGeometryMask & fHeightValue) == 0 ) &&
1258        ((fGeometryMask & fWidthValue)  == 0 )    922        ((fGeometryMask & fWidthValue)  == 0 )) {
1259     h = fWindowSizeHintY;                        923     h = fWindowSizeHintY;
1260     w = fWindowSizeHintX;                        924     w = fWindowSizeHintX;
1261   } else  if ((fGeometryMask & fHeightValue)     925   } else  if ((fGeometryMask & fHeightValue) == 0 ) {
1262                                                  926 
1263     // if there is only Width. Special case t    927     // if there is only Width. Special case to be backward compatible
1264     // We set Width and Height the same to ob    928     // We set Width and Height the same to obtain a square windows.
1265                                                  929     
1266     G4warn << "Unrecognised geometry string \ << 930     G4cout << "Unrecognised geometry string \""
1267            << geomString                         931            << geomString
1268            << "\".  No Height found. Using Wi    932            << "\".  No Height found. Using Width value instead"
1269            << G4endl;                            933            << G4endl;
1270     h = w;                                       934     h = w;
1271   }                                              935   }
1272   if ( ((fGeometryMask & fXValue) == 0 ) ||      936   if ( ((fGeometryMask & fXValue) == 0 ) ||
1273        ((fGeometryMask & fYValue)  == 0 )) {     937        ((fGeometryMask & fYValue)  == 0 )) {
1274     //Using defaults                             938     //Using defaults
1275     x = fWindowLocationHintX;                    939     x = fWindowLocationHintX;
1276     y = fWindowLocationHintY;                    940     y = fWindowLocationHintY;
1277   }                                              941   }
1278   // Set the string                              942   // Set the string
1279   fXGeometryString = geomString;                 943   fXGeometryString = geomString;
1280                                                  944   
1281   // Set values                                  945   // Set values
1282   fWindowSizeHintX = w;                          946   fWindowSizeHintX = w;
1283   fWindowSizeHintY = h;                          947   fWindowSizeHintY = h;
1284   fWindowLocationHintX = x;                      948   fWindowLocationHintX = x;
1285   fWindowLocationHintY = y;                      949   fWindowLocationHintY = y;
1286                                                  950 
1287   if ( ((fGeometryMask & fXValue)) &&            951   if ( ((fGeometryMask & fXValue)) &&
1288        ((fGeometryMask & fYValue))) {            952        ((fGeometryMask & fYValue))) {
1289                                                  953 
1290     if ( (fGeometryMask & fXNegative) ) {        954     if ( (fGeometryMask & fXNegative) ) {
1291       fWindowLocationHintXNegative = true;       955       fWindowLocationHintXNegative = true;
1292     } else {                                     956     } else {
1293       fWindowLocationHintXNegative = false;      957       fWindowLocationHintXNegative = false;
1294     }                                            958     }
1295     if ( (fGeometryMask & fYNegative) ) {        959     if ( (fGeometryMask & fYNegative) ) {
1296     fWindowLocationHintYNegative = true;         960     fWindowLocationHintYNegative = true;
1297     } else {                                     961     } else {
1298       fWindowLocationHintYNegative = false;      962       fWindowLocationHintYNegative = false;
1299     }                                            963     }
1300   }                                              964   }
1301 }                                                965 }
1302                                                  966 
1303 G4int G4ViewParameters::GetWindowAbsoluteLoca    967 G4int G4ViewParameters::GetWindowAbsoluteLocationHintX (G4int sizeX ) const {
1304   if ( fWindowLocationHintXNegative ) {          968   if ( fWindowLocationHintXNegative ) {
1305     return  sizeX  + fWindowLocationHintX - f    969     return  sizeX  + fWindowLocationHintX - fWindowSizeHintX;
1306   }                                              970   }
1307   return fWindowLocationHintX;                   971   return fWindowLocationHintX;
1308 }                                                972 }
1309                                                  973 
1310 G4int G4ViewParameters::GetWindowAbsoluteLoca    974 G4int G4ViewParameters::GetWindowAbsoluteLocationHintY (G4int sizeY ) const {
1311   if (  fWindowLocationHintYNegative ) {         975   if (  fWindowLocationHintYNegative ) {
1312     return  sizeY  + fWindowLocationHintY - f    976     return  sizeY  + fWindowLocationHintY - fWindowSizeHintY;
1313   }                                              977   }
1314   return fWindowLocationHintY;                   978   return fWindowLocationHintY;
1315 }                                                979 }
1316                                                  980 
1317 /* Keep from :                                   981 /* Keep from :
1318  * ftp://ftp.trolltech.com/qt/source/qt-embed    982  * ftp://ftp.trolltech.com/qt/source/qt-embedded-free-3.0.6.tar.gz/qt-embedded-free-3.0.6/src/kernel/qapplication_qws.cpp
1319  *                                               983  *
1320  *    ParseGeometry parses strings of the for    984  *    ParseGeometry parses strings of the form
1321  *   "=<width>x<height>{+-}<xoffset>{+-}<yoff    985  *   "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
1322  *   width, height, xoffset, and yoffset are     986  *   width, height, xoffset, and yoffset are unsigned integers.
1323  *   Example:  "=80x24+300-49"                   987  *   Example:  "=80x24+300-49"
1324  *   The equal sign is optional.                 988  *   The equal sign is optional.
1325  *   It returns a bitmask that indicates whic    989  *   It returns a bitmask that indicates which of the four values
1326  *   were actually found in the string. For e    990  *   were actually found in the string. For each value found,
1327  *   the corresponding argument is updated;      991  *   the corresponding argument is updated;  for each value
1328  *   not found, the corresponding argument is    992  *   not found, the corresponding argument is left unchanged.
1329  */                                              993  */
1330                                                  994 
1331 int G4ViewParameters::ParseGeometry (            995 int G4ViewParameters::ParseGeometry (
1332  const char *string,                             996  const char *string,
1333  G4int *x,                                       997  G4int *x,
1334  G4int *y,                                       998  G4int *y,
1335  unsigned int *width,                            999  unsigned int *width,
1336  unsigned int *height)                           1000  unsigned int *height)
1337 {                                                1001 {
1338                                                  1002 
1339   G4int mask = fNoValue;                         1003   G4int mask = fNoValue;
1340   char *strind;                                  1004   char *strind;
1341   unsigned int tempWidth  = 0;                   1005   unsigned int tempWidth  = 0;
1342   unsigned int tempHeight = 0;                   1006   unsigned int tempHeight = 0;
1343   G4int tempX = 0;                               1007   G4int tempX = 0;
1344   G4int tempY = 0;                               1008   G4int tempY = 0;
1345   char *nextCharacter;                           1009   char *nextCharacter;
1346   if ( (string == NULL) || (*string == '\0'))    1010   if ( (string == NULL) || (*string == '\0')) {
1347     return(mask);                                1011     return(mask);
1348   }                                              1012   }
1349   if (*string == '=')                            1013   if (*string == '=')
1350     string++;  /* ignore possible '=' at beg     1014     string++;  /* ignore possible '=' at beg of geometry spec */
1351   strind = (char *)string;                       1015   strind = (char *)string;
1352   if (*strind != '+' && *strind != '-' && *st    1016   if (*strind != '+' && *strind != '-' && *strind != 'x') {
1353     tempWidth = ReadInteger(strind, &nextChar    1017     tempWidth = ReadInteger(strind, &nextCharacter);
1354     if (strind == nextCharacter)                 1018     if (strind == nextCharacter)
1355       return (0);                                1019       return (0);
1356     strind = nextCharacter;                      1020     strind = nextCharacter;
1357     mask |= fWidthValue;                         1021     mask |= fWidthValue;
1358   }                                              1022   }
1359   if (*strind == 'x' || *strind == 'X') {        1023   if (*strind == 'x' || *strind == 'X') {
1360     strind++;                                    1024     strind++;
1361     tempHeight = ReadInteger(strind, &nextCha    1025     tempHeight = ReadInteger(strind, &nextCharacter);
1362     if (strind == nextCharacter)                 1026     if (strind == nextCharacter)
1363       return (0);                                1027       return (0);
1364     strind = nextCharacter;                      1028     strind = nextCharacter;
1365     mask |= fHeightValue;                        1029     mask |= fHeightValue;
1366   }                                              1030   }
1367                                                  1031 
1368   if ((*strind == '+') || (*strind == '-')) {    1032   if ((*strind == '+') || (*strind == '-')) {
1369     if (*strind == '-') {                        1033     if (*strind == '-') {
1370       strind++;                                  1034       strind++;
1371       tempX = -ReadInteger(strind, &nextChara    1035       tempX = -ReadInteger(strind, &nextCharacter);
1372       if (strind == nextCharacter)               1036       if (strind == nextCharacter)
1373         return (0);                              1037         return (0);
1374       strind = nextCharacter;                    1038       strind = nextCharacter;
1375       mask |= fXNegative;                        1039       mask |= fXNegative;
1376                                                  1040 
1377     }                                            1041     }
1378     else                                         1042     else
1379       { strind++;                                1043       { strind++;
1380         tempX = ReadInteger(strind, &nextChar    1044         tempX = ReadInteger(strind, &nextCharacter);
1381         if (strind == nextCharacter)             1045         if (strind == nextCharacter)
1382           return(0);                             1046           return(0);
1383         strind = nextCharacter;                  1047         strind = nextCharacter;
1384       }                                          1048       }
1385     mask |= fXValue;                             1049     mask |= fXValue;
1386     if ((*strind == '+') || (*strind == '-'))    1050     if ((*strind == '+') || (*strind == '-')) {
1387       if (*strind == '-') {                      1051       if (*strind == '-') {
1388         strind++;                                1052         strind++;
1389         tempY = -ReadInteger(strind, &nextCha    1053         tempY = -ReadInteger(strind, &nextCharacter);
1390         if (strind == nextCharacter)             1054         if (strind == nextCharacter)
1391           return(0);                             1055           return(0);
1392         strind = nextCharacter;                  1056         strind = nextCharacter;
1393         mask |= fYNegative;                      1057         mask |= fYNegative;
1394       }                                          1058       }
1395       else                                       1059       else
1396         {                                        1060         {
1397           strind++;                              1061           strind++;
1398           tempY = ReadInteger(strind, &nextCh    1062           tempY = ReadInteger(strind, &nextCharacter);
1399           if (strind == nextCharacter)           1063           if (strind == nextCharacter)
1400             return(0);                           1064             return(0);
1401           strind = nextCharacter;                1065           strind = nextCharacter;
1402         }                                        1066         }
1403       mask |= fYValue;                           1067       mask |= fYValue;
1404     }                                            1068     }
1405   }                                              1069   }
1406   /* If strind isn't at the end of the string    1070   /* If strind isn't at the end of the string the it's an invalid
1407      geometry specification. */                  1071      geometry specification. */
1408   if (*strind != '\0') return (0);               1072   if (*strind != '\0') return (0);
1409   if (mask & fXValue)                            1073   if (mask & fXValue)
1410     *x = tempX;                                  1074     *x = tempX;
1411   if (mask & fYValue)                            1075   if (mask & fYValue)
1412     *y = tempY;                                  1076     *y = tempY;
1413   if (mask & fWidthValue)                        1077   if (mask & fWidthValue)
1414     *width = tempWidth;                          1078     *width = tempWidth;
1415   if (mask & fHeightValue)                       1079   if (mask & fHeightValue)
1416     *height = tempHeight;                        1080     *height = tempHeight;
1417   return (mask);                                 1081   return (mask);
1418 }                                                1082 }
1419                                                  1083 
1420 /* Keep from :                                   1084 /* Keep from :
1421  * ftp://ftp.trolltech.com/qt/source/qt-embed    1085  * ftp://ftp.trolltech.com/qt/source/qt-embedded-free-3.0.6.tar.gz/qt-embedded-free-3.0.6/src/kernel/qapplication_qws.cpp
1422  *                                               1086  *
1423  */                                              1087  */
1424 G4int G4ViewParameters::ReadInteger(char *str    1088 G4int G4ViewParameters::ReadInteger(char *string, char **NextString)
1425 {                                                1089 {
1426     G4int Result = 0;                            1090     G4int Result = 0;
1427     G4int Sign = 1;                              1091     G4int Sign = 1;
1428                                                  1092 
1429     if (*string == '+')                          1093     if (*string == '+')
1430   string++;                                      1094   string++;
1431     else if (*string == '-')                     1095     else if (*string == '-')
1432     {                                            1096     {
1433   string++;                                      1097   string++;
1434   Sign = -1;                                     1098   Sign = -1;
1435     }                                            1099     }
1436     for (; (*string >= '0') && (*string <= '9    1100     for (; (*string >= '0') && (*string <= '9'); string++)
1437     {                                            1101     {
1438   Result = (Result * 10) + (*string - '0');      1102   Result = (Result * 10) + (*string - '0');
1439     }                                            1103     }
1440     *NextString = string;                        1104     *NextString = string;
1441     if (Sign >= 0)                               1105     if (Sign >= 0)
1442   return (Result);                               1106   return (Result);
1443     else                                         1107     else
1444   return (-Result);                              1108   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 }                                                1109 }
1721                                                  1110