36 #ifdef G4VIS_BUILD_OPENGLXM_DRIVER
45 void G4OpenGLXmViewer::theta_rotation_callback (Widget w,
49 XmArrowButtonCallbackStruct *cbs = (XmArrowButtonCallbackStruct*) callData;
50 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
52 pView->rotate_right = get_boolean_userData (w);
54 if (cbs->reason == XmCR_ARM) {
55 rotate_in_theta (pView, NULL);
56 }
else if (cbs->reason == XmCR_DISARM) {
57 XtRemoveTimeOut (pView->rotation_timer);
61 void G4OpenGLXmViewer::rotate_in_theta (XtPointer clientData,
62 XtIntervalId* timer_id)
65 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
67 if (pView->rotate_right) {
68 pView->rotateScene(1,0);
70 pView->rotateScene(-1,0);
115 pView->rotation_timer = XtAppAddTimeOut
117 timer_id == NULL ? 500 : 1,
122 void G4OpenGLXmViewer::phi_rotation_callback (Widget w,
123 XtPointer clientData,
126 XmArrowButtonCallbackStruct *cbs = (XmArrowButtonCallbackStruct*) callData;
127 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
129 pView->rotate_up = get_boolean_userData (w);
131 if (cbs->reason == XmCR_ARM) {
132 rotate_in_phi (pView, NULL);
133 }
else if (cbs->reason == XmCR_DISARM) {
134 XtRemoveTimeOut (pView->rotation_timer);
138 void G4OpenGLXmViewer::rotate_in_phi (XtPointer clientData,
139 XtIntervalId* timer_id)
143 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
145 if (pView -> rotate_up) {
146 pView->rotateScene(0,-1);
148 pView->rotateScene(0,1);
188 pView->rotation_timer = XtAppAddTimeOut
190 timer_id == NULL ? 500 : 1,
195 void G4OpenGLXmViewer::set_rot_sens_callback (Widget w,
196 XtPointer clientData,
199 XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct*) callData;
200 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
205 XmNdecimalPoints, &dp,
210 }
else if ( dp > 0) {
212 ten_to_the_dp *= 10.;
216 (
"G4OpenGLXmViewer::set_rot_sens_callback",
218 "Bad value returned for dp in set_rot_sens_callback");
221 pView->fRot_sens = (
G4float)(cbs->value) / ten_to_the_dp;
224 void G4OpenGLXmViewer::set_rot_subject_callback (Widget w,
225 XtPointer clientData,
228 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*)clientData;
230 G4int choice = get_int_userData (w);
235 pView->fVP.SetLightsMoveWithCamera (
true);
240 pView->fVP.SetLightsMoveWithCamera (
false);
246 (
"G4OpenGLXmViewer::set_rot_subject_callback",
248 "Unrecognised choice made in set_rot_subject_callback");
253 void G4OpenGLXmViewer::wobble_callback (Widget w,
257 G4OpenGLXmViewer* pView;
263 pView->original_vp = pView->fVP.GetViewpointDirection();
264 pView->wobble_timer = XtAppAddTimeOut
266 (
long unsigned int) (1000. * (1. / pView->wob_sens)),
267 wobble_timer_callback,
271 void G4OpenGLXmViewer::wobble_timer_callback (XtPointer clientData,
274 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*)clientData;
275 const G4Vector3D& up = pView->fVP.GetUpVector();
278 G4Vector3D d_up = 0.1 * (std::sin ((
G4double)pView->frameNo * pi_div_by_ten * 2.)) * up;
279 G4Vector3D d_third_axis = 0.1 * (std::sin ((
G4double)pView->frameNo * (pi_div_by_ten))) * third_axis;
281 pView->fVP.SetViewAndLights (pView->original_vp + d_up + d_third_axis);
287 if (pView->frameNo++ == 20) {
288 if (pView->wobble_timer) {
289 XtRemoveTimeOut (pView->wobble_timer);
291 pView->fVP.SetViewAndLights (pView->original_vp);
297 pView->wobble_timer = XtAppAddTimeOut
299 (
long unsigned int) (1000. * (1. / pView->wob_sens)),
300 wobble_timer_callback,
305 void G4OpenGLXmViewer::reset_callback (Widget w,
310 G4OpenGLXmViewer* pView;
316 pView->fVP.SetCurrentTargetPoint(
G4Point3D());
317 pView->fVP.SetZoomFactor(1.0);
318 pView->fVP.SetDolly(0.0);
322 pView->zoom_low = 0.1;
323 pView->zoom_high = 10.0;
HepGeom::Point3D< G4double > G4Point3D
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
static constexpr double pi
BasicVector3D< T > cross(const BasicVector3D< T > &v) const