ROOT logo
// @(#)root/gl:$Id: TGLViewerBase.cxx 29676 2009-08-04 16:18:07Z matevz $
// Author:  Matevz Tadel, Feb 2007

/*************************************************************************
 * Copyright (C) 1995-2004, 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 "TGLViewerBase.h"

#include "TGLSceneBase.h"
#include "TGLSceneInfo.h"

#include "TGLRnrCtx.h"
#include "TGLCamera.h"
#include "TGLOverlay.h"
#include "TGLSelectBuffer.h"
#include "TGLSelectRecord.h"
#include "TGLAnnotation.h"
#include "TGLUtil.h"

#include "TGLContext.h"
#include "TGLIncludes.h"

#include <algorithm>
#include <stdexcept>

//______________________________________________________________________
//
// Base class for GL viewers. Provides a basic scene management and a
// small set of control variables (camera, LOD, style, clip) that are
// used by the scene classes. Renering wrappers are available but
// minimal.
//
// There is no concept of GL-context here ... we just draw
// into whatever is set from outside.
//
// Development notes:
//
// Each viewer automatically creates a TGLRnrCtx and passes it down
// all render functions.

ClassImp(TGLViewerBase);

//______________________________________________________________________
TGLViewerBase::TGLViewerBase() :
   fRnrCtx    (0),
   fCamera    (0),
   fClip      (0),
   fLOD       (TGLRnrCtx::kLODHigh),
   fStyle     (TGLRnrCtx::kFill),
   fWFLineW   (1),
   fOLLineW   (1),

   fResetSceneInfosOnRender (kFALSE),
   fChanged                 (kFALSE)
{
   // Constructor.

   fRnrCtx = new TGLRnrCtx(this);
}

//______________________________________________________________________
TGLViewerBase::~TGLViewerBase()
{
   // Destructor.

   for (SceneInfoList_i i=fScenes.begin(); i!=fScenes.end(); ++i)
   {
      (*i)->GetScene()->RemoveViewer(this);
      delete *i;
   }

   DeleteOverlayElements(TGLOverlayElement::kAll);

   delete fRnrCtx;
}

//______________________________________________________________________________
const char* TGLViewerBase::LockIdStr() const
{
   // Name to print in locking output.

   return "TGLViewerBase";
}

/**************************************************************************/
// Scene & scene-info management
/**************************************************************************/

//______________________________________________________________________
TGLViewerBase::SceneInfoList_i
TGLViewerBase::FindScene(TGLSceneBase* scene)
{
   // Find scene-info corresponding to scene.

   SceneInfoList_i i = fScenes.begin();
   while (i != fScenes.end() && (*i)->GetScene() != scene) ++i;
   return i;
}

//______________________________________________________________________
TGLSceneInfo* TGLViewerBase::AddScene(TGLSceneBase* scene)
{
   // Add new scene, appropriate scene-info is created.

   SceneInfoList_i i = FindScene(scene);
   if (i == fScenes.end()) {
      TGLSceneInfo* sinfo = scene->CreateSceneInfo(this);
      fScenes.push_back(sinfo);
      scene->AddViewer(this);
      Changed();
      return sinfo;
   } else {
      Warning("TGLViewerBase::AddScene", "scene '%s' already in the list.",
              scene->GetName());
      return 0;
   }
}

//______________________________________________________________________
void TGLViewerBase::RemoveScene(TGLSceneBase* scene)
{
   // Remove scene from the viewer, its scene-info is deleted.

   SceneInfoList_i i = FindScene(scene);
   if (i != fScenes.end()) {
      delete *i;
      fScenes.erase(i);
      scene->RemoveViewer(this);
      Changed();
   } else {
      Warning("TGLViewerBase::RemoveScene", "scene '%s' not found.",
              scene->GetName());
   }
}

//______________________________________________________________________
void TGLViewerBase::RemoveAllScenes()
{
   // Remove all scenes from the viewer, their scene-infos are deleted.

   for (SceneInfoList_i i=fScenes.begin(); i!=fScenes.end(); ++i)
   {
      TGLSceneInfo * sinfo = *i;
      sinfo->GetScene()->RemoveViewer(this);
      delete sinfo;
   }
   fScenes.clear();
   Changed();
}

//______________________________________________________________________
void TGLViewerBase::SceneDestructing(TGLSceneBase* scene)
{
   // Remove scene, its scene-info is deleted.
   // Called from scene that is being destroyed while still holding
   // viewer references.

   SceneInfoList_i i = FindScene(scene);
   if (i != fScenes.end()) {
      delete *i;
      fScenes.erase(i);
      Changed();
   } else {
      Warning("TGLViewerBase::SceneDestructing", "scene not found.");
   }
}

//______________________________________________________________________
TGLSceneInfo* TGLViewerBase::GetSceneInfo(TGLSceneBase* scene)
{
   // Find scene-info corresponding to scene.

   SceneInfoList_i i = FindScene(scene);
   if (i != fScenes.end())
      return *i;
   else
      return 0;
}

//______________________________________________________________________
void TGLViewerBase::AddOverlayElement(TGLOverlayElement* el)
{
   // Add overlay element.

   fOverlay.push_back(el);
   Changed();
}

//______________________________________________________________________
void TGLViewerBase::RemoveOverlayElement(TGLOverlayElement* el)
{
   // Remove overlay element.

   OverlayElmVec_i it = std::find(fOverlay.begin(), fOverlay.end(), el);
   if (it != fOverlay.end())
      fOverlay.erase(it);
   Changed();
}

//______________________________________________________________________
void TGLViewerBase::DeleteOverlayAnnotations()
{
   // Delete overlay elements that are annotations.

   DeleteOverlayElements(TGLOverlayElement::kAnnotation);
}

//______________________________________________________________________
void TGLViewerBase::DeleteOverlayElements(TGLOverlayElement::ERole role)
{
   // Delete overlay elements.

   OverlayElmVec_t ovl;
   fOverlay.swap(ovl);

   for (OverlayElmVec_i i = ovl.begin(); i != ovl.end(); ++i)
   {
      if (role == TGLOverlayElement::kAll || (*i)->GetRole() == role)
         delete *i;
      else
         fOverlay.push_back(*i);
   }

   Changed();
}

/**************************************************************************/
// SceneInfo update / check
/**************************************************************************/

//______________________________________________________________________________
void TGLViewerBase::ResetSceneInfos()
{
   // Force rebuild of view-dependent scene-info structures.
   //
   // This should be called before calling render (draw/select) if
   // something that affects camera interest has been changed.

   SceneInfoList_i i = fScenes.begin();
   while (i != fScenes.end())
   {
      (*i)->ResetSceneStamp();
      ++i;
   }
}

//______________________________________________________________________________
void TGLViewerBase::MergeSceneBBoxes(TGLBoundingBox& bbox)
{
   // Merge bounding-boxes of all active registered scenes.

   bbox.SetEmpty();
   for (SceneInfoList_i i=fScenes.begin(); i!=fScenes.end(); ++i)
   {
      TGLSceneInfo * sinfo = *i;
      if (sinfo->GetActive())
      {
         sinfo->SetupTransformsAndBBox(); // !!! transform not done yet, no camera
         bbox.MergeAligned(sinfo->GetTransformedBBox());
      }
   }
}

/**************************************************************************/
// Rendering / selection virtuals
/**************************************************************************/

//______________________________________________________________________
void TGLViewerBase::PreRender()
{
   // Initialize render-context, setup camera, GL, render-area.
   // Check and lock scenes, determine their visibility.

   TGLContextIdentity* cid = TGLContextIdentity::GetCurrent();
   if (cid == 0)
   {
      // Assume derived class set it up for us.
      // This happens due to complex implementation
      // of gl-in-pad using gGLManager.
      // In principle we should throw an exception:
      // throw std::runtime_error("Can not resolve GL context.");
   }
   else
   {
      if (cid != fRnrCtx->GetGLCtxIdentity())
      {
         if (fRnrCtx->GetGLCtxIdentity() != 0)
            Warning("TGLViewerBase::PreRender", "Switching to another GL context; maybe you should use context-sharing.");
         fRnrCtx->SetGLCtxIdentity(cid);
      }
   }

   fRnrCtx->SetCamera        (fCamera);
   fRnrCtx->SetViewerLOD     (fLOD);
   fRnrCtx->SetViewerStyle   (fStyle);
   fRnrCtx->SetViewerWFLineW (fWFLineW);
   fRnrCtx->SetViewerOLLineW (fOLLineW);
   fRnrCtx->SetViewerClip    (fClip);

   if (fResetSceneInfosOnRender)
   {
      ResetSceneInfos();
      fResetSceneInfosOnRender = kFALSE;
   }

   fOverallBoundingBox.SetEmpty();
   SceneInfoList_t locked_scenes;
   for (SceneInfoList_i i=fScenes.begin(); i!=fScenes.end(); ++i)
   {
      TGLSceneInfo *sinfo = *i;
      TGLSceneBase *scene = sinfo->GetScene();
      if (sinfo->GetActive())
      {
         if (fRnrCtx->Selection() && ! scene->GetSelectable())
            continue;
         if ( ! sinfo->GetScene()->TakeLock(kDrawLock))
         {
            Warning("TGLViewerBase::PreRender", "locking of scene '%s' failed, skipping.",
                    sinfo->GetScene()->GetName());
            continue;
         }
         sinfo->SetupTransformsAndBBox(); // !!! transform not done yet
         fOverallBoundingBox.MergeAligned(sinfo->GetTransformedBBox());
         locked_scenes.push_back(sinfo);
      }
   }

   fCamera->Apply(fOverallBoundingBox, fRnrCtx->GetPickRectangle());

   // Make precursory selection of visible scenes.
   // Only scene bounding-box .vs. camera frustum check performed.
   fVisScenes.clear();
   for (SceneInfoList_i i=locked_scenes.begin(); i!=locked_scenes.end(); ++i)
   {
      TGLSceneInfo         * sinfo = *i;
      const TGLBoundingBox & bbox  = sinfo->GetTransformedBBox();
      Bool_t visp = (!bbox.IsEmpty() && fCamera->FrustumOverlap(bbox) != kOutside);
      sinfo->ViewCheck(visp);
      if (visp) {
         fRnrCtx->SetSceneInfo(sinfo);
         sinfo->GetScene()->PreDraw(*fRnrCtx);
         if (sinfo->IsVisible()) {
            fVisScenes.push_back(sinfo);
         } else {
            sinfo->GetScene()->PostDraw(*fRnrCtx);
            sinfo->GetScene()->ReleaseLock(kDrawLock);
         }
         fRnrCtx->SetSceneInfo(0);
      } else {
         sinfo->GetScene()->ReleaseLock(kDrawLock);
      }
   }
}

//______________________________________________________________________________
void TGLViewerBase::SubRenderScenes(SubRender_foo render_foo)
{
   // Call sub-rendering function render_foo on all currently visible
   // scenes.

   Int_t nScenes = fVisScenes.size();

   for (Int_t i = 0; i < nScenes; ++i)
   {
      TGLSceneInfo* sinfo = fVisScenes[i];
      TGLSceneBase* scene = sinfo->GetScene();
      fRnrCtx->SetSceneInfo(sinfo);
      glPushName(i);
      scene->PreRender(*fRnrCtx);
      (scene->*render_foo)(*fRnrCtx);
      scene->PostRender(*fRnrCtx);
      glPopName();
      fRnrCtx->SetSceneInfo(0);
   }
}

//______________________________________________________________________
void TGLViewerBase::Render()
{
   // Render all scenes. This is done in four passes:
   // - render opaque objects from all scenes
   // - render transparent objects from all scenes
   // - clear depth buffer
   // - render opaque selected objects from all scenes (with highlight)
   // - render transparent selected objects from all scenes (with highlight)

   RenderNonSelected();
   glClear(GL_DEPTH_BUFFER_BIT);
   RenderSelected();
}

//______________________________________________________________________
void TGLViewerBase::RenderNonSelected()
{
   // Render non-selected objects from all scenes.

   SubRenderScenes(&TGLSceneBase::RenderOpaque);

   glDepthMask(GL_FALSE);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

   SubRenderScenes(&TGLSceneBase::RenderTransp);

   glDepthMask(GL_TRUE);
   glDisable(GL_BLEND);

   TGLUtil::CheckError("TGLViewerBase::RenderNonSelected - pre exit check");
}

//______________________________________________________________________
void TGLViewerBase::RenderSelected()
{
   // Render selected objects from all scenes.

   SubRenderScenes(&TGLSceneBase::RenderSelOpaque);

   glDepthMask(GL_FALSE);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

   SubRenderScenes(&TGLSceneBase::RenderSelTransp);

   glDepthMask(GL_TRUE);
   glDisable(GL_BLEND);

   TGLUtil::CheckError("TGLViewerBase::RenderSelected - pre exit check");
}

//______________________________________________________________________
void TGLViewerBase::RenderOverlay()
{
   // Render overlay objects.

   Int_t nOvl = fOverlay.size();
   for (Int_t i = 0; i < nOvl; ++i)
   {
      TGLOverlayElement* el = fOverlay[i];
      glPushName(i);
      el->Render(*fRnrCtx);
      glPopName();
   }
}

//______________________________________________________________________
void TGLViewerBase::PostRender()
{
   // Function called after rendering is finished.
   // Here we just unlock the scenes.

   for (SceneInfoVec_i i = fVisScenes.begin(); i != fVisScenes.end(); ++i)
   {
      TGLSceneInfo* sinfo = *i;
      fRnrCtx->SetSceneInfo(sinfo);
      sinfo->GetScene()->PostDraw(*fRnrCtx);
      fRnrCtx->SetSceneInfo(0);
      sinfo->GetScene()->ReleaseLock(kDrawLock);
   }
   fChanged = kFALSE;
}

//______________________________________________________________________
void TGLViewerBase::PreRenderOverlaySelection()
{
   // Perform minimal initialization for overlay selection.
   // Here we assume that scene has already been drawn and that
   // camera and overall bounding box are ok.
   // Scenes are not locked.

   fCamera->Apply(fOverallBoundingBox, fRnrCtx->GetPickRectangle());
}

//______________________________________________________________________
void TGLViewerBase::PostRenderOverlaySelection()
{
   // Perform cleanup after overlay selection.

}

/**************************************************************************/
// High-level functions: drawing and picking.
/**************************************************************************/


//______________________________________________________________________
//void TGLViewerBase::Select(Int_t selX, Int_t selY, Int_t selRadius)
//{
   // Perform render-pass in selection mode.
   // Process the selection results.
   // For now only in derived classes.
//}

//______________________________________________________________________
Bool_t TGLViewerBase::ResolveSelectRecord(TGLSelectRecord& rec, Int_t recIdx)
{
   // Process selection record on buffer-position 'recIdx' and
   // fill the data into 'rec'.
   //
   // Returns TRUE if scene was demangled and an object identified.
   // When FALSE is returned it is still possible that scene has been
   // identified. Check for this if interested in scene-selection.
   //
   // The select-buffer is taken form fRnrCtx.

   TGLSelectBuffer* sb = fRnrCtx->GetSelectBuffer();
   if (recIdx >= sb->GetNRecords())
       return kFALSE;

   sb->SelectRecord(rec, recIdx);
   UInt_t sceneIdx = rec.GetItem(0);
   if (sceneIdx >= fVisScenes.size())
       return kFALSE;

   TGLSceneInfo* sinfo = fVisScenes[sceneIdx];
   rec.SetSceneInfo(sinfo);
   return sinfo->GetScene()->ResolveSelectRecord(rec, 1);
}

//______________________________________________________________________
Bool_t TGLViewerBase::FindClosestRecord(TGLSelectRecord& rec, Int_t& recIdx)
{
   // Find next select record that can be resolved, starting from
   // position 'recIdx'.
   // 'recIdx' is passed as reference and points to found record in the buffer.

   TGLSelectBuffer* sb = fRnrCtx->GetSelectBuffer();

   while (recIdx < sb->GetNRecords())
   {
      if (ResolveSelectRecord(rec, recIdx))
         return kTRUE;
      ++recIdx;
   }
   return kFALSE;
}

//______________________________________________________________________
Bool_t TGLViewerBase::FindClosestOpaqueRecord(TGLSelectRecord& rec, Int_t& recIdx)
{
   // Find next select record that can be resolved and whose result is
   // not transparent, starting from position 'recIdx'.
   // 'recIdx' is passed as reference and points to found record in the buffer.

   TGLSelectBuffer* sb = fRnrCtx->GetSelectBuffer();

   while (recIdx < sb->GetNRecords())
   {
      if (ResolveSelectRecord(rec, recIdx) && ! rec.GetTransparent())
         return kTRUE;
      ++recIdx;
   }
   return kFALSE;
}

//______________________________________________________________________
Bool_t TGLViewerBase::FindClosestOverlayRecord(TGLOvlSelectRecord& rec,
                                               Int_t             & recIdx)
{
   // Find next overlay-select record that can be resolved, starting from
   // position 'recIdx'.
   // 'recIdx' is passed as reference and points to found record in the buffer.

   TGLSelectBuffer* sb = fRnrCtx->GetSelectBuffer();

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