// @(#)root/eve:$Id$
// Author: Matevz Tadel, 2010

/*************************************************************************
 * 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 "TEveBoxGL.h"
#include "TEveBox.h"

#include "TGLRnrCtx.h"
#include "TGLIncludes.h"

#include "TMath.h"

//==============================================================================
// TEveBoxGL
//==============================================================================

//______________________________________________________________________________
// OpenGL renderer class for TEveBox.
//

ClassImp(TEveBoxGL);

//______________________________________________________________________________
TEveBoxGL::TEveBoxGL() :
   TGLObject(), fM(0)
{
   // Constructor.

   // fDLCache = kFALSE; // Disable display list.
}

//______________________________________________________________________________
Bool_t TEveBoxGL::SetModel(TObject* obj, const Option_t* /*opt*/)
{
   // Set model object.

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

//______________________________________________________________________________
void TEveBoxGL::SetBBox()
{
   // Set bounding box.

   // !! This ok if master sub-classed from TAttBBox
   SetAxisAlignedBBox(((TEveBox*)fExternalObj)->AssertBBox());
}

//==============================================================================

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 TEveBoxGL::RenderOutline(const Float_t p[8][3]) const
{
   // Render box with without normals.
   // To be used with lightning off, for outline.

   glBegin(GL_LINE_STRIP);
   glVertex3fv(p[0]); glVertex3fv(p[1]);
   glVertex3fv(p[5]); glVertex3fv(p[6]);
   glVertex3fv(p[2]); glVertex3fv(p[3]);
   glVertex3fv(p[7]); glVertex3fv(p[4]);
   glVertex3fv(p[0]); glVertex3fv(p[3]);
   glEnd();

   glBegin(GL_LINES);
   glVertex3fv(p[1]); glVertex3fv(p[2]);
   glVertex3fv(p[4]); glVertex3fv(p[5]);
   glVertex3fv(p[6]); glVertex3fv(p[7]);
   glEnd();
}

//______________________________________________________________________________
void TEveBoxGL::RenderBoxStdNorm(const Float_t p[8][3]) const
{
   // Render box with standard axis-aligned normals.

   glBegin(GL_QUADS);

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

   glEnd();
}

//______________________________________________________________________________
void TEveBoxGL::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]);

   glBegin(GL_QUADS);

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

   glEnd();
}

//______________________________________________________________________________
void TEveBoxGL::Draw(TGLRnrCtx& rnrCtx) const
{
   // Render with OpenGL.

   if (rnrCtx.IsDrawPassOutlineLine())
   {
      RenderOutline(fM->fVertices);
      return;
   }

   if (fM->fHighlightFrame && rnrCtx.Highlight())
   {
      if (fM->fDrawFrame)
      {
         glEnable(GL_BLEND);
         TGLUtil::LineWidth(fM->fLineWidth);
         TGLUtil::Color(fM->fLineColor);
      }
      RenderOutline(fM->fVertices);
   }
   else
   {
      TGLObject::Draw(rnrCtx);
   }
}

//______________________________________________________________________________
void TEveBoxGL::DirectDraw(TGLRnrCtx&) const
{
   // Render with OpenGL, create display-list.

   fMultiColor = (fM->fDrawFrame && fM->fFillColor != fM->fLineColor);

   glPushAttrib(GL_ENABLE_BIT);

   glEnable(GL_POLYGON_OFFSET_FILL);
   glPolygonOffset(1.0f, 1.0f);
   RenderBoxAutoNorm(fM->fVertices);
   glDisable(GL_POLYGON_OFFSET_FILL);

   // Frame
   if (fM->fDrawFrame)
   {
      glEnable(GL_BLEND);
      TGLUtil::Color(fM->fLineColor);
      TGLUtil::LineWidth(fM->fLineWidth);
      RenderOutline(fM->fVertices);
   }

   glPopAttrib();
}


//==============================================================================
// TEveBoxProjectedGL
//==============================================================================

//______________________________________________________________________________
// OpenGL renderer class for TEveBoxProjected.
//

ClassImp(TEveBoxProjectedGL);

//______________________________________________________________________________
TEveBoxProjectedGL::TEveBoxProjectedGL() :
   TGLObject(), fM(0)
{
   // Constructor.

   // fDLCache = kFALSE; // Disable display list.
}

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

//______________________________________________________________________________
Bool_t TEveBoxProjectedGL::SetModel(TObject* obj, const Option_t* /*opt*/)
{
   // Set model object.

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

//______________________________________________________________________________
void TEveBoxProjectedGL::SetBBox()
{
   // Set bounding box.

   SetAxisAlignedBBox(((TEveBoxProjected*)fExternalObj)->AssertBBox());
}

//------------------------------------------------------------------------------


//______________________________________________________________________________
void TEveBoxProjectedGL::RenderPoints(Int_t mode) const
{
   // Render points with given GL mode.
   // This is used for polygon and outline drawing.

   Int_t B = fM->fBreakIdx;
   Int_t N = fM->fPoints.size();
   if (B != 0)
   {
      glBegin(mode);
      for (Int_t i = 0; i < B; ++i)
      {
         glVertex2fv(fM->fPoints[i]);
      }
      glEnd();
   }
   glBegin(mode);
   for (Int_t i = B; i < N; ++i)
   {
      glVertex2fv(fM->fPoints[i]);
   }
   glEnd();
}

//______________________________________________________________________________
void TEveBoxProjectedGL::Draw(TGLRnrCtx& rnrCtx) const
{
   // Render with OpenGL.

   if (rnrCtx.IsDrawPassOutlineLine())
      return;

   glPushMatrix();
   glTranslatef(0.0f, 0.0f, fM->fDepth);

   if (fM->fHighlightFrame && rnrCtx.Highlight())
   {
      if (fM->fDrawFrame)
      {
         glEnable(GL_BLEND);
         TGLUtil::LineWidth(fM->fLineWidth);
         TGLUtil::Color(fM->fLineColor);
      }
      RenderPoints(GL_LINE_LOOP);
   }
   else
   {
      TGLObject::Draw(rnrCtx);
   }

   if (TEveBoxProjected::fgDebugCornerPoints && ! fM->fDebugPoints.empty())
   {
      glColor3f(1,0,0);
      Int_t N = fM->fDebugPoints.size();
      glPointSize(4);
      glBegin(GL_POINTS);
      for (Int_t i = 0; i < N; ++i)
      {
         glVertex2fv(fM->fDebugPoints[i]);
      }
      glEnd();
   }

   glPopMatrix();
}

//______________________________________________________________________________
void TEveBoxProjectedGL::DirectDraw(TGLRnrCtx&) const
{
   // Render with OpenGL, create display-list.

   fMultiColor = (fM->fDrawFrame && fM->fFillColor != fM->fLineColor);

   glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT | GL_POLYGON_BIT);

   glDisable(GL_LIGHTING);

   glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
   glEnable(GL_COLOR_MATERIAL);
   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
   glDisable(GL_CULL_FACE);

   glEnable(GL_POLYGON_OFFSET_FILL);
   glPolygonOffset(1.0f, 1.0f);
   RenderPoints(GL_POLYGON);
   glDisable(GL_POLYGON_OFFSET_FILL);

   // Frame
   if (fM->fDrawFrame)
   {
      glEnable(GL_BLEND);
      TGLUtil::Color(fM->fLineColor);
      TGLUtil::LineWidth(fM->fLineWidth);
      RenderPoints(GL_LINE_LOOP);
   }

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