45 TObjArray* TEveUtil::fgDefaultColors = 0;
54 void TEveUtil::SetupEnvironment()
56 static const TEveException eh(
"TEveUtil::SetupEnvironment");
57 static Bool_t setupDone = kFALSE;
60 Info(eh.Data(),
"has already been run.");
97 void TEveUtil::SetupGUI()
99 TEveElement::fgRnrIcons[0] = gClient->GetPicture(
"eve_rnr00_t.xpm");
100 TEveElement::fgRnrIcons[1] = gClient->GetPicture(
"eve_rnr01_t.xpm");
101 TEveElement::fgRnrIcons[2] = gClient->GetPicture(
"eve_rnr10_t.xpm");
102 TEveElement::fgRnrIcons[3] = gClient->GetPicture(
"eve_rnr11_t.xpm");
104 TEveElement::fgListTreeIcons[0] = gClient->GetPicture(
"folder_t.xpm");
105 TEveElement::fgListTreeIcons[1] = gClient->GetPicture(
"eve_viewer.xpm");
106 TEveElement::fgListTreeIcons[2] = gClient->GetPicture(
"eve_scene.xpm");
107 TEveElement::fgListTreeIcons[3] = gClient->GetPicture(
"eve_pointset.xpm");
108 TEveElement::fgListTreeIcons[4] = gClient->GetPicture(
"eve_track.xpm");
109 TEveElement::fgListTreeIcons[5] = gClient->GetPicture(
"eve_text.gif");
110 TEveElement::fgListTreeIcons[6] = gClient->GetPicture(
"eve_axes.xpm");
111 TEveElement::fgListTreeIcons[7] = gClient->GetPicture(
"ofolder_t.xpm");
112 TEveElement::fgListTreeIcons[8] = gClient->GetPicture(
"eve_line.xpm");
114 gClient->GetMimeTypeList()->AddType(
"root/tmacro",
"TEveMacro",
115 "tmacro_s.xpm",
"tmacro_t.xpm",
"");
125 void ChompTailAndDir(TString& s,
char c=
'.')
127 Ssiz_t p = s.Last(c);
131 Ssiz_t ls = s.Last(
'/');
140 Bool_t TEveUtil::CheckMacro(
const char* mac)
148 TString foo(mac); ChompTailAndDir(foo);
149 if (gROOT->GetGlobalFunction(foo.Data(), 0, kFALSE) != 0)
152 return (gROOT->GetGlobalFunction(foo.Data(), 0, kTRUE) != 0);
158 void TEveUtil::AssertMacro(
const char* mac)
160 if( CheckMacro(mac) == kFALSE) {
168 void TEveUtil::Macro(
const char* mac)
170 if (CheckMacro(mac) == kFALSE) {
171 gROOT->LoadMacro(mac);
173 TString foo(mac); ChompTailAndDir(foo); foo +=
"()";
174 gROOT->ProcessLine(foo.Data());
180 void TEveUtil::LoadMacro(
const char* mac)
182 if (CheckMacro(mac) == kFALSE) {
183 gROOT->LoadMacro(mac);
192 void TEveUtil::ColorFromIdx(Color_t ci, UChar_t col[4], Bool_t alpha)
194 TColor* c = gROOT->GetColor(ci);
197 col[0] = (UChar_t)(255*c->GetRed());
198 col[1] = (UChar_t)(255*c->GetGreen());
199 col[2] = (UChar_t)(255*c->GetBlue());
200 if (alpha) col[3] = 255;
205 col[0] = 255; col[1] = 0; col[2] = 255;
206 if (alpha) col[3] = 255;
215 void TEveUtil::ColorFromIdx(Color_t ci, UChar_t col[4], Char_t transparency)
217 UChar_t alpha = (255*(100 - transparency))/100;
219 TColor* c = gROOT->GetColor(ci);
222 col[0] = (UChar_t)(255*c->GetRed());
223 col[1] = (UChar_t)(255*c->GetGreen());
224 col[2] = (UChar_t)(255*c->GetBlue());
230 col[0] = 255; col[1] = 0; col[2] = 255; col[3] = alpha;
240 void TEveUtil::ColorFromIdx(Float_t f1, Color_t c1, Float_t f2, Color_t c2,
241 UChar_t col[4], Bool_t alpha)
243 TColor* t1 = gROOT->GetColor(c1);
244 TColor* t2 = gROOT->GetColor(c2);
246 col[0] = (UChar_t)(255*(f1*t1->GetRed() + f2*t2->GetRed()));
247 col[1] = (UChar_t)(255*(f1*t1->GetGreen() + f2*t2->GetGreen()));
248 col[2] = (UChar_t)(255*(f1*t1->GetBlue() + f2*t2->GetBlue()));
249 if (alpha) col[3] = 255;
261 Color_t* TEveUtil::FindColorVar(TObject* obj,
const char* varname)
263 static const TEveException eh(
"TEveUtil::FindColorVar");
265 Int_t off = obj->IsA()->GetDataMemberOffset(varname);
267 throw(eh +
"could not find member '" + varname +
"' in class " + obj->IsA()->GetName() +
".");
268 return (Color_t*) (((
char*)obj) + off);
280 void TEveUtil::SetColorBrightness(Float_t value, Bool_t full_redraw)
282 if (value < -2.5 || value > 2.5)
284 Error(
"TEveUtil::SetColorBrightness",
"value '%f' out of range [-0.5, 0.5].", value);
288 TObjArray *colors = (TObjArray*) gROOT->GetListOfColors();
290 if (fgDefaultColors == 0)
292 const Int_t n_col = colors->GetEntriesFast();
293 fgDefaultColors =
new TObjArray(n_col);
294 for (Int_t i = 0; i < n_col; ++i)
296 TColor* c = (TColor*) colors->At(i);
298 fgDefaultColors->AddAt(
new TColor(*c), i);
302 const Int_t n_col = fgDefaultColors->GetEntriesFast();
303 for (Int_t i = 0; i < n_col; ++i)
305 TColor* cdef = (TColor*) fgDefaultColors->At(i);
308 TColor* croot = (TColor*) colors->At(i);
311 croot =
new TColor(*cdef);
312 colors->AddAt(croot, i);
320 croot->GetRGB(r, g, b);
321 r = TMath::Power( r, (2.5 - value)/2.5);
322 g = TMath::Power(g, (2.5 - value)/2.5);
323 b = TMath::Power(b, (2.5 - value)/2.5);
325 r = TMath::Min(r, 1.0f);
326 g = TMath::Min(g, 1.0f);
327 b = TMath::Min(b, 1.0f);
329 croot->SetRGB(r, g, b);
333 delete colors->RemoveAt(i);
337 if (full_redraw && gEve != 0)
338 gEve->FullRedraw3D();
346 Bool_t TEveUtil::IsU1IntervalContainedByMinMax(Float_t minM, Float_t maxM,
347 Float_t minQ, Float_t maxQ)
349 using namespace TMath;
353 minQ += TwoPi(); maxQ += TwoPi();
355 else if (minQ > maxM)
357 minQ -= TwoPi(); maxQ -= TwoPi();
359 return minQ >= minM && maxQ <= maxM;
367 Bool_t TEveUtil::IsU1IntervalOverlappingByMinMax(Float_t minM, Float_t maxM,
368 Float_t minQ, Float_t maxQ)
370 using namespace TMath;
374 minQ += TwoPi(); maxQ += TwoPi();
376 else if (minQ > maxM)
378 minQ -= TwoPi(); maxQ -= TwoPi();
380 return maxQ >= minM && minQ <= maxM;
386 Float_t TEveUtil::GetFraction(Float_t minM, Float_t maxM, Float_t minQ, Float_t maxQ)
388 if (minQ>=minM && maxQ<=maxM)
391 else if (minQ<minM && maxQ>maxM)
392 return (maxM-minM)/(maxQ-minQ);
394 else if (minQ>=minM && maxQ>maxM)
395 return (maxM-minQ)/(maxQ-minQ);
397 else if (minQ<minM && maxQ<=maxM)
398 return (maxQ-minM)/(maxQ-minQ);
409 ClassImp(TEveException);
413 bool operator==(
const TString& t,
const std::string& s)
414 {
return (s == t.Data()); }
416 bool operator==(
const std::string& s,
const TString& t)
417 {
return (s == t.Data()); }
421 TEveException::TEveException(
const std::string& s) : TString(s.c_str())
428 TEveException operator+(
const TEveException &s1,
const std::string &s2)
429 { TEveException r(s1); r += s2;
return r; }
431 TEveException operator+(
const TEveException &s1,
const TString &s2)
432 { TEveException r(s1); r += s2;
return r; }
434 TEveException operator+(
const TEveException &s1,
const char *s2)
435 { TEveException r(s1); r += s2;
return r; }
444 ClassImp(TEvePadHolder);
449 TEvePadHolder::TEvePadHolder(Bool_t modify_update_p, TVirtualPad* new_pad, Int_t subpad) :
451 fModifyUpdateP (modify_update_p)
462 TEvePadHolder::~TEvePadHolder()
464 if (fModifyUpdateP && gPad != 0) {
478 ClassImp(TEveGeoManagerHolder);
485 TEveGeoManagerHolder::TEveGeoManagerHolder(TGeoManager* new_gmgr, Int_t n_seg) :
486 fManager (gGeoManager),
489 gGeoManager = new_gmgr;
492 gGeoIdentity = (TGeoIdentity*) gGeoManager->GetListOfMatrices()->At(0);
495 fNSegments = gGeoManager->GetNsegments();
496 gGeoManager->SetNsegments(n_seg);
508 TEveGeoManagerHolder::~TEveGeoManagerHolder()
510 if (gGeoManager && fNSegments > 2)
512 gGeoManager->SetNsegments(fNSegments);
514 gGeoManager = fManager;
517 gGeoIdentity = (TGeoIdentity*) gGeoManager->GetListOfMatrices()->At(0);
531 ClassImp(TEveRefCnt);
539 ClassImp(TEveRefBackPtr);
544 TEveRefBackPtr::TEveRefBackPtr() :
553 TEveRefBackPtr::~TEveRefBackPtr()
562 TEveRefBackPtr::TEveRefBackPtr(
const TEveRefBackPtr&) :
573 TEveRefBackPtr& TEveRefBackPtr::operator=(
const TEveRefBackPtr&)
581 void TEveRefBackPtr::IncRefCount(TEveElement* re)
583 TEveRefCnt::IncRefCount();
590 void TEveRefBackPtr::DecRefCount(TEveElement* re)
592 static const TEveException eh(
"TEveRefBackPtr::DecRefCount ");
594 RefMap_i i = fBackRefs.find(re);
595 if (i != fBackRefs.end()) {
596 if (--(i->second) <= 0)
598 TEveRefCnt::DecRefCount();
600 Warning(eh,
"render element '%s' not found in back-refs.",
601 re->GetObject(eh)->GetName());
608 void TEveRefBackPtr::StampBackPtrElements(UChar_t stamps)
610 RefMap_i i = fBackRefs.begin();
611 while (i != fBackRefs.end())
613 i->first->AddStamp(stamps);