Geant4 Cross Reference |
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 #include "G4VtkImagePipeline.hh" 27 28 #include "G4String.hh" 29 #include "G4ViewParameters.hh" 30 #include "G4VisAttributes.hh" 31 #include "G4VtkViewer.hh" 32 #include "G4VtkVisContext.hh" 33 34 #include <vtkImageActor.h> 35 #include <vtkImageAlgorithm.h> 36 #include <vtkImageMapper3D.h> 37 #include <vtkImageProperty.h> 38 #include <vtkImageReader2.h> 39 #include <vtkImageReader2Factory.h> 40 #include <vtkMatrix4x4.h> 41 #include <vtkSmartPointer.h> 42 #include <vtkImageFlip.h> 43 44 G4VtkImagePipeline::G4VtkImagePipeline(const G4String& nameIn, const G4VtkVisContext& vcIn) 45 : G4VVtkPipeline(nameIn, "G4VtkImagePipeline", vcIn, false, vcIn.fViewer->renderer) 46 { 47 actor = vtkSmartPointer<vtkImageActor>::New(); 48 49 actor->GetProperty()->SetOpacity(vc.alpha); 50 51 auto transform = vtkSmartPointer<vtkMatrix4x4>::New(); 52 double transformArray[16] = {vc.fTransform.xx(), 53 vc.fTransform.xy(), 54 vc.fTransform.xz(), 55 vc.fTransform.dx(), 56 vc.fTransform.yx(), 57 vc.fTransform.yy(), 58 vc.fTransform.yz(), 59 vc.fTransform.dy(), 60 vc.fTransform.zx(), 61 vc.fTransform.zy(), 62 vc.fTransform.zz(), 63 vc.fTransform.dz(), 64 0., 65 0., 66 0., 67 1.}; 68 transform->DeepCopy(transformArray); 69 actor->SetUserMatrix(transform); 70 actor->GetProperty()->SetOpacity(vc.alpha); 71 72 vc.fViewer->renderer->AddActor(GetActor()); 73 } 74 75 void G4VtkImagePipeline::SetImage(const G4String& fileName) 76 { 77 vtkNew<vtkImageReader2Factory> readerFactory; 78 vtkSmartPointer<vtkImageReader2> imageReader; 79 imageReader.TakeReference(readerFactory->CreateImageReader2(fileName.c_str())); 80 imageReader->SetFileName(fileName.c_str()); 81 imageReader->Update(); 82 83 vtkNew<vtkImageFlip> flip; 84 flip->SetInputConnection(imageReader->GetOutputPort()); 85 flip->SetFilteredAxis(1); 86 87 actor->GetMapper()->SetInputConnection(flip->GetOutputPort()); 88 AddFilter(imageReader); 89 } 90 91 void G4VtkImagePipeline::SetTransformation(const G4Transform3D& transformation) 92 { 93 vtkSmartPointer<vtkMatrix4x4> t = vtkSmartPointer<vtkMatrix4x4>::New(); 94 t->SetElement(0, 0, transformation.xx()); 95 t->SetElement(0, 1, transformation.xy()); 96 t->SetElement(0, 2, transformation.xz()); 97 t->SetElement(0, 3, transformation.dx()); 98 99 t->SetElement(1, 0, transformation.yx()); 100 t->SetElement(1, 1, transformation.yy()); 101 t->SetElement(1, 2, transformation.yz()); 102 t->SetElement(1, 3, transformation.dy()); 103 104 t->SetElement(2, 0, transformation.zx()); 105 t->SetElement(2, 1, transformation.zy()); 106 t->SetElement(2, 2, transformation.zz()); 107 t->SetElement(2, 3, transformation.dz()); 108 109 t->SetElement(3, 0, 0); 110 t->SetElement(3, 1, 0); 111 t->SetElement(3, 2, 0); 112 t->SetElement(3, 3, 1); 113 actor->SetUserMatrix(t); 114 } 115 116 void G4VtkImagePipeline::Print() 117 { 118 for (auto c : childPipelines) 119 c->Print(); 120 } 121 122 void G4VtkImagePipeline::Modified() 123 { 124 actor->Update(); 125 126 for (auto c : childPipelines) 127 c->Modified(); 128 } 129 130 void G4VtkImagePipeline::Clear() 131 { 132 if (actor != nullptr) renderer->RemoveActor(actor); 133 134 for (auto c : childPipelines) 135 c->Clear(); 136 } 137 138 void G4VtkImagePipeline::Disable() 139 { 140 GetActor()->SetVisibility(0); 141 } 142 143 void G4VtkImagePipeline::Enable() 144 { 145 GetActor()->SetVisibility(1); 146 }