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 // 27 // 28 // 29 // Andrew Walkden 16th April 1997 30 // G4OpenGLXmRotationCallbacks : 31 // Several callback functions used by 32 // elements of the control panel to 33 // rotate the view. 34 35 #include "G4OpenGLXmViewer.hh" 36 37 #include "G4PhysicalConstants.hh" 38 #include "G4Scene.hh" 39 #include "G4UImanager.hh" 40 #include "G4ios.hh" 41 42 void G4OpenGLXmViewer::theta_rotation_callback (Widget w, 43 XtPointer clientData, 44 XtPointer callData) 45 { 46 XmArrowButtonCallbackStruct *cbs = (XmArrowButtonCallbackStruct*) callData; 47 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData; 48 49 pView->rotate_right = get_boolean_userData (w); 50 51 if (cbs->reason == XmCR_ARM) { 52 rotate_in_theta (pView, NULL); 53 } else if (cbs->reason == XmCR_DISARM) { 54 XtRemoveTimeOut (pView->rotation_timer); 55 } 56 } 57 58 void G4OpenGLXmViewer::rotate_in_theta (XtPointer clientData, 59 XtIntervalId* timer_id) 60 { 61 //theta spin stuff here 62 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData; 63 64 if (pView->rotate_right) { 65 pView->rotateScene(1,0); 66 } else { 67 pView->rotateScene(-1,0); 68 } 69 /* 70 G4double delta_theta; 71 72 if (pView->fVP.GetLightsMoveWithCamera()) { 73 if (pView->rotate_right) { 74 delta_theta = -(pView->fRot_sens); 75 } else { 76 delta_theta = pView->fRot_sens; 77 } 78 } else { 79 if (pView->rotate_right) { 80 delta_theta = pView->fRot_sens; 81 } else { 82 delta_theta = -(pView->fRot_sens); 83 } 84 } 85 delta_theta *= deg; 86 // Rotates by fixed azimuthal angle delta_theta. 87 88 const G4Vector3D& vp = pView->fVP.GetViewpointDirection ().unit (); 89 const G4Vector3D& up = pView->fVP.GetUpVector ().unit (); 90 const G4Vector3D& zprime = up; 91 G4double cosalpha = up.dot (vp); 92 G4double sinalpha = std::sqrt (1. - std::pow (cosalpha, 2)); 93 G4Vector3D yprime = (zprime.cross (vp)).unit (); 94 G4Vector3D xprime = yprime.cross (zprime); 95 // Projection of vp on plane perpendicular to up... 96 G4Vector3D a1 = sinalpha * xprime; 97 // Required new projection... 98 G4Vector3D a2 = 99 sinalpha * (std::cos (delta_theta) * xprime + std::sin (delta_theta) * yprime); 100 // Required Increment vector... 101 G4Vector3D delta = a2 - a1; 102 // So new viewpoint is... 103 G4Vector3D viewPoint = vp + delta; 104 105 pView->fVP.SetViewAndLights (viewPoint); 106 */ 107 108 pView->SetView (); 109 pView->ClearView (); 110 pView->DrawView (); 111 112 pView->rotation_timer = XtAppAddTimeOut 113 (pView->app, 114 timer_id == NULL ? 500 : 1, 115 rotate_in_theta, 116 pView); 117 } 118 119 void G4OpenGLXmViewer::phi_rotation_callback (Widget w, 120 XtPointer clientData, 121 XtPointer callData) 122 { 123 XmArrowButtonCallbackStruct *cbs = (XmArrowButtonCallbackStruct*) callData; 124 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData; 125 126 pView->rotate_up = get_boolean_userData (w); 127 128 if (cbs->reason == XmCR_ARM) { 129 rotate_in_phi (pView, NULL); 130 } else if (cbs->reason == XmCR_DISARM) { 131 XtRemoveTimeOut (pView->rotation_timer); 132 } 133 } 134 135 void G4OpenGLXmViewer::rotate_in_phi (XtPointer clientData, 136 XtIntervalId* timer_id) 137 { 138 //phi spin stuff here 139 // G4double delta_alpha; 140 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData; 141 142 if (pView -> rotate_up) { 143 pView->rotateScene(0,-1); 144 } else { 145 pView->rotateScene(0,1); 146 } 147 /* 148 if (pView->fVP.GetLightsMoveWithCamera()) { 149 if (pView -> rotate_up) { 150 delta_alpha = -(pView->fRot_sens); 151 } else { 152 delta_alpha = pView->fRot_sens; 153 } 154 } else { 155 if (pView -> rotate_up) { 156 delta_alpha = pView->fRot_sens; 157 } else { 158 delta_alpha = -(pView->fRot_sens); 159 } 160 } 161 162 delta_alpha *= deg; 163 164 const G4Vector3D& vp = pView->fVP.GetViewpointDirection ().unit (); 165 const G4Vector3D& up = pView->fVP.GetUpVector ().unit (); 166 167 const G4Vector3D& xprime = vp; 168 G4Vector3D yprime = (up.cross(xprime)).unit(); 169 G4Vector3D zprime = (xprime.cross(yprime)).unit(); 170 171 G4Vector3D new_vp = std::cos(delta_alpha) * xprime + std::sin(delta_alpha) * zprime; 172 173 pView->fVP.SetViewAndLights (new_vp.unit()); 174 175 if (pView->fVP.GetLightsMoveWithCamera()) { 176 G4Vector3D new_up = (new_vp.cross(yprime)).unit(); 177 pView->fVP.SetUpVector(new_up); 178 } 179 180 */ 181 pView->SetView (); 182 pView->ClearView (); 183 pView->DrawView (); 184 185 pView->rotation_timer = XtAppAddTimeOut 186 (pView->app, 187 timer_id == NULL ? 500 : 1, 188 rotate_in_phi, 189 pView); 190 } 191 192 void G4OpenGLXmViewer::set_rot_sens_callback (Widget w, 193 XtPointer clientData, 194 XtPointer callData) 195 { 196 XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct*) callData; 197 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData; 198 short dp = -1; 199 G4float ten_to_the_dp = 10.; 200 201 XtVaGetValues (w, 202 XmNdecimalPoints, &dp, 203 NULL); 204 205 if (dp == 0) { 206 ten_to_the_dp = 1.; 207 } else if ( dp > 0) { 208 for (G4int i = 1; i < (G4int)dp; i++) { 209 ten_to_the_dp *= 10.; 210 } 211 } else { 212 G4Exception 213 ("G4OpenGLXmViewer::set_rot_sens_callback", 214 "opengl2004", FatalException, 215 "Bad value returned for dp in set_rot_sens_callback"); 216 } 217 218 pView->fRot_sens = (G4float)(cbs->value) / ten_to_the_dp; 219 } 220 221 void G4OpenGLXmViewer::set_rot_subject_callback (Widget w, 222 XtPointer clientData, 223 XtPointer) 224 { 225 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*)clientData; 226 227 G4int choice = get_int_userData (w); 228 229 switch (choice) { 230 case 0: 231 { 232 pView->fVP.SetLightsMoveWithCamera (true); 233 break; 234 } 235 case 1: 236 { 237 pView->fVP.SetLightsMoveWithCamera (false); 238 break; 239 } 240 default: 241 { 242 G4Exception 243 ("G4OpenGLXmViewer::set_rot_subject_callback", 244 "opengl2005", FatalException, 245 "Unrecognised choice made in set_rot_subject_callback"); 246 } 247 } 248 } 249 250 void G4OpenGLXmViewer::wobble_callback (Widget w, 251 XtPointer, 252 XtPointer) 253 { 254 G4OpenGLXmViewer* pView; 255 256 XtVaGetValues (w, 257 XmNuserData, &pView, 258 NULL); 259 260 pView->original_vp = pView->fVP.GetViewpointDirection(); 261 pView->wobble_timer = XtAppAddTimeOut 262 (pView->app, 263 (long unsigned int) (1000. * (1. / pView->wob_sens)), 264 wobble_timer_callback, 265 pView); 266 } 267 268 void G4OpenGLXmViewer::wobble_timer_callback (XtPointer clientData, 269 XtIntervalId*) 270 { 271 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*)clientData; 272 const G4Vector3D& up = pView->fVP.GetUpVector(); 273 G4Vector3D third_axis = up.cross(pView->original_vp); 274 G4double pi_div_by_ten = pi / 10.0; 275 G4Vector3D d_up = 0.1 * (std::sin ((G4double)pView->frameNo * pi_div_by_ten * 2.)) * up; 276 G4Vector3D d_third_axis = 0.1 * (std::sin ((G4double)pView->frameNo * (pi_div_by_ten))) * third_axis; 277 278 pView->fVP.SetViewAndLights (pView->original_vp + d_up + d_third_axis); 279 280 pView->SetView (); 281 pView->ClearView (); 282 pView->DrawView (); 283 284 if (pView->frameNo++ == 20) { 285 if (pView->wobble_timer) { 286 XtRemoveTimeOut (pView->wobble_timer); 287 pView->frameNo = 0; 288 pView->fVP.SetViewAndLights (pView->original_vp); 289 pView->SetView (); 290 pView->ClearView (); 291 pView->DrawView (); 292 } 293 } else { 294 pView->wobble_timer = XtAppAddTimeOut 295 (pView->app, 296 (long unsigned int) (1000. * (1. / pView->wob_sens)), 297 wobble_timer_callback, 298 pView); 299 } 300 } 301 302 void G4OpenGLXmViewer::reset_callback (Widget w, 303 XtPointer, 304 XtPointer) 305 { 306 307 G4OpenGLXmViewer* pView; 308 309 XtVaGetValues (w, 310 XmNuserData, &pView, 311 NULL); 312 313 pView->fVP.SetCurrentTargetPoint(G4Point3D()); 314 pView->fVP.SetZoomFactor(1.0); 315 pView->fVP.SetDolly(0.0); 316 pView->SetView (); 317 pView->ClearView (); 318 pView->DrawView (); 319 pView->zoom_low = 0.1; 320 pView->zoom_high = 10.0; 321 322 } 323