// @(#)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),
   fStereoQuadBuf        (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),
   fStereoQuadBuf        (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
   if (fStereoQuadBuf)
   {
      glDrawBuffer(GL_BACK_LEFT);
   }
   else
   {
      glScissor(0, 0, fViewport.Width(), fViewport.Height());
      glEnable(GL_SCISSOR_TEST);
   }
   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
   if (fStereoQuadBuf)
   {
      glDrawBuffer(GL_BACK_RIGHT);
   }
   else
   {
      glScissor(fViewport.Width(), 0, fViewport.Width(), fViewport.Height());
   }
   PreDraw();
   PreRender();
   if ( ! fStereoQuadBuf)
   {
      glViewport(fViewport.Width(), 0, fViewport.Width(), fViewport.Height());
   }

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

   if (fStereoQuadBuf)
   {
      glDrawBuffer(GL_BACK);
   }
   else
   {
      glDisable(GL_SCISSOR_TEST);
      glViewport(0, 0, fViewport.Width(), fViewport.Height());
   }
}

//______________________________________________________________________________
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'

   if (fStereo && ! fStereoQuadBuf) width /= 2;

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

//______________________________________________________________________________
void TGLViewer::SetStereo(Bool_t stereo, Bool_t quad_buf)
{
   // Enable stereo rendering.
   // If quad_buf is true rendering is done into separate left and right GL
   // buffers. This requires hardware support. Otherwise left and right images
   // get rendered into left and right half of the window.
   // Note that mouse highlighting and selection will not work exactly right
   // as image for each eye gets slightly shifted and there are two different
   // directions through the mouse pointer, one for each eye.

   if (stereo != fStereo)
   {
      fStereo = stereo;
      fStereoQuadBuf = quad_buf;
      if (fStereo)
         SetViewport(fViewport.X(), fViewport.Y(),   fViewport.Width(), fViewport.Height());
      else
         SetViewport(fViewport.X(), fViewport.Y(), 2*fViewport.Width(), fViewport.Height());
   }
   RequestDraw(TGLRnrCtx::kLODHigh);
}

/**************************************************************************/
// 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
 TGLViewer.cxx:2246
 TGLViewer.cxx:2247
 TGLViewer.cxx:2248
 TGLViewer.cxx:2249
 TGLViewer.cxx:2250
 TGLViewer.cxx:2251
 TGLViewer.cxx:2252
 TGLViewer.cxx:2253
 TGLViewer.cxx:2254
 TGLViewer.cxx:2255
 TGLViewer.cxx:2256
 TGLViewer.cxx:2257
 TGLViewer.cxx:2258
 TGLViewer.cxx:2259
 TGLViewer.cxx:2260
 TGLViewer.cxx:2261
 TGLViewer.cxx:2262
 TGLViewer.cxx:2263
 TGLViewer.cxx:2264
 TGLViewer.cxx:2265
 TGLViewer.cxx:2266
 TGLViewer.cxx:2267
 TGLViewer.cxx:2268
 TGLViewer.cxx:2269
 TGLViewer.cxx:2270
 TGLViewer.cxx:2271
 TGLViewer.cxx:2272
 TGLViewer.cxx:2273
 TGLViewer.cxx:2274
 TGLViewer.cxx:2275
 TGLViewer.cxx:2276
 TGLViewer.cxx:2277
 TGLViewer.cxx:2278
 TGLViewer.cxx:2279
 TGLViewer.cxx:2280
 TGLViewer.cxx:2281
 TGLViewer.cxx:2282
 TGLViewer.cxx:2283
 TGLViewer.cxx:2284
 TGLViewer.cxx:2285
 TGLViewer.cxx:2286
 TGLViewer.cxx:2287
 TGLViewer.cxx:2288
 TGLViewer.cxx:2289
 TGLViewer.cxx:2290
 TGLViewer.cxx:2291
 TGLViewer.cxx:2292
 TGLViewer.cxx:2293
 TGLViewer.cxx:2294
 TGLViewer.cxx:2295
 TGLViewer.cxx:2296
 TGLViewer.cxx:2297
 TGLViewer.cxx:2298