Geant4-11
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4ToolsSGViewer.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// John Allison 6th October 2019
27
28#ifndef G4TOOLSSGVIEWER_HH
29#define G4TOOLSSGVIEWER_HH
30
31#include "G4VViewer.hh"
32
34#include "G4Scene.hh"
35#include "G4VVisCommand.hh"
36
37#include <tools/sg/device_interactor>
38#include <tools/sg/separator>
39#include <tools/sg/ortho>
40#include <tools/sg/perspective>
41#include <tools/sg/torche>
42#include <tools/sg/blend>
43#include <tools/sg/noderef>
44#include <tools/sg/keys>
45
46#include <tools/tokenize>
47#include <tools/sg/write_paper>
48
49template <class SG_SESSION,class SG_VIEWER>
50class G4ToolsSGViewer : public G4VViewer, tools::sg::device_interactor {
52 typedef tools::sg::device_interactor parent_interactor;
53public: //tools::sg::device_interactor interface.
54 virtual void key_press(const tools::sg::key_down_event& a_event) {
55 fKeyPressed = true;
56 fKeyShift = a_event.key() == tools::sg::key_shift()?true:false;
57 }
58 virtual void key_release(const tools::sg::key_up_event&) {fKeyPressed = false;}
59 virtual void mouse_press(const tools::sg::mouse_down_event& a_event) {
60 fMousePressed = true;
61 fMousePressedX = a_event.x();
62 fMousePressedY = a_event.y();
63 }
64 virtual void mouse_release(const tools::sg::mouse_up_event&) {fMousePressed = false;}
65 virtual void mouse_move(const tools::sg::mouse_move_event& a_event) {
66 G4double x = a_event.x();
67 G4double y = a_event.y();
72
73 if (fMousePressed) {
74
75 if (fKeyPressed && fKeyShift) { // Translation (pan)
76
78 const G4double scale = 300; // Roughly pixels per window, empirically chosen
79 const G4double dxScene = dx*sceneRadius/scale;
80 const G4double dyScene = dy*sceneRadius/scale;
81 fVP.IncrementPan(-dxScene,dyScene);
82
83 } else { // Rotation
84
85 // Simple ad-hoc algorithms
87 const G4Vector3D& y_prime = x_prime.cross(fVP.GetViewpointDirection());
88 const G4double scale = 200; // Roughly pixels per window, empirically chosen
89 G4Vector3D newViewpointDirection = fVP.GetViewpointDirection();
90 newViewpointDirection += dx*x_prime/scale;
91 newViewpointDirection += dy*y_prime/scale;
92 fVP.SetViewpointDirection(newViewpointDirection.unit());
93
95 G4Vector3D newUpVector = fVP.GetUpVector();
96 newUpVector += dx*x_prime/scale;
97 newUpVector += dy*y_prime/scale;
98 fVP.SetUpVector(newUpVector.unit());
99 }
100 }
101 }
102
103 SetView();
104 DrawView();
105 }
106 virtual void wheel_rotate(const tools::sg::wheel_rotate_event& a_event) {
107 const G4double angleY = a_event.angle();
108 if (fVP.GetFieldHalfAngle() == 0.) { // Orthographic projection
109 const G4double scale = 500; // Empirically chosen
110 fVP.MultiplyZoomFactor(1.+angleY/scale);
111 } else { // Perspective projection
112 const G4double scale = fVP.GetFieldHalfAngle()/(10.*CLHEP::deg); // Empirical
113 fVP.SetDolly(fVP.GetDolly()+angleY/scale);
114 }
115 SetView();
116 DrawView();
117 }
118public:
119 G4ToolsSGViewer(SG_SESSION& a_session,G4ToolsSGSceneHandler& a_scene_handler, const G4String& a_name)
120 :parent(a_scene_handler,a_scene_handler.IncrementViewCount(),a_name)
121 ,fSGSession(a_session)
122 ,fSGSceneHandler(a_scene_handler)
123 ,fSGViewer(nullptr)
124 ,fKeyPressed(false)
125 ,fKeyShift(false)
126 ,fMousePressed(false)
129 {
130 //::printf("debug : G4ToolsSGViewer::G4ToolsSGViewer: %lu, %s\n",this,a_name.c_str());
132 }
133
135 //::printf("debug : G4ToolsSGViewer::~G4ToolsSGViewer: %lu\n",this);
136 //WARNING : nodes may refer f_gl2ps_mgr, f_zb_mgr (to handle gstos (for GPU) or textures), then
137 // we have to delete them first.
138 fSGViewer->sg().clear();
139 delete fSGViewer;
140 }
141protected:
143 :parent(a_from)
144 ,parent_interactor(a_from)
145 ,fSGSession(a_from.fSGSession)
147 ,fSGViewer(nullptr)
148 ,fKeyPressed(false)
149 ,fKeyShift(false)
150 ,fMousePressed(false)
153 {}
155public:
156 virtual void Initialise() {
157 if(fSGViewer) return; //done.
158 fVP.SetAutoRefresh(true);
160 //::printf("debug : G4ToolsSGViewer::Initialise\n");
164 fSGViewer = new SG_VIEWER(fSGSession
169 ,fName);
170 if(!fSGViewer->has_window()) {
171 fViewId = -1; // This flags an error.
172 G4cerr << "G4ToolsSGViewer::Initialise : SG_VIEWER::has_window() failed." << G4endl;
173 return;
174 }
175 fSGViewer->set_device_interactor(this);
176 }
177
178 virtual void SetView() {
179 //::printf("debug : G4ToolsSGViewer::SetView\n");
180 if(!fSceneHandler.GetScene()) {
181 fSGViewer->set_clear_color(0.3,0.3,0.3,1); //some grey color to signal the user that something is wrong.
182 G4cerr << "G4ToolsSGViewer::SetView : no G4Scene.." << G4endl;
183 return;
184 }
185
189 // Get radius of scene, etc.
190 // Note that this procedure properly takes into account zoom, dolly and pan.
191 const G4Point3D targetPoint
194 if(radius<=0.) radius = 1.;
195 const G4double cameraDistance = fVP.GetCameraDistance (radius);
196 const G4Point3D cameraPosition = targetPoint + cameraDistance * fVP.GetViewpointDirection().unit();
197 const G4Normal3D& up = fVP.GetUpVector ();
198 const G4double pnear = fVP.GetNearDistance (cameraDistance, radius);
199 const G4double pfar = fVP.GetFarDistance (cameraDistance, pnear, radius);
200 //const G4double right = fVP.GetFrontHalfHeight (pnear, radius);
201 //const G4double left = -right;
202 const G4double top = fVP.GetFrontHalfHeight (pnear, radius);
203 const G4double bottom = -top;
204 // sanity check :
205 tools::vec3f dir(float(targetPoint.x()-cameraPosition.x()),
206 float(targetPoint.y()-cameraPosition.y()),
207 float(targetPoint.z()-cameraPosition.z()));
208 if(!dir.length()) {
209 fSGViewer->set_clear_color(0.3,0.3,0.3,1);
210 G4cerr << "G4ToolsSGViewer::SetView : null size viewer area." << G4endl;
211 return;
212 }
213
217 /*
218 G4cout << "debug : 0002 : radius " << radius << std::endl;
219 G4cout << "debug : cameraDistance : " << cameraDistance << std::endl;
220 G4cout << "debug : fieldHalfAngle : " << fVP.GetFieldHalfAngle() << std::endl;
221 G4cout << "debug : zoomFactor : " << fVP.GetZoomFactor() << std::endl;
222 G4cout << "debug : up : " << up.x() << " " << up.y() << " " << up.z() << std::endl;
223 G4cout << "debug : targetPoint : " << targetPoint.x() << " " << targetPoint.y() << " " << targetPoint.z() << std::endl;
224 G4cout << "debug : cameraPosition : " << cameraPosition.x() << " " << cameraPosition.y() << " " << cameraPosition.z() << std::endl;
225 G4cout << "debug : camera : znear " << pnear << ", zfar " << pfar << std::endl;
226 */
230 // Set projection, then create the tools::sg camera node :
231 tools::sg::base_camera* _camera = nullptr;
232 if (fVP.GetFieldHalfAngle() <= 0.) {
233 //G4cout << "debug : camera : ortho : top " << top << " bottom " << bottom << " top-bottom " << top-bottom << std::endl;
234 if((top-bottom)<=0) {
235 fSGViewer->set_clear_color(0.3,0.3,0.3,1);
236 G4cerr << "G4ToolsSGViewer::SetView : for ortho camera, (top-bottom)<=0." << G4endl;
237 return;
238 }
239 tools::sg::ortho* ortho_camera = new tools::sg::ortho;
240 ortho_camera->height.value(float(top-bottom));
241 _camera = ortho_camera;
242 } else {
243 //G4cout << "debug : camera : perspec : heightAngle " << float(2*fVP.GetFieldHalfAngle()) << std::endl;
244 tools::sg::perspective* perspective_camera = new tools::sg::perspective;
245 perspective_camera->height_angle.value(float(2*fVP.GetFieldHalfAngle()));
246 _camera = perspective_camera;
247 }
248
249 _camera->position.value
250 (tools::vec3f(float(cameraPosition.x()),
251 float(cameraPosition.y()),
252 float(cameraPosition.z())));
253 _camera->znear.value(float(pnear));
254 _camera->zfar.value(float(pfar));
255
256 _camera->look_at(dir,tools::vec3f(up.x(),up.y(),up.z())); //same logic as in G4OpenInventorViewer.
257
258 /*
259 const G4Vector3D& lightDirection = fVP.GetLightpointDirection();
260 G4cout << "debug : lightDirection : " << lightDirection.x() << " " << lightDirection.y() << " " << lightDirection.z() << std::endl;
261 const G4Vector3D& actualLightDirection = fVP.GetActualLightpointDirection();
262 G4cout << "debug : actualLightDirection : " << actualLightDirection.x() << " " << actualLightDirection.y() << " " << actualLightDirection.z() << std::endl;
263 */
264
266
267 {G4Color background = fVP.GetBackgroundColour ();
268 fSGViewer->set_clear_color(float(background.GetRed()),float(background.GetBlue()),float(background.GetBlue()),1);}
269 }
270
271 virtual void ClearView() {}
272
273 virtual void DrawView() {
275 G4bool kernelVisitWasNeeded = fNeedKernelVisit; // Keep (ProcessView resets).
276 fLastVP = fVP;
277 ProcessView(); // Clears store and processes scene only if necessary.
278 if (kernelVisitWasNeeded) {
279 // We might need to do something if the kernel was visited.
280 } else {
281 }
282 FinishView (); // Flush streams and/or swap buffers.
283 }
284
285 virtual void ShowView() {FinishView();}
286
287 virtual void FinishView() {
288 if(fSGViewer) {
290 fSGViewer->show();
291 fSGViewer->win_render();
292 fSGSession.sync();
293 }
294 }
295
296#ifdef G4MULTITHREADED
297 virtual void SwitchToVisSubThread() {}
298
299 virtual void SwitchToMasterThread() {
301 // I have not figured out how to draw during a run.
302 //
303 // Setting fNeedKernelVisit=true causes scene deletion and a complete rebuild,
304 // including trajectories, hits, etc. from kept events.
305 //
306 // Clearly this is a limitation because even if you run 1000 events you only
307 // get those kept (default 100), and even worse, if end-if-event-action is
308 // "refresh", you only get one event (the last I think).
309 //
310 // Also, strictly, there is no need to rebuid run-duration models (detector),
311 // but a complete rebuild is the easiest way (already imeplemented).
312 fNeedKernelVisit = true;
313 DrawView(); // Draw trajectories, etc., from kept events
314 }
315 }
316#endif
317
318 //SG_VIEWER* sg_viewer() {return fSGViewer;}
319protected:
322 NeedKernelVisit (); // Sets fNeedKernelVisit.
323 }
324 }
325
327 // Typical comparison. Taken from OpenGL.
328 if (
329 (lastVP.GetDrawingStyle () != fVP.GetDrawingStyle ()) ||
331 (lastVP.IsAuxEdgeVisible () != fVP.IsAuxEdgeVisible ()) ||
332 (lastVP.IsCulling () != fVP.IsCulling ()) ||
333 (lastVP.IsCullingInvisible () != fVP.IsCullingInvisible ()) ||
334 (lastVP.IsDensityCulling () != fVP.IsDensityCulling ()) ||
335 (lastVP.IsCullingCovered () != fVP.IsCullingCovered ()) ||
336 (lastVP.GetCBDAlgorithmNumber() !=
338 (lastVP.IsSection () != fVP.IsSection ()) ||
339 (lastVP.IsCutaway () != fVP.IsCutaway ()) ||
340 (lastVP.IsExplode () != fVP.IsExplode ()) ||
341 (lastVP.GetNoOfSides () != fVP.GetNoOfSides ()) ||
344 (lastVP.IsMarkerNotHidden () != fVP.IsMarkerNotHidden ()) ||
345 (lastVP.GetDefaultVisAttributes()->GetColour() !=
350 (lastVP.IsPicking () != fVP.IsPicking ()) ||
351 (lastVP.GetVisAttributesModifiers() !=
353 (lastVP.IsSpecialMeshRendering() !=
355 ) {
356 return true;
357 }
358
359 if (lastVP.IsDensityCulling () &&
360 (lastVP.GetVisibleDensity () != fVP.GetVisibleDensity ())) return true;
361
362 if (lastVP.GetCBDAlgorithmNumber() > 0) {
363 if (lastVP.GetCBDParameters().size() != fVP.GetCBDParameters().size()) return true;
364 else if (lastVP.GetCBDParameters() != fVP.GetCBDParameters()) return true;
365 }
366
367 if (lastVP.IsExplode () &&
368 (lastVP.GetExplodeFactor () != fVP.GetExplodeFactor ()))
369 return true;
370
371 if (lastVP.IsSpecialMeshRendering() &&
373 return true;
374
375 return false;
376 }
377
378// void keyPressEvent (KeyEvent*);
379// void keyReleaseEvent (KeyEvent*);
380// void mouseDoubleClickEvent(MouseEvent*);
381// void mouseMoveEvent (MouseEvent*);
382// void mousePressEvent (MouseEvent*);
383// void mouseReleaseEvent (MouseEvent*);
384// void wheelEvent (WheelEvent*);
385
386protected:
387 void CreateSG(tools::sg::base_camera* a_camera,const G4Vector3D& a_light_dir) {
388 tools::sg::group& _parent = fSGViewer->sg();
389 _parent.clear();
390
394 tools::sg::separator* scene_2D = new tools::sg::separator;
395 _parent.add(scene_2D);
396 scene_2D->add(new tools::sg::noderef(fSGSceneHandler.GetTransient2DObjects()));
397 scene_2D->add(new tools::sg::noderef(fSGSceneHandler.GetPersistent2DObjects()));
398
402 tools::sg::separator* scene_3D = new tools::sg::separator;
403 _parent.add(scene_3D);
404
405 scene_3D->add(a_camera);
406
407 {tools::sg::torche* light = new tools::sg::torche;
408 light->on = true;
409 light->direction = tools::vec3f(-a_light_dir.x(),-a_light_dir.y(),-a_light_dir.z());
410 scene_3D->add(light);}
411
412 {tools::sg::blend* blend = new tools::sg::blend;
413 blend->on = true; //to handle transparency.
414 scene_3D->add(blend);}
415
416 scene_3D->add(new tools::sg::noderef(fSGSceneHandler.GetTransient3DObjects()));
417 scene_3D->add(new tools::sg::noderef(fSGSceneHandler.GetPersistent3DObjects()));
418 }
419
420 void Export(const G4String& a_format,const G4String& a_file) {
421 if(!fSGViewer) return;
422 const G4Colour& back_color = fVP.GetBackgroundColour();
423 if(!write_paper(G4cout,f_gl2ps_mgr,f_zb_mgr,0,0,
424 float(back_color.GetRed()),float(back_color.GetGreen()),float(back_color.GetBlue()),float(back_color.GetAlpha()),
425 fSGViewer->sg(),
426 fSGViewer->width(),fSGViewer->height(),a_file,a_format)) {
427 G4cout << "G4ToolsSGViewer::Export: write_paper() failed." << G4endl;
428 return;
429 }
430 }
431
432protected:
433 class Messenger: public G4VVisCommand {
434 public:
435 static void Create() {static Messenger s_messenger;}
436 private:
438 G4UIparameter* parameter;
441 write_scene = new G4UIcommand("/vis/tsg/export", this);
442 write_scene->SetGuidance("Write the content of the current viewer in a file at various formats.");
443 write_scene->SetGuidance("Default file is out.eps and default format is gl2ps_eps.");
444 write_scene->SetGuidance("Available formats are:");
445 write_scene->SetGuidance("- gl2ps_eps: gl2ps producing eps");
446 write_scene->SetGuidance("- gl2ps_ps: gl2ps producing ps");
447 write_scene->SetGuidance("- gl2ps_pdf: gl2ps producing pdf");
448 write_scene->SetGuidance("- gl2ps_svg: gl2ps producing svg");
449 write_scene->SetGuidance("- gl2ps_tex: gl2ps producing tex");
450 write_scene->SetGuidance("- gl2ps_pgf: gl2ps producing pgf");
451 write_scene->SetGuidance("- zb_ps: tools::sg offscreen zbuffer put in a PostScript file.");
452
453 parameter = new G4UIparameter("format",'s',true);
454 parameter->SetDefaultValue("gl2ps_eps");
455 write_scene->SetParameter (parameter);
456
457 parameter = new G4UIparameter("file",'s',true);
458 parameter->SetDefaultValue("out.eps");
459 write_scene->SetParameter (parameter);
460 }
461 virtual ~Messenger() {
462 delete write_scene;
463 }
464 public:
465 virtual void SetNewValue(G4UIcommand* a_cmd,G4String a_value) {
467 G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
468 if (!viewer) {
469 if (verbosity >= G4VisManager::errors) G4cerr << "ERROR: No current viewer." << G4endl;
470 return;
471 }
472 G4ToolsSGViewer* tsg_viewer = dynamic_cast<G4ToolsSGViewer*>(viewer);
473 if(!tsg_viewer) {
474 G4cout << "G4ToolsSGViewer::SetNewValue:"
475 << " current viewer is not a G4ToolsSGViewer." << G4endl;
476 return;
477 }
478 std::vector<std::string> args;
479 tools::double_quotes_tokenize(a_value,args);
480 if(args.size()!=a_cmd->GetParameterEntries()) return;
481 if(a_cmd==write_scene) {
482 tsg_viewer->Export(args[0],args[1]);
483 }
484 }
485 private:
487 };
488
489protected:
490 SG_SESSION& fSGSession;
492 SG_VIEWER* fSGViewer;
493 G4ViewParameters fLastVP; // Memory for making kernel visit decisions.
494
499
500 tools::sg::zb_manager f_zb_mgr;
501 tools::sg::gl2ps_manager f_gl2ps_mgr;
502
503};
504
505#endif
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
static char ** args
Definition: G4Xt.cc:51
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4double GetBlue() const
Definition: G4Colour.hh:154
G4double GetAlpha() const
Definition: G4Colour.hh:155
G4double GetRed() const
Definition: G4Colour.hh:152
G4double GetGreen() const
Definition: G4Colour.hh:153
const G4VisExtent & GetExtent() const
const G4Point3D & GetStandardTargetPoint() const
tools::sg::separator & GetTransient3DObjects()
tools::sg::separator & GetTransient2DObjects()
tools::sg::separator & GetPersistent3DObjects()
void TouchPlotters(tools::sg::node &)
tools::sg::separator & GetPersistent2DObjects()
virtual void SetNewValue(G4UIcommand *a_cmd, G4String a_value)
virtual void ClearView()
virtual void ShowView()
SG_SESSION & fSGSession
virtual void mouse_move(const tools::sg::mouse_move_event &a_event)
tools::sg::device_interactor parent_interactor
virtual void mouse_press(const tools::sg::mouse_down_event &a_event)
virtual void key_press(const tools::sg::key_down_event &a_event)
virtual void wheel_rotate(const tools::sg::wheel_rotate_event &a_event)
virtual void FinishView()
G4bool CompareForKernelVisit(G4ViewParameters &lastVP)
void CreateSG(tools::sg::base_camera *a_camera, const G4Vector3D &a_light_dir)
virtual void mouse_release(const tools::sg::mouse_up_event &)
virtual void key_release(const tools::sg::key_up_event &)
G4ToolsSGViewer(const G4ToolsSGViewer &a_from)
G4ToolsSGViewer(SG_SESSION &a_session, G4ToolsSGSceneHandler &a_scene_handler, const G4String &a_name)
virtual void Initialise()
G4ToolsSGSceneHandler & fSGSceneHandler
virtual void SetView()
SG_VIEWER * fSGViewer
void Export(const G4String &a_format, const G4String &a_file)
tools::sg::gl2ps_manager f_gl2ps_mgr
G4ViewParameters fLastVP
tools::sg::zb_manager f_zb_mgr
G4ToolsSGViewer & operator=(const G4ToolsSGViewer &)
virtual ~G4ToolsSGViewer()
virtual void DrawView()
std::size_t GetParameterEntries() const
Definition: G4UIcommand.hh:138
void SetParameter(G4UIparameter *const newParameter)
Definition: G4UIcommand.hh:146
void SetGuidance(const char *aGuidance)
Definition: G4UIcommand.hh:156
void SetDefaultValue(const char *theDefaultValue)
G4Scene * GetScene() const
G4bool fNeedKernelVisit
Definition: G4VViewer.hh:224
void ProcessView()
Definition: G4VViewer.cc:105
G4VSceneHandler & fSceneHandler
Definition: G4VViewer.hh:215
G4String fName
Definition: G4VViewer.hh:217
void NeedKernelVisit()
Definition: G4VViewer.cc:78
G4ViewParameters fDefaultVP
Definition: G4VViewer.hh:220
G4int fViewId
Definition: G4VViewer.hh:216
G4ViewParameters fVP
Definition: G4VViewer.hh:219
static G4VisManager * fpVisManager
void SetViewpointDirection(const G4Vector3D &viewpointDirection)
const std::vector< G4ModelingParameters::VisAttributesModifier > & GetVisAttributesModifiers() const
void SetAutoRefresh(G4bool)
G4int GetNoOfSides() const
G4bool IsSpecialMeshRendering() const
G4int GetWindowAbsoluteLocationHintY(G4int) const
G4double GetCameraDistance(G4double radius) const
G4double GetExplodeFactor() const
G4int GetNumberOfCloudPoints() const
G4bool IsMarkerNotHidden() const
unsigned int GetWindowSizeHintX() const
G4double GetGlobalLineWidthScale() const
G4bool IsCutaway() const
G4Vector3D & GetActualLightpointDirection()
const G4Colour & GetBackgroundColour() const
const G4Vector3D & GetViewpointDirection() const
G4bool IsSection() const
const G4Point3D & GetCurrentTargetPoint() const
G4bool IsPicking() const
G4double GetFarDistance(G4double cameraDistance, G4double nearDistance, G4double radius) const
G4double GetFieldHalfAngle() const
G4bool IsCulling() const
G4double GetFrontHalfHeight(G4double nearDistance, G4double radius) const
const G4VisAttributes * GetDefaultTextVisAttributes() const
void SetDolly(G4double dolly)
G4int GetWindowAbsoluteLocationHintX(G4int) const
G4bool IsExplode() const
void IncrementPan(G4double right, G4double up)
const G4Vector3D & GetUpVector() const
const std::vector< G4double > & GetCBDParameters() const
G4int GetCBDAlgorithmNumber() const
const std::vector< G4ModelingParameters::PVNameCopyNo > & GetSpecialMeshVolumes() const
G4double GetGlobalMarkerScale() const
G4bool IsCullingInvisible() const
const G4VisAttributes * GetDefaultVisAttributes() const
void SetUpVector(const G4Vector3D &upVector)
RotationStyle GetRotationStyle() const
G4bool IsDensityCulling() const
void MultiplyZoomFactor(G4double zoomFactorMultiplier)
G4double GetVisibleDensity() const
unsigned int GetWindowSizeHintY() const
G4bool IsCullingCovered() const
G4double GetNearDistance(G4double cameraDistance, G4double radius) const
DrawingStyle GetDrawingStyle() const
G4bool IsAuxEdgeVisible() const
G4double GetDolly() const
const G4Colour & GetColour() const
G4double GetExtentRadius() const
Definition: G4VisExtent.cc:75
static Verbosity GetVerbosity()
BasicVector3D< T > cross(const BasicVector3D< T > &v) const
BasicVector3D< T > unit() const
static constexpr double deg
G4bool IsMultithreadedApplication()
Definition: G4Threading.cc:130