4 #include <Reve/RGTopFrame.h>
9 #include <TGeoVolume.h>
11 #include <TGeoManager.h>
12 #include <TVirtualGeoPainter.h>
16 //______________________________________________________________________
20 ClassImp(GeoNodeRnrEl)
22 GeoNodeRnrEl::GeoNodeRnrEl(TGeoNode* node) :
23 RenderElementListBase(),
27 // Hack!! Should use cint to retrieve TAttLine::fLineColor offset.
28 char* l = (char*) dynamic_cast<TAttLine*>(node->GetVolume());
29 SetMainColorPtr((Color_t*)(l + sizeof(void*)));
31 fRnrElement = fNode->TGeoAtt::IsVisible();
34 const Text_t* GeoNodeRnrEl::GetName() const { return fNode->GetName(); }
35 const Text_t* GeoNodeRnrEl::GetTitle() const { return fNode->GetTitle(); }
37 /**************************************************************************/
39 Int_t GeoNodeRnrEl::ExpandIntoListTree(TGListTree* ltree,
40 TGListTreeItem* parent)
42 // Checks if child-nodes have been imported ... imports them if not.
43 // Then calls RenderElementListBase::ExpandIntoListTree.
45 if(fChildren.empty() && fNode->GetVolume()->GetNdaughters() > 0) {
46 TIter next(fNode->GetVolume()->GetNodes());
48 while((dnode = (TGeoNode*) next()) != 0) {
49 GeoNodeRnrEl* node_re = new GeoNodeRnrEl(dnode);
53 return RenderElementListBase::ExpandIntoListTree(ltree, parent);
56 /**************************************************************************/
58 void GeoNodeRnrEl::UpdateItems()
60 fRnrElement = fNode->TGeoAtt::IsVisible();
61 RenderElementListBase::UpdateItems();
64 /**************************************************************************/
66 void GeoNodeRnrEl::SetRnrElement(Bool_t rnr)
68 fNode->SetVisibility(rnr);
72 /**************************************************************************/
74 void GeoNodeRnrEl::SetMainColor(Color_t color)
76 fNode->GetVolume()->SetLineColor(color);
80 void GeoNodeRnrEl::SetMainColor(Pixel_t pixel)
82 // This one needed for proper calling via CINT (signals).
84 SetMainColor(Color_t(TColor::GetColor(pixel)));
87 /**************************************************************************/
89 void GeoNodeRnrEl::UpdateNode(TGeoNode* node)
91 // Updates all reve-browsers having the node in their contents.
92 // All 3D-pads updated if any change found.
94 // Should (could?) be optimized with some assumptions about
95 // volume/node structure (search for parent, know the same node can not
96 // reoccur on lower level once found).
98 static const Exc_t eH("GeoNodeRnrEl::UpdateNode ");
100 // printf("%s node %s %p\n", eH.Data(), node->GetName(), node);
105 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
106 ((GeoNodeRnrEl*)(*i))->UpdateNode(node);
111 void GeoNodeRnrEl::UpdateVolume(TGeoVolume* volume)
113 // Updates all reve-browsers having the volume in their contents.
114 // All 3D-pads updated if any change found.
116 // Should (could?) be optimized with some assumptions about
117 // volume/node structure (search for parent, know the same node can not
118 // reoccur on lower level once found).
120 static const Exc_t eH("GeoNodeRnrEl::UpdateVolume ");
122 // printf("%s volume %s %p\n", eH.Data(), volume->GetName(), volume);
124 if(fNode->GetVolume() == volume)
127 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
128 ((GeoNodeRnrEl*)(*i))->UpdateVolume(volume);
132 /**************************************************************************/
134 void GeoNodeRnrEl::Draw(Option_t* option)
138 fNode->GetVolume()->Draw(opt);
141 /**************************************************************************/
142 //______________________________________________________________________
145 // A wrapper over a TGeoNode, possibly displaced with a global
146 // trasformation fGlobalTrans (the matrix is owned by this class).
147 /**************************************************************************/
149 ClassImp(GeoTopNodeRnrEl)
151 GeoTopNodeRnrEl::GeoTopNodeRnrEl(TGeoManager* manager, TGeoNode* node,
152 Int_t visopt, Int_t vislvl) :
156 fUseNodeTrans(kFALSE),
157 fVisOption(visopt), fVisLevel(vislvl)
162 GeoTopNodeRnrEl::~GeoTopNodeRnrEl()
167 /**************************************************************************/
169 void GeoTopNodeRnrEl::SetGlobalTrans(TGeoHMatrix* m)
175 void GeoTopNodeRnrEl::SetUseNodeTrans(Bool_t u)
180 /**************************************************************************/
182 void GeoTopNodeRnrEl::SetVisOption(Int_t visopt)
188 void GeoTopNodeRnrEl::SetVisLevel(Int_t vislvl)
194 /**************************************************************************/
196 void GeoTopNodeRnrEl::UpdateItems()
198 RenderElementListBase::UpdateItems();
201 /**************************************************************************/
203 void GeoTopNodeRnrEl::SetRnrElement(Bool_t rnr)
205 // Revert from GeoNode to back to standard behaviour.
206 RenderElementListBase::SetRnrElement(rnr);
209 /**************************************************************************/
211 void GeoTopNodeRnrEl::Draw(Option_t* option)
216 void GeoTopNodeRnrEl::Paint(Option_t* option)
219 gGeoManager = fManager;
220 TVirtualPad* pad = gPad;
222 TGeoVolume* top_volume = fManager->GetTopVolume();
223 fManager->SetVisOption(fVisOption);
224 fManager->SetVisLevel(fVisLevel);
225 fManager->SetTopVolume(fNode->GetVolume());
227 TVirtualGeoPainter* vgp = fManager->GetGeomPainter();
229 #if ROOT_VERSION_CODE > ROOT_VERSION(5,11,6)
230 vgp->PaintNode(fNode, option, fUseNodeTrans ? fNode->GetMatrix() : fGlobalTrans);
232 vgp->PaintNode(fNode, option);
235 fManager->SetTopVolume(top_volume);
239 /**************************************************************************/
241 void GeoTopNodeRnrEl::VolumeVisChanged(TGeoVolume* volume)
243 static const Exc_t eH("GeoTopNodeRnrEl::VolumeVisChanged ");
244 printf("%s volume %s %p\n", eH.Data(), volume->GetName(), (void*)volume);
245 UpdateVolume(volume);
248 void GeoTopNodeRnrEl::VolumeColChanged(TGeoVolume* volume)
250 static const Exc_t eH("GeoTopNodeRnrEl::VolumeColChanged ");
251 printf("%s volume %s %p\n", eH.Data(), volume->GetName(), (void*)volume);
252 UpdateVolume(volume);
255 void GeoTopNodeRnrEl::NodeVisChanged(TGeoNode* node)
257 static const Exc_t eH("GeoTopNodeRnrEl::NodeVisChanged ");
258 printf("%s node %s %p\n", eH.Data(), node->GetName(), (void*)node);