]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/Reve/GeoNode.cxx
Implemented proper reference management accross render-elements, render-element-lists...
[u/mrichter/AliRoot.git] / EVE / Reve / GeoNode.cxx
CommitLineData
5a5a1232 1// $Header$
2
3#include "GeoNode.h"
4#include <Reve/RGTopFrame.h>
5
6#include <TPad.h>
7#include <TColor.h>
8
9#include <TGeoVolume.h>
10#include <TGeoNode.h>
11#include <TGeoManager.h>
24e2ff4a 12#include <TVirtualGeoPainter.h>
5a5a1232 13
14using namespace Reve;
15
16//______________________________________________________________________
17// GeoNodeRnrEl
18//
19
20ClassImp(GeoNodeRnrEl)
21
22GeoNodeRnrEl::GeoNodeRnrEl(TGeoNode* node) :
23 RenderElementListBase(),
24 fNode(node)
25{
26 // Hack!! Should use cint to retrieve TAttLine::fLineColor offset.
27 char* l = (char*) dynamic_cast<TAttLine*>(node->GetVolume());
28 SetMainColorPtr((Color_t*)(l + sizeof(void*)));
29
30 fRnrElement = fNode->TGeoAtt::IsVisible();
31}
32
33const Text_t* GeoNodeRnrEl::GetName() const { return fNode->GetName(); }
34const Text_t* GeoNodeRnrEl::GetTitle() const { return fNode->GetTitle(); }
35
36/**************************************************************************/
37
38Int_t GeoNodeRnrEl::ExpandIntoListTree(TGListTree* ltree,
39 TGListTreeItem* parent)
40{
41 // Checks if child-nodes have been imported ... imports them if not.
42 // Then calls RenderElementListBase::ExpandIntoListTree.
43
44 if(fList.empty() && fNode->GetVolume()->GetNdaughters() > 0) {
45 TIter next(fNode->GetVolume()->GetNodes());
46 TGeoNode* dnode;
47 while((dnode = (TGeoNode*) next()) != 0) {
48 GeoNodeRnrEl* node_re = new GeoNodeRnrEl(dnode);
49 AddElement(node_re);
50 }
51 }
52 return RenderElementListBase::ExpandIntoListTree(ltree, parent);
53}
54
55/**************************************************************************/
56
57void GeoNodeRnrEl::FullUpdate()
58{
59 fRnrElement = fNode->TGeoAtt::IsVisible();
60 RenderElementListBase::FullUpdate();
61}
62
63/**************************************************************************/
64
65void GeoNodeRnrEl::SetRnrElement(Bool_t rnr)
66{
67 fNode->SetVisibility(rnr);
68 FullUpdate();
69}
70
71/**************************************************************************/
72
73void GeoNodeRnrEl::SetMainColor(Color_t color)
74{
75 fNode->GetVolume()->SetLineColor(color);
76 FullUpdate();
77}
78
79void GeoNodeRnrEl::SetMainColor(Pixel_t pixel)
80{
81 // This one needed for proper calling via CINT (signals).
82
83 SetMainColor(Color_t(TColor::GetColor(pixel)));
84}
85
86/**************************************************************************/
87
88void GeoNodeRnrEl::UpdateNode(TGeoNode* node)
89{
90 // Updates all reve-browsers having the node in their contents.
91 // All 3D-pads updated if any change found.
92 //
93 // Should (could?) be optimized with some assumptions about
94 // volume/node structure (search for parent, know the same node can not
95 // reoccur on lower level once found).
96
97 static const Exc_t eH("GeoNodeRnrEl::UpdateNode ");
98
99 // printf("%s node %s %p\n", eH.Data(), node->GetName(), node);
100
101 if(fNode == node)
102 FullUpdate();
103
104 for(lpRE_i i=fList.begin(); i!=fList.end(); ++i) {
105 ((GeoNodeRnrEl*)(*i))->UpdateNode(node);
106 }
107
108}
109
110void GeoNodeRnrEl::UpdateVolume(TGeoVolume* volume)
111{
112 // Updates all reve-browsers having the volume in their contents.
113 // All 3D-pads updated if any change found.
114 //
115 // Should (could?) be optimized with some assumptions about
116 // volume/node structure (search for parent, know the same node can not
117 // reoccur on lower level once found).
118
119 static const Exc_t eH("GeoNodeRnrEl::UpdateVolume ");
120
121 // printf("%s volume %s %p\n", eH.Data(), volume->GetName(), volume);
122
123 if(fNode->GetVolume() == volume)
124 FullUpdate();
125
126 for(lpRE_i i=fList.begin(); i!=fList.end(); ++i) {
127 ((GeoNodeRnrEl*)(*i))->UpdateVolume(volume);
128 }
129}
130
131/**************************************************************************/
132
133void GeoNodeRnrEl::Draw(Option_t* option)
134{
135 TString opt("SAME");
136 opt += option;
137 fNode->GetVolume()->Draw(opt);
138}
139
140/**************************************************************************/
141//______________________________________________________________________
142// GeoTopNodeRnrEl
143//
24e2ff4a 144// A wrapper over a TGeoNode, possibly displaced with a global
145// trasformation fGlobalTrans (the matrix is owned by this class).
5a5a1232 146/**************************************************************************/
147
148ClassImp(GeoTopNodeRnrEl)
149
150GeoTopNodeRnrEl::GeoTopNodeRnrEl(TGeoManager* manager, TGeoNode* node,
151 Int_t visopt, Int_t vislvl) :
152 GeoNodeRnrEl(node),
153 fManager(manager),
24e2ff4a 154 fGlobalTrans(0),
155 fUseNodeTrans(kFALSE),
5a5a1232 156 fVisOption(visopt), fVisLevel(vislvl)
157{
158 fRnrElement = true;
159}
160
24e2ff4a 161GeoTopNodeRnrEl::~GeoTopNodeRnrEl()
162{
163 delete fGlobalTrans;
164}
165
166/**************************************************************************/
167
168void GeoTopNodeRnrEl::SetGlobalTrans(TGeoHMatrix* m)
169{
170 delete fGlobalTrans;
171 fGlobalTrans = m;
172}
173
174void GeoTopNodeRnrEl::SetUseNodeTrans(Bool_t u)
175{
176 fUseNodeTrans = u;
177}
178
5a5a1232 179/**************************************************************************/
180
181void GeoTopNodeRnrEl::SetVisOption(Int_t visopt)
182{
183 fVisOption = visopt;
184 gReve->Redraw3D();
185}
186
187void GeoTopNodeRnrEl::SetVisLevel(Int_t vislvl)
188{
189 fVisLevel = vislvl;
190 gReve->Redraw3D();
191}
192
193/**************************************************************************/
194
195void GeoTopNodeRnrEl::FullUpdate()
196{
197 RenderElementListBase::FullUpdate();
198}
199
200/**************************************************************************/
201
202void GeoTopNodeRnrEl::SetRnrElement(Bool_t rnr)
203{
204 // Revert from GeoNode to back to standard behaviour.
205 RenderElementListBase::SetRnrElement(rnr);
206}
207
208/**************************************************************************/
209
210void GeoTopNodeRnrEl::Draw(Option_t* option)
211{
212 AppendPad(option);
213}
214
215void GeoTopNodeRnrEl::Paint(Option_t* option)
216{
217 if(fRnrElement) {
218 gGeoManager = fManager;
219 TVirtualPad* pad = gPad;
220 gPad = 0;
221 TGeoVolume* top_volume = fManager->GetTopVolume();
222 fManager->SetVisOption(fVisOption);
223 fManager->SetVisLevel(fVisLevel);
224 fManager->SetTopVolume(fNode->GetVolume());
225 gPad = pad;
24e2ff4a 226 TVirtualGeoPainter* vgp = fManager->GetGeomPainter();
227 if(vgp != 0) {
228#if ROOT_VERSION_CODE > ROOT_VERSION(5,11,7)
229 vgp->PaintNode(fNode, option, fUseNodeTrans ? fNode->GetMatrix() : fGlobalTrans);
230#else
231 vgp->PaintNode(fNode, option);
232#endif
233 }
5a5a1232 234 fManager->SetTopVolume(top_volume);
235 }
236}
237
238/**************************************************************************/
239
240void GeoTopNodeRnrEl::VolumeVisChanged(TGeoVolume* volume)
241{
242 static const Exc_t eH("GeoTopNodeRnrEl::VolumeVisChanged ");
243 printf("%s volume %s %p\n", eH.Data(), volume->GetName(), (void*)volume);
244 UpdateVolume(volume);
245}
246
247void GeoTopNodeRnrEl::VolumeColChanged(TGeoVolume* volume)
248{
249 static const Exc_t eH("GeoTopNodeRnrEl::VolumeColChanged ");
250 printf("%s volume %s %p\n", eH.Data(), volume->GetName(), (void*)volume);
251 UpdateVolume(volume);
252}
253
254void GeoTopNodeRnrEl::NodeVisChanged(TGeoNode* node)
255{
256 static const Exc_t eH("GeoTopNodeRnrEl::NodeVisChanged ");
257 printf("%s node %s %p\n", eH.Data(), node->GetName(), (void*)node);
258 UpdateNode(node);
259}