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);