// @(#)root/gl:$Id$
// Author:  Richard Maunder  25/05/2005

/*************************************************************************
 * Copyright (C) 1995-2000, 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 "TGLViewer.h"
#include "TGLIncludes.h"
#include "TGLStopwatch.h"
#include "TGLRnrCtx.h"
#include "TGLSelectBuffer.h"
#include "TGLLightSet.h"
#include "TGLManipSet.h"
#include "TGLCameraOverlay.h"
#include "TGLAutoRotator.h"

#include "TGLScenePad.h"
#include "TGLLogicalShape.h"
#include "TGLPhysicalShape.h"
#include "TGLObject.h"
#include "TGLStopwatch.h"
#include "TBuffer3D.h"
#include "TBuffer3DTypes.h"

#include "TGLOutput.h"

#include "TROOT.h"
#include "TVirtualMutex.h"

#include "TVirtualPad.h" // Remove when pad removed - use signal
#include "TVirtualX.h"

#include "TMath.h"
#include "TColor.h"
#include "TError.h"
#include "TClass.h"
#include "TROOT.h"
#include "TEnv.h"

// For event type translation ExecuteEvent
#include "Buttons.h"
#include "GuiTypes.h"

#include "TVirtualGL.h"

#include "TGLWidget.h"
#include "TGLFBO.h"
#include "TGLViewerEditor.h"
#include "TGedEditor.h"
#include "TGLPShapeObj.h"

#include "KeySymbols.h"
#include "TContextMenu.h"
#include "TImage.h"

#include <stdexcept>

#ifndef GL_BGRA
#define GL_BGRA GL_BGRA_EXT
#endif

//==============================================================================
// TGLViewer
//==============================================================================

//______________________________________________________________________
//
// Base GL viewer object - used by both standalone and embedded (in pad)
// GL. Contains core viewer objects :
//
// GL scene - collection of main drawn objects - see TGLStdScene
// Cameras (fXyzzCamera) - ortho and perspective cameras - see TGLCamera
// Clipping (fClipXyzz) - collection of clip objects - see TGLClip
// Manipulators (fXyzzManip) - collection of manipulators - see TGLManip
//
// It maintains the current active draw styles, clipping object,
// manipulator, camera etc.
//
// TGLViewer is 'GUI free' in that it does not derive from any ROOT GUI
// TGFrame etc - see TGLSAViewer for this. However it contains GUI
// GUI style methods HandleButton() etc to which GUI events can be
// directed from standalone frame or embedding pad to perform
// interaction.
//
// Also, the TGLWidget needs to be created externally. It is not owned
// by the viewer.
//
// For embedded (pad) GL this viewer is created directly by plugin
// manager. For standalone the derived TGLSAViewer is.
//

ClassImp(TGLViewer);

TGLColorSet TGLViewer::fgDefaultColorSet;
Bool_t      TGLViewer::fgUseDefaultColorSetForNewViewers = kFALSE;

//______________________________________________________________________________
TGLViewer::TGLViewer(TVirtualPad * pad, Int_t x, Int_t y,
                     Int_t width, Int_t height) :
   fPad(pad),
   fContextMenu(0),
   fPerspectiveCameraXOZ(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // XOZ floor
   fPerspectiveCameraYOZ(TGLVector3( 0.0,-1.0, 0.0), TGLVector3(1.0, 0.0, 0.0)), // YOZ floor
   fPerspectiveCameraXOY(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // XOY floor
   fOrthoXOYCamera (TGLOrthoCamera::kXOY,  TGLVector3( 0.0, 0.0, 1.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down  Z axis,  X horz, Y vert
   fOrthoXOZCamera (TGLOrthoCamera::kXOZ,  TGLVector3( 0.0,-1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // Looking along Y axis,  X horz, Z vert
   fOrthoZOYCamera (TGLOrthoCamera::kZOY,  TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // Looking along X axis,  Z horz, Y vert
   fOrthoXnOYCamera(TGLOrthoCamera::kXnOY, TGLVector3( 0.0, 0.0,-1.0), TGLVector3(0.0, 1.0, 0.0)), // Looking along Z axis, -X horz, Y vert
   fOrthoXnOZCamera(TGLOrthoCamera::kXnOZ, TGLVector3( 0.0, 1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // Looking down  Y axis, -X horz, Z vert
   fOrthoZnOYCamera(TGLOrthoCamera::kZnOY, TGLVector3( 1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down  X axis, -Z horz, Y vert
   fCurrentCamera(&fPerspectiveCameraXOZ),
   fAutoRotator(0),

   fStereo               (kFALSE),
   fStereoZeroParallax   (0.03f),
   fStereoEyeOffsetFac   (1.0f),
   fStereoFrustumAsymFac (1.0f),

   fLightSet          (0),
   fClipSet           (0),
   fSelectedPShapeRef (0),
   fCurrentOvlElm     (0),

   fEventHandler(0),
   fGedEditor(0),
   fPShapeWrap(0),
   fPushAction(kPushStd), fDragAction(kDragNone),
   fRedrawTimer(0),
   fMaxSceneDrawTimeHQ(5000),
   fMaxSceneDrawTimeLQ(100),
   fPointScale (1), fLineScale(1), fSmoothPoints(kFALSE), fSmoothLines(kFALSE),
   fAxesType(TGLUtil::kAxesNone),
   fAxesDepthTest(kTRUE),
   fReferenceOn(kFALSE),
   fReferencePos(0.0, 0.0, 0.0),
   fDrawCameraCenter(kFALSE),
   fCameraOverlay(0),
   fSmartRefresh(kFALSE),
   fDebugMode(kFALSE),
   fIsPrinting(kFALSE),
   fPictureFileName("viewer.jpg"),
   fFader(0),
   fGLWidget(0),
   fGLDevice(-1),
   fGLCtxId(0),
   fIgnoreSizesOnUpdate(kFALSE),
   fResetCamerasOnUpdate(kTRUE),
   fResetCamerasOnNextUpdate(kFALSE)
{
   // Construct the viewer object, with following arguments:
   //    'pad' - external pad viewer is bound to
   //    'x', 'y' - initial top left position
   //    'width', 'height' - initial width/height

   InitSecondaryObjects();

   SetViewport(x, y, width, height);
}

//______________________________________________________________________________
TGLViewer::TGLViewer(TVirtualPad * pad) :
   fPad(pad),
   fContextMenu(0),
   fPerspectiveCameraXOZ(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // XOZ floor
   fPerspectiveCameraYOZ(TGLVector3( 0.0,-1.0, 0.0), TGLVector3(1.0, 0.0, 0.0)), // YOZ floor
   fPerspectiveCameraXOY(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // XOY floor
   fOrthoXOYCamera (TGLOrthoCamera::kXOY,  TGLVector3( 0.0, 0.0, 1.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down  Z axis,  X horz, Y vert
   fOrthoXOZCamera (TGLOrthoCamera::kXOZ,  TGLVector3( 0.0,-1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // Looking along Y axis,  X horz, Z vert
   fOrthoZOYCamera (TGLOrthoCamera::kZOY,  TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // Looking along X axis,  Z horz, Y vert
   fOrthoXnOYCamera(TGLOrthoCamera::kXnOY, TGLVector3( 0.0, 0.0,-1.0), TGLVector3(0.0, 1.0, 0.0)), // Looking along Z axis, -X horz, Y vert
   fOrthoXnOZCamera(TGLOrthoCamera::kXnOZ, TGLVector3( 0.0, 1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // Looking down  Y axis, -X horz, Z vert
   fOrthoZnOYCamera(TGLOrthoCamera::kZnOY, TGLVector3( 1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down  X axis, -Z horz, Y vert
   fCurrentCamera(&fPerspectiveCameraXOZ),
   fAutoRotator(0),

   fStereo               (kFALSE),
   fStereoZeroParallax   (0.03f),
   fStereoEyeOffsetFac   (1.0f),
   fStereoFrustumAsymFac (1.0f),

   fLightSet          (0),
   fClipSet           (0),
   fSelectedPShapeRef (0),
   fCurrentOvlElm     (0),

   fEventHandler(0),
   fGedEditor(0),
   fPShapeWrap(0),
   fPushAction(kPushStd), fDragAction(kDragNone),
   fRedrawTimer(0),
   fMaxSceneDrawTimeHQ(5000),
   fMaxSceneDrawTimeLQ(100),
   fPointScale (1), fLineScale(1), fSmoothPoints(kFALSE), fSmoothLines(kFALSE),
   fAxesType(TGLUtil::kAxesNone),
   fAxesDepthTest(kTRUE),
   fReferenceOn(kFALSE),
   fReferencePos(0.0, 0.0, 0.0),
   fDrawCameraCenter(kFALSE),
   fCameraOverlay(0),
   fSmartRefresh(kFALSE),
   fDebugMode(kFALSE),
   fIsPrinting(kFALSE),
   fPictureFileName("viewer.jpg"),
   fFader(0),
   fGLWidget(0),
   fGLDevice(fPad->GetGLDevice()),
   fGLCtxId(0),
   fIgnoreSizesOnUpdate(kFALSE),
   fResetCamerasOnUpdate(kTRUE),
   fResetCamerasOnNextUpdate(kFALSE)
{
   //gl-embedded viewer's ctor
   // Construct the viewer object, with following arguments:
   //    'pad' - external pad viewer is bound to
   //    'x', 'y' - initial top left position
   //    'width', 'height' - initial width/height

   InitSecondaryObjects();

   if (fGLDevice != -1) {
      // For the moment instantiate a fake context identity.
      fGLCtxId = new TGLContextIdentity;
      fGLCtxId->AddRef(0);
      Int_t viewport[4] = {0};
      gGLManager->ExtractViewport(fGLDevice, viewport);
      SetViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
   }
}

//______________________________________________________________________________
void TGLViewer::InitSecondaryObjects()
{
   // Common initialization.

   fLightSet = new TGLLightSet;
   fClipSet  = new TGLClipSet;
   AddOverlayElement(fClipSet);

   fSelectedPShapeRef = new TGLManipSet;
   fSelectedPShapeRef->SetDrawBBox(kTRUE);
   AddOverlayElement(fSelectedPShapeRef);

   fPShapeWrap = new TGLPShapeObj(0, this);

   fLightColorSet.StdLightBackground();
   if (fgUseDefaultColorSetForNewViewers) {
      fRnrCtx->ChangeBaseColorSet(&fgDefaultColorSet);
   } else {
      if (fPad) {
         fRnrCtx->ChangeBaseColorSet(&fLightColorSet);
         fLightColorSet.Background().SetColor(fPad->GetFillColor());
         fLightColorSet.Foreground().SetColor(fPad->GetLineColor());
      } else {
         fRnrCtx->ChangeBaseColorSet(&fDarkColorSet);
      }
   }

   fCameraOverlay = new TGLCameraOverlay(kFALSE, kFALSE);
   AddOverlayElement(fCameraOverlay);

   fRedrawTimer = new TGLRedrawTimer(*this);
}

//______________________________________________________________________________
TGLViewer::~TGLViewer()
{
   // Destroy viewer object.

   delete fAutoRotator;

   delete fLightSet;
   // fClipSet, fSelectedPShapeRef and fCameraOverlay deleted via overlay.

   delete fContextMenu;
   delete fRedrawTimer;

   if (fEventHandler) {
      if (fGLWidget)
         fGLWidget->SetEventHandler(0);
      delete fEventHandler;
   }

   if (fPad)
      fPad->ReleaseViewer3D();
   if (fGLDevice != -1)
      fGLCtxId->Release(0);
}


//______________________________________________________________________________
void TGLViewer::PadPaint(TVirtualPad* pad)
{
   // Entry point for updating viewer contents via VirtualViewer3D
   // interface.
   // We search and forward the request to appropriate TGLScenePad.
   // If it is not found we create a new TGLScenePad so this can
   // potentially also be used for registration of new pads.

   TGLScenePad* scenepad = 0;
   for (SceneInfoList_i si = fScenes.begin(); si != fScenes.end(); ++si)
   {
      scenepad = dynamic_cast<TGLScenePad*>((*si)->GetScene());
      if (scenepad && scenepad->GetPad() == pad)
         break;
      scenepad = 0;
   }
   if (scenepad == 0)
   {
      scenepad = new TGLScenePad(pad);
      AddScene(scenepad);
   }

   scenepad->PadPaintFromViewer(this);

   PostSceneBuildSetup(fResetCamerasOnNextUpdate || fResetCamerasOnUpdate);
   fResetCamerasOnNextUpdate = kFALSE;

   RequestDraw();
}


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

//______________________________________________________________________________
void TGLViewer::UpdateScene(Bool_t redraw)
{
   // Force update of pad-scenes. Eventually this could be generalized
   // to all scene-types via a virtual function in TGLSceneBase.

   // Cancel any pending redraw timer.
   fRedrawTimer->Stop();

   for (SceneInfoList_i si = fScenes.begin(); si != fScenes.end(); ++si)
   {
      TGLScenePad* scenepad = dynamic_cast<TGLScenePad*>((*si)->GetScene());
      if (scenepad)
         scenepad->PadPaintFromViewer(this);
   }

   PostSceneBuildSetup(fResetCamerasOnNextUpdate || fResetCamerasOnUpdate);
   fResetCamerasOnNextUpdate = kFALSE;

   if (redraw)
      RequestDraw();
}

//______________________________________________________________________________
void TGLViewer::ResetCurrentCamera()
{
   // Resets position/rotation of current camera to default values.

   MergeSceneBBoxes(fOverallBoundingBox);
   CurrentCamera().Setup(fOverallBoundingBox, kTRUE);
}

//______________________________________________________________________________
void TGLViewer::SetupCameras(Bool_t reset)
{
   // Setup cameras for current bounding box.

   if (IsLocked()) {
      Error("TGLViewer::SetupCameras", "expected kUnlocked, found %s", LockName(CurrentLock()));
      return;
   }

   // Setup cameras if scene box is not empty
   const TGLBoundingBox & box = fOverallBoundingBox;
   if (!box.IsEmpty()) {
      fPerspectiveCameraYOZ.Setup(box, reset);
      fPerspectiveCameraXOZ.Setup(box, reset);
      fPerspectiveCameraXOY.Setup(box, reset);
      fOrthoXOYCamera.Setup(box, reset);
      fOrthoXOZCamera.Setup(box, reset);
      fOrthoZOYCamera.Setup(box, reset);
      fOrthoXnOYCamera.Setup(box, reset);
      fOrthoXnOZCamera.Setup(box, reset);
      fOrthoZnOYCamera.Setup(box, reset);
   }
}

//______________________________________________________________________________
void TGLViewer::PostSceneBuildSetup(Bool_t resetCameras)
{
   // Perform post scene-build setup.

   MergeSceneBBoxes(fOverallBoundingBox);
   SetupCameras(resetCameras);

   // Set default reference to center
   fReferencePos.Set(fOverallBoundingBox.Center());
   RefreshPadEditor(this);
}


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

//______________________________________________________________________________
void TGLViewer::InitGL()
{
   // Initialise GL state.

   glEnable(GL_LIGHTING);
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_CULL_FACE);
   glCullFace(GL_BACK);
   glClearColor(0.f, 0.f, 0.f, 0.f);
   glClearDepth(1.0);
   glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
   glEnable(GL_COLOR_MATERIAL);
   glMaterialf(GL_BACK, GL_SHININESS, 0.0);
   glPolygonMode(GL_FRONT, GL_FILL);
   glDisable(GL_BLEND);

   glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
   Float_t lmodelAmb[] = {0.5f, 0.5f, 1.f, 1.f};
   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodelAmb);
   glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);

   glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
   glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);

   TGLUtil::CheckError("TGLViewer::InitGL");
}

//______________________________________________________________________________
void TGLViewer::RequestDraw(Short_t LODInput)
{
   // Post request for redraw of viewer at level of detail 'LOD'
   // Request is directed via cross thread gVirtualGL object.

   fRedrawTimer->Stop();
   // Ignore request if GL window or context not yet availible or shown.
   if ((!fGLWidget && fGLDevice == -1) || (fGLWidget && !fGLWidget->IsMapped()))
   {
      return;
   }

   // Take scene draw lock - to be revisited
   if ( ! TakeLock(kDrawLock)) {
      // If taking drawlock fails the previous draw is still in progress
      // set timer to do this one later
      if (gDebug>3) {
         Info("TGLViewer::RequestDraw", "viewer locked - requesting another draw.");
      }
      fRedrawTimer->RequestDraw(100, LODInput);
      return;
   }
   fLOD = LODInput;

   if (!gVirtualX->IsCmdThread())
      gROOT->ProcessLineFast(Form("((TGLViewer *)0x%lx)->DoDraw()", (ULong_t)this));
   else
      DoDraw();
}

//______________________________________________________________________________
void TGLViewer::SetupClipObject()
{
   // Setup clip-object. Protected virtual method.

   if (GetClipAutoUpdate())
   {
      fClipSet->SetupCurrentClip(fOverallBoundingBox);
   }
   else
   {
      fClipSet->SetupCurrentClipIfInvalid(fOverallBoundingBox);
   }
}
//______________________________________________________________________________
void TGLViewer::PreRender()
{
   // Initialize objects that influence rendering.
   // Called before every render.

   fCamera = fCurrentCamera;
   fClip   = fClipSet->GetCurrentClip();
   if (fGLDevice != -1)
   {
      fRnrCtx->SetGLCtxIdentity(fGLCtxId);
      fGLCtxId->DeleteGLResources();
   }

   TGLUtil::SetPointSizeScale(fPointScale * fRnrCtx->GetRenderScale());
   TGLUtil::SetLineWidthScale(fLineScale  * fRnrCtx->GetRenderScale());

   if (fSmoothPoints) glEnable(GL_POINT_SMOOTH); else glDisable(GL_POINT_SMOOTH);
   if (fSmoothLines)  glEnable(GL_LINE_SMOOTH);  else glDisable(GL_LINE_SMOOTH);
   if (fSmoothPoints || fSmoothLines)
   {
      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
      glEnable(GL_BLEND);
   }
   else
   {
      glDisable(GL_BLEND);
   }

   TGLViewerBase::PreRender();

   // Setup lighting
   fLightSet->StdSetupLights(fOverallBoundingBox, *fCamera, fDebugMode);
}

//______________________________________________________________________________
void TGLViewer::Render()
{
   // Normal rendering, used by mono and stereo rendering.

   TGLViewerBase::Render();

   DrawGuides();
   RenderOverlay(TGLOverlayElement::kAllVisible, kFALSE);

   if ( ! fRnrCtx->Selection())
   {
      RenderSelectedForHighlight();
   }

   glClear(GL_DEPTH_BUFFER_BIT);
   DrawDebugInfo();
}

//______________________________________________________________________________
void TGLViewer::PostRender()
{
   // Restore state set in PreRender().
   // Called after every render.

   TGLViewerBase::PostRender();

   TGLUtil::SetPointSizeScale(1);
   TGLUtil::SetLineWidthScale(1);
}

//______________________________________________________________________________
void TGLViewer::DoDraw(Bool_t swap_buffers)
{
   // Draw out the viewer.

   // Locking mainly for Win32 multi thread safety - but no harm in all using it
   // During normal draws a draw lock is taken in other thread (Win32) in RequestDraw()
   // to ensure thread safety. For PrintObjects repeated Draw() calls are made.
   // If no draw lock taken get one now.

   R__LOCKGUARD2(gROOTMutex);

   fRedrawTimer->Stop();

   if (CurrentLock() != kDrawLock) {
      if ( ! TakeLock(kDrawLock)) {
         Error("TGLViewer::DoDraw", "viewer is %s", LockName(CurrentLock()));
         return;
      }
   }

   TUnlocker ulck(this);

   if (fGLDevice == -1 && (fViewport.Width() <= 1 || fViewport.Height() <= 1)) {
      if (gDebug > 2) {
         Info("TGLViewer::DoDraw()", "zero surface area, draw skipped.");
      }
      return;
   }

   if (fGLDevice != -1) {
      Int_t viewport[4] = {};
      gGLManager->ExtractViewport(fGLDevice, viewport);
      SetViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
   }

   TGLStopwatch timer;
   if (gDebug>2) {
      timer.Start();
   }

   // Setup scene draw time
   fRnrCtx->SetRenderTimeOut(fLOD == TGLRnrCtx::kLODHigh ?
                             fMaxSceneDrawTimeHQ :
                             fMaxSceneDrawTimeLQ);

   if (fStereo && fCurrentCamera->IsPerspective() && !fRnrCtx->GetGrabImage() &&
       !fIsPrinting)
   {
      DoDrawStereo(swap_buffers);
   }
   else
   {
      DoDrawMono(swap_buffers);
   }

   ReleaseLock(kDrawLock);

   if (gDebug>2) {
      Info("TGLViewer::DoDraw()", "Took %f msec", timer.End());
   }

   // Check if further redraws are needed and schedule them.

   if (CurrentCamera().UpdateInterest(kFALSE)) {
      // Reset major view-dependant cache.
      ResetSceneInfos();
      fRedrawTimer->RequestDraw(0, fLOD);
   }

   if (fLOD != TGLRnrCtx::kLODHigh &&
       (fDragAction < kDragCameraRotate || fDragAction > kDragCameraDolly))
   {
      // Request final draw pass.
      fRedrawTimer->RequestDraw(100, TGLRnrCtx::kLODHigh);
   }
}

//______________________________________________________________________________
void TGLViewer::DoDrawMono(Bool_t swap_buffers)
{
   // Draw out in monoscopic mode.

   MakeCurrent();

   if (!fIsPrinting) PreDraw();
   PreRender();

   fRnrCtx->StartStopwatch();
   if (fFader < 1)
   {
      Render();
   }
   fRnrCtx->StopStopwatch();

   PostRender();

   if (fFader > 0)
   {
      FadeView(fFader);
   }

   PostDraw();

   if (swap_buffers)
   {
      SwapBuffers();
   }
}

//______________________________________________________________________________
void TGLViewer::DoDrawStereo(Bool_t swap_buffers)
{
   // Draw out in stereoscopic mode.

   TGLPerspectiveCamera &c = *dynamic_cast<TGLPerspectiveCamera*>(fCurrentCamera);

   Float_t gl_near, gl_far, zero_p_dist;
   Float_t h_half, w_half;
   Float_t x_len_at_zero_parallax;
   Float_t stereo_offset;
   Float_t frustum_asym;

   MakeCurrent();

   // Draw left
   glDrawBuffer(GL_BACK_LEFT);
   PreDraw();
   PreRender();

   gl_near = c.GetNearClip();
   gl_far  = c.GetFarClip();
   zero_p_dist = gl_near + fStereoZeroParallax*(gl_far-gl_near);

   h_half = TMath::Tan(0.5*TMath::DegToRad()*c.GetFOV()) * gl_near;
   w_half = h_half * fViewport.Aspect();

   x_len_at_zero_parallax = 2.0f * w_half * zero_p_dist / gl_near;
   stereo_offset = 0.035f * x_len_at_zero_parallax * fStereoEyeOffsetFac;

   frustum_asym = stereo_offset * gl_near / zero_p_dist * fStereoFrustumAsymFac;

   TGLMatrix  abs_trans(c.RefCamBase());
   abs_trans *= c.RefCamTrans();
   TGLVector3 left_vec = abs_trans.GetBaseVec(2);

   glTranslatef(stereo_offset*left_vec[0], stereo_offset*left_vec[1], stereo_offset*left_vec[2]);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glFrustum(-w_half + frustum_asym, w_half + frustum_asym,
             -h_half, h_half, gl_near, gl_far);
   glMatrixMode(GL_MODELVIEW);

   fRnrCtx->StartStopwatch();
   if (fFader < 1)
   {
      Render();
   }
   fRnrCtx->StopStopwatch();

   PostRender();

   if (fFader > 0)
   {
      FadeView(fFader);
   }
   PostDraw();

   // Draw right
   glDrawBuffer(GL_BACK_RIGHT);
   PreDraw();
   PreRender();

   glTranslatef(-stereo_offset*left_vec[0], -stereo_offset*left_vec[1], -stereo_offset*left_vec[2]);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glFrustum(-w_half - frustum_asym, w_half - frustum_asym,
             -h_half, h_half, gl_near, gl_far);
   glMatrixMode(GL_MODELVIEW);

   fRnrCtx->StartStopwatch();
   if (fFader < 1)
   {
      Render();
   }
   fRnrCtx->StopStopwatch();

   PostRender();

   if (fFader > 0)
   {
      FadeView(fFader);
   }
   PostDraw();

   // End
   if (swap_buffers)
   {
      SwapBuffers();
   }

   glDrawBuffer(GL_BACK);
}

//______________________________________________________________________________
Bool_t TGLViewer::SavePicture()
{
   // Save current image using the default file name which can be set
   // via SetPictureFileName() and defaults to "viewer.jpg".
   // Really useful for the files ending with 'gif+'.

   return SavePicture(fPictureFileName);
}

//______________________________________________________________________________
Bool_t TGLViewer::SavePicture(const TString &fileName)
{
   // Save current image in various formats (gif, gif+, jpg, png, eps, pdf).
   // 'gif+' will append image to an existng file (animated gif).
   // 'eps' and 'pdf' do not fully support transparency and texturing.
   // The viewer window most be fully contained within the desktop but
   // can be covered by other windows.
   // Returns false if something obvious goes wrong, true otherwise.
   //
   // The mage is saved using a frame-buffer object if the GL implementation
   // claims to support it -- this claim is not always true, especially when
   // running over ssh with drastically different GL implementations on the
   // client and server sides. Set this in .rootrc to enforce creation of
   // pictures using the back-buffer:
   //   OpenGL.SavePicturesViaFBO: off

   if (fileName.EndsWith(".eps"))
   {
      return TGLOutput::Capture(*this, TGLOutput::kEPS_BSP, fileName.Data());
   }
   else if (fileName.EndsWith(".pdf"))
   {
      return TGLOutput::Capture(*this, TGLOutput::kPDF_BSP, fileName.Data());
   }
   else
   {
      if (GLEW_EXT_framebuffer_object && gEnv->GetValue("OpenGL.SavePicturesViaFBO", 1))
      {
         return SavePictureUsingFBO(fileName, fViewport.Width(), fViewport.Height(), kFALSE);
      }
      else
      {
         return SavePictureUsingBB(fileName);
      }
   }
}

//______________________________________________________________________________
Bool_t TGLViewer::SavePictureUsingBB(const TString &fileName)
{
   // Save current image in various formats (gif, gif+, jpg, png).
   // 'gif+' will append image to an existng file (animated gif).
   // Back-Buffer is used for capturing of the image.
   // The viewer window most be fully contained within the desktop but
   // can be covered by other windows.
   // Returns false if something obvious goes wrong, true otherwise.

   static const TString eh("TGLViewer::SavePictureUsingBB");

   if (! fileName.EndsWith(".gif") && ! fileName.Contains(".gif+") &&
       ! fileName.EndsWith(".jpg") && ! fileName.EndsWith(".png"))
   {
      Warning(eh, "file %s cannot be saved with this extension.", fileName.Data());
      return kFALSE;
   }

   if ( ! TakeLock(kDrawLock)) {
      Error(eh, "viewer locked - try later.");
      return kFALSE;
   }

   TUnlocker ulck(this);

   fLOD = TGLRnrCtx::kLODHigh;
   fRnrCtx->SetGrabImage(kTRUE);

   if (!gVirtualX->IsCmdThread())
      gROOT->ProcessLineFast(Form("((TGLViewer *)0x%lx)->DoDraw(kFALSE)", (ULong_t)this));
   else
      DoDraw(kFALSE);

   fRnrCtx->SetGrabImage(kFALSE);

   glReadBuffer(GL_BACK);

   UChar_t* xx = new UChar_t[4 * fViewport.Width() * fViewport.Height()];
   glPixelStorei(GL_PACK_ALIGNMENT, 1);
   glReadPixels(0, 0, fViewport.Width(), fViewport.Height(),
                GL_BGRA, GL_UNSIGNED_BYTE, xx);

   std::auto_ptr<TImage> image(TImage::Create());
   image->FromGLBuffer(xx, fViewport.Width(), fViewport.Height());
   image->WriteImage(fileName);

   delete [] xx;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGLViewer::SavePictureUsingFBO(const TString &fileName, Int_t w, Int_t h,
                                      Float_t pixel_object_scale)
{
   // Save current image in various formats (gif, gif+, jpg, png).
   // 'gif+' will append image to an existng file (animated gif).
   // Frame-Buffer-Object is used for capturing of the image - OpenGL
   // 1.5 is required.
   // The viewer window does not have to be visible at all.
   // Returns false if something obvious goes wrong, true otherwise.
   //
   // pixel_object_scale is used to scale (as much as possible) the
   // objects whose representation size is pixel based (point-sizes,
   // line-widths, bitmap/pixmap font-sizes).
   // If set to 0 (default) no scaling is applied.

   static const TString eh("TGLViewer::SavePictureUsingFBO");

   if (! fileName.EndsWith(".gif") && ! fileName.Contains(".gif+") &&
       ! fileName.EndsWith(".jpg") && ! fileName.EndsWith(".png"))
   {
      Warning(eh, "file %s cannot be saved with this extension.", fileName.Data());
      return kFALSE;
   }

   if ( ! TakeLock(kDrawLock)) {
      Error(eh, "viewer locked - try later.");
      return kFALSE;
   }

   TUnlocker ulck(this);

   MakeCurrent();

   TGLFBO *fbo = new TGLFBO();
   try
   {
      fbo->Init(w, h, fGLWidget->GetPixelFormat()->GetSamples());
   }
   catch (std::runtime_error& exc)
   {
      Error(eh, "%s",exc.what());
      if (gEnv->GetValue("OpenGL.SavePictureFallbackToBB", 1)) {
         Info(eh, "Falling back to saving image via back-buffer. Window must be fully visible.");
         if (w != fViewport.Width() || h != fViewport.Height())
            Warning(eh, "Back-buffer does not support image scaling, window size will be used.");
         return SavePictureUsingBB(fileName);
      } else {
         return kFALSE;
      }
   }

   TGLRect old_vp(fViewport);
   SetViewport(0, 0, w, h);

   Float_t old_scale = 1;
   if (pixel_object_scale != 0)
   {
      old_scale = fRnrCtx->GetRenderScale();
      fRnrCtx->SetRenderScale(old_scale * pixel_object_scale);
   }

   fbo->Bind();

   fLOD = TGLRnrCtx::kLODHigh;
   fRnrCtx->SetGrabImage(kTRUE);

   if (!gVirtualX->IsCmdThread())
      gROOT->ProcessLineFast(Form("((TGLViewer *)0x%lx)->DoDraw(kFALSE)", (ULong_t)this));
   else
      DoDraw(kFALSE);

   fRnrCtx->SetGrabImage(kFALSE);

   fbo->Unbind();

   fbo->SetAsReadBuffer();

   UChar_t* xx = new UChar_t[4 * fViewport.Width() * fViewport.Height()];
   glPixelStorei(GL_PACK_ALIGNMENT, 1);
   glReadPixels(0, 0, fViewport.Width(), fViewport.Height(),
                GL_BGRA, GL_UNSIGNED_BYTE, xx);

   std::auto_ptr<TImage> image(TImage::Create());
   image->FromGLBuffer(xx, fViewport.Width(), fViewport.Height());
   image->WriteImage(fileName);

   delete [] xx;

   delete fbo;

   if (pixel_object_scale != 0)
   {
      fRnrCtx->SetRenderScale(old_scale);
   }

   SetViewport(old_vp);

   return kTRUE;
}

//______________________________________________________________________________
TImage* TGLViewer::GetPictureUsingBB()
{
    // Returns current image.
    // Back-Buffer is used for capturing of the image.
    // The viewer window most be fully contained within the desktop but
    // can be covered by other windows.

    static const TString eh("TGLViewer::GetPictureUsingBB");

    if ( ! TakeLock(kDrawLock)) {
        Error(eh, "viewer locked - try later.");
        return NULL;
    }

    TUnlocker ulck(this);

    fLOD = TGLRnrCtx::kLODHigh;
    fRnrCtx->SetGrabImage(kTRUE);

    if (!gVirtualX->IsCmdThread())
        gROOT->ProcessLineFast(Form("((TGLViewer *)0x%lx)->DoDraw(kFALSE)", (ULong_t)this));
    else
        DoDraw(kFALSE);

    fRnrCtx->SetGrabImage(kFALSE);

    glReadBuffer(GL_BACK);

    UChar_t* xx = new UChar_t[4 * fViewport.Width() * fViewport.Height()];
    glPixelStorei(GL_PACK_ALIGNMENT, 1);
    glReadPixels(0, 0, fViewport.Width(), fViewport.Height(),
                 GL_BGRA, GL_UNSIGNED_BYTE, xx);

    TImage *image(TImage::Create());
    image->FromGLBuffer(xx, fViewport.Width(), fViewport.Height());

    delete [] xx;

    return image;
}

//______________________________________________________________________________
TImage* TGLViewer::GetPictureUsingFBO(Int_t w, Int_t h,Float_t pixel_object_scale)
{
    // Returns current image.
    // Frame-Buffer-Object is used for capturing of the image - OpenGL
    // 1.5 is required.
    // The viewer window does not have to be visible at all.
    //
    // pixel_object_scale is used to scale (as much as possible) the
    // objects whose representation size is pixel based (point-sizes,
    // line-widths, bitmap/pixmap font-sizes).
    // If set to 0 (default) no scaling is applied.

    static const TString eh("TGLViewer::GetPictureUsingFBO");

    if ( ! TakeLock(kDrawLock)) {
        Error(eh, "viewer locked - try later.");
        return NULL;
    }

    TUnlocker ulck(this);

    MakeCurrent();

    TGLFBO *fbo = new TGLFBO();
    try
    {
        fbo->Init(w, h, fGLWidget->GetPixelFormat()->GetSamples());
    }
    catch (std::runtime_error& exc)
    {
        Error(eh, "%s",exc.what());
        if (gEnv->GetValue("OpenGL.GetPictureFallbackToBB", 1)) {
            Info(eh, "Falling back to saving image via back-buffer. Window must be fully visible.");
            if (w != fViewport.Width() || h != fViewport.Height())
                Warning(eh, "Back-buffer does not support image scaling, window size will be used.");
            return GetPictureUsingBB();
        } else {
            return NULL;
        }
    }

    TGLRect old_vp(fViewport);
    SetViewport(0, 0, w, h);

    Float_t old_scale = 1;
    if (pixel_object_scale != 0)
    {
        old_scale = fRnrCtx->GetRenderScale();
        fRnrCtx->SetRenderScale(old_scale * pixel_object_scale);
    }

    fbo->Bind();

    fLOD = TGLRnrCtx::kLODHigh;
    fRnrCtx->SetGrabImage(kTRUE);

    if (!gVirtualX->IsCmdThread())
        gROOT->ProcessLineFast(Form("((TGLViewer *)0x%lx)->DoDraw(kFALSE)", (ULong_t)this));
    else
        DoDraw(kFALSE);

    fRnrCtx->SetGrabImage(kFALSE);

    fbo->Unbind();

    fbo->SetAsReadBuffer();

    UChar_t* xx = new UChar_t[4 * fViewport.Width() * fViewport.Height()];
    glPixelStorei(GL_PACK_ALIGNMENT, 1);
    glReadPixels(0, 0, fViewport.Width(), fViewport.Height(),
                 GL_BGRA, GL_UNSIGNED_BYTE, xx);

    TImage *image(TImage::Create());
    image->FromGLBuffer(xx, fViewport.Width(), fViewport.Height());

    delete [] xx;
    delete fbo;

    return image;
}


//______________________________________________________________________________
Bool_t TGLViewer::SavePictureWidth(const TString &fileName, Int_t width,
                                   Bool_t pixel_object_scale)
{
   // Save picture with given width (height scaled proportinally).
   // If pixel_object_scale is true (default), the corresponding
   // scaling gets calculated from the current window size.

   Float_t scale  = Float_t(width) / fViewport.Width();
   Int_t   height = TMath::Nint(scale*fViewport.Height());

   return SavePictureUsingFBO(fileName, width, height, pixel_object_scale ? scale : 0);
}

//______________________________________________________________________________
Bool_t TGLViewer::SavePictureHeight(const TString &fileName, Int_t height,
                                    Bool_t pixel_object_scale)
{
   // Save picture with given height (width scaled proportinally).
   // If pixel_object_scale is true (default), the corresponding
   // scaling gets calculated from the current window size.

   Float_t scale = Float_t(height) / fViewport.Height();
   Int_t   width = TMath::Nint(scale*fViewport.Width());

   return SavePictureUsingFBO(fileName, width, height, pixel_object_scale ? scale : 0);
}

//______________________________________________________________________________
Bool_t TGLViewer::SavePictureScale (const TString &fileName, Float_t scale,
                                    Bool_t pixel_object_scale)
{
   // Save picture with given scale to current window size.
   // If pixel_object_scale is true (default), the same scaling is
   // used.

   Int_t w = TMath::Nint(scale*fViewport.Width());
   Int_t h = TMath::Nint(scale*fViewport.Height());

   return SavePictureUsingFBO(fileName, w, h, pixel_object_scale ? scale : 0);
}

//______________________________________________________________________________
void TGLViewer::DrawGuides()
{
   // Draw reference marker and coordinate axes.

   Bool_t disabled = kFALSE;
   if (fReferenceOn)
   {
      glDisable(GL_DEPTH_TEST);
      TGLUtil::DrawReferenceMarker(*fCamera, fReferencePos);
      disabled = kTRUE;
   }
   if (fDrawCameraCenter)
   {
      glDisable(GL_DEPTH_TEST);
      Float_t radius = fCamera->ViewportDeltaToWorld(TGLVertex3(fCamera->GetCenterVec()), 3, 3).Mag();
      const UChar_t rgba[4] = { 0, 255, 255, 255 };
      TGLUtil::DrawSphere(fCamera->GetCenterVec(), radius, rgba);
      disabled = kTRUE;
   }
   if (fAxesDepthTest && disabled)
   {
      glEnable(GL_DEPTH_TEST);
      disabled = kFALSE;
   }
   else if (fAxesDepthTest == kFALSE && disabled == kFALSE)
   {
      glDisable(GL_DEPTH_TEST);
      disabled = kTRUE;
   }
   TGLUtil::DrawSimpleAxes(*fCamera, fOverallBoundingBox, fAxesType);
   if (disabled)
      glEnable(GL_DEPTH_TEST);
}

//______________________________________________________________________________
void TGLViewer::DrawDebugInfo()
{
   // If in debug mode draw camera aids and overall bounding box.

   if (fDebugMode)
   {
      glDisable(GL_LIGHTING);
      CurrentCamera().DrawDebugAids();

      // Green scene bounding box
      glColor3d(0.0, 1.0, 0.0);
      fOverallBoundingBox.Draw();

      // Scene bounding box center sphere (green) and
      glDisable(GL_DEPTH_TEST);
      Double_t size = fOverallBoundingBox.Extents().Mag() / 200.0;
      TGLUtil::DrawSphere(TGLVertex3(0.0, 0.0, 0.0), size, TGLUtil::fgWhite);
      const TGLVertex3 & center = fOverallBoundingBox.Center();
      TGLUtil::DrawSphere(center, size, TGLUtil::fgGreen);
      glEnable(GL_DEPTH_TEST);

      glEnable(GL_LIGHTING);
   }
}

//______________________________________________________________________________
void TGLViewer::PreDraw()
{
   // Perform GL work which must be done before each draw.

   InitGL();

   // For embedded gl clear color must be pad's background color.
   {
      Color_t ci = (fGLDevice != -1) ? gPad->GetFillColor() : fRnrCtx->ColorSet().Background().GetColorIndex();
      TColor *color = gROOT->GetColor(ci);
      Float_t rgb[3];
      if (color)
         color->GetRGB(rgb[0], rgb[1], rgb[2]);
      else
         rgb[0] = rgb[1] = rgb[2] = 0.0f;

      glClearColor(rgb[0], rgb[1], rgb[2], 0.0f);
   }

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

   TGLUtil::CheckError("TGLViewer::PreDraw");
}

//______________________________________________________________________________
void TGLViewer::PostDraw()
{
   // Perform GL work which must be done after each draw.

   glFlush();
   TGLUtil::CheckError("TGLViewer::PostDraw");
}

//______________________________________________________________________________
void TGLViewer::FadeView(Float_t alpha)
{
   // Draw a rectangle (background color and given alpha) across the
   // whole viewport.

   static const Float_t z = -1.0f;

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

   {
      TGLCapabilitySwitch blend(GL_BLEND,    kTRUE);
      TGLCapabilitySwitch light(GL_LIGHTING, kFALSE);
      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
      TGLUtil::ColorAlpha(fRnrCtx->ColorSet().Background(), alpha);
      glBegin(GL_QUADS);
      glVertex3f(-1, -1, z);  glVertex3f( 1, -1, z);
      glVertex3f( 1,  1, z);  glVertex3f(-1,  1, z);
      glEnd();
   }

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

//______________________________________________________________________________
void TGLViewer::MakeCurrent() const
{
   // Make GL context current
   if (fGLDevice == -1)
      fGLWidget->MakeCurrent();
   else
      gGLManager->MakeCurrent(fGLDevice);
}

//______________________________________________________________________________
void TGLViewer::SwapBuffers() const
{
   // Swap GL buffers
   if ( ! IsDrawOrSelectLock()) {
      Error("TGLViewer::SwapBuffers", "viewer is %s", LockName(CurrentLock()));
   }
   if (fGLDevice == -1)
      fGLWidget->SwapBuffers();
   else {
      gGLManager->ReadGLBuffer(fGLDevice);
      gGLManager->Flush(fGLDevice);
      gGLManager->MarkForDirectCopy(fGLDevice, kFALSE);
   }
}

//______________________________________________________________________________
Bool_t TGLViewer::RequestSelect(Int_t x, Int_t y)
{
   // Post request for selection render pass viewer, picking objects
   // around the window point (x,y).

   // Take select lock on scene immediately we enter here - it is released
   // in the other (drawing) thread - see TGLViewer::DoSelect()

   if ( ! TakeLock(kSelectLock)) {
      return kFALSE;
   }

   if (!gVirtualX->IsCmdThread())
      return Bool_t(gROOT->ProcessLineFast(Form("((TGLViewer *)0x%lx)->DoSelect(%d, %d)", (ULong_t)this, x, y)));
   else
      return DoSelect(x, y);
}

//______________________________________________________________________________
Bool_t TGLViewer::DoSelect(Int_t x, Int_t y)
{
   // Perform GL selection, picking objects overlapping WINDOW
   // area described by 'rect'. Return kTRUE if selection should be
   // changed, kFALSE otherwise.
   // Select lock should already been taken in other thread in
   // TGLViewer::ReqSelect().

   R__LOCKGUARD2(gROOTMutex);

   if (CurrentLock() != kSelectLock) {
      Error("TGLViewer::DoSelect", "expected kSelectLock, found %s", LockName(CurrentLock()));
      return kFALSE;
   }

   TGLUtil::PointToViewport(x, y);

   TUnlocker ulck(this);

   MakeCurrent();

   fRnrCtx->BeginSelection(x, y, TGLUtil::GetPickingRadius());
   glRenderMode(GL_SELECT);

   PreRender();
   TGLViewerBase::Render();
   PostRender();

   Int_t nHits = glRenderMode(GL_RENDER);
   fRnrCtx->EndSelection(nHits);

   // Process selection.
   if (gDebug > 0) Info("TGLViewer::DoSelect", "Primary select nHits=%d.", nHits);

   if (nHits > 0)
   {
      Int_t idx = 0;
      if (FindClosestRecord(fSelRec, idx))
      {
         if (fSelRec.GetTransparent() && fRnrCtx->SelectTransparents() != TGLRnrCtx::kIfClosest)
         {
            TGLSelectRecord opaque;
            if (FindClosestOpaqueRecord(opaque, ++idx))
               fSelRec = opaque;
            else if (fRnrCtx->SelectTransparents() == TGLRnrCtx::kNever)
               fSelRec.Reset();
         }
         if (gDebug > 1) fSelRec.Print();
      }
   } else {
      fSelRec.Reset();
   }

   ReleaseLock(kSelectLock);
   return ! TGLSelectRecord::AreSameSelectionWise(fSelRec, fCurrentSelRec);
}

//______________________________________________________________________________
Bool_t TGLViewer::RequestSecondarySelect(Int_t x, Int_t y)
{
   // Request secondary select.

   if ( ! TakeLock(kSelectLock)) {
      return kFALSE;
   }

   if (!gVirtualX->IsCmdThread())
      return Bool_t(gROOT->ProcessLineFast(Form("((TGLViewer *)0x%lx)->DoSecondarySelect(%d, %d)", (ULong_t)this, x, y)));
   else
      return DoSecondarySelect(x, y);
}

//______________________________________________________________________________
Bool_t TGLViewer::DoSecondarySelect(Int_t x, Int_t y)
{
   // Secondary selection.

   R__LOCKGUARD2(gROOTMutex);

   if (CurrentLock() != kSelectLock) {
      Error("TGLViewer::DoSecondarySelect", "expected kSelectLock, found %s", LockName(CurrentLock()));
      return kFALSE;
   }

   TGLUtil::PointToViewport(x, y);

   TUnlocker ulck(this);

   if (! fSelRec.GetSceneInfo() || ! fSelRec.GetPhysShape() ||
       ! fSelRec.GetLogShape()->SupportsSecondarySelect())
   {
      if (gDebug > 0)
         Info("TGLViewer::SecondarySelect", "Skipping secondary selection "
              "(sinfo=0x%lx, pshape=0x%lx).\n",
              (Long_t)fSelRec.GetSceneInfo(), (Long_t)fSelRec.GetPhysShape());
      fSecSelRec.Reset();
      return kFALSE;
   }

   MakeCurrent();

   TGLSceneInfo*    sinfo = fSelRec.GetSceneInfo();
   TGLSceneBase*    scene = sinfo->GetScene();
   TGLPhysicalShape* pshp = fSelRec.GetPhysShape();

   SceneInfoList_t foo;
   foo.push_back(sinfo);
   fScenes.swap(foo);
   fRnrCtx->BeginSelection(x, y, TGLUtil::GetPickingRadius());
   fRnrCtx->SetSecSelection(kTRUE);
   glRenderMode(GL_SELECT);

   PreRender();
   fRnrCtx->SetSceneInfo(sinfo);
   scene->PreRender(*fRnrCtx);
   fRnrCtx->SetDrawPass(TGLRnrCtx::kPassFill);
   fRnrCtx->SetShapeLOD(TGLRnrCtx::kLODHigh);
   glPushName(pshp->ID());
   // !!! Hack: does not use clipping and proper draw-pass settings.
   pshp->Draw(*fRnrCtx);
   glPopName();
   scene->PostRender(*fRnrCtx);
   fRnrCtx->SetSceneInfo(0);
   PostRender();

   Int_t nSecHits = glRenderMode(GL_RENDER);
   fRnrCtx->EndSelection(nSecHits);
   fScenes.swap(foo);

   if (gDebug > 0) Info("TGLViewer::DoSelect", "Secondary select nSecHits=%d.", nSecHits);

   ReleaseLock(kSelectLock);

   if (nSecHits > 0)
   {
      fSecSelRec = fSelRec;
      fSecSelRec.SetRawOnly(fRnrCtx->GetSelectBuffer()->RawRecord(0));
      if (gDebug > 1) fSecSelRec.Print();
      return kTRUE;
   } else {
      fSecSelRec.Reset();
      return kFALSE;
   }
}

//______________________________________________________________________________
void TGLViewer::ApplySelection()
{
   // Process result from last selection (in fSelRec) and
   // extract a new current selection from it.
   // Here we only use physical shape.

   fCurrentSelRec = fSelRec;

   TGLPhysicalShape *selPhys = fSelRec.GetPhysShape();
   fSelectedPShapeRef->SetPShape(selPhys);

   // Inform external client selection has been modified.
   SelectionChanged();

   RequestDraw(TGLRnrCtx::kLODHigh);
}

//______________________________________________________________________________
Bool_t TGLViewer::RequestOverlaySelect(Int_t x, Int_t y)
{
   // Post request for secondary selection rendering of selected object
   // around the window point (x,y).

   // Take select lock on viewer immediately - it is released
   // in the other (drawing) thread - see TGLViewer::DoSecondarySelect().

   if ( ! TakeLock(kSelectLock)) {
      return kFALSE;
   }

   if (!gVirtualX->IsCmdThread())
      return Bool_t(gROOT->ProcessLineFast(Form("((TGLViewer *)0x%lx)->DoOverlaySelect(%d, %d)", (ULong_t)this, x, y)));
   else
      return DoOverlaySelect(x, y);
}

//______________________________________________________________________________
Bool_t TGLViewer::DoOverlaySelect(Int_t x, Int_t y)
{
   // Perform GL selection, picking overlay objects only.
   // Return TRUE if the selected overlay-element has changed.

   R__LOCKGUARD2(gROOTMutex);

   if (CurrentLock() != kSelectLock) {
      Error("TGLViewer::DoOverlaySelect", "expected kSelectLock, found %s", LockName(CurrentLock()));
      return kFALSE;
   }

   TGLUtil::PointToViewport(x, y);

   TUnlocker ulck(this);

   MakeCurrent();

   fRnrCtx->BeginSelection(x, y, TGLUtil::GetPickingRadius());
   glRenderMode(GL_SELECT);

   PreRenderOverlaySelection();
   RenderOverlay(TGLOverlayElement::kActive, kTRUE);
   PostRenderOverlaySelection();

   Int_t nHits = glRenderMode(GL_RENDER);
   fRnrCtx->EndSelection(nHits);

   // Process overlay selection.
   TGLOverlayElement * selElm = 0;
   if (nHits > 0)
   {
      Int_t idx = 0;
      while (idx < nHits && FindClosestOverlayRecord(fOvlSelRec, idx))
      {
         TGLOverlayElement* el = fOvlSelRec.GetOvlElement();
         if (el == fCurrentOvlElm)
         {
            if (el->MouseStillInside(fOvlSelRec))
            {
               selElm = el;
               break;
            }
         }
         else if (el->MouseEnter(fOvlSelRec))
         {
            selElm = el;
            break;
         }
         ++idx;
      }
   }
   else
   {
      fOvlSelRec.Reset();
   }

   ReleaseLock(kSelectLock);

   if (fCurrentOvlElm != selElm)
   {
      if (fCurrentOvlElm) fCurrentOvlElm->MouseLeave();
      fCurrentOvlElm = selElm;
      return kTRUE;
   }
   else
   {
      return kFALSE;
   }
}

//______________________________________________________________________________
void TGLFaderHelper::MakeFadeStep()
{
   // Make one fading step and request redraw.

   Float_t fade = fViewer->GetFader();

   if (fade == fFadeTarget) {
      delete this; return;
   }
   if (TMath::Abs(fFadeTarget - fade) < 1e-3) {
      fViewer->SetFader(fFadeTarget);
      fViewer->RequestDraw(TGLRnrCtx::kLODHigh);
      delete this;
      return;
   }

   Float_t dt = fTime/fNSteps;
   Float_t df = (fFadeTarget - fade)/fNSteps;
   fViewer->SetFader(fade + df);
   fViewer->RequestDraw(TGLRnrCtx::kLODHigh);
   fTime -= dt; --fNSteps;
   TTimer::SingleShot(TMath::CeilNint(1000*dt),
                      "TGLFaderHelper", this, "MakeFadeStep()");
}

//______________________________________________________________________________
void TGLViewer::AutoFade(Float_t fade, Float_t time, Int_t steps)
{
   // Animate fading from curernt value to fade over given time (sec)
   // and number of steps.

   TGLFaderHelper* fh = new TGLFaderHelper(this, fade, time, steps);
   fh->MakeFadeStep();
}

//______________________________________________________________________________
void TGLViewer::UseDarkColorSet()
{
   // Use the dark color-set.

   fRnrCtx->ChangeBaseColorSet(&fDarkColorSet);
   RefreshPadEditor(this);
}

//______________________________________________________________________________
void TGLViewer::UseLightColorSet()
{
   // Use the light color-set.

   fRnrCtx->ChangeBaseColorSet(&fLightColorSet);
   RefreshPadEditor(this);
}

//______________________________________________________________________________
void TGLViewer::SwitchColorSet()
{
   // Swtich between dark and light colorsets.

   if (IsUsingDefaultColorSet())
   {
      Info("SwitchColorSet()", "Global color-set is in use, switch not supported.");
      return;
   }

   if (fRnrCtx->GetBaseColorSet() == &fLightColorSet)
      UseDarkColorSet();
   else
      UseLightColorSet();
}

//______________________________________________________________________________
void TGLViewer::UseDefaultColorSet(Bool_t x)
{
   // Set usage of the default color set.

   if (x)
      fRnrCtx->ChangeBaseColorSet(&fgDefaultColorSet);
   else
      fRnrCtx->ChangeBaseColorSet(&fDarkColorSet);
   RefreshPadEditor(this);
}

//______________________________________________________________________________
Bool_t TGLViewer::IsUsingDefaultColorSet() const
{
   // Check if the viewer is using the default color set.
   // If yes, some operations might be disabled.

   return fRnrCtx->GetBaseColorSet() == &fgDefaultColorSet;
}

//______________________________________________________________________________
void TGLViewer::SetClearColor(Color_t col)
{
   // Set background method.
   // Deprecated method - set background color in the color-set.

   fRnrCtx->GetBaseColorSet()->Background().SetColor(col);
}

//______________________________________________________________________________
TGLColorSet& TGLViewer::GetDefaultColorSet()
{
   // Returns reference to the default color-set.
   // Static function.

   return fgDefaultColorSet;
}

//______________________________________________________________________________
void TGLViewer::UseDefaultColorSetForNewViewers(Bool_t x)
{
   // Sets static flag that determines if new viewers should use the
   // default color-set.
   // This is false at startup.

   fgUseDefaultColorSetForNewViewers = x;
}

//______________________________________________________________________________
Bool_t TGLViewer::IsUsingDefaultColorSetForNewViewers()
{
   // Returns the value of the static flag that determines if new
   // viewers should use the default color-set.
   // This is false at startup.

   return fgUseDefaultColorSetForNewViewers;
}

//______________________________________________________________________________
Bool_t TGLViewer::IsColorSetDark() const
{
   // Returns true if curremt color set is dark.

   return fRnrCtx->GetBaseColorSet() == &fDarkColorSet;
}

/**************************************************************************/
// Viewport
/**************************************************************************/

//______________________________________________________________________________
void TGLViewer::SetViewport(Int_t x, Int_t y, Int_t width, Int_t height)
{
   // Set viewer viewport (window area) with bottom/left at (x,y), with
   // dimensions 'width'/'height'

   // Only process if changed
   if (fViewport.X() == x && fViewport.Y() == y &&
       fViewport.Width() == width && fViewport.Height() == height) {
      return;
   }

   fViewport.Set(x, y, width, height);
   fCurrentCamera->SetViewport(fViewport);

   if (gDebug > 2) {
      Info("TGLViewer::SetViewport", "updated - corner %d,%d dimensions %d,%d", x, y, width, height);
   }
}

void TGLViewer::SetViewport(const TGLRect& vp)
{
   // Set viewr viewport from TGLRect.

   SetViewport(vp.X(), vp.Y(), vp.Width(), vp.Height());
}

/**************************************************************************/
// Camera methods
/**************************************************************************/

//______________________________________________________________________________
TGLCamera& TGLViewer::RefCamera(ECameraType cameraType)
{
   // Return camera reference by type.

   // TODO: Move these into a vector!
   switch(cameraType) {
      case kCameraPerspXOZ:
         return fPerspectiveCameraXOZ;
      case kCameraPerspYOZ:
         return fPerspectiveCameraYOZ;
      case kCameraPerspXOY:
         return fPerspectiveCameraXOY;
      case kCameraOrthoXOY:
         return fOrthoXOYCamera;
      case kCameraOrthoXOZ:
         return fOrthoXOZCamera;
      case kCameraOrthoZOY:
         return fOrthoZOYCamera;
      case kCameraOrthoXnOY:
         return fOrthoXnOYCamera;
      case kCameraOrthoXnOZ:
         return fOrthoXnOZCamera;
      case kCameraOrthoZnOY:
         return fOrthoZnOYCamera;
      default:
         Error("TGLViewer::SetCurrentCamera", "invalid camera type");
         return *fCurrentCamera;
   }
}

//______________________________________________________________________________
void TGLViewer::SetCurrentCamera(ECameraType cameraType)
{
   // Set current active camera - 'cameraType' one of:
   //   kCameraPerspX,    kCameraPerspY,    kCameraPerspZ,
   //   kCameraOrthoXOY,  kCameraOrthoXOZ,  kCameraOrthoZOY,
   //   kCameraOrthoXnOY, kCameraOrthoXnOZ, kCameraOrthoZnOY

   if (IsLocked()) {
      Error("TGLViewer::SetCurrentCamera", "expected kUnlocked, found %s", LockName(CurrentLock()));
      return;
   }

   // TODO: Move these into a vector!
   TGLCamera *prev = fCurrentCamera;
   switch (cameraType)
   {
      case kCameraPerspXOZ: {
         fCurrentCamera = &fPerspectiveCameraXOZ;
         break;
      }
      case kCameraPerspYOZ: {
         fCurrentCamera = &fPerspectiveCameraYOZ;
         break;
      }
      case kCameraPerspXOY: {
         fCurrentCamera = &fPerspectiveCameraXOY;
         break;
      }
      case kCameraOrthoXOY: {
         fCurrentCamera = &fOrthoXOYCamera;
         break;
      }
      case kCameraOrthoXOZ: {
         fCurrentCamera = &fOrthoXOZCamera;
         break;
      }
      case kCameraOrthoZOY: {
         fCurrentCamera = &fOrthoZOYCamera;
         break;
      }
      case kCameraOrthoXnOY: {
         fCurrentCamera = &fOrthoXnOYCamera;
         break;
      }
      case kCameraOrthoXnOZ: {
         fCurrentCamera = &fOrthoXnOZCamera;
         break;
      }
      case kCameraOrthoZnOY: {
         fCurrentCamera = &fOrthoZnOYCamera;
         break;
      }
      default: {
         Error("TGLViewer::SetCurrentCamera", "invalid camera type");
         break;
      }
   }

   if (fCurrentCamera != prev)
   {
      // Ensure any viewport has been propigated to the current camera
      fCurrentCamera->SetViewport(fViewport);
      RefreshPadEditor(this);

      if (fAutoRotator)
      {
         if (fAutoRotator->IsRunning())
         {
            fAutoRotator->Stop();
         }
         else
         {
            if (fAutoRotator->GetCamera() == fCurrentCamera)
            {
               fAutoRotator->Start();
            }
         }
      }

      RequestDraw(TGLRnrCtx::kLODHigh);
   }
}

//______________________________________________________________________________
void TGLViewer::SetOrthoCamera(ECameraType camera,
                               Double_t zoom, Double_t dolly,
                               Double_t center[3],
                               Double_t hRotate, Double_t vRotate)
{
   // Set an orthographic camera to supplied configuration - note this
   // does not need to be the current camera - though you will not see
   // the effect if it is not.
   //
   // 'camera' defines the ortho camera - one of kCameraOrthoXOY / XOZ / ZOY
   // 'left' / 'right' / 'top' / 'bottom' define the WORLD coordinates which
   // corresepond with the left/right/top/bottom positions on the GL viewer viewport
   // E.g. for kCameraOrthoXOY camera left/right are X world coords,
   // top/bottom are Y world coords
   // As this is an orthographic camera the other axis (in eye direction) is
   // no relevant. The near/far clip planes are set automatically based in scene
   // contents

   // TODO: Move these into a vector!
   switch(camera) {
      case kCameraOrthoXOY: {
         fOrthoXOYCamera.Configure(zoom, dolly, center, hRotate, vRotate);
         if (fCurrentCamera == &fOrthoXOYCamera) {
            RequestDraw(TGLRnrCtx::kLODHigh);
         }
         break;
      }
      case kCameraOrthoXOZ: {
         fOrthoXOZCamera.Configure(zoom, dolly, center, hRotate, vRotate);
         if (fCurrentCamera == &fOrthoXOZCamera) {
            RequestDraw(TGLRnrCtx::kLODHigh);
         }
         break;
      }
      case kCameraOrthoZOY: {
         fOrthoZOYCamera.Configure(zoom, dolly, center, hRotate, vRotate);
         if (fCurrentCamera == &fOrthoZOYCamera) {
            RequestDraw(TGLRnrCtx::kLODHigh);
         }
         break;
      }
      default: {
         Error("TGLViewer::SetOrthoCamera", "invalid camera type");
         break;
      }
   }
}

//______________________________________________________________________________
void TGLViewer::SetPerspectiveCamera(ECameraType camera,
                                     Double_t fov, Double_t dolly,
                                     Double_t center[3],
                                     Double_t hRotate, Double_t vRotate)
{
   // Set a perspective camera to supplied configuration - note this
   // does not need to be the current camera - though you will not see
   // the effect if it is not.
   //
   // 'camera' defines the persp camera - one of kCameraPerspXOZ, kCameraPerspYOZ, kCameraPerspXOY
   // 'fov' - field of view (lens angle) in degrees (clamped to 0.1 - 170.0)
   // 'dolly' - distance from 'center'
   // 'center' - world position from which dolly/hRotate/vRotate are measured
   //             camera rotates round this, always facing in (in center of viewport)
   // 'hRotate' - horizontal rotation from initial configuration in degrees
   // 'hRotate' - vertical rotation from initial configuration in degrees

   // TODO: Move these into a vector!
   switch(camera) {
      case kCameraPerspXOZ: {
         fPerspectiveCameraXOZ.Configure(fov, dolly, center, hRotate, vRotate);
         if (fCurrentCamera == &fPerspectiveCameraXOZ) {
            RequestDraw(TGLRnrCtx::kLODHigh);
         }
         break;
      }
      case kCameraPerspYOZ: {
         fPerspectiveCameraYOZ.Configure(fov, dolly, center, hRotate, vRotate);
         if (fCurrentCamera == &fPerspectiveCameraYOZ) {
            RequestDraw(TGLRnrCtx::kLODHigh);
         }
         break;
      }
      case kCameraPerspXOY: {
         fPerspectiveCameraXOY.Configure(fov, dolly, center, hRotate, vRotate);
         if (fCurrentCamera == &fPerspectiveCameraXOY) {
            RequestDraw(TGLRnrCtx::kLODHigh);
         }
         break;
      }
      default: {
         Error("TGLViewer::SetPerspectiveCamera", "invalid camera type");
         break;
      }
   }
}

//______________________________________________________________________________
void TGLViewer::ReinitializeCurrentCamera(const TGLVector3& hAxis, const TGLVector3& vAxis, Bool_t redraw)
{
   // Change base-vectors defining the camera-base transformation of current
   // camera. hAxis and vAxis are the default directions for forward
   // (inverted) and upwards.

   TGLMatrix& cb = fCurrentCamera->RefCamBase();
   cb.Set(cb.GetTranslation(), vAxis, hAxis);
   fCurrentCamera->Setup(fOverallBoundingBox, kTRUE);
   if (redraw)
      RequestDraw();
}

//______________________________________________________________________________
TGLAutoRotator* TGLViewer::GetAutoRotator()
{
   // Get the auto-rotator for this viewer.

   if (fAutoRotator == 0)
      fAutoRotator = new TGLAutoRotator(this);
   return fAutoRotator;
}

//______________________________________________________________________________
void TGLViewer::SetAutoRotator(TGLAutoRotator* ar)
{
   // Set the auto-rotator for this viewer. The old rotator is deleted.

   delete fAutoRotator;
   fAutoRotator = ar;
}


/**************************************************************************/
// Guide methods
/**************************************************************************/

//______________________________________________________________________________
void TGLViewer::GetGuideState(Int_t & axesType, Bool_t & axesDepthTest, Bool_t & referenceOn, Double_t referencePos[3]) const
{
   // Fetch the state of guides (axes & reference markers) into arguments

   axesType = fAxesType;
   axesDepthTest = fAxesDepthTest;

   referenceOn = fReferenceOn;
   referencePos[0] = fReferencePos.X();
   referencePos[1] = fReferencePos.Y();
   referencePos[2] = fReferencePos.Z();
}

//______________________________________________________________________________
void TGLViewer::SetGuideState(Int_t axesType, Bool_t axesDepthTest, Bool_t referenceOn, const Double_t referencePos[3])
{
   // Set the state of guides (axes & reference markers) from arguments.

   fAxesType    = axesType;
   fAxesDepthTest = axesDepthTest;
   fReferenceOn = referenceOn;
   if (referencePos)
      fReferencePos.Set(referencePos[0], referencePos[1], referencePos[2]);
   if (fGLDevice != -1)
      gGLManager->MarkForDirectCopy(fGLDevice, kTRUE);
   RequestDraw();
}

//______________________________________________________________________________
void TGLViewer::SetDrawCameraCenter(Bool_t x)
{
   // Draw camera look at and rotation point.

   fDrawCameraCenter = x;
   RequestDraw();
}

// Selected physical
//______________________________________________________________________________
const TGLPhysicalShape * TGLViewer::GetSelected() const
{
   // Return selected physical shape.

   return fSelectedPShapeRef->GetPShape();
}

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

//______________________________________________________________________________
void TGLViewer::MouseOver(TGLPhysicalShape *shape)
{
   // Emit MouseOver signal.

   Emit("MouseOver(TGLPhysicalShape*)", (Long_t)shape);
}

//______________________________________________________________________________
void TGLViewer::MouseOver(TGLPhysicalShape *shape, UInt_t state)
{
   // Emit MouseOver signal.

   Long_t args[2];
   args[0] = (Long_t)shape;
   args[1] = state;
   Emit("MouseOver(TGLPhysicalShape*,UInt_t)", args);
}

//______________________________________________________________________________
void TGLViewer::MouseOver(TObject *obj, UInt_t state)
{
   // Emit MouseOver signal.

   Long_t args[2];
   args[0] = (Long_t)obj;
   args[1] = state;
   Emit("MouseOver(TObject*,UInt_t)", args);
}

//______________________________________________________________________________
void TGLViewer::ReMouseOver(TObject *obj, UInt_t state)
{
   // Emit MouseOver signal.

   Long_t args[2];
   args[0] = (Long_t)obj;
   args[1] = state;
   Emit("ReMouseOver(TObject*,UInt_t)", args);
}


//______________________________________________________________________________
void TGLViewer::UnMouseOver(TObject *obj, UInt_t state)
{
   // Emit UnMouseOver signal.

   Long_t args[2];
   args[0] = (Long_t)obj;
   args[1] = state;
   Emit("UnMouseOver(TObject*,UInt_t)", args);
}

//______________________________________________________________________________
void TGLViewer::Clicked(TObject *obj)
{
   // Emit Clicked signal.

   Emit("Clicked(TObject*)", (Long_t)obj);
}

//______________________________________________________________________________
void TGLViewer::Clicked(TObject *obj, UInt_t button, UInt_t state)
{
   // Emit Clicked signal with button id and modifier state.

   Long_t args[3];
   args[0] = (Long_t)obj;
   args[1] = button;
   args[2] = state;
   Emit("Clicked(TObject*,UInt_t,UInt_t)", args);
}


//______________________________________________________________________________
void TGLViewer::ReClicked(TObject *obj, UInt_t button, UInt_t state)
{
   // Emit ReClicked signal with button id and modifier state.

   Long_t args[3];
   args[0] = (Long_t)obj;
   args[1] = button;
   args[2] = state;
   Emit("ReClicked(TObject*,UInt_t,UInt_t)", args);
}

//______________________________________________________________________________
void TGLViewer::UnClicked(TObject *obj, UInt_t button, UInt_t state)
{
   // Emit UnClicked signal with button id and modifier state.

   Long_t args[3];
   args[0] = (Long_t)obj;
   args[1] = button;
   args[2] = state;
   Emit("UnClicked(TObject*,UInt_t,UInt_t)", args);
}

//______________________________________________________________________________
void TGLViewer::MouseIdle(TGLPhysicalShape *shape, UInt_t posx, UInt_t posy)
{
   // Emit MouseIdle signal.

   Long_t args[3];
   static UInt_t oldx = 0, oldy = 0;

   if (oldx != posx || oldy != posy) {
      args[0] = (Long_t)shape;
      args[1] = posx;
      args[2] = posy;
      Emit("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", args);
      oldx = posx;
      oldy = posy;
   }
}

/**************************************************************************/
/**************************************************************************/
//______________________________________________________________________________
Int_t TGLViewer::DistancetoPrimitive(Int_t /*px*/, Int_t /*py*/)
{
   // Calcaulate and return pixel distance to nearest viewer object from
   // window location px, py
   // This is provided for use when embedding GL viewer into pad

   // Can't track the indvidual objects in rollover. Just set the viewer as the
   // selected object, and return 0 (object identified) so we receive ExecuteEvent calls
   gPad->SetSelected(this);
   return 0;
}

//______________________________________________________________________________
void TGLViewer::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
   // Process event of type 'event' - one of EEventType types,
   // occuring at window location px, py
   // This is provided for use when embedding GL viewer into pad

   if (fEventHandler)
      return fEventHandler->ExecuteEvent(event, px, py);
}

//______________________________________________________________________________
void TGLViewer::PrintObjects()
{
   // Pass viewer for print capture by TGLOutput.

   TGLOutput::Capture(*this);
}

//______________________________________________________________________________
void TGLViewer::SelectionChanged()
{
   // Update GUI components for embedded viewer selection change.

   if (!fGedEditor)
      return;

   TGLPhysicalShape *selected = const_cast<TGLPhysicalShape*>(GetSelected());

   if (selected) {
      fPShapeWrap->fPShape = selected;
      fGedEditor->SetModel(fPad, fPShapeWrap, kButton1Down);
   } else {
      fPShapeWrap->fPShape = 0;
      fGedEditor->SetModel(fPad, this, kButton1Down);
   }
}

//______________________________________________________________________________
void TGLViewer::OverlayDragFinished()
{
   // An overlay operation can result in change to an object.
   // Refresh geditor.

   if (fGedEditor)
   {
      fGedEditor->SetModel(fPad, fGedEditor->GetModel(), kButton1Down);
   }
}

//______________________________________________________________________________
void TGLViewer::RefreshPadEditor(TObject* obj)
{
   // Update GED editor if it is set.

   if (fGedEditor && (obj == 0 || fGedEditor->GetModel() == obj))
   {
      fGedEditor->SetModel(fPad, fGedEditor->GetModel(), kButton1Down);
   }
}

//______________________________________________________________________________
void TGLViewer::SetEventHandler(TGEventHandler *handler)
{
   // Set the event-handler. The event-handler is owned by the viewer.
   // If GLWidget is set, the handler is propagated to it.
   //
   // If called with handler=0, the current handler will be deleted
   // (also from TGLWidget).

   if (fEventHandler)
      delete fEventHandler;

   fEventHandler = handler;
   if (fGLWidget)
      fGLWidget->SetEventHandler(fEventHandler);
}

//______________________________________________________________________________
void  TGLViewer::RemoveOverlayElement(TGLOverlayElement* el)
{
   // Remove overlay element.

   if (el == fCurrentOvlElm)
   {
      fCurrentOvlElm = 0;
   }
   TGLViewerBase::RemoveOverlayElement(el);
}

//______________________________________________________________________________
void TGLViewer::ClearCurrentOvlElm()
{
   // Reset current overlay-element to zero, eventually notifying the
   // old one that the mouse has left.
   // Usually called when mouse leaves the window.

   if (fCurrentOvlElm)
   {
      fCurrentOvlElm->MouseLeave();
      fCurrentOvlElm = 0;
      RequestDraw();
   }
}
 TGLViewer.cxx:1
 TGLViewer.cxx:2
 TGLViewer.cxx:3
 TGLViewer.cxx:4
 TGLViewer.cxx:5
 TGLViewer.cxx:6
 TGLViewer.cxx:7
 TGLViewer.cxx:8
 TGLViewer.cxx:9
 TGLViewer.cxx:10
 TGLViewer.cxx:11
 TGLViewer.cxx:12
 TGLViewer.cxx:13
 TGLViewer.cxx:14
 TGLViewer.cxx:15
 TGLViewer.cxx:16
 TGLViewer.cxx:17
 TGLViewer.cxx:18
 TGLViewer.cxx:19
 TGLViewer.cxx:20
 TGLViewer.cxx:21
 TGLViewer.cxx:22
 TGLViewer.cxx:23
 TGLViewer.cxx:24
 TGLViewer.cxx:25
 TGLViewer.cxx:26
 TGLViewer.cxx:27
 TGLViewer.cxx:28
 TGLViewer.cxx:29
 TGLViewer.cxx:30
 TGLViewer.cxx:31
 TGLViewer.cxx:32
 TGLViewer.cxx:33
 TGLViewer.cxx:34
 TGLViewer.cxx:35
 TGLViewer.cxx:36
 TGLViewer.cxx:37
 TGLViewer.cxx:38
 TGLViewer.cxx:39
 TGLViewer.cxx:40
 TGLViewer.cxx:41
 TGLViewer.cxx:42
 TGLViewer.cxx:43
 TGLViewer.cxx:44
 TGLViewer.cxx:45
 TGLViewer.cxx:46
 TGLViewer.cxx:47
 TGLViewer.cxx:48
 TGLViewer.cxx:49
 TGLViewer.cxx:50
 TGLViewer.cxx:51
 TGLViewer.cxx:52
 TGLViewer.cxx:53
 TGLViewer.cxx:54
 TGLViewer.cxx:55
 TGLViewer.cxx:56
 TGLViewer.cxx:57
 TGLViewer.cxx:58
 TGLViewer.cxx:59
 TGLViewer.cxx:60
 TGLViewer.cxx:61
 TGLViewer.cxx:62
 TGLViewer.cxx:63
 TGLViewer.cxx:64
 TGLViewer.cxx:65
 TGLViewer.cxx:66
 TGLViewer.cxx:67
 TGLViewer.cxx:68
 TGLViewer.cxx:69
 TGLViewer.cxx:70
 TGLViewer.cxx:71
 TGLViewer.cxx:72
 TGLViewer.cxx:73
 TGLViewer.cxx:74
 TGLViewer.cxx:75
 TGLViewer.cxx:76
 TGLViewer.cxx:77
 TGLViewer.cxx:78
 TGLViewer.cxx:79
 TGLViewer.cxx:80
 TGLViewer.cxx:81
 TGLViewer.cxx:82
 TGLViewer.cxx:83
 TGLViewer.cxx:84
 TGLViewer.cxx:85
 TGLViewer.cxx:86
 TGLViewer.cxx:87
 TGLViewer.cxx:88
 TGLViewer.cxx:89
 TGLViewer.cxx:90
 TGLViewer.cxx:91
 TGLViewer.cxx:92
 TGLViewer.cxx:93
 TGLViewer.cxx:94
 TGLViewer.cxx:95
 TGLViewer.cxx:96
 TGLViewer.cxx:97
 TGLViewer.cxx:98
 TGLViewer.cxx:99
 TGLViewer.cxx:100
 TGLViewer.cxx:101
 TGLViewer.cxx:102
 TGLViewer.cxx:103
 TGLViewer.cxx:104
 TGLViewer.cxx:105
 TGLViewer.cxx:106
 TGLViewer.cxx:107
 TGLViewer.cxx:108
 TGLViewer.cxx:109
 TGLViewer.cxx:110
 TGLViewer.cxx:111
 TGLViewer.cxx:112
 TGLViewer.cxx:113
 TGLViewer.cxx:114
 TGLViewer.cxx:115
 TGLViewer.cxx:116
 TGLViewer.cxx:117
 TGLViewer.cxx:118
 TGLViewer.cxx:119
 TGLViewer.cxx:120
 TGLViewer.cxx:121
 TGLViewer.cxx:122
 TGLViewer.cxx:123
 TGLViewer.cxx:124
 TGLViewer.cxx:125
 TGLViewer.cxx:126
 TGLViewer.cxx:127
 TGLViewer.cxx:128
 TGLViewer.cxx:129
 TGLViewer.cxx:130
 TGLViewer.cxx:131
 TGLViewer.cxx:132
 TGLViewer.cxx:133
 TGLViewer.cxx:134
 TGLViewer.cxx:135
 TGLViewer.cxx:136
 TGLViewer.cxx:137
 TGLViewer.cxx:138
 TGLViewer.cxx:139
 TGLViewer.cxx:140
 TGLViewer.cxx:141
 TGLViewer.cxx:142
 TGLViewer.cxx:143
 TGLViewer.cxx:144
 TGLViewer.cxx:145
 TGLViewer.cxx:146
 TGLViewer.cxx:147
 TGLViewer.cxx:148
 TGLViewer.cxx:149
 TGLViewer.cxx:150
 TGLViewer.cxx:151
 TGLViewer.cxx:152
 TGLViewer.cxx:153
 TGLViewer.cxx:154
 TGLViewer.cxx:155
 TGLViewer.cxx:156
 TGLViewer.cxx:157
 TGLViewer.cxx:158
 TGLViewer.cxx:159
 TGLViewer.cxx:160
 TGLViewer.cxx:161
 TGLViewer.cxx:162
 TGLViewer.cxx:163
 TGLViewer.cxx:164
 TGLViewer.cxx:165
 TGLViewer.cxx:166
 TGLViewer.cxx:167
 TGLViewer.cxx:168
 TGLViewer.cxx:169
 TGLViewer.cxx:170
 TGLViewer.cxx:171
 TGLViewer.cxx:172
 TGLViewer.cxx:173
 TGLViewer.cxx:174
 TGLViewer.cxx:175
 TGLViewer.cxx:176
 TGLViewer.cxx:177
 TGLViewer.cxx:178
 TGLViewer.cxx:179
 TGLViewer.cxx:180
 TGLViewer.cxx:181
 TGLViewer.cxx:182
 TGLViewer.cxx:183
 TGLViewer.cxx:184
 TGLViewer.cxx:185
 TGLViewer.cxx:186
 TGLViewer.cxx:187
 TGLViewer.cxx:188
 TGLViewer.cxx:189
 TGLViewer.cxx:190
 TGLViewer.cxx:191
 TGLViewer.cxx:192
 TGLViewer.cxx:193
 TGLViewer.cxx:194
 TGLViewer.cxx:195
 TGLViewer.cxx:196
 TGLViewer.cxx:197
 TGLViewer.cxx:198
 TGLViewer.cxx:199
 TGLViewer.cxx:200
 TGLViewer.cxx:201
 TGLViewer.cxx:202
 TGLViewer.cxx:203
 TGLViewer.cxx:204
 TGLViewer.cxx:205
 TGLViewer.cxx:206
 TGLViewer.cxx:207
 TGLViewer.cxx:208
 TGLViewer.cxx:209
 TGLViewer.cxx:210
 TGLViewer.cxx:211
 TGLViewer.cxx:212
 TGLViewer.cxx:213
 TGLViewer.cxx:214
 TGLViewer.cxx:215
 TGLViewer.cxx:216
 TGLViewer.cxx:217
 TGLViewer.cxx:218
 TGLViewer.cxx:219
 TGLViewer.cxx:220
 TGLViewer.cxx:221
 TGLViewer.cxx:222
 TGLViewer.cxx:223
 TGLViewer.cxx:224
 TGLViewer.cxx:225
 TGLViewer.cxx:226
 TGLViewer.cxx:227
 TGLViewer.cxx:228
 TGLViewer.cxx:229
 TGLViewer.cxx:230
 TGLViewer.cxx:231
 TGLViewer.cxx:232
 TGLViewer.cxx:233
 TGLViewer.cxx:234
 TGLViewer.cxx:235
 TGLViewer.cxx:236
 TGLViewer.cxx:237
 TGLViewer.cxx:238
 TGLViewer.cxx:239
 TGLViewer.cxx:240
 TGLViewer.cxx:241
 TGLViewer.cxx:242
 TGLViewer.cxx:243
 TGLViewer.cxx:244
 TGLViewer.cxx:245
 TGLViewer.cxx:246
 TGLViewer.cxx:247
 TGLViewer.cxx:248
 TGLViewer.cxx:249
 TGLViewer.cxx:250
 TGLViewer.cxx:251
 TGLViewer.cxx:252
 TGLViewer.cxx:253
 TGLViewer.cxx:254
 TGLViewer.cxx:255
 TGLViewer.cxx:256
 TGLViewer.cxx:257
 TGLViewer.cxx:258
 TGLViewer.cxx:259
 TGLViewer.cxx:260
 TGLViewer.cxx:261
 TGLViewer.cxx:262
 TGLViewer.cxx:263
 TGLViewer.cxx:264
 TGLViewer.cxx:265
 TGLViewer.cxx:266
 TGLViewer.cxx:267
 TGLViewer.cxx:268
 TGLViewer.cxx:269
 TGLViewer.cxx:270
 TGLViewer.cxx:271
 TGLViewer.cxx:272
 TGLViewer.cxx:273
 TGLViewer.cxx:274
 TGLViewer.cxx:275
 TGLViewer.cxx:276
 TGLViewer.cxx:277
 TGLViewer.cxx:278
 TGLViewer.cxx:279
 TGLViewer.cxx:280
 TGLViewer.cxx:281
 TGLViewer.cxx:282
 TGLViewer.cxx:283
 TGLViewer.cxx:284
 TGLViewer.cxx:285
 TGLViewer.cxx:286
 TGLViewer.cxx:287
 TGLViewer.cxx:288
 TGLViewer.cxx:289
 TGLViewer.cxx:290
 TGLViewer.cxx:291
 TGLViewer.cxx:292
 TGLViewer.cxx:293
 TGLViewer.cxx:294
 TGLViewer.cxx:295
 TGLViewer.cxx:296
 TGLViewer.cxx:297
 TGLViewer.cxx:298
 TGLViewer.cxx:299
 TGLViewer.cxx:300
 TGLViewer.cxx:301
 TGLViewer.cxx:302
 TGLViewer.cxx:303
 TGLViewer.cxx:304
 TGLViewer.cxx:305
 TGLViewer.cxx:306
 TGLViewer.cxx:307
 TGLViewer.cxx:308
 TGLViewer.cxx:309
 TGLViewer.cxx:310
 TGLViewer.cxx:311
 TGLViewer.cxx:312
 TGLViewer.cxx:313
 TGLViewer.cxx:314
 TGLViewer.cxx:315
 TGLViewer.cxx:316
 TGLViewer.cxx:317
 TGLViewer.cxx:318
 TGLViewer.cxx:319
 TGLViewer.cxx:320
 TGLViewer.cxx:321
 TGLViewer.cxx:322
 TGLViewer.cxx:323
 TGLViewer.cxx:324
 TGLViewer.cxx:325
 TGLViewer.cxx:326
 TGLViewer.cxx:327
 TGLViewer.cxx:328
 TGLViewer.cxx:329
 TGLViewer.cxx:330
 TGLViewer.cxx:331
 TGLViewer.cxx:332
 TGLViewer.cxx:333
 TGLViewer.cxx:334
 TGLViewer.cxx:335
 TGLViewer.cxx:336
 TGLViewer.cxx:337
 TGLViewer.cxx:338
 TGLViewer.cxx:339
 TGLViewer.cxx:340
 TGLViewer.cxx:341
 TGLViewer.cxx:342
 TGLViewer.cxx:343
 TGLViewer.cxx:344
 TGLViewer.cxx:345
 TGLViewer.cxx:346
 TGLViewer.cxx:347
 TGLViewer.cxx:348
 TGLViewer.cxx:349
 TGLViewer.cxx:350
 TGLViewer.cxx:351
 TGLViewer.cxx:352
 TGLViewer.cxx:353
 TGLViewer.cxx:354
 TGLViewer.cxx:355
 TGLViewer.cxx:356
 TGLViewer.cxx:357
 TGLViewer.cxx:358
 TGLViewer.cxx:359
 TGLViewer.cxx:360
 TGLViewer.cxx:361
 TGLViewer.cxx:362
 TGLViewer.cxx:363
 TGLViewer.cxx:364
 TGLViewer.cxx:365
 TGLViewer.cxx:366
 TGLViewer.cxx:367
 TGLViewer.cxx:368
 TGLViewer.cxx:369
 TGLViewer.cxx:370
 TGLViewer.cxx:371
 TGLViewer.cxx:372
 TGLViewer.cxx:373
 TGLViewer.cxx:374
 TGLViewer.cxx:375
 TGLViewer.cxx:376
 TGLViewer.cxx:377
 TGLViewer.cxx:378
 TGLViewer.cxx:379
 TGLViewer.cxx:380
 TGLViewer.cxx:381
 TGLViewer.cxx:382
 TGLViewer.cxx:383
 TGLViewer.cxx:384
 TGLViewer.cxx:385
 TGLViewer.cxx:386
 TGLViewer.cxx:387
 TGLViewer.cxx:388
 TGLViewer.cxx:389
 TGLViewer.cxx:390
 TGLViewer.cxx:391
 TGLViewer.cxx:392
 TGLViewer.cxx:393
 TGLViewer.cxx:394
 TGLViewer.cxx:395
 TGLViewer.cxx:396
 TGLViewer.cxx:397
 TGLViewer.cxx:398
 TGLViewer.cxx:399
 TGLViewer.cxx:400
 TGLViewer.cxx:401
 TGLViewer.cxx:402
 TGLViewer.cxx:403
 TGLViewer.cxx:404
 TGLViewer.cxx:405
 TGLViewer.cxx:406
 TGLViewer.cxx:407
 TGLViewer.cxx:408
 TGLViewer.cxx:409
 TGLViewer.cxx:410
 TGLViewer.cxx:411
 TGLViewer.cxx:412
 TGLViewer.cxx:413
 TGLViewer.cxx:414
 TGLViewer.cxx:415
 TGLViewer.cxx:416
 TGLViewer.cxx:417
 TGLViewer.cxx:418
 TGLViewer.cxx:419
 TGLViewer.cxx:420
 TGLViewer.cxx:421
 TGLViewer.cxx:422
 TGLViewer.cxx:423
 TGLViewer.cxx:424
 TGLViewer.cxx:425
 TGLViewer.cxx:426
 TGLViewer.cxx:427
 TGLViewer.cxx:428
 TGLViewer.cxx:429
 TGLViewer.cxx:430
 TGLViewer.cxx:431
 TGLViewer.cxx:432
 TGLViewer.cxx:433
 TGLViewer.cxx:434
 TGLViewer.cxx:435
 TGLViewer.cxx:436
 TGLViewer.cxx:437
 TGLViewer.cxx:438
 TGLViewer.cxx:439
 TGLViewer.cxx:440
 TGLViewer.cxx:441
 TGLViewer.cxx:442
 TGLViewer.cxx:443
 TGLViewer.cxx:444
 TGLViewer.cxx:445
 TGLViewer.cxx:446
 TGLViewer.cxx:447
 TGLViewer.cxx:448
 TGLViewer.cxx:449
 TGLViewer.cxx:450
 TGLViewer.cxx:451
 TGLViewer.cxx:452
 TGLViewer.cxx:453
 TGLViewer.cxx:454
 TGLViewer.cxx:455
 TGLViewer.cxx:456
 TGLViewer.cxx:457
 TGLViewer.cxx:458
 TGLViewer.cxx:459
 TGLViewer.cxx:460
 TGLViewer.cxx:461
 TGLViewer.cxx:462
 TGLViewer.cxx:463
 TGLViewer.cxx:464
 TGLViewer.cxx:465
 TGLViewer.cxx:466
 TGLViewer.cxx:467
 TGLViewer.cxx:468
 TGLViewer.cxx:469
 TGLViewer.cxx:470
 TGLViewer.cxx:471
 TGLViewer.cxx:472
 TGLViewer.cxx:473
 TGLViewer.cxx:474
 TGLViewer.cxx:475
 TGLViewer.cxx:476
 TGLViewer.cxx:477
 TGLViewer.cxx:478
 TGLViewer.cxx:479
 TGLViewer.cxx:480
 TGLViewer.cxx:481
 TGLViewer.cxx:482
 TGLViewer.cxx:483
 TGLViewer.cxx:484
 TGLViewer.cxx:485
 TGLViewer.cxx:486
 TGLViewer.cxx:487
 TGLViewer.cxx:488
 TGLViewer.cxx:489
 TGLViewer.cxx:490
 TGLViewer.cxx:491
 TGLViewer.cxx:492
 TGLViewer.cxx:493
 TGLViewer.cxx:494
 TGLViewer.cxx:495
 TGLViewer.cxx:496
 TGLViewer.cxx:497
 TGLViewer.cxx:498
 TGLViewer.cxx:499
 TGLViewer.cxx:500
 TGLViewer.cxx:501
 TGLViewer.cxx:502
 TGLViewer.cxx:503
 TGLViewer.cxx:504
 TGLViewer.cxx:505
 TGLViewer.cxx:506
 TGLViewer.cxx:507
 TGLViewer.cxx:508
 TGLViewer.cxx:509
 TGLViewer.cxx:510
 TGLViewer.cxx:511
 TGLViewer.cxx:512
 TGLViewer.cxx:513
 TGLViewer.cxx:514
 TGLViewer.cxx:515
 TGLViewer.cxx:516
 TGLViewer.cxx:517
 TGLViewer.cxx:518
 TGLViewer.cxx:519
 TGLViewer.cxx:520
 TGLViewer.cxx:521
 TGLViewer.cxx:522
 TGLViewer.cxx:523
 TGLViewer.cxx:524
 TGLViewer.cxx:525
 TGLViewer.cxx:526
 TGLViewer.cxx:527
 TGLViewer.cxx:528
 TGLViewer.cxx:529
 TGLViewer.cxx:530
 TGLViewer.cxx:531
 TGLViewer.cxx:532
 TGLViewer.cxx:533
 TGLViewer.cxx:534
 TGLViewer.cxx:535
 TGLViewer.cxx:536
 TGLViewer.cxx:537
 TGLViewer.cxx:538
 TGLViewer.cxx:539
 TGLViewer.cxx:540
 TGLViewer.cxx:541
 TGLViewer.cxx:542
 TGLViewer.cxx:543
 TGLViewer.cxx:544
 TGLViewer.cxx:545
 TGLViewer.cxx:546
 TGLViewer.cxx:547
 TGLViewer.cxx:548
 TGLViewer.cxx:549
 TGLViewer.cxx:550
 TGLViewer.cxx:551
 TGLViewer.cxx:552
 TGLViewer.cxx:553
 TGLViewer.cxx:554
 TGLViewer.cxx:555
 TGLViewer.cxx:556
 TGLViewer.cxx:557
 TGLViewer.cxx:558
 TGLViewer.cxx:559
 TGLViewer.cxx:560
 TGLViewer.cxx:561
 TGLViewer.cxx:562
 TGLViewer.cxx:563
 TGLViewer.cxx:564
 TGLViewer.cxx:565
 TGLViewer.cxx:566
 TGLViewer.cxx:567
 TGLViewer.cxx:568
 TGLViewer.cxx:569
 TGLViewer.cxx:570
 TGLViewer.cxx:571
 TGLViewer.cxx:572
 TGLViewer.cxx:573
 TGLViewer.cxx:574
 TGLViewer.cxx:575
 TGLViewer.cxx:576
 TGLViewer.cxx:577
 TGLViewer.cxx:578
 TGLViewer.cxx:579
 TGLViewer.cxx:580
 TGLViewer.cxx:581
 TGLViewer.cxx:582
 TGLViewer.cxx:583
 TGLViewer.cxx:584
 TGLViewer.cxx:585
 TGLViewer.cxx:586
 TGLViewer.cxx:587
 TGLViewer.cxx:588
 TGLViewer.cxx:589
 TGLViewer.cxx:590
 TGLViewer.cxx:591
 TGLViewer.cxx:592
 TGLViewer.cxx:593
 TGLViewer.cxx:594
 TGLViewer.cxx:595
 TGLViewer.cxx:596
 TGLViewer.cxx:597
 TGLViewer.cxx:598
 TGLViewer.cxx:599
 TGLViewer.cxx:600
 TGLViewer.cxx:601
 TGLViewer.cxx:602
 TGLViewer.cxx:603
 TGLViewer.cxx:604
 TGLViewer.cxx:605
 TGLViewer.cxx:606
 TGLViewer.cxx:607
 TGLViewer.cxx:608
 TGLViewer.cxx:609
 TGLViewer.cxx:610
 TGLViewer.cxx:611
 TGLViewer.cxx:612
 TGLViewer.cxx:613
 TGLViewer.cxx:614
 TGLViewer.cxx:615
 TGLViewer.cxx:616
 TGLViewer.cxx:617
 TGLViewer.cxx:618
 TGLViewer.cxx:619
 TGLViewer.cxx:620
 TGLViewer.cxx:621
 TGLViewer.cxx:622
 TGLViewer.cxx:623
 TGLViewer.cxx:624
 TGLViewer.cxx:625
 TGLViewer.cxx:626
 TGLViewer.cxx:627
 TGLViewer.cxx:628
 TGLViewer.cxx:629
 TGLViewer.cxx:630
 TGLViewer.cxx:631
 TGLViewer.cxx:632
 TGLViewer.cxx:633
 TGLViewer.cxx:634
 TGLViewer.cxx:635
 TGLViewer.cxx:636
 TGLViewer.cxx:637
 TGLViewer.cxx:638
 TGLViewer.cxx:639
 TGLViewer.cxx:640
 TGLViewer.cxx:641
 TGLViewer.cxx:642
 TGLViewer.cxx:643
 TGLViewer.cxx:644
 TGLViewer.cxx:645
 TGLViewer.cxx:646
 TGLViewer.cxx:647
 TGLViewer.cxx:648
 TGLViewer.cxx:649
 TGLViewer.cxx:650
 TGLViewer.cxx:651
 TGLViewer.cxx:652
 TGLViewer.cxx:653
 TGLViewer.cxx:654
 TGLViewer.cxx:655
 TGLViewer.cxx:656
 TGLViewer.cxx:657
 TGLViewer.cxx:658
 TGLViewer.cxx:659
 TGLViewer.cxx:660
 TGLViewer.cxx:661
 TGLViewer.cxx:662
 TGLViewer.cxx:663
 TGLViewer.cxx:664
 TGLViewer.cxx:665
 TGLViewer.cxx:666
 TGLViewer.cxx:667
 TGLViewer.cxx:668
 TGLViewer.cxx:669
 TGLViewer.cxx:670
 TGLViewer.cxx:671
 TGLViewer.cxx:672
 TGLViewer.cxx:673
 TGLViewer.cxx:674
 TGLViewer.cxx:675
 TGLViewer.cxx:676
 TGLViewer.cxx:677
 TGLViewer.cxx:678
 TGLViewer.cxx:679
 TGLViewer.cxx:680
 TGLViewer.cxx:681
 TGLViewer.cxx:682
 TGLViewer.cxx:683
 TGLViewer.cxx:684
 TGLViewer.cxx:685
 TGLViewer.cxx:686
 TGLViewer.cxx:687
 TGLViewer.cxx:688
 TGLViewer.cxx:689
 TGLViewer.cxx:690
 TGLViewer.cxx:691
 TGLViewer.cxx:692
 TGLViewer.cxx:693
 TGLViewer.cxx:694
 TGLViewer.cxx:695
 TGLViewer.cxx:696
 TGLViewer.cxx:697
 TGLViewer.cxx:698
 TGLViewer.cxx:699
 TGLViewer.cxx:700
 TGLViewer.cxx:701
 TGLViewer.cxx:702
 TGLViewer.cxx:703
 TGLViewer.cxx:704
 TGLViewer.cxx:705
 TGLViewer.cxx:706
 TGLViewer.cxx:707
 TGLViewer.cxx:708
 TGLViewer.cxx:709
 TGLViewer.cxx:710
 TGLViewer.cxx:711
 TGLViewer.cxx:712
 TGLViewer.cxx:713
 TGLViewer.cxx:714
 TGLViewer.cxx:715
 TGLViewer.cxx:716
 TGLViewer.cxx:717
 TGLViewer.cxx:718
 TGLViewer.cxx:719
 TGLViewer.cxx:720
 TGLViewer.cxx:721
 TGLViewer.cxx:722
 TGLViewer.cxx:723
 TGLViewer.cxx:724
 TGLViewer.cxx:725
 TGLViewer.cxx:726
 TGLViewer.cxx:727
 TGLViewer.cxx:728
 TGLViewer.cxx:729
 TGLViewer.cxx:730
 TGLViewer.cxx:731
 TGLViewer.cxx:732
 TGLViewer.cxx:733
 TGLViewer.cxx:734
 TGLViewer.cxx:735
 TGLViewer.cxx:736
 TGLViewer.cxx:737
 TGLViewer.cxx:738
 TGLViewer.cxx:739
 TGLViewer.cxx:740
 TGLViewer.cxx:741
 TGLViewer.cxx:742
 TGLViewer.cxx:743
 TGLViewer.cxx:744
 TGLViewer.cxx:745
 TGLViewer.cxx:746
 TGLViewer.cxx:747
 TGLViewer.cxx:748
 TGLViewer.cxx:749
 TGLViewer.cxx:750
 TGLViewer.cxx:751
 TGLViewer.cxx:752
 TGLViewer.cxx:753
 TGLViewer.cxx:754
 TGLViewer.cxx:755
 TGLViewer.cxx:756
 TGLViewer.cxx:757
 TGLViewer.cxx:758
 TGLViewer.cxx:759
 TGLViewer.cxx:760
 TGLViewer.cxx:761
 TGLViewer.cxx:762
 TGLViewer.cxx:763
 TGLViewer.cxx:764
 TGLViewer.cxx:765
 TGLViewer.cxx:766
 TGLViewer.cxx:767
 TGLViewer.cxx:768
 TGLViewer.cxx:769
 TGLViewer.cxx:770
 TGLViewer.cxx:771
 TGLViewer.cxx:772
 TGLViewer.cxx:773
 TGLViewer.cxx:774
 TGLViewer.cxx:775
 TGLViewer.cxx:776
 TGLViewer.cxx:777
 TGLViewer.cxx:778
 TGLViewer.cxx:779
 TGLViewer.cxx:780
 TGLViewer.cxx:781
 TGLViewer.cxx:782
 TGLViewer.cxx:783
 TGLViewer.cxx:784
 TGLViewer.cxx:785
 TGLViewer.cxx:786
 TGLViewer.cxx:787
 TGLViewer.cxx:788
 TGLViewer.cxx:789
 TGLViewer.cxx:790
 TGLViewer.cxx:791
 TGLViewer.cxx:792
 TGLViewer.cxx:793
 TGLViewer.cxx:794
 TGLViewer.cxx:795
 TGLViewer.cxx:796
 TGLViewer.cxx:797
 TGLViewer.cxx:798
 TGLViewer.cxx:799
 TGLViewer.cxx:800
 TGLViewer.cxx:801
 TGLViewer.cxx:802
 TGLViewer.cxx:803
 TGLViewer.cxx:804
 TGLViewer.cxx:805
 TGLViewer.cxx:806
 TGLViewer.cxx:807
 TGLViewer.cxx:808
 TGLViewer.cxx:809
 TGLViewer.cxx:810
 TGLViewer.cxx:811
 TGLViewer.cxx:812
 TGLViewer.cxx:813
 TGLViewer.cxx:814
 TGLViewer.cxx:815
 TGLViewer.cxx:816
 TGLViewer.cxx:817
 TGLViewer.cxx:818
 TGLViewer.cxx:819
 TGLViewer.cxx:820
 TGLViewer.cxx:821
 TGLViewer.cxx:822
 TGLViewer.cxx:823
 TGLViewer.cxx:824
 TGLViewer.cxx:825
 TGLViewer.cxx:826
 TGLViewer.cxx:827
 TGLViewer.cxx:828
 TGLViewer.cxx:829
 TGLViewer.cxx:830
 TGLViewer.cxx:831
 TGLViewer.cxx:832
 TGLViewer.cxx:833
 TGLViewer.cxx:834
 TGLViewer.cxx:835
 TGLViewer.cxx:836
 TGLViewer.cxx:837
 TGLViewer.cxx:838
 TGLViewer.cxx:839
 TGLViewer.cxx:840
 TGLViewer.cxx:841
 TGLViewer.cxx:842
 TGLViewer.cxx:843
 TGLViewer.cxx:844
 TGLViewer.cxx:845
 TGLViewer.cxx:846
 TGLViewer.cxx:847
 TGLViewer.cxx:848
 TGLViewer.cxx:849
 TGLViewer.cxx:850
 TGLViewer.cxx:851
 TGLViewer.cxx:852
 TGLViewer.cxx:853
 TGLViewer.cxx:854
 TGLViewer.cxx:855
 TGLViewer.cxx:856
 TGLViewer.cxx:857
 TGLViewer.cxx:858
 TGLViewer.cxx:859
 TGLViewer.cxx:860
 TGLViewer.cxx:861
 TGLViewer.cxx:862
 TGLViewer.cxx:863
 TGLViewer.cxx:864
 TGLViewer.cxx:865
 TGLViewer.cxx:866
 TGLViewer.cxx:867
 TGLViewer.cxx:868
 TGLViewer.cxx:869
 TGLViewer.cxx:870
 TGLViewer.cxx:871
 TGLViewer.cxx:872
 TGLViewer.cxx:873
 TGLViewer.cxx:874
 TGLViewer.cxx:875
 TGLViewer.cxx:876
 TGLViewer.cxx:877
 TGLViewer.cxx:878
 TGLViewer.cxx:879
 TGLViewer.cxx:880
 TGLViewer.cxx:881
 TGLViewer.cxx:882
 TGLViewer.cxx:883
 TGLViewer.cxx:884
 TGLViewer.cxx:885
 TGLViewer.cxx:886
 TGLViewer.cxx:887
 TGLViewer.cxx:888
 TGLViewer.cxx:889
 TGLViewer.cxx:890
 TGLViewer.cxx:891
 TGLViewer.cxx:892
 TGLViewer.cxx:893
 TGLViewer.cxx:894
 TGLViewer.cxx:895
 TGLViewer.cxx:896
 TGLViewer.cxx:897
 TGLViewer.cxx:898
 TGLViewer.cxx:899
 TGLViewer.cxx:900
 TGLViewer.cxx:901
 TGLViewer.cxx:902
 TGLViewer.cxx:903
 TGLViewer.cxx:904
 TGLViewer.cxx:905
 TGLViewer.cxx:906
 TGLViewer.cxx:907
 TGLViewer.cxx:908
 TGLViewer.cxx:909
 TGLViewer.cxx:910
 TGLViewer.cxx:911
 TGLViewer.cxx:912
 TGLViewer.cxx:913
 TGLViewer.cxx:914
 TGLViewer.cxx:915
 TGLViewer.cxx:916
 TGLViewer.cxx:917
 TGLViewer.cxx:918
 TGLViewer.cxx:919
 TGLViewer.cxx:920
 TGLViewer.cxx:921
 TGLViewer.cxx:922
 TGLViewer.cxx:923
 TGLViewer.cxx:924
 TGLViewer.cxx:925
 TGLViewer.cxx:926
 TGLViewer.cxx:927
 TGLViewer.cxx:928
 TGLViewer.cxx:929
 TGLViewer.cxx:930
 TGLViewer.cxx:931
 TGLViewer.cxx:932
 TGLViewer.cxx:933
 TGLViewer.cxx:934
 TGLViewer.cxx:935
 TGLViewer.cxx:936
 TGLViewer.cxx:937
 TGLViewer.cxx:938
 TGLViewer.cxx:939
 TGLViewer.cxx:940
 TGLViewer.cxx:941
 TGLViewer.cxx:942
 TGLViewer.cxx:943
 TGLViewer.cxx:944
 TGLViewer.cxx:945
 TGLViewer.cxx:946
 TGLViewer.cxx:947
 TGLViewer.cxx:948
 TGLViewer.cxx:949
 TGLViewer.cxx:950
 TGLViewer.cxx:951
 TGLViewer.cxx:952
 TGLViewer.cxx:953
 TGLViewer.cxx:954
 TGLViewer.cxx:955
 TGLViewer.cxx:956
 TGLViewer.cxx:957
 TGLViewer.cxx:958
 TGLViewer.cxx:959
 TGLViewer.cxx:960
 TGLViewer.cxx:961
 TGLViewer.cxx:962
 TGLViewer.cxx:963
 TGLViewer.cxx:964
 TGLViewer.cxx:965
 TGLViewer.cxx:966
 TGLViewer.cxx:967
 TGLViewer.cxx:968
 TGLViewer.cxx:969
 TGLViewer.cxx:970
 TGLViewer.cxx:971
 TGLViewer.cxx:972
 TGLViewer.cxx:973
 TGLViewer.cxx:974
 TGLViewer.cxx:975
 TGLViewer.cxx:976
 TGLViewer.cxx:977
 TGLViewer.cxx:978
 TGLViewer.cxx:979
 TGLViewer.cxx:980
 TGLViewer.cxx:981
 TGLViewer.cxx:982
 TGLViewer.cxx:983
 TGLViewer.cxx:984
 TGLViewer.cxx:985
 TGLViewer.cxx:986
 TGLViewer.cxx:987
 TGLViewer.cxx:988
 TGLViewer.cxx:989
 TGLViewer.cxx:990
 TGLViewer.cxx:991
 TGLViewer.cxx:992
 TGLViewer.cxx:993
 TGLViewer.cxx:994
 TGLViewer.cxx:995
 TGLViewer.cxx:996
 TGLViewer.cxx:997
 TGLViewer.cxx:998
 TGLViewer.cxx:999
 TGLViewer.cxx:1000
 TGLViewer.cxx:1001
 TGLViewer.cxx:1002
 TGLViewer.cxx:1003
 TGLViewer.cxx:1004
 TGLViewer.cxx:1005
 TGLViewer.cxx:1006
 TGLViewer.cxx:1007
 TGLViewer.cxx:1008
 TGLViewer.cxx:1009
 TGLViewer.cxx:1010
 TGLViewer.cxx:1011
 TGLViewer.cxx:1012
 TGLViewer.cxx:1013
 TGLViewer.cxx:1014
 TGLViewer.cxx:1015
 TGLViewer.cxx:1016
 TGLViewer.cxx:1017
 TGLViewer.cxx:1018
 TGLViewer.cxx:1019
 TGLViewer.cxx:1020
 TGLViewer.cxx:1021
 TGLViewer.cxx:1022
 TGLViewer.cxx:1023
 TGLViewer.cxx:1024
 TGLViewer.cxx:1025
 TGLViewer.cxx:1026
 TGLViewer.cxx:1027
 TGLViewer.cxx:1028
 TGLViewer.cxx:1029
 TGLViewer.cxx:1030
 TGLViewer.cxx:1031
 TGLViewer.cxx:1032
 TGLViewer.cxx:1033
 TGLViewer.cxx:1034
 TGLViewer.cxx:1035
 TGLViewer.cxx:1036
 TGLViewer.cxx:1037
 TGLViewer.cxx:1038
 TGLViewer.cxx:1039
 TGLViewer.cxx:1040
 TGLViewer.cxx:1041
 TGLViewer.cxx:1042
 TGLViewer.cxx:1043
 TGLViewer.cxx:1044
 TGLViewer.cxx:1045
 TGLViewer.cxx:1046
 TGLViewer.cxx:1047
 TGLViewer.cxx:1048
 TGLViewer.cxx:1049
 TGLViewer.cxx:1050
 TGLViewer.cxx:1051
 TGLViewer.cxx:1052
 TGLViewer.cxx:1053
 TGLViewer.cxx:1054
 TGLViewer.cxx:1055
 TGLViewer.cxx:1056
 TGLViewer.cxx:1057
 TGLViewer.cxx:1058
 TGLViewer.cxx:1059
 TGLViewer.cxx:1060
 TGLViewer.cxx:1061
 TGLViewer.cxx:1062
 TGLViewer.cxx:1063
 TGLViewer.cxx:1064
 TGLViewer.cxx:1065
 TGLViewer.cxx:1066
 TGLViewer.cxx:1067
 TGLViewer.cxx:1068
 TGLViewer.cxx:1069
 TGLViewer.cxx:1070
 TGLViewer.cxx:1071
 TGLViewer.cxx:1072
 TGLViewer.cxx:1073
 TGLViewer.cxx:1074
 TGLViewer.cxx:1075
 TGLViewer.cxx:1076
 TGLViewer.cxx:1077
 TGLViewer.cxx:1078
 TGLViewer.cxx:1079
 TGLViewer.cxx:1080
 TGLViewer.cxx:1081
 TGLViewer.cxx:1082
 TGLViewer.cxx:1083
 TGLViewer.cxx:1084
 TGLViewer.cxx:1085
 TGLViewer.cxx:1086
 TGLViewer.cxx:1087
 TGLViewer.cxx:1088
 TGLViewer.cxx:1089
 TGLViewer.cxx:1090
 TGLViewer.cxx:1091
 TGLViewer.cxx:1092
 TGLViewer.cxx:1093
 TGLViewer.cxx:1094
 TGLViewer.cxx:1095
 TGLViewer.cxx:1096
 TGLViewer.cxx:1097
 TGLViewer.cxx:1098
 TGLViewer.cxx:1099
 TGLViewer.cxx:1100
 TGLViewer.cxx:1101
 TGLViewer.cxx:1102
 TGLViewer.cxx:1103
 TGLViewer.cxx:1104
 TGLViewer.cxx:1105
 TGLViewer.cxx:1106
 TGLViewer.cxx:1107
 TGLViewer.cxx:1108
 TGLViewer.cxx:1109
 TGLViewer.cxx:1110
 TGLViewer.cxx:1111
 TGLViewer.cxx:1112
 TGLViewer.cxx:1113
 TGLViewer.cxx:1114
 TGLViewer.cxx:1115
 TGLViewer.cxx:1116
 TGLViewer.cxx:1117
 TGLViewer.cxx:1118
 TGLViewer.cxx:1119
 TGLViewer.cxx:1120
 TGLViewer.cxx:1121
 TGLViewer.cxx:1122
 TGLViewer.cxx:1123
 TGLViewer.cxx:1124
 TGLViewer.cxx:1125
 TGLViewer.cxx:1126
 TGLViewer.cxx:1127
 TGLViewer.cxx:1128
 TGLViewer.cxx:1129
 TGLViewer.cxx:1130
 TGLViewer.cxx:1131
 TGLViewer.cxx:1132
 TGLViewer.cxx:1133
 TGLViewer.cxx:1134
 TGLViewer.cxx:1135
 TGLViewer.cxx:1136
 TGLViewer.cxx:1137
 TGLViewer.cxx:1138
 TGLViewer.cxx:1139
 TGLViewer.cxx:1140
 TGLViewer.cxx:1141
 TGLViewer.cxx:1142
 TGLViewer.cxx:1143
 TGLViewer.cxx:1144
 TGLViewer.cxx:1145
 TGLViewer.cxx:1146
 TGLViewer.cxx:1147
 TGLViewer.cxx:1148
 TGLViewer.cxx:1149
 TGLViewer.cxx:1150
 TGLViewer.cxx:1151
 TGLViewer.cxx:1152
 TGLViewer.cxx:1153
 TGLViewer.cxx:1154
 TGLViewer.cxx:1155
 TGLViewer.cxx:1156
 TGLViewer.cxx:1157
 TGLViewer.cxx:1158
 TGLViewer.cxx:1159
 TGLViewer.cxx:1160
 TGLViewer.cxx:1161
 TGLViewer.cxx:1162
 TGLViewer.cxx:1163
 TGLViewer.cxx:1164
 TGLViewer.cxx:1165
 TGLViewer.cxx:1166
 TGLViewer.cxx:1167
 TGLViewer.cxx:1168
 TGLViewer.cxx:1169
 TGLViewer.cxx:1170
 TGLViewer.cxx:1171
 TGLViewer.cxx:1172
 TGLViewer.cxx:1173
 TGLViewer.cxx:1174
 TGLViewer.cxx:1175
 TGLViewer.cxx:1176
 TGLViewer.cxx:1177
 TGLViewer.cxx:1178
 TGLViewer.cxx:1179
 TGLViewer.cxx:1180
 TGLViewer.cxx:1181
 TGLViewer.cxx:1182
 TGLViewer.cxx:1183
 TGLViewer.cxx:1184
 TGLViewer.cxx:1185
 TGLViewer.cxx:1186
 TGLViewer.cxx:1187
 TGLViewer.cxx:1188
 TGLViewer.cxx:1189
 TGLViewer.cxx:1190
 TGLViewer.cxx:1191
 TGLViewer.cxx:1192
 TGLViewer.cxx:1193
 TGLViewer.cxx:1194
 TGLViewer.cxx:1195
 TGLViewer.cxx:1196
 TGLViewer.cxx:1197
 TGLViewer.cxx:1198
 TGLViewer.cxx:1199
 TGLViewer.cxx:1200
 TGLViewer.cxx:1201
 TGLViewer.cxx:1202
 TGLViewer.cxx:1203
 TGLViewer.cxx:1204
 TGLViewer.cxx:1205
 TGLViewer.cxx:1206
 TGLViewer.cxx:1207
 TGLViewer.cxx:1208
 TGLViewer.cxx:1209
 TGLViewer.cxx:1210
 TGLViewer.cxx:1211
 TGLViewer.cxx:1212
 TGLViewer.cxx:1213
 TGLViewer.cxx:1214
 TGLViewer.cxx:1215
 TGLViewer.cxx:1216
 TGLViewer.cxx:1217
 TGLViewer.cxx:1218
 TGLViewer.cxx:1219
 TGLViewer.cxx:1220
 TGLViewer.cxx:1221
 TGLViewer.cxx:1222
 TGLViewer.cxx:1223
 TGLViewer.cxx:1224
 TGLViewer.cxx:1225
 TGLViewer.cxx:1226
 TGLViewer.cxx:1227
 TGLViewer.cxx:1228
 TGLViewer.cxx:1229
 TGLViewer.cxx:1230
 TGLViewer.cxx:1231
 TGLViewer.cxx:1232
 TGLViewer.cxx:1233
 TGLViewer.cxx:1234
 TGLViewer.cxx:1235
 TGLViewer.cxx:1236
 TGLViewer.cxx:1237
 TGLViewer.cxx:1238
 TGLViewer.cxx:1239
 TGLViewer.cxx:1240
 TGLViewer.cxx:1241
 TGLViewer.cxx:1242
 TGLViewer.cxx:1243
 TGLViewer.cxx:1244
 TGLViewer.cxx:1245
 TGLViewer.cxx:1246
 TGLViewer.cxx:1247
 TGLViewer.cxx:1248
 TGLViewer.cxx:1249
 TGLViewer.cxx:1250
 TGLViewer.cxx:1251
 TGLViewer.cxx:1252
 TGLViewer.cxx:1253
 TGLViewer.cxx:1254
 TGLViewer.cxx:1255
 TGLViewer.cxx:1256
 TGLViewer.cxx:1257
 TGLViewer.cxx:1258
 TGLViewer.cxx:1259
 TGLViewer.cxx:1260
 TGLViewer.cxx:1261
 TGLViewer.cxx:1262
 TGLViewer.cxx:1263
 TGLViewer.cxx:1264
 TGLViewer.cxx:1265
 TGLViewer.cxx:1266
 TGLViewer.cxx:1267
 TGLViewer.cxx:1268
 TGLViewer.cxx:1269
 TGLViewer.cxx:1270
 TGLViewer.cxx:1271
 TGLViewer.cxx:1272
 TGLViewer.cxx:1273
 TGLViewer.cxx:1274
 TGLViewer.cxx:1275
 TGLViewer.cxx:1276
 TGLViewer.cxx:1277
 TGLViewer.cxx:1278
 TGLViewer.cxx:1279
 TGLViewer.cxx:1280
 TGLViewer.cxx:1281
 TGLViewer.cxx:1282
 TGLViewer.cxx:1283
 TGLViewer.cxx:1284
 TGLViewer.cxx:1285
 TGLViewer.cxx:1286
 TGLViewer.cxx:1287
 TGLViewer.cxx:1288
 TGLViewer.cxx:1289
 TGLViewer.cxx:1290
 TGLViewer.cxx:1291
 TGLViewer.cxx:1292
 TGLViewer.cxx:1293
 TGLViewer.cxx:1294
 TGLViewer.cxx:1295
 TGLViewer.cxx:1296
 TGLViewer.cxx:1297
 TGLViewer.cxx:1298
 TGLViewer.cxx:1299
 TGLViewer.cxx:1300
 TGLViewer.cxx:1301
 TGLViewer.cxx:1302
 TGLViewer.cxx:1303
 TGLViewer.cxx:1304
 TGLViewer.cxx:1305
 TGLViewer.cxx:1306
 TGLViewer.cxx:1307
 TGLViewer.cxx:1308
 TGLViewer.cxx:1309
 TGLViewer.cxx:1310
 TGLViewer.cxx:1311
 TGLViewer.cxx:1312
 TGLViewer.cxx:1313
 TGLViewer.cxx:1314
 TGLViewer.cxx:1315
 TGLViewer.cxx:1316
 TGLViewer.cxx:1317
 TGLViewer.cxx:1318
 TGLViewer.cxx:1319
 TGLViewer.cxx:1320
 TGLViewer.cxx:1321
 TGLViewer.cxx:1322
 TGLViewer.cxx:1323
 TGLViewer.cxx:1324
 TGLViewer.cxx:1325
 TGLViewer.cxx:1326
 TGLViewer.cxx:1327
 TGLViewer.cxx:1328
 TGLViewer.cxx:1329
 TGLViewer.cxx:1330
 TGLViewer.cxx:1331
 TGLViewer.cxx:1332
 TGLViewer.cxx:1333
 TGLViewer.cxx:1334
 TGLViewer.cxx:1335
 TGLViewer.cxx:1336
 TGLViewer.cxx:1337
 TGLViewer.cxx:1338
 TGLViewer.cxx:1339
 TGLViewer.cxx:1340
 TGLViewer.cxx:1341
 TGLViewer.cxx:1342
 TGLViewer.cxx:1343
 TGLViewer.cxx:1344
 TGLViewer.cxx:1345
 TGLViewer.cxx:1346
 TGLViewer.cxx:1347
 TGLViewer.cxx:1348
 TGLViewer.cxx:1349
 TGLViewer.cxx:1350
 TGLViewer.cxx:1351
 TGLViewer.cxx:1352
 TGLViewer.cxx:1353
 TGLViewer.cxx:1354
 TGLViewer.cxx:1355
 TGLViewer.cxx:1356
 TGLViewer.cxx:1357
 TGLViewer.cxx:1358
 TGLViewer.cxx:1359
 TGLViewer.cxx:1360
 TGLViewer.cxx:1361
 TGLViewer.cxx:1362
 TGLViewer.cxx:1363
 TGLViewer.cxx:1364
 TGLViewer.cxx:1365
 TGLViewer.cxx:1366
 TGLViewer.cxx:1367
 TGLViewer.cxx:1368
 TGLViewer.cxx:1369
 TGLViewer.cxx:1370
 TGLViewer.cxx:1371
 TGLViewer.cxx:1372
 TGLViewer.cxx:1373
 TGLViewer.cxx:1374
 TGLViewer.cxx:1375
 TGLViewer.cxx:1376
 TGLViewer.cxx:1377
 TGLViewer.cxx:1378
 TGLViewer.cxx:1379
 TGLViewer.cxx:1380
 TGLViewer.cxx:1381
 TGLViewer.cxx:1382
 TGLViewer.cxx:1383
 TGLViewer.cxx:1384
 TGLViewer.cxx:1385
 TGLViewer.cxx:1386
 TGLViewer.cxx:1387
 TGLViewer.cxx:1388
 TGLViewer.cxx:1389
 TGLViewer.cxx:1390
 TGLViewer.cxx:1391
 TGLViewer.cxx:1392
 TGLViewer.cxx:1393
 TGLViewer.cxx:1394
 TGLViewer.cxx:1395
 TGLViewer.cxx:1396
 TGLViewer.cxx:1397
 TGLViewer.cxx:1398
 TGLViewer.cxx:1399
 TGLViewer.cxx:1400
 TGLViewer.cxx:1401
 TGLViewer.cxx:1402
 TGLViewer.cxx:1403
 TGLViewer.cxx:1404
 TGLViewer.cxx:1405
 TGLViewer.cxx:1406
 TGLViewer.cxx:1407
 TGLViewer.cxx:1408
 TGLViewer.cxx:1409
 TGLViewer.cxx:1410
 TGLViewer.cxx:1411
 TGLViewer.cxx:1412
 TGLViewer.cxx:1413
 TGLViewer.cxx:1414
 TGLViewer.cxx:1415
 TGLViewer.cxx:1416
 TGLViewer.cxx:1417
 TGLViewer.cxx:1418
 TGLViewer.cxx:1419
 TGLViewer.cxx:1420
 TGLViewer.cxx:1421
 TGLViewer.cxx:1422
 TGLViewer.cxx:1423
 TGLViewer.cxx:1424
 TGLViewer.cxx:1425
 TGLViewer.cxx:1426
 TGLViewer.cxx:1427
 TGLViewer.cxx:1428
 TGLViewer.cxx:1429
 TGLViewer.cxx:1430
 TGLViewer.cxx:1431
 TGLViewer.cxx:1432
 TGLViewer.cxx:1433
 TGLViewer.cxx:1434
 TGLViewer.cxx:1435
 TGLViewer.cxx:1436
 TGLViewer.cxx:1437
 TGLViewer.cxx:1438
 TGLViewer.cxx:1439
 TGLViewer.cxx:1440
 TGLViewer.cxx:1441
 TGLViewer.cxx:1442
 TGLViewer.cxx:1443
 TGLViewer.cxx:1444
 TGLViewer.cxx:1445
 TGLViewer.cxx:1446
 TGLViewer.cxx:1447
 TGLViewer.cxx:1448
 TGLViewer.cxx:1449
 TGLViewer.cxx:1450
 TGLViewer.cxx:1451
 TGLViewer.cxx:1452
 TGLViewer.cxx:1453
 TGLViewer.cxx:1454
 TGLViewer.cxx:1455
 TGLViewer.cxx:1456
 TGLViewer.cxx:1457
 TGLViewer.cxx:1458
 TGLViewer.cxx:1459
 TGLViewer.cxx:1460
 TGLViewer.cxx:1461
 TGLViewer.cxx:1462
 TGLViewer.cxx:1463
 TGLViewer.cxx:1464
 TGLViewer.cxx:1465
 TGLViewer.cxx:1466
 TGLViewer.cxx:1467
 TGLViewer.cxx:1468
 TGLViewer.cxx:1469
 TGLViewer.cxx:1470
 TGLViewer.cxx:1471
 TGLViewer.cxx:1472
 TGLViewer.cxx:1473
 TGLViewer.cxx:1474
 TGLViewer.cxx:1475
 TGLViewer.cxx:1476
 TGLViewer.cxx:1477
 TGLViewer.cxx:1478
 TGLViewer.cxx:1479
 TGLViewer.cxx:1480
 TGLViewer.cxx:1481
 TGLViewer.cxx:1482
 TGLViewer.cxx:1483
 TGLViewer.cxx:1484
 TGLViewer.cxx:1485
 TGLViewer.cxx:1486
 TGLViewer.cxx:1487
 TGLViewer.cxx:1488
 TGLViewer.cxx:1489
 TGLViewer.cxx:1490
 TGLViewer.cxx:1491
 TGLViewer.cxx:1492
 TGLViewer.cxx:1493
 TGLViewer.cxx:1494
 TGLViewer.cxx:1495
 TGLViewer.cxx:1496
 TGLViewer.cxx:1497
 TGLViewer.cxx:1498
 TGLViewer.cxx:1499
 TGLViewer.cxx:1500
 TGLViewer.cxx:1501
 TGLViewer.cxx:1502
 TGLViewer.cxx:1503
 TGLViewer.cxx:1504
 TGLViewer.cxx:1505
 TGLViewer.cxx:1506
 TGLViewer.cxx:1507
 TGLViewer.cxx:1508
 TGLViewer.cxx:1509
 TGLViewer.cxx:1510
 TGLViewer.cxx:1511
 TGLViewer.cxx:1512
 TGLViewer.cxx:1513
 TGLViewer.cxx:1514
 TGLViewer.cxx:1515
 TGLViewer.cxx:1516
 TGLViewer.cxx:1517
 TGLViewer.cxx:1518
 TGLViewer.cxx:1519
 TGLViewer.cxx:1520
 TGLViewer.cxx:1521
 TGLViewer.cxx:1522
 TGLViewer.cxx:1523
 TGLViewer.cxx:1524
 TGLViewer.cxx:1525
 TGLViewer.cxx:1526
 TGLViewer.cxx:1527
 TGLViewer.cxx:1528
 TGLViewer.cxx:1529
 TGLViewer.cxx:1530
 TGLViewer.cxx:1531
 TGLViewer.cxx:1532
 TGLViewer.cxx:1533
 TGLViewer.cxx:1534
 TGLViewer.cxx:1535
 TGLViewer.cxx:1536
 TGLViewer.cxx:1537
 TGLViewer.cxx:1538
 TGLViewer.cxx:1539
 TGLViewer.cxx:1540
 TGLViewer.cxx:1541
 TGLViewer.cxx:1542
 TGLViewer.cxx:1543
 TGLViewer.cxx:1544
 TGLViewer.cxx:1545
 TGLViewer.cxx:1546
 TGLViewer.cxx:1547
 TGLViewer.cxx:1548
 TGLViewer.cxx:1549
 TGLViewer.cxx:1550
 TGLViewer.cxx:1551
 TGLViewer.cxx:1552
 TGLViewer.cxx:1553
 TGLViewer.cxx:1554
 TGLViewer.cxx:1555
 TGLViewer.cxx:1556
 TGLViewer.cxx:1557
 TGLViewer.cxx:1558
 TGLViewer.cxx:1559
 TGLViewer.cxx:1560
 TGLViewer.cxx:1561
 TGLViewer.cxx:1562
 TGLViewer.cxx:1563
 TGLViewer.cxx:1564
 TGLViewer.cxx:1565
 TGLViewer.cxx:1566
 TGLViewer.cxx:1567
 TGLViewer.cxx:1568
 TGLViewer.cxx:1569
 TGLViewer.cxx:1570
 TGLViewer.cxx:1571
 TGLViewer.cxx:1572
 TGLViewer.cxx:1573
 TGLViewer.cxx:1574
 TGLViewer.cxx:1575
 TGLViewer.cxx:1576
 TGLViewer.cxx:1577
 TGLViewer.cxx:1578
 TGLViewer.cxx:1579
 TGLViewer.cxx:1580
 TGLViewer.cxx:1581
 TGLViewer.cxx:1582
 TGLViewer.cxx:1583
 TGLViewer.cxx:1584
 TGLViewer.cxx:1585
 TGLViewer.cxx:1586
 TGLViewer.cxx:1587
 TGLViewer.cxx:1588
 TGLViewer.cxx:1589
 TGLViewer.cxx:1590
 TGLViewer.cxx:1591
 TGLViewer.cxx:1592
 TGLViewer.cxx:1593
 TGLViewer.cxx:1594
 TGLViewer.cxx:1595
 TGLViewer.cxx:1596
 TGLViewer.cxx:1597
 TGLViewer.cxx:1598
 TGLViewer.cxx:1599
 TGLViewer.cxx:1600
 TGLViewer.cxx:1601
 TGLViewer.cxx:1602
 TGLViewer.cxx:1603
 TGLViewer.cxx:1604
 TGLViewer.cxx:1605
 TGLViewer.cxx:1606
 TGLViewer.cxx:1607
 TGLViewer.cxx:1608
 TGLViewer.cxx:1609
 TGLViewer.cxx:1610
 TGLViewer.cxx:1611
 TGLViewer.cxx:1612
 TGLViewer.cxx:1613
 TGLViewer.cxx:1614
 TGLViewer.cxx:1615
 TGLViewer.cxx:1616
 TGLViewer.cxx:1617
 TGLViewer.cxx:1618
 TGLViewer.cxx:1619
 TGLViewer.cxx:1620
 TGLViewer.cxx:1621
 TGLViewer.cxx:1622
 TGLViewer.cxx:1623
 TGLViewer.cxx:1624
 TGLViewer.cxx:1625
 TGLViewer.cxx:1626
 TGLViewer.cxx:1627
 TGLViewer.cxx:1628
 TGLViewer.cxx:1629
 TGLViewer.cxx:1630
 TGLViewer.cxx:1631
 TGLViewer.cxx:1632
 TGLViewer.cxx:1633
 TGLViewer.cxx:1634
 TGLViewer.cxx:1635
 TGLViewer.cxx:1636
 TGLViewer.cxx:1637
 TGLViewer.cxx:1638
 TGLViewer.cxx:1639
 TGLViewer.cxx:1640
 TGLViewer.cxx:1641
 TGLViewer.cxx:1642
 TGLViewer.cxx:1643
 TGLViewer.cxx:1644
 TGLViewer.cxx:1645
 TGLViewer.cxx:1646
 TGLViewer.cxx:1647
 TGLViewer.cxx:1648
 TGLViewer.cxx:1649
 TGLViewer.cxx:1650
 TGLViewer.cxx:1651
 TGLViewer.cxx:1652
 TGLViewer.cxx:1653
 TGLViewer.cxx:1654
 TGLViewer.cxx:1655
 TGLViewer.cxx:1656
 TGLViewer.cxx:1657
 TGLViewer.cxx:1658
 TGLViewer.cxx:1659
 TGLViewer.cxx:1660
 TGLViewer.cxx:1661
 TGLViewer.cxx:1662
 TGLViewer.cxx:1663
 TGLViewer.cxx:1664
 TGLViewer.cxx:1665
 TGLViewer.cxx:1666
 TGLViewer.cxx:1667
 TGLViewer.cxx:1668
 TGLViewer.cxx:1669
 TGLViewer.cxx:1670
 TGLViewer.cxx:1671
 TGLViewer.cxx:1672
 TGLViewer.cxx:1673
 TGLViewer.cxx:1674
 TGLViewer.cxx:1675
 TGLViewer.cxx:1676
 TGLViewer.cxx:1677
 TGLViewer.cxx:1678
 TGLViewer.cxx:1679
 TGLViewer.cxx:1680
 TGLViewer.cxx:1681
 TGLViewer.cxx:1682
 TGLViewer.cxx:1683
 TGLViewer.cxx:1684
 TGLViewer.cxx:1685
 TGLViewer.cxx:1686
 TGLViewer.cxx:1687
 TGLViewer.cxx:1688
 TGLViewer.cxx:1689
 TGLViewer.cxx:1690
 TGLViewer.cxx:1691
 TGLViewer.cxx:1692
 TGLViewer.cxx:1693
 TGLViewer.cxx:1694
 TGLViewer.cxx:1695
 TGLViewer.cxx:1696
 TGLViewer.cxx:1697
 TGLViewer.cxx:1698
 TGLViewer.cxx:1699
 TGLViewer.cxx:1700
 TGLViewer.cxx:1701
 TGLViewer.cxx:1702
 TGLViewer.cxx:1703
 TGLViewer.cxx:1704
 TGLViewer.cxx:1705
 TGLViewer.cxx:1706
 TGLViewer.cxx:1707
 TGLViewer.cxx:1708
 TGLViewer.cxx:1709
 TGLViewer.cxx:1710
 TGLViewer.cxx:1711
 TGLViewer.cxx:1712
 TGLViewer.cxx:1713
 TGLViewer.cxx:1714
 TGLViewer.cxx:1715
 TGLViewer.cxx:1716
 TGLViewer.cxx:1717
 TGLViewer.cxx:1718
 TGLViewer.cxx:1719
 TGLViewer.cxx:1720
 TGLViewer.cxx:1721
 TGLViewer.cxx:1722
 TGLViewer.cxx:1723
 TGLViewer.cxx:1724
 TGLViewer.cxx:1725
 TGLViewer.cxx:1726
 TGLViewer.cxx:1727
 TGLViewer.cxx:1728
 TGLViewer.cxx:1729
 TGLViewer.cxx:1730
 TGLViewer.cxx:1731
 TGLViewer.cxx:1732
 TGLViewer.cxx:1733
 TGLViewer.cxx:1734
 TGLViewer.cxx:1735
 TGLViewer.cxx:1736
 TGLViewer.cxx:1737
 TGLViewer.cxx:1738
 TGLViewer.cxx:1739
 TGLViewer.cxx:1740
 TGLViewer.cxx:1741
 TGLViewer.cxx:1742
 TGLViewer.cxx:1743
 TGLViewer.cxx:1744
 TGLViewer.cxx:1745
 TGLViewer.cxx:1746
 TGLViewer.cxx:1747
 TGLViewer.cxx:1748
 TGLViewer.cxx:1749
 TGLViewer.cxx:1750
 TGLViewer.cxx:1751
 TGLViewer.cxx:1752
 TGLViewer.cxx:1753
 TGLViewer.cxx:1754
 TGLViewer.cxx:1755
 TGLViewer.cxx:1756
 TGLViewer.cxx:1757
 TGLViewer.cxx:1758
 TGLViewer.cxx:1759
 TGLViewer.cxx:1760
 TGLViewer.cxx:1761
 TGLViewer.cxx:1762
 TGLViewer.cxx:1763
 TGLViewer.cxx:1764
 TGLViewer.cxx:1765
 TGLViewer.cxx:1766
 TGLViewer.cxx:1767
 TGLViewer.cxx:1768
 TGLViewer.cxx:1769
 TGLViewer.cxx:1770
 TGLViewer.cxx:1771
 TGLViewer.cxx:1772
 TGLViewer.cxx:1773
 TGLViewer.cxx:1774
 TGLViewer.cxx:1775
 TGLViewer.cxx:1776
 TGLViewer.cxx:1777
 TGLViewer.cxx:1778
 TGLViewer.cxx:1779
 TGLViewer.cxx:1780
 TGLViewer.cxx:1781
 TGLViewer.cxx:1782
 TGLViewer.cxx:1783
 TGLViewer.cxx:1784
 TGLViewer.cxx:1785
 TGLViewer.cxx:1786
 TGLViewer.cxx:1787
 TGLViewer.cxx:1788
 TGLViewer.cxx:1789
 TGLViewer.cxx:1790
 TGLViewer.cxx:1791
 TGLViewer.cxx:1792
 TGLViewer.cxx:1793
 TGLViewer.cxx:1794
 TGLViewer.cxx:1795
 TGLViewer.cxx:1796
 TGLViewer.cxx:1797
 TGLViewer.cxx:1798
 TGLViewer.cxx:1799
 TGLViewer.cxx:1800
 TGLViewer.cxx:1801
 TGLViewer.cxx:1802
 TGLViewer.cxx:1803
 TGLViewer.cxx:1804
 TGLViewer.cxx:1805
 TGLViewer.cxx:1806
 TGLViewer.cxx:1807
 TGLViewer.cxx:1808
 TGLViewer.cxx:1809
 TGLViewer.cxx:1810
 TGLViewer.cxx:1811
 TGLViewer.cxx:1812
 TGLViewer.cxx:1813
 TGLViewer.cxx:1814
 TGLViewer.cxx:1815
 TGLViewer.cxx:1816
 TGLViewer.cxx:1817
 TGLViewer.cxx:1818
 TGLViewer.cxx:1819
 TGLViewer.cxx:1820
 TGLViewer.cxx:1821
 TGLViewer.cxx:1822
 TGLViewer.cxx:1823
 TGLViewer.cxx:1824
 TGLViewer.cxx:1825
 TGLViewer.cxx:1826
 TGLViewer.cxx:1827
 TGLViewer.cxx:1828
 TGLViewer.cxx:1829
 TGLViewer.cxx:1830
 TGLViewer.cxx:1831
 TGLViewer.cxx:1832
 TGLViewer.cxx:1833
 TGLViewer.cxx:1834
 TGLViewer.cxx:1835
 TGLViewer.cxx:1836
 TGLViewer.cxx:1837
 TGLViewer.cxx:1838
 TGLViewer.cxx:1839
 TGLViewer.cxx:1840
 TGLViewer.cxx:1841
 TGLViewer.cxx:1842
 TGLViewer.cxx:1843
 TGLViewer.cxx:1844
 TGLViewer.cxx:1845
 TGLViewer.cxx:1846
 TGLViewer.cxx:1847
 TGLViewer.cxx:1848
 TGLViewer.cxx:1849
 TGLViewer.cxx:1850
 TGLViewer.cxx:1851
 TGLViewer.cxx:1852
 TGLViewer.cxx:1853
 TGLViewer.cxx:1854
 TGLViewer.cxx:1855
 TGLViewer.cxx:1856
 TGLViewer.cxx:1857
 TGLViewer.cxx:1858
 TGLViewer.cxx:1859
 TGLViewer.cxx:1860
 TGLViewer.cxx:1861
 TGLViewer.cxx:1862
 TGLViewer.cxx:1863
 TGLViewer.cxx:1864
 TGLViewer.cxx:1865
 TGLViewer.cxx:1866
 TGLViewer.cxx:1867
 TGLViewer.cxx:1868
 TGLViewer.cxx:1869
 TGLViewer.cxx:1870
 TGLViewer.cxx:1871
 TGLViewer.cxx:1872
 TGLViewer.cxx:1873
 TGLViewer.cxx:1874
 TGLViewer.cxx:1875
 TGLViewer.cxx:1876
 TGLViewer.cxx:1877
 TGLViewer.cxx:1878
 TGLViewer.cxx:1879
 TGLViewer.cxx:1880
 TGLViewer.cxx:1881
 TGLViewer.cxx:1882
 TGLViewer.cxx:1883
 TGLViewer.cxx:1884
 TGLViewer.cxx:1885
 TGLViewer.cxx:1886
 TGLViewer.cxx:1887
 TGLViewer.cxx:1888
 TGLViewer.cxx:1889
 TGLViewer.cxx:1890
 TGLViewer.cxx:1891
 TGLViewer.cxx:1892
 TGLViewer.cxx:1893
 TGLViewer.cxx:1894
 TGLViewer.cxx:1895
 TGLViewer.cxx:1896
 TGLViewer.cxx:1897
 TGLViewer.cxx:1898
 TGLViewer.cxx:1899
 TGLViewer.cxx:1900
 TGLViewer.cxx:1901
 TGLViewer.cxx:1902
 TGLViewer.cxx:1903
 TGLViewer.cxx:1904
 TGLViewer.cxx:1905
 TGLViewer.cxx:1906
 TGLViewer.cxx:1907
 TGLViewer.cxx:1908
 TGLViewer.cxx:1909
 TGLViewer.cxx:1910
 TGLViewer.cxx:1911
 TGLViewer.cxx:1912
 TGLViewer.cxx:1913
 TGLViewer.cxx:1914
 TGLViewer.cxx:1915
 TGLViewer.cxx:1916
 TGLViewer.cxx:1917
 TGLViewer.cxx:1918
 TGLViewer.cxx:1919
 TGLViewer.cxx:1920
 TGLViewer.cxx:1921
 TGLViewer.cxx:1922
 TGLViewer.cxx:1923
 TGLViewer.cxx:1924
 TGLViewer.cxx:1925
 TGLViewer.cxx:1926
 TGLViewer.cxx:1927
 TGLViewer.cxx:1928
 TGLViewer.cxx:1929
 TGLViewer.cxx:1930
 TGLViewer.cxx:1931
 TGLViewer.cxx:1932
 TGLViewer.cxx:1933
 TGLViewer.cxx:1934
 TGLViewer.cxx:1935
 TGLViewer.cxx:1936
 TGLViewer.cxx:1937
 TGLViewer.cxx:1938
 TGLViewer.cxx:1939
 TGLViewer.cxx:1940
 TGLViewer.cxx:1941
 TGLViewer.cxx:1942
 TGLViewer.cxx:1943
 TGLViewer.cxx:1944
 TGLViewer.cxx:1945
 TGLViewer.cxx:1946
 TGLViewer.cxx:1947
 TGLViewer.cxx:1948
 TGLViewer.cxx:1949
 TGLViewer.cxx:1950
 TGLViewer.cxx:1951
 TGLViewer.cxx:1952
 TGLViewer.cxx:1953
 TGLViewer.cxx:1954
 TGLViewer.cxx:1955
 TGLViewer.cxx:1956
 TGLViewer.cxx:1957
 TGLViewer.cxx:1958
 TGLViewer.cxx:1959
 TGLViewer.cxx:1960
 TGLViewer.cxx:1961
 TGLViewer.cxx:1962
 TGLViewer.cxx:1963
 TGLViewer.cxx:1964
 TGLViewer.cxx:1965
 TGLViewer.cxx:1966
 TGLViewer.cxx:1967
 TGLViewer.cxx:1968
 TGLViewer.cxx:1969
 TGLViewer.cxx:1970
 TGLViewer.cxx:1971
 TGLViewer.cxx:1972
 TGLViewer.cxx:1973
 TGLViewer.cxx:1974
 TGLViewer.cxx:1975
 TGLViewer.cxx:1976
 TGLViewer.cxx:1977
 TGLViewer.cxx:1978
 TGLViewer.cxx:1979
 TGLViewer.cxx:1980
 TGLViewer.cxx:1981
 TGLViewer.cxx:1982
 TGLViewer.cxx:1983
 TGLViewer.cxx:1984
 TGLViewer.cxx:1985
 TGLViewer.cxx:1986
 TGLViewer.cxx:1987
 TGLViewer.cxx:1988
 TGLViewer.cxx:1989
 TGLViewer.cxx:1990
 TGLViewer.cxx:1991
 TGLViewer.cxx:1992
 TGLViewer.cxx:1993
 TGLViewer.cxx:1994
 TGLViewer.cxx:1995
 TGLViewer.cxx:1996
 TGLViewer.cxx:1997
 TGLViewer.cxx:1998
 TGLViewer.cxx:1999
 TGLViewer.cxx:2000
 TGLViewer.cxx:2001
 TGLViewer.cxx:2002
 TGLViewer.cxx:2003
 TGLViewer.cxx:2004
 TGLViewer.cxx:2005
 TGLViewer.cxx:2006
 TGLViewer.cxx:2007
 TGLViewer.cxx:2008
 TGLViewer.cxx:2009
 TGLViewer.cxx:2010
 TGLViewer.cxx:2011
 TGLViewer.cxx:2012
 TGLViewer.cxx:2013
 TGLViewer.cxx:2014
 TGLViewer.cxx:2015
 TGLViewer.cxx:2016
 TGLViewer.cxx:2017
 TGLViewer.cxx:2018
 TGLViewer.cxx:2019
 TGLViewer.cxx:2020
 TGLViewer.cxx:2021
 TGLViewer.cxx:2022
 TGLViewer.cxx:2023
 TGLViewer.cxx:2024
 TGLViewer.cxx:2025
 TGLViewer.cxx:2026
 TGLViewer.cxx:2027
 TGLViewer.cxx:2028
 TGLViewer.cxx:2029
 TGLViewer.cxx:2030
 TGLViewer.cxx:2031
 TGLViewer.cxx:2032
 TGLViewer.cxx:2033
 TGLViewer.cxx:2034
 TGLViewer.cxx:2035
 TGLViewer.cxx:2036
 TGLViewer.cxx:2037
 TGLViewer.cxx:2038
 TGLViewer.cxx:2039
 TGLViewer.cxx:2040
 TGLViewer.cxx:2041
 TGLViewer.cxx:2042
 TGLViewer.cxx:2043
 TGLViewer.cxx:2044
 TGLViewer.cxx:2045
 TGLViewer.cxx:2046
 TGLViewer.cxx:2047
 TGLViewer.cxx:2048
 TGLViewer.cxx:2049
 TGLViewer.cxx:2050
 TGLViewer.cxx:2051
 TGLViewer.cxx:2052
 TGLViewer.cxx:2053
 TGLViewer.cxx:2054
 TGLViewer.cxx:2055
 TGLViewer.cxx:2056
 TGLViewer.cxx:2057
 TGLViewer.cxx:2058
 TGLViewer.cxx:2059
 TGLViewer.cxx:2060
 TGLViewer.cxx:2061
 TGLViewer.cxx:2062
 TGLViewer.cxx:2063
 TGLViewer.cxx:2064
 TGLViewer.cxx:2065
 TGLViewer.cxx:2066
 TGLViewer.cxx:2067
 TGLViewer.cxx:2068
 TGLViewer.cxx:2069
 TGLViewer.cxx:2070
 TGLViewer.cxx:2071
 TGLViewer.cxx:2072
 TGLViewer.cxx:2073
 TGLViewer.cxx:2074
 TGLViewer.cxx:2075
 TGLViewer.cxx:2076
 TGLViewer.cxx:2077
 TGLViewer.cxx:2078
 TGLViewer.cxx:2079
 TGLViewer.cxx:2080
 TGLViewer.cxx:2081
 TGLViewer.cxx:2082
 TGLViewer.cxx:2083
 TGLViewer.cxx:2084
 TGLViewer.cxx:2085
 TGLViewer.cxx:2086
 TGLViewer.cxx:2087
 TGLViewer.cxx:2088
 TGLViewer.cxx:2089
 TGLViewer.cxx:2090
 TGLViewer.cxx:2091
 TGLViewer.cxx:2092
 TGLViewer.cxx:2093
 TGLViewer.cxx:2094
 TGLViewer.cxx:2095
 TGLViewer.cxx:2096
 TGLViewer.cxx:2097
 TGLViewer.cxx:2098
 TGLViewer.cxx:2099
 TGLViewer.cxx:2100
 TGLViewer.cxx:2101
 TGLViewer.cxx:2102
 TGLViewer.cxx:2103
 TGLViewer.cxx:2104
 TGLViewer.cxx:2105
 TGLViewer.cxx:2106
 TGLViewer.cxx:2107
 TGLViewer.cxx:2108
 TGLViewer.cxx:2109
 TGLViewer.cxx:2110
 TGLViewer.cxx:2111
 TGLViewer.cxx:2112
 TGLViewer.cxx:2113
 TGLViewer.cxx:2114
 TGLViewer.cxx:2115
 TGLViewer.cxx:2116
 TGLViewer.cxx:2117
 TGLViewer.cxx:2118
 TGLViewer.cxx:2119
 TGLViewer.cxx:2120
 TGLViewer.cxx:2121
 TGLViewer.cxx:2122
 TGLViewer.cxx:2123
 TGLViewer.cxx:2124
 TGLViewer.cxx:2125
 TGLViewer.cxx:2126
 TGLViewer.cxx:2127
 TGLViewer.cxx:2128
 TGLViewer.cxx:2129
 TGLViewer.cxx:2130
 TGLViewer.cxx:2131
 TGLViewer.cxx:2132
 TGLViewer.cxx:2133
 TGLViewer.cxx:2134
 TGLViewer.cxx:2135
 TGLViewer.cxx:2136
 TGLViewer.cxx:2137
 TGLViewer.cxx:2138
 TGLViewer.cxx:2139
 TGLViewer.cxx:2140
 TGLViewer.cxx:2141
 TGLViewer.cxx:2142
 TGLViewer.cxx:2143
 TGLViewer.cxx:2144
 TGLViewer.cxx:2145
 TGLViewer.cxx:2146
 TGLViewer.cxx:2147
 TGLViewer.cxx:2148
 TGLViewer.cxx:2149
 TGLViewer.cxx:2150
 TGLViewer.cxx:2151
 TGLViewer.cxx:2152
 TGLViewer.cxx:2153
 TGLViewer.cxx:2154
 TGLViewer.cxx:2155
 TGLViewer.cxx:2156
 TGLViewer.cxx:2157
 TGLViewer.cxx:2158
 TGLViewer.cxx:2159
 TGLViewer.cxx:2160
 TGLViewer.cxx:2161
 TGLViewer.cxx:2162
 TGLViewer.cxx:2163
 TGLViewer.cxx:2164
 TGLViewer.cxx:2165
 TGLViewer.cxx:2166
 TGLViewer.cxx:2167
 TGLViewer.cxx:2168
 TGLViewer.cxx:2169
 TGLViewer.cxx:2170
 TGLViewer.cxx:2171
 TGLViewer.cxx:2172
 TGLViewer.cxx:2173
 TGLViewer.cxx:2174
 TGLViewer.cxx:2175
 TGLViewer.cxx:2176
 TGLViewer.cxx:2177
 TGLViewer.cxx:2178
 TGLViewer.cxx:2179
 TGLViewer.cxx:2180
 TGLViewer.cxx:2181
 TGLViewer.cxx:2182
 TGLViewer.cxx:2183
 TGLViewer.cxx:2184
 TGLViewer.cxx:2185
 TGLViewer.cxx:2186
 TGLViewer.cxx:2187
 TGLViewer.cxx:2188
 TGLViewer.cxx:2189
 TGLViewer.cxx:2190
 TGLViewer.cxx:2191
 TGLViewer.cxx:2192
 TGLViewer.cxx:2193
 TGLViewer.cxx:2194
 TGLViewer.cxx:2195
 TGLViewer.cxx:2196
 TGLViewer.cxx:2197
 TGLViewer.cxx:2198
 TGLViewer.cxx:2199
 TGLViewer.cxx:2200
 TGLViewer.cxx:2201
 TGLViewer.cxx:2202
 TGLViewer.cxx:2203
 TGLViewer.cxx:2204
 TGLViewer.cxx:2205
 TGLViewer.cxx:2206
 TGLViewer.cxx:2207
 TGLViewer.cxx:2208
 TGLViewer.cxx:2209
 TGLViewer.cxx:2210
 TGLViewer.cxx:2211
 TGLViewer.cxx:2212
 TGLViewer.cxx:2213
 TGLViewer.cxx:2214
 TGLViewer.cxx:2215
 TGLViewer.cxx:2216
 TGLViewer.cxx:2217
 TGLViewer.cxx:2218
 TGLViewer.cxx:2219
 TGLViewer.cxx:2220
 TGLViewer.cxx:2221
 TGLViewer.cxx:2222
 TGLViewer.cxx:2223
 TGLViewer.cxx:2224
 TGLViewer.cxx:2225
 TGLViewer.cxx:2226
 TGLViewer.cxx:2227
 TGLViewer.cxx:2228
 TGLViewer.cxx:2229
 TGLViewer.cxx:2230
 TGLViewer.cxx:2231
 TGLViewer.cxx:2232
 TGLViewer.cxx:2233
 TGLViewer.cxx:2234
 TGLViewer.cxx:2235
 TGLViewer.cxx:2236
 TGLViewer.cxx:2237
 TGLViewer.cxx:2238
 TGLViewer.cxx:2239
 TGLViewer.cxx:2240
 TGLViewer.cxx:2241
 TGLViewer.cxx:2242
 TGLViewer.cxx:2243
 TGLViewer.cxx:2244
 TGLViewer.cxx:2245