// @(#)root/gl:$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 "TGLIncludes.h"
#include "TGLCameraOverlay.h"
#include "TGLViewer.h"
#include "TGLCamera.h"
#include "TGLSelectRecord.h"
#include "TGLUtil.h"
#include "TGLRnrCtx.h"
#include "TGLAxisPainter.h"

#include "TMath.h"
#include "TAxis.h"
#include "THLimitsFinder.h"

//______________________________________________________________________________
// A GL overlay element which displays camera furstum.
//

ClassImp(TGLCameraOverlay);

//______________________________________________________________________________
TGLCameraOverlay::TGLCameraOverlay(Bool_t showOrtho, Bool_t showPersp) :
   TGLOverlayElement(),

   fShowOrthographic(showOrtho),
   fShowPerspective(showPersp),

   fOrthographicMode(kAxis),
   fPerspectiveMode(kPlaneIntersect),

   fAxisPainter(0),
   fAxis(0),
   fAxisExtend(0.9),
   fUseAxisColors(kFALSE),

   fExternalRefPlane(),
   fUseExternalRefPlane(kFALSE)
{
   // Constructor.

   fFrustum[0] = fFrustum[1] = fFrustum[2] = fFrustum[3] = 0;

   fAxis = new TAxis();
   fAxis->SetNdivisions(710);
   fAxis->SetLabelSize(0.018);
   fAxis->SetLabelOffset(0.01);
   fAxis->SetAxisColor(kGray+1);
   fAxis->SetLabelColor(kGray+1);

   fAxisPainter = new TGLAxisPainter();
   fAxisPainter->SetFontMode(TGLFont::kBitmap);
   fAxisPainter->SetUseAxisColors(kFALSE);
}

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

   delete  fAxisPainter;
   delete  fAxis;
}

//______________________________________________________________________________
TAttAxis* TGLCameraOverlay::GetAttAxis()
{
   // Get axis attributes.

   return dynamic_cast<TAttAxis*>(fAxis);
}

//______________________________________________________________________________
void TGLCameraOverlay::SetFrustum(TGLCamera& cam)
{
   // Set frustum values from given camera.

   TGLVector3 absRef(1., 1., 1.); // needed in case if orthographic camera is negative
   Float_t l = -cam.FrustumPlane(TGLCamera::kLeft).D()  * Dot(cam.GetCamBase().GetBaseVec(2), absRef);
   Float_t r =  cam.FrustumPlane(TGLCamera::kRight).D() * Dot(cam.GetCamBase().GetBaseVec(2), absRef);
   Float_t t =  cam.FrustumPlane(TGLCamera::kTop).D();
   Float_t b = -cam.FrustumPlane(TGLCamera::kBottom).D();

   fFrustum[0] = l;
   fFrustum[1] = b;
   fFrustum[2] = r;
   fFrustum[3] = t;
}

//______________________________________________________________________________
void TGLCameraOverlay::RenderPlaneIntersect(TGLRnrCtx& rnrCtx)
{
   // Draw cross section coordinates in top right corner of screen.

   TGLCamera &cam = rnrCtx.RefCamera();
   // get eye line
   const TGLMatrix& mx =  cam.GetCamBase() * cam.GetCamTrans();
   TGLVertex3 d   = mx.GetTranslation();
   TGLVertex3 p = d + mx.GetBaseVec(1);
   TGLLine3  line(d, p);
   // get ref plane
   const TGLPlane rp = (fUseExternalRefPlane) ? fExternalRefPlane :
      TGLPlane(cam.GetCamBase().GetBaseVec(3), TGLVertex3());
   // get intersection
   std::pair<Bool_t, TGLVertex3> intersection;
   intersection = Intersection(rp, line, kTRUE);

   if (intersection.first)
   {
      TGLVertex3 v = intersection.second;

      glMatrixMode(GL_PROJECTION);
      glPushMatrix();
      glLoadIdentity();

      glMatrixMode(GL_MODELVIEW);
      glPushMatrix();
      glLoadIdentity();

      TGLRect &vp = rnrCtx.GetCamera()->RefViewport();
      TGLFont font;
      Int_t fs = TMath::Nint(TMath::Sqrt(vp.Width()*vp.Width() + vp.Height()*vp.Height())*0.02);
      rnrCtx.RegisterFontNoScale(fs, "arial", TGLFont::kPixmap, font);
      const char* txt = Form("(%f, %f, %f)", v[0], v[1], v[2]);
      TGLUtil::Color(rnrCtx.ColorSet().Markup());
      font.Render(txt, 0.98, 0.98, 0, TGLFont::kRight, TGLFont::kBottom);

      // render cross
      TGLUtil::Color(kRed);
      Float_t w = 0.02;  // cross size
      Float_t ce = 0.15; // empty space
      glBegin(GL_LINES);
      glVertex2f(0 +w*ce, 0);
      glVertex2f(0 +w,    0);

      glVertex2f(0 -w*ce, 0);
      glVertex2f(0 -w, 0);

      Float_t h = w*vp.Width()/vp.Height();
      glVertex2f(0, 0 +h*ce);
      glVertex2f(0, 0 +h);

      glVertex2f(0, 0 -h*ce);
      glVertex2f(0, 0 -h);
      glEnd();

      glPopMatrix();
      glMatrixMode(GL_PROJECTION);
      glPopMatrix();
      glMatrixMode(GL_MODELVIEW);
   }
}

//______________________________________________________________________________
void TGLCameraOverlay::RenderAxis(TGLRnrCtx& rnrCtx, Bool_t grid)
{
   // Draw axis on four edges and a transparent grid.

   fAxisPainter->SetAttAxis(fAxis);
   fAxisPainter->SetUseAxisColors(fUseAxisColors);

   Color_t lineColor = fUseAxisColors ? fAxis->GetAxisColor() : rnrCtx.ColorSet().Markup().GetColorIndex();

   // font size calculated relative to viewport diagonal
   GLint   vp[4]; glGetIntegerv(GL_VIEWPORT, vp);
   Float_t rl = 0.5 *((vp[2]-vp[0]) + (vp[3]-vp[1]));
   Int_t fsizePx = (Int_t)(fAxis->GetLabelSize()*rl);
   // tick length
   Float_t tlY = 0.015*rl/(vp[2]-vp[0]);
   Float_t tlX = 0.015*rl/(vp[3]-vp[1]);
   // corner vectors
   Float_t minX, maxX;
   TGLVector3 xdir = rnrCtx.RefCamera().GetCamBase().GetBaseVec(2); xdir.Normalise(); // left
   if (fFrustum[2] > fFrustum[0] )
   {
      minX =  fFrustum[0];
      maxX =  fFrustum[2];
   }
   else {
      xdir = -xdir;
      minX =  fFrustum[2];
      maxX =  fFrustum[0];
   }

   TGLVector3 ydir = rnrCtx.RefCamera().GetCamBase().GetBaseVec(3); ydir.Normalise(); // up
   TGLVector3 vy1 = ydir * fFrustum[1];
   TGLVector3 vy2 = ydir * fFrustum[3];

   TGLVector3 vx1 = xdir * minX;
   TGLVector3 vx2 = xdir * maxX;
   // range
   Double_t rngY = fFrustum[3] - fFrustum[1];
   Double_t rngX = maxX - minX;
   Double_t off =  TMath::Sqrt((rngX*rngX)+(rngY*rngY)) * 0.03;
   Double_t minY = fFrustum[1] + off;
   Double_t maxY = fFrustum[3] - off;
   minX += off;
   maxX -= off;

   // grid lines
   Char_t alpha = 80; //primary
   Char_t alpha2 = 90; //seconndary
   Int_t secSteps = fAxis->GetNdivisions() % 100;
   GLushort stipple =  0x5555; // 33333 more rare

   // horizontal X
   //
   fAxisPainter->SetLabelPixelFontSize(fsizePx);
   fAxis->SetTickLength(tlX);
   fAxisPainter->RefDir() = xdir;
   fAxis->SetLimits(minX, maxX);
   fAxisPainter->RefTMOff(0) = ydir*rngY;

   // bottom
   glPushMatrix();
   glTranslated(vy1.X(), vy1.Y(), vy1.Z());
   fAxisPainter->SetLabelAlign(TGLFont::kCenterH, TGLFont::kTop);
   fAxisPainter->PaintAxis(rnrCtx, fAxis);
   glPopMatrix();

   // top
   glPushMatrix();
   glTranslated(vy2.X(), vy2.Y(), vy2.Z());
   fAxisPainter->SetLabelAlign(TGLFont::kCenterH, TGLFont::kBottom);
   fAxisPainter->RefTMOff(0).Negate();
   fAxisPainter->RnrLabels();
   fAxisPainter->RnrLines();
   glPopMatrix();

   TGLUtil::LineWidth(1);
   if (grid)
   {
      TGLAxisPainter::LabVec_t& labs = fAxisPainter->RefLabVec();
      TGLVector3 tmp;
      // draw label vertical lines
      TGLUtil::ColorTransparency(lineColor, alpha);
      glBegin(GL_LINES);
      for ( TGLAxisPainter::LabVec_t::iterator i = labs.begin(); i != labs.end(); i++)
      {
         tmp = vy1 + xdir * (i->first);
         glVertex3dv(tmp.Arr());
         tmp = vy2 + xdir * (i->first);
         glVertex3dv(tmp.Arr());
      }
      glEnd();

      // secondary tick mark lines
      if (labs.size() > 1)
      {
         TGLUtil::ColorTransparency(lineColor, alpha2);
         glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT);
         glEnable(GL_LINE_STIPPLE);
         glLineStipple(1, stipple);

         glBegin(GL_LINES);
         Int_t    ondiv = 0;
         Double_t omin = 0, omax = 0, bw1 = 0;
         THLimitsFinder::Optimize(labs[0].second, labs[1].second, secSteps, omin, omax, ondiv, bw1);
         Double_t val = labs[0].second;
         while (val < fFrustum[2])
         {
            for (Int_t k=0; k<ondiv; k++)
            {
               val += bw1;
               tmp = vy1 + xdir * val;
               glVertex3dv(tmp.Arr());
               tmp = vy2 + xdir * val;
               glVertex3dv(tmp.Arr());
            }
         }
         val = labs[0].second - bw1;
         while(val > fFrustum[0])
         {
            tmp = vy1 + xdir * val;
            glVertex3dv(tmp.Arr());
            tmp = vy2 + xdir * val;
            glVertex3dv(tmp.Arr());
            val -= bw1;
         }
         glEnd();
         glPopAttrib();
      }
   } // draw grid

   //
   // vertical Y axis
   //

   fAxis->SetTickLength(tlY);
   fAxisPainter->RefDir() = ydir;
   fAxis->SetLimits(minY, maxY);
   fAxisPainter->RefTMOff(0) = xdir*rngX;
   // left
   glPushMatrix();
   glTranslated(vx1.X(), vx1.Y(), vx1.Z());
   fAxisPainter->SetLabelAlign(TGLFont::kLeft, TGLFont::kCenterV);
   fAxisPainter->PaintAxis(rnrCtx, fAxis);
   glPopMatrix();
   // right
   glPushMatrix();
   glTranslated(vx2.X(), vx2.Y(), vx2.Z());
   fAxisPainter->SetLabelAlign(TGLFont::kRight, TGLFont::kCenterV);
   fAxisPainter->RefTMOff(0).Negate();
   fAxisPainter->RnrLabels();
   fAxisPainter->RnrLines();
   glPopMatrix();

   if (grid)
   {
      TGLAxisPainter::LabVec_t& labs = fAxisPainter->RefLabVec();
      TGLVector3 tmp;
      // draw label horizontal lines
      TGLUtil::ColorTransparency(lineColor, alpha);
      glBegin(GL_LINES);
      for ( TGLAxisPainter::LabVec_t::iterator i = labs.begin(); i != labs.end(); i++)
      {
         tmp = vx1 + ydir *(i->first);
         glVertex3dv(tmp.Arr());
         tmp = vx2 + ydir *(i->first);
         glVertex3dv(tmp.Arr());
      }
      glEnd();

      // secondary tick mark lines
      if (labs.size() > 1)
      {
         TGLUtil::ColorTransparency(lineColor, alpha2);
         glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT);
         glEnable(GL_LINE_STIPPLE);
         glLineStipple(1, stipple);

         glBegin(GL_LINES);
         Int_t    ondiv;
         Double_t omin = 0, omax = 0, bw1 = 0;
         Double_t val  = 0;
         THLimitsFinder::Optimize(labs[0].second, labs[1].second, secSteps, omin, omax, ondiv, bw1);
         val = labs[0].second;
         while(val < fFrustum[3])
         {
            for(Int_t k=0; k<ondiv; k++)
            {
               val += bw1;
               tmp = vx1 + ydir *val;
               glVertex3dv(tmp.Arr());
               tmp = vx2 + ydir * val;
               glVertex3dv(tmp.Arr());
            }
         }

         val = labs[0].second - bw1;
         while(val > fFrustum[1])
         {
            tmp = vx1 + ydir *val;
            glVertex3dv(tmp.Arr());
            tmp = vx2 + ydir * val;
            glVertex3dv(tmp.Arr());
            val -= bw1;
         }
         glEnd();
         glPopAttrib();
      }
   } // draw grid
}

//______________________________________________________________________________
void TGLCameraOverlay::RenderBar(TGLRnrCtx&  rnrCtx)
{
   // Show frustum size with fixed screen line length and printed value.

   // factors 10, 5 and 2 are allowed
   Double_t wfrust     = TMath::Abs(fFrustum[2]-fFrustum[0]);
   Float_t barsize= 0.14* wfrust;
   Int_t exp = (Int_t) TMath::Floor(TMath::Log10(barsize));
   Double_t fact = barsize/TMath::Power(10, exp);
   Double_t red;
   if (fact > 5)
   {
      red = 5*TMath::Power(10, exp);
   }
   else if (fact > 2)
   {
      red = 2*TMath::Power(10, exp);
   } else
   {
      red = TMath::Power(10, exp);
   }

   TGLVector3 v;
   TGLVector3 xdir = rnrCtx.RefCamera().GetCamBase().GetBaseVec(2); // left
   TGLVector3 ydir = rnrCtx.RefCamera().GetCamBase().GetBaseVec(3); // up
   xdir.Normalise();
   ydir.Normalise();

   TGLUtil::Color(rnrCtx.ColorSet().Foreground());

   const char* txt = Form("%.*f", (exp < 0) ? -exp : 0, red);
   Float_t bb[6];
   TGLFont font;
   rnrCtx.RegisterFont(12, "arial", TGLFont::kPixmap, font);
   font.BBox(txt, bb[0], bb[1], bb[2], bb[3], bb[4], bb[5]);
   TGLRect &vp = rnrCtx.GetCamera()->RefViewport();
   Double_t mH = (fFrustum[3]-fFrustum[1])*bb[4]/vp.Height();
   glPushMatrix();
   v = xdir*(fFrustum[2]-barsize) + ydir*(fFrustum[3] - mH*1.5);
   glTranslated(v.X(), v.Y(), v.Z());
   glRasterPos2i(0,0);
   font.Render(txt);
   glPopMatrix();

   glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT);
   TGLUtil::LineWidth(2.);
   glPushMatrix();
   Float_t xt = fFrustum[2] - 1.1*barsize;
   Float_t yt = fFrustum[3] - 2.1*mH;
   v = xdir*xt + ydir*yt;
   glTranslated(v.X(), v.Y(), v.Z());

   glBegin(GL_LINES);
   // horizontal static
   v = red*xdir;
   glVertex3dv(v.Arr());
   v = barsize*xdir;
   glVertex3dv(v.Arr());
   // corner bars end
   v = xdir*barsize + ydir*mH;
   glVertex3dv(v.Arr());
   v = xdir*barsize - ydir*mH;
   glVertex3dv(v.Arr());
   // corner bar start
   TGLUtil::Color(kRed);
   v = ydir*mH;
   glVertex3dv(v.Arr());
   v.Negate();
   glVertex3dv(v.Arr());
   // marker pointer
   v = red*ydir;
   glVertex3dv(v.Arr());
   v += ydir*mH;
   glVertex3dv(v.Arr());
   //marker line
   glVertex3d(0, 0., 0.);
   v = red*xdir;
   glVertex3dv(v.Arr());
   glEnd();
   glPopAttrib();
   glPopMatrix();
}

//______________________________________________________________________________
void TGLCameraOverlay::Render(TGLRnrCtx& rnrCtx)
{
   // Display coodinates info of current frustum.

   TGLCamera &cam = rnrCtx.RefCamera();

   if (rnrCtx.Selection() ||
       (cam.IsPerspective()  && ! fShowPerspective) ||
       (cam.IsOrthographic() && ! fShowOrthographic))
   {
      return;
   }

   glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

   TGLUtil::Color(rnrCtx.ColorSet().Markup());
   TGLCapabilitySwitch lights_off(GL_LIGHTING, kFALSE);
   Float_t old_depth_range[2];
   glGetFloatv(GL_DEPTH_RANGE, old_depth_range);

   SetFrustum(cam);

   if (cam.IsOrthographic())
   {
      switch (fOrthographicMode)
      {
         case kBar:
            glDepthRange(0, 0.1);
            RenderBar(rnrCtx);
            break;
         case kAxis:
            glDepthRange(0, 0.1);
            RenderAxis(rnrCtx, kFALSE);
            break;
         case kGridFront:
            glDepthRange(0, 0.1);
            RenderAxis(rnrCtx, kTRUE);
            break;
         case kGridBack:
            glDepthRange(1, 0.9);
            RenderAxis(rnrCtx, kTRUE);
            break;
         default:
            break;
      };
   }
   else
   {
      RenderPlaneIntersect(rnrCtx);
   }

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