Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4OpenGLXmRotationCallbacks.cc
Go to the documentation of this file.
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
38#include "G4Scene.hh"
39#include "G4UImanager.hh"
40#include "G4ios.hh"
41
43 XtPointer clientData,
44 XtPointer callData)
45{
46 XmArrowButtonCallbackStruct *cbs = (XmArrowButtonCallbackStruct*) callData;
47 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
48
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
58void 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,
116 pView);
117}
118
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
135void 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,
189 pView);
190}
191
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 {
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
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 {
243 ("G4OpenGLXmViewer::set_rot_subject_callback",
244 "opengl2005", FatalException,
245 "Unrecognised choice made in set_rot_subject_callback");
246 }
247 }
248}
249
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)),
265 pView);
266}
267
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)),
298 pView);
299 }
300}
301
303 XtPointer,
304 XtPointer)
305{
306
307 G4OpenGLXmViewer* pView;
308
309 XtVaGetValues (w,
310 XmNuserData, &pView,
311 NULL);
312
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}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
HepGeom::Point3D< G4double > G4Point3D
Definition: G4Point3D.hh:34
float G4float
Definition: G4Types.hh:84
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
void rotateScene(G4double dx, G4double dy)
static void rotate_in_theta(XtPointer clientData, XtIntervalId *timer_id)
static void wobble_timer_callback(XtPointer clientData, XtIntervalId *timerid)
static void phi_rotation_callback(Widget w, XtPointer clientData, XtPointer callData)
static void set_rot_sens_callback(Widget w, XtPointer clientData, XtPointer callData)
XtIntervalId rotation_timer
static void rotate_in_phi(XtPointer clientData, XtIntervalId *timer_id)
static void set_rot_subject_callback(Widget w, XtPointer clientData, XtPointer callData)
static G4bool get_boolean_userData(Widget w)
static G4int get_int_userData(Widget w)
static void theta_rotation_callback(Widget w, XtPointer clientData, XtPointer callData)
static void reset_callback(Widget w, XtPointer clientData, XtPointer callData)
static void wobble_callback(Widget w, XtPointer clientData, XtPointer callData)
XtIntervalId wobble_timer
virtual void DrawView()=0
G4ViewParameters fVP
Definition: G4VViewer.hh:220
void SetViewAndLights(const G4Vector3D &viewpointDirection)
void SetCurrentTargetPoint(const G4Point3D &currentTargetPoint)
const G4Vector3D & GetViewpointDirection() const
void SetDolly(G4double dolly)
const G4Vector3D & GetUpVector() const
void SetZoomFactor(G4double zoomFactor)
void SetLightsMoveWithCamera(G4bool moves)
BasicVector3D< T > cross(const BasicVector3D< T > &v) const