Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TEveGeoPolyShape.cxx
Go to the documentation of this file.
1 // @(#)root/eve:$Id$
2 // Author: Matevz Tadel 2007
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #include "TEveGeoPolyShape.h"
13 
14 #include "Rtypes.h"
15 #include "TEveGeoShape.h"
16 #include "TEvePad.h"
17 #include "TEveUtil.h"
18 
19 #include "TVirtualPad.h"
20 #include "TBuffer3D.h"
21 #include "TBuffer3DTypes.h"
22 #include "TGLScenePad.h"
23 #include "TGLFaceSet.h"
24 
25 #include "TList.h"
26 #include "TGeoBoolNode.h"
27 #include "TGeoCompositeShape.h"
28 #include "TGeoMatrix.h"
29 
30 /** \class TEveGeoPolyShape
31 \ingroup TEve
32 Description of TEveGeoPolyShape
33 */
34 
35 ClassImp(TEveGeoPolyShape);
36 
37 ////////////////////////////////////////////////////////////////////////////////
38 /// Constructor.
39 
40 TEveGeoPolyShape::TEveGeoPolyShape() :
41  TGeoBBox(),
42  fNbPols(0)
43 {
44 }
45 
46 ////////////////////////////////////////////////////////////////////////////////
47 /// Static constructor from a composite shape.
48 
49 TEveGeoPolyShape* TEveGeoPolyShape::Construct(TGeoCompositeShape *cshape, Int_t n_seg)
50 {
51  TEvePad pad;
52  TEvePadHolder gpad(kFALSE, &pad);
53  TGLScenePad scene_pad(&pad);
54  pad.GetListOfPrimitives()->Add(cshape);
55  pad.SetViewer3D(&scene_pad);
56 
57  TEveGeoManagerHolder gmgr(TEveGeoShape::GetGeoMangeur(), n_seg);
58 
59  scene_pad.BeginScene();
60  {
61  Double_t halfLengths[3] = { cshape->GetDX(), cshape->GetDY(), cshape->GetDZ() };
62 
63  TBuffer3D buff(TBuffer3DTypes::kComposite);
64  buff.fID = cshape;
65  buff.fLocalFrame = kTRUE;
66  buff.SetLocalMasterIdentity();
67  buff.SetAABoundingBox(cshape->GetOrigin(), halfLengths);
68  buff.SetSectionsValid(TBuffer3D::kCore|TBuffer3D::kBoundingBox);
69 
70  Bool_t paintComponents = kTRUE;
71 
72  // Start a composite shape, identified by this buffer
73  if (TBuffer3D::GetCSLevel() == 0)
74  paintComponents = gPad->GetViewer3D()->OpenComposite(buff);
75 
76  TBuffer3D::IncCSLevel();
77 
78  // Paint the boolean node - will add more buffers to viewer
79  TGeoMatrix *gst = TGeoShape::GetTransform();
80  TGeoShape::SetTransform(TEveGeoShape::GetGeoHMatrixIdentity());
81  if (paintComponents) cshape->GetBoolNode()->Paint("");
82  TGeoShape::SetTransform(gst);
83  // Close the composite shape
84  if (TBuffer3D::DecCSLevel() == 0)
85  gPad->GetViewer3D()->CloseComposite();
86  }
87  scene_pad.EndScene();
88  pad.SetViewer3D(0);
89 
90  TGLFaceSet* fs = dynamic_cast<TGLFaceSet*>(scene_pad.FindLogical(cshape));
91  if (!fs) {
92  ::Warning("TEveGeoPolyShape::Construct", "Failed extracting CSG tesselation for shape '%s'.", cshape->GetName());
93  return 0;
94  }
95 
96  TEveGeoPolyShape *egps = new TEveGeoPolyShape;
97  egps->SetFromFaceSet(fs);
98  egps->fOrigin[0] = cshape->GetOrigin()[0];
99  egps->fOrigin[1] = cshape->GetOrigin()[1];
100  egps->fOrigin[2] = cshape->GetOrigin()[2];
101  egps->fDX = cshape->GetDX();
102  egps->fDY = cshape->GetDY();
103  egps->fDZ = cshape->GetDZ();
104 
105  return egps;
106 }
107 
108 ////////////////////////////////////////////////////////////////////////////////
109 /// Set data-members from a face-set.
110 
111 void TEveGeoPolyShape::SetFromFaceSet(TGLFaceSet* fs)
112 {
113  fVertices = fs->GetVertices();
114  fPolyDesc = fs->GetPolyDesc();
115  fNbPols = fs->GetNbPols();
116 }
117 
118 ////////////////////////////////////////////////////////////////////////////////
119 /// Fill the passed buffer 3D.
120 
121 void TEveGeoPolyShape::FillBuffer3D(TBuffer3D& b, Int_t reqSections, Bool_t) const
122 {
123  if (reqSections & TBuffer3D::kCore)
124  {
125  // If writing core section all others will be invalid
126  b.ClearSectionsValid();
127 
128  b.fID = const_cast<TEveGeoPolyShape*>(this);
129  b.fColor = 0;
130  b.fTransparency = 0;
131  b.fLocalFrame = kFALSE;
132  b.fReflection = kTRUE;
133 
134  b.SetSectionsValid(TBuffer3D::kCore);
135  }
136 
137  if (reqSections & TBuffer3D::kRawSizes || reqSections & TBuffer3D::kRaw)
138  {
139  UInt_t nvrt = fVertices.size() / 3;
140  UInt_t nseg = 0;
141 
142  std::map<Edge_t, Int_t> edges;
143 
144  const Int_t *pd = &fPolyDesc[0];
145  for (UInt_t i = 0; i < fNbPols; ++i)
146  {
147  UInt_t nv = pd[0]; ++pd;
148  for (UInt_t j = 0; j < nv; ++j)
149  {
150  Edge_t e(pd[j], (j != nv - 1) ? pd[j+1] : pd[0]);
151  if (edges.find(e) == edges.end())
152  {
153  edges.insert(std::make_pair(e, 0));
154  ++nseg;
155  }
156  }
157  pd += nv;
158  }
159 
160  b.SetRawSizes(nvrt, 3*nvrt, nseg, 3*nseg, fNbPols, fNbPols+fPolyDesc.size());
161 
162  memcpy(b.fPnts, &fVertices[0], sizeof(Double_t)*fVertices.size());
163 
164  Int_t si = 0, scnt = 0;
165  for (std::map<Edge_t, Int_t>::iterator i = edges.begin(); i != edges.end(); ++i)
166  {
167  b.fSegs[si++] = 0;
168  b.fSegs[si++] = i->first.fI;
169  b.fSegs[si++] = i->first.fJ;
170  i->second = scnt++;
171  }
172 
173  Int_t pi = 0;
174  pd = &fPolyDesc[0];
175  for (UInt_t i = 0; i < fNbPols; ++i)
176  {
177  UInt_t nv = pd[0]; ++pd;
178  b.fPols[pi++] = 0;
179  b.fPols[pi++] = nv;
180  for (UInt_t j = 0; j < nv; ++j)
181  {
182  b.fPols[pi++] = edges[Edge_t(pd[j], (j != nv - 1) ? pd[j+1] : pd[0])];
183  }
184  pd += nv;
185  }
186 
187 
188 
189  b.SetSectionsValid(TBuffer3D::kRawSizes | TBuffer3D::kRaw);
190  }
191 }
192 
193 ////////////////////////////////////////////////////////////////////////////////
194 /// Fill static buffer 3D.
195 
196 const TBuffer3D& TEveGeoPolyShape::GetBuffer3D(Int_t reqSections, Bool_t localFrame) const
197 {
198  static TBuffer3D buf(TBuffer3DTypes::kGeneric);
199 
200  FillBuffer3D(buf, reqSections, localFrame);
201 
202  return buf;
203 }
204 
205 ////////////////////////////////////////////////////////////////////////////////
206 /// Create buffer 3D and fill it with point/segment/poly data.
207 
208 TBuffer3D* TEveGeoPolyShape::MakeBuffer3D() const
209 {
210  TBuffer3D* buf = new TBuffer3D(TBuffer3DTypes::kGeneric);
211 
212  FillBuffer3D(*buf, TBuffer3D::kCore | TBuffer3D::kRawSizes | TBuffer3D::kRaw, kFALSE);
213 
214  return buf;
215 }