#include "TEveBoxSet.h"
#include "TRandom.h"
#include "TBuffer3D.h"
#include "TBuffer3DTypes.h"
#include "TVirtualPad.h"
#include "TVirtualViewer3D.h"
ClassImp(TEveBoxSet)
TEveBoxSet::TEveBoxSet(const Text_t* n, const Text_t* t) :
   TEveDigitSet  (n, t),
   fBoxType      (kBT_Undef),
   fDefWidth     (1),
   fDefHeight    (1),
   fDefDepth     (1)
{
   
   
   fDisableLigting = kFALSE;
}
Int_t TEveBoxSet::SizeofAtom(TEveBoxSet::EBoxType_e bt)
{
   
   static const TEveException eH("TEveBoxSet::SizeofAtom ");
   switch (bt) {
      case kBT_Undef:                return 0;
      case kBT_FreeBox:              return sizeof(BFreeBox_t);
      case kBT_AABox:                return sizeof(BAABox_t);
      case kBT_AABoxFixedDim:        return sizeof(BAABoxFixedDim_t);
      default:                      throw(eH + "unexpected atom type.");
   }
   return 0;
}
void TEveBoxSet::Reset(TEveBoxSet::EBoxType_e boxType, Bool_t valIsCol, Int_t chunkSize)
{
   
   
   fBoxType      = boxType;
   fValueIsColor = valIsCol;
   fDefaultValue = valIsCol ? 0 : kMinInt;
   if (fOwnIds)
      ReleaseIds();
   fPlex.Reset(SizeofAtom(fBoxType), chunkSize);
}
void TEveBoxSet::Reset()
{
   
   
   if (fOwnIds)
      ReleaseIds();
   fPlex.Reset(SizeofAtom(fBoxType), TMath::Max(fPlex.N(), 64));
}
void TEveBoxSet::AddBox(const Float_t* verts)
{
   
   
   static const TEveException eH("TEveBoxSet::AddBox ");
   if (fBoxType != kBT_FreeBox)
      throw(eH + "expect free box-type.");
   BFreeBox_t* b = (BFreeBox_t*) NewDigit();
   memcpy(b->fVertices, verts, sizeof(b->fVertices));
}
void TEveBoxSet::AddBox(Float_t a, Float_t b, Float_t c, Float_t w, Float_t h, Float_t d)
{
   
   
   
   static const TEveException eH("TEveBoxSet::AddBox ");
   if (fBoxType != kBT_AABox)
      throw(eH + "expect axis-aligned box-type.");
   BAABox_t* box = (BAABox_t*) NewDigit();
   box->fA = a; box->fB = b; box->fC = c;
   box->fW = w; box->fH = h; box->fD = d;
}
void TEveBoxSet::AddBox(Float_t a, Float_t b, Float_t c)
{
   
   
   static const TEveException eH("TEveBoxSet::AddBox ");
   if (fBoxType != kBT_AABoxFixedDim)
      throw(eH + "expect axis-aligned fixed-dimension box-type.");
   BAABoxFixedDim_t* box = (BAABoxFixedDim_t*) NewDigit();
   box->fA = a; box->fB = b; box->fC = c;
}
void TEveBoxSet::ComputeBBox()
{
   
   
   static const TEveException eH("TEveBoxSet::ComputeBBox ");
   if (fFrame != 0)
   {
      BBoxInit();
      Int_t    n    = fFrame->GetFrameSize() / 3;
      Float_t *bbps = fFrame->GetFramePoints();
      for (int i=0; i<n; ++i, bbps+=3)
         BBoxCheckPoint(bbps);
      return;
   }
   if(fPlex.Size() == 0)
   {
      BBoxZero();
      return;
   }
   BBoxInit();
   TEveChunkManager::iterator bi(fPlex);
   switch (fBoxType)
   {
      case kBT_FreeBox:
      {
         while (bi.next()) {
            BFreeBox_t& b = * (BFreeBox_t*) bi();
            Float_t * p = b.fVertices;
            for(int i=0; i<8; ++i, p+=3)
               BBoxCheckPoint(p);
         }
         break;
      }
      case kBT_AABox:
      {
         while (bi.next()) {
            BAABox_t& b = * (BAABox_t*) bi();
            BBoxCheckPoint(b.fA, b.fB, b.fC);
            BBoxCheckPoint(b.fA + b.fW, b.fB + b.fH , b.fC + b.fD);
         }
         break;
      }
      case kBT_AABoxFixedDim:
      {
         while (bi.next()) {
            BAABoxFixedDim_t& b = * (BAABoxFixedDim_t*) bi();
            BBoxCheckPoint(b.fA, b.fB, b.fC);
            BBoxCheckPoint(b.fA + fDefWidth, b.fB + fDefHeight , b.fC + fDefDepth);
         }
         break;
      }
      default:
      {
         throw(eH + "unsupported box-type.");
      }
   } 
   printf("%s BBox is x(%f,%f), y(%f,%f), z(%f,%f)\n", GetName(),
          fBBox[0], fBBox[1], fBBox[2], fBBox[3], fBBox[4], fBBox[5]);
}
void TEveBoxSet::Test(Int_t nboxes)
{
   
   Reset(kBT_AABox, kTRUE, nboxes);
   TRandom rnd(0);
   const Float_t origin = 10, size = 2;
   Int_t color;
   for(Int_t i=0; i<nboxes; ++i)
   {
      AddBox(origin * rnd.Uniform(-1, 1),
             origin * rnd.Uniform(-1, 1),
             origin * rnd.Uniform(-1, 1),
             size   * rnd.Uniform(0.1, 1),
             size   * rnd.Uniform(0.1, 1),
             size   * rnd.Uniform(0.1, 1));
      TEveUtil::ColorFromIdx(rnd.Integer(256), (UChar_t*)&color);
      DigitValue(color);
   }
}
Last update: Thu Jan 17 08:48:12 2008
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.