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 #ifndef G4VTKUNSTRUCTUREDGRIDPIPELINE_HH 27 #define G4VTKUNSTRUCTUREDGRIDPIPELINE_HH 28 29 #include <map> 30 #include <vector> 31 32 #include "G4VVtkPipeline.hh" 33 #include "G4PseudoScene.hh" 34 35 #include <vtkSmartPointer.h> 36 #include <vtkPoints.h> 37 #include <vtkCharArray.h> 38 #include <vtkDoubleArray.h> 39 #include <vtkUnstructuredGrid.h> 40 #if VTK_MINOR_VERSION >= 2 41 #include <vtkStaticCleanUnstructuredGrid.h> 42 #endif 43 #include <vtkLookupTable.h> 44 #include <vtkDiscretizableColorTransferFunction.h> 45 46 class vtkClipDataSet; 47 class vtkDataSetMapper; 48 class vtkUnstructuredGridVolumeMapper; 49 class vtkUnstructuredGridVolumeRayCastMapper; 50 class vtkUnstructuredGridVolumeZSweepMapper; 51 class vtkOpenGLProjectedTetrahedraMapper; 52 class vtkActor; 53 54 class G4Mesh; 55 56 class G4VtkUnstructuredGridPipeline : public G4VVtkPipeline 57 { 58 public: 59 G4VtkUnstructuredGridPipeline(G4String name, const G4VtkVisContext& vc); 60 61 ~G4VtkUnstructuredGridPipeline() = default; 62 63 void AddFilter(vtkSmartPointer<vtkUnstructuredGridAlgorithm> f) { filters.push_back(f); } 64 vtkSmartPointer<vtkUnstructuredGridAlgorithm> GetFilter(G4int iFilter) { return filters[iFilter]; } 65 std::size_t GetNumberOfFilters() { return filters.size(); } 66 vtkSmartPointer<vtkUnstructuredGridAlgorithm> GetFinalFilter() { return filters[filters.size() - 1]; } 67 68 void Modified() {}; 69 void Clear() {}; 70 void Print() {}; 71 72 void Enable() {}; 73 void Disable() {}; 74 75 void SetUnstructuredGridData(const G4Mesh &mesh); 76 77 protected: 78 class PseudoSceneVtkBase: public G4PseudoScene { 79 public: 80 PseudoSceneVtkBase(G4PhysicalVolumeModel* pvModel, // input 81 G4int depth, 82 vtkPoints *points, 83 vtkDoubleArray *pointColourValues, 84 vtkDoubleArray *cellColourValues, 85 vtkDoubleArray *pointColourIndices, 86 vtkDoubleArray *cellColourIndices, 87 vtkDiscretizableColorTransferFunction *colourLUT, 88 vtkUnstructuredGrid *unstructuredGrid) // input...the following are outputs by reference 89 : fpPVModel(pvModel), fDepth(depth), fpPoints(points), fpGrid(unstructuredGrid), 90 fpPointColourValues(pointColourValues), fpCellColourValues(cellColourValues), 91 fpPointColourIndices(pointColourIndices), fpCellColourIndices(cellColourIndices), 92 fpColourLUT(colourLUT) 93 {} 94 95 G4int GetNumberOfPoints() {return iPoint;} 96 G4int GetNumberOfCells() {return iCell;} 97 G4int GetNumberOfAddedCells() {return iCellAdd;} 98 void DumpColourMap() { 99 for(auto i : fpColourMap) { 100 G4cout << i.first << " " << i.second << G4endl; 101 } 102 } 103 104 protected: 105 using G4PseudoScene::AddSolid; // except for... 106 void AddSolid(const G4VSolid& /*solid*/) override {}; 107 void AddSolid(const G4Box& /*box*/) override{}; 108 void ProcessVolume(const G4VSolid&) override { 109 // Do nothing if uninteresting solids found, e.g., the container if not marked invisible. 110 } 111 G4PhysicalVolumeModel* fpPVModel; 112 G4int fDepth; 113 vtkSmartPointer<vtkPoints> fpPoints; 114 vtkSmartPointer<vtkUnstructuredGrid> fpGrid; 115 vtkSmartPointer<vtkDoubleArray> fpPointColourValues; 116 vtkSmartPointer<vtkDoubleArray> fpCellColourValues; 117 vtkSmartPointer<vtkDoubleArray> fpPointColourIndices; 118 vtkSmartPointer<vtkDoubleArray> fpCellColourIndices; 119 std::map<std::size_t,double> fpColourMap; 120 vtkSmartPointer<vtkDiscretizableColorTransferFunction> fpColourLUT; 121 std::vector<G4ThreeVector> fpPointVector; 122 std::map<std::size_t, std::size_t> fpPointMap; 123 G4int iPoint = 0; 124 G4int iCell = 0; 125 G4int iCellAdd = 0; 126 }; 127 class PseudoSceneForTetCells: public PseudoSceneVtkBase { 128 public: 129 PseudoSceneForTetCells(G4PhysicalVolumeModel* pvModel, // input 130 G4int depth, 131 vtkPoints *points, 132 vtkDoubleArray *pointColourValues, 133 vtkDoubleArray *cellColourValues, 134 vtkDoubleArray *pointColourIndices, 135 vtkDoubleArray *cellColourIndices, 136 vtkDiscretizableColorTransferFunction *colourLUT, 137 vtkUnstructuredGrid *unstructuredGrid) // input...the following are outputs by reference 138 : PseudoSceneVtkBase(pvModel,depth,points,pointColourValues,cellColourValues, 139 pointColourIndices, cellColourIndices, colourLUT, unstructuredGrid) 140 {} 141 private: 142 using G4PseudoScene::AddSolid; // except for... 143 void AddSolid(const G4VSolid& solid) override; 144 void ProcessVolume(const G4VSolid&) override {} 145 }; 146 class PseudoSceneForCubicalCells: public PseudoSceneVtkBase { 147 public: 148 PseudoSceneForCubicalCells(G4PhysicalVolumeModel* pvModel, // input 149 G4int depth, 150 vtkPoints *points, 151 vtkDoubleArray *pointColourValues, 152 vtkDoubleArray *cellColourValues, 153 vtkDoubleArray *pointColourIndices, 154 vtkDoubleArray *cellColourIndices, 155 vtkDiscretizableColorTransferFunction *colourLUT, 156 vtkUnstructuredGrid *unstructuredGrid) // input...the following are outputs by reference 157 : PseudoSceneVtkBase(pvModel,depth,points,pointColourValues,cellColourValues, 158 pointColourIndices,cellColourIndices,colourLUT, unstructuredGrid) 159 {} 160 private: 161 using G4PseudoScene::AddSolid; // except for... 162 void AddSolid(const G4Box& box) override; 163 void ProcessVolume(const G4VSolid&) override {} 164 }; 165 166 private: 167 vtkSmartPointer<vtkPoints> points; 168 vtkSmartPointer<vtkDoubleArray> pointColourValues; 169 vtkSmartPointer<vtkDoubleArray> cellColourValues; 170 vtkSmartPointer<vtkDoubleArray> pointColourIndices; 171 vtkSmartPointer<vtkDoubleArray> cellColourIndices; 172 vtkSmartPointer<vtkDiscretizableColorTransferFunction> colourLUT; 173 174 vtkSmartPointer<vtkUnstructuredGrid> unstructuredGrid; 175 std::vector<vtkSmartPointer<vtkUnstructuredGridAlgorithm>> filters; // derived types can store filters in this vector 176 #if VTK_MINOR_VERSION >= 2 177 vtkSmartPointer<vtkStaticCleanUnstructuredGrid> clean; 178 #endif 179 vtkSmartPointer<vtkClipDataSet> clip; 180 vtkSmartPointer<vtkDataSetMapper> mapper; 181 vtkSmartPointer<vtkUnstructuredGridVolumeRayCastMapper> volumeMapper; 182 vtkSmartPointer<vtkActor> actor; 183 vtkSmartPointer<vtkVolume> volume; 184 }; 185 186 187 #endif // G4VTKUNSTRUCTUREDGRIDPIPELINE_HH 188