// @(#)root/eve:$Id$
// Author: Alja Mrak-Tadel 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 "TEveProjectionAxesGL.h"
#include "TEveProjectionAxes.h"
#include "TEveProjectionManager.h"
#include "THLimitsFinder.h"

#include "TGLIncludes.h"
#include "TGLRnrCtx.h"
#include "TGLFontManager.h"
#include "TGLCamera.h"

#include "TMath.h"

//______________________________________________________________________________
//
// OpenGL renderer class for TEveProjectionAxes.
//

ClassImp(TEveProjectionAxesGL);

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

   fDLCache    = kFALSE; // Disable display list.
}

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

   fM = SetModelDynCast<TEveProjectionAxes>(obj);
   fAxisPainter.SetAttAxis(fM);
   return fM->GetManager() ? kTRUE : kFALSE;
}

//______________________________________________________________________________
void TEveProjectionAxesGL::SetBBox()
{
   // Fill the bounding-box data of the logical-shape.
   // Virtual from TGLObject.

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

//______________________________________________________________________________
void TEveProjectionAxesGL::FilterOverlappingLabels(Int_t idx, Float_t ref) const
{
   TGLAxisPainter::LabVec_t &orig = fAxisPainter.RefLabVec();
   if (orig.size() == 0) return;

   Float_t center = fM->GetManager()->GetProjection()->GetProjectedCenter()[idx];

   // Get index of label closest to the distortion center.
   // Needed to keep simetry around center.
   Int_t minIdx = 0;
   Int_t cnt = 0;
   Float_t currD = 0;
   Float_t minD = TMath::Abs(orig[0].first -center);
   for (TGLAxisPainter::LabVec_t::iterator it = orig.begin(); it != orig.end(); ++it)
   {
      currD = TMath::Abs((*it).first - center);
      if (minD > currD)
      {
         minD = currD;
         minIdx = cnt;
      }
      cnt++;
   }

   // Minimum allowed distance 4* font size.
   TGLAxisPainter::LabVec_t  filtered;
   filtered.push_back(orig[minIdx]);
   Int_t size = orig.size();
   Float_t minDist = 4*fM->GetLabelSize()*ref;
   Float_t pos = 0;

   // Go from center to minimum.
   if (minIdx > 0)
   {
      pos =  orig[minIdx].first;
      for (Int_t i=minIdx-1; i>=0; --i)
      {
         if (TMath::Abs(pos - orig[i].first) > minDist)
         {
            filtered.push_back(orig[i]);
            pos = orig[i].first;
         }
      }
   }

   // Go from center to maximum.
   if (minIdx < (size -1))
   {
      pos =  orig[minIdx].first;
      for (Int_t i=minIdx+1; i<size; ++i)
      {
         if (TMath::Abs(orig[i].first - pos) > minDist)
         {
            filtered.push_back(orig[i]);
            pos = orig[i].first;
         }
      }
   }

   // Set labels list and text format.
   if (filtered.size() >= 2)
   {
      if ( minIdx > 0 )
         fAxisPainter.SetTextFormat(orig.front().second, orig.back().second,  orig[minIdx].second - orig[minIdx-1].second);
      else
         fAxisPainter.SetTextFormat(orig.front().second, orig.back().second,  orig[minIdx+1].second - orig[minIdx].second);

      fAxisPainter.RefLabVec().swap(filtered);
   }
   else
   {
      fAxisPainter.SetTextFormat(orig.front().second, orig.back().second,  orig.back().second - orig.front().second);
   }
}

//______________________________________________________________________________
void TEveProjectionAxesGL::SplitInterval(Float_t p1, Float_t p2, Int_t ax) const
{
   // Build an array of tick-mark position-value pairs.

   fAxisPainter.RefLabVec().clear();
   fAxisPainter.RefTMVec().clear();

   // Get list of label position-value pairs.


   // Minimum/maximum are defined at the front/back element of list.
   fAxisPainter.RefTMVec().push_back(TGLAxisPainter::TM_t(p1, -1));

   if (fM->GetLabMode() == TEveProjectionAxes::kValue)
   {
      SplitIntervalByVal(p1, p2, ax);
   }
   else if (fM->GetLabMode() == TEveProjectionAxes::kPosition)
   {
      SplitIntervalByPos(p1, p2, ax);
   }
}

//______________________________________________________________________________
void TEveProjectionAxesGL::SplitIntervalByPos(Float_t p1, Float_t p2, Int_t ax) const
{
   // Add tick-marks at equidistant position.

   // Limits.
   Int_t n1a = TMath::FloorNint(fM->GetNdivisions() / 100);
   Int_t n2a = fM->GetNdivisions() - n1a * 100;
   Int_t bn1, bn2;
   Double_t bw1, bw2;                   // bin with first second order
   Double_t bl1=0, bh1=0, bl2=0, bh2=0; // bin low, high first second order
   THLimitsFinder::Optimize(p1, p2, n1a, bl1, bh1, bn1, bw1);
   THLimitsFinder::Optimize(bl1, bl1+bw1, n2a, bl2, bh2, bn2, bw2);

   Int_t n1=TMath::CeilNint(p1/bw1);
   Int_t n2=TMath::FloorNint(p2/bw1);

   TGLAxisPainter::LabVec_t &labVec = fAxisPainter.RefLabVec();
   TGLAxisPainter::TMVec_t  &tmVec =  fAxisPainter.RefTMVec();

   Float_t p = n1*bw1;
   Float_t pMinor = p;
   for (Int_t l=n1; l<=n2; l++)
   {
      // Labels.
      labVec.push_back( TGLAxisPainter::Lab_t(p , fProjection->GetValForScreenPos(ax, p)));

      // Tick-marks.
      tmVec.push_back(TGLAxisPainter::TM_t(p, 0));
      pMinor = p+bw2;
      for (Int_t i=1; i<bn2; i++)
      {
         if (pMinor > p2)  break;
         tmVec.push_back( TGLAxisPainter::TM_t(pMinor, 1));
         pMinor += bw2;
      }
      p += bw1;
   }

   // Complete second order tick-marks.
   pMinor = n1*bw1 -bw2;
   while ( pMinor > p1)
   {
      tmVec.push_back(TGLAxisPainter::TM_t(pMinor, 1));
      pMinor -=bw2;
   }
}

//______________________________________________________________________________
void TEveProjectionAxesGL::SplitIntervalByVal(Float_t p1, Float_t p2, Int_t ax) const
{
   // Add tick-marks on fixed value step.


   TGLAxisPainter::LabVec_t &labVec =  fAxisPainter.RefLabVec();
   TGLAxisPainter::TMVec_t  &tmVec  =  fAxisPainter.RefTMVec();

   // Limits
   Int_t n1a = TMath::FloorNint(fM->GetNdivisions() / 100);
   Int_t n2a = fM->GetNdivisions() - n1a * 100;
   Int_t bn1, bn2;
   Double_t bw1, bw2;                   // bin width first / second order
   Double_t bl1=0, bh1=0, bl2=0, bh2=0; // bin low, high first / second order
   Float_t v1 = fProjection->GetValForScreenPos(ax, p1);
   Float_t v2 = fProjection->GetValForScreenPos(ax, p2);
   THLimitsFinder::Optimize(v1,  v2,      n1a, bl1, bh1, bn1, bw1);
   THLimitsFinder::Optimize(bl1, bl1+bw1, n2a, bl2, bh2, bn2, bw2);

   Float_t pFirst, pSecond; // position of first, second order of tickmarks
   Float_t v = bl1;

   // cache values here
   TEveVector dirVec;
   fProjection->SetDirectionalVector(ax, dirVec);
   TEveVector oCenter;
   fProjection->GetOrthogonalCenter(ax, oCenter);

   // step
   for (Int_t l=0; l<=bn1; l++)
   {
      // Labels.
      pFirst = fProjection->GetScreenVal(ax, v);
      labVec.push_back(TGLAxisPainter::Lab_t(pFirst , v));
      tmVec.push_back(TGLAxisPainter::TM_t(pFirst, 0));

      // Tickmarks.
      for (Int_t k=1; k<bn2; k++)
      {
         pSecond = fProjection->GetScreenVal(ax, v+k*bw2, dirVec, oCenter);
         if (pSecond > p2)  break;
         tmVec.push_back(TGLAxisPainter::TM_t(pSecond, 1));
      }
      v += bw1;
   }

   // Complete second order tick-marks.
   v = bl1 -bw2;
   while ( v > v1)
   {
      pSecond = fProjection->GetScreenVal(ax, v, dirVec, oCenter);
      if (pSecond < p1)  break;
      tmVec.push_back(TGLAxisPainter::TM_t(pSecond, 1));
      v -= bw2;
   }
}

//______________________________________________________________________________
void TEveProjectionAxesGL::GetRange(Int_t ax, Float_t frustMin, Float_t frustMax, Float_t& min, Float_t& max) const
{
   // Get range from bounding box of projection manager and furstum size.

   Float_t* bb = fM->fManager->GetBBox();
   // enlarge bbox times 2
   Float_t bbMin = bb[ax*2];
   Float_t bbMax = bb[ax*2 + 1];
   Float_t off = ( bb[ax*2 + 1] - bb[ax*2]) * 0.5;
   bbMin -= off;
   bbMax += off;


   // minimum
   if (frustMin > bbMin)   {
      min = frustMin;
      min += (frustMax - frustMin) * 0.1;
   }
   else {
      min = bbMin;
   }

   // maximum
   if (frustMax < bbMax) {
      max = frustMax;
      max -= (frustMax - frustMin) * 0.1;
   }
   else {
      max = bbMax;
   }
}

//______________________________________________________________________________
void TEveProjectionAxesGL::Draw(TGLRnrCtx& rnrCtx) const
{
   // Draw function for TEveProjectionAxesGL. Skips line-pass of outline mode.

   if (rnrCtx.IsDrawPassOutlineLine())
      return;

   TGLObject::Draw(rnrCtx);
}

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

   if (rnrCtx.Selection() || rnrCtx.Highlight() || fM->fManager->GetBBox() == 0) return;

   glPushAttrib(GL_ENABLE_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);

   // Draw on front-clipping plane.
   Float_t old_depth_range[2];
   glGetFloatv(GL_DEPTH_RANGE, old_depth_range);
   glDepthRange(0, 0.001);

   // Frustum size.
   TGLCamera &camera = rnrCtx.RefCamera();
   Float_t l = -camera.FrustumPlane(TGLCamera::kLeft).D();
   Float_t r =  camera.FrustumPlane(TGLCamera::kRight).D();
   Float_t t =  camera.FrustumPlane(TGLCamera::kTop).D();
   Float_t b = -camera.FrustumPlane(TGLCamera::kBottom).D();

   if (fM->fUseColorSet)
   {
      TGLUtil::Color(rnrCtx.ColorSet().Markup());
      fAxisPainter.SetUseAxisColors(kFALSE);
   }

   fProjection = fM->GetManager()->GetProjection();
   glDisable(GL_LIGHTING);
   // Projection center and origin marker.
   {
      Float_t d = ((r-l) > (b-t)) ? (b-t) : (r-l);
      d *= 0.02f;
      if (fM->GetDrawCenter())
      {
         Float_t* c = fProjection->GetProjectedCenter();
         TGLUtil::LineWidth(1);
         glBegin(GL_LINES);
         glVertex3f(c[0] + d, c[1], c[2]); glVertex3f(c[0] - d, c[1], c[2]);
         glVertex3f(c[0], c[1] + d, c[2]); glVertex3f(c[0], c[1] - d, c[2]);
         glVertex3f(c[0], c[1], c[2] + d); glVertex3f(c[0], c[1], c[2] - d);
         glEnd();
      }
      if (fM->GetDrawOrigin())
      {
         TEveVector zero;
         fProjection->ProjectVector(zero, 0);
         TGLUtil::LineWidth(1);
         glBegin(GL_LINES);
         glVertex3f(zero[0] + d, zero[1], zero[2]); glVertex3f(zero[0] - d, zero[1], zero[2]);
         glVertex3f(zero[0], zero[1] + d, zero[2]); glVertex3f(zero[0], zero[1] - d, zero[2]);
         glVertex3f(zero[0], zero[1], zero[2] + d); glVertex3f(zero[0], zero[1], zero[2] - d);
         glEnd();
      }
   }

   //
   // Axes.
   try {
      using namespace TMath;
      GLint   vp[4];
      glGetIntegerv(GL_VIEWPORT, vp);
      Float_t refLength =  TMath::Sqrt((TMath::Power(vp[2]-vp[0], 2) + TMath::Power(vp[3]-vp[1], 2)));
      Float_t tickLength = TMath::Sqrt((TMath::Power(r-l, 2) + TMath::Power(t-b, 2)));
      fAxisPainter.SetFontMode(TGLFont::kPixmap);
      fAxisPainter.SetLabelFont(rnrCtx, TGLFontManager::GetFontNameFromId(fM->GetLabelFont()),  TMath::CeilNint(refLength*fM->GetLabelSize()), tickLength*fM->GetLabelSize());

      Float_t min, max;
      // X-axis.
      if (fM->fAxesMode == TEveProjectionAxes::kAll ||
          fM->fAxesMode == TEveProjectionAxes::kHorizontal)
      {
         GetRange(0, l, r, min, max);
         SplitInterval(min, max, 0);

         FilterOverlappingLabels(0, r-l);
         fAxisPainter.RefTMVec().push_back(TGLAxisPainter::TM_t(max, -1));

         fAxisPainter.RefDir().Set(1, 0, 0);
         fAxisPainter.RefTMOff(0).Set(0, tickLength, 0);

         // Bottom.
         glPushMatrix();
         glTranslatef( 0, b, 0);
         fAxisPainter.SetLabelAlign(TGLFont::kCenterH, TGLFont::kTop);
         fAxisPainter.RnrLabels();
         fAxisPainter.RnrLines();
         glPopMatrix();

         // Top.
         glPushMatrix();
         glTranslatef( 0, t, 0);
         fAxisPainter.SetLabelAlign(TGLFont::kCenterH, TGLFont::kBottom);
         fAxisPainter.RefTMOff(0).Negate();
         fAxisPainter.RnrLabels();
         fAxisPainter.RnrLines();
         glPopMatrix();
      }

      // Y-axis.
      if (fM->fAxesMode == TEveProjectionAxes::kAll ||
          fM->fAxesMode == TEveProjectionAxes::kVertical)
      {
         GetRange(1, b, t, min, max);
         SplitInterval(min, max, 1);

         FilterOverlappingLabels(1, t-b);
         fAxisPainter.RefTMVec().push_back(TGLAxisPainter::TM_t(max, -1));

         fAxisPainter.RefDir().Set(0, 1, 0);
         fAxisPainter.RefTMOff(0).Set(tickLength, 0 , 0);

         // Left.
         glPushMatrix();
         glTranslatef(l, 0, 0);
         fAxisPainter.SetLabelAlign(TGLFont::kLeft, TGLFont::kCenterV);
         fAxisPainter.RnrLabels();
         fAxisPainter.RnrLines();
         glPopMatrix();

         // Right.
         glPushMatrix();
         glTranslatef(r, 0, 0);
         fAxisPainter.SetLabelAlign(TGLFont::kRight, TGLFont::kCenterV);
         fAxisPainter.RefTMOff(0).Negate();
         fAxisPainter.RnrLabels();
         fAxisPainter.RnrLines();
         glPopMatrix();
      }
   }
   catch (TEveException& exc)
   {
      Warning("TEveProjectionAxesGL::DirectDraw", "caught exception: '%s'.", exc.Data());
   }

   glDepthRange(old_depth_range[0], old_depth_range[1]);

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