1 #include <display/SplitGLView.h>
2 #include <display/EveGeometry.h>
3 #include <display/InfoWidget.h>
4 #include <framework/logging/Logger.h>
7 #include "TEveManager.h"
8 #include "TEveBrowser.h"
9 #include "TEveProjectionAxes.h"
10 #include "TEveViewer.h"
11 #include "TEveWindowManager.h"
13 #include "TGStatusBar.h"
15 #include "TGLPhysicalShape.h"
16 #include "TGLLogicalShape.h"
17 #include "TGLWidget.h"
25 bool toggleMenuEntry(TGPopupMenu* menu,
int entryid)
27 if (menu->IsEntryChecked(entryid))
28 menu->UnCheckEntry(entryid);
30 menu->CheckEntry(entryid);
31 return menu->IsEntryChecked(entryid);
39 const char* projectionName[3] = {
"3D",
"Rho/Z",
"R/Phi" };
40 TGLViewer::ECameraType cameraType[3] = { TGLViewer::kCameraPerspXOZ, TGLViewer::kCameraOrthoXOY, TGLViewer::kCameraOrthoXOY };
42 TEveWindowSlot* slot = TEveWindow::CreateWindowMainFrame();
43 TEveWindowPack* pack = slot->MakePack();
45 pack->SetShowTitleBar(kFALSE);
47 TEveWindowSlot* viewerslots[3];
48 auto pack1 = pack->NewSlot()->MakePack();
49 pack1->SetHorizontal();
50 pack1->SetShowTitleBar(kFALSE);
51 viewerslots[0] = pack1->NewSlotWithWeight(0.7);
52 TEveWindowSlot* infoslot = pack1->NewSlotWithWeight(0.3);
54 auto pack2 = pack->NewSlot()->MakePack();
55 pack2->SetHorizontal();
56 pack2->SetShowTitleBar(kFALSE);
57 viewerslots[1] = pack2->NewSlot();
58 viewerslots[2] = pack2->NewSlot();
62 for (
int iFrame = 0; iFrame < 3; iFrame++) {
63 TEveViewer* viewer =
new TEveViewer(TString::Format(
"%s viewer", projectionName[iFrame]));
64 m_glViewer[iFrame] = viewer->SpawnGLEmbeddedViewer();
65 viewerslots[iFrame]->ReplaceWindow(viewer);
66 viewerslots[iFrame] =
nullptr;
68 viewer->SetShowTitleBar(kFALSE);
71 m_glViewer[iFrame]->SetCurrentCamera(cameraType[iFrame]);
73 TEveProjectionManager* projectionMgr = 0;
75 m_rhozManager =
new TEveProjectionManager(TEveProjection::kPT_RhoZ);
77 m_glViewer[iFrame]->CurrentCamera().Zoom(+300,
false,
false);
78 }
else if (iFrame == 2) {
79 m_rphiManager =
new TEveProjectionManager(TEveProjection::kPT_RPhi);
81 m_glViewer[iFrame]->CurrentCamera().Zoom(-50,
false,
false);
85 m_glViewer[iFrame]->Connect(
"MouseOver(TGLPhysicalShape*)",
"Belle2::SplitGLView",
this,
"onMouseOver(TGLPhysicalShape*)");
86 m_glViewer[iFrame]->Connect(
"Clicked(TObject*)",
"Belle2::SplitGLView",
this,
"onClicked(TObject*)");
88 viewer->AddScene(gEve->GetGlobalScene());
89 viewer->AddScene(gEve->GetEventScene());
93 s = gEve->SpawnNewScene(TString::Format(
"%s projection", projectionName[iFrame]));
97 gEve->GetViewers()->AddElement(viewer);
99 s->AddElement(projectionMgr);
100 gEve->AddToListTree(projectionMgr, kTRUE);
101 TEveProjectionAxes* axes =
new TEveProjectionAxes(projectionMgr);
102 projectionMgr->AddElement(axes);
108 TEveWindowFrame* eveFrame =
new TEveWindowFrame(
m_infoWidget,
"DataStore Info");
109 infoslot->ReplaceWindow(eveFrame);
110 eveFrame->SetShowTitleBar(kFALSE);
115 m_cameraMenu =
new TGPopupMenu(gClient->GetDefaultRoot());
116 m_cameraMenu->AddEntry(
"Perspective (Floor X/Z)", kGLPerspXOZ);
117 m_cameraMenu->AddEntry(
"Perspective (Floor Y/Z)", kGLPerspYOZ);
118 m_cameraMenu->AddEntry(
"Perspective (Floor X/Y)", kGLPerspXOY);
123 m_cameraMenu->AddEntry(
"Orthographic: Allow Rotating", kGLOrthoRotate);
124 m_cameraMenu->AddEntry(
"Orthographic: Right Click to Dolly", kGLOrthoDolly);
126 m_cameraMenu->AddEntry(
"Perspective: Enable Stereographic 3D (Requires Hardware or stereowrap)", kGLStereo);
128 m_sceneMenu =
new TGPopupMenu(gClient->GetDefaultRoot());
129 m_sceneMenu->AddEntry(
"&Update Current", kSceneUpdate);
130 m_sceneMenu->AddEntry(
"Update &All", kSceneUpdateAll);
132 m_sceneMenu->AddEntry(
"&Show Scale for Projections", kShowScale);
135 m_sceneMenu->AddEntry(
"Save &Geometry Extract", kSaveGeometryExtract);
137 TGMenuBar* menuBar = gEve->GetBrowser()->GetMenuBar();
138 menuBar->AddPopup(
"&Camera",
m_cameraMenu,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0));
139 menuBar->AddPopup(
"&Scene",
m_sceneMenu,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0));
142 m_cameraMenu->Connect(
"Activated(Int_t)",
"Belle2::SplitGLView",
this,
"handleMenu(Int_t)");
143 m_sceneMenu->Connect(
"Activated(Int_t)",
"Belle2::SplitGLView",
this,
"handleMenu(Int_t)");
151 gEve->GetListTree()->Connect(
"Clicked(TGListTreeItem*, Int_t, Int_t, Int_t)",
152 "Belle2::SplitGLView",
this,
"itemClicked(TGListTreeItem*, Int_t, Int_t, Int_t)");
158 for (
int i = 0; i < 3; i++) {
172 TGLViewer::ECameraType cameraType;
173 switch (cameraAction) {
175 cameraType = TGLViewer::kCameraPerspYOZ;
178 cameraType = TGLViewer::kCameraPerspXOZ;
181 cameraType = TGLViewer::kCameraPerspXOY;
184 cameraType = TGLViewer::kCameraOrthoXOY;
187 cameraType = TGLViewer::kCameraOrthoXOZ;
190 cameraType = TGLViewer::kCameraOrthoZOY;
193 B2ERROR(
"unknown camera action " << cameraAction);
196 viewer->SetCurrentCamera(cameraType);
203 switch (menuCommand) {
228 case kSceneUpdateAll:
229 for (
int i = 0; i < 3; i++)
237 case kSaveGeometryExtract:
251 m_statusBar->SetText(Form(
"User clicked on: \"%s\"", obj->GetName()), 1);
253 TEveElement* elem =
dynamic_cast<TEveElement*
>(obj);
254 if (TEveProjected* projected =
dynamic_cast<TEveProjected*
>(obj)) {
255 elem =
dynamic_cast<TEveElement*
>(projected->GetProjectable());
260 TGListTreeItem* eventItem = gEve->GetListTree()->FindItemByPathname(
"Event");
261 TGListTreeItem* item = gEve->GetListTree()->FindItemByObj(eventItem, elem);
264 gEve->GetBrowser()->GetTabLeft()->SetTab(
"Eve");
267 TGListTreeItem* parent = item;
268 while ((parent = parent->GetParent()) !=
nullptr)
269 gEve->GetListTree()->OpenItem(parent);
272 gEve->GetListTree()->AdjustPosition(item);
280 TGLEmbeddedViewer* sender =
dynamic_cast<TGLEmbeddedViewer*
>(
static_cast<TQObject*
>(gTQSender));
283 B2WARNING(
"onClicked() signal not from a TGLEmbeddedViewer?");
291 const TEveWindow* currentWindow = gEve->GetWindowManager()->GetCurrentWindow();
294 for (
int i = 0; i < 3; i++) {
309 for (
int i = 0; i < 3; i++) {
316 B2WARNING(
"setActiveViewer(): viewer not found!");
352 if (shape && shape->GetLogical() && shape->GetLogical()->GetExternal())
354 shape->GetLogical()->GetExternal()->GetName()), 0);
362 Bool_t state = toggleMenuEntry(
m_cameraMenu, kGLOrthoRotate);
372 Bool_t state = !toggleMenuEntry(
m_cameraMenu, kGLOrthoDolly);
390 bool state = toggleMenuEntry(
m_sceneMenu, kShowScale);
393 for (
auto mgr : projections) {
394 TEveElement::List_ci end_it = mgr->EndChildren();
395 for (TEveElement::List_i it = mgr->BeginChildren(); it != end_it; ++it) {
396 TEveProjectionAxes* a =
dynamic_cast<TEveProjectionAxes*
>(*it);
398 a->SetRnrSelf(state);
402 gEve->Redraw3D(
false);
409 static const TEveException eh(
"SplitGLView::itemClicked ");
410 TEveElement* re =
static_cast<TEveElement*
>(item->GetUserData());
412 TObject* obj = re->GetObject(eh);
413 if (obj->InheritsFrom(
"TEveViewer")) {
414 TGLViewer* v =
static_cast<TEveViewer*
>(obj)->GetGLViewer();
416 if (v->InheritsFrom(
"TGLEmbeddedViewer")) {
417 TGLEmbeddedViewer* ev = (TGLEmbeddedViewer*)v;
418 gVirtualX->SetInputFocus(ev->GetGLWidget()->GetId());