CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
FWGeoTopNode.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Core
4 // Class : FWGeoTopNode
5 //
6 // Implementation:
7 // [Notes on implementation]
8 //
9 // Original Author: Matevz Tadel, Alja Mrak Tadel
10 // Created: Thu Jun 23 01:24:51 CEST 2011
11 // $Id: FWGeoTopNode.cc,v 1.25 2012/05/08 02:32:50 amraktad Exp $
12 //
13 
14 // system include files
15 
16 // user include files
17 
18 #include "TEveTrans.h"
19 #include "TEveViewer.h"
20 #include "TEveManager.h"
21 #include "TEveUtil.h"
22 
23 
24 #include "TROOT.h"
25 #include "TBuffer3D.h"
26 #include "TBuffer3DTypes.h"
27 #include "TVirtualViewer3D.h"
28 #include "TColor.h"
29 #include "TGLScenePad.h"
30 #include "TGLPhysicalShape.h"
31 #include "TGLSelectRecord.h"
32 #include "TGLViewer.h"
33 #include "TGLWidget.h"
34 
35 #include "TGeoShape.h"
36 #include "TGeoVolume.h"
37 #include "TGeoNode.h"
38 #include "TGeoShapeAssembly.h"
39 #include "TGeoCompositeShape.h"
40 #include "TGeoBoolNode.h"
41 #include "TGeoManager.h"
42 #include "TGeoMatrix.h"
43 #include "TVirtualGeoPainter.h"
44 
50 
51 TGLViewer* FWGeoTopNode::s_pickedViewer = 0;
53 
55 {
56 return UInt_t(tableIdx + 2);
57 
58 }
59 
60 int FWGeoTopNode::tableIdx(TGLPhysicalShape* ps)
61 {
62  return ps->ID() - 2;
63 }
64 //______________________________________________________________________________
65 void FWGeoTopNode::EraseFromSet(std::set<TGLPhysicalShape*>& sset, TGLPhysicalShape* id)
66 {
67  sset.erase(id);
68  SetStateOf(id);
69 }
70 
71 //______________________________________________________________________________
72 void FWGeoTopNode::ClearSet(std::set<TGLPhysicalShape*>& sset)
73 {
74  while (!sset.empty())
75  {
76  TGLPhysicalShape *id = *sset.begin();
77  sset.erase(id);
78  SetStateOf(id);
79  }
80 }
81 //______________________________________________________________________________
82 void FWGeoTopNode::SetStateOf(TGLPhysicalShape* id)
83 {
85 
86  if (fSted.find(id) != fSted.end())
87  {
88  id->Select(1);
90  }
91  else if (fHted.find(id) != fHted.end())
92  {
93  id->Select(3);
95  }
96  else
97  {
98  id->Select(0);
101  }
102 
103 }
104 
105 //______________________________________________________________________________
106 void FWGeoTopNode::ProcessSelection(TGLSelectRecord& rec, std::set<TGLPhysicalShape*>& sset, TGLPhysicalShape* id)
107 {
108  // printf("FWGeoTopNode::ProcessSelection ===============================\n");
109 
110  m_scene->BeginUpdate();
111 
112  if (sset.empty())
113  {
114  if (id)
115  {
116  sset.insert(id);
117  rec.SetSecSelResult(TGLSelectRecord::kEnteringSelection);
118  }
119  }
120  else
121  {
122  if (id)
123  {
124  if (rec.GetMultiple())
125  {
126  if (sset.find(id) == sset.end())
127  {
128  sset.insert(id);
129  rec.SetSecSelResult(TGLSelectRecord::kModifyingInternalSelection);
130  }
131  else
132  {
133  EraseFromSet(sset, id);
134  if (sset.empty())
135  rec.SetSecSelResult(TGLSelectRecord::kLeavingSelection);
136  else
137  rec.SetSecSelResult(TGLSelectRecord::kModifyingInternalSelection);
138  }
139  }
140  else
141  {
142  if (sset.size() != 1 || sset.find(id) == sset.end())
143  {
144  ClearSet(sset);
145  sset.insert(id);
146  rec.SetSecSelResult(TGLSelectRecord::kModifyingInternalSelection);
147  }
148  }
149  }
150  else
151  {
152  if (!rec.GetMultiple())
153  {
154  ClearSet(sset);
155  rec.SetSecSelResult(TGLSelectRecord::kLeavingSelection);
156  }
157  }
158  }
159 
160  if (id)
161  {
162  SetStateOf(id);
163  }
164 
165  if (rec.GetSecSelResult() != TGLSelectRecord::kNone)
166  {
167  m_scene->EndUpdate(kTRUE, kFALSE, kTRUE);
168  gEve->Redraw3D();
169 
171  }
172  else
173  {
174  m_scene->EndUpdate(kFALSE, kFALSE, kFALSE);
175  }
176 }
177 
178 //______________________________________________________________________________
180 {
181  // printf("FWGeoTopNode::selectPhysicalFromTable
182 
183  TGLPhysicalShape* ps = m_scene->FindPhysical(phyID(tableIndex));
184  if (ps) {
185  fSted.insert(ps);
186  ps->Select(1);
187  // printf("selectPhysicalFromTable found physical \n");
188  return true;
189  }
190  else if ( tableManager()->refEntries().at(tableIndex).testBit(FWGeometryTableManagerBase::kVisNodeSelf));
191  {
192  fwLog(fwlog::kInfo) << "Selected entry not drawn in GL viewer. \n" ;
193  return false;
194  }
195 }
196 
197 //______________________________________________________________________________
199 {
200  for (std::set<TGLPhysicalShape*>::iterator it = fSted.begin(); it != fSted.end(); ++it)
201  {
202  printf("FWGeoTopNode::printSelected %s \n", tableManager()->refEntries().at(tableIdx(*it)).name() );
203  }
204 }
205 
206 //______________________________________________________________________________
207 
209 {
210  // Note: if object would be rendered, this would return fSted.begin().
211 
212  if (fSted.size() <= 1)
213  {
214  int cnt = 0;
215  for (FWGeometryTableManagerBase::Entries_i i = tableManager()->refEntries().begin(); i != tableManager()->refEntries().end(); ++i, ++cnt)
216  {
217  if (i->testBit(FWGeometryTableManagerBase::kSelected)) return cnt;
218  }
219  }
220  return -1;
221 }
222 
223 //______________________________________________________________________________
225 {
226  // Fill bounding-box information. Virtual from TAttBBox.
227 
228  BBoxZero(1.0f);
229 }
230 
231 //______________________________________________________________________________
232 void FWGeoTopNode::setupBuffMtx(TBuffer3D& buff, const TGeoHMatrix& mat)
233 {
234  const Double_t *r = mat.GetRotationMatrix();
235  const Double_t *t = mat.GetTranslation();
236  const Double_t *s = mat.GetScale();
237  Double_t *m = buff.fLocalMaster;
238  m[0] = r[0]*s[0]; m[1] = r[1]*s[1]; m[2] = r[2]*s[2]; m[3] = 0;
239  m[4] = r[3]*s[0]; m[5] = r[4]*s[1]; m[6] = r[5]*s[2]; m[7] = 0;
240  m[8] = r[6]*s[0]; m[9] = r[7]*s[1]; m[10] = r[8]*s[2]; m[11] = 0;
241  m[12] = t[0]; m[13] = t[1]; m[15] = t[2]; m[15] = 1;
242 
243  buff.fLocalFrame = kTRUE;
244 }
245 
246 // ______________________________________________________________________
247 void FWGeoTopNode::paintShape( Int_t tableIndex, const TGeoHMatrix& nm, bool volumeColor, bool isParentNode)
248 {
249  static const TEveException eh("FWGeoTopNode::paintShape ");
250 
251  // printf("paint sahpe id %d\n", tableIndex );
252 
254  UChar_t transparency = wrapTransparency(data, isParentNode);
255  // printf("trans %d \n", transparency );
256  if (transparency >= 100) return;
257 
258  TGeoShape* shape = data.m_node->GetVolume()->GetShape();
259 
260  TGeoCompositeShape* compositeShape = dynamic_cast<TGeoCompositeShape*>(shape);
261  if (compositeShape)
262  {
263  // m_scene->fNextCompositeID = phyID(tableIndex);
264 
265  Double_t halfLengths[3] = { compositeShape->GetDX(), compositeShape->GetDY(), compositeShape->GetDZ() };
266 
267  TBuffer3D buff(TBuffer3DTypes::kComposite);
268  buff.fID = data.m_node->GetVolume();
269  buff.fColor = volumeColor ? data.m_node->GetVolume()->GetLineColor() : data.m_color ;
270  buff.fTransparency = transparency;// data.m_node->GetVolume()->GetTransparency();
271 
272  nm.GetHomogenousMatrix(buff.fLocalMaster);
273  buff.fLocalFrame = kTRUE; // Always enforce local frame (no geo manager).
274  buff.SetAABoundingBox(compositeShape->GetOrigin(), halfLengths);
275  buff.SetSectionsValid(TBuffer3D::kCore|TBuffer3D::kBoundingBox);
276 
277  Bool_t paintComponents = kTRUE;
278  // Start a composite shape, identified by this buffer
279  if (TBuffer3D::GetCSLevel() == 0) {
280  paintComponents = m_scene->OpenCompositeWithPhyID(phyID(tableIndex), buff);
281  }
282 
283  TBuffer3D::IncCSLevel();
284 
285  // Paint the boolean node - will add more buffers to viewer
286  TGeoHMatrix xxx;
287  TGeoMatrix *gst = TGeoShape::GetTransform();
288  TGeoShape::SetTransform(&xxx);
289 
290  if (paintComponents) compositeShape->GetBoolNode()->Paint("");
291  TGeoShape::SetTransform(gst);
292  // Close the composite shape
293  if (TBuffer3D::DecCSLevel() == 0)
294  gPad->GetViewer3D()->CloseComposite();
295 
296 
297  // m_scene->fNextCompositeID = 0;
298  }
299  else
300  {
301  TBuffer3D& buff = (TBuffer3D&) shape->GetBuffer3D (TBuffer3D::kCore, kFALSE);
302  setupBuffMtx(buff, nm);
303  buff.fID = data.m_node->GetVolume();
304  buff.fColor = volumeColor ? data.m_node->GetVolume()->GetLineColor() : data.m_color ;
305  buff.fTransparency = transparency;// data.m_node->GetVolume()->GetTransparency();
306 
307 
308  nm.GetHomogenousMatrix(buff.fLocalMaster);
309  buff.fLocalFrame = kTRUE; // Always enforce local frame (no geo manager).
310 
311  Int_t sections = TBuffer3D::kBoundingBox | TBuffer3D::kShapeSpecific;
312  shape->GetBuffer3D(sections, kTRUE);
313 
314  Int_t reqSec = gPad->GetViewer3D()->AddObject(phyID(tableIndex), buff);
315 
316  if (reqSec != TBuffer3D::kNone) {
317  // This shouldn't happen, but I suspect it does sometimes.
318  if (reqSec & TBuffer3D::kCore)
319  Warning(eh, "Core section required again for shape='%s'. This shouldn't happen.", GetName());
320  shape->GetBuffer3D(reqSec, kTRUE);
321  reqSec = gPad->GetViewer3D()->AddObject(phyID(tableIndex), buff);
322  }
323 
324  if (reqSec != TBuffer3D::kNone)
325  Warning(eh, "Extra section required: reqSec=%d, shape=%s.", reqSec, GetName());
326  }
327 }
328 
329 // ______________________________________________________________________
330 void FWGeoTopNode::Paint(Option_t* opt)
331 {
332  static const TEveException eh("FWGeoTopNode::Paint ");
333 
334  TBuffer3D buff(TBuffer3DTypes::kGeneric);
335 
336  // Section kCore
337  buff.fID = this;
338  buff.fColor = GetMainColor();
339  buff.fTransparency = GetMainTransparency();
340  if (HasMainTrans()) RefMainTrans().SetBuffer3D(buff);
341 
342  buff.SetSectionsValid(TBuffer3D::kCore);
343 
344  Int_t reqSections = gPad->GetViewer3D()->AddObject(1, buff);
345  if (reqSections != TBuffer3D::kNone)
346  {
347  Warning(eh, "IsA='%s'. Viewer3D requires more sections (%d). Only direct-rendering supported.",
348  ClassName(), reqSections);
349  }
350 }
351 
352 // ______________________________________________________________________
354 {
355  ClearSet(fSted);
356  for (FWGeometryTableManagerBase::Entries_i i = tableManager()->refEntries().begin(); i != tableManager()->refEntries().end(); ++i)
358 }
359 
360 // ______________________________________________________________________
362 {
363  ClearSet(fHted);
364  for (FWGeometryTableManagerBase::Entries_i i = tableManager()->refEntries().begin(); i != tableManager()->refEntries().end(); ++i)
366 }
367 
368 
369 // ______________________________________________________________________
370 FWPopupMenu* FWGeoTopNode::setPopupMenu(int iX, int iY, TGLViewer* v, bool overlap)
371 {
372  if (getFirstSelectedTableIndex() < 0)
373  {
374  if (fSted.empty()) fwLog(fwlog::kInfo) << "No menu -- no node/entry selected \n";
375  return 0;
376  }
377 
378  FWPopupMenu* nodePopup = new FWPopupMenu();
379 
380  nodePopup->AddEntry("Set As Top Node", kSetTopNode);
381  nodePopup->AddEntry("Set As Top Node And Reset Camera", kSetTopNodeCam);
382  nodePopup->AddSeparator();
383  if (v) {
384  nodePopup->AddEntry("Rnr Off", kVisSelfOff);
385  }
386  nodePopup->AddEntry("Rnr Off For All Children", kVisChldOff);
387  nodePopup->AddEntry("Rnr On For All Children", kVisChldOn);
388  nodePopup->AddSeparator();
389 
390  if (overlap)
391  nodePopup->AddEntry("Print Overlap", kPrintOverlap);
392  nodePopup->AddEntry("Print Path", kPrintPath);
393  nodePopup->AddEntry("Print Shape", kPrintShape);
394  nodePopup->AddEntry("Print Material", kPrintMaterial);
395 
396  nodePopup->AddSeparator();
397  if (v) {
398  Window_t wdummy;
399  Int_t x,y;
400  gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(), v->GetGLWidget()->GetId(), iX, iY, x, y, wdummy);
401  TGLVector3 pnt(x, y, 0.5*v->GetSelRec().GetMinZ());
402  v->CurrentCamera().WindowToViewport(pnt);
403  s_pickedCamera3DCenter = v->CurrentCamera().ViewportToWorld(pnt);
404  // s_pickedCamera3DCenter.Dump();
405  s_pickedViewer = v;
406 
407  nodePopup->AddEntry("Set Camera Center", kCamera);
408  }
409 
410  nodePopup->PlaceMenu(iX, iY,true,true);
411  return nodePopup;
412 }
413 
414 
416 {
417  if (isParentNode)
418  {
419  return TMath::Max((Char_t)browser()->getMinParentTransparency(), data.m_transparency) * browser()->getParentTransparencyFactor();
420  }
421  else
422  {
423  return TMath::Max((Char_t)browser()->getMinLeafTransparency(), data.m_transparency) * browser()->getLeafTransparencyFactor();
424  }
425 }
std::set< TGLPhysicalShape * > fSted
Definition: FWGeoTopNode.h:73
int i
Definition: DBlmapReader.cc:9
virtual FWGeometryTableManagerBase * tableManager()
Definition: FWGeoTopNode.h:69
void ClearSet(std::set< TGLPhysicalShape * > &sset)
Definition: FWGeoTopNode.cc:72
bool OpenCompositeWithPhyID(UInt_t phyID, const TBuffer3D &buffer)
virtual void Paint(Option_t *option="")
void printSelected()
void dataChanged()
Classes which inherit from FWTableManagerBase must call this when their underlying data changes...
int getFirstSelectedTableIndex()
bool overlap(const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
static const G4AffineTransform & GetTransform(const G4TouchableHistory *touchable, int depth)
FWGeoTopNodeGLScene * m_scene
Definition: FWGeoTopNode.h:67
UChar_t wrapTransparency(FWGeometryTableManagerBase::NodeInfo &data, bool leafNode)
unsigned char UChar_t
Definition: FUTypes.h:14
double f[11][100]
virtual void ComputeBBox()
unsigned int UInt_t
Definition: FUTypes.h:12
FWPopupMenu * setPopupMenu(int iX, int iY, TGLViewer *v, bool)
#define fwLog(_level_)
Definition: fwLog.h:51
virtual FWGeometryTableViewBase * browser()
Definition: FWGeoTopNode.h:70
bool selectPhysicalFromTable(int)
static TGLViewer * s_pickedViewer
Definition: FWGeoTopNode.h:86
std::set< TGLPhysicalShape * > fHted
Definition: FWGeoTopNode.h:72
void paintShape(Int_t idx, const TGeoHMatrix &nm, bool volumeColor, bool parentNode)
#define begin
Definition: vmac.h:31
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
virtual void UnHighlighted()
void EraseFromSet(std::set< TGLPhysicalShape * > &sset, TGLPhysicalShape *id)
Definition: FWGeoTopNode.cc:65
void ProcessSelection(TGLSelectRecord &rec, std::set< TGLPhysicalShape * > &sset, TGLPhysicalShape *id)
void SetStateOf(TGLPhysicalShape *id)
Definition: FWGeoTopNode.cc:82
Definition: DDAxes.h:10
static int tableIdx(TGLPhysicalShape *ps)
Definition: FWGeoTopNode.cc:60
virtual void UnSelected()
static TGLVector3 s_pickedCamera3DCenter
Definition: FWGeoTopNode.h:85
void setupBuffMtx(TBuffer3D &buff, const TGeoHMatrix &mat)
list at
Definition: asciidump.py:428
static UInt_t phyID(int tableIdx)
Definition: FWGeoTopNode.cc:54