]>
Commit | Line | Data |
---|---|---|
d810d0de | 1 | // $Id$ |
2 | // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007 | |
82b3616d | 3 | |
d810d0de | 4 | /************************************************************************** |
5 | * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. * | |
6 | * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for * | |
51346b82 | 7 | * full copyright notice. * |
d810d0de | 8 | **************************************************************************/ |
9 | ||
10 | #include "AliEveITSModuleStepper.h" | |
11 | #include "AliEveITSDigitsInfo.h" | |
12 | #include "AliEveITSScaledModule.h" | |
82b3616d | 13 | |
84aff7a4 | 14 | #include <TEveManager.h> |
15 | #include <TEveGedEditor.h> | |
16 | #include <TEveGridStepper.h> | |
84aff7a4 | 17 | #include <TEveTrans.h> |
09edeb17 | 18 | |
32e219c2 | 19 | #include <TGLRnrCtx.h> |
c87a8d78 | 20 | #include <TGLIncludes.h> |
32e219c2 | 21 | #include <TGLSelectRecord.h> |
a15e6d7d | 22 | #include <TGLUtil.h> |
32e219c2 | 23 | #include <TGLViewer.h> |
c87a8d78 | 24 | #include <TGLAxis.h> |
d810d0de | 25 | |
c87a8d78 | 26 | #include <TMath.h> |
27 | #include <THLimitsFinder.h> | |
28 | #include <TVirtualPad.h> | |
82b3616d | 29 | |
a3d4f532 | 30 | #include <RVersion.h> |
31 | ||
57ffa5fb | 32 | //______________________________________________________________________________ |
82b3616d | 33 | // |
698e2c9b | 34 | // Display scaled ITS modules in a paged layout, also providing |
35 | // GL-overaly control GUI. | |
36 | ||
82b3616d | 37 | |
d810d0de | 38 | ClassImp(AliEveITSModuleStepper) |
82b3616d | 39 | |
d810d0de | 40 | AliEveITSModuleStepper::AliEveITSModuleStepper(AliEveITSDigitsInfo* di) : |
41 | TEveElementList("ITS 2DStore", "AliEveITSModuleStepper", kTRUE), | |
32e219c2 | 42 | |
32e219c2 | 43 | fDigitsInfo(di), |
44 | fScaleInfo(0), | |
c87a8d78 | 45 | fStepper(0), |
32e219c2 | 46 | |
c87a8d78 | 47 | fModuleIDs(), |
48 | fPosition(0), | |
32e219c2 | 49 | fSubDet(-1), |
09edeb17 | 50 | |
9af86b69 | 51 | fModuleFont(), fTextFont(), fSymbolFont(), |
32e219c2 | 52 | fAxis(0), |
c87a8d78 | 53 | |
54 | fMenuHeight(0.13), | |
55 | fTextSize(64), | |
56 | fTextCol(kGray+1), | |
57 | fActiveCol(kRed-4), | |
58 | ||
59 | fActiveID(-1) | |
82b3616d | 60 | { |
698e2c9b | 61 | // Constructor. |
62 | ||
c87a8d78 | 63 | SetMainColorPtr(&fTextCol); |
64 | fAxis = new TGLAxis(); | |
65 | ||
84aff7a4 | 66 | // override member from base TEveElementList |
d810d0de | 67 | fChildClass = AliEveITSScaledModule::Class(); |
32e219c2 | 68 | |
32e219c2 | 69 | fDigitsInfo->IncRefCount(); |
70 | ||
84aff7a4 | 71 | fStepper = new TEveGridStepper(); |
32e219c2 | 72 | fStepper->SetNs(5, 4); |
73 | ||
d810d0de | 74 | fScaleInfo = new AliEveDigitScaleInfo(); |
32e219c2 | 75 | fScaleInfo->IncRefCount(); |
64c42545 | 76 | |
68ca2fe7 | 77 | gEve->GetDefaultGLViewer()->AddOverlayElement(this); |
82b3616d | 78 | } |
79 | ||
d810d0de | 80 | AliEveITSModuleStepper::~AliEveITSModuleStepper() |
82b3616d | 81 | { |
698e2c9b | 82 | // Destructor. |
83 | ||
68ca2fe7 | 84 | gEve->GetDefaultGLViewer()->RemoveOverlayElement(this); |
32e219c2 | 85 | |
c87a8d78 | 86 | fScaleInfo->DecRefCount(); |
32e219c2 | 87 | fDigitsInfo->DecRefCount(); |
88 | ||
82b3616d | 89 | delete fStepper; |
32e219c2 | 90 | delete fAxis; |
82b3616d | 91 | } |
92 | ||
57ffa5fb | 93 | /******************************************************************************/ |
d7e36bcf | 94 | |
d810d0de | 95 | void AliEveITSModuleStepper::Capacity() |
82b3616d | 96 | { |
698e2c9b | 97 | // Make sure we have just enough children (module representations) |
98 | // to store as many modules as required by the grid-stepper | |
99 | // configuration. | |
100 | ||
a15e6d7d | 101 | Int_t n = fStepper->GetNx()*fStepper->GetNy(); |
fbc350a3 | 102 | if (n != NumChildren()) |
82b3616d | 103 | { |
32e219c2 | 104 | DestroyElements(); |
a15e6d7d | 105 | for (Int_t m=0; m<n; ++m) |
32e219c2 | 106 | { |
d810d0de | 107 | AddElement(new AliEveITSScaledModule(m, fDigitsInfo, fScaleInfo)); |
32e219c2 | 108 | } |
82b3616d | 109 | } |
82b3616d | 110 | } |
111 | ||
57ffa5fb | 112 | /******************************************************************************/ |
d7e36bcf | 113 | |
d810d0de | 114 | void AliEveITSModuleStepper::SetFirst(Int_t first) |
09edeb17 | 115 | { |
c87a8d78 | 116 | // Se module ID which apply to first item in stepper. |
117 | ||
118 | Int_t lastpage = fModuleIDs.size()/Nxy(); | |
ba5a649d | 119 | if (fModuleIDs.size() % Nxy() ) lastpage++; |
51346b82 | 120 | |
698e2c9b | 121 | Int_t firstLastpage = (lastpage - 1)*Nxy(); |
ba5a649d | 122 | if (first > firstLastpage) first = firstLastpage; |
123 | if (first < 0) first = 0; | |
09edeb17 | 124 | fPosition = first; |
09edeb17 | 125 | Apply(); |
126 | } | |
127 | ||
d810d0de | 128 | void AliEveITSModuleStepper::Start() |
82b3616d | 129 | { |
698e2c9b | 130 | // Go to first page. |
131 | ||
09edeb17 | 132 | fPosition = 0; |
82b3616d | 133 | Apply(); |
134 | } | |
135 | ||
d810d0de | 136 | void AliEveITSModuleStepper::Next() |
82b3616d | 137 | { |
698e2c9b | 138 | // Go to next page. |
139 | ||
32e219c2 | 140 | SetFirst(fPosition + Nxy()); |
09edeb17 | 141 | } |
142 | ||
d810d0de | 143 | void AliEveITSModuleStepper::Previous() |
09edeb17 | 144 | { |
698e2c9b | 145 | // Go to previous page. |
146 | ||
32e219c2 | 147 | SetFirst(fPosition - Nxy()); |
09edeb17 | 148 | } |
149 | ||
d810d0de | 150 | void AliEveITSModuleStepper::End() |
51346b82 | 151 | { |
698e2c9b | 152 | // Go to last page. |
153 | ||
c87a8d78 | 154 | Int_t lastpage = fModuleIDs.size()/Nxy(); |
155 | if (fModuleIDs.size() % Nxy()) lastpage++; | |
698e2c9b | 156 | fPosition = (lastpage - 1)*Nxy(); |
09edeb17 | 157 | |
51346b82 | 158 | fStepper->Reset(); |
82b3616d | 159 | Apply(); |
160 | } | |
161 | ||
57ffa5fb | 162 | /******************************************************************************/ |
d7e36bcf | 163 | |
d810d0de | 164 | void AliEveITSModuleStepper::DisplayDet(Int_t det, Int_t layer) |
32e219c2 | 165 | { |
c87a8d78 | 166 | // Select modules to display by sub-det type / layer. |
698e2c9b | 167 | |
32e219c2 | 168 | fSubDet = det; |
c87a8d78 | 169 | fModuleIDs.clear(); |
d810d0de | 170 | AliEveITSModuleSelection sel = AliEveITSModuleSelection(); |
51346b82 | 171 | sel.SetType (det); |
172 | sel.SetLayer(layer); | |
c87a8d78 | 173 | fDigitsInfo->GetModuleIDs(&sel, fModuleIDs); |
32e219c2 | 174 | //in reder menu define a space between left and right pager |
32e219c2 | 175 | Start(); |
176 | } | |
177 | ||
57ffa5fb | 178 | /******************************************************************************/ |
32e219c2 | 179 | |
a15e6d7d | 180 | Int_t AliEveITSModuleStepper::GetCurrentPage() const |
32e219c2 | 181 | { |
698e2c9b | 182 | // Get number of current page. |
183 | ||
184 | Int_t idx = fPosition + 1; | |
185 | Int_t n = idx/Nxy(); | |
186 | if (idx % Nxy()) n++; | |
32e219c2 | 187 | return n; |
188 | } | |
189 | ||
57ffa5fb | 190 | /******************************************************************************/ |
32e219c2 | 191 | |
d810d0de | 192 | Int_t AliEveITSModuleStepper::GetPages() |
32e219c2 | 193 | { |
698e2c9b | 194 | // Get number of all pages. |
195 | ||
c87a8d78 | 196 | Int_t n = fModuleIDs.size()/Nxy(); |
ba5a649d | 197 | if (fModuleIDs.size() % Nxy()) n++; |
32e219c2 | 198 | return n; |
199 | } | |
51346b82 | 200 | |
57ffa5fb | 201 | /******************************************************************************/ |
32e219c2 | 202 | |
d810d0de | 203 | void AliEveITSModuleStepper::Apply() |
82b3616d | 204 | { |
698e2c9b | 205 | // Apply current settings to children modules. |
206 | ||
84aff7a4 | 207 | gEve->DisableRedraw(); |
32e219c2 | 208 | Capacity(); |
09edeb17 | 209 | |
210 | UInt_t idx = fPosition; | |
32e219c2 | 211 | for(List_i childit=fChildren.begin(); childit!=fChildren.end(); ++childit) |
82b3616d | 212 | { |
ba5a649d | 213 | if (idx < fModuleIDs.size()) |
82b3616d | 214 | { |
d810d0de | 215 | AliEveITSScaledModule* mod = dynamic_cast<AliEveITSScaledModule*>(*childit); |
c87a8d78 | 216 | mod->SetID(fModuleIDs[idx], kFALSE); |
a15e6d7d | 217 | TEveTrans& tr = mod->RefMainTrans(); |
32e219c2 | 218 | tr.UnitTrans(); |
219 | tr.RotateLF(3,2,TMath::PiOver2()); | |
51346b82 | 220 | tr.RotateLF(1,3,TMath::PiOver2()); |
82b3616d | 221 | |
51346b82 | 222 | // scaling |
32e219c2 | 223 | Float_t mz, mx; |
d7e36bcf | 224 | Float_t* fp = mod->GetFrame()->GetFramePoints(); |
225 | // switch x,z it will be rotated afterwards | |
32e219c2 | 226 | mx = -2*fp[0]; |
227 | mz = -2*fp[2]; | |
d7e36bcf | 228 | |
32e219c2 | 229 | // fit width first |
84aff7a4 | 230 | Double_t sx = fStepper->GetDx(); |
231 | Double_t sy = (mx*fStepper->GetDx())/mz; | |
ba5a649d | 232 | if (sy > fStepper->GetDy()) |
82b3616d | 233 | { |
84aff7a4 | 234 | sy = fStepper->GetDy(); |
235 | sx = (mz*fStepper->GetDx())/mx; | |
82b3616d | 236 | } |
c87a8d78 | 237 | Float_t scale = (0.85*sx)/mz; |
32e219c2 | 238 | tr.Scale(scale, scale, scale); |
64c42545 | 239 | |
32e219c2 | 240 | Float_t p[3]; |
241 | fStepper->GetPosition(p); | |
84aff7a4 | 242 | tr.SetPos(p[0]+0.5*fStepper->GetDx(), p[1]+0.5*fStepper->GetDy(), p[2]+0.5*fStepper->GetDz()); |
51346b82 | 243 | |
ba5a649d | 244 | if (mod->GetSubDetID() == 2) |
b3ffcccb | 245 | mod->SetName(Form("SSD %d", idx)); |
ba5a649d | 246 | else if (mod->GetSubDetID() == 1) |
b3ffcccb | 247 | mod->SetName(Form("SDD %d", idx)); |
d7e36bcf | 248 | else |
b3ffcccb | 249 | mod->SetName(Form("SPD %d", idx)); |
32e219c2 | 250 | mod->SetRnrSelf(kTRUE); |
d7e36bcf | 251 | |
09edeb17 | 252 | fStepper->Step(); |
253 | idx++; | |
82b3616d | 254 | } |
255 | else { | |
256 | (*childit)->SetRnrSelf(kFALSE); | |
257 | } | |
258 | } | |
09edeb17 | 259 | |
32e219c2 | 260 | fStepper->Reset(); |
261 | ElementChanged(); | |
84aff7a4 | 262 | gEve->EnableRedraw(); |
82b3616d | 263 | } |
09edeb17 | 264 | |
32e219c2 | 265 | |
57ffa5fb | 266 | /******************************************************************************/ |
32e219c2 | 267 | // Virtual event handlers from TGLOverlayElement |
57ffa5fb | 268 | /******************************************************************************/ |
09edeb17 | 269 | |
57ffa5fb | 270 | //______________________________________________________________________________ |
d810d0de | 271 | Bool_t AliEveITSModuleStepper::Handle(TGLRnrCtx & /*rnrCtx*/, |
698e2c9b | 272 | TGLOvlSelectRecord & rec, |
273 | Event_t * event) | |
09edeb17 | 274 | { |
32e219c2 | 275 | // Handle overlay event. |
276 | // Return TRUE if event was handled. | |
277 | ||
278 | switch (event->fType) | |
51346b82 | 279 | { |
32e219c2 | 280 | case kMotionNotify: |
281 | { | |
282 | Int_t item = rec.GetN() < 2 ? -1 : (Int_t)rec.GetItem(1); | |
c87a8d78 | 283 | if (fActiveID != item) { |
284 | fActiveID = item; | |
32e219c2 | 285 | return kTRUE; |
286 | } else { | |
287 | return kFALSE; | |
288 | } | |
289 | break; | |
290 | } | |
291 | case kButtonPress: | |
292 | { | |
293 | if (event->fCode != kButton1) { | |
294 | return kFALSE; | |
295 | } | |
296 | switch (rec.GetItem(1)) | |
297 | { | |
298 | case 1: | |
299 | Previous(); | |
300 | break; | |
301 | case 2: | |
302 | Start(); | |
303 | break; | |
304 | case 3: | |
305 | Next(); | |
306 | break; | |
307 | case 4: | |
308 | End(); | |
309 | break; | |
310 | case 5: | |
311 | { | |
d810d0de | 312 | AliEveDigitScaleInfo* si = fScaleInfo; |
ba5a649d | 313 | if (si->GetScale() < 5) |
32e219c2 | 314 | { |
51346b82 | 315 | si->ScaleChanged(si->GetScale() + 1); |
32e219c2 | 316 | ElementChanged(kTRUE, kTRUE); |
317 | } | |
318 | break; | |
319 | } | |
320 | case 6: | |
321 | { | |
d810d0de | 322 | AliEveDigitScaleInfo* si = fScaleInfo; |
ba5a649d | 323 | if (si->GetScale() > 1) |
32e219c2 | 324 | { |
51346b82 | 325 | si->ScaleChanged(si->GetScale() - 1); |
32e219c2 | 326 | ElementChanged(kTRUE, kTRUE); |
327 | } | |
328 | break; | |
329 | } | |
330 | case 7: | |
84aff7a4 | 331 | gEve->GetEditor()->DisplayElement(*BeginChildren()); |
32e219c2 | 332 | break; |
333 | ||
334 | case 8: | |
c87a8d78 | 335 | DisplayDet(0, -1); |
32e219c2 | 336 | break; |
51346b82 | 337 | case 9: |
c87a8d78 | 338 | DisplayDet(1, -1); |
32e219c2 | 339 | break; |
51346b82 | 340 | case 10: |
c87a8d78 | 341 | DisplayDet(2, -1); |
32e219c2 | 342 | break; |
343 | default: | |
344 | break; | |
345 | } | |
346 | return kTRUE; | |
347 | break; | |
348 | } | |
349 | default: | |
350 | break; | |
351 | } // end switch | |
352 | return kFALSE; | |
09edeb17 | 353 | } |
32e219c2 | 354 | |
57ffa5fb | 355 | //______________________________________________________________________________ |
d810d0de | 356 | Bool_t AliEveITSModuleStepper::MouseEnter(TGLOvlSelectRecord& /*rec*/) |
32e219c2 | 357 | { |
698e2c9b | 358 | // Mouse has entered overlay area. |
359 | ||
32e219c2 | 360 | return kTRUE; |
361 | } | |
362 | ||
57ffa5fb | 363 | //______________________________________________________________________________ |
d810d0de | 364 | void AliEveITSModuleStepper::MouseLeave() |
32e219c2 | 365 | { |
698e2c9b | 366 | // Mouse has left overlay area. |
32e219c2 | 367 | |
c87a8d78 | 368 | fActiveID = -1; |
369 | } | |
370 | ||
371 | ||
372 | /******************************************************************************/ | |
373 | // Protected sub-renderers | |
374 | /******************************************************************************/ | |
375 | ||
376 | //______________________________________________________________________________ | |
ba5a649d | 377 | void AliEveITSModuleStepper::RenderText(const char* txt, Int_t id, const TGLFont &font, Float_t step) |
c87a8d78 | 378 | { |
379 | // Render text for button id. | |
380 | ||
381 | Float_t llx, lly, llz, urx, ury, urz; | |
c87a8d78 | 382 | font.BBox(txt, llx, lly, llz, urx, ury, urz); |
ba5a649d | 383 | (fActiveID == id && id > 0) ? TGLUtil::Color(fActiveCol) :TGLUtil::Color(fTextCol); |
384 | ||
385 | if (step > 0) | |
386 | { | |
387 | // center text in the step interval | |
388 | glPushMatrix(); | |
389 | if (step>urx) | |
390 | glTranslatef((step-urx+llx)*0.5f-llx, 0, 0); | |
391 | glLoadName(id); | |
392 | font.Render(txt); | |
393 | glPopMatrix(); | |
394 | glTranslatef(step, 0, 0); | |
395 | } | |
396 | else | |
397 | { | |
398 | glLoadName(id); | |
399 | glPushMatrix(); | |
400 | font.Render(txt); | |
401 | glPopMatrix(); | |
402 | glTranslatef(urx, 0, 0); | |
403 | } | |
c87a8d78 | 404 | } |
405 | ||
406 | //______________________________________________________________________________ | |
407 | void AliEveITSModuleStepper::RenderPalette(TEveRGBAPalette* p) | |
408 | { | |
409 | // Render color palette with number axis. | |
410 | ||
411 | Float_t length = 7*fTextSize; | |
412 | Float_t x = 1.5*fTextSize; | |
413 | Float_t y = 0.2*fTextSize; | |
414 | ||
415 | glTranslatef(x, 0.8*fTextSize, 0); | |
416 | ||
417 | TGLCapabilitySwitch lights_off(GL_LIGHTING, kFALSE); | |
418 | ||
419 | glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT); | |
420 | glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | |
421 | glDisable(GL_CULL_FACE); | |
422 | glEnable(GL_BLEND); | |
423 | glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); | |
424 | ||
425 | glBegin(GL_QUAD_STRIP); | |
426 | TGLUtil::Color4ubv(p->ColorFromValue(p->GetMinVal())); | |
427 | glVertex2f(0, 0); | |
428 | glVertex2f(0, y); | |
429 | if (p->GetMaxVal() > p->GetMinVal() + 1) | |
430 | { | |
431 | Float_t xs = length/(p->GetMaxVal() - p->GetMinVal()); | |
432 | Float_t x0 = xs; | |
433 | for(Int_t i=p->GetMinVal() + 1; i<p->GetMaxVal(); i++) | |
434 | { | |
435 | TGLUtil::Color4ubv(p->ColorFromValue(i)); | |
436 | glVertex2f(x0, 0); | |
437 | glVertex2f(x0, y); | |
438 | x0+=xs; | |
439 | } | |
440 | } | |
441 | TGLUtil::Color4ubv(p->ColorFromValue(p->GetMaxVal())); | |
442 | glVertex2f(length, 0); | |
443 | glVertex2f(length, y); | |
444 | glEnd(); | |
445 | ||
ba5a649d | 446 | glRotatef(-90, 1, 0, 0 ); |
c87a8d78 | 447 | Double_t v1[3] = {0., 0., 0.}; |
448 | Double_t v2[3] = {length, 0, 0.}; | |
ba5a649d | 449 | fAxis->SetTextColor(kGray+1); |
450 | fAxis->SetLineColor(kGray+1); | |
c87a8d78 | 451 | fAxis->PaintGLAxis(v1, v2, p->GetMinVal(), p->GetMaxVal(), 5); |
452 | glPopAttrib(); | |
453 | } | |
454 | ||
455 | //______________________________________________________________________________ | |
456 | void AliEveITSModuleStepper::RenderMenu(Int_t curP, Int_t maxP, Int_t scaleX, Int_t scaleZ) | |
457 | { | |
458 | // Make UI to set page in stepper and UI to scale in the AliEveITSScaledModule. | |
459 | ||
460 | TGLUtil::Color(fTextCol); | |
461 | fTextFont.PreRender(); | |
462 | glTranslatef(0, fTextSize*0.3, 0); | |
ba5a649d | 463 | { |
464 | // pager | |
465 | glTranslatef(fTextSize*0.2, 0 , 0); | |
466 | RenderText("9", 2, fSymbolFont); // last page | |
467 | RenderText("3", 1, fSymbolFont);//last page | |
468 | RenderText(Form("%d/%d", curP, maxP),-1, fTextFont, 2.7*fTextSize); //status | |
469 | { | |
470 | // bugg in webdings font , bbox does not give realistic value | |
471 | Float_t llx, lly, llz, urx, ury, urz; | |
472 | fSymbolFont.BBox("4", llx, lly, llz, urx, ury, urz); | |
473 | glTranslatef(-llx, 0, 0); | |
474 | } | |
475 | RenderText("4", 3, fSymbolFont); // next page | |
476 | RenderText(":",4, fSymbolFont); // last page | |
477 | } | |
478 | { | |
479 | // scale | |
480 | glTranslatef(fTextSize,0, 0); | |
481 | RenderText(Form("Zoom:"), -1, fTextFont); | |
482 | RenderText("6", 6, fSymbolFont); | |
483 | RenderText("5", 5, fSymbolFont); | |
484 | RenderText(Form("%dx%d", scaleX, scaleZ), -1, fTextFont, 2*fTextSize); | |
485 | } | |
486 | { | |
487 | // detectors | |
488 | glTranslatef(fTextSize, 0, 0); | |
489 | RenderText("SPD ", 8, fTextFont); | |
490 | RenderText("SDD ", 9, fTextFont); | |
491 | RenderText("SSD ", 10, fTextFont); | |
492 | fTextFont.PostRender(); | |
493 | } | |
c87a8d78 | 494 | } |
495 | ||
496 | //______________________________________________________________________________ | |
497 | void AliEveITSModuleStepper::RenderModuleIDs() | |
498 | { | |
499 | // Render module-ids. | |
500 | ||
501 | Double_t x, y, z; | |
502 | UInt_t idx = fPosition; | |
503 | Float_t llx, lly, llz, urx, ury, urz; | |
504 | fModuleFont.PreRender(); | |
505 | TGLUtil::Color(kWhite); | |
506 | for (List_i childit=fChildren.begin(); childit!=fChildren.end(); ++childit) | |
507 | { | |
ba5a649d | 508 | if (idx < fModuleIDs.size()) |
c87a8d78 | 509 | { |
510 | AliEveITSScaledModule* mod = dynamic_cast<AliEveITSScaledModule*>(*childit); | |
511 | TEveTrans& tr = mod->RefMainTrans(); | |
512 | tr.GetPos(x,y,z); | |
513 | x += fStepper->GetDx()*0.5; | |
514 | y -= fStepper->GetDy()*0.5; | |
515 | z += 0.4; // !!! MT hack - cross check with overlay rendering. | |
516 | const char* txt = Form("%d",mod->GetID()); | |
517 | fModuleFont.BBox(txt, llx, lly, llz, urx, ury, urz); | |
518 | glRasterPos3f(x, y, z); | |
519 | glBitmap(0, 0, 0, 0,-urx, 0, 0); | |
520 | fModuleFont.Render(txt); | |
521 | idx++; | |
522 | } | |
523 | } | |
524 | fModuleFont.PostRender(); | |
525 | } | |
526 | ||
527 | /******************************************************************************/ | |
528 | ||
529 | void AliEveITSModuleStepper::Render(TGLRnrCtx& rnrCtx) | |
530 | { | |
531 | // Render the overlay elements. | |
532 | ||
533 | AliEveITSScaledModule* sm = dynamic_cast<AliEveITSScaledModule*>(*BeginChildren()); | |
9af86b69 | 534 | Int_t scaleIdx = fScaleInfo->GetScale() - 1; |
c87a8d78 | 535 | Int_t cnx = 0, cnz = 0; |
536 | switch(sm->GetSubDetID()) | |
537 | { | |
538 | case 0: | |
9af86b69 | 539 | cnx = fDigitsInfo->fSPDScaleX[scaleIdx]; |
540 | cnz = fDigitsInfo->fSPDScaleZ[scaleIdx]; | |
c87a8d78 | 541 | break; |
542 | case 1: | |
9af86b69 | 543 | cnx = fDigitsInfo->fSDDScaleX[scaleIdx]; |
544 | cnz = fDigitsInfo->fSDDScaleZ[scaleIdx]; | |
c87a8d78 | 545 | break; |
546 | case 2: | |
9af86b69 | 547 | cnx = fDigitsInfo->fSSDScale[scaleIdx]; |
548 | cnz = 1; | |
c87a8d78 | 549 | break; |
550 | } | |
551 | ||
552 | // init fonts | |
ba5a649d | 553 | if (fTextFont.GetMode() == TGLFont::kUndef) |
c87a8d78 | 554 | { |
a3d4f532 | 555 | #if ROOT_VERSION_CODE >= 332547 |
556 | rnrCtx.RegisterFont(fTextSize, 4, TGLFont::kTexture, fTextFont); | |
557 | rnrCtx.RegisterFont(72, 31, TGLFont::kTexture, fSymbolFont); | |
558 | rnrCtx.RegisterFont(14, 4, TGLFont::kPixmap, fModuleFont); | |
559 | #else | |
75522c26 | 560 | fTextFont = rnrCtx.GetFont(fTextSize, 4, TGLFont::kTexture); |
561 | fSymbolFont = rnrCtx.GetFont(72, 31, TGLFont::kTexture); | |
562 | fModuleFont = rnrCtx.GetFont(14, 4, TGLFont::kPixmap); | |
a3d4f532 | 563 | #endif |
c87a8d78 | 564 | } |
565 | ||
566 | { | |
567 | // toolbar | |
568 | glMatrixMode(GL_PROJECTION); | |
569 | glPushMatrix(); | |
570 | glLoadIdentity(); | |
571 | if (rnrCtx.Selection()) | |
572 | { | |
573 | TGLRect rect(*rnrCtx.GetPickRectangle()); | |
574 | rnrCtx.GetCamera()->WindowToViewport(rect); | |
575 | gluPickMatrix(rect.X(), rect.Y(), rect.Width(), rect.Height(), | |
576 | (Int_t*) rnrCtx.GetCamera()->RefViewport().CArr()); | |
577 | } | |
578 | glMatrixMode(GL_MODELVIEW); | |
579 | glPushMatrix(); | |
580 | glLoadIdentity(); | |
581 | glTranslatef(-1, -1, 0); // translate to lower left corner | |
9af86b69 | 582 | Float_t txtScale = fMenuHeight/fTextSize*0.5; // scale text |
583 | glScalef(txtScale, txtScale, 1.); | |
c87a8d78 | 584 | |
585 | //menu | |
586 | glPushName(0); | |
587 | RenderMenu(GetCurrentPage(), GetPages(), cnx, cnz); | |
588 | glPopName(); | |
589 | //palette | |
9af86b69 | 590 | Double_t labelSize = 1.6*txtScale*fTextSize; |
591 | fAxis->SetLabelsSize(labelSize); | |
592 | fAxis->SetLabelsOffset(1.2*labelSize); | |
c87a8d78 | 593 | RenderPalette(sm->GetPalette()); |
594 | ||
595 | glPopMatrix(); | |
596 | glMatrixMode(GL_PROJECTION); | |
597 | glPopMatrix(); | |
598 | glMatrixMode(GL_MODELVIEW); | |
599 | } | |
600 | RenderModuleIDs(); | |
51346b82 | 601 | } |