// @(#)root/eve:$Id$
// 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 "TEveQuadSet.h"

#include "TEveManager.h"

#include "TColor.h"

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

#include "TROOT.h"
#include "TRandom.h"

//______________________________________________________________________________
// TEveQuadSet
//
// Supports various internal formats that result in rendering of a
// set of planar (lines, rectangles, hegagons with shared normal) objects.
//
// Names of internal structures and their variables use A, B and C as
// names for coordinate value-holders. Typical assignment is A->X,
// B->Y, C->Z but each render mode can override this convention and
// impose y or x as a fixed (third or C) coordinate. Alphabetic order
// is obeyed in this correspondence.
//
// For quad modes the deltas are expected to be positive.
// For line modes negative deltas are ok.

ClassImp(TEveQuadSet);

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

   fQuadType  (kQT_Undef),
   fDefWidth  (1),
   fDefHeight (1),
   fDefCoord  (0)
{
   // Constructor.
}

//______________________________________________________________________________
TEveQuadSet::TEveQuadSet(EQuadType_e quadType, Bool_t valIsCol, Int_t chunkSize,
                         const char* n, const char* t) :
   TEveDigitSet   (n, t),

   fQuadType  (kQT_Undef),
   fDefWidth  (1),
   fDefHeight (1),
   fDefCoord  (0)
{
   // Constructor.

   Reset(quadType, valIsCol, chunkSize);
}

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

//______________________________________________________________________________
Int_t TEveQuadSet::SizeofAtom(TEveQuadSet::EQuadType_e qt)
{
   // Return size of given atom type.

   static const TEveException eH("TEveQuadSet::SizeofAtom ");

   switch (qt) {
      case kQT_Undef:                return 0;
      case kQT_FreeQuad:             return sizeof(QFreeQuad_t);
      case kQT_RectangleXY:
      case kQT_RectangleXZ:
      case kQT_RectangleYZ:          return sizeof(QRect_t);
      case kQT_RectangleXYFixedDim:  return sizeof(QRectFixDim_t);
      case kQT_RectangleXYFixedZ:
      case kQT_RectangleXZFixedY:
      case kQT_RectangleYZFixedX:    return sizeof(QRectFixC_t);
      case kQT_RectangleXYFixedDimZ:
      case kQT_RectangleXZFixedDimY:
      case kQT_RectangleYZFixedDimX: return sizeof(QRectFixDimC_t);
      case kQT_LineXZFixedY:
      case kQT_LineXYFixedZ:         return sizeof(QLineFixC_t);
      case kQT_HexagonXY:
      case kQT_HexagonYX:            return sizeof(QHex_t);
      default:                      throw(eH + "unexpected atom type.");
   }
   return 0;
}

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

//______________________________________________________________________________
void TEveQuadSet::Reset(TEveQuadSet::EQuadType_e quadType, Bool_t valIsCol,
                        Int_t chunkSize)
{
   // Clear the quad-set and reset the basic parameters.

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

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

//______________________________________________________________________________
void TEveQuadSet::AddQuad(Float_t verts[12])
{
   // Add a quad specified with 4 vertices.

   static const TEveException eH("TEveQuadSet::AddQuad ");

   if (fQuadType != kQT_FreeQuad)
      throw(eH + "expect free quad-type.");

   QFreeQuad_t* fq = (QFreeQuad_t*) NewDigit();
   if (verts != 0)
     memcpy(fq->fVertices, verts, sizeof(fq->fVertices));
}

//______________________________________________________________________________
void TEveQuadSet::AddQuad(Float_t a, Float_t b)
{
   // Add a quad with a and b coordinates. Defaults are applied for
   // c coordinate and sizes.

   AddQuad(a, b, fDefCoord, fDefWidth, fDefHeight);
}

//______________________________________________________________________________
void TEveQuadSet::AddQuad(Float_t a, Float_t b, Float_t c)
{
   // Add a quad with a, b and c coordinates. Defaults are applied
   // for sizes.

   AddQuad(a, b, c, fDefWidth, fDefHeight);
}

//______________________________________________________________________________
void TEveQuadSet::AddQuad(Float_t a, Float_t b, Float_t w, Float_t h)
{
   // Add a quad with a and b coordinates and sizes. Default is applied
   // for c coordinate.

   AddQuad(a, b, fDefCoord, w, h);
}

//______________________________________________________________________________
void TEveQuadSet::AddQuad(Float_t a, Float_t b, Float_t c, Float_t w, Float_t h)
{
   // Add a quad with a, b and c coordinates and sizes.

   static const TEveException eH("TEveQuadSet::AddAAQuad ");

   QOrigin_t& fq = * (QOrigin_t*) NewDigit();
   fq.fA = a; fq.fB = b;
   switch (fQuadType)
   {
      case kQT_RectangleXY:
      case kQT_RectangleXZ:
      case kQT_RectangleYZ:
      {
         QRect_t& q = (QRect_t&) fq;
         q.fC = c; q.fW = w; q.fH = h;
         break;
      }

      case kQT_RectangleXYFixedDim:
      {
         QRectFixDim_t& q =  (QRectFixDim_t&) fq;
         q.fC = c;
         break;
      }

      case kQT_RectangleXYFixedZ:
      case kQT_RectangleXZFixedY:
      case kQT_RectangleYZFixedX:
      {
         QRectFixC_t& q = (QRectFixC_t&) fq;
         q.fW = w; q.fH = h;
         break;
      }

      case kQT_RectangleXYFixedDimZ:
      case kQT_RectangleXZFixedDimY:
      case kQT_RectangleYZFixedDimX:
      {
         break;
      }

      default:
         throw(eH + "expect axis-aligned quad-type.");
   }
}

//______________________________________________________________________________
void TEveQuadSet::AddLine(Float_t a, Float_t b, Float_t w, Float_t h)
{
   // Add a line with starting coordinates and displacements.

   static const TEveException eH("TEveQuadSet::AddLine ");

   QOrigin_t& fq = * (QOrigin_t*) NewDigit();
   fq.fA = a; fq.fB = b;
   switch (fQuadType)
   {
      case kQT_LineXZFixedY:
      case kQT_LineXYFixedZ: {
         QLineFixC_t& q = (QLineFixC_t&) fq;
         q.fDx = w; q.fDy = h;
         break;
      }
      default:
         throw(eH + "expect line quad-type.");
   }
}

//______________________________________________________________________________
void TEveQuadSet::AddHexagon(Float_t a, Float_t b, Float_t c, Float_t r)
{
   // Add a hexagon with given center (a,b,c) and radius.

   static const TEveException eH("TEveQuadSet::AddHexagon ");

   QOrigin_t& fq = * (QOrigin_t*) NewDigit();
   fq.fA = a; fq.fB = b;
   switch (fQuadType)
   {
      case kQT_HexagonXY:
      case kQT_HexagonYX: {
         QHex_t& q = (QHex_t&) fq;
         q.fC = c; q.fR = r;
         break;
      }
      default:
         throw(eH + "expect line quad-type.");
   }
}

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

//______________________________________________________________________________
void TEveQuadSet::ComputeBBox()
{
   // Fill bounding-box information. Virtual from TAttBBox.
   // If member 'TEveFrameBox* fFrame' is set, frame's corners are
   // used as bbox.

   static const TEveException eH("TEveQuadSet::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);
   }
   else
   {
      if(fPlex.Size() == 0) {
         BBoxZero();
         return;
      }

      BBoxInit();
      if (fQuadType == kQT_RectangleXYFixedZ    ||
          fQuadType == kQT_RectangleXYFixedDimZ)
      {
         fBBox[4] = fDefCoord;
         fBBox[5] = fDefCoord;
      }
      else if (fQuadType == kQT_RectangleXZFixedY    ||
               fQuadType == kQT_RectangleXZFixedDimY)
      {
         fBBox[2] = fDefCoord;
         fBBox[3] = fDefCoord;
      }
      else if (fQuadType == kQT_RectangleYZFixedX    ||
               fQuadType == kQT_RectangleYZFixedDimX)
      {
         fBBox[0] = fDefCoord;
         fBBox[1] = fDefCoord;
      }

      TEveChunkManager::iterator qi(fPlex);

      switch (fQuadType)
      {

         case kQT_FreeQuad:
         {
            while (qi.next()) {
               const Float_t* p =  ((QFreeQuad_t*) qi())->fVertices;
               BBoxCheckPoint(p); p += 3;
               BBoxCheckPoint(p); p += 3;
               BBoxCheckPoint(p); p += 3;
               BBoxCheckPoint(p);
            }
            break;
         }

         case kQT_RectangleXY:
         {
            while (qi.next()) {
               QRect_t& q = * (QRect_t*) qi();
               if(q.fA        < fBBox[0]) fBBox[0] = q.fA;
               if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
               if(q.fB        < fBBox[2]) fBBox[2] = q.fB;
               if(q.fB + q.fH > fBBox[3]) fBBox[3] = q.fB + q.fH;
               if(q.fC        < fBBox[4]) fBBox[4] = q.fC;
               if(q.fC        > fBBox[5]) fBBox[5] = q.fC;
            }
            break;
         }

         case kQT_RectangleXZ:
         {
            while (qi.next()) {
               QRect_t& q = * (QRect_t*) qi();
               if(q.fA        < fBBox[0]) fBBox[0] = q.fA;
               if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
               if(q.fB        < fBBox[4]) fBBox[4] = q.fB;
               if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
               if(q.fC        < fBBox[2]) fBBox[2] = q.fC;
               if(q.fC        > fBBox[3]) fBBox[3] = q.fC;
            }
            break;
         }

         case kQT_RectangleYZ:
         {
            while (qi.next()) {
               QRect_t& q = * (QRect_t*) qi();
               if(q.fA        < fBBox[2]) fBBox[2] = q.fA;
               if(q.fA + q.fW > fBBox[3]) fBBox[3] = q.fA + q.fW;
               if(q.fB        < fBBox[4]) fBBox[4] = q.fB;
               if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
               if(q.fC        < fBBox[0]) fBBox[0] = q.fC;
               if(q.fC        > fBBox[1]) fBBox[1] = q.fC;
            }
            break;
         }

         case kQT_RectangleXYFixedDim:
         {
            const Float_t& w = fDefWidth;
            const Float_t& h = fDefHeight;
            while (qi.next()) {
               QRectFixDim_t& q = * (QRectFixDim_t*) qi();
               if(q.fA     < fBBox[0]) fBBox[0] = q.fA;
               if(q.fA + w > fBBox[1]) fBBox[1] = q.fA + w;
               if(q.fB     < fBBox[2]) fBBox[2] = q.fB;
               if(q.fB + h > fBBox[3]) fBBox[3] = q.fB + h;
               if(q.fC     < fBBox[4]) fBBox[4] = q.fC;
               if(q.fC     > fBBox[5]) fBBox[5] = q.fC;
            }
            break;
         }

         case kQT_RectangleXYFixedZ:
         {
            while (qi.next()) {
               QRectFixC_t& q = * (QRectFixC_t*) qi();
               if(q.fA        < fBBox[0]) fBBox[0] = q.fA;
               if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
               if(q.fB        < fBBox[2]) fBBox[2] = q.fB;
               if(q.fB + q.fH > fBBox[3]) fBBox[3] = q.fB + q.fH;
            }
            break;
         }

         case kQT_RectangleXZFixedY:
         {
            while (qi.next()) {
               QRectFixC_t& q = * (QRectFixC_t*) qi();
               if(q.fA        < fBBox[0]) fBBox[0] = q.fA;
               if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
               if(q.fB        < fBBox[4]) fBBox[4] = q.fB;
               if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
            }
            break;
         }

         case kQT_RectangleYZFixedX:
         {
            while (qi.next()) {
               QRectFixC_t& q = * (QRectFixC_t*) qi();
               if(q.fA        < fBBox[2]) fBBox[2] = q.fA;
               if(q.fA + q.fW > fBBox[3]) fBBox[3] = q.fA + q.fW;
               if(q.fB        < fBBox[4]) fBBox[4] = q.fB;
               if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
            }
            break;
         }

         case kQT_RectangleXYFixedDimZ:
         {
            const Float_t& w = fDefWidth;
            const Float_t& h = fDefHeight;
            while (qi.next()) {
               QRectFixDimC_t& q = * (QRectFixDimC_t*) qi();
               if(q.fA     < fBBox[0]) fBBox[0] = q.fA;
               if(q.fA + w > fBBox[1]) fBBox[1] = q.fA + w;
               if(q.fB     < fBBox[2]) fBBox[2] = q.fB;
               if(q.fB + h > fBBox[3]) fBBox[3] = q.fB + h;
            }
            break;
         }

         case kQT_RectangleXZFixedDimY:
         {
            const Float_t& w = fDefWidth;
            const Float_t& h = fDefHeight;
            while (qi.next()) {
               QRectFixDimC_t& q = * (QRectFixDimC_t*) qi();
               if(q.fA     < fBBox[0]) fBBox[0] = q.fA;
               if(q.fA + w > fBBox[1]) fBBox[1] = q.fA + w;
               if(q.fB     < fBBox[4]) fBBox[4] = q.fB;
               if(q.fB + h > fBBox[5]) fBBox[5] = q.fB + h;
            }
            break;
         }

         case kQT_RectangleYZFixedDimX:
         {
            const Float_t& w = fDefWidth;
            const Float_t& h = fDefHeight;
            while (qi.next()) {
               QRectFixDimC_t& q = * (QRectFixDimC_t*) qi();
               if(q.fA     < fBBox[2]) fBBox[2] = q.fA;
               if(q.fA + w > fBBox[3]) fBBox[3] = q.fA + w;
               if(q.fB     < fBBox[4]) fBBox[4] = q.fB;
               if(q.fB + h > fBBox[5]) fBBox[5] = q.fB + h;
            }
            break;
         }

         // TEveLine modes

         case kQT_LineXYFixedZ:
         {
            while (qi.next()) {
               QLineFixC_t& q = * (QLineFixC_t*) qi();
               BBoxCheckPoint(q.fA,         q.fB,         fDefCoord);
               BBoxCheckPoint(q.fA + q.fDx, q.fB + q.fDy, fDefCoord);
            }
            break;
         }

         case kQT_LineXZFixedY:
         {
            while (qi.next()) {
               QLineFixC_t& q = * (QLineFixC_t*) qi();
               BBoxCheckPoint(q.fA,         fDefCoord, q.fB);
               BBoxCheckPoint(q.fA + q.fDx, fDefCoord, q.fB + q.fDy);
            }
            break;
         }

         // Hexagon modes

         // Ignore 'slight' difference, assume square box for both cases.
         case kQT_HexagonXY:
         case kQT_HexagonYX:
         {
            while (qi.next()) {
               QHex_t& q = * (QHex_t*) qi();
               BBoxCheckPoint(q.fA-q.fR, q.fB-q.fR, q.fC);
               BBoxCheckPoint(q.fA+q.fR, q.fB+q.fR, q.fC);
            }
            break;
         }

         default:
         {
            throw(eH + "unsupported quad-type.");
         }

      } // end switch quad-type
   } // end if frame ... else ...
}
 TEveQuadSet.cxx:1
 TEveQuadSet.cxx:2
 TEveQuadSet.cxx:3
 TEveQuadSet.cxx:4
 TEveQuadSet.cxx:5
 TEveQuadSet.cxx:6
 TEveQuadSet.cxx:7
 TEveQuadSet.cxx:8
 TEveQuadSet.cxx:9
 TEveQuadSet.cxx:10
 TEveQuadSet.cxx:11
 TEveQuadSet.cxx:12
 TEveQuadSet.cxx:13
 TEveQuadSet.cxx:14
 TEveQuadSet.cxx:15
 TEveQuadSet.cxx:16
 TEveQuadSet.cxx:17
 TEveQuadSet.cxx:18
 TEveQuadSet.cxx:19
 TEveQuadSet.cxx:20
 TEveQuadSet.cxx:21
 TEveQuadSet.cxx:22
 TEveQuadSet.cxx:23
 TEveQuadSet.cxx:24
 TEveQuadSet.cxx:25
 TEveQuadSet.cxx:26
 TEveQuadSet.cxx:27
 TEveQuadSet.cxx:28
 TEveQuadSet.cxx:29
 TEveQuadSet.cxx:30
 TEveQuadSet.cxx:31
 TEveQuadSet.cxx:32
 TEveQuadSet.cxx:33
 TEveQuadSet.cxx:34
 TEveQuadSet.cxx:35
 TEveQuadSet.cxx:36
 TEveQuadSet.cxx:37
 TEveQuadSet.cxx:38
 TEveQuadSet.cxx:39
 TEveQuadSet.cxx:40
 TEveQuadSet.cxx:41
 TEveQuadSet.cxx:42
 TEveQuadSet.cxx:43
 TEveQuadSet.cxx:44
 TEveQuadSet.cxx:45
 TEveQuadSet.cxx:46
 TEveQuadSet.cxx:47
 TEveQuadSet.cxx:48
 TEveQuadSet.cxx:49
 TEveQuadSet.cxx:50
 TEveQuadSet.cxx:51
 TEveQuadSet.cxx:52
 TEveQuadSet.cxx:53
 TEveQuadSet.cxx:54
 TEveQuadSet.cxx:55
 TEveQuadSet.cxx:56
 TEveQuadSet.cxx:57
 TEveQuadSet.cxx:58
 TEveQuadSet.cxx:59
 TEveQuadSet.cxx:60
 TEveQuadSet.cxx:61
 TEveQuadSet.cxx:62
 TEveQuadSet.cxx:63
 TEveQuadSet.cxx:64
 TEveQuadSet.cxx:65
 TEveQuadSet.cxx:66
 TEveQuadSet.cxx:67
 TEveQuadSet.cxx:68
 TEveQuadSet.cxx:69
 TEveQuadSet.cxx:70
 TEveQuadSet.cxx:71
 TEveQuadSet.cxx:72
 TEveQuadSet.cxx:73
 TEveQuadSet.cxx:74
 TEveQuadSet.cxx:75
 TEveQuadSet.cxx:76
 TEveQuadSet.cxx:77
 TEveQuadSet.cxx:78
 TEveQuadSet.cxx:79
 TEveQuadSet.cxx:80
 TEveQuadSet.cxx:81
 TEveQuadSet.cxx:82
 TEveQuadSet.cxx:83
 TEveQuadSet.cxx:84
 TEveQuadSet.cxx:85
 TEveQuadSet.cxx:86
 TEveQuadSet.cxx:87
 TEveQuadSet.cxx:88
 TEveQuadSet.cxx:89
 TEveQuadSet.cxx:90
 TEveQuadSet.cxx:91
 TEveQuadSet.cxx:92
 TEveQuadSet.cxx:93
 TEveQuadSet.cxx:94
 TEveQuadSet.cxx:95
 TEveQuadSet.cxx:96
 TEveQuadSet.cxx:97
 TEveQuadSet.cxx:98
 TEveQuadSet.cxx:99
 TEveQuadSet.cxx:100
 TEveQuadSet.cxx:101
 TEveQuadSet.cxx:102
 TEveQuadSet.cxx:103
 TEveQuadSet.cxx:104
 TEveQuadSet.cxx:105
 TEveQuadSet.cxx:106
 TEveQuadSet.cxx:107
 TEveQuadSet.cxx:108
 TEveQuadSet.cxx:109
 TEveQuadSet.cxx:110
 TEveQuadSet.cxx:111
 TEveQuadSet.cxx:112
 TEveQuadSet.cxx:113
 TEveQuadSet.cxx:114
 TEveQuadSet.cxx:115
 TEveQuadSet.cxx:116
 TEveQuadSet.cxx:117
 TEveQuadSet.cxx:118
 TEveQuadSet.cxx:119
 TEveQuadSet.cxx:120
 TEveQuadSet.cxx:121
 TEveQuadSet.cxx:122
 TEveQuadSet.cxx:123
 TEveQuadSet.cxx:124
 TEveQuadSet.cxx:125
 TEveQuadSet.cxx:126
 TEveQuadSet.cxx:127
 TEveQuadSet.cxx:128
 TEveQuadSet.cxx:129
 TEveQuadSet.cxx:130
 TEveQuadSet.cxx:131
 TEveQuadSet.cxx:132
 TEveQuadSet.cxx:133
 TEveQuadSet.cxx:134
 TEveQuadSet.cxx:135
 TEveQuadSet.cxx:136
 TEveQuadSet.cxx:137
 TEveQuadSet.cxx:138
 TEveQuadSet.cxx:139
 TEveQuadSet.cxx:140
 TEveQuadSet.cxx:141
 TEveQuadSet.cxx:142
 TEveQuadSet.cxx:143
 TEveQuadSet.cxx:144
 TEveQuadSet.cxx:145
 TEveQuadSet.cxx:146
 TEveQuadSet.cxx:147
 TEveQuadSet.cxx:148
 TEveQuadSet.cxx:149
 TEveQuadSet.cxx:150
 TEveQuadSet.cxx:151
 TEveQuadSet.cxx:152
 TEveQuadSet.cxx:153
 TEveQuadSet.cxx:154
 TEveQuadSet.cxx:155
 TEveQuadSet.cxx:156
 TEveQuadSet.cxx:157
 TEveQuadSet.cxx:158
 TEveQuadSet.cxx:159
 TEveQuadSet.cxx:160
 TEveQuadSet.cxx:161
 TEveQuadSet.cxx:162
 TEveQuadSet.cxx:163
 TEveQuadSet.cxx:164
 TEveQuadSet.cxx:165
 TEveQuadSet.cxx:166
 TEveQuadSet.cxx:167
 TEveQuadSet.cxx:168
 TEveQuadSet.cxx:169
 TEveQuadSet.cxx:170
 TEveQuadSet.cxx:171
 TEveQuadSet.cxx:172
 TEveQuadSet.cxx:173
 TEveQuadSet.cxx:174
 TEveQuadSet.cxx:175
 TEveQuadSet.cxx:176
 TEveQuadSet.cxx:177
 TEveQuadSet.cxx:178
 TEveQuadSet.cxx:179
 TEveQuadSet.cxx:180
 TEveQuadSet.cxx:181
 TEveQuadSet.cxx:182
 TEveQuadSet.cxx:183
 TEveQuadSet.cxx:184
 TEveQuadSet.cxx:185
 TEveQuadSet.cxx:186
 TEveQuadSet.cxx:187
 TEveQuadSet.cxx:188
 TEveQuadSet.cxx:189
 TEveQuadSet.cxx:190
 TEveQuadSet.cxx:191
 TEveQuadSet.cxx:192
 TEveQuadSet.cxx:193
 TEveQuadSet.cxx:194
 TEveQuadSet.cxx:195
 TEveQuadSet.cxx:196
 TEveQuadSet.cxx:197
 TEveQuadSet.cxx:198
 TEveQuadSet.cxx:199
 TEveQuadSet.cxx:200
 TEveQuadSet.cxx:201
 TEveQuadSet.cxx:202
 TEveQuadSet.cxx:203
 TEveQuadSet.cxx:204
 TEveQuadSet.cxx:205
 TEveQuadSet.cxx:206
 TEveQuadSet.cxx:207
 TEveQuadSet.cxx:208
 TEveQuadSet.cxx:209
 TEveQuadSet.cxx:210
 TEveQuadSet.cxx:211
 TEveQuadSet.cxx:212
 TEveQuadSet.cxx:213
 TEveQuadSet.cxx:214
 TEveQuadSet.cxx:215
 TEveQuadSet.cxx:216
 TEveQuadSet.cxx:217
 TEveQuadSet.cxx:218
 TEveQuadSet.cxx:219
 TEveQuadSet.cxx:220
 TEveQuadSet.cxx:221
 TEveQuadSet.cxx:222
 TEveQuadSet.cxx:223
 TEveQuadSet.cxx:224
 TEveQuadSet.cxx:225
 TEveQuadSet.cxx:226
 TEveQuadSet.cxx:227
 TEveQuadSet.cxx:228
 TEveQuadSet.cxx:229
 TEveQuadSet.cxx:230
 TEveQuadSet.cxx:231
 TEveQuadSet.cxx:232
 TEveQuadSet.cxx:233
 TEveQuadSet.cxx:234
 TEveQuadSet.cxx:235
 TEveQuadSet.cxx:236
 TEveQuadSet.cxx:237
 TEveQuadSet.cxx:238
 TEveQuadSet.cxx:239
 TEveQuadSet.cxx:240
 TEveQuadSet.cxx:241
 TEveQuadSet.cxx:242
 TEveQuadSet.cxx:243
 TEveQuadSet.cxx:244
 TEveQuadSet.cxx:245
 TEveQuadSet.cxx:246
 TEveQuadSet.cxx:247
 TEveQuadSet.cxx:248
 TEveQuadSet.cxx:249
 TEveQuadSet.cxx:250
 TEveQuadSet.cxx:251
 TEveQuadSet.cxx:252
 TEveQuadSet.cxx:253
 TEveQuadSet.cxx:254
 TEveQuadSet.cxx:255
 TEveQuadSet.cxx:256
 TEveQuadSet.cxx:257
 TEveQuadSet.cxx:258
 TEveQuadSet.cxx:259
 TEveQuadSet.cxx:260
 TEveQuadSet.cxx:261
 TEveQuadSet.cxx:262
 TEveQuadSet.cxx:263
 TEveQuadSet.cxx:264
 TEveQuadSet.cxx:265
 TEveQuadSet.cxx:266
 TEveQuadSet.cxx:267
 TEveQuadSet.cxx:268
 TEveQuadSet.cxx:269
 TEveQuadSet.cxx:270
 TEveQuadSet.cxx:271
 TEveQuadSet.cxx:272
 TEveQuadSet.cxx:273
 TEveQuadSet.cxx:274
 TEveQuadSet.cxx:275
 TEveQuadSet.cxx:276
 TEveQuadSet.cxx:277
 TEveQuadSet.cxx:278
 TEveQuadSet.cxx:279
 TEveQuadSet.cxx:280
 TEveQuadSet.cxx:281
 TEveQuadSet.cxx:282
 TEveQuadSet.cxx:283
 TEveQuadSet.cxx:284
 TEveQuadSet.cxx:285
 TEveQuadSet.cxx:286
 TEveQuadSet.cxx:287
 TEveQuadSet.cxx:288
 TEveQuadSet.cxx:289
 TEveQuadSet.cxx:290
 TEveQuadSet.cxx:291
 TEveQuadSet.cxx:292
 TEveQuadSet.cxx:293
 TEveQuadSet.cxx:294
 TEveQuadSet.cxx:295
 TEveQuadSet.cxx:296
 TEveQuadSet.cxx:297
 TEveQuadSet.cxx:298
 TEveQuadSet.cxx:299
 TEveQuadSet.cxx:300
 TEveQuadSet.cxx:301
 TEveQuadSet.cxx:302
 TEveQuadSet.cxx:303
 TEveQuadSet.cxx:304
 TEveQuadSet.cxx:305
 TEveQuadSet.cxx:306
 TEveQuadSet.cxx:307
 TEveQuadSet.cxx:308
 TEveQuadSet.cxx:309
 TEveQuadSet.cxx:310
 TEveQuadSet.cxx:311
 TEveQuadSet.cxx:312
 TEveQuadSet.cxx:313
 TEveQuadSet.cxx:314
 TEveQuadSet.cxx:315
 TEveQuadSet.cxx:316
 TEveQuadSet.cxx:317
 TEveQuadSet.cxx:318
 TEveQuadSet.cxx:319
 TEveQuadSet.cxx:320
 TEveQuadSet.cxx:321
 TEveQuadSet.cxx:322
 TEveQuadSet.cxx:323
 TEveQuadSet.cxx:324
 TEveQuadSet.cxx:325
 TEveQuadSet.cxx:326
 TEveQuadSet.cxx:327
 TEveQuadSet.cxx:328
 TEveQuadSet.cxx:329
 TEveQuadSet.cxx:330
 TEveQuadSet.cxx:331
 TEveQuadSet.cxx:332
 TEveQuadSet.cxx:333
 TEveQuadSet.cxx:334
 TEveQuadSet.cxx:335
 TEveQuadSet.cxx:336
 TEveQuadSet.cxx:337
 TEveQuadSet.cxx:338
 TEveQuadSet.cxx:339
 TEveQuadSet.cxx:340
 TEveQuadSet.cxx:341
 TEveQuadSet.cxx:342
 TEveQuadSet.cxx:343
 TEveQuadSet.cxx:344
 TEveQuadSet.cxx:345
 TEveQuadSet.cxx:346
 TEveQuadSet.cxx:347
 TEveQuadSet.cxx:348
 TEveQuadSet.cxx:349
 TEveQuadSet.cxx:350
 TEveQuadSet.cxx:351
 TEveQuadSet.cxx:352
 TEveQuadSet.cxx:353
 TEveQuadSet.cxx:354
 TEveQuadSet.cxx:355
 TEveQuadSet.cxx:356
 TEveQuadSet.cxx:357
 TEveQuadSet.cxx:358
 TEveQuadSet.cxx:359
 TEveQuadSet.cxx:360
 TEveQuadSet.cxx:361
 TEveQuadSet.cxx:362
 TEveQuadSet.cxx:363
 TEveQuadSet.cxx:364
 TEveQuadSet.cxx:365
 TEveQuadSet.cxx:366
 TEveQuadSet.cxx:367
 TEveQuadSet.cxx:368
 TEveQuadSet.cxx:369
 TEveQuadSet.cxx:370
 TEveQuadSet.cxx:371
 TEveQuadSet.cxx:372
 TEveQuadSet.cxx:373
 TEveQuadSet.cxx:374
 TEveQuadSet.cxx:375
 TEveQuadSet.cxx:376
 TEveQuadSet.cxx:377
 TEveQuadSet.cxx:378
 TEveQuadSet.cxx:379
 TEveQuadSet.cxx:380
 TEveQuadSet.cxx:381
 TEveQuadSet.cxx:382
 TEveQuadSet.cxx:383
 TEveQuadSet.cxx:384
 TEveQuadSet.cxx:385
 TEveQuadSet.cxx:386
 TEveQuadSet.cxx:387
 TEveQuadSet.cxx:388
 TEveQuadSet.cxx:389
 TEveQuadSet.cxx:390
 TEveQuadSet.cxx:391
 TEveQuadSet.cxx:392
 TEveQuadSet.cxx:393
 TEveQuadSet.cxx:394
 TEveQuadSet.cxx:395
 TEveQuadSet.cxx:396
 TEveQuadSet.cxx:397
 TEveQuadSet.cxx:398
 TEveQuadSet.cxx:399
 TEveQuadSet.cxx:400
 TEveQuadSet.cxx:401
 TEveQuadSet.cxx:402
 TEveQuadSet.cxx:403
 TEveQuadSet.cxx:404
 TEveQuadSet.cxx:405
 TEveQuadSet.cxx:406
 TEveQuadSet.cxx:407
 TEveQuadSet.cxx:408
 TEveQuadSet.cxx:409
 TEveQuadSet.cxx:410
 TEveQuadSet.cxx:411
 TEveQuadSet.cxx:412
 TEveQuadSet.cxx:413
 TEveQuadSet.cxx:414
 TEveQuadSet.cxx:415
 TEveQuadSet.cxx:416
 TEveQuadSet.cxx:417
 TEveQuadSet.cxx:418
 TEveQuadSet.cxx:419
 TEveQuadSet.cxx:420
 TEveQuadSet.cxx:421
 TEveQuadSet.cxx:422
 TEveQuadSet.cxx:423
 TEveQuadSet.cxx:424
 TEveQuadSet.cxx:425
 TEveQuadSet.cxx:426
 TEveQuadSet.cxx:427
 TEveQuadSet.cxx:428
 TEveQuadSet.cxx:429
 TEveQuadSet.cxx:430
 TEveQuadSet.cxx:431
 TEveQuadSet.cxx:432
 TEveQuadSet.cxx:433
 TEveQuadSet.cxx:434
 TEveQuadSet.cxx:435
 TEveQuadSet.cxx:436
 TEveQuadSet.cxx:437
 TEveQuadSet.cxx:438
 TEveQuadSet.cxx:439
 TEveQuadSet.cxx:440
 TEveQuadSet.cxx:441
 TEveQuadSet.cxx:442
 TEveQuadSet.cxx:443
 TEveQuadSet.cxx:444
 TEveQuadSet.cxx:445
 TEveQuadSet.cxx:446
 TEveQuadSet.cxx:447
 TEveQuadSet.cxx:448
 TEveQuadSet.cxx:449
 TEveQuadSet.cxx:450
 TEveQuadSet.cxx:451
 TEveQuadSet.cxx:452
 TEveQuadSet.cxx:453
 TEveQuadSet.cxx:454
 TEveQuadSet.cxx:455
 TEveQuadSet.cxx:456
 TEveQuadSet.cxx:457
 TEveQuadSet.cxx:458
 TEveQuadSet.cxx:459
 TEveQuadSet.cxx:460
 TEveQuadSet.cxx:461
 TEveQuadSet.cxx:462
 TEveQuadSet.cxx:463
 TEveQuadSet.cxx:464
 TEveQuadSet.cxx:465
 TEveQuadSet.cxx:466
 TEveQuadSet.cxx:467
 TEveQuadSet.cxx:468
 TEveQuadSet.cxx:469
 TEveQuadSet.cxx:470
 TEveQuadSet.cxx:471
 TEveQuadSet.cxx:472
 TEveQuadSet.cxx:473
 TEveQuadSet.cxx:474
 TEveQuadSet.cxx:475
 TEveQuadSet.cxx:476
 TEveQuadSet.cxx:477
 TEveQuadSet.cxx:478
 TEveQuadSet.cxx:479
 TEveQuadSet.cxx:480
 TEveQuadSet.cxx:481
 TEveQuadSet.cxx:482
 TEveQuadSet.cxx:483
 TEveQuadSet.cxx:484
 TEveQuadSet.cxx:485
 TEveQuadSet.cxx:486
 TEveQuadSet.cxx:487
 TEveQuadSet.cxx:488
 TEveQuadSet.cxx:489
 TEveQuadSet.cxx:490
 TEveQuadSet.cxx:491
 TEveQuadSet.cxx:492
 TEveQuadSet.cxx:493
 TEveQuadSet.cxx:494
 TEveQuadSet.cxx:495