28#ifndef G4TOOLSSGVIEWER_HH
29#define G4TOOLSSGVIEWER_HH
38#include <tools/toojpeg>
40#include <tools/sg/device_interactor>
41#include <tools/sg/separator>
42#include <tools/sg/ortho>
43#include <tools/sg/perspective>
44#include <tools/sg/shade_model>
45#include <tools/sg/torche>
46#include <tools/sg/blend>
47#include <tools/sg/noderef>
48#include <tools/sg/keys>
50#include <tools/tokenize>
51#include <tools/sg/write_paper>
64template <
class SG_SESSION,
class SG_VIEWER>
68 typedef tools::sg::device_interactor parent_interactor;
70 virtual void key_press(
const tools::sg::key_down_event&) {}
72 virtual void mouse_press(
const tools::sg::mouse_down_event& a_event) {
78 virtual void mouse_move(
const tools::sg::mouse_move_event& a_event) {
88 if (a_event.shift_modifier()) {
91 const G4double dxScene = dx*sceneRadius/scale;
92 const G4double dyScene = dy*sceneRadius/scale;
93 fVP.IncrementPan(-dxScene,dyScene);
98 const G4Vector3D& x_prime =
fVP.GetViewpointDirection().cross(
fVP.GetUpVector());
101 G4Vector3D newViewpointDirection =
fVP.GetViewpointDirection();
102 newViewpointDirection += dx*x_prime/scale;
103 newViewpointDirection += dy*y_prime/scale;
104 fVP.SetViewpointDirection(newViewpointDirection.
unit());
108 newUpVector += dx*x_prime/scale;
109 newUpVector += dy*y_prime/scale;
110 fVP.SetUpVector(newUpVector.
unit());
118 virtual void wheel_rotate(
const tools::sg::wheel_rotate_event& a_event) {
120 ZoomFromMouseWheel(a_event.angle(), a_event.shift_modifier(), a_event.x(), a_event.y());
127 :parent(a_scene_handler,a_scene_handler.IncrementViewCount(),a_name)
148 ,parent_viewer(a_from)
149 ,parent_interactor(a_from)
161 fVP.SetAutoRefresh(
true);
168 ,
fVP.GetWindowAbsoluteLocationHintX(1440)
169 ,
fVP.GetWindowAbsoluteLocationHintY(900)
170 ,
fVP.GetWindowSizeHintX()
171 ,
fVP.GetWindowSizeHintY()
175 G4cerr <<
"G4ToolsSGViewer::Initialise : SG_VIEWER::has_window() failed." <<
G4endl;
184 fSGViewer->set_clear_color(0.3,0.3,0.3,1);
185 G4cerr <<
"G4ToolsSGViewer::SetView : no G4Scene.." <<
G4endl;
195 =
fSceneHandler.GetScene()->GetStandardTargetPoint() +
fVP.GetCurrentTargetPoint ();
197 if(radius<=0.) radius = 1.;
198 const G4double cameraDistance =
fVP.GetCameraDistance (radius);
199 const G4Point3D cameraPosition = targetPoint + cameraDistance *
fVP.GetViewpointDirection().unit();
201 const G4double pnear =
fVP.GetNearDistance (cameraDistance, radius);
202 const G4double pfar =
fVP.GetFarDistance (cameraDistance, pnear, radius);
205 const G4double top =
fVP.GetFrontHalfHeight (pnear, radius);
208 tools::vec3f dir(
float(targetPoint.
x()-cameraPosition.
x()),
209 float(targetPoint.
y()-cameraPosition.
y()),
210 float(targetPoint.
z()-cameraPosition.
z()));
212 fSGViewer->set_clear_color(0.3,0.3,0.3,1);
213 G4cerr <<
"G4ToolsSGViewer::SetView : null size viewer area." <<
G4endl;
224 unsigned int raw,rah;
227 double width_ratio = double(raw)/double(ww);
250 tools::sg::base_camera* _camera =
nullptr;
251 if (
fVP.GetFieldHalfAngle() <= 0.) {
253 if((top-bottom)<=0) {
254 fSGViewer->set_clear_color(0.3,0.3,0.3,1);
255 G4cerr <<
"G4ToolsSGViewer::SetView : for ortho camera, (top-bottom)<=0." <<
G4endl;
258 tools::sg::ortho* ortho_camera =
new tools::sg::ortho;
259 ortho_camera->height.value(
float(top-bottom));
260 _camera = ortho_camera;
263 tools::sg::perspective* perspective_camera =
new tools::sg::perspective;
264 perspective_camera->height_angle.value(2 * std::atan(std::tan(
fVP.GetFieldHalfAngle()) /
fVP.GetZoomFactor()));
265 _camera = perspective_camera;
268 _camera->position.value
269 (tools::vec3f(
float(cameraPosition.
x()),
270 float(cameraPosition.
y()),
271 float(cameraPosition.
z())));
272 _camera->znear.value(
float(pnear));
273 _camera->zfar.value(
float(pfar));
275 _camera->look_at(dir,tools::vec3f(up.
x(),up.
y(),up.
z()));
284 CreateSG(_camera,
fVP.GetActualLightpointDirection());
286 {
G4Color background =
fVP.GetBackgroundColour ();
298 if (kernelVisitWasNeeded) {
324 if(!
fSGViewer) {a_w = 0; a_h = 0;
return false;}
328 if (!
fSGViewer) {a_w = 0; a_h = 0;
return false;}
357 fVP.GetCBDAlgorithmNumber()) ||
371 fVP.GetDefaultVisAttributes()->GetColour()) ||
373 fVP.GetDefaultTextVisAttributes()->GetColour()) ||
405 fVP.GetCutawayPlanes ().size ())
return true;
435 tools::sg::group& _parent =
fSGViewer->sg();
441 tools::sg::separator* scene_2D =
new tools::sg::separator;
442 _parent.add(scene_2D);
443 scene_2D->add(
new tools::sg::noderef(
fSGSceneHandler.GetTransient2DObjects()));
444 scene_2D->add(
new tools::sg::noderef(
fSGSceneHandler.GetPersistent2DObjects()));
449 tools::sg::separator* scene_3D =
new tools::sg::separator;
450 _parent.add(scene_3D);
452 scene_3D->add(a_camera);
454 {tools::sg::shade_model* shade_model =
new tools::sg::shade_model;
455 shade_model->model = tools::sg::shade_smooth;
456 scene_3D->add(shade_model);}
458 {tools::sg::torche* light =
new tools::sg::torche;
460 light->direction = tools::vec3f(-a_light_dir.
x(),-a_light_dir.
y(),-a_light_dir.
z());
461 light->ambient = tools::colorf(0.2f,0.2f,0.2f,1.0f);
462 light->color = tools::colorf(0.8f,0.8f,0.8f,1.0f);
463 scene_3D->add(light);}
465 {tools::sg::blend* blend =
new tools::sg::blend;
467 scene_3D->add(blend);}
469 scene_3D->add(
new tools::sg::noderef(
fSGSceneHandler.GetTransient3DObjects()));
470 scene_3D->add(
new tools::sg::noderef(
fSGSceneHandler.GetPersistent3DObjects()));
475 const G4Colour& back_color =
fVP.GetBackgroundColour();
476 bool top_to_bottom =
false;
478 tools::fpng::write,tools::toojpeg::write,
481 a_file,a_format,a_do_transparency,top_to_bottom,std::string(),std::string())) {
482 G4cout <<
"G4ToolsSGViewer::Export: write_paper() failed." <<
G4endl;
494 if (radius <= 0.) radius = 1.;
495 const G4double cameraDistance =
fVP.GetCameraDistance(radius);
496 const G4double pnear =
fVP.GetNearDistance(cameraDistance, radius);
499 if (
fVP.GetFieldHalfAngle() == 0.) {
500 frontHalfHeight = radius /
fVP.GetZoomFactor();
503 frontHalfHeight = pnear * std::tan(
fVP.GetFieldHalfAngle() /
fVP.GetZoomFactor());
505 return 2 * frontHalfHeight;
511 static void Create() {
static Messenger s_messenger;}
518 write_scene =
new G4UIcommand(
"/vis/tsg/export",
this);
519 write_scene->
SetGuidance(
"Write the content of the current viewer in a file at various formats.");
520 write_scene->
SetGuidance(
"Default file is out.eps and default format is gl2ps_eps.");
521 write_scene->
SetGuidance(
"Available formats are:");
522 write_scene->
SetGuidance(
"- gl2ps_eps: gl2ps producing eps");
523 write_scene->
SetGuidance(
"- gl2ps_ps: gl2ps producing ps");
524 write_scene->
SetGuidance(
"- gl2ps_pdf: gl2ps producing pdf");
525 write_scene->
SetGuidance(
"- gl2ps_svg: gl2ps producing svg");
526 write_scene->
SetGuidance(
"- gl2ps_tex: gl2ps producing tex");
527 write_scene->
SetGuidance(
"- gl2ps_pgf: gl2ps producing pgf");
528 write_scene->
SetGuidance(
"- zb_ps: tools::sg offscreen zbuffer put in a PostScript file.");
529 write_scene->
SetGuidance(
"- zb_png: tools::sg offscreen zbuffer put in a png file.");
530 write_scene->
SetGuidance(
"- zb_jpeg: tools::sg offscreen zbuffer put in a jpeg file.");
540 parameter =
new G4UIparameter (
"do_transparency",
'b',
true);
545 virtual ~Messenger() {
558 G4cout <<
"G4ToolsSGViewer::Messenger::SetNewValue:"
559 <<
" current viewer is not a G4ToolsSGViewer." <<
G4endl;
562 std::vector<std::string> args;
563 tools::double_quotes_tokenize(a_value,args);
565 if(a_cmd==write_scene) {
567 tsg_viewer->
Export(args[0],args[1],do_transparency);
HepGeom::Normal3D< G4double > G4Normal3D
HepGeom::Point3D< G4double > G4Point3D
HepGeom::Vector3D< G4double > G4Vector3D
G4GLOB_DLL std::ostream G4cerr
G4GLOB_DLL std::ostream G4cout
G4double GetAlpha() const
G4double GetGreen() const
std::size_t GetParameterEntries() const
void SetParameter(G4UIparameter *const newParameter)
void SetGuidance(const char *aGuidance)
static G4bool ConvertToBool(const char *st)
void SetDefaultValue(const char *theDefaultValue)
G4VSceneHandler & fSceneHandler
G4ViewParameters fDefaultVP
G4bool fTransientsNeedRedrawing
G4VViewer(G4VSceneHandler &, G4int id, const G4String &name="")
void ZoomFromMouseWheel(G4double delta, G4bool shift=false, G4double xPos=0, G4double yPos=0)
static G4VisManager * GetVisManager()
const std::vector< G4ModelingParameters::VisAttributesModifier > & GetVisAttributesModifiers() const
const G4Vector3D & GetScaleFactor() const
G4int GetNoOfSides() const
G4bool IsSpecialMeshRendering() const
CutawayMode GetCutawayMode() const
G4double GetExplodeFactor() const
const G4ModelingParameters::TimeParameters & GetTimeParameters() const
G4int GetNumberOfCloudPoints() const
G4bool IsMarkerNotHidden() const
G4double GetGlobalLineWidthScale() const
const G4Colour & GetBackgroundColour() const
G4bool IsDotsSmooth() const
const G4VisAttributes * GetDefaultTextVisAttributes() const
const std::vector< G4double > & GetCBDParameters() const
G4int GetCBDAlgorithmNumber() const
const std::vector< G4ModelingParameters::PVNameCopyNo > & GetSpecialMeshVolumes() const
G4int GetTransparencyByDepthOption() const
G4double GetGlobalMarkerScale() const
G4bool IsCullingInvisible() const
const G4VisAttributes * GetDefaultVisAttributes() const
const G4Planes & GetCutawayPlanes() const
G4bool IsDensityCulling() const
G4double GetVisibleDensity() const
SMROption GetSpecialMeshRenderingOption() const
G4double GetDotsSize() const
G4bool IsCullingCovered() const
const G4Plane3D & GetSectionPlane() const
DrawingStyle GetDrawingStyle() const
G4double GetTransparencyByDepth() const
G4bool IsAuxEdgeVisible() const
const G4Colour & GetColour() const
G4VViewer * GetCurrentViewer() const
static Verbosity GetVerbosity()
BasicVector3D< T > cross(const BasicVector3D< T > &v) const
BasicVector3D< T > unit() const