]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/Reve/GeoNode.cxx
Getting rid of effC++ warnings about missing copy constructor and assignment operator.
[u/mrichter/AliRoot.git] / EVE / Reve / GeoNode.cxx
index 96b251988f8c6d0ab2019d9529bf35ebad43b803..940e9a9f002f27da6df05e0f84f561f58a00f922 100644 (file)
@@ -3,9 +3,14 @@
 #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>
@@ -20,7 +25,7 @@ using namespace Reve;
 ClassImp(GeoNodeRnrEl)
 
 GeoNodeRnrEl::GeoNodeRnrEl(TGeoNode* node) :
-  RenderElementListBase(),
+  RenderElement(),
   TObject(),
   fNode(node)
 {
@@ -28,7 +33,7 @@ GeoNodeRnrEl::GeoNodeRnrEl(TGeoNode* 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(); }
@@ -40,7 +45,7 @@ Int_t GeoNodeRnrEl::ExpandIntoListTree(TGListTree* ltree,
                                       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());
@@ -50,23 +55,28 @@ Int_t GeoNodeRnrEl::ExpandIntoListTree(TGListTree* ltree,
       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);
 }
 
 /**************************************************************************/
@@ -102,7 +112,7 @@ void GeoNodeRnrEl::UpdateNode(TGeoNode* node)
   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);
   }
 
@@ -124,7 +134,7 @@ void GeoNodeRnrEl::UpdateVolume(TGeoVolume* volume)
   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);
   }
 }
@@ -150,31 +160,28 @@ ClassImp(GeoTopNodeRnrEl)
 
 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());
 }
 
 /**************************************************************************/
@@ -193,17 +200,10 @@ void GeoTopNodeRnrEl::SetVisLevel(Int_t vislvl)
 
 /**************************************************************************/
 
-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);
 }
 
 /**************************************************************************/
@@ -215,7 +215,7 @@ void GeoTopNodeRnrEl::Draw(Option_t* option)
 
 void GeoTopNodeRnrEl::Paint(Option_t* option)
 {
-  if(fRnrElement) {
+  if(fRnrSelf) {
     gGeoManager = fManager;
     TVirtualPad* pad = gPad;
     gPad = 0;
@@ -227,7 +227,9 @@ void GeoTopNodeRnrEl::Paint(Option_t* option)
     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
@@ -258,3 +260,104 @@ void GeoTopNodeRnrEl::NodeVisChanged(TGeoNode* node)
   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;
+}