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
G4OpenGLXmPanningCallbacks.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// G4OpenGLXmPanningCallbacks :
31// Several callback functions used by
32// elements of the control panel to`pan'
33// the view (i.e. move the viewpoint and
34// camera positions by equal amounts).
35// Zoom callback is also here.
36
37#include "G4OpenGLXmViewer.hh"
38#include "G4VSceneHandler.hh"
39#include <Xm/ToggleB.h>
40
41#include "G4Scene.hh"
42
44 XtPointer clientData,
45 XtPointer callData)
46{
47 XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct*) callData;
48 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
49 short dp = -1;
50 G4float ten_to_the_dp = 10.;
51
52 XtVaGetValues (w,
53 XmNdecimalPoints, &dp,
54 NULL);
55
56 if (dp == 0) {
57 ten_to_the_dp = 1.;
58 } else if ( dp > 0) {
59 for (G4int i = 1; i < (G4int)dp; i++) {
60 ten_to_the_dp *= 10.;
61 }
62 } else {
63 G4cout << "dp is " << dp << G4endl;
64 return;
65 }
66
67
68 G4double zoomBy = (G4double)(cbs->value) / ten_to_the_dp;
69 if (zoomBy <= 0.01) {
70 zoomBy = 0.01;
71 }
72
73 pView->fVP.SetZoomFactor (zoomBy);
74 pView->SetView ();
75 pView->ClearView ();
76 pView -> DrawView ();
77}
78
80 XtPointer clientData,
81 XtPointer callData)
82{
83 XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct*) callData;
84 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
85 short dp = -1;
86 G4float ten_to_the_dp = 10.;
87
88 XtVaGetValues (w,
89 XmNdecimalPoints, &dp,
90 NULL);
91
92 if (dp == 0) {
93 ten_to_the_dp = 1.;
94 } else if ( dp > 0) {
95 for (G4int i = 1; i < (G4int)dp; i++) {
96 ten_to_the_dp *= 10.;
97 }
98 } else {
99 G4cout << "dp is " << dp << G4endl;
100 return;
101 }
102
103 G4double dolly = (G4double)(cbs->value) / ten_to_the_dp;
104
105 pView->fVP.SetDolly (dolly);
106 pView->SetView ();
107 pView->ClearView ();
108 pView->DrawView ();
109
110}
111
113 XtPointer clientData,
114 XtPointer callData)
115{
116 XmArrowButtonCallbackStruct *cbs = (XmArrowButtonCallbackStruct*) callData;
117 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
118
119 pView->pan_right = get_boolean_userData (w);
120
121 if (cbs->reason == XmCR_ARM) {
122 left_right_pan_callback (pView,NULL);
123 } else if (cbs->reason == XmCR_DISARM) {
124 XtRemoveTimeOut (pView->pan_timer);
125 }
126}
127
129 XtIntervalId* timer_id)
130
131{
132 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
133 G4double delta;
134
135 if (pView->pan_right) {
136 delta = pView->fPan_sens;
137 } else {
138 delta = -pView->fPan_sens;
139 }
140
141 G4Point3D stp
143
144 G4Point3D tp = stp + pView -> fVP.GetCurrentTargetPoint ();
145
146 const G4Vector3D& upVector = pView->fVP.GetUpVector ();
147 const G4Vector3D& vpVector = pView->fVP.GetViewpointDirection ();
148
149 G4Vector3D unitRight = (upVector.cross (vpVector)).unit();
150 G4Vector3D unitUp = (vpVector.cross (unitRight)).unit();
151
152 tp += delta * unitRight;
153 pView->fVP.SetCurrentTargetPoint (tp - stp);
154
155 pView->SetView ();
156 pView->ClearView ();
157 pView->DrawView ();
158
159 pView->pan_timer = XtAppAddTimeOut
160 (pView->app,
161 timer_id == NULL ? 500 : 1,
163 pView);
164}
165
167 XtPointer clientData,
168 XtPointer callData)
169{
170 XmArrowButtonCallbackStruct *cbs = (XmArrowButtonCallbackStruct*) callData;
171 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
172
173 pView->pan_up = get_boolean_userData (w);
174
175 if (cbs->reason == XmCR_ARM) {
176 up_down_pan_callback (pView,NULL);
177 } else if (cbs->reason == XmCR_DISARM) {
178 XtRemoveTimeOut (pView->pan_timer);
179 }
180}
181
182void G4OpenGLXmViewer::up_down_pan_callback (XtPointer clientData,
183 XtIntervalId* timer_id)
184{
185 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
186 G4double delta;
187
188 if (pView->pan_up) {
189 delta = pView->fPan_sens;
190 } else {
191 delta = -(pView->fPan_sens);
192 }
193
194 G4Point3D stp
196 G4Point3D tp = stp + pView -> fVP.GetCurrentTargetPoint ();
197 const G4Vector3D& upVector = pView->fVP.GetUpVector ();
198 const G4Vector3D& vpVector = pView->fVP.GetViewpointDirection ();
199
200 G4Vector3D unitRight = (upVector.cross (vpVector)).unit();
201 G4Vector3D unitUp = (vpVector.cross (unitRight)).unit();
202 tp += delta * unitUp;
203 pView->fVP.SetCurrentTargetPoint (tp - stp);
204
205 pView->SetView ();
206 pView->ClearView ();
207 pView->DrawView ();
208
209 pView->pan_timer = XtAppAddTimeOut
210 (pView->app,
211 timer_id == NULL ? 500 : 1,
213 pView);
214}
215
217 XtPointer clientData,
218 XtPointer callData)
219{
220 XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct*) callData;
221 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
222 short dp = -1;
223 G4float ten_to_the_dp = 10.;
224
225 XtVaGetValues (w,
226 XmNdecimalPoints, &dp,
227 NULL);
228
229 if (dp == 0) {
230 ten_to_the_dp = 1.;
231 } else if ( dp > 0) {
232 for (G4int i = 1; i < (G4int)dp; i++) {
233 ten_to_the_dp *= 10.;
234 }
235 } else {
236 G4cout << "dp is " << dp << G4endl;
237 return;
238 }
239
240 pView->fPan_sens = (G4double)((cbs->value) / ten_to_the_dp);
241}
float G4float
Definition: G4Types.hh:84
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
static void set_pan_sens_callback(Widget w, XtPointer clientData, XtPointer callData)
static void pan_up_down_callback(Widget w, XtPointer clientData, XtPointer callData)
static void pan_left_right_callback(Widget w, XtPointer clientData, XtPointer callData)
static G4bool get_boolean_userData(Widget w)
static void zoom_callback(Widget w, XtPointer clientData, XtPointer callData)
static void dolly_callback(Widget w, XtPointer clientData, XtPointer callData)
static void up_down_pan_callback(XtPointer clientData, XtIntervalId *timer_id)
static void left_right_pan_callback(XtPointer clientData, XtIntervalId *timer_id)
XtIntervalId pan_timer
const G4Point3D & GetStandardTargetPoint() const
G4Scene * GetScene() const
virtual void DrawView()=0
G4ViewParameters fVP
Definition: G4VViewer.hh:220
G4VSceneHandler * GetSceneHandler() const
void SetCurrentTargetPoint(const G4Point3D &currentTargetPoint)
const G4Vector3D & GetViewpointDirection() const
const G4Point3D & GetCurrentTargetPoint() const
void SetDolly(G4double dolly)
const G4Vector3D & GetUpVector() const
void SetZoomFactor(G4double zoomFactor)
BasicVector3D< T > cross(const BasicVector3D< T > &v) const