4 #include <Reve/RGTopFrame.h>
6 #include "TGeoShapeExtract.h"
10 #include <TVirtualViewer3D.h>
13 #include <TGeoShape.h>
14 #include <TGeoVolume.h>
16 #include <TGeoManager.h>
17 #include <TVirtualGeoPainter.h>
21 //______________________________________________________________________
25 ClassImp(GeoNodeRnrEl)
27 GeoNodeRnrEl::GeoNodeRnrEl(TGeoNode* node) :
32 // Hack!! Should use cint to retrieve TAttLine::fLineColor offset.
33 char* l = (char*) dynamic_cast<TAttLine*>(node->GetVolume());
34 SetMainColorPtr((Color_t*)(l + sizeof(void*)));
36 fRnrSelf = fNode->TGeoAtt::IsVisible();
39 const Text_t* GeoNodeRnrEl::GetName() const { return fNode->GetName(); }
40 const Text_t* GeoNodeRnrEl::GetTitle() const { return fNode->GetTitle(); }
42 /**************************************************************************/
44 Int_t GeoNodeRnrEl::ExpandIntoListTree(TGListTree* ltree,
45 TGListTreeItem* parent)
47 // Checks if child-nodes have been imported ... imports them if not.
48 // Then calls RenderElement::ExpandIntoListTree.
50 if(fChildren.empty() && fNode->GetVolume()->GetNdaughters() > 0) {
51 TIter next(fNode->GetVolume()->GetNodes());
53 while((dnode = (TGeoNode*) next()) != 0) {
54 GeoNodeRnrEl* node_re = new GeoNodeRnrEl(dnode);
58 return RenderElement::ExpandIntoListTree(ltree, parent);
61 /**************************************************************************/
63 void GeoNodeRnrEl::SetRnrSelf(Bool_t rnr)
65 RenderElement::SetRnrSelf(rnr);
66 fNode->SetVisibility(rnr);
69 void GeoNodeRnrEl::SetRnrChildren(Bool_t rnr)
71 RenderElement::SetRnrChildren(rnr);
72 fNode->VisibleDaughters(rnr);
75 void GeoNodeRnrEl::SetRnrState(Bool_t rnr)
77 RenderElement::SetRnrState(rnr);
78 fNode->SetVisibility(rnr);
79 fNode->VisibleDaughters(rnr);
82 /**************************************************************************/
84 void GeoNodeRnrEl::SetMainColor(Color_t color)
86 fNode->GetVolume()->SetLineColor(color);
90 void GeoNodeRnrEl::SetMainColor(Pixel_t pixel)
92 // This one needed for proper calling via CINT (signals).
94 SetMainColor(Color_t(TColor::GetColor(pixel)));
97 /**************************************************************************/
99 void GeoNodeRnrEl::UpdateNode(TGeoNode* node)
101 // Updates all reve-browsers having the node in their contents.
102 // All 3D-pads updated if any change found.
104 // Should (could?) be optimized with some assumptions about
105 // volume/node structure (search for parent, know the same node can not
106 // reoccur on lower level once found).
108 static const Exc_t eH("GeoNodeRnrEl::UpdateNode ");
110 // printf("%s node %s %p\n", eH.Data(), node->GetName(), node);
115 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
116 ((GeoNodeRnrEl*)(*i))->UpdateNode(node);
121 void GeoNodeRnrEl::UpdateVolume(TGeoVolume* volume)
123 // Updates all reve-browsers having the volume in their contents.
124 // All 3D-pads updated if any change found.
126 // Should (could?) be optimized with some assumptions about
127 // volume/node structure (search for parent, know the same node can not
128 // reoccur on lower level once found).
130 static const Exc_t eH("GeoNodeRnrEl::UpdateVolume ");
132 // printf("%s volume %s %p\n", eH.Data(), volume->GetName(), volume);
134 if(fNode->GetVolume() == volume)
137 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
138 ((GeoNodeRnrEl*)(*i))->UpdateVolume(volume);
142 /**************************************************************************/
144 void GeoNodeRnrEl::Draw(Option_t* option)
148 fNode->GetVolume()->Draw(opt);
151 /**************************************************************************/
152 //______________________________________________________________________
155 // A wrapper over a TGeoNode, possibly displaced with a global
156 // trasformation fGlobalTrans (the matrix is owned by this class).
157 /**************************************************************************/
159 ClassImp(GeoTopNodeRnrEl)
161 GeoTopNodeRnrEl::GeoTopNodeRnrEl(TGeoManager* manager, TGeoNode* node,
162 Int_t visopt, Int_t vislvl) :
171 GeoTopNodeRnrEl::~GeoTopNodeRnrEl()
174 /**************************************************************************/
176 void GeoTopNodeRnrEl::SetGlobalTrans(const TGeoHMatrix* m)
178 fGlobalTrans.SetFrom(*m);
181 void GeoTopNodeRnrEl::UseNodeTrans()
183 fGlobalTrans.SetFrom(*fNode->GetMatrix());
186 /**************************************************************************/
188 void GeoTopNodeRnrEl::SetVisOption(Int_t visopt)
194 void GeoTopNodeRnrEl::SetVisLevel(Int_t vislvl)
200 /**************************************************************************/
202 void GeoTopNodeRnrEl::SetRnrSelf(Bool_t rnr)
204 // Revert from GeoNode to back to standard behaviour.
205 RenderElement::SetRnrSelf(rnr);
208 /**************************************************************************/
210 void GeoTopNodeRnrEl::Draw(Option_t* option)
215 void GeoTopNodeRnrEl::Paint(Option_t* option)
218 gGeoManager = fManager;
219 TVirtualPad* pad = gPad;
221 TGeoVolume* top_volume = fManager->GetTopVolume();
222 fManager->SetVisOption(fVisOption);
223 fManager->SetVisLevel(fVisLevel);
224 fManager->SetTopVolume(fNode->GetVolume());
226 TVirtualGeoPainter* vgp = fManager->GetGeomPainter();
228 #if ROOT_VERSION_CODE > ROOT_VERSION(5,11,6)
230 fGlobalTrans.SetGeoHMatrix(geomat);
231 vgp->PaintNode(fNode, option, &geomat);
233 vgp->PaintNode(fNode, option);
236 fManager->SetTopVolume(top_volume);
240 /**************************************************************************/
242 void GeoTopNodeRnrEl::VolumeVisChanged(TGeoVolume* volume)
244 static const Exc_t eH("GeoTopNodeRnrEl::VolumeVisChanged ");
245 printf("%s volume %s %p\n", eH.Data(), volume->GetName(), (void*)volume);
246 UpdateVolume(volume);
249 void GeoTopNodeRnrEl::VolumeColChanged(TGeoVolume* volume)
251 static const Exc_t eH("GeoTopNodeRnrEl::VolumeColChanged ");
252 printf("%s volume %s %p\n", eH.Data(), volume->GetName(), (void*)volume);
253 UpdateVolume(volume);
256 void GeoTopNodeRnrEl::NodeVisChanged(TGeoNode* node)
258 static const Exc_t eH("GeoTopNodeRnrEl::NodeVisChanged ");
259 printf("%s node %s %p\n", eH.Data(), node->GetName(), (void*)node);
264 /**************************************************************************/
265 //______________________________________________________________________
268 // Minimal shape-wrapper allowing import of stuff from gled and retaining
269 // user-set visibility, colors and transparency.
270 /**************************************************************************/
272 ClassImp(GeoShapeRnrEl)
274 GeoShapeRnrEl::GeoShapeRnrEl(const Text_t* name, const Text_t* title) :
275 RenderElement (fColor),
276 TNamed (name, title),
282 GeoShapeRnrEl::~GeoShapeRnrEl()
285 fShape->SetUniqueID(fShape->GetUniqueID() - 1);
286 if (fShape->GetUniqueID() == 0)
291 /**************************************************************************/
293 void GeoShapeRnrEl::Paint(Option_t* /*option*/)
298 TBuffer3D& buff = (TBuffer3D&) fShape->GetBuffer3D
299 (TBuffer3D::kCore, false);
302 buff.fColor = fColor;
303 buff.fTransparency = fTransparency;
304 fHMTrans.SetBuffer3D(buff);
306 fShape->GetBuffer3D(TBuffer3D::kBoundingBox | TBuffer3D::kShapeSpecific, true);
308 Int_t reqSec = gPad->GetViewer3D()->AddObject(buff);
310 if (reqSec != TBuffer3D::kNone) {
311 fShape->GetBuffer3D(reqSec, true);
312 reqSec = gPad->GetViewer3D()->AddObject(buff);
315 if (reqSec != TBuffer3D::kNone)
316 printf("spooky reqSec=%d for %s\n", reqSec, GetName());
319 /**************************************************************************/
321 Int_t GeoShapeRnrEl::ImportShapeExtract(TGeoShapeExtract * gse,
322 RenderElement * parent)
324 gReve->DisableRedraw();
325 Int_t n = SubImportShapeExtract(gse, parent);
326 printf ("GeoShapeRnrEl::ImportShapeExtract imported %d elements\n", n);
327 gReve->EnableRedraw();
331 Int_t GeoShapeRnrEl::SubImportShapeExtract(TGeoShapeExtract * gse,
332 RenderElement * parent)
336 GeoShapeRnrEl* gsre = new GeoShapeRnrEl(gse->GetName(), gse->GetTitle());
337 gsre->fHMTrans.SetFromArray(gse->GetTrans());
338 const Float_t* rgba = gse->GetRGBA();
339 gsre->fColor = TColor::GetColor(rgba[0], rgba[1], rgba[2]);
340 gsre->fTransparency = (UChar_t) (100.0f*(1.0f - rgba[3]));
341 gsre->SetRnrSelf(gse->GetRnrSelf());
342 gsre->SetRnrChildren(gse->GetRnrElements());
343 gsre->fShape = gse->GetShape();
345 gsre->fShape->SetUniqueID(gsre->fShape->GetUniqueID() + 1);
348 gReve->AddGlobalRenderElement(parent, gsre);
350 gReve->AddGlobalRenderElement(gsre);
352 if (gse->HasElements())
354 TIter next(gse->GetElements());
355 TGeoShapeExtract* chld;
356 while ((chld = (TGeoShapeExtract*) next()) != 0)
357 ncreated += SubImportShapeExtract(chld, gsre);