]>
Commit | Line | Data |
---|---|---|
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 | |
14 | using namespace Reve; | |
15 | ||
16 | //______________________________________________________________________ | |
17 | // GeoNodeRnrEl | |
18 | // | |
19 | ||
20 | ClassImp(GeoNodeRnrEl) | |
21 | ||
22 | GeoNodeRnrEl::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 | ||
33 | const Text_t* GeoNodeRnrEl::GetName() const { return fNode->GetName(); } | |
34 | const Text_t* GeoNodeRnrEl::GetTitle() const { return fNode->GetTitle(); } | |
35 | ||
36 | /**************************************************************************/ | |
37 | ||
38 | Int_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 | ||
57 | void GeoNodeRnrEl::FullUpdate() | |
58 | { | |
59 | fRnrElement = fNode->TGeoAtt::IsVisible(); | |
60 | RenderElementListBase::FullUpdate(); | |
61 | } | |
62 | ||
63 | /**************************************************************************/ | |
64 | ||
65 | void GeoNodeRnrEl::SetRnrElement(Bool_t rnr) | |
66 | { | |
67 | fNode->SetVisibility(rnr); | |
68 | FullUpdate(); | |
69 | } | |
70 | ||
71 | /**************************************************************************/ | |
72 | ||
73 | void GeoNodeRnrEl::SetMainColor(Color_t color) | |
74 | { | |
75 | fNode->GetVolume()->SetLineColor(color); | |
76 | FullUpdate(); | |
77 | } | |
78 | ||
79 | void 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 | ||
88 | void 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 | ||
110 | void 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 | ||
133 | void 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 | ||
148 | ClassImp(GeoTopNodeRnrEl) | |
149 | ||
150 | GeoTopNodeRnrEl::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 | 161 | GeoTopNodeRnrEl::~GeoTopNodeRnrEl() |
162 | { | |
163 | delete fGlobalTrans; | |
164 | } | |
165 | ||
166 | /**************************************************************************/ | |
167 | ||
168 | void GeoTopNodeRnrEl::SetGlobalTrans(TGeoHMatrix* m) | |
169 | { | |
170 | delete fGlobalTrans; | |
171 | fGlobalTrans = m; | |
172 | } | |
173 | ||
174 | void GeoTopNodeRnrEl::SetUseNodeTrans(Bool_t u) | |
175 | { | |
176 | fUseNodeTrans = u; | |
177 | } | |
178 | ||
5a5a1232 | 179 | /**************************************************************************/ |
180 | ||
181 | void GeoTopNodeRnrEl::SetVisOption(Int_t visopt) | |
182 | { | |
183 | fVisOption = visopt; | |
184 | gReve->Redraw3D(); | |
185 | } | |
186 | ||
187 | void GeoTopNodeRnrEl::SetVisLevel(Int_t vislvl) | |
188 | { | |
189 | fVisLevel = vislvl; | |
190 | gReve->Redraw3D(); | |
191 | } | |
192 | ||
193 | /**************************************************************************/ | |
194 | ||
195 | void GeoTopNodeRnrEl::FullUpdate() | |
196 | { | |
197 | RenderElementListBase::FullUpdate(); | |
198 | } | |
199 | ||
200 | /**************************************************************************/ | |
201 | ||
202 | void GeoTopNodeRnrEl::SetRnrElement(Bool_t rnr) | |
203 | { | |
204 | // Revert from GeoNode to back to standard behaviour. | |
205 | RenderElementListBase::SetRnrElement(rnr); | |
206 | } | |
207 | ||
208 | /**************************************************************************/ | |
209 | ||
210 | void GeoTopNodeRnrEl::Draw(Option_t* option) | |
211 | { | |
212 | AppendPad(option); | |
213 | } | |
214 | ||
215 | void 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 | ||
240 | void 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 | ||
247 | void 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 | ||
254 | void 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 | } |