46 TEveBoxSet::TEveBoxSet(
const char* n,
const char* t) :
61 fDisableLighting = kFALSE;
67 Int_t TEveBoxSet::SizeofAtom(TEveBoxSet::EBoxType_e bt)
69 static const TEveException eH(
"TEveBoxSet::SizeofAtom ");
72 case kBT_Undef:
return 0;
73 case kBT_FreeBox:
return sizeof(BFreeBox_t);
74 case kBT_AABox:
return sizeof(BAABox_t);
75 case kBT_AABoxFixedDim:
return sizeof(BAABoxFixedDim_t);
76 case kBT_Cone:
return sizeof(BCone_t);
77 case kBT_EllipticCone:
return sizeof(BEllipticCone_t);
78 case kBT_Hex:
return sizeof(BHex_t);
79 default:
throw(eH +
"unexpected atom type.");
88 void TEveBoxSet::Reset(TEveBoxSet::EBoxType_e boxType, Bool_t valIsCol, Int_t chunkSize)
91 fValueIsColor = valIsCol;
92 fDefaultValue = valIsCol ? 0 : kMinInt;
95 fPlex.Reset(SizeofAtom(fBoxType), chunkSize);
102 void TEveBoxSet::Reset()
106 fPlex.Reset(SizeofAtom(fBoxType), TMath::Max(fPlex.N(), 64));
113 void TEveBoxSet::AddBox(
const Float_t* verts)
115 static const TEveException eH(
"TEveBoxSet::AddBox ");
117 if (fBoxType != kBT_FreeBox)
118 throw(eH +
"expect free box-type.");
120 BFreeBox_t* b = (BFreeBox_t*) NewDigit();
121 memcpy(b->fVertices, verts,
sizeof(b->fVertices));
122 TEveShape::CheckAndFixBoxOrientationFv(b->fVertices);
130 void TEveBoxSet::AddBox(Float_t a, Float_t b, Float_t c, Float_t w, Float_t h, Float_t d)
132 static const TEveException eH(
"TEveBoxSet::AddBox ");
134 if (fBoxType != kBT_AABox)
135 throw(eH +
"expect axis-aligned box-type.");
137 BAABox_t* box = (BAABox_t*) NewDigit();
138 box->fA = a; box->fB = b; box->fC = c;
139 box->fW = w; box->fH = h; box->fD = d;
146 void TEveBoxSet::AddBox(Float_t a, Float_t b, Float_t c)
148 static const TEveException eH(
"TEveBoxSet::AddBox ");
150 if (fBoxType != kBT_AABoxFixedDim)
151 throw(eH +
"expect axis-aligned fixed-dimension box-type.");
153 BAABoxFixedDim_t* box = (BAABoxFixedDim_t*) NewDigit();
154 box->fA = a; box->fB = b; box->fC = c;
161 void TEveBoxSet::AddCone(
const TEveVector& pos,
const TEveVector& dir, Float_t r)
163 static const TEveException eH(
"TEveBoxSet::AddCone ");
165 if (fBoxType != kBT_Cone)
166 throw(eH +
"expect cone box-type.");
168 BCone_t* cone = (BCone_t*) NewDigit();
178 void TEveBoxSet::AddEllipticCone(
const TEveVector& pos,
const TEveVector& dir,
179 Float_t r, Float_t r2, Float_t angle)
181 static const TEveException eH(
"TEveBoxSet::AddEllipticCone ");
183 if (fBoxType != kBT_EllipticCone)
184 throw(eH +
"expect elliptic-cone box-type.");
186 BEllipticCone_t* cone = (BEllipticCone_t*) NewDigit();
191 cone->fAngle = angle;
199 void TEveBoxSet::AddHex(
const TEveVector& pos, Float_t r, Float_t angle, Float_t depth)
201 static const TEveException eH(
"TEveBoxSet::AddEllipticCone ");
203 if (fBoxType != kBT_Hex)
204 throw(eH +
"expect hex box-type.");
206 BHex_t* hex = (BHex_t*) NewDigit();
217 void TEveBoxSet::ComputeBBox()
219 static const TEveException eH(
"TEveBoxSet::ComputeBBox ");
224 Int_t n = fFrame->GetFrameSize() / 3;
225 Float_t *bbps = fFrame->GetFramePoints();
226 for (
int i=0; i<n; ++i, bbps+=3)
227 BBoxCheckPoint(bbps);
231 if(fPlex.Size() == 0)
239 TEveChunkManager::iterator bi(fPlex);
246 BFreeBox_t& b = * (BFreeBox_t*) bi();
247 for (Int_t i = 0; i < 8; ++i)
248 BBoxCheckPoint(b.fVertices[i]);
256 BAABox_t& b = * (BAABox_t*) bi();
257 BBoxCheckPoint(b.fA, b.fB, b.fC);
258 BBoxCheckPoint(b.fA + b.fW, b.fB + b.fH , b.fC + b.fD);
263 case kBT_AABoxFixedDim:
266 BAABoxFixedDim_t& b = * (BAABoxFixedDim_t*) bi();
267 BBoxCheckPoint(b.fA, b.fB, b.fC);
268 BBoxCheckPoint(b.fA + fDefWidth, b.fB + fDefHeight , b.fC + fDefDepth);
275 Float_t mag2=0, mag2Max=0, rMax=0;
277 BCone_t& b = * (BCone_t*) bi();
278 BBoxCheckPoint(b.fPos.fX, b.fPos.fY, b.fPos.fZ);
279 mag2 = b.fDir.Mag2();
280 if (mag2>mag2Max) mag2Max=mag2;
281 if (b.fR>rMax) rMax=b.fR;
283 Float_t off = TMath::Sqrt(mag2Max + rMax*rMax);
284 fBBox[0] -= off;fBBox[2] -= off;fBBox[4] -= off;
285 fBBox[1] += off;fBBox[3] += off;fBBox[5] += off;
289 case kBT_EllipticCone:
291 Float_t mag2=0, mag2Max=0, rMax=0;
293 BEllipticCone_t& b = * (BEllipticCone_t*) bi();
294 BBoxCheckPoint(b.fPos.fX, b.fPos.fY, b.fPos.fZ);
295 mag2 = b.fDir.Mag2();
296 if (mag2>mag2Max) mag2Max=mag2;
297 if (b.fR > rMax) rMax = b.fR;
298 if (b.fR2 > rMax) rMax = b.fR2;
300 Float_t off = TMath::Sqrt(mag2Max + rMax*rMax);
301 fBBox[0] -= off;fBBox[2] -= off;fBBox[4] -= off;
302 fBBox[1] += off;fBBox[3] += off;fBBox[5] += off;
309 BHex_t& h = * (BHex_t*) bi();
310 BBoxCheckPoint(h.fPos.fX - h.fR, h.fPos.fY - h.fR, h.fPos.fZ);
311 BBoxCheckPoint(h.fPos.fX + h.fR, h.fPos.fY - h.fR, h.fPos.fZ);
312 BBoxCheckPoint(h.fPos.fX + h.fR, h.fPos.fY + h.fR, h.fPos.fZ);
313 BBoxCheckPoint(h.fPos.fX - h.fR, h.fPos.fY + h.fR, h.fPos.fZ);
314 BBoxCheckPoint(h.fPos.fX - h.fR, h.fPos.fY - h.fR, h.fPos.fZ + h.fDepth);
315 BBoxCheckPoint(h.fPos.fX + h.fR, h.fPos.fY - h.fR, h.fPos.fZ + h.fDepth);
316 BBoxCheckPoint(h.fPos.fX + h.fR, h.fPos.fY + h.fR, h.fPos.fZ + h.fDepth);
317 BBoxCheckPoint(h.fPos.fX - h.fR, h.fPos.fY + h.fR, h.fPos.fZ + h.fDepth);
324 throw(eH +
"unsupported box-type.");
333 void TEveBoxSet::Test(Int_t nboxes)
335 Reset(kBT_AABox, kTRUE, nboxes);
337 const Float_t origin = 10, size = 2;
339 for(Int_t i=0; i<nboxes; ++i)
341 AddBox(origin * rnd.Uniform(-1, 1),
342 origin * rnd.Uniform(-1, 1),
343 origin * rnd.Uniform(-1, 1),
344 size * rnd.Uniform(0.1, 1),
345 size * rnd.Uniform(0.1, 1),
346 size * rnd.Uniform(0.1, 1));
348 TEveUtil::ColorFromIdx(rnd.Integer(256), (UChar_t*)&color);