Geant4-11
G4VtkViewer.cc
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//
27//
28//
29// John Allison 5th April 2001
30// A template for a simplest possible graphics driver.
31//?? Lines or sections marked like this require specialisation for your driver.
32
33#include "G4VtkViewer.hh"
34
35#include "G4VSceneHandler.hh"
36#include "G4VtkSceneHandler.hh"
37
38#include "vtkRendererCollection.h"
39#include "vtkLightCollection.h"
40
41#include "vtkWindowToImageFilter.h"
42#include "vtkImageWriter.h"
43#include "vtkBMPWriter.h"
44#include "vtkJPEGWriter.h"
45#include "vtkPNGWriter.h"
46#include "vtkPNMWriter.h"
47#include "vtkTIFFWriter.h"
48#include "vtkPostScriptWriter.h"
49#include "vtkOBJExporter.h"
50#include "vtkVRMLExporter.h"
51#include "vtkSingleVTPExporter.h"
52
53#include "vtkShadowMapPass.h"
54#include "vtkShadowMapBakerPass.h"
55#include "vtkSequencePass.h"
56#include "vtkCameraPass.h"
57#include "vtkRenderPass.h"
58#include "vtkRenderPassCollection.h"
59
60#include "vtkOpenGLRenderer.h"
61
63 : G4VViewer(sceneHandler, sceneHandler.IncrementViewCount(), name)
64{
65 // Set default and current view parameters
66 fVP.SetAutoRefresh(true);
68}
69
71{
72 _renderWindow = vtkRenderWindow::New();
73 renderWindowInteractor = vtkRenderWindowInteractor::New();
74
75#ifdef G4VTKDEBUG
76 G4cout << "G4VtkViewer::G4VtkViewer" << G4endl;
77
78 G4cout << "G4VtkViewer::G4VtkViewer> " << fVP.GetWindowSizeHintX() << " "
80 G4cout << "G4VtkViewer::G4VtkViewer> " << fVP.GetWindowLocationHintX() << " "
82#endif
83
87 _renderWindow->SetWindowName("Vtk viewer");
88
89 _renderWindow->AddRenderer(renderer);
90 renderWindowInteractor->SetRenderWindow(_renderWindow);
91
92 // TODO proper camera parameter settings
93 camera->SetPosition(0, 0, 1000);
94 camera->SetFocalPoint(0, 0, 0);
95 renderer->SetActiveCamera(camera);
96
97 //renderer->SetUseHiddenLineRemoval(1); // TODO needs to be an option
98 //renderer->SetUseShadows(1); // TODO needs to be an option
99
100 // Set callback to match VTK parameters to Geant4
101 geant4Callback->SetGeant4ViewParameters(&fVP);
102 renderer->AddObserver(vtkCommand::EndEvent, geant4Callback);
103
104 vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
105 vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
106 renderWindowInteractor->SetInteractorStyle(style);
107
108 // DrawShadows();
109}
110
112
114
115 // background colour
116 const G4Colour backgroundColour = fVP.GetBackgroundColour();
117 renderer->SetBackground(backgroundColour.GetRed(), backgroundColour.GetGreen(), backgroundColour.GetBlue());
118
119 // target and camera positions
121 if(radius <= 0.)
122 {radius = 1.;}
123 G4double cameraDistance = fVP.GetCameraDistance(radius);
124 G4Point3D viewpointDirection = fVP.GetViewpointDirection();
125 G4Point3D targetPoint = fVP.GetCurrentTargetPoint();
126 G4Point3D cameraPosition =
127 targetPoint + viewpointDirection.unit() * cameraDistance;
128 renderer->GetActiveCamera()->SetFocalPoint(targetPoint.x(),
129 targetPoint.y(),
130 targetPoint.z());
131 renderer->GetActiveCamera()->SetPosition(cameraPosition.x(),
132 cameraPosition.y(),
133 cameraPosition.z());
134 renderer->GetActiveCamera()->SetParallelScale(cameraDistance);
135
136 // need to set camera distance and parallel scale on first set view
137 if(firstSetView)
138 {
139 geant4Callback->SetVtkInitialValues(cameraDistance, cameraDistance);
140 firstSetView = false;
141 }
142
143 // projection type and view angle and zoom factor
144 G4double fieldHalfAngle = fVP.GetFieldHalfAngle();
145 G4double zoomFactor = fVP.GetZoomFactor();
146 vtkCamera* activeCamera = renderer->GetActiveCamera();
147 if(fieldHalfAngle == 0) {
148 activeCamera->SetParallelProjection(1);
149 activeCamera->SetParallelScale(activeCamera->GetParallelScale()/zoomFactor);
150 }
151 else {
152 activeCamera->SetParallelProjection(0);
153 activeCamera->SetViewAngle(2*fieldHalfAngle/M_PI*180);
154 activeCamera->SetPosition(cameraPosition.x()/zoomFactor,
155 cameraPosition.y()/zoomFactor,
156 cameraPosition.z()/zoomFactor);
157 }
158
159 // camera roll
160 // renderer->GetActiveCamera()->SetRoll(0);
161
162 // camera up direction
163 const G4Vector3D upVector = fVP.GetUpVector();
164 renderer->GetActiveCamera()->SetViewUp(upVector.x(),
165 upVector.y(),
166 upVector.z());
167
168 // Light
169 const G4Vector3D lightDirection = fVP.GetLightpointDirection();
170 G4bool lightsMoveWithCamera = fVP.GetLightsMoveWithCamera();
171 G4Vector3D lightPosition =
172 targetPoint + lightDirection.unit() * cameraDistance;
173
174 vtkLightCollection* currentLights = renderer->GetLights();
175 if (currentLights->GetNumberOfItems() != 0)
176 {
177 auto currentLight = dynamic_cast<vtkLight*>(currentLights->GetItemAsObject(0));
178 if (currentLight)
179 {
180 currentLight->SetPosition(lightPosition.x(),
181 lightPosition.y(),
182 lightPosition.z());
183 if (lightsMoveWithCamera)
184 {currentLight->SetLightTypeToCameraLight();}
185 else
186 {currentLight->SetLightTypeToSceneLight();}
187 }
188 }
189
190 // Rotation style
192 if (rotationStyle == G4ViewParameters::RotationStyle::freeRotation) {
193 vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
194 vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
195 renderWindowInteractor->SetInteractorStyle(style);
196 }
197 else if(rotationStyle == G4ViewParameters::RotationStyle::constrainUpDirection) {
198 // camera->SetViewUp(upVector.x(), upVector.y(), upVector.z());
199 vtkSmartPointer<vtkInteractorStyleTerrain> style =
200 vtkSmartPointer<vtkInteractorStyleTerrain>::New();
201 renderWindowInteractor->SetInteractorStyle(style);
202 }
203}
204
206 vtkActorCollection *actors = renderer->GetActors();
207 vtkActor *actor = actors->GetLastActor();
208
209 while(actor) {
210#ifdef G4VTKDEBUG
211 G4cout << "G4VtkViewer::ClearView() remove actor " << actor << G4endl;
212#endif
213 renderer->RemoveActor(actor);
214 actor = actors->GetLastActor();
215 }
216
217 vtkPropCollection *props = renderer->GetViewProps();
218 vtkProp *prop = props->GetLastProp();
219
220 while(prop) {
221#ifdef G4VTKDEBUG
222 G4cout << "G4VtkViewer::ClearView() remove prop " << prop << G4endl;
223#endif
224 renderer->RemoveViewProp(prop);
225 prop = props->GetLastProp();
226 }
227
228 G4VtkSceneHandler& fVtkSceneHandler =
229 dynamic_cast<G4VtkSceneHandler&>(fSceneHandler);
230 fVtkSceneHandler.Clear();
231}
232
234 // First, a view should decide when to re-visit the G4 kernel.
235 // Sometimes it might not be necessary, e.g., if the scene is stored
236 // in a graphical database (e.g., OpenGL's display lists) and only
237 // the viewing angle has changed. But graphics systems without a
238 // graphical database will always need to visit the G4 kernel.
239
240 NeedKernelVisit(); // Default is - always visit G4 kernel.
241 // Note: this routine sets the fNeedKernelVisit flag of *all* the
242 // views of the scene.
243
244 ProcessView(); // The basic logic is here.
245
246 // Add HUD
247 DrawViewHUD();
248
249 // ...before finally...
250 FinishView(); // Flush streams and/or swap buffers.
251}
252
254{
255 // make sure text is always visible
257 infoTextActor->GetTextProperty()->SetColor(std::fmod(colour.GetRed() + 0.5, 1.0),
258 std::fmod(colour.GetGreen() + 0.5, 1.0),
259 std::fmod(colour.GetBlue() + 0.5, 1.0));
260 infoTextActor->GetTextProperty()->SetFontSize(20);
261 infoCallback->SetTextActor(infoTextActor);
262 renderer->AddObserver(vtkCommand::EndEvent, infoCallback);
263 renderer->AddActor(infoTextActor);
264}
265
267{
268 _renderWindow->SetMultiSamples(0);
269
270 vtkNew<vtkShadowMapPass> shadows;
271 vtkNew<vtkSequencePass> seq;
272
273 vtkNew<vtkRenderPassCollection> passes;
274 passes->AddItem(shadows->GetShadowMapBakerPass());
275 passes->AddItem(shadows);
276 seq->SetPasses(passes);
277
278 vtkNew<vtkCameraPass> cameraP;
279 cameraP->SetDelegatePass(seq);
280
281 // tell the renderer to use our render pass pipeline
282 vtkOpenGLRenderer* glrenderer = dynamic_cast<vtkOpenGLRenderer*>(renderer.GetPointer());
283 glrenderer->SetPass(cameraP);
284}
285
287{
288#ifdef G4VTKDEBUG
289 G4cout << "G4VtkViewer::ShowView() called." << G4endl;
290 // static_cast<G4VtkSceneHandler&>(fSceneHandler).PrintStores();
291#endif
292
293 G4VtkSceneHandler& fVtkSceneHandler =
294 dynamic_cast<G4VtkSceneHandler&>(fSceneHandler);
295 fVtkSceneHandler.Modified();
296
297 infoTextActor->GetTextProperty()->SetFontSize(28);
299
300 // make sure text is always visible
301 infoTextActor->GetTextProperty()->SetColor(std::fmod(colour.GetRed() + 0.5, 1.0),
302 std::fmod(colour.GetGreen() + 0.5, 1.0),
303 std::fmod(colour.GetBlue() + 0.5, 1.0));
304 infoTextActor->GetTextProperty()->SetFontSize(20);
305 infoCallback->SetTextActor(infoTextActor);
306 renderer->AddObserver(vtkCommand::EndEvent, infoCallback);
307 geant4Callback->SetGeant4ViewParameters(&fVP);
308 renderer->AddObserver(vtkCommand::EndEvent, geant4Callback);
309 renderer->AddActor(infoTextActor);
310
311 _renderWindow->Render();
312 renderWindowInteractor->Initialize();
313 renderWindowInteractor->Start();
314}
315
317{
318 G4VtkSceneHandler& fVtkSceneHandler =
319 dynamic_cast<G4VtkSceneHandler&>(fSceneHandler);
320 fVtkSceneHandler.Modified();
321
322 _renderWindow->Render();
323}
324
326{
327
328 vtkImageWriter *imWriter = nullptr;
329
330 if(format == "bmp") {
331 imWriter = vtkBMPWriter::New();
332 }
333 else if (format == "jpg") {
334 imWriter = vtkJPEGWriter::New();
335 }
336 else if (format == "pnm") {
337 imWriter = vtkPNMWriter::New();
338 }
339 else if (format == "png") {
340 imWriter = vtkPNGWriter::New();
341 }
342 else if (format == "tiff") {
343 imWriter = vtkTIFFWriter::New();
344 }
345 else if (format == "ps") {
346 imWriter = vtkPostScriptWriter::New();
347 }
348 else {
349 imWriter = vtkPNGWriter::New();
350 }
351
352 _renderWindow->Render();
353
354 vtkSmartPointer<vtkWindowToImageFilter> winToImage = vtkSmartPointer<vtkWindowToImageFilter>::New();
355 winToImage->SetInput(_renderWindow);
356 winToImage->SetScale(1);
357 if(format == "ps")
358 {
359 winToImage->SetInputBufferTypeToRGB();
360 winToImage->ReadFrontBufferOff();
361 winToImage->Update();
362 }
363 else
364 {winToImage->SetInputBufferTypeToRGBA();}
365
366 imWriter->SetFileName((path+"."+format).c_str());
367 imWriter->SetInputConnection(winToImage->GetOutputPort());
368 imWriter->Write();
369}
370
372{
373 vtkSmartPointer<vtkRenderWindow> _rw1 = vtkSmartPointer<vtkRenderWindow>::New();
374 _rw1->AddRenderer(_renderWindow->GetRenderers()->GetFirstRenderer());
375 vtkSmartPointer<vtkOBJExporter> exporter = vtkSmartPointer<vtkOBJExporter>::New();
376 exporter->SetRenderWindow(_rw1);
377 exporter->SetFilePrefix(path.c_str());
378 exporter->Write();
379}
380
382{
383 vtkSmartPointer<vtkRenderWindow> _rw1 = vtkSmartPointer<vtkRenderWindow>::New();
384 _rw1->AddRenderer(_renderWindow->GetRenderers()->GetFirstRenderer());
385 vtkSmartPointer<vtkVRMLExporter> exporter = vtkSmartPointer<vtkVRMLExporter>::New();
386 exporter->SetRenderWindow(_rw1);
387 exporter->SetFileName((path+".vrml").c_str());
388 exporter->Write();
389}
390
392{
393 vtkSmartPointer<vtkRenderWindow> _rw1 = vtkSmartPointer<vtkRenderWindow>::New();
394 _rw1->AddRenderer(_renderWindow->GetRenderers()->GetFirstRenderer());
395 vtkSmartPointer<vtkSingleVTPExporter> exporter = vtkSmartPointer<vtkSingleVTPExporter>::New();
396 exporter->SetRenderWindow(_rw1);
397 exporter->SetFileName((path+".vtp").c_str());
398 exporter->Write();
399}
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define M_PI
Definition: SbMath.h:33
G4double GetBlue() const
Definition: G4Colour.hh:154
G4double GetRed() const
Definition: G4Colour.hh:152
G4double GetGreen() const
Definition: G4Colour.hh:153
virtual const G4VisExtent & GetExtent() const
void ProcessView()
Definition: G4VViewer.cc:105
G4VSceneHandler & fSceneHandler
Definition: G4VViewer.hh:215
void NeedKernelVisit()
Definition: G4VViewer.cc:78
G4ViewParameters fDefaultVP
Definition: G4VViewer.hh:220
G4ViewParameters fVP
Definition: G4VViewer.hh:219
G4int GetWindowLocationHintX() const
void SetAutoRefresh(G4bool)
G4double GetCameraDistance(G4double radius) const
unsigned int GetWindowSizeHintX() const
const G4Colour & GetBackgroundColour() const
const G4Vector3D & GetLightpointDirection() const
const G4Vector3D & GetViewpointDirection() const
const G4Point3D & GetCurrentTargetPoint() const
G4double GetFieldHalfAngle() const
G4double GetZoomFactor() const
const G4Vector3D & GetUpVector() const
RotationStyle GetRotationStyle() const
G4int GetWindowLocationHintY() const
unsigned int GetWindowSizeHintY() const
G4bool GetLightsMoveWithCamera() const
G4double GetExtentRadius() const
Definition: G4VisExtent.cc:75
vtkNew< vtkCamera > camera
Definition: G4VtkViewer.hh:184
void ExportVRMLScene(G4String)
Definition: G4VtkViewer.cc:381
void DrawView()
Definition: G4VtkViewer.cc:233
void SetView()
Definition: G4VtkViewer.cc:113
vtkNew< vtkGeant4Callback > geant4Callback
Definition: G4VtkViewer.hh:182
void ExportScreenShot(G4String, G4String)
Definition: G4VtkViewer.cc:325
void DrawShadows()
Definition: G4VtkViewer.cc:266
vtkNew< vtkTextActor > infoTextActor
Definition: G4VtkViewer.hh:178
vtkRenderWindowInteractor * renderWindowInteractor
Definition: G4VtkViewer.hh:187
void ShowView()
Definition: G4VtkViewer.cc:286
G4VtkViewer(G4VSceneHandler &, const G4String &name)
Definition: G4VtkViewer.cc:62
vtkNew< vtkInfoCallback > infoCallback
Definition: G4VtkViewer.hh:181
vtkNew< vtkRenderer > renderer
Definition: G4VtkViewer.hh:185
void Initialise()
Definition: G4VtkViewer.cc:70
G4bool firstSetView
Definition: G4VtkViewer.hh:190
void ExportVTPScene(G4String)
Definition: G4VtkViewer.cc:391
void ExportOBJScene(G4String)
Definition: G4VtkViewer.cc:371
virtual ~G4VtkViewer()
Definition: G4VtkViewer.cc:111
void FinishView()
Definition: G4VtkViewer.cc:316
vtkRenderWindow * _renderWindow
Definition: G4VtkViewer.hh:186
void ClearView()
Definition: G4VtkViewer.cc:205
void DrawViewHUD()
Definition: G4VtkViewer.cc:253
BasicVector3D< T > unit() const
const char * name(G4int ptype)