#include "GeoNode.h"
#include <Reve/RGTopFrame.h>
+#include "TGeoShapeExtract.h"
+
#include <TPad.h>
+#include <TBuffer3D.h>
+#include <TVirtualViewer3D.h>
#include <TColor.h>
+#include <TGeoShape.h>
#include <TGeoVolume.h>
#include <TGeoNode.h>
#include <TGeoManager.h>
ClassImp(GeoNodeRnrEl)
GeoNodeRnrEl::GeoNodeRnrEl(TGeoNode* node) :
- RenderElementListBase(),
+ RenderElement(),
TObject(),
fNode(node)
{
char* l = (char*) dynamic_cast<TAttLine*>(node->GetVolume());
SetMainColorPtr((Color_t*)(l + sizeof(void*)));
- fRnrElement = fNode->TGeoAtt::IsVisible();
+ fRnrSelf = fNode->TGeoAtt::IsVisible();
}
const Text_t* GeoNodeRnrEl::GetName() const { return fNode->GetName(); }
TGListTreeItem* parent)
{
// Checks if child-nodes have been imported ... imports them if not.
- // Then calls RenderElementListBase::ExpandIntoListTree.
+ // Then calls RenderElement::ExpandIntoListTree.
if(fChildren.empty() && fNode->GetVolume()->GetNdaughters() > 0) {
TIter next(fNode->GetVolume()->GetNodes());
AddElement(node_re);
}
}
- return RenderElementListBase::ExpandIntoListTree(ltree, parent);
+ return RenderElement::ExpandIntoListTree(ltree, parent);
}
/**************************************************************************/
-void GeoNodeRnrEl::UpdateItems()
+void GeoNodeRnrEl::SetRnrSelf(Bool_t rnr)
{
- fRnrElement = fNode->TGeoAtt::IsVisible();
- RenderElementListBase::UpdateItems();
+ RenderElement::SetRnrSelf(rnr);
+ fNode->SetVisibility(rnr);
}
-/**************************************************************************/
+void GeoNodeRnrEl::SetRnrChildren(Bool_t rnr)
+{
+ RenderElement::SetRnrChildren(rnr);
+ fNode->VisibleDaughters(rnr);
+}
-void GeoNodeRnrEl::SetRnrElement(Bool_t rnr)
+void GeoNodeRnrEl::SetRnrState(Bool_t rnr)
{
+ RenderElement::SetRnrState(rnr);
fNode->SetVisibility(rnr);
- UpdateItems();
+ fNode->VisibleDaughters(rnr);
}
/**************************************************************************/
if(fNode == node)
UpdateItems();
- for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
+ for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
((GeoNodeRnrEl*)(*i))->UpdateNode(node);
}
if(fNode->GetVolume() == volume)
UpdateItems();
- for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
+ for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
((GeoNodeRnrEl*)(*i))->UpdateVolume(volume);
}
}
GeoTopNodeRnrEl::GeoTopNodeRnrEl(TGeoManager* manager, TGeoNode* node,
Int_t visopt, Int_t vislvl) :
- GeoNodeRnrEl(node),
- fManager(manager),
- fGlobalTrans(0),
- fUseNodeTrans(kFALSE),
- fVisOption(visopt), fVisLevel(vislvl)
+ GeoNodeRnrEl (node),
+ fGlobalTrans (),
+ fManager (manager),
+ fVisOption (visopt),
+ fVisLevel (vislvl)
{
- fRnrElement = true;
+ fRnrSelf = true;
}
GeoTopNodeRnrEl::~GeoTopNodeRnrEl()
-{
- delete fGlobalTrans;
-}
+{}
/**************************************************************************/
-void GeoTopNodeRnrEl::SetGlobalTrans(TGeoHMatrix* m)
+void GeoTopNodeRnrEl::SetGlobalTrans(const TGeoHMatrix* m)
{
- delete fGlobalTrans;
- fGlobalTrans = m;
+ fGlobalTrans.SetFrom(*m);
}
-void GeoTopNodeRnrEl::SetUseNodeTrans(Bool_t u)
+void GeoTopNodeRnrEl::UseNodeTrans()
{
- fUseNodeTrans = u;
+ fGlobalTrans.SetFrom(*fNode->GetMatrix());
}
/**************************************************************************/
/**************************************************************************/
-void GeoTopNodeRnrEl::UpdateItems()
-{
- RenderElementListBase::UpdateItems();
-}
-
-/**************************************************************************/
-
-void GeoTopNodeRnrEl::SetRnrElement(Bool_t rnr)
+void GeoTopNodeRnrEl::SetRnrSelf(Bool_t rnr)
{
// Revert from GeoNode to back to standard behaviour.
- RenderElementListBase::SetRnrElement(rnr);
+ RenderElement::SetRnrSelf(rnr);
}
/**************************************************************************/
void GeoTopNodeRnrEl::Paint(Option_t* option)
{
- if(fRnrElement) {
+ if(fRnrSelf) {
gGeoManager = fManager;
TVirtualPad* pad = gPad;
gPad = 0;
TVirtualGeoPainter* vgp = fManager->GetGeomPainter();
if(vgp != 0) {
#if ROOT_VERSION_CODE > ROOT_VERSION(5,11,6)
- vgp->PaintNode(fNode, option, fUseNodeTrans ? fNode->GetMatrix() : fGlobalTrans);
+ TGeoHMatrix geomat;
+ fGlobalTrans.SetGeoHMatrix(geomat);
+ vgp->PaintNode(fNode, option, &geomat);
#else
vgp->PaintNode(fNode, option);
#endif
printf("%s node %s %p\n", eH.Data(), node->GetName(), (void*)node);
UpdateNode(node);
}
+
+
+/**************************************************************************/
+//______________________________________________________________________
+// GeoShapeRnrEl
+//
+// Minimal shape-wrapper allowing import of stuff from gled and retaining
+// user-set visibility, colors and transparency.
+/**************************************************************************/
+
+ClassImp(GeoShapeRnrEl)
+
+GeoShapeRnrEl::GeoShapeRnrEl(const Text_t* name, const Text_t* title) :
+ RenderElement (fColor),
+ TNamed (name, title),
+ fHMTrans (),
+ fColor (0),
+ fTransparency (0),
+ fShape (0)
+{}
+
+GeoShapeRnrEl::~GeoShapeRnrEl()
+{
+ if (fShape) {
+ fShape->SetUniqueID(fShape->GetUniqueID() - 1);
+ if (fShape->GetUniqueID() == 0)
+ delete fShape;
+ }
+}
+
+/**************************************************************************/
+
+void GeoShapeRnrEl::Paint(Option_t* /*option*/)
+{
+ if (fShape == 0)
+ return;
+
+ TBuffer3D& buff = (TBuffer3D&) fShape->GetBuffer3D
+ (TBuffer3D::kCore, false);
+
+ buff.fID = this;
+ buff.fColor = fColor;
+ buff.fTransparency = fTransparency;
+ fHMTrans.SetBuffer3D(buff);
+
+ fShape->GetBuffer3D(TBuffer3D::kBoundingBox | TBuffer3D::kShapeSpecific, true);
+
+ Int_t reqSec = gPad->GetViewer3D()->AddObject(buff);
+
+ if (reqSec != TBuffer3D::kNone) {
+ fShape->GetBuffer3D(reqSec, true);
+ reqSec = gPad->GetViewer3D()->AddObject(buff);
+ }
+
+ if (reqSec != TBuffer3D::kNone)
+ printf("spooky reqSec=%d for %s\n", reqSec, GetName());
+}
+
+/**************************************************************************/
+
+Int_t GeoShapeRnrEl::ImportShapeExtract(TGeoShapeExtract * gse,
+ RenderElement * parent)
+{
+ gReve->DisableRedraw();
+ Int_t n = SubImportShapeExtract(gse, parent);
+ printf ("GeoShapeRnrEl::ImportShapeExtract imported %d elements\n", n);
+ gReve->EnableRedraw();
+ return n;
+}
+
+Int_t GeoShapeRnrEl::SubImportShapeExtract(TGeoShapeExtract * gse,
+ RenderElement * parent)
+{
+ Int_t ncreated = 1;
+
+ GeoShapeRnrEl* gsre = new GeoShapeRnrEl(gse->GetName(), gse->GetTitle());
+ gsre->fHMTrans.SetFromArray(gse->GetTrans());
+ const Float_t* rgba = gse->GetRGBA();
+ gsre->fColor = TColor::GetColor(rgba[0], rgba[1], rgba[2]);
+ gsre->fTransparency = (UChar_t) (100.0f*(1.0f - rgba[3]));
+ gsre->SetRnrSelf(gse->GetRnrSelf());
+ gsre->SetRnrChildren(gse->GetRnrElements());
+ gsre->fShape = gse->GetShape();
+ if (gsre->fShape)
+ gsre->fShape->SetUniqueID(gsre->fShape->GetUniqueID() + 1);
+
+ if (parent)
+ gReve->AddGlobalRenderElement(parent, gsre);
+ else
+ gReve->AddGlobalRenderElement(gsre);
+
+ if (gse->HasElements())
+ {
+ TIter next(gse->GetElements());
+ TGeoShapeExtract* chld;
+ while ((chld = (TGeoShapeExtract*) next()) != 0)
+ ncreated += SubImportShapeExtract(chld, gsre);
+ }
+
+ return ncreated;
+}