36 ClassImp(TEveLegoEventHandler);
41 TEveLegoEventHandler::TEveLegoEventHandler(TGWindow *w, TObject *obj, TEveCaloLego *lego):
42 TGLEventHandler(w, obj),
56 Bool_t TEveLegoEventHandler::HandleKey(Event_t *event)
58 if (event->fCode == kKey_Home)
61 return TGLEventHandler::HandleKey(event);
69 Bool_t TEveLegoEventHandler::Rotate(Int_t xDelta, Int_t yDelta, Bool_t mod1, Bool_t mod2)
71 if ( !fLego )
return TGLEventHandler::Rotate(xDelta, yDelta, mod1, mod2);
73 TGLCamera &cam = fGLViewer->GetRnrCtx()->RefCamera();
74 Double_t hRotate = cam.AdjustDelta(-yDelta, TMath::Pi()/cam.RefViewport().Height(), mod1, mod2);
77 Float_t *bb = fLego->AssertBBox();
79 box.SetAligned(TGLVertex3(bb[0], bb[2], bb[4]), TGLVertex3(bb[1], bb[3], bb[5]));
80 box.Transform(fLego->RefMainTrans().Array());
82 Bool_t camChanged = kFALSE;
84 if (cam.IsOrthographic())
87 if (fTheta < 0) fTheta = 0;
88 if (fTheta > fTransTheta)
90 TGLCamera* ortho = &cam;
91 Double_t l = -ortho->FrustumPlane(TGLCamera::kLeft).D();
92 Double_t r = ortho->FrustumPlane(TGLCamera::kRight).D();
93 Double_t t = ortho->FrustumPlane(TGLCamera::kTop).D();
94 Double_t b = -ortho->FrustumPlane(TGLCamera::kBottom).D();
96 fGLViewer->SetCurrentCamera(TGLViewer::kCameraPerspXOY);
97 TGLPerspectiveCamera* persp =
dynamic_cast<TGLPerspectiveCamera*
>(&fGLViewer->GetRnrCtx()->RefCamera());
98 persp->Setup(box, kTRUE);
100 TGLVector3 extents = box.Extents();
102 TMath::Sort(3, extents.CArr(), sortInd);
103 Double_t size = TMath::Hypot(extents[sortInd[0]], extents[sortInd[1]]);
104 Double_t dolly = size / (2.0*TMath::Tan(30*TMath::Pi()/360));
105 Double_t fov = TMath::ATan(TMath::Hypot(t-b, r-l)/(2*dolly));
107 persp->SetCenterVecWarp(0.5*(l+r), 0.5*(t+b), 0);
109 Double_t vR = -0.5 * TMath::Pi();
110 Double_t hR = -0.5 * TMath::Pi() + fTransTheta;
111 persp->Configure(fov*TMath::RadToDeg(), 0, 0, hR, vR);
119 Double_t theta = cam.GetTheta();
120 Double_t thetaN = theta + hRotate;
121 if (thetaN > TMath::Pi() - cam.GetVAxisMinAngle()) thetaN = TMath::Pi() - cam.GetVAxisMinAngle();
122 else if (thetaN < cam.GetVAxisMinAngle()) thetaN = cam.GetVAxisMinAngle();
126 if (thetaN < fTransTheta)
128 TGLPerspectiveCamera* persp = (TGLPerspectiveCamera*)(&cam);
129 fGLViewer->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
130 TGLOrthoCamera* ortho =
dynamic_cast<TGLOrthoCamera*
>(& fGLViewer->GetRnrCtx()->RefCamera());
131 ortho->Setup(box, kTRUE);
134 const TGLMatrix& mx = cam.GetCamBase() * cam.GetCamTrans();
135 TGLVertex3 d = mx.GetTranslation();
136 TGLVertex3 p = d + mx.GetBaseVec(1);
138 const TGLPlane rp = TGLPlane(cam.GetCamBase().GetBaseVec(3), TGLVertex3());
139 std::pair<Bool_t, TGLVertex3> intersection;
140 intersection = Intersection(rp, line, kTRUE);
141 TGLVertex3 v = intersection.second;
142 ortho->Truck( v.X() - box.Center().X(), v.Y() - box.Center().Y());
145 Double_t t = persp->FrustumPlane(TGLCamera::kTop).D();
146 Double_t b = -persp->FrustumPlane(TGLCamera::kBottom).D();
147 Double_t zoom = box.Extents().Y()/(t-b);
148 ortho->Configure(zoom, 0, 0, 0, 0);
155 camChanged = fGLViewer->CurrentCamera().Rotate(xDelta, -yDelta, mod1, mod2);