// @(#)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 "TEveBoxSetGL.h"
#include "TEveBoxSet.h"

#include "TGLIncludes.h"
#include "TGLRnrCtx.h"
#include "TGLSelectRecord.h"
#include "TGLQuadric.h"

//==============================================================================
//==============================================================================
// TEveBoxSetGL
//==============================================================================

//______________________________________________________________________________
//
// A GL rendering class for TEveBoxSet.
//

ClassImp(TEveBoxSetGL);

//______________________________________________________________________________
TEveBoxSetGL::TEveBoxSetGL() : TEveDigitSetGL(), fM(0), fBoxDL(0)
{
   // Default constructor.

   fDLCache = kFALSE; // Disable display list, used internally for boxes, cones.
   fMultiColor = kTRUE;
}

//______________________________________________________________________________
TEveBoxSetGL::~TEveBoxSetGL()
{
   // Destructor.

   DLCachePurge();
}

/******************************************************************************/
// Protected methods
/******************************************************************************/

//______________________________________________________________________________
Int_t TEveBoxSetGL::PrimitiveType() const
{
   // Return GL primitive used to render the boxes, based on the
   // render-mode specified in the model object.

   return (fM->fRenderMode != TEveDigitSet::kRM_Line) ? GL_QUADS : GL_LINE_LOOP;
}

//______________________________________________________________________________
void TEveBoxSetGL::MakeOriginBox(Float_t p[8][3], Float_t dx, Float_t dy, Float_t dz) const
{
   // Fill array p to represent a box (0,0,0) - (dx,dy,dz).

   // bottom
   p[0][0] = 0;  p[0][1] = dy; p[0][2] = 0;
   p[1][0] = dx; p[1][1] = dy; p[1][2] = 0;
   p[2][0] = dx; p[2][1] = 0;  p[2][2] = 0;
   p[3][0] = 0;  p[3][1] = 0;  p[3][2] = 0;
   // top
   p[4][0] = 0;  p[4][1] = dy; p[4][2] = dz;
   p[5][0] = dx; p[5][1] = dy; p[5][2] = dz;
   p[6][0] = dx; p[6][1] = 0;  p[6][2] = dz;
   p[7][0] = 0;  p[7][1] = 0;  p[7][2] = dz;
}

//______________________________________________________________________________
inline void TEveBoxSetGL::RenderBoxStdNorm(const Float_t p[8][3]) const
{
   // Render a box specified by points in array p with standard
   // axis-aligned normals.

   // bottom: 0123
   glNormal3f(0, 0, -1);
   glVertex3fv(p[0]);  glVertex3fv(p[1]);
   glVertex3fv(p[2]);  glVertex3fv(p[3]);
   // top:    7654
   glNormal3f(0, 0, 1);
   glVertex3fv(p[7]); glVertex3fv(p[6]);
   glVertex3fv(p[5]); glVertex3fv(p[4]);
   // back:  0451
   glNormal3f(0, 1, 0);
   glVertex3fv(p[0]); glVertex3fv(p[4]);
   glVertex3fv(p[5]); glVertex3fv(p[1]);
   // front:   3267
   glNormal3f(0, -1, 0);
   glVertex3fv(p[3]);  glVertex3fv(p[2]);
   glVertex3fv(p[6]);  glVertex3fv(p[7]);
   // left:    0374
   glNormal3f(-1, 0, 0);
   glVertex3fv(p[0]);  glVertex3fv(p[3]);
   glVertex3fv(p[7]);  glVertex3fv(p[4]);
   // right:   1562
   glNormal3f(1, 0, 0);
   glVertex3fv(p[1]);  glVertex3fv(p[5]);
   glVertex3fv(p[6]);  glVertex3fv(p[2]);
}

namespace
{
   void subtract_and_normalize(const Float_t a[3], const Float_t b[3],
                               Float_t o[3])
   {
      // Calculate a - b and normalize the result.
      o[0] = a[0] - b[0];
      o[1] = a[1] - b[1];
      o[2] = a[2] - b[2];
      Float_t d = sqrtf(o[0]*o[0] + o[1]*o[1] + o[2]*o[2]);
      if (d != 0)
      {
         d = 1.0f / d;
         o[0] *= d;
         o[1] *= d;
         o[2] *= d;
      }
   }
}
//______________________________________________________________________________
void TEveBoxSetGL::RenderBoxAutoNorm(const Float_t p[8][3]) const
{
   // Render box, calculate normals on the fly from first three points.

   Float_t e[6][3], n[3];
   subtract_and_normalize(p[1], p[0], e[0]);
   subtract_and_normalize(p[3], p[0], e[1]);
   subtract_and_normalize(p[4], p[0], e[2]);
   subtract_and_normalize(p[5], p[6], e[3]);
   subtract_and_normalize(p[7], p[6], e[4]);
   subtract_and_normalize(p[2], p[6], e[5]);

   // bottom: 0123
   glNormal3fv(TMath::Cross(e[0], e[1], n));
   glVertex3fv(p[0]); glVertex3fv(p[1]);
   glVertex3fv(p[2]); glVertex3fv(p[3]);
   // top:    7654
   glNormal3fv(TMath::Cross(e[3], e[4], n));
   glVertex3fv(p[7]); glVertex3fv(p[6]);
   glVertex3fv(p[5]); glVertex3fv(p[4]);
   // back:  0451
   glNormal3fv(TMath::Cross(e[2], e[0], n));
   glVertex3fv(p[0]); glVertex3fv(p[4]);
   glVertex3fv(p[5]); glVertex3fv(p[1]);
   // front:   3267
   glNormal3fv(TMath::Cross(e[4], e[5], n));
   glVertex3fv(p[3]); glVertex3fv(p[2]);
   glVertex3fv(p[6]); glVertex3fv(p[7]);
   // left:    0374
   glNormal3fv(TMath::Cross(e[1], e[2], n));
   glVertex3fv(p[0]); glVertex3fv(p[3]);
   glVertex3fv(p[7]); glVertex3fv(p[4]);
   // right:   1562
   glNormal3fv(TMath::Cross(e[5], e[3], n));
   glVertex3fv(p[1]); glVertex3fv(p[5]);
   glVertex3fv(p[6]); glVertex3fv(p[2]);
}

//______________________________________________________________________________
void TEveBoxSetGL::MakeDisplayList() const
{
   // Create a display-list for rendering a single box, based on the
   // current box-type.
   // Some box-types don't benefit from the display-list rendering and
   // so display-list is not created.

   if (fM->fBoxType == TEveBoxSet::kBT_AABox         ||
       fM->fBoxType == TEveBoxSet::kBT_AABoxFixedDim ||
       fM->fBoxType == TEveBoxSet::kBT_Cone          ||
       fM->fBoxType == TEveBoxSet::kBT_EllipticCone)
   {
      if (fBoxDL == 0)
         fBoxDL = glGenLists(1);

      glNewList(fBoxDL, GL_COMPILE);

      if (fM->fBoxType < TEveBoxSet::kBT_Cone)
      {
         glBegin(PrimitiveType());
         Float_t p[8][3];
         if (fM->fBoxType == TEveBoxSet::kBT_AABox)
            MakeOriginBox(p, 1.0f, 1.0f, 1.0f);
         else
            MakeOriginBox(p, fM->fDefWidth, fM->fDefHeight, fM->fDefDepth);
         RenderBoxStdNorm(p);
         glEnd();
      }
      else
      {
         static TGLQuadric quad;
         Int_t nt = 15; // number of corners
         gluCylinder(quad.Get(), 0, 1, 1, nt, 1);

         if (fM->fDrawConeCap)
         {
            glPushMatrix();
            glTranslatef(0, 0, 1);
            gluDisk(quad.Get(), 0, 1, nt, 1);
            glPopMatrix();
         }
      }

      glEndList();
   }
}

/******************************************************************************/
// Virtuals from base-classes
/******************************************************************************/

//______________________________________________________________________________
Bool_t TEveBoxSetGL::ShouldDLCache(const TGLRnrCtx& rnrCtx) const
{
   // Determines if display-list will be used for rendering.
   // Virtual from TGLLogicalShape.

   MakeDisplayList();

   return TEveDigitSetGL::ShouldDLCache(rnrCtx);
}

//______________________________________________________________________________
void TEveBoxSetGL::DLCacheDrop()
{
   // Called when display lists have been destroyed externally and the
   // internal display-list data needs to be cleare.
   // Virtual from TGLLogicalShape.

   fBoxDL = 0;
   TGLObject::DLCacheDrop();
}

//______________________________________________________________________________
void TEveBoxSetGL::DLCachePurge()
{
   // Called when display-lists need to be returned to the system.
   // Virtual from TGLLogicalShape.

   if (fBoxDL != 0)
   {
      PurgeDLRange(fBoxDL, 1);
      fBoxDL = 0;
   }
   TGLObject::DLCachePurge();
}

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

//______________________________________________________________________________
Bool_t TEveBoxSetGL::SetModel(TObject* obj, const Option_t* /*opt*/)
{
   // Set model object.
   // Virtual from TGLObject.

   fM = SetModelDynCast<TEveBoxSet>(obj);
   return kTRUE;
}

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

namespace
{
  inline void AntiFlick(Float_t x, Float_t y, Float_t z)
  {
     // Render anti-flickering point.
     glBegin(GL_POINTS);
     glVertex3f(x, y, z);
     glEnd();
  }
}

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

//______________________________________________________________________________
void TEveBoxSetGL::RenderBoxes(TGLRnrCtx& rnrCtx) const
{
   // GL rendering for all box-types.

   static const TEveException eH("TEveBoxSetGL::RenderBoxes ");

   if (rnrCtx.SecSelection()) glPushName(0);

   Int_t boxSkip = 0;
   if (fM->fBoxSkip > 0 && rnrCtx.CombiLOD() < TGLRnrCtx::kLODHigh &&
       !rnrCtx.SecSelection())
   {
      boxSkip = TMath::Nint(TMath::Power(fM->fBoxSkip, 2.0 - 0.02*rnrCtx.CombiLOD()));
   }

   TEveChunkManager::iterator bi(fM->fPlex);
   if (rnrCtx.Highlight() && fHighlightSet)
      bi.fSelection = fHighlightSet;

   switch (fM->fBoxType)
   {

      case TEveBoxSet::kBT_FreeBox:
      {
         GLenum primitiveType = PrimitiveType();
         while (bi.next())
         {
            TEveBoxSet::BFreeBox_t& b = * (TEveBoxSet::BFreeBox_t*) bi();
            if (SetupColor(b))
            {
               if (rnrCtx.SecSelection()) glLoadName(bi.index());
               glBegin(primitiveType);
               RenderBoxAutoNorm(b.fVertices);
               glEnd();
               if (fM->fAntiFlick)
                  AntiFlick(0.5f*(b.fVertices[0][0] + b.fVertices[6][0]),
                            0.5f*(b.fVertices[0][1] + b.fVertices[6][1]),
                            0.5f*(b.fVertices[0][2] + b.fVertices[6][2]));
            }
            if (boxSkip) { Int_t s = boxSkip; while (s--) bi.next(); }
         }
         break;
      } // end case free-box

      case TEveBoxSet::kBT_AABox:
      {
         glEnable(GL_NORMALIZE);
         while (bi.next())
         {
            TEveBoxSet::BAABox_t& b = * (TEveBoxSet::BAABox_t*) bi();
            if (SetupColor(b))
            {
               if (rnrCtx.SecSelection()) glLoadName(bi.index());
               glPushMatrix();
               glTranslatef(b.fA, b.fB, b.fC);
               glScalef    (b.fW, b.fH, b.fD);
               glCallList(fBoxDL);
               if (fM->fAntiFlick)
                  AntiFlick(0.5f, 0.5f, 0.5f);
               glPopMatrix();
            }
            if (boxSkip) { Int_t s = boxSkip; while (s--) bi.next(); }
         }
         break;
      }

      case TEveBoxSet::kBT_AABoxFixedDim:
      {
         while (bi.next())
         {
            TEveBoxSet::BAABoxFixedDim_t& b = * (TEveBoxSet::BAABoxFixedDim_t*) bi();
            if (SetupColor(b))
            {
               if (rnrCtx.SecSelection()) glLoadName(bi.index());
               glTranslatef(b.fA, b.fB, b.fC);
               glCallList(fBoxDL);
               if (fM->fAntiFlick)
                  AntiFlick(0.5f*fM->fDefWidth, 0.5f*fM->fDefHeight, 0.5f*fM->fDefDepth);
               glTranslatef(-b.fA, -b.fB, -b.fC);
            }
            if (boxSkip) { Int_t s = boxSkip; while (s--) bi.next(); }
         }
         break;
      }

      case TEveBoxSet::kBT_Cone:
      {
         using namespace TMath;

         glEnable(GL_NORMALIZE);
         Float_t theta=0, phi=0, h=0;
         while (bi.next())
         {
            TEveBoxSet::BCone_t& b = * (TEveBoxSet::BCone_t*) bi();
            if (SetupColor(b))
            {
               if (rnrCtx.SecSelection()) glLoadName(bi.index());
               h     = b.fDir.Mag();
               phi   = ATan2(b.fDir.fY, b.fDir.fX)*RadToDeg();
               theta = ATan (b.fDir.fZ / Sqrt(b.fDir.fX*b.fDir.fX + b.fDir.fY*b.fDir.fY))*RadToDeg();
               glPushMatrix();
               glTranslatef(b.fPos.fX, b.fPos.fY, b.fPos.fZ);
               glRotatef(phi,        0, 0, 1);
               glRotatef(90 - theta, 0, 1, 0);
               glScalef (b.fR, b.fR, h);
               glCallList(fBoxDL);
               if (fM->fAntiFlick)
                  AntiFlick(0.0f, 0.0f, 0.5f);
               glPopMatrix();
            }
            if (boxSkip) { Int_t s = boxSkip; while (s--) bi.next(); }
         }
         break;
      }

      case TEveBoxSet::kBT_EllipticCone:
      {
         using namespace TMath;

         glEnable(GL_NORMALIZE);
         Float_t theta=0, phi=0, h=0;
         while (bi.next())
         {
            TEveBoxSet::BEllipticCone_t& b = * (TEveBoxSet::BEllipticCone_t*) bi();
            if (SetupColor(b))
            {
               if (rnrCtx.SecSelection()) glLoadName(bi.index());
               h     = b.fDir.Mag();
               phi   = ATan2(b.fDir.fY, b.fDir.fX)*RadToDeg();
               theta = ATan (b.fDir.fZ / Sqrt(b.fDir.fX*b.fDir.fX + b.fDir.fY*b.fDir.fY))*RadToDeg();
               glPushMatrix();
               glTranslatef(b.fPos.fX, b.fPos.fY, b.fPos.fZ);
               glRotatef(phi,        0, 0, 1);
               glRotatef(90 - theta, 0, 1, 0);
               glRotatef(b.fAngle,   0, 0, 1);
               glScalef (b.fR, b.fR2, h);
               glCallList(fBoxDL);
               if (fM->fAntiFlick)
                  AntiFlick(0.0f, 0.0f, 0.5f);
               glPopMatrix();
            }
            if (boxSkip) { Int_t s = boxSkip; while (s--) bi.next(); }
         }
         break;
      }

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

   } // end switch box-type

   if (rnrCtx.SecSelection()) glPopName();
}

//______________________________________________________________________________
void TEveBoxSetGL::DirectDraw(TGLRnrCtx& rnrCtx) const
{
   // Actual rendering code.
   // Virtual from TGLLogicalShape.

   TEveBoxSet& mB = * fM;
   // printf("TEveBoxSetGL::DirectDraw N boxes %d\n", mB.fPlex.Size());

   if (mB.fPlex.Size() > 0)
   {
      if (! mB.fSingleColor && ! mB.fValueIsColor && mB.fPalette == 0)
      {
         mB.AssertPalette();
      }

      glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);

      if ( ! rnrCtx.IsDrawPassOutlineLine())
      {
         if (mB.fRenderMode == TEveDigitSet::kRM_Fill)
            glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
         else if (mB.fRenderMode == TEveDigitSet::kRM_Line)
            glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
      }

      if (mB.fBoxType == TEveBoxSet::kBT_Cone ||
          mB.fBoxType == TEveBoxSet::kBT_EllipticCone)
      {
         glDisable(GL_CULL_FACE);
      }

      if (mB.fDisableLighting) glDisable(GL_LIGHTING);

      RenderBoxes(rnrCtx);

      glPopAttrib();
   }

   DrawFrameIfNeeded(rnrCtx);
}

//______________________________________________________________________________
void TEveBoxSetGL::Render(TGLRnrCtx& rnrCtx)
{
   // Interface for direct rendering from classes that include TEveBoxSet
   // as a member.

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