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 /// \file visualization/perspective/src/PerspectiveVisAction.cc 27 /// \brief Implementation of the PerspectiveVisAction class 28 // 29 // 30 31 #include "PerspectiveVisAction.hh" 32 33 #include "PerspectiveVisActionMessenger.hh" 34 35 #include "G4Box.hh" 36 #include "G4Point3D.hh" 37 #include "G4Polyhedron.hh" 38 #include "G4Polyline.hh" 39 #include "G4SystemOfUnits.hh" 40 #include "G4VVisManager.hh" 41 #include "G4Vector3D.hh" 42 #include "G4VisAttributes.hh" 43 44 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 45 46 PerspectiveVisAction::PerspectiveVisAction() 47 : G4VUserVisAction(), 48 fpVisManager(0), 49 fOptionString("none"), 50 fScene("room-and-chair"), 51 fRoomX(2.5 * m), // Half-lengths... 52 fRoomY(2.5 * m), 53 fRoomZ(1.3 * m), 54 fWindowX(10 * cm), 55 fWindowY(75 * cm), 56 fWindowZ(50 * cm), 57 fWindowSillHeight(80 * cm), 58 fWindowOffset(-50 * cm), 59 fDoorFrameX(10 * cm), 60 fDoorFrameY(50 * cm), 61 fDoorFrameZ(1 * m), 62 fDoorFrameOffset(1.5 * m), 63 fDoorX(2 * cm), 64 fDoorY(50 * cm), 65 fDoorZ(1 * m), 66 fChairX(20 * cm), // Half overall width. 67 fChairY(20 * cm), // Half overall depth. 68 fChairZ(45 * cm), // Half overall height. 69 fChairSeat(20 * cm), // Half height of top of seat. 70 fChairThickness(3. * cm) // Half thicknes of back, seat, legs. 71 { 72 new PerspectiveVisActionMessenger(this); 73 } 74 75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 76 77 void PerspectiveVisAction::Draw() 78 { 79 fpVisManager = G4VVisManager::GetConcreteInstance(); 80 if (fpVisManager) { 81 // All scenes assume upvector z and origin on "floor"... 82 83 if (fScene == "room-and-chair") { 84 RoomAndChair(); 85 } 86 } 87 } 88 89 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 90 91 void PerspectiveVisAction::RoomAndChair() 92 { 93 // Simple box, size of a room, translated so origin is on xy "floor"... 94 G4VisAttributes room_visAtts(G4Colour::Red()); 95 room_visAtts.SetForceWireframe(true); 96 ExtendedDraw(G4Box("box", fRoomX, fRoomY, fRoomZ), room_visAtts, G4TranslateZ3D(fRoomZ)); 97 98 // Windows... 99 G4Box("window", fWindowX, fWindowY, fWindowZ); 100 ExtendedDraw(G4Box("window-x", fWindowX, fWindowY, fWindowZ), room_visAtts, 101 G4Translate3D(-fRoomX - fWindowX, fWindowOffset, fWindowY + fWindowSillHeight)); 102 ExtendedDraw(G4Box("window-y1", fWindowX, fWindowY, fWindowZ), room_visAtts, 103 G4Translate3D(0., -fRoomY - fWindowX, fWindowY + fWindowSillHeight) 104 * G4RotateZ3D(90. * deg)); 105 ExtendedDraw(G4Box("window-y2", fWindowX, fWindowY, fWindowZ), room_visAtts, 106 G4Translate3D(0., fRoomY + fWindowX, fWindowY + fWindowSillHeight) 107 * G4RotateZ3D(-90. * deg)); 108 109 // Door... 110 ExtendedDraw(G4Box("door-frame", fDoorFrameX, fDoorFrameY, fDoorFrameZ), room_visAtts, 111 G4Translate3D(-fRoomX - fDoorFrameX, fDoorFrameOffset, fDoorFrameZ)); 112 ExtendedDraw(G4Box("door", fDoorX, fDoorY, fDoorZ), room_visAtts, 113 G4Translate3D(-fRoomX - fDoorX, fDoorFrameOffset, fDoorZ) * G4TranslateY3D(fDoorY) 114 * G4RotateZ3D(60. * deg) 115 * G4TranslateY3D(-fDoorY)); // Last transform operates first. 116 117 // Chair... 118 G4VisAttributes chair_visAtts(G4Colour::Cyan()); 119 G4Transform3D A = G4RotateZ3D(90. * deg); // Turn through 90 deg. 120 G4Transform3D B = G4RotateY3D(90. * deg); // Lie down. 121 G4Transform3D C = G4RotateZ3D(-20. * deg); // Rotate a little. 122 G4Transform3D D = G4TranslateZ3D(fChairY); // Place on floor. 123 G4Transform3D E = G4TranslateY3D(-0.5 * fRoomY); // Move over to the left... 124 G4Transform3D chair_transform = E * D * C * B * A; 125 Chair(chair_visAtts, chair_transform); 126 } 127 128 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 129 130 void PerspectiveVisAction::Chair(const G4VisAttributes& visAtts, const G4Transform3D& transform) 131 { 132 // Origin is on floor, z = 0, and in the xy centre... 133 ExtendedDraw(G4Box("chair-back", fChairX, fChairThickness, fChairZ - fChairSeat), visAtts, 134 transform * G4Translate3D(0., -fChairY + fChairThickness, fChairZ + fChairSeat)); 135 ExtendedDraw(G4Box("chair-seat", fChairX, fChairY, fChairThickness), visAtts, 136 transform * G4TranslateZ3D(-fChairThickness + 2. * fChairSeat)); 137 for (int i = -1; i < 2; i += 2) { 138 for (int j = -1; j < 2; j += 2) { 139 ExtendedDraw( 140 G4Box("chair-leg", fChairThickness, fChairThickness, fChairSeat - fChairThickness), visAtts, 141 transform 142 * G4Translate3D(i * (fChairX - fChairThickness), j * (fChairY - fChairThickness), 143 fChairSeat - fChairThickness)); 144 } 145 } 146 } 147 148 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 149 150 void PerspectiveVisAction::ExtendedDraw(const G4VSolid& solid, const G4VisAttributes& visAtts, 151 const G4Transform3D& transform) 152 { 153 static const G4double extender = 100. * m; 154 static const G4Vector3D x(1, 0, 0); 155 static const G4Vector3D y(0, 1, 0); 156 static const G4Vector3D z(0, 0, 1); 157 158 // Draw extended edges as requested... 159 G4bool any = false, A = false, X = false, Y = false, Z = false; 160 if (G4StrUtil::contains(fOptionString, "a")) { 161 A = true; 162 any = true; 163 } 164 if (G4StrUtil::contains(fOptionString, "x")) { 165 X = true; 166 any = true; 167 } 168 if (G4StrUtil::contains(fOptionString, "y")) { 169 Y = true; 170 any = true; 171 } 172 if (G4StrUtil::contains(fOptionString, "z")) { 173 Z = true; 174 any = true; 175 } 176 if (any) { 177 G4Polyhedron* polyhedron = solid.GetPolyhedron(); 178 G4bool isAuxEdgeVisible = false; // How do I pick this up??? Can't. 179 G4bool notLastFace; 180 do { 181 G4int n; 182 G4Point3D nodes[4]; 183 notLastFace = polyhedron->GetNextFacet(n, nodes); 184 G4bool notLastEdge; 185 do { 186 G4Point3D v1, v2; 187 G4int edgeFlag; 188 notLastEdge = polyhedron->GetNextEdge(v1, v2, edgeFlag); 189 if (isAuxEdgeVisible || edgeFlag > 0) { 190 G4Vector3D v21 = v2 - v1; 191 // Check for components of actual edge... 192 G4Vector3D v21a = v21; 193 v21a.transform(transform); 194 // G4cout << "v21a: " << v21a << G4endl; 195 using namespace std; 196 if (A || (Z && abs(v21a.z()) > sqrt(v21a.x() * v21a.x() + v21a.y() * v21a.y())) 197 || (X && abs(v21a.x()) > sqrt(v21a.y() * v21a.y() + v21a.z() * v21a.z())) 198 || (Y && abs(v21a.y()) > sqrt(v21a.x() * v21a.x() + v21a.x() * v21a.z()))) 199 { 200 G4Polyline edge; 201 edge.SetVisAttributes(G4Colour(.2, .2, .2)); 202 edge.push_back(v1 - extender * v21.unit()); 203 edge.push_back(v2 + extender * v21.unit()); 204 fpVisManager->Draw(edge, transform); 205 } 206 } 207 } while (notLastEdge); 208 } while (notLastFace); 209 } 210 211 // Draw actual object... 212 fpVisManager->Draw(solid, visAtts, transform); 213 } 214 215 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 216