Geant4 Cross Reference |
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