Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4OpenGLXmViewer.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 // $Id: G4OpenGLXmViewer.cc 96733 2016-05-02 11:52:48Z gcosmo $
28 //
29 //
30 // Andrew Walkden 10th February 1997
31 // G4OpenGLXmViewer : Class derived from G4OpenGLXViewer, to provide
32 // (Motif) widget OpenGL functionality for GEANT4.
33 
34 #ifdef G4VIS_BUILD_OPENGLXM_DRIVER
35 
36 #include "globals.hh"
37 
38 #include "G4OpenGLXmViewer.hh"
39 #include "G4OpenGLSceneHandler.hh"
40 
41 #include "G4VisExtent.hh"
42 #include "G4LogicalVolume.hh"
43 #include "G4VSolid.hh"
44 #include "G4Point3D.hh"
45 #include "G4Normal3D.hh"
46 
47 #include "G4Scene.hh"
48 
49 #include "G4OpenGLXmSliderBar.hh"
50 #include "G4OpenGLXmTextField.hh"
51 
52 #include "G4Xt.hh"
53 #include <X11/Shell.h>
54 #include <Xm/MainW.h>
55 #include <Xm/Frame.h>
56 #include <Xm/DrawingA.h>
57 
58 #include <sstream>
59 
60 void G4OpenGLXmViewer::ShowView () {
61 
62  glXWaitGL (); //Wait for effects of all previous OpenGL commands to
63  //be propagated before progressing.
64  glFlush ();
65 
66  G4Xt::getInstance () -> SecondaryLoop ();
67 
68 }
69 
70 void G4OpenGLXmViewer::ResetView () {
71  // reset global parameters
72  G4OpenGLViewer::ResetView();
73 
74  //reset Xm parameteres
75  zoom_high = fVP.GetZoomFactor() * 10.0;
76  zoom_low = fVP.GetZoomFactor() / 10.0;
77  rot_sens_limit = 90.;
78  wob_low = 0.;
79  wob_high = 50.;
80  wob_sens = 20.;
81 
82  bool firstInit = true;
83  if (GetSceneHandler() != NULL) {
84  if (GetSceneHandler()->GetScene() != NULL) {
85  firstInit = false;
86  }
87  }
88  if (firstInit) {
89  pan_sens_limit = 100.;
90  fPan_sens = pan_sens_limit / 10.0;
91  dolly_low = fVP.GetDolly() - 1000.0;
92  dolly_high = fVP.GetDolly() + 1000.0;
93  } else {
94  fPan_sens = GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius() / 10.0;
95  pan_sens_limit = GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius();
96 
97  dolly_high = GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius();
98  dolly_low = -(GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius());
99  }
100 
101  UpdateControlPanel ();
102 
103 
104  // FIXME : L.Garnier 12 Oct 2011
105  // Has also to change the Camera/Object, but tricky to do...
106 
107 }
108 
109 
110 void G4OpenGLXmViewer::GetXmConnection () {
111 
112  G4Xt* interactorManager = G4Xt::getInstance ();
113  toplevel = (Widget)interactorManager->GetMainInteractor();
114  app = XtWidgetToApplicationContext(toplevel);
115 
116  if (!toplevel) {
117  fViewId = -1; // This flags an error.
118  G4cerr << "G4OpenGLXmViewer::GetXmConnection unable to Initialize"
119  " application context." << G4endl;
120  return;
121  }
122 
123  // Better to put this in an X11 resource file !!!
124  std::ostringstream oss;
125  oss <<
126  "*glxarea*width: " << fVP.GetWindowSizeHintX() << "\n"
127  "*glxarea*height: " << fVP.GetWindowSizeHintY() << "\n"
128  /*
129  // Tried this as a replacement for the above two lines, but
130  // sub-windows (rotation, etc.) came same size!!
131  "*geometry: " << fVP.GetXGeometryString() << "\n"
132  */
133  "*frame*x: 10\n"
134  "*frame*y: 10\n"
135  "*frame*topOffset: 10\n"
136  "*frame*bottomOffset: 10\n"
137  "*frame*rightOffset: 10\n"
138  "*frame*leftOffset: 10\n"
139  "*frame*shadowType: SHADOW_IN\n"
140  "*frame*useColorObj: False\n"
141  "*frame*primaryColorSetId: 3\n"
142  "*frame*secondaryColorSetId: 3\n"
143  "*menubar*useColorObj: False\n"
144  "*menubar*primaryColorSetId: 3\n"
145  "*menubar*secondaryColorSetId: 3\n"
146  "*toplevel*useColorObj: False\n"
147  "*toplevel*primaryColorSetId: 3\n"
148  "*toplevel*secondaryColorSetId: 3\n";
149  interactorManager->PutStringInResourceDatabase ((char*)oss.str().c_str());
150 
151  // interactorManager->AddSecondaryLoopPostAction ((G4SecondaryLoopAction)G4OpenGLXmViewerSecondaryLoopPostAction);
152 
153  shell = XtAppCreateShell ((String)fName.data(),(String)fName.data(),topLevelShellWidgetClass,XtDisplay(toplevel),NULL,0);
154  interactorManager->AddShell (shell);
155 
156  dpy = XtDisplay (shell);
157 
158  if (!dpy) {
159  fViewId = -1; // This flags an error.
160  G4cerr << "G4OpenGLXmViewer::GetXmConnection unable to connect to display."
161  << G4endl;
162  return;
163  }
164 
165  if (!glXQueryExtension (dpy, &errorBase, &eventBase)) {
166  fViewId = -1; // This flags an error.
167  G4cerr << "G4OpenGLXmViewer::GetXmConnection. X Server has no GLX extension."
168  << G4endl;;
169  return;
170  }
171 }
172 
173 void G4OpenGLXmViewer::CreateMainWindow () {
174 
175  bgnd = XWhitePixelOfScreen (XtScreen(shell));
176  borcol = XBlackPixelOfScreen (XtScreen(shell));
177 
178  ResizeWindow(fVP.GetWindowSizeHintX(),fVP.GetWindowSizeHintY());
179 
180  G4int x_origin = fVP.GetWindowAbsoluteLocationHintX(DisplayWidth(dpy, vi -> screen));
181 
182  // FIXME, screen size != window size on MAC, but I don't know have to get the menuBar
183  // size on MAC. L.Garnier 01/2009
184  G4int y_origin = fVP.GetWindowAbsoluteLocationHintY(DisplayHeight(dpy, vi -> screen));
185 
186  if (fVP.IsWindowSizeHintX () && fVP.IsWindowLocationHintX () && fVP.IsWindowLocationHintY ()) {
187  XtVaSetValues (shell,
188  XtNvisual, vi -> visual,
189  XtNdepth, vi -> depth,
190  XtNcolormap, cmap,
191  XtNwidth, getWinWidth(),
192  XtNheight, getWinHeight(),
193  XtNx, x_origin,
194  XtNy, y_origin,
195  XtNborderColor, &borcol,
196  XtNbackground, &bgnd,
197  XmNtitle, fName.data(),
198  NULL);
199  } else if (fVP.IsWindowSizeHintX () && !(fVP.IsWindowLocationHintX () || fVP.IsWindowLocationHintY ())) {
200  XtVaSetValues (shell,
201  XtNvisual, vi -> visual,
202  XtNdepth, vi -> depth,
203  XtNcolormap, cmap,
204  XtNwidth, getWinWidth(),
205  XtNheight, getWinHeight(),
206  XtNborderColor, &borcol,
207  XtNbackground, &bgnd,
208  XmNtitle, fName.data(),
209  NULL);
210  } else if ((!fVP.IsWindowSizeHintX ()) && fVP.IsWindowLocationHintX () && fVP.IsWindowLocationHintY ()) {
211  XtVaSetValues (shell,
212  XtNvisual, vi -> visual,
213  XtNdepth, vi -> depth,
214  XtNcolormap, cmap,
215  XtNx, x_origin,
216  XtNy, y_origin,
217  XtNborderColor, &borcol,
218  XtNbackground, &bgnd,
219  XmNtitle, fName.data(),
220  NULL);
221  } else {
222  XtVaSetValues (shell,
223  XtNvisual, vi -> visual,
224  XtNdepth, vi -> depth,
225  XtNcolormap, cmap,
226  XtNborderColor, &borcol,
227  XtNbackground, &bgnd,
228  XmNtitle, fName.data(),
229  NULL);
230  }
231 
232 
233  main_win = XtVaCreateManagedWidget ("main_win",
234  xmMainWindowWidgetClass,
235  shell,
236  XtNvisual, vi -> visual,
237  XtNdepth, vi -> depth,
238  XtNcolormap, cmap,
239  XtNborderColor, borcol,
240  XtNbackground, bgnd,
241  NULL);
242 
243  //*********Create a menu bar for the window********
244  style_str = XmStringCreateLocalized ((char*)"Style");
245  actions_str = XmStringCreateLocalized ((char*)"Actions");
246  misc_str = XmStringCreateLocalized ((char*)"Miscellany");
247  spec_str = XmStringCreateLocalized ((char*)"Special");
248 
249  menubar = XmVaCreateSimpleMenuBar (main_win,
250  (char*)"menubar",
251  XmVaCASCADEBUTTON, style_str, 'S',
252  XmVaCASCADEBUTTON, actions_str, 'A',
253  XmVaCASCADEBUTTON, misc_str, 'M',
254  XmVaCASCADEBUTTON, spec_str, 'p',
255  XtNvisual, vi -> visual,
256  XtNdepth, vi -> depth,
257  XtNcolormap, cmap,
258  XtNborderColor, borcol,
259  XtNbackground, bgnd,
260  NULL);
261 
262  XmStringFree (style_str);
263  XmStringFree (actions_str);
264  XmStringFree (misc_str);
265  XmStringFree (spec_str);
266 
267  G4cout << "Created menubar" << G4endl;
268 
269 
270  //*********Create style pulldown menu on menubar*********
271  draw_str = XmStringCreateLocalized ((char*)"Drawing");
272  bgnd_str = XmStringCreateLocalized ((char*)"Background color");
273 
274  style_cascade = XmVaCreateSimplePulldownMenu
275  (menubar,
276  (char*)"style",
277  0,
278  NULL,
279  XmVaCASCADEBUTTON, draw_str, 'D',
280  XmVaCASCADEBUTTON, bgnd_str, 'B',
281  XtNvisual, vi -> visual,
282  XtNdepth, vi -> depth,
283  XtNcolormap, cmap,
284  XtNborderColor, borcol,
285  XtNbackground, bgnd,
286  NULL);
287 
288  XmStringFree (draw_str);
289  XmStringFree (bgnd_str);
290 
291  // G4cout << "Created Style pulldown menu" << G4endl;
292 
293  //Add Drawing pullright menu to style cascade...
294  wireframe_str = XmStringCreateLocalized ((char*)"Wireframe");
295  hlr_str = XmStringCreateLocalized ((char*)"Hidden line removal");
296  hsr_str = XmStringCreateLocalized ((char*)"Hidden surface removal");
297  hlhsr_str = XmStringCreateLocalized ((char*)"Hidden line and surface removal");
298 
299  drawing_style_pullright = XmVaCreateSimplePulldownMenu
300  (style_cascade,
301  (char*)"drawing_style",
302  1,
303  drawing_style_callback,
304  XmVaRADIOBUTTON, wireframe_str, 'W', NULL, NULL,
305  XmVaRADIOBUTTON, hlr_str, 'L', NULL, NULL,
306  XmVaRADIOBUTTON, hsr_str, 'S', NULL, NULL,
307  XmVaRADIOBUTTON, hlhsr_str, 'H', NULL, NULL,
308  XmNradioBehavior, True,
309  XmNradioAlwaysOne, True,
310  XmNuserData, this,
311  XtNvisual, vi -> visual,
312  XtNdepth, vi -> depth,
313  XtNcolormap, cmap,
314  XtNborderColor, borcol,
315  XtNbackground, bgnd,
316  NULL);
317 
318  Widget special_widget;
319 
321  d_style = fVP.GetDrawingStyle();
322 
323  if (d_style == G4ViewParameters::wireframe) {
324  special_widget = XtNameToWidget(drawing_style_pullright, "button_0");
325  if(special_widget) {
326  XtVaSetValues (special_widget, XmNset, True, NULL);
327  }
328  } else if (d_style == G4ViewParameters::hlr) {
329  special_widget = XtNameToWidget(drawing_style_pullright, "button_1");
330  if(special_widget) {
331  XtVaSetValues (special_widget, XmNset, True, NULL);
332  }
333  } else if (d_style == G4ViewParameters::hsr) {
334  special_widget = XtNameToWidget(drawing_style_pullright, "button_2");
335  if(special_widget) {
336  XtVaSetValues (special_widget, XmNset, True, NULL);
337  }
338  } else if (d_style == G4ViewParameters::hlhsr) {
339  special_widget = XtNameToWidget(drawing_style_pullright, "button_3");
340  if(special_widget) {
341  XtVaSetValues (special_widget, XmNset, True, NULL);
342  }
343  } else {
345  ("G4OpenGLXmViewer::CreateMainWindow",
346  "opengl2015", FatalException,
347  "Invalid Drawing style in G4OpenGLXmViewer::CreateContext");
348  }
349 
350  XmStringFree (wireframe_str);
351  XmStringFree (hlr_str);
352  XmStringFree (hsr_str);
353  XmStringFree (hlhsr_str);
354 
355  // G4cout << "Created Drawing pullright menu" << G4endl;
356 
357  //Add Drawing pullright menu to style cascade...
358  white_str = XmStringCreateLocalized ((char*)"White");
359  black_str = XmStringCreateLocalized ((char*)"Black");
360 
361  background_color_pullright = XmVaCreateSimplePulldownMenu
362  (style_cascade,
363  (char*)"background_color",
364  2,
365  background_color_callback,
366  XmVaRADIOBUTTON, white_str, 'W', NULL, NULL,
367  XmVaRADIOBUTTON, black_str, 'B', NULL, NULL,
368  XmNradioBehavior, True,
369  XmNradioAlwaysOne, True,
370  XmNuserData, this,
371  XtNvisual, vi -> visual,
372  XtNdepth, vi -> depth,
373  XtNcolormap, cmap,
374  XtNborderColor, borcol,
375  XtNbackground, bgnd,
376  NULL);
377 
378  if (background.GetRed() == 1. &&
379  background.GetGreen() == 1. &&
380  background.GetBlue() == 1.) {
381  special_widget = XtNameToWidget(background_color_pullright, "button_0");
382  if(special_widget) {
383  XtVaSetValues (special_widget, XmNset, True, NULL);
384  }
385  } else {
386  special_widget = XtNameToWidget(background_color_pullright, "button_1");
387  if(special_widget) {
388  XtVaSetValues (special_widget, XmNset, True, NULL);
389  }
390  }
391 
392  XmStringFree (white_str);
393  XmStringFree (black_str);
394 
395  // G4cout << "Created Background color pullright menu" << G4endl;
396 
397  //*********Create actions pulldown menu on menubar*********
398  rot_str = XmStringCreateLocalized ((char*)"Rotation control panel");
399  pan_str = XmStringCreateLocalized ((char*)"Panning control panel");
400  set_str = XmStringCreateLocalized ((char*)"Set control panel limits");
401 
402  actions_cascade = XmVaCreateSimplePulldownMenu
403  (menubar,
404  (char*)"actions",
405  1,
406  actions_callback,
407  XmVaPUSHBUTTON, rot_str, 'R', NULL, NULL,
408  XmVaPUSHBUTTON, pan_str, 'P', NULL, NULL,
409  XmVaPUSHBUTTON, set_str, 'S', NULL, NULL,
410  XmNuserData, this,
411  XtNvisual, vi -> visual,
412  XtNdepth, vi -> depth,
413  XtNcolormap, cmap,
414  XtNborderColor, borcol,
415  XtNbackground, bgnd,
416  NULL);
417 
418  XmStringFree (rot_str);
419  XmStringFree (pan_str);
420  XmStringFree (set_str);
421  G4cout << "Created Actions pulldown menu" << G4endl;
422 
423  misc_str = XmStringCreateLocalized ((char*)"Miscellany control panel");
424  exit_str = XmStringCreateLocalized ((char*)"Exit to G4Vis>");
425  print_str = XmStringCreateLocalized ((char*)"Create .eps file");
426 
427  //*********Create miscellany pulldown menu on menubar*********
428  misc_cascade = XmVaCreateSimplePulldownMenu
429  (menubar,
430  (char*)"miscellany",
431  2,
432  misc_callback,
433  XmVaPUSHBUTTON, misc_str, 'M', NULL, NULL,
434  XmVaPUSHBUTTON, exit_str, 'E', NULL, NULL,
435  XmVaPUSHBUTTON, print_str, 'P', NULL, NULL,
436  XmNuserData, this,
437  XtNvisual, vi -> visual,
438  XtNdepth, vi -> depth,
439  XtNcolormap, cmap,
440  XtNborderColor, borcol,
441  XtNbackground, bgnd,
442  NULL);
443 
444  XmStringFree (misc_str);
445  XmStringFree (exit_str);
446  XmStringFree (print_str);
447  G4cout << "Created Miscellany pulldown menu" << G4endl;
448 
449  trans_str = XmStringCreateLocalized ((char*)"Transparency");
450  anti_str = XmStringCreateLocalized ((char*)"Antialiasing");
451  halo_str = XmStringCreateLocalized ((char*)"Haloing");
452  aux_edge_str = XmStringCreateLocalized ((char*)"Auxiliary edges");
453 
454  //*********Create special pulldown menu on menubar*********
455  spec_cascade = XmVaCreateSimplePulldownMenu
456  (menubar,
457  (char*)"special",
458  3,
459  NULL,
460  XmVaCASCADEBUTTON, trans_str, 'T',
461  XmVaCASCADEBUTTON, anti_str, 'A',
462  XmVaCASCADEBUTTON, halo_str, 'H',
463  XmVaCASCADEBUTTON, aux_edge_str, 'E',
464  XtNvisual, vi -> visual,
465  XtNdepth, vi -> depth,
466  XtNcolormap, cmap,
467  XtNborderColor, borcol,
468  XtNbackground, bgnd,
469  NULL);
470 
471  XmStringFree (trans_str);
472  XmStringFree (anti_str);
473  XmStringFree (halo_str);
474  XmStringFree (aux_edge_str);
475 
476  // G4cout << "Created Special pulldown menu" << G4endl;
477 
478  //Add Transparency pullright menu to special cascade...
479  off_str = XmStringCreateLocalized ((char*)"Off");
480  on_str = XmStringCreateLocalized ((char*)"On");
481 
482  transparency_pullright = XmVaCreateSimplePulldownMenu
483  (spec_cascade,
484  (char*)"transparency",
485  0,
486  transparency_callback,
487  XmVaRADIOBUTTON, off_str, 'f', NULL, NULL,
488  XmVaRADIOBUTTON, on_str, 'n', NULL, NULL,
489  XmNradioBehavior, True,
490  XmNradioAlwaysOne, True,
491  XmNuserData, this,
492  XtNvisual, vi -> visual,
493  XtNdepth, vi -> depth,
494  XtNcolormap, cmap,
495  XtNborderColor, borcol,
496  XtNbackground, bgnd,
497  NULL);
498 
499  if (transparency_enabled == false) {
500  special_widget = XtNameToWidget(transparency_pullright, "button_0");
501  if(special_widget) {
502  XtVaSetValues (special_widget, XmNset, True, NULL);
503  }
504  } else if (transparency_enabled == true) {
505  special_widget = XtNameToWidget(transparency_pullright, "button_1");
506  if(special_widget) {
507  XtVaSetValues (special_widget, XmNset, True, NULL);
508  }
509  } else {
511  ("G4OpenGLXmViewer::CreateMainWindow",
512  "opengl2016", FatalException,
513  "transparency_enabled in G4OpenGLXmViewer is neither true nor false!!");
514  }
515 
516  //Add antialias pullright menu to special cascade...
517  antialias_pullright = XmVaCreateSimplePulldownMenu
518  (spec_cascade,
519  (char*)"antialias",
520  1,
521  antialias_callback,
522  XmVaRADIOBUTTON, off_str, 'f', NULL, NULL,
523  XmVaRADIOBUTTON, on_str, 'n', NULL, NULL,
524  XmNradioBehavior, True,
525  XmNradioAlwaysOne, True,
526  XmNuserData, this,
527  XtNvisual, vi -> visual,
528  XtNdepth, vi -> depth,
529  XtNcolormap, cmap,
530  XtNborderColor, borcol,
531  XtNbackground, bgnd,
532  NULL);
533 
534  if (antialiasing_enabled == false) {
535  special_widget = XtNameToWidget(antialias_pullright, "button_0");
536  if(special_widget) {
537  XtVaSetValues (special_widget, XmNset, True, NULL);
538  }
539  } else if (antialiasing_enabled == true) {
540  special_widget = XtNameToWidget(antialias_pullright, "button_1");
541  if(special_widget) {
542  XtVaSetValues (special_widget, XmNset, True, NULL);
543  }
544  } else {
546  ("G4OpenGLXmViewer::CreateMainWindow",
547  "opengl2017", FatalException,
548  "antialiasing_enabled in G4OpenGLXmViewer is neither true nor false!!");
549  }
550 
551  //Add Haloing pullright menu to special cascade...
552  haloing_pullright = XmVaCreateSimplePulldownMenu
553  (spec_cascade,
554  (char*)"haloing",
555  2,
556  haloing_callback,
557  XmVaRADIOBUTTON, off_str, 'f', NULL, NULL,
558  XmVaRADIOBUTTON, on_str, 'n', NULL, NULL,
559  XmNradioBehavior, True,
560  XmNradioAlwaysOne, True,
561  XmNuserData, this,
562  XtNvisual, vi -> visual,
563  XtNdepth, vi -> depth,
564  XtNcolormap, cmap,
565  XtNborderColor, borcol,
566  XtNbackground, bgnd,
567  NULL);
568 
569  if (haloing_enabled == false) {
570  special_widget = XtNameToWidget(haloing_pullright, "button_0");
571  if(special_widget) {
572  XtVaSetValues (special_widget, XmNset, True, NULL);
573  }
574  } else if (haloing_enabled == true) {
575  special_widget = XtNameToWidget(haloing_pullright, "button_1");
576  if(special_widget) {
577  XtVaSetValues (special_widget, XmNset, True, NULL);
578  }
579  } else {
581  ("G4OpenGLXmViewer::CreateMainWindow",
582  "opengl2018", FatalException,
583  "haloing_enabled in G4OpenGLXmViewer is neither true nor false!!");
584  }
585 
586  //Add Aux_Edge pullright menu to special cascade...
587  aux_edge_pullright = XmVaCreateSimplePulldownMenu
588  (spec_cascade,
589  (char*)"aux_edge",
590  3,
591  aux_edge_callback,
592  XmVaRADIOBUTTON, off_str, 'f', NULL, NULL,
593  XmVaRADIOBUTTON, on_str, 'n', NULL, NULL,
594  XmNradioBehavior, True,
595  XmNradioAlwaysOne, True,
596  XmNuserData, this,
597  XtNvisual, vi -> visual,
598  XtNdepth, vi -> depth,
599  XtNcolormap, cmap,
600  XtNborderColor, borcol,
601  XtNbackground, bgnd,
602  NULL);
603 
604  if (!fVP.IsAuxEdgeVisible()) {
605  special_widget = XtNameToWidget(aux_edge_pullright, "button_0");
606  if(special_widget) {
607  XtVaSetValues (special_widget, XmNset, True, NULL);
608  }
609  } else {
610  special_widget = XtNameToWidget(aux_edge_pullright, "button_1");
611  if(special_widget) {
612  XtVaSetValues (special_widget, XmNset, True, NULL);
613  }
614  }
615 
616  XtManageChild (menubar);
617  frame = XtVaCreateManagedWidget ((char*)"frame",
618  xmFrameWidgetClass, main_win,
619  XtNvisual, vi -> visual,
620  XtNdepth, vi -> depth,
621  XtNcolormap, cmap,
622  XtNborderColor, borcol,
623  XtNbackground, bgnd,
624  NULL);
625 
626  glxarea = XtVaCreateManagedWidget ((char*)"glxarea",
627  xmDrawingAreaWidgetClass,
628  frame,
629  XtNvisual, vi -> visual,
630  XtNdepth, vi -> depth,
631  XtNcolormap, cmap,
632  XtNborderColor, borcol,
633  XtNbackground, bgnd,
634  NULL);
635 
636 
637  XmMainWindowSetAreas (main_win, // main widget, children are specified
638  menubar, // widget to use as menu bar
639  NULL, // widget to use as command window
640  NULL, // widget for horizontal scroll bar
641  NULL, // widget for vertical scroll bar
642  frame // widget to be used for work window
643  );
644 
645  XtRealizeWidget(shell);
646 
647  // Once widget is realized (ie, associated with a created X window), we
648  // can bind the OpenGL rendering context to the window.
649 
650  win = XtWindow (glxarea);
651 
652  glXMakeCurrent (dpy, win, cxMaster);
653 
654  // This should be add AFTER glXMakeCurrent done because it will fire a resizeCallback
655  XtAddCallback (glxarea,
656  XmNresizeCallback,
657  resize_callback,
658  this);
659 
660  XtAddCallback (glxarea,
661  XmNexposeCallback,
662  expose_callback,
663  this);
664 
665 }
666 
667 G4OpenGLXmViewer::G4OpenGLXmViewer (G4OpenGLSceneHandler& scene):
668 G4VViewer (scene, -1),
669 G4OpenGLViewer (scene),
670 G4OpenGLXViewer (scene),
671 toplevel (0),
672 shell (0),
673 main_win (0),
674 menubar (0),
675 style_cascade (0),
676 actions_cascade (0),
677 misc_cascade (0),
678 spec_cascade (0),
679 drawing_style_pullright (0),
680 background_color_pullright (0),
681 transparency_pullright (0),
682 antialias_pullright (0),
683 haloing_pullright (0),
684 aux_edge_pullright (0),
685 frame (0),
686 glxarea (0),
687 style_str (0),
688 actions_str (0),
689 misc_str (0),
690 spec_str (0),
691 draw_str (0),
692 polyhedron_str (0),
693 wireframe_str (0),
694 hlr_str (0),
695 hsr_str (0),
696 hlhsr_str (0),
697 set_str (0),
698 rot_str (0),
699 pan_str (0),
700 exit_str (0),
701 quit_str (0),
702 print_str (0),
703 white_str (0),
704 black_str (0),
705 anti_str (0),
706 trans_str (0),
707 halo_str (0),
708 aux_edge_str (0),
709 bgnd_str (0),
710 off_str (0),
711 on_str (0),
712 zoom_high (0.0),
713 zoom_low (0.0),
714 pan_low (0.0),
715 pan_high (0.0),
716 dolly_low (0.0),
717 dolly_high (0.0),
718 fov (0.0),
719 rot_sens_limit (0.0),
720 pan_sens_limit (0.0),
721 wob_high (0.0),
722 wob_low (0.0),
723 wob_sens (0.0),
724 pan_right (false),
725 rotate_right (false),
726 pan_up (false),
727 rotate_up (false),
728 original_vp(fVP.GetViewpointDirection()),
729 frameNo (0),
730 fprotation_top (0),
731 fprotation_button_box (0),
732 fprotation_button1 (0),
733 fprotation_button2 (0),
734 fprotation_slider_box (0),
735 fprotation_slider (0),
736 fprotation_arrow_box (0),
737 fprotation_arrow (0),
738 fppanning_top (0),
739 fppanning_box (0),
740 fppanning_arrows (0),
741 fppanning_slider (0),
742 fpzoom_box (0),
743 fpzoom_slider (0),
744 fpdolly_box (0),
745 fpdolly_slider (0),
746 fpsetting_top (0),
747 fpsetting_box (0),
748 fppan_set (0),
749 fprot_set (0),
750 fpzoom_upper (0),
751 fpzoom_lower (0),
752 fpdolly_upper (0),
753 fpdolly_lower (0),
754 fpok_button (0),
755 fpmiscellany_top (0),
756 fpwobble_box (0),
757 fpwobble_button (0),
758 fpwobble_slider (0),
759 fpreset_box (0),
760 fpreset_button (0),
761 fpproj_style_box (0),
762 fporthogonal_button (0),
763 fpperspective_button (0),
764 fpfov_text (0),
765 fpprint_top (0),
766 fpprint_box (0),
767 fpprint_col_box (0),
768 fpprint_style_box (0),
769 fpprint_text (0),
770 fpprint_button (0),
771 fpprint_line (0),
772 fpprint_col_radio1 (0),
773 fpprint_col_radio2 (0),
774 fpprint_style_radio1 (0),
775 fpprint_style_radio2 (0)
776 {
777  GetXmConnection ();
778  ResetView();
779  if (fViewId < 0) return;
780 }
781 
782 
783 void G4OpenGLXmViewer::UpdateControlPanel () {
784 
785  // set new values
786 
787  if (fprotation_slider) {
788  fprotation_slider->SetInitialValue(fRot_sens);
789  fprotation_slider->SetMaxValue(rot_sens_limit);
790  fprotation_slider->SetMinValue(0);
791  }
792  if (fppanning_slider) {
793  fppanning_slider->SetInitialValue(fPan_sens);
794  fppanning_slider->SetMaxValue(pan_sens_limit);
795  fppanning_slider->SetMinValue(0);
796  }
797  if (fpzoom_slider) {
798  fpzoom_slider->SetInitialValue(fVP.GetZoomFactor());
799  fpzoom_slider->SetMinValue(zoom_low);
800  fpzoom_slider->SetMaxValue(zoom_high);
801  }
802  if (fpdolly_slider) {
803  fpdolly_slider->SetInitialValue(fVP.GetDolly());
804  fpdolly_slider->SetMinValue(dolly_low);
805  fpdolly_slider->SetMaxValue(dolly_high);
806  }
807 
808  if (fpwobble_slider) {
809  fpwobble_slider->SetInitialValue(fVP.GetDolly());
810  }
811 
812  if (fppan_set) {
813  fppan_set->SetValue(pan_sens_limit);
814  }
815 
816  if (fprot_set) {
817  fprot_set->SetValue(rot_sens_limit);
818  }
819 
820  if (fpzoom_upper) {
821  fpzoom_upper->SetValue(zoom_high);
822  }
823 
824  if (fpzoom_lower) {
825  fpzoom_lower->SetValue(zoom_low);
826  }
827  if (fpdolly_upper) {
828  fpdolly_upper->SetValue(dolly_high);
829  }
830 
831  if (fpdolly_lower) {
832  fpdolly_lower->SetValue(dolly_low);
833  }
834 
835 
836 }
837 
838 
839 G4OpenGLXmViewer::~G4OpenGLXmViewer ()
840 {
841  XtDestroyWidget (shell);
842  win = 0; // ...to avoid XDestroyWindow in G4OpenGLXViewer base class
843  // because XtDestroyWidget has already destroyed it.
844  G4Xt::getInstance () ->RemoveShell (shell);
845 
846 /******************************
847  if (fprotation_top) {
848  delete fprotation_top;
849  }
850 
851  if (fppanning_top) {
852  delete fppanning_top;
853  }
854 
855  if (fpsetting_top) {
856  delete fpsetting_top;
857  }
858 
859  if (fpmiscellany_top) {
860  delete fpmiscellany_top;
861  }
862 ******************************/
863 
864 }
865 
866 #endif
G4String fName
Definition: G4AttUtils.hh:55
int G4int
Definition: G4Types.hh:78
G4GLOB_DLL std::ostream G4cout
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
const char * data() const
#define G4endl
Definition: G4ios.hh:61
G4GLOB_DLL std::ostream G4cerr