Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 26 #include "G4VtkClipClosedSurfacePipeline.hh" 27 28 #include "G4VtkViewer.hh" 29 #include "G4VtkVisContext.hh" 30 31 #include <vtkActor.h> 32 #include <vtkClipPolyData.h> 33 #include <vtkPlane.h> 34 #include <vtkPlaneCollection.h> 35 #include <vtkPolyDataAlgorithm.h> 36 #include <vtkPolyDataMapper.h> 37 #include <vtkPolyDataNormals.h> 38 #include <vtkProperty.h> 39 #include <vtkSmartPointer.h> 40 #include <vtkClipClosedSurface.h> 41 42 G4VtkClipClosedSurfacePipeline::G4VtkClipClose 43 G4String nameIn, const G4VtkVisContext& vcIn 44 G4bool useVcColour) 45 : G4VVtkPipeline(nameIn, G4String("G4VtkClip 46 vcIn.fViewer->renderer) 47 { 48 // create implicit function for clipping 49 plane = vtkSmartPointer<vtkPlane>::New(); 50 plane->SetOrigin(0, 0, 0); 51 plane->SetNormal(0, 1, 0); 52 53 vtkNew<vtkPlaneCollection> planes; 54 planes->AddItem(plane); 55 56 // clipper 57 clipper = vtkSmartPointer<vtkClipClosedSurfa 58 clipper->SetClippingPlanes(planes); 59 clipper->SetInputConnection(filter->GetOutpu 60 // clipper->SetScalarModeToColors(); 61 clipper->PassPointDataOn(); 62 63 // calculate normals with a feature angle of 64 auto filterNormals = vtkSmartPointer<vtkPoly 65 filterNormals->SetFeatureAngle(45); 66 filterNormals->SetInputConnection(clipper->G 67 68 // mapper 69 mapper = vtkSmartPointer<vtkPolyDataMapper>: 70 mapper->SetInputConnection(filterNormals->Ge 71 mapper->SetColorModeToDirectScalars(); 72 mapper->ScalarVisibilityOn(); 73 mapper->SetResolveCoincidentTopologyToPolygo 74 mapper->SetRelativeCoincidentTopologyPolygon 75 76 // add to actor 77 actor = vtkSmartPointer<vtkActor>::New(); 78 actor->SetMapper(mapper); 79 actor->SetVisibility(1); 80 81 // colour parameters 82 if (useVcColour) { 83 actor->GetProperty()->SetOpacity(vc.alpha) 84 actor->GetProperty()->SetColor(vc.red, vc. 85 } 86 87 // set actor properties from vis context 88 if (vc.fDrawingStyle == G4ViewParameters::hs 89 actor->GetProperty()->SetRepresentationToS 90 } 91 else if (vc.fDrawingStyle == G4ViewParameter 92 actor->GetProperty()->SetRepresentationToS 93 } 94 else if (vc.fDrawingStyle == G4ViewParameter 95 actor->GetProperty()->SetRepresentationToW 96 } 97 98 // shading parameters 99 actor->GetProperty()->SetAmbient(0.2); 100 actor->GetProperty()->SetDiffuse(0.7); 101 actor->GetProperty()->SetSpecular(0.1); 102 actor->GetProperty()->SetSpecularPower(1); 103 104 // add to renderer 105 vc.fViewer->renderer->AddActor(actor); 106 } 107 108 void G4VtkClipClosedSurfacePipeline::SetPlane( 109 { 110 auto normal = planeIn.normal(); 111 auto point = planeIn.point(); 112 this->SetPlane(point.x(), point.y(), point.z 113 } 114 115 void G4VtkClipClosedSurfacePipeline::SetPlane( 116 117 { 118 plane->SetOrigin(x, y, z); 119 plane->SetNormal(nx, ny, nz); 120 this->Modified(); 121 } 122 123 void G4VtkClipClosedSurfacePipeline::Transform 124 125 126 127 { 128 auto o = plane->GetOrigin(); 129 auto n = plane->GetNormal(); 130 131 SetPlane(r00 * o[0] + r01 * o[1] + r02 * o[2 132 r20 * o[0] + r21 * o[1] + r22 * o[2 133 r10 * n[0] + r11 * n[1] + r12 * n[2 134 } 135 136 void G4VtkClipClosedSurfacePipeline::Enable() 137 { 138 actor->SetVisibility(1); 139 } 140 void G4VtkClipClosedSurfacePipeline::Disable() 141 { 142 actor->SetVisibility(0); 143 }