ROOT logo
// @(#)root/eve:$Id: TGLCameraOverlay.cxx 28378 2009-04-28 15:40:53Z matevz $
// 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"

//______________________________________________________________________________
// 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),

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

   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);
}

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

   delete  fAxisPainter;
   delete  fAxis;
}

//______________________________________________________________________________
TAttAxis* TGLCameraOverlay::GetAttAxis()
{
   return dynamic_cast<TAttAxis*>(fAxis);
}

//______________________________________________________________________________
void TGLCameraOverlay::RenderPlaneIntersect(TGLRnrCtx& rnrCtx)
{
   // Print corss 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 = TGLFontManager::GetFontSize((vp.Width()+vp.Height())*0.01);
      rnrCtx.RegisterFont(fs, "arial", TGLFont::kPixmap, font);
      Float_t bb[6];
      const char* txt = Form("(%f, %f, %f)", v[0], v[1], v[2]);
      font.BBox(txt, bb[0], bb[1], bb[2], bb[3], bb[4], bb[5]);
      Float_t off = 1.5*bb[4];
      off /= vp.Height() ;
      TGLUtil::Color(kGray);
      font.RenderBitmap(txt, 1 -off, 1-off, 0,TGLFont::kRight);

      // 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)
{
   // Draw axis on four edges.

   // All four axis has to have same font.
   // Size of font calculated relative to viewport diagonal
   fAxisPainter->SetAttAxis(fAxis);
   GLint   vp[4]; glGetIntegerv(GL_VIEWPORT, vp);
   Float_t rl = 0.5 *((vp[2]-vp[0]) + (vp[3]-vp[1]));
   Int_t fsize = (Int_t)(fAxis->GetLabelSize()*rl);
   Float_t tlY = 0.015*rl/(vp[2]-vp[0]);
   Float_t tlX = 0.015*rl/(vp[3]-vp[1]);


   TGLVector3 xdir = rnrCtx.RefCamera().GetCamBase().GetBaseVec(2); // left
   TGLVector3 ydir = rnrCtx.RefCamera().GetCamBase().GetBaseVec(3); // up
   xdir.Normalise();
   ydir.Normalise();
   Float_t tms = 0;
   // horizontal X
   //
   {
      fAxisPainter->SetLabelPixelFontSize(fsize);
      fAxis->SetTickLength(tlX);
      fAxisPainter->RefDir() = xdir;
      Float_t axisXOff = (fFrustum[2] - fFrustum[0]) * (1 - fAxisExtend);
      fAxis->SetLimits(fFrustum[0] + axisXOff, fFrustum[2] - axisXOff);
      fAxis->SetRangeUser(fFrustum[0] + axisXOff, fFrustum[2] - axisXOff);
      tms = fFrustum[3] - fFrustum[1];
      fAxisPainter->RefTMOff(0) = ydir*tms;

      // bottom
      glPushMatrix();
      glTranslated(ydir.X()*fFrustum[1], ydir.Y()*fFrustum[1], ydir.Z()*fFrustum[1]);
      fAxisPainter->SetLabelAlign(TGLFont::kCenterDown);
      fAxisPainter->PaintAxis(rnrCtx, fAxis);
      glPopMatrix();

      // top
      glPushMatrix();
      glTranslated(ydir.X()*fFrustum[3], ydir.Y()*fFrustum[3], ydir.Z()*fFrustum[3]);
      fAxisPainter->SetLabelAlign(TGLFont::kCenterUp);
      fAxisPainter->RefTMOff(0).Negate();
      fAxisPainter->RnrLabels();
      fAxisPainter->RnrLines();
      glPopMatrix();
   }

   //
   // vertical Y
   {
      fAxis->SetTickLength(tlY);
      fAxisPainter->RefDir() = ydir;
      Float_t axisYOff = (fFrustum[3] - fFrustum[1]) * (1 - fAxisExtend);
      fAxis->SetLimits(fFrustum[1] + axisYOff, fFrustum[3] - axisYOff);
      tms = fFrustum[2] - fFrustum[0];
      fAxisPainter->RefTMOff(0) = xdir*tms;

      // left
      glPushMatrix();
      glTranslated(xdir.X()*fFrustum[0], xdir.Y()*fFrustum[0], xdir.Z()*fFrustum[0]);
      fAxisPainter->SetLabelAlign(TGLFont::kLeft);
      fAxisPainter->PaintAxis(rnrCtx, fAxis);
      glPopMatrix();
      // right
      glPushMatrix();
      glTranslated(xdir.X()*fFrustum[2], xdir.Y()*fFrustum[2], xdir.Z()*fFrustum[2]);
      fAxisPainter->SetLabelAlign(TGLFont::kRight);
      fAxisPainter->RefTMOff(0).Negate();
      fAxisPainter->RnrLabels();
      fAxisPainter->RnrLines();
      glPopMatrix();
   }
}

//______________________________________________________________________________
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     = 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);
   TGLUtil::Color(kGray);
   font.Render(txt);
   glPopMatrix();

   glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT);
   glLineWidth(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;

   TGLCapabilitySwitch lights_off(GL_LIGHTING, kFALSE);

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

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

   if (cam.IsOrthographic())
      (fOrthographicMode == kBar) ? RenderBar(rnrCtx) :  RenderAxis(rnrCtx);
   else
      RenderPlaneIntersect(rnrCtx);
}

 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