00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifdef G4VIS_BUILD_OPENGLXM_DRIVER
00040
00041 #include "G4OpenGLXmViewer.hh"
00042
00043 #include "G4Xt.hh"
00044
00045 #include "G4VSceneHandler.hh"
00046
00047 #include "G4Scene.hh"
00048
00049 #include "G4OpenGLXmRadioButton.hh"
00050 #include "G4OpenGLXmSliderBar.hh"
00051 #include "G4OpenGLXmFourArrowButtons.hh"
00052 #include "G4OpenGLXmTextField.hh"
00053 #include "G4OpenGLXmPushButton.hh"
00054 #include "G4OpenGLXmBox.hh"
00055 #include "G4OpenGLXmFramedBox.hh"
00056 #include "G4OpenGLXmTopLevelShell.hh"
00057 #include "G4OpenGLXmSeparator.hh"
00058
00059 #include <sstream>
00060
00061 void G4OpenGLXmViewer::actions_callback (Widget w,
00062 XtPointer clientData,
00063 XtPointer)
00064 {
00065
00066 G4OpenGLXmViewer* pView;
00067 G4long choice = (G4long)clientData;
00068
00069
00070 XtVaGetValues (XtParent(w),
00071 XmNuserData, &pView,
00072 NULL);
00073
00074 switch (choice) {
00075
00076 case 0:
00077
00078 {
00079
00080 if (!pView->fprotation_top) {
00081 std::ostringstream rot_Name;
00082 rot_Name << pView->GetSceneHandler()->GetSceneHandlerId() << '-' << pView->fViewId;
00083
00084 pView->fprotation_top = new G4OpenGLXmTopLevelShell (pView,
00085 (char*)rot_Name.str().c_str());
00086 pView->fprotation_button_box = new G4OpenGLXmBox ("Rotation button box", True);
00087
00088 pView->fprotation_top->AddChild (pView->fprotation_button_box);
00089
00090 XtCallbackRec* rot_cb_list = new XtCallbackRec[2];
00091 rot_cb_list[0].callback = set_rot_subject_callback;
00092 rot_cb_list[0].closure = pView;
00093 rot_cb_list[1].callback = NULL;
00094
00095 pView->fprotation_button1 = new G4OpenGLXmRadioButton
00096 ("Object",
00097 rot_cb_list,
00098 pView->GetViewParameters().GetLightsMoveWithCamera(),
00099 0);
00100
00101 pView->fprotation_button2 = new G4OpenGLXmRadioButton
00102 ("Camera",
00103 rot_cb_list,
00104 !(pView->GetViewParameters().GetLightsMoveWithCamera()),
00105 1);
00106
00107 pView->fprotation_button_box->AddChild (pView->fprotation_button1);
00108 pView->fprotation_button_box->AddChild (pView->fprotation_button2);
00109
00110 pView->fprotation_slider_box = new G4OpenGLXmBox ("Rotation slider box", False);
00111 pView->fprotation_top->AddChild (pView->fprotation_slider_box);
00112
00113 XtCallbackRec* rot_slider_list = new XtCallbackRec[2];
00114 rot_slider_list[0].callback = set_rot_sens_callback;
00115 rot_slider_list[0].closure = pView;
00116 rot_slider_list[1].callback = NULL;
00117
00118 pView->fprotation_slider = new G4OpenGLXmSliderBar ("Rotation slider",
00119 rot_slider_list,
00120 True,
00121 2,
00122 pView->fRot_sens,
00123 pView->rot_sens_limit,
00124 0);
00125 pView->fprotation_slider_box->AddChild (pView->fprotation_slider);
00126
00127 pView->fprotation_arrow_box = new G4OpenGLXmBox ("Rotation arrow box", False);
00128 pView->fprotation_top->AddChild (pView->fprotation_arrow_box);
00129
00130 XtCallbackRec** rotation_callbacks = new XtCallbackRec*[4];
00131 for (G4int i = 0; i < 4; i++) {
00132 rotation_callbacks[i] = new XtCallbackRec[2];
00133 }
00134 rotation_callbacks[0][0].callback = phi_rotation_callback;
00135 rotation_callbacks[0][0].closure = pView;
00136 rotation_callbacks[0][1].callback = NULL;
00137
00138 rotation_callbacks[1][0].callback = phi_rotation_callback;
00139 rotation_callbacks[1][0].closure = pView;
00140 rotation_callbacks[1][1].callback = NULL;
00141
00142 rotation_callbacks[2][0].callback = theta_rotation_callback;
00143 rotation_callbacks[2][0].closure = pView;
00144 rotation_callbacks[2][1].callback = NULL;
00145
00146 rotation_callbacks[3][0].callback = theta_rotation_callback;
00147 rotation_callbacks[3][0].closure = pView;
00148 rotation_callbacks[3][1].callback = NULL;
00149
00150 pView->fprotation_arrow = new G4OpenGLXmFourArrowButtons (rotation_callbacks);
00151
00152 pView->fprotation_arrow_box->AddChild (pView->fprotation_arrow);
00153
00154 pView->fprotation_top->Realize ();
00155 }
00156 break;
00157
00158 }
00159
00160
00161 case 1:
00162 {
00163 if (!pView->GetSceneHandler()->GetScene()) {
00164 break;
00165 }
00166 if (!pView->fppanning_top) {
00167 std::ostringstream pan_Name;
00168 pan_Name << pView->GetSceneHandler()->GetSceneHandlerId() << '-' << pView->fViewId;
00169
00170 pView->fppanning_top = new G4OpenGLXmTopLevelShell (pView,
00171 (char*)pan_Name.str().c_str());
00172
00173 pView->fppanning_box = new G4OpenGLXmFramedBox ("Pan up-down-left-right",
00174 False);
00175
00176 pView->fppanning_top->AddChild (pView->fppanning_box);
00177
00178 XtCallbackRec** pan_callbacks = new XtCallbackRec*[4];
00179 for (G4int i = 0; i < 4; i++) {
00180 pan_callbacks[i] = new XtCallbackRec[2];
00181 }
00182 pan_callbacks[0][0].callback = pan_up_down_callback;
00183 pan_callbacks[0][0].closure = pView;
00184 pan_callbacks[0][1].callback = NULL;
00185
00186 pan_callbacks[1][0].callback = pan_up_down_callback;
00187 pan_callbacks[1][0].closure = pView;
00188 pan_callbacks[1][1].callback = NULL;
00189
00190 pan_callbacks[2][0].callback = pan_left_right_callback;
00191 pan_callbacks[2][0].closure = pView;
00192 pan_callbacks[2][1].callback = NULL;
00193
00194 pan_callbacks[3][0].callback = pan_left_right_callback;
00195 pan_callbacks[3][0].closure = pView;
00196 pan_callbacks[3][1].callback = NULL;
00197
00198 pView->fppanning_arrows = new G4OpenGLXmFourArrowButtons (pan_callbacks);
00199
00200 pView->fppanning_box->AddChild (pView->fppanning_arrows);
00201
00202 XtCallbackRec* pan_slider_list = new XtCallbackRec[2];
00203 pan_slider_list[0].callback = set_pan_sens_callback;
00204 pan_slider_list[0].closure = pView;
00205 pan_slider_list[1].callback = NULL;
00206
00207 pView->fppanning_slider = new G4OpenGLXmSliderBar ("Panning slider",
00208 pan_slider_list,
00209 True,
00210 2,
00211 pView->fPan_sens = pView->GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius() / 10.0,
00212 pView->pan_sens_limit = pView->GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius(),
00213 0);
00214 pView->fppanning_box->AddChild (pView->fppanning_slider);
00215
00216 pView->fpzoom_box = new G4OpenGLXmFramedBox ("Zoom",
00217 False);
00218 pView->fppanning_top->AddChild (pView->fpzoom_box);
00219
00220 XtCallbackRec* zoom_slider_list = new XtCallbackRec[2];
00221 zoom_slider_list[0].callback = zoom_callback;
00222 zoom_slider_list[0].closure = pView;
00223 zoom_slider_list[1].callback = NULL;
00224
00225 pView->fpzoom_slider = new G4OpenGLXmSliderBar ("Zoom slider",
00226 zoom_slider_list,
00227 True,
00228 2,
00229 pView->fVP.GetZoomFactor(),
00230 pView->zoom_high,
00231 pView->zoom_low);
00232 pView->fpzoom_box->AddChild (pView->fpzoom_slider);
00233
00234 pView->fpdolly_box = new G4OpenGLXmFramedBox ("Dolly",
00235 False);
00236 pView->fppanning_top->AddChild (pView->fpdolly_box);
00237
00238 XtCallbackRec* dolly_slider_list = new XtCallbackRec[2];
00239 dolly_slider_list[0].callback = dolly_callback;
00240 dolly_slider_list[0].closure = pView;
00241 dolly_slider_list[1].callback = NULL;
00242
00243 pView->fpdolly_slider = new G4OpenGLXmSliderBar ("Dolly slider",
00244 dolly_slider_list,
00245 True,
00246 2,
00247 pView->fVP.GetDolly(),
00248 pView->dolly_high = pView->GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius(),
00249 pView->dolly_low = -(pView->GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius()));
00250
00251
00252 pView->fpdolly_box->AddChild (pView->fpdolly_slider);
00253
00254 pView->fppanning_top->Realize ();
00255 pView->UpdateControlPanel ();
00256 }
00257
00258 break;
00259
00260 }
00261 case 2:
00262 {
00263
00264 if (!pView->fpsetting_top) {
00265 std::ostringstream set_Name;
00266 set_Name << pView->GetSceneHandler()->GetSceneHandlerId() << '-' << pView->fViewId;
00267
00268 pView->fpsetting_top = new G4OpenGLXmTopLevelShell(pView,
00269 (char*)set_Name.str().c_str());
00270
00271 pView->fpsetting_box = new G4OpenGLXmFramedBox ("Set values for control panels",
00272 False);
00273 pView->fpsetting_top->AddChild (pView->fpsetting_box);
00274
00275 pView->fppan_set = new G4OpenGLXmTextField ("Upper limit of pan sensitivity",
00276 &(pView->pan_sens_limit));
00277
00278 pView->fprot_set = new G4OpenGLXmTextField ("Upper limit of rotation sensitivity",
00279 &(pView->rot_sens_limit));
00280
00281 pView->fpzoom_upper = new G4OpenGLXmTextField ("Upper limit of zoom",
00282 &(pView->zoom_high));
00283
00284 pView->fpzoom_lower = new G4OpenGLXmTextField ("Lower limit of zoom",
00285 &(pView->zoom_low));
00286
00287 pView->fpdolly_upper = new G4OpenGLXmTextField ("Upper limit of dolly",
00288 &(pView->dolly_high));
00289
00290 pView->fpdolly_lower = new G4OpenGLXmTextField ("Lower limit of dolly",
00291 &(pView->dolly_low));
00292
00293 XtCallbackRec* ok_list = new XtCallbackRec[2];
00294 ok_list[0].callback = update_panels_callback;
00295 ok_list[0].closure = pView;
00296 ok_list[1].callback = NULL;
00297
00298
00299 pView->fpok_button = new G4OpenGLXmPushButton ("ok",
00300 ok_list);
00301
00302 pView->fpsetting_box->AddChild (pView->fppan_set);
00303 pView->fpsetting_box->AddChild (pView->fprot_set);
00304 pView->fpsetting_box->AddChild (pView->fpzoom_upper);
00305 pView->fpsetting_box->AddChild (pView->fpzoom_lower);
00306 pView->fpsetting_box->AddChild (pView->fpdolly_upper);
00307 pView->fpsetting_box->AddChild (pView->fpdolly_lower);
00308 pView->fpsetting_box->AddChild (pView->fpok_button);
00309
00310 pView->fpsetting_top->Realize ();
00311
00312 }
00313
00314 break;
00315 }
00316
00317 default:
00318 G4Exception
00319 ("G4OpenGLXmViewer::actions_callback",
00320 "opengl2001", FatalException,
00321 "Unrecognised widget child of control_callback");
00322 }
00323
00324 return;
00325 }
00326
00327
00328
00329 void G4OpenGLXmViewer::misc_callback (Widget w,
00330 XtPointer clientData,
00331 XtPointer)
00332 {
00333 G4OpenGLXmViewer* pView;
00334 G4long choice = (G4long)clientData;
00335 XtVaGetValues (XtParent(w),
00336 XmNuserData, &pView,
00337 NULL);
00338
00339 switch (choice) {
00340
00341 case 0:
00342 {
00343
00344 if (!pView->fpmiscellany_top) {
00345
00346 std::ostringstream misc_Name;
00347 misc_Name << pView->GetSceneHandler()->GetSceneHandlerId() << '-' << pView->fViewId;
00348
00349 pView->fpmiscellany_top = new G4OpenGLXmTopLevelShell (pView,
00350 (char*)misc_Name.str().c_str());
00351 pView->fpwobble_box = new G4OpenGLXmFramedBox ("Wobble view",
00352 True);
00353 pView->fpmiscellany_top->AddChild (pView->fpwobble_box);
00354
00355 XtCallbackRec* wob_cb_list = new XtCallbackRec[2];
00356 wob_cb_list[0].callback = wobble_callback;
00357 wob_cb_list[0].closure = pView;
00358 wob_cb_list[1].callback = NULL;
00359
00360
00361 pView->fpwobble_button = new G4OpenGLXmPushButton ("Wobble",
00362 wob_cb_list);
00363
00364 XtCallbackRec* wobble_slider_list = new XtCallbackRec[2];
00365 wobble_slider_list[0].callback = set_wob_sens_callback;
00366 wobble_slider_list[0].closure = pView;
00367 wobble_slider_list[1].callback = NULL;
00368
00369 pView->fpwobble_slider = new G4OpenGLXmSliderBar ("Wobble slider",
00370 wobble_slider_list,
00371 True,
00372 0,
00373 pView->wob_sens,
00374 pView->wob_high,
00375 pView->wob_low);
00376 pView->fpwobble_box->AddChild (pView->fpwobble_button);
00377 pView->fpwobble_box->AddChild (pView->fpwobble_slider);
00378
00379 pView->fpreset_box = new G4OpenGLXmFramedBox ("Reset view",
00380 True);
00381 pView->fpmiscellany_top->AddChild (pView->fpreset_box);
00382
00383 XtCallbackRec* rst_cb_list = new XtCallbackRec[3];
00384 rst_cb_list[0].callback = reset_callback;
00385 rst_cb_list[0].closure = pView;
00386 rst_cb_list[1].callback = update_panels_callback;
00387 rst_cb_list[1].closure = pView;
00388 rst_cb_list[2].callback = NULL;
00389
00390 pView->fpreset_button = new G4OpenGLXmPushButton ("Reset",
00391 rst_cb_list);
00392
00393 pView->fpreset_box->AddChild (pView->fpreset_button);
00394
00395 pView->fpproj_style_box = new G4OpenGLXmFramedBox ("Projection style",
00396 True);
00397 pView->fpmiscellany_top->AddChild (pView->fpproj_style_box);
00398
00399 XtCallbackRec* proj_cb_list = new XtCallbackRec[2];
00400 proj_cb_list[0].callback = projection_callback;
00401 proj_cb_list[0].closure = pView;
00402 proj_cb_list[1].callback = NULL;
00403
00404 pView->fporthogonal_button = new G4OpenGLXmRadioButton ("Orthographic",
00405 proj_cb_list,
00406 pView->fVP.GetFieldHalfAngle() > 0. ? False : True,
00407 0);
00408
00409 pView->fpperspective_button = new G4OpenGLXmRadioButton ("Perspective",
00410 proj_cb_list,
00411 pView->fVP.GetFieldHalfAngle() > 0. ? True : False,
00412 1);
00413
00414 pView->fpfov_text = new G4OpenGLXmTextField ("Field of view 0.1 -> 89.5 degrees.",
00415 &(pView->fov));
00416
00417 pView->fpproj_style_box->AddChild (pView->fpperspective_button);
00418 pView->fpproj_style_box->AddChild (pView->fporthogonal_button);
00419 pView->fpproj_style_box->AddChild (pView->fpfov_text);
00420
00421 pView->fpmiscellany_top->Realize ();
00422
00423 }
00424
00425 break;
00426 }
00427
00428 case 1:
00429 {
00430 G4Xt::getInstance () -> RequireExitSecondaryLoop (OGL_EXIT_CODE);
00431 break;
00432 }
00433
00434 case 2:
00435 {
00436 if (!pView->fpprint_top) {
00437
00438 std::ostringstream print_Name;
00439 print_Name << pView->GetSceneHandler()->GetSceneHandlerId() << '-' << pView->fViewId;
00440
00441 pView->fpprint_top = new G4OpenGLXmTopLevelShell (pView,
00442 (char*)print_Name.str().c_str());
00443
00444 pView->fpprint_box = new G4OpenGLXmFramedBox ("Create EPS file of current view",
00445 False);
00446
00447 pView->fpprint_top->AddChild (pView->fpprint_box);
00448
00449 pView->fpprint_col_box = new G4OpenGLXmFramedBox ("Colour choice",
00450 True);
00451 pView->fpprint_top->AddChild (pView->fpprint_col_box);
00452
00453 XtCallbackRec* prcol_cb_list = new XtCallbackRec[2];
00454 prcol_cb_list[0].callback = set_print_colour_callback;
00455 prcol_cb_list[0].closure = pView;
00456 prcol_cb_list[1].callback = NULL;
00457
00458 pView->fpprint_col_radio1 = new G4OpenGLXmRadioButton ("Black and white",
00459 prcol_cb_list,
00460 pView->fPrintColour==false ? True : False,
00461 0);
00462
00463 pView->fpprint_col_radio2 = new G4OpenGLXmRadioButton ("Colour",
00464 prcol_cb_list,
00465 pView->fPrintColour==true ? True : False,
00466 1);
00467
00468 pView->fpprint_col_box->AddChild (pView->fpprint_col_radio1);
00469 pView->fpprint_col_box->AddChild (pView->fpprint_col_radio2);
00470
00471 pView->fpprint_style_box = new G4OpenGLXmFramedBox ("File type",
00472 True);
00473 pView->fpprint_top->AddChild (pView->fpprint_style_box);
00474
00475 XtCallbackRec* prsty_cb_list = new XtCallbackRec[2];
00476 prsty_cb_list[0].callback = set_print_style_callback;
00477 prsty_cb_list[0].closure = pView;
00478 prsty_cb_list[1].callback = NULL;
00479
00480 pView->fpprint_style_radio1 = new G4OpenGLXmRadioButton ("Screen dump (pixmap)",
00481 prsty_cb_list,
00482 pView->fVectoredPs==false ? True : False,
00483 0);
00484
00485 pView->fpprint_style_radio2 = new G4OpenGLXmRadioButton ("PostScript",
00486 prsty_cb_list,
00487 pView->fVectoredPs==true ? True : False,
00488 1);
00489
00490 pView->fpprint_style_box->AddChild (pView->fpprint_style_radio1);
00491 pView->fpprint_style_box->AddChild (pView->fpprint_style_radio2);
00492
00493 pView->fpprint_text = new G4OpenGLXmTextField ("Name of .eps file to save",
00494 (pView->getRealPrintFilename().c_str()));
00495 pView->fpprint_box->AddChild (pView->fpprint_text);
00496
00497 pView->fpprint_line = new G4OpenGLXmSeparator ();
00498 pView->fpprint_box->AddChild (pView->fpprint_line);
00499
00500 XtCallbackRec* pri_cb_list = new XtCallbackRec[2];
00501 pri_cb_list[0].callback = print_callback;
00502 pri_cb_list[0].closure = pView;
00503 pri_cb_list[1].callback = NULL;
00504
00505
00506 pView->fpprint_button = new G4OpenGLXmPushButton ("Create EPS file",
00507 pri_cb_list);
00508
00509 pView->fpprint_box->AddChild (pView->fpprint_button);
00510 pView->fpprint_top->Realize ();
00511
00512 }
00513
00515 break;
00516 }
00517
00518 default:
00519 G4Exception
00520 ("G4OpenGLXmViewer::misc_callback",
00521 "opengl2002", FatalException,
00522 "Unrecognised widget child of misc_callback.");
00523 }
00524
00525 return;
00526
00527 }
00528
00529 void G4OpenGLXmViewer::set_wob_sens_callback (Widget w,
00530 XtPointer clientData,
00531 XtPointer callData)
00532 {
00533 XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct*) callData;
00534 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
00535 short dp = -1;
00536 G4float ten_to_the_dp = 10.;
00537
00538 XtVaGetValues (w,
00539 XmNdecimalPoints, &dp,
00540 NULL);
00541
00542 if (dp == 0) {
00543 ten_to_the_dp = 1.;
00544 } else if ( dp > 0) {
00545 for (G4int i = 1; i < (G4int)dp; i++) {
00546 ten_to_the_dp *= 10.;
00547 }
00548 } else {
00549 G4Exception
00550 ("G4OpenGLXmViewer::set_wob_sens_callback",
00551 "opengl2003", FatalException,
00552 "Bad value returned for dp in set_rot_sens_callback");
00553 }
00554
00555 pView->wob_sens = (G4float)(cbs->value) / ten_to_the_dp;
00556 }
00557
00558 void G4OpenGLXmViewer::update_panels_callback (Widget,
00559 XtPointer clientData,
00560 XtPointer)
00561 {
00562 G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
00563
00564 if (pView->fppanning_slider) {
00565 pView->fppanning_slider->SetMaxValue (pView->pan_sens_limit);
00566 }
00567 if (pView->fprotation_slider) {
00568 pView->fprotation_slider->SetMaxValue (pView->rot_sens_limit);
00569 }
00570
00571 if (pView->fpzoom_slider) {
00572 pView->fpzoom_slider->SetMaxValue (pView->zoom_high);
00573 pView->fpzoom_slider->SetMinValue (pView->zoom_low);
00574 pView->fpzoom_slider->SetInitialValue (pView->fVP.GetZoomFactor());
00575 }
00576
00577 if (pView->fpdolly_slider) {
00578 pView->fpdolly_slider->SetMaxValue (pView->dolly_high);
00579 pView->fpdolly_slider->SetMinValue (pView->dolly_low);
00580 }
00581 }
00582
00583 #endif