ROOT logo
// @(#)root/eve:$Id: TEveBoxSet.cxx 27157 2009-01-15 14:05:12Z brun $
// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TEveBoxSet.h"
#include "TRandom.h"
#include "TBuffer3D.h"
#include "TBuffer3DTypes.h"
#include "TVirtualPad.h"
#include "TVirtualViewer3D.h"

//==============================================================================
// TEveBoxSet
//==============================================================================

//______________________________________________________________________________
//
// Collection of 3D primitives (fixed-size boxes, boxes of different
// sizes, or arbitrary sexto-epipeds, cones); each primitive can be assigned
// a signal value and a TRef.
//
// A collection of 3D-markers. The way how they are defined depends
// on the fBoxType data-member.
//   kBT_FreeBox         arbitrary box: specify 8*(x,y,z) box corners
//   kBT_AABox           axis-aligned box: specify (x,y,z) and (w, h, d)
//   kBT_AABoxFixedDim   axis-aligned box w/ fixed dimensions: specify (x,y,z)
//                       also set fDefWidth, fDefHeight and fDefDepth
//   kBT_Cone            cone defined with position, axis-vector and radius
//   EllipticCone        conew with elliptic base (specify another radius and angle in deg)
//
// Each primitive can be assigned:
// a) Color or signal value. Thresholds and signal-to-color mapping
//    can then be set dynamically via the TEveRGBAPalette class.
// b) External TObject* (stored as TRef).
//
// See also base-class TEveDigitSet for more information.
// Tutorial: tutorials/eve/boxset_test.C


ClassImp(TEveBoxSet);

//______________________________________________________________________________
TEveBoxSet::TEveBoxSet(const char* n, const char* t) :
   TEveDigitSet  (n, t),

   fBoxType      (kBT_Undef),
   fDefWidth     (1),
   fDefHeight    (1),
   fDefDepth     (1),

   fDrawConeCap  (kFALSE)
{
   // Constructor.

   // Override from TEveDigitSet.
   fDisableLigting = kFALSE;
}

/******************************************************************************/

//______________________________________________________________________________
Int_t TEveBoxSet::SizeofAtom(TEveBoxSet::EBoxType_e bt)
{
   // Return size of data-structure describing a box of type 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);
      case kBT_Cone:                 return sizeof(BCone_t);
      case kBT_EllipticCone:         return sizeof(BEllipticCone_t);
      default:                       throw(eH + "unexpected atom type.");
   }
   return 0;
}

/******************************************************************************/

//______________________________________________________________________________
void TEveBoxSet::Reset(TEveBoxSet::EBoxType_e boxType, Bool_t valIsCol, Int_t chunkSize)
{
   // Reset the data containers to zero size.
   // The arguments describe the basic parameters of data storage.

   fBoxType      = boxType;
   fValueIsColor = valIsCol;
   fDefaultValue = valIsCol ? 0 : kMinInt;
   if (fOwnIds)
      ReleaseIds();
   fPlex.Reset(SizeofAtom(fBoxType), chunkSize);
}

//______________________________________________________________________________
void TEveBoxSet::Reset()
{
   // Reset the data containers to zero size.
   // Keep the old data-storage parameters.

   if (fOwnIds)
      ReleaseIds();
   fPlex.Reset(SizeofAtom(fBoxType), TMath::Max(fPlex.N(), 64));
}

/******************************************************************************/

//______________________________________________________________________________
void TEveBoxSet::AddBox(const Float_t* verts)
{
   // Create a new box from a set of 8 vertices.
   // To be used for box-type kBT_FreeBox.

   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)
{
   // Create a new axis-aligned box from at a given position and with
   // specified dimensions.
   // To be used for box-type kBT_AABox.

   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)
{
   // Create a new axis-aligned box from at a given position.
   // To be used for box-type kBT_AABoxFixedDim.

   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::AddCone(const TEveVector& pos, const TEveVector& dir, Float_t r)
{
   // Create a cone with apex at pos, axis dir and radius r.
   // To be used for box-type kBT_Cone.

   static const TEveException eH("TEveBoxSet::AddCone ");

   if (fBoxType != kBT_Cone)
      throw(eH + "expect cone box-type.");

   BCone_t* cone = (BCone_t*) NewDigit();
   cone->fPos = pos;
   cone->fDir = dir;
   cone->fR   = r;
}

//______________________________________________________________________________
void TEveBoxSet::AddEllipticCone(const TEveVector& pos, const TEveVector& dir,
                                 Float_t r, Float_t r2, Float_t angle)
{
   // Create a cone with apex at pos, axis dir and radius r.
   // To be used for box-type kBT_Cone.

   static const TEveException eH("TEveBoxSet::AddEllipticCone ");

   if (fBoxType != kBT_EllipticCone)
      throw(eH + "expect ellicptic-cone box-type.");

   BEllipticCone_t* cone = (BEllipticCone_t*) NewDigit();
   cone->fPos = pos;
   cone->fDir = dir;
   cone->fR   = r;
   cone->fR2  = r2;
   cone->fAngle = angle;
}

/******************************************************************************/

//______________________________________________________________________________
void TEveBoxSet::ComputeBBox()
{
   // Fill bounding-box information of the base-class TAttBBox (virtual method).
   // If member 'TEveFrameBox* fFrame' is set, frame's corners are used as bbox.

   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;
      }
      case kBT_Cone:
      {
         Float_t mag2=0, mag2Max=0, rMax=0;
         while (bi.next()) {
            BCone_t& b = * (BCone_t*) bi();
            BBoxCheckPoint(b.fPos.fX, b.fPos.fY, b.fPos.fZ);
            mag2 = b.fDir.Mag2();
            if (mag2>mag2Max) mag2Max=mag2;
            if (b.fR>rMax)    rMax=b.fR;
         }
         Float_t off = TMath::Sqrt(mag2Max + rMax*rMax);
         fBBox[0] -= off;fBBox[2] -= off;fBBox[4] -= off;
         fBBox[1] += off;fBBox[3] += off;fBBox[5] += off;
         break;
      }
      case kBT_EllipticCone:
      {
         Float_t mag2=0, mag2Max=0, rMax=0;
         while (bi.next()) {
            BEllipticCone_t& b = * (BEllipticCone_t*) bi();
            BBoxCheckPoint(b.fPos.fX, b.fPos.fY, b.fPos.fZ);
            mag2 = b.fDir.Mag2();
            if (mag2>mag2Max) mag2Max=mag2;
            if (b.fR  > rMax) rMax = b.fR;
            if (b.fR2 > rMax) rMax = b.fR2;
         }
         Float_t off = TMath::Sqrt(mag2Max + rMax*rMax);
         fBBox[0] -= off;fBBox[2] -= off;fBBox[4] -= off;
         fBBox[1] += off;fBBox[3] += off;fBBox[5] += off;
         break;
      }
      default:
      {
         throw(eH + "unsupported box-type.");
      }

   } // end switch box-type
}

/******************************************************************************/

//______________________________________________________________________________
void TEveBoxSet::Test(Int_t nboxes)
{
   // Fill the structure with a random set of boxes.

   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);
   }
}
 TEveBoxSet.cxx:1
 TEveBoxSet.cxx:2
 TEveBoxSet.cxx:3
 TEveBoxSet.cxx:4
 TEveBoxSet.cxx:5
 TEveBoxSet.cxx:6
 TEveBoxSet.cxx:7
 TEveBoxSet.cxx:8
 TEveBoxSet.cxx:9
 TEveBoxSet.cxx:10
 TEveBoxSet.cxx:11
 TEveBoxSet.cxx:12
 TEveBoxSet.cxx:13
 TEveBoxSet.cxx:14
 TEveBoxSet.cxx:15
 TEveBoxSet.cxx:16
 TEveBoxSet.cxx:17
 TEveBoxSet.cxx:18
 TEveBoxSet.cxx:19
 TEveBoxSet.cxx:20
 TEveBoxSet.cxx:21
 TEveBoxSet.cxx:22
 TEveBoxSet.cxx:23
 TEveBoxSet.cxx:24
 TEveBoxSet.cxx:25
 TEveBoxSet.cxx:26
 TEveBoxSet.cxx:27
 TEveBoxSet.cxx:28
 TEveBoxSet.cxx:29
 TEveBoxSet.cxx:30
 TEveBoxSet.cxx:31
 TEveBoxSet.cxx:32
 TEveBoxSet.cxx:33
 TEveBoxSet.cxx:34
 TEveBoxSet.cxx:35
 TEveBoxSet.cxx:36
 TEveBoxSet.cxx:37
 TEveBoxSet.cxx:38
 TEveBoxSet.cxx:39
 TEveBoxSet.cxx:40
 TEveBoxSet.cxx:41
 TEveBoxSet.cxx:42
 TEveBoxSet.cxx:43
 TEveBoxSet.cxx:44
 TEveBoxSet.cxx:45
 TEveBoxSet.cxx:46
 TEveBoxSet.cxx:47
 TEveBoxSet.cxx:48
 TEveBoxSet.cxx:49
 TEveBoxSet.cxx:50
 TEveBoxSet.cxx:51
 TEveBoxSet.cxx:52
 TEveBoxSet.cxx:53
 TEveBoxSet.cxx:54
 TEveBoxSet.cxx:55
 TEveBoxSet.cxx:56
 TEveBoxSet.cxx:57
 TEveBoxSet.cxx:58
 TEveBoxSet.cxx:59
 TEveBoxSet.cxx:60
 TEveBoxSet.cxx:61
 TEveBoxSet.cxx:62
 TEveBoxSet.cxx:63
 TEveBoxSet.cxx:64
 TEveBoxSet.cxx:65
 TEveBoxSet.cxx:66
 TEveBoxSet.cxx:67
 TEveBoxSet.cxx:68
 TEveBoxSet.cxx:69
 TEveBoxSet.cxx:70
 TEveBoxSet.cxx:71
 TEveBoxSet.cxx:72
 TEveBoxSet.cxx:73
 TEveBoxSet.cxx:74
 TEveBoxSet.cxx:75
 TEveBoxSet.cxx:76
 TEveBoxSet.cxx:77
 TEveBoxSet.cxx:78
 TEveBoxSet.cxx:79
 TEveBoxSet.cxx:80
 TEveBoxSet.cxx:81
 TEveBoxSet.cxx:82
 TEveBoxSet.cxx:83
 TEveBoxSet.cxx:84
 TEveBoxSet.cxx:85
 TEveBoxSet.cxx:86
 TEveBoxSet.cxx:87
 TEveBoxSet.cxx:88
 TEveBoxSet.cxx:89
 TEveBoxSet.cxx:90
 TEveBoxSet.cxx:91
 TEveBoxSet.cxx:92
 TEveBoxSet.cxx:93
 TEveBoxSet.cxx:94
 TEveBoxSet.cxx:95
 TEveBoxSet.cxx:96
 TEveBoxSet.cxx:97
 TEveBoxSet.cxx:98
 TEveBoxSet.cxx:99
 TEveBoxSet.cxx:100
 TEveBoxSet.cxx:101
 TEveBoxSet.cxx:102
 TEveBoxSet.cxx:103
 TEveBoxSet.cxx:104
 TEveBoxSet.cxx:105
 TEveBoxSet.cxx:106
 TEveBoxSet.cxx:107
 TEveBoxSet.cxx:108
 TEveBoxSet.cxx:109
 TEveBoxSet.cxx:110
 TEveBoxSet.cxx:111
 TEveBoxSet.cxx:112
 TEveBoxSet.cxx:113
 TEveBoxSet.cxx:114
 TEveBoxSet.cxx:115
 TEveBoxSet.cxx:116
 TEveBoxSet.cxx:117
 TEveBoxSet.cxx:118
 TEveBoxSet.cxx:119
 TEveBoxSet.cxx:120
 TEveBoxSet.cxx:121
 TEveBoxSet.cxx:122
 TEveBoxSet.cxx:123
 TEveBoxSet.cxx:124
 TEveBoxSet.cxx:125
 TEveBoxSet.cxx:126
 TEveBoxSet.cxx:127
 TEveBoxSet.cxx:128
 TEveBoxSet.cxx:129
 TEveBoxSet.cxx:130
 TEveBoxSet.cxx:131
 TEveBoxSet.cxx:132
 TEveBoxSet.cxx:133
 TEveBoxSet.cxx:134
 TEveBoxSet.cxx:135
 TEveBoxSet.cxx:136
 TEveBoxSet.cxx:137
 TEveBoxSet.cxx:138
 TEveBoxSet.cxx:139
 TEveBoxSet.cxx:140
 TEveBoxSet.cxx:141
 TEveBoxSet.cxx:142
 TEveBoxSet.cxx:143
 TEveBoxSet.cxx:144
 TEveBoxSet.cxx:145
 TEveBoxSet.cxx:146
 TEveBoxSet.cxx:147
 TEveBoxSet.cxx:148
 TEveBoxSet.cxx:149
 TEveBoxSet.cxx:150
 TEveBoxSet.cxx:151
 TEveBoxSet.cxx:152
 TEveBoxSet.cxx:153
 TEveBoxSet.cxx:154
 TEveBoxSet.cxx:155
 TEveBoxSet.cxx:156
 TEveBoxSet.cxx:157
 TEveBoxSet.cxx:158
 TEveBoxSet.cxx:159
 TEveBoxSet.cxx:160
 TEveBoxSet.cxx:161
 TEveBoxSet.cxx:162
 TEveBoxSet.cxx:163
 TEveBoxSet.cxx:164
 TEveBoxSet.cxx:165
 TEveBoxSet.cxx:166
 TEveBoxSet.cxx:167
 TEveBoxSet.cxx:168
 TEveBoxSet.cxx:169
 TEveBoxSet.cxx:170
 TEveBoxSet.cxx:171
 TEveBoxSet.cxx:172
 TEveBoxSet.cxx:173
 TEveBoxSet.cxx:174
 TEveBoxSet.cxx:175
 TEveBoxSet.cxx:176
 TEveBoxSet.cxx:177
 TEveBoxSet.cxx:178
 TEveBoxSet.cxx:179
 TEveBoxSet.cxx:180
 TEveBoxSet.cxx:181
 TEveBoxSet.cxx:182
 TEveBoxSet.cxx:183
 TEveBoxSet.cxx:184
 TEveBoxSet.cxx:185
 TEveBoxSet.cxx:186
 TEveBoxSet.cxx:187
 TEveBoxSet.cxx:188
 TEveBoxSet.cxx:189
 TEveBoxSet.cxx:190
 TEveBoxSet.cxx:191
 TEveBoxSet.cxx:192
 TEveBoxSet.cxx:193
 TEveBoxSet.cxx:194
 TEveBoxSet.cxx:195
 TEveBoxSet.cxx:196
 TEveBoxSet.cxx:197
 TEveBoxSet.cxx:198
 TEveBoxSet.cxx:199
 TEveBoxSet.cxx:200
 TEveBoxSet.cxx:201
 TEveBoxSet.cxx:202
 TEveBoxSet.cxx:203
 TEveBoxSet.cxx:204
 TEveBoxSet.cxx:205
 TEveBoxSet.cxx:206
 TEveBoxSet.cxx:207
 TEveBoxSet.cxx:208
 TEveBoxSet.cxx:209
 TEveBoxSet.cxx:210
 TEveBoxSet.cxx:211
 TEveBoxSet.cxx:212
 TEveBoxSet.cxx:213
 TEveBoxSet.cxx:214
 TEveBoxSet.cxx:215
 TEveBoxSet.cxx:216
 TEveBoxSet.cxx:217
 TEveBoxSet.cxx:218
 TEveBoxSet.cxx:219
 TEveBoxSet.cxx:220
 TEveBoxSet.cxx:221
 TEveBoxSet.cxx:222
 TEveBoxSet.cxx:223
 TEveBoxSet.cxx:224
 TEveBoxSet.cxx:225
 TEveBoxSet.cxx:226
 TEveBoxSet.cxx:227
 TEveBoxSet.cxx:228
 TEveBoxSet.cxx:229
 TEveBoxSet.cxx:230
 TEveBoxSet.cxx:231
 TEveBoxSet.cxx:232
 TEveBoxSet.cxx:233
 TEveBoxSet.cxx:234
 TEveBoxSet.cxx:235
 TEveBoxSet.cxx:236
 TEveBoxSet.cxx:237
 TEveBoxSet.cxx:238
 TEveBoxSet.cxx:239
 TEveBoxSet.cxx:240
 TEveBoxSet.cxx:241
 TEveBoxSet.cxx:242
 TEveBoxSet.cxx:243
 TEveBoxSet.cxx:244
 TEveBoxSet.cxx:245
 TEveBoxSet.cxx:246
 TEveBoxSet.cxx:247
 TEveBoxSet.cxx:248
 TEveBoxSet.cxx:249
 TEveBoxSet.cxx:250
 TEveBoxSet.cxx:251
 TEveBoxSet.cxx:252
 TEveBoxSet.cxx:253
 TEveBoxSet.cxx:254
 TEveBoxSet.cxx:255
 TEveBoxSet.cxx:256
 TEveBoxSet.cxx:257
 TEveBoxSet.cxx:258
 TEveBoxSet.cxx:259
 TEveBoxSet.cxx:260
 TEveBoxSet.cxx:261
 TEveBoxSet.cxx:262
 TEveBoxSet.cxx:263
 TEveBoxSet.cxx:264
 TEveBoxSet.cxx:265
 TEveBoxSet.cxx:266
 TEveBoxSet.cxx:267
 TEveBoxSet.cxx:268
 TEveBoxSet.cxx:269
 TEveBoxSet.cxx:270
 TEveBoxSet.cxx:271
 TEveBoxSet.cxx:272
 TEveBoxSet.cxx:273
 TEveBoxSet.cxx:274
 TEveBoxSet.cxx:275
 TEveBoxSet.cxx:276
 TEveBoxSet.cxx:277
 TEveBoxSet.cxx:278
 TEveBoxSet.cxx:279
 TEveBoxSet.cxx:280
 TEveBoxSet.cxx:281
 TEveBoxSet.cxx:282
 TEveBoxSet.cxx:283
 TEveBoxSet.cxx:284
 TEveBoxSet.cxx:285
 TEveBoxSet.cxx:286
 TEveBoxSet.cxx:287
 TEveBoxSet.cxx:288
 TEveBoxSet.cxx:289
 TEveBoxSet.cxx:290
 TEveBoxSet.cxx:291
 TEveBoxSet.cxx:292
 TEveBoxSet.cxx:293
 TEveBoxSet.cxx:294
 TEveBoxSet.cxx:295
 TEveBoxSet.cxx:296
 TEveBoxSet.cxx:297
 TEveBoxSet.cxx:298
 TEveBoxSet.cxx:299
 TEveBoxSet.cxx:300
 TEveBoxSet.cxx:301
 TEveBoxSet.cxx:302
 TEveBoxSet.cxx:303
 TEveBoxSet.cxx:304
 TEveBoxSet.cxx:305
 TEveBoxSet.cxx:306
 TEveBoxSet.cxx:307
 TEveBoxSet.cxx:308
 TEveBoxSet.cxx:309
 TEveBoxSet.cxx:310
 TEveBoxSet.cxx:311
 TEveBoxSet.cxx:312
 TEveBoxSet.cxx:313
 TEveBoxSet.cxx:314
 TEveBoxSet.cxx:315
 TEveBoxSet.cxx:316
 TEveBoxSet.cxx:317
 TEveBoxSet.cxx:318
 TEveBoxSet.cxx:319
 TEveBoxSet.cxx:320
 TEveBoxSet.cxx:321
 TEveBoxSet.cxx:322
 TEveBoxSet.cxx:323
 TEveBoxSet.cxx:324