File indexing completed on 2023-03-17 11:01:31
0001 #include "Fireworks/Core/interface/FWViewContextMenuHandlerGL.h"
0002
0003 #include "TClass.h"
0004 #include "TEveViewer.h"
0005 #include "TGLViewer.h"
0006 #include "TGLAnnotation.h"
0007 #include "TGLWidget.h"
0008 #include "TEveVector.h"
0009 #include "TVirtualX.h"
0010
0011 #include "Fireworks/Core/interface/FWModelId.h"
0012 #include "Fireworks/Core/interface/FWEventItem.h"
0013 #include "Fireworks/Core/interface/FWEveView.h"
0014
0015 #include "Fireworks/Core/interface/FWItemValueGetter.h"
0016 #include "Fireworks/Core/interface/FWSelectionManager.h"
0017 #include "Fireworks/Core/interface/FWEventItem.h"
0018 #include "Fireworks/Core/interface/Context.h"
0019 #include "Fireworks/Core/interface/FWRPZView.h"
0020
0021 FWViewContextMenuHandlerGL::FWViewContextMenuHandlerGL(FWEveView* v) : m_view(v) {}
0022
0023 void FWViewContextMenuHandlerGL::init(FWViewContextMenuHandlerBase::MenuEntryAdder& adder, const FWModelId& id) {
0024 adder.addEntry("Add Annotation", kAnnotate);
0025 if (FWViewType::isProjected(m_view->typeId())) {
0026 const char* p = id.item()->purpose().c_str();
0027 bool enabled = (strstr(p, "Beam Spot") || strstr(p, "Vertices"));
0028 adder.addEntry("Use As Projection Origin", kCameraCenter, enabled);
0029 adder.addEntry("Reset Projection Origin", kResetCameraCenter, enabled);
0030 } else {
0031 adder.addEntry("Set Camera Center", kCameraCenter);
0032 adder.addEntry("Reset Camera Center", kResetCameraCenter);
0033 }
0034 }
0035
0036 void FWViewContextMenuHandlerGL::select(int iEntryIndex, const FWModelId& id, int iX, int iY) {
0037 TGLViewer* v = m_view->viewerGL();
0038
0039 Window_t wdummy;
0040 Int_t x, y;
0041 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(), v->GetGLWidget()->GetId(), iX, iY, x, y, wdummy);
0042
0043 TGLVector3 pnt(x, y, 0.5 * v->GetSelRec().GetMinZ());
0044 v->CurrentCamera().WindowToViewport(pnt);
0045 pnt = v->CurrentCamera().ViewportToWorld(pnt);
0046
0047 switch (iEntryIndex) {
0048 case kAnnotate: {
0049 TGFrame* f = v->GetGLWidget();
0050 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(), f->GetId(), iX, iY, x, y, wdummy);
0051
0052 std::string name = id.item()->modelName(id.index());
0053 if (id.item()->haveInterestingValue())
0054 name += ", " + id.item()->modelInterestingValueAsString(id.index());
0055
0056 TGLAnnotation* an =
0057 new TGLAnnotation(v, name.c_str(), x * 1.f / f->GetWidth(), 1 - y * 1.f / f->GetHeight(), pnt);
0058 an->SetUseColorSet(true);
0059 an->SetTextSize(0.03);
0060 break;
0061 }
0062 case kCameraCenter: {
0063 if (FWViewType::isProjected(m_view->typeId())) {
0064 FWModelId mId = *(m_view->context().selectionManager()->selected().begin());
0065 const FWItemValueGetter& valueGetter = mId.item()->valueGetter();
0066 TEveVector center;
0067 center.fX = valueGetter.valueFor(mId.item()->modelData(mId.index()), 0);
0068 center.fY = valueGetter.valueFor(mId.item()->modelData(mId.index()), 1);
0069 center.fZ = valueGetter.valueFor(mId.item()->modelData(mId.index()), 2);
0070
0071 FWRPZView* pv = static_cast<FWRPZView*>(m_view);
0072 pv->shiftOrigin(center);
0073 } else {
0074 v->CurrentCamera().SetExternalCenter(true);
0075 v->CurrentCamera().SetCenterVec(pnt.X(), pnt.Y(), pnt.Z());
0076 v->SetDrawCameraCenter(true);
0077 }
0078 break;
0079 }
0080 case kResetCameraCenter: {
0081 if (FWViewType::isProjected(m_view->typeId())) {
0082 FWRPZView* pv = static_cast<FWRPZView*>(m_view);
0083 pv->resetOrigin();
0084 }
0085
0086 v->CurrentCamera().SetExternalCenter(false);
0087 v->SetDrawCameraCenter(false);
0088 break;
0089 }
0090 }
0091 }