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
G4OpenInventorXtExaminerViewer.hh
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// Open Inventor Xt Extended Viewer - 30 Oct 2012
27// Rastislav Ondrasek, Pierre-Luc Gagnon, Frederick Jones TRIUMF
28
29#ifndef HookEventProcState_H
30#define HookEventProcState_H 1
31#include "G4VStateDependent.hh"
32
34
36{
37private:
39public:
42
43 virtual G4bool Notify(G4ApplicationState requiredState);
44};
45#endif /* HookEventProcState_H */
46
47
48#ifndef G4OPENINVENTORXTEXAMINERVIEWER_HH
49#define G4OPENINVENTORXTEXAMINERVIEWER_HH
50
51#include <map>
52#include <vector>
53#include <fstream>
54#include <Inventor/SbLinear.h>
55#include <Inventor/nodes/SoLineSet.h>
56#include <Inventor/nodes/SoEventCallback.h>
57#include <Inventor/Xt/viewers/SoXtExaminerViewer.h>
58#include <Inventor/events/SoKeyboardEvent.h>
59
60class SoCoordinate3;
61class SoFont;
62class SoText2;
63class SoPointSet;
64
65class G4OpenInventorXtExaminerViewer : public SoXtExaminerViewer {
66
68 // FWJ
70
71private:
72 Widget prevViewPtButton, nextViewPtButton;
73 Widget menuBar, fileMenu, openFileDialog, newFileDialog,
74 loadRefCoordsDialog, saveRefCoordsDialog,
75 loadSceneGraphDialog, saveSceneGraphDialog,
76 viewPtSelection, listsDialog, myShellDialog, myViewPtList, myElementList;
77
78 static G4OpenInventorXtExaminerViewer *viewer;
79 void (*escapeCallback)(void *);
80 void * examinerObject;
81 SbBool lshiftdown, rshiftdown, lctrldown, rctrldown;
82
83public:
84
85 // Same constructor as the ExaminerViewer
86 G4OpenInventorXtExaminerViewer(Widget parent = NULL,
87 const char *name = NULL,
88 SbBool embed = TRUE,
89 SoXtFullViewer::BuildFlag flag = BUILD_ALL,
90 SoXtViewer::Type type = BROWSER);
91
93
94 template <class T> void parseString(T &t, const std::string &s, bool &error);
95
96 Widget addMenu(std::string name);
97 void addButton(Widget menu, std::string name, XtCallbackProc);
98 Widget getMenuBar() { return menuBar; }
99 Widget getMenu() { return fileMenu; }
100 void warningMsgDialog(std::string, String, XtCallbackProc);
102
107
108 Widget createScale(Widget, char *, int, float);
109 void addEscapeCallback(void (*cb)(void *), void *);
113 // FWJ
114 // SoNode * superimposition;
115
116protected:
117 // Same constructor as the ExaminerViewer
118 G4OpenInventorXtExaminerViewer(Widget parent,
119 const char *name,
120 SbBool embed,
121 SoXtFullViewer::BuildFlag flag,
122 SoXtViewer::Type type,
123 SbBool build);
124
125 // Overloaded for adding the MenuBar
126 Widget buildWidget(Widget parent);
127 // Overloaded so additional buttons can be added
128 virtual void createViewerButtons (Widget parent, SbPList * buttonlist);
129 // Overloaded for catching various keyboard events
130 virtual SbBool processSoEvent(const SoEvent * const event);
131 void moveCamera(float dist = 0, bool lookdown = false);
132 std::string curEltName;
133 SbVec3f camUpVec;
134 SbVec3f camDir;
135 void rotateCamera();
136 void updateViewParams(SoKeyboardEvent::Key);
137 bool loadViewPts();
138 virtual void afterRealizeHook();
139
140private:
141 // Each constructor calls this generic constructor
142 void constructor(const SbBool build);
143
144 // FWJ DISABLED
145 // static G4OpenInventorXtExaminerViewer *getObject();
146
147 HookEventProcState *hookBeamOn;
148 friend class HookEventProcState;
149 bool newEvents;
150 static void sceneChangeCB(void *, SoSensor *);
151
152 void setViewPt();
153 void writeViewPtIdx();
154 void cleanUpAfterPrevFile();
155
156 void popUpFileSelDialog(Widget&, std::string, std::string, XtCallbackProc);
157 static void cancelFileSelDialogCB(Widget, XtPointer, XtPointer);
158 static void openViewPtFileCB(Widget, XtPointer, XtPointer);
159 static void viewPtFileSelectedCB(Widget, XtPointer, XtPointer);
160 static void newViewPtFileCB(Widget, XtPointer, XtPointer);
161 static void createNewVPFileCB(Widget, XtPointer, XtPointer);
162 static void overwriteFileCB(Widget, XtPointer, XtPointer);
163 static void loadRefCoordsDialogCB(Widget, XtPointer, XtPointer); //pop file dialog
164 static void loadRefCoordsCB(Widget, XtPointer, XtPointer); //execute loading
165 static void saveRefCoordsDialogCB(Widget, XtPointer, XtPointer); //pop file dialog
166 static void saveRefCoordsCB(Widget, XtPointer, XtPointer); //execute saving
167 static void saveRefCoordsOverWriteCB(Widget, XtPointer, XtPointer);
168 static void loadSceneGraphDialogCB(Widget, XtPointer, XtPointer);
169 static void loadSceneGraphCB(Widget, XtPointer, XtPointer);
170 static void saveSceneGraphDialogCB(Widget, XtPointer, XtPointer);
171 static void saveSceneGraphCB(Widget, XtPointer, XtPointer);
172 static void saveSceneGraphOverWriteCB(Widget, XtPointer, XtPointer);
173 static void mouseoverCB(void *aThis, SoEventCallback *eventCB);
174 static void pickingCB(void *aThis, SoEventCallback *eventCB);
175
176
177 // Viewpoint operations
178 void addViewPoints();
179 static void closeListsDialogCB(Widget, XtPointer, XtPointer);
180 static void loadBookmarkCB(Widget, XtPointer, XtPointer);
181 static void renameBookmarkCB(Widget, XtPointer, XtPointer);
182 void renameViewPt(char *vpName);
183 static void sortBookmarksCB(Widget, XtPointer, XtPointer);
184 void sortViewPts(std::vector<std::string>);
185 static void deleteBookmarkCB(Widget, XtPointer, XtPointer);
186 static void deleteViewPtCB(Widget, XtPointer, XtPointer);
187 void deleteViewPt(char *vpName = NULL);
188
189 // Animation
190 static void animateRefParticleCB(Widget, XtPointer, XtPointer);
191 static void animateSensorCB(void *, SoSensor *);
192 static void animateSensorRotationCB(void *, SoSensor *);
193 void animateRefParticle();
194 void saveCurCamera();
195 void restoreCamera();
196 double animateBtwPtsPeriod, speedStep;
197 void incSpeed();
198 void decSpeed();
199
200 SoTimerSensor *animateSensor;
201 SoTimerSensor *animateSensorRotation;
202 SoNodeSensor *sceneChangeSensor;
203 SbVec3f camStartPos, camEndPos;
204 SbRotation camStartOrient, camEndOrient;
205
206 static void prevViewPtCB(Widget, XtPointer, XtPointer);
207 static void nextViewPtCB(Widget, XtPointer, XtPointer);
208 static void saveViewPtCB(Widget, XtPointer, XtPointer);
209 static void abbrOutputCB(Widget, XtPointer, XtPointer);
210 static void pickRefPathCB(Widget, XtPointer, XtPointer);
211 static void switchWireFrameCB(Widget, XtPointer, XtPointer);
212 static void constructListsDialog(Widget, XtPointer, XtPointer);
213 void saveViewPt(char *name);
214
215
216 static void lookAtSceneElementCB(Widget, XtPointer, XtPointer);
217 static void cancelSceneElementSelectionCB(Widget, XtPointer, XtPointer);
218
219 void setReferencePath(SoLineSet*, SoCoordinate3*, bool append = false);
220 void setReferencePathZPos();
221 void findAndSetRefPath();
222 SoCoordinate3* getCoordsNode(SoFullPath *path);
223 void getSceneElements(); // reads elements from the scene graph
224 float sqrlen(const SbVec3f&);
225 void distanceToTrajectory(const SbVec3f&, float&, SbVec3f&, int&);
226 void sortElements();
227 void createElementsList(Widget);
228 static void closeMainWindowCB(Widget, XtPointer, XtPointer);
229 void evenOutRefParticlePts();
230
231 static void gotoRefPathStartCB(Widget, XtPointer, XtPointer);
232 void gotoRefPathStart();
233 static void invertRefPathCB(Widget, XtPointer, XtPointer);
234 void invertRefPath();
235
236 enum CameraType {
237 PERSPECTIVE,
238 ORTHOGRAPHIC
239 };
240
241
242 enum State {
243 GENERAL,
244 BEAMLINE,
245 VIEWPOINT,
246 ANIMATION,
247 REVERSED_ANIMATION,
248 PAUSED_ANIMATION,
249 ROTATING
250 };
251
252 // For storing the view point
253 struct viewPtData {
254 char* viewPtName;
255 int viewportMapping;
256 SbVec3f position;
257 SbRotation orientation;
258 float aspectRatio;
259 float nearDistance;
260 float farDistance;
261 float focalDistance;
262 CameraType camType;
263 float height;
264 };
265
266 // FWJ removed unneeded assignment operator
267 struct sceneElement {
268 std::string name;
269 SoFullPath* path;
270 SbVec3f center;
271 float closestPointZCoord;
272 };
273
274 struct elementForSorting {
275 float closestPointZCoord;
276 SbVec3f closestPoint;
277 float smallestDistance;
278 float distanceToBeamlineStart;
279 std::string name;
280
281 G4bool operator<(elementForSorting const &other) const
282 {
283 if (closestPointZCoord < other.closestPointZCoord)
284 return true;
285 if (closestPointZCoord > other.closestPointZCoord)
286 return false;
287
288 // otherwise closestPointZCoord == other.closestPointZCoord.
289 // Compare the distances from the center of the element to
290 // the start of the beamline.
291 if (distanceToBeamlineStart < other.distanceToBeamlineStart)
292 return true;
293 if (distanceToBeamlineStart > other.distanceToBeamlineStart)
294 return false;
295
296 // In case both closestPointZCoord and smallestDistance are
297 // equal, we have two exactly overlapping elements, if so
298 // the order doesn't matter
299 return true;
300 }
301 };
302
303 bool zcoordSetFlag;
304
305 std::vector<sceneElement> sceneElements;
306 std::vector<viewPtData> viewPtList;
307 std::string fileName;
308 std::ifstream fileIn;
309 std::ofstream fileOut;
310 int viewPtIdx;
311 int MAX_VP_IDX;
312 int MAX_VP_NAME;
313
314 // For storing coordinate points of the reference particle
315 std::vector<SbVec3f> refParticleTrajectory;
316 // For displaying distance during anim and beamline modes
317 std::vector<float> refZPositions;
318
319 int refParticleIdx;
320 int prevRefIdx;
321 float distance;
322 State currentState, prevState, beforePausing;
323 char* curViewPtName;
324
325 int step;
326 SbVec3f prevPt;
327 SbVec3f prevParticleDir;
328 void* prevColorField;
329
330 viewPtData camB4Animation;
331 bool returnToSaveVP;
332 bool returnToAnim;
333 SoCamera* myCam;
334 void setStartingPtForAnimation();
335 float left_right, up_down;
336 SbVec3f rotAxis; // For 90 degree rotations
337 int rotCnt; // # of steps rotation is split into
338
339 static void getViewPtNameCB(Widget, XtPointer, XtPointer);
340 static void getViewPtNameCancelCB(Widget, XtPointer, XtPointer);
341 std::string viewPtAutoName();
342
343 ////////////////////////ANIM_SPEED_INDICATOR///////////////////////
344 SoSearchAction * searcher;
345
346 SoNode * superimposition;
347 SoCoordinate3 * sgeometry;
348 SoScale * sscale;
349
350 SoTranslation * stranslation;
351 SoTranslation * curInfoTrans;
352 SoTranslation * mouseOverTransSolid;
353 SoTranslation * mouseOverTransMaterial;
354 SoTranslation * mouseOverTransLogName;
355 SoTranslation * mouseOverTransZPos;
356
357 // Used for 2 similar purposes: 1. Displays z position during animation
358 // 2. Displays name of the current viewpoint
359 SoText2 * curInfoText;
360 /* Need to use many different fields for mouseover
361 * because newlines are ignored when the scene is rendered */
362 SoText2 * mouseOverTextSolid;
363 SoText2 * mouseOverTextMaterial;
364 SoText2 * mouseOverTextLogName;
365 SoText2 * mouseOverTextZPos;
366
367 SoFont * curInfoFont;
368 SoFont * mouseOverFontSolid;
369 SoFont * mouseOverFontMaterial;
370 SoFont * mouseOverFontLogName;
371 SoFont * mouseOverFontZPos;
372 SoSwitch * axisSwitch;
373 SoSwitch * animSpeedOutlineSwitch;
374 SoSwitch * animSpeedSwitch;
375 SoSwitch * curInfoSwitch;
376
377 SoNode * getSuperimpositionNode(SoNode *, const char * name);
378
379 void superimpositionEvent(SoAction * action);
380 static void superimpositionCB(void * closure, SoAction * action);
381
382 virtual void actualRedraw(void);
383 void updateSpeedIndicator(void);
384
385 float maxSpeed;
386 ////////////////////////ANIM_SPEED_INDICATOR///////////////////////
387
388 // FWJ added for Ortho camera
389 float defaultHeight;
390 float defaultHeightAngle;
391 // FWJ add look-ahead for animation tracking on curves
392 G4int pathLookahead;
393
394 // Used by G4 app during element rotations, stores previous view
395 SbVec3f upVector, offsetFromCenter, center;
396 bool rotUpVec;
397
398 SoSeparator* newSceneGraph;
399
400
401};
402#endif /* G4OPENINVENTORXTEXAMINERVIEWER_HH */
G4ApplicationState
#define State(X)
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
void warningMsgDialog(std::string, String, XtCallbackProc)
virtual SbBool processSoEvent(const SoEvent *const event)
void addButton(Widget menu, std::string name, XtCallbackProc)
virtual void createViewerButtons(Widget parent, SbPList *buttonlist)
Widget createScale(Widget, char *, int, float)
void updateViewParams(SoKeyboardEvent::Key)
void addEscapeCallback(void(*cb)(void *), void *)
void moveCamera(float dist=0, bool lookdown=false)
void parseString(T &t, const std::string &s, bool &error)
virtual G4bool Notify(G4ApplicationState requiredState)
#define TRUE
Definition: globals.hh:41
bool operator<(const HepRotation &r, const HepLorentzRotation &lt)
const char * name(G4int ptype)