+// Multi-view (3d, rphi, rhoz) service class using EVE Window Manager.
+// Author: Matevz Tadel 2009
+
+#include <TEveManager.h>
+
+#include <TEveViewer.h>
+#include <TGLViewer.h>
+
+#include <TEveScene.h>
+#include <TEveGeoShape.h>
+
+#include <TEveProjectionManager.h>
+#include <TEveProjectionAxes.h>
+
+#include <TEveBrowser.h>
+#include <TEveWindow.h>
+
+// MultiView
+//
+// Structure encapsulating standard views: 3D, r-phi and rho-z.
+// Includes scenes and projection managers.
+//
+// Should be used in compiled mode.
+
+class MultiView
+{
+public:
+ TEveProjectionManager *fRPhiMgr;
+ TEveProjectionManager *fRhoZMgr;
+
+ TEveViewer *f3DView;
+ TEveViewer *fRPhiView;
+ TEveViewer *fRhoZView;
+
+ TEveScene *fRPhiGeomScene;
+ TEveScene *fRhoZGeomScene;
+ TEveScene *fRPhiEventScene;
+ TEveScene *fRhoZEventScene;
+
+ TEveGeoShape *fGeomGentle;
+ TEveGeoShape *fGeomGentleRPhi;
+ TEveGeoShape *fGeomGentleRhoZ;
+ TEveGeoShape *fGeomGentleTrd;
+ TEveGeoShape *fGeomGentleMuon;
+
+ //-------------------------------------------------------------------------
+
+ MultiView() :
+ fGeomGentle(0), fGeomGentleRPhi(0), fGeomGentleRhoZ(0),
+ fGeomGentleTrd(0), fGeomGentleMuon(0)
+ {
+ // Constructor --- creates required scenes, projection managers
+ // and GL viewers.
+
+ // Scenes
+ //========
+
+ fRPhiGeomScene = gEve->SpawnNewScene("RPhi Geometry",
+ "Scene holding projected geometry for the RPhi view.");
+ fRhoZGeomScene = gEve->SpawnNewScene("RhoZ Geometry",
+ "Scene holding projected geometry for the RhoZ view.");
+ fRPhiEventScene = gEve->SpawnNewScene("RPhi Event Data",
+ "Scene holding projected event-data for the RPhi view.");
+ fRhoZEventScene = gEve->SpawnNewScene("RhoZ Event Data",
+ "Scene holding projected event-data for the RhoZ view.");
+
+
+ // Projection managers
+ //=====================
+
+ fRPhiMgr = new TEveProjectionManager();
+ fRPhiMgr->SetProjection(TEveProjection::kPT_RPhi);
+ gEve->AddToListTree(fRPhiMgr, kFALSE);
+ {
+ TEveProjectionAxes* a = new TEveProjectionAxes(fRPhiMgr);
+ a->SetMainColor(kWhite);
+ a->SetTitle("R-Phi");
+ a->SetTitleSize(0.05);
+ a->SetTitleFont(102);
+ a->SetLabelSize(0.025);
+ a->SetLabelFont(102);
+ fRPhiGeomScene->AddElement(a);
+ }
+
+ fRhoZMgr = new TEveProjectionManager();
+ fRhoZMgr->SetProjection(TEveProjection::kPT_RhoZ);
+ gEve->AddToListTree(fRhoZMgr, kFALSE);
+ {
+ TEveProjectionAxes* a = new TEveProjectionAxes(fRhoZMgr);
+ a->SetMainColor(kWhite);
+ a->SetTitle("Rho-Z");
+ a->SetTitleSize(0.05);
+ a->SetTitleFont(102);
+ a->SetLabelSize(0.025);
+ a->SetLabelFont(102);
+ fRhoZGeomScene->AddElement(a);
+ }
+
+
+ // Viewers
+ //=========
+
+ TEveWindowSlot *slot = 0;
+ TEveWindowPack *pack = 0;
+
+ slot = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
+ pack = slot->MakePack();
+ pack->SetElementName("Multi View");
+ pack->SetHorizontal();
+ pack->SetShowTitleBar(kFALSE);
+ pack->NewSlot()->MakeCurrent();
+ f3DView = gEve->SpawnNewViewer("3D View", "");
+ f3DView->AddScene(gEve->GetGlobalScene());
+ f3DView->AddScene(gEve->GetEventScene());
+
+ pack = pack->NewSlot()->MakePack();
+ pack->SetShowTitleBar(kFALSE);
+ pack->NewSlot()->MakeCurrent();
+ fRPhiView = gEve->SpawnNewViewer("RPhi View", "");
+ fRPhiView->GetGLViewer()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
+ fRPhiView->AddScene(fRPhiGeomScene);
+ fRPhiView->AddScene(fRPhiEventScene);
+
+ pack->NewSlot()->MakeCurrent();
+ fRhoZView = gEve->SpawnNewViewer("RhoZ View", "");
+ fRhoZView->GetGLViewer()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
+ fRhoZView->AddScene(fRhoZGeomScene);
+ fRhoZView->AddScene(fRhoZEventScene);
+ }
+
+ //-------------------------------------------------------------------------
+
+ void InitGeomGentle(TEveGeoShape* g3d, TEveGeoShape* grphi, TEveGeoShape* grhoz)
+ {
+ fGeomGentle = g3d;
+ fGeomGentleRPhi = grphi; fGeomGentleRPhi->IncDenyDestroy();
+ fGeomGentleRhoZ = grhoz; fGeomGentleRhoZ->IncDenyDestroy();
+
+ fRPhiMgr->SetCurrentDepth(-10);
+ ImportGeomRPhi(fGeomGentleRPhi);
+ fRPhiMgr->SetCurrentDepth(0);
+
+ fRhoZMgr->SetCurrentDepth(-10);
+ ImportGeomRhoZ(fGeomGentleRhoZ);
+ fRhoZMgr->SetCurrentDepth(0);
+ }
+
+ void InitGeomGentleTrd(TEveGeoShape* gtrd)
+ {
+ fGeomGentleTrd = gtrd;
+ ImportGeomRPhi(fGeomGentleTrd);
+ ImportGeomRhoZ(fGeomGentleTrd);
+ }
+
+ void InitGeomGentleMuon(TEveGeoShape* gmuon, Bool_t showRPhi, Bool_t showRhoZ)
+ {
+ fGeomGentleMuon = gmuon;
+ if (showRPhi) ImportGeomRPhi(fGeomGentleMuon);
+ if (showRhoZ) ImportGeomRhoZ(fGeomGentleMuon);
+ }
+
+ //-------------------------------------------------------------------------
+
+ void ImportGeomRPhi(TEveElement* el)
+ {
+ fRPhiMgr->ImportElements(el, fRPhiGeomScene);
+ }
+
+ void ImportGeomRhoZ(TEveElement* el)
+ {
+ fRhoZMgr->ImportElements(el, fRhoZGeomScene);
+ }
+
+ void ImportEventRPhi(TEveElement* el)
+ {
+ fRPhiMgr->ImportElements(el, fRPhiEventScene);
+ }
+
+ void ImportEventRhoZ(TEveElement* el)
+ {
+ fRhoZMgr->ImportElements(el, fRhoZEventScene);
+ }
+
+ void DestroyEventRPhi()
+ {
+ fRPhiEventScene->DestroyElements();
+ }
+
+ void DestroyEventRhoZ()
+ {
+ fRhoZEventScene->DestroyElements();
+ }
+
+ void SetCenterRPhi(Double_t x, Double_t y, Double_t z)
+ {
+ fRPhiMgr->SetCenter(x, y, z);
+ }
+
+ void SetCenterRhoZ(Double_t x, Double_t y, Double_t z)
+ {
+ fRhoZMgr->SetCenter(x, y, z);
+ }
+};
+
+MultiView *gMultiView = 0;