// @(#)root/eve:$Id$
// Author: Matevz Tadel, Jochen Thaeder 2009

/*************************************************************************
 * 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 "TEveJetConeGL.h"
#include "TEveJetCone.h"
#include "TEveProjectionManager.h"

#include "TMath.h"

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

//==============================================================================
// TEveJetConeGL
//==============================================================================

//______________________________________________________________________________
// OpenGL renderer class for TEveJetCone.
//

ClassImp(TEveJetConeGL);

//______________________________________________________________________________
TEveJetConeGL::TEveJetConeGL() :
   TGLObject(), fC(0)
{
   // Constructor.

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

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

   fC = SetModelDynCast<TEveJetCone>(obj);
   return kTRUE;
}

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

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

//______________________________________________________________________________
void TEveJetConeGL::DLCacheClear()
{
   // Clear DL cache and reset internal point array.

   fP.clear();
   TGLObject::DLCacheClear();
}

//______________________________________________________________________________
void TEveJetConeGL::CalculatePoints() const
{
   // Calculate points for drawing.

   assert(fC->fNDiv > 2);

   const Int_t  NP = fC->fNDiv;
   fP.resize(NP);
   {
      Float_t angle_step = TMath::TwoPi() / NP;
      Float_t angle      = 0;
      for (Int_t i = 0; i < NP; ++i, angle += angle_step)
      {
         fP[i] = fC->CalcBaseVec(angle);
      }
   }
}

//______________________________________________________________________________
void TEveJetConeGL::Draw(TGLRnrCtx& rnrCtx) const
{
   // Draw the cone.

   if (fP.empty()) CalculatePoints();

   if (fC->fHighlightFrame && rnrCtx.Highlight())
   {
      glPushAttrib(GL_ENABLE_BIT);
      glDisable(GL_LIGHTING);

      if (fC->fDrawFrame)
      {
         TGLUtil::LineWidth(fC->fLineWidth);
         TGLUtil::Color(fC->fLineColor);
      }

      const Int_t NP = fP.size();
      glBegin(GL_LINE_LOOP);
      for (Int_t i = 0; i < NP; ++i)
         glVertex3fv(fP[i]);
      glEnd();
      glBegin(GL_LINES);
      Double_t angle = 0;
      for (Int_t i = 0; i < 4; ++i, angle += TMath::PiOver2())
      {
         glVertex3fv(fC->fApex);
         glVertex3fv(fC->CalcBaseVec(angle));
      }
      glEnd();

      glPopAttrib();
   }
   else
   {
      TGLObject::Draw(rnrCtx);
   }
}

//______________________________________________________________________________
void TEveJetConeGL::DirectDraw(TGLRnrCtx& /*rnrCtx*/) const
{
   // Render with OpenGL.

   // printf("TEveJetConeGL::DirectDraw LOD %d\n", rnrCtx.CombiLOD());

   glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT | GL_LIGHTING_BIT);

   glDisable(GL_CULL_FACE);
   glEnable(GL_NORMALIZE);
   Int_t lmts = 1;
   glLightModeliv(GL_LIGHT_MODEL_TWO_SIDE, &lmts);

   const Int_t  NP = fC->fNDiv;
   Int_t prev = NP - 1;
   Int_t i    = 0;
   Int_t next = 1;

   TEveVector curr_normal;
   TEveVector prev_normal;
   TMath::Cross((fP[next] - fP[prev]).Arr(), (fP[i] - fC->fApex).Arr(), prev_normal.Arr());

   prev = i; i = next; ++next;

   glBegin(GL_TRIANGLES);
   do
   {
      TMath::Cross((fP[next] - fP[prev]).Arr(), (fP[i] - fC->fApex).Arr(), curr_normal.Arr());

      glNormal3fv(prev_normal);
      glVertex3fv(fP[prev]);

      glNormal3fv(prev_normal + curr_normal);
      glVertex3fv(fC->fApex);

      glNormal3fv(curr_normal);
      glVertex3fv(fP[i]);

      prev_normal = curr_normal;

      prev = i;
      i    = next;
      ++next; if (next >= NP) next = 0;
   } while (prev != 0);
   glEnd();

   glPopAttrib();
}


//==============================================================================
// TEveJetConeProjectedGL
//==============================================================================

//______________________________________________________________________________
// OpenGL renderer class for TEveJetConeProjected.
//

ClassImp(TEveJetConeProjectedGL);

//______________________________________________________________________________
TEveJetConeProjectedGL::TEveJetConeProjectedGL() :
   TEveJetConeGL(), fM(0)
{
   // Constructor.

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

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

   fM = SetModelDynCast<TEveJetConeProjected>(obj);
   fC = dynamic_cast<TEveJetCone*>(fM->GetProjectable());
   return fC != 0;
}

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

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

namespace
{
   struct less_eve_vec_phi_t
   {
      bool operator()(const TEveVector& a, const TEveVector& b)
      { return a.Phi() < b.Phi(); }
   };
}

//______________________________________________________________________________
void TEveJetConeProjectedGL::CalculatePoints() const
{
   // Calculate points for drawing.

   static const TEveException kEH("TEveJetConeProjectedGL::CalculatePoints ");

   fP.resize(3);

   TEveProjection *proj = fM->GetManager()->GetProjection();

   switch (proj->GetType())
   {
      case TEveProjection::kPT_RPhi:
      {
         fP[0] = fC->fApex;
         fP[1] = fC->CalcBaseVec(TMath::Pi() + TMath::PiOver2());
         fP[2] = fC->CalcBaseVec(TMath::PiOver2());

         for (Int_t i = 0; i < 3; ++i)
            proj->ProjectVector(fP[i], fM->fDepth);

         break;
      }

      case TEveProjection::kPT_RhoZ:
      {
         fP[0] = fC->fApex;
         fP[1] = fC->CalcBaseVec(0);
         fP[2] = fC->CalcBaseVec(TMath::Pi());

         Float_t tm = fP[1].Theta();
         Float_t tM = fP[2].Theta();

         if (tM > fC->fThetaC && tm < fC->fThetaC)
         {
            fP.reserve(fP.size() + 1);
            TEveVector v(0, fC->fLimits.fY, fC->fLimits.fZ);
            fP.push_back(fC->CalcBaseVec(v.Eta(), fC->fPhi));
         }

         if (tM > TMath::Pi() - fC->fThetaC && tm < TMath::Pi() - fC->fThetaC)
         {
            fP.reserve(fP.size() + 1);
            TEveVector v(0, fC->fLimits.fY, -fC->fLimits.fZ);
            fP.push_back(fC->CalcBaseVec(v.Eta(), fC->fPhi));
         }

         const Int_t NP = fP.size();
         for (Int_t i = 0; i < NP; ++i)
            proj->ProjectVector(fP[i], fM->fDepth);

         std::sort(fP.begin() + 1, fP.end(), less_eve_vec_phi_t());

         break;
      }

      default:
         throw kEH + "Unsupported projection type.";
   }

}

//______________________________________________________________________________
void TEveJetConeProjectedGL::RenderOutline() const
{
   // Draw jet outline.

   const Int_t NP = fP.size();
   glBegin(GL_LINE_LOOP);
   for (Int_t i = 0; i < NP; ++i)
   {
      glVertex3fv(fP[i].Arr());
   }
   glEnd();
}

//______________________________________________________________________________
void TEveJetConeProjectedGL::RenderPolygon() const
{
   // Draw jet surface.

   const Int_t NP = fP.size();
   glBegin(GL_POLYGON);
   for (Int_t i = 0; i < NP; ++i)
   {
      glVertex3fv(fP[i].Arr());
   }
   glEnd();
}

//______________________________________________________________________________
void TEveJetConeProjectedGL::Draw(TGLRnrCtx& rnrCtx) const
{
   // Draw the cone.

   if (fP.empty()) CalculatePoints();

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


//______________________________________________________________________________
void TEveJetConeProjectedGL::DirectDraw(TGLRnrCtx& /*rnrCtx*/) const
{
   // Render with OpenGL.

   // printf("TEveJetConeProjectedGL::DirectDraw LOD %d\n", rnrCtx.CombiLOD());

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

   glPushAttrib(GL_ENABLE_BIT);
   glDisable(GL_LIGHTING);

   if (fM->fDrawFrame)
   {
      glEnable(GL_POLYGON_OFFSET_FILL);
      glPolygonOffset(1.0f, 1.0f);
   }

   RenderPolygon();

   if (fM->fDrawFrame)
   {
      glEnable(GL_LINE_SMOOTH);

      TGLUtil::Color(fM->fLineColor);
      TGLUtil::LineWidth(fM->fLineWidth);
      RenderOutline();
   }

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