ROOT logo
// @(#)root/gl:$Id$
// 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 "TGLSceneBase.h"
#include "TGLSceneInfo.h"
#include "TGLViewerBase.h"
#include "TGLRnrCtx.h"
#include "TGLCamera.h"
#include "TGLClip.h"
#include "TGLIncludes.h"

#include <TMath.h>

#include <string>
#include <algorithm>

//==============================================================================
// TGLSceneBase
//==============================================================================

//______________________________________________________________________
//
// Scene base-class --  provides basic interface expected by the
// TGLViewer or its sub-classes:
// * unique scene id
// * scene locking
// * overall bounding box
// * list of viewers displaying the scene (for update propagation)
// * virtual interface for draw/select/render (?)
//
// The standard ROOT OpenGL scene is implemented in direct sub-class
// TGLScene.
//
// Note that while each scene can be shared among several viewers, ALL
// of them are obliged to share the same display-list space (this can
// be achieved on GL-context creation time; Matevz believes that by
// default all GL contexts must use shared display-lists etc).


ClassImp(TGLSceneBase);

UInt_t TGLSceneBase::fgSceneIDSrc = 1;

//______________________________________________________________________________
TGLSceneBase::TGLSceneBase() :
   TGLLockable(),

   fTimeStamp        (1),
   fMinorStamp       (1),
   fLOD              (TGLRnrCtx::kLODHigh),
   fStyle            (TGLRnrCtx::kStyleUndef),
   fWFLineW          (0),
   fOLLineW          (0),
   fClip             (0),
   fSelectable       (kTRUE),
   fBoundingBox      (),
   fBoundingBoxValid (kFALSE),
   fDoFrustumCheck   (kTRUE),
   fDoClipCheck      (kTRUE),
   fAutoDestruct     (kTRUE)
{
   // Default constructor.

   fSceneID = fgSceneIDSrc++;
   fName = Form("unnamed-%d", fSceneID);
}

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

   for (ViewerList_i i=fViewers.begin(); i!=fViewers.end(); ++i)
   {
      (*i)->SceneDestructing(this);
   }
}

//______________________________________________________________________________
void TGLSceneBase::AddViewer(TGLViewerBase* viewer)
{
   // Add viewer to the list.

   ViewerList_i i = std::find(fViewers.begin(), fViewers.end(), viewer);
   if (i == fViewers.end())
      fViewers.push_back(viewer);
   else
      Warning("TGLSceneBase::AddViewer", "viewer already in the list.");
}

//______________________________________________________________________________
void TGLSceneBase::RemoveViewer(TGLViewerBase* viewer)
{
   // Remove viewer from the list.
   // If auto-destruct is on and the last viewer is removed the scene
   // destructs itself.

   ViewerList_i i = std::find(fViewers.begin(), fViewers.end(), viewer);
   if (i != fViewers.end())
      fViewers.erase(i);
   else
      Warning("TGLSceneBase::RemoveViewer", "viewer not found in the list.");

   if (fViewers.empty() && fAutoDestruct)
   {
      if (gDebug > 0)
         Info("TGLSceneBase::RemoveViewer", "scene '%s' not used - autodestructing.", GetName());
      delete this;
   }
}
//______________________________________________________________________________
void TGLSceneBase::TagViewersChanged()
{
   // Tag all viewers as changed.

   for (ViewerList_i i=fViewers.begin(); i!=fViewers.end(); ++i)
   {
      (*i)->Changed();
   }
}

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

//______________________________________________________________________________
const char* TGLSceneBase::LockIdStr() const
{
   // Name printed on locking info messages.

   return Form("TGLSceneBase %s", fName.Data());
}

/**************************************************************************/
// SceneInfo management
/**************************************************************************/

//______________________________________________________________________________
TGLSceneInfo* TGLSceneBase::CreateSceneInfo(TGLViewerBase* view)
{
   // Create a scene-info instance appropriate for this scene class.
   // Here we instantiate the scene-info base-class TGLSceneInfo.

   return new TGLSceneInfo(view, this);
}

//______________________________________________________________________________
void TGLSceneBase::RebuildSceneInfo(TGLRnrCtx& ctx)
{
   // Fill scene-info with very basic information that is practically
   // view independent. This is called when scene content is changed
   // or when camera-interest changes.

   TGLSceneInfo* sinfo = ctx.GetSceneInfo();

   sinfo->SetLastClip(0);
   sinfo->SetLastCamera(0);
}

//______________________________________________________________________________
void TGLSceneBase::UpdateSceneInfo(TGLRnrCtx& ctx)
{
   // Fill scene-info with information needed for rendering, take into
   // account the render-context (viewer state, camera, clipping).
   // Usually called from TGLViewer before rendering a scene if some
   // moderately significant part of render-context has changed.
   //
   // Here we update the basic state (clear last-LOD, mark the time,
   // set global <-> scene transforamtion matrices) and potentially
   // study and refine the clipping planes based on scene bounding box.

   if (gDebug > 3)
   {
      Info("TGLSceneBase::UpdateSceneInfo",
           "'%s' timestamp=%u",
           GetName(), fTimeStamp);
   }

   TGLSceneInfo* sinfo = ctx.GetSceneInfo();

   // ------------------------------------------------------------
   // Reset
   // ------------------------------------------------------------

   sinfo->SetLastLOD   (TGLRnrCtx::kLODUndef);
   sinfo->SetLastStyle (TGLRnrCtx::kStyleUndef);
   sinfo->SetSceneStamp(fTimeStamp);

   sinfo->InFrustum (kTRUE);
   sinfo->InClip    (kTRUE);
   sinfo->ClipMode  (TGLSceneInfo::kClipNone);

   // ------------------------------------------------------------
   // Setup
   // ------------------------------------------------------------

   // !!!
   // setup scene transformation matrices
   // so far the matrices in scene-base and scene-info are not enabled
   // sinfo->fSceneToGlobal = scene-info-trans * scene-base-trans;
   // sinfo->fGlobalToScene = inv of above;
   // transform to clip and to eye coordinates also interesting
   //
   // All these are now done in TGLViewerBase::PreRender() via
   // TGLSceneInfo::SetupTransformsAndBBox().

   sinfo->SetLastClip(0);
   sinfo->FrustumPlanes().clear();
   sinfo->ClipPlanes().clear();

   if (fDoFrustumCheck)
   {
      for (Int_t i=0; i<TGLCamera::kPlanesPerFrustum; ++i)
      {
         TGLPlane p = ctx.GetCamera()->FrustumPlane((TGLCamera::EFrustumPlane)i);
         // !!! transform plane
         switch (BoundingBox().Overlap(p))
         {
            case Rgl::kInside:  // Whole scene passes ... no need to store it.
               break;
            case Rgl::kPartial:
               sinfo->FrustumPlanes().push_back(p);
               break;
            case Rgl::kOutside:
               sinfo->InFrustum(kFALSE);
               break;
         }
      }
   }

   if (fDoClipCheck && ctx.HasClip())
   {
      if (ctx.Clip()->GetMode() == TGLClip::kOutside)
         sinfo->ClipMode(TGLSceneInfo::kClipOutside);
      else
         sinfo->ClipMode(TGLSceneInfo::kClipInside);

      std::vector<TGLPlane> planeSet;
      ctx.Clip()->PlaneSet(planeSet);

      // Strip any planes outside the scene bounding box - no effect
      std::vector<TGLPlane>::iterator it = planeSet.begin();
      while (it != planeSet.end())
      {
         // !!! transform plane
         switch (BoundingBox().Overlap(*it))
         {
            case Rgl::kInside:  // Whole scene passes ... no need to store it.
               break;
            case Rgl::kPartial:
               sinfo->ClipPlanes().push_back(*it);
               break;
            case Rgl::kOutside: // Depends on mode
               if (sinfo->ClipMode() == TGLSceneInfo::kClipOutside)
               {
                  // Scene is outside of whole clip object - nothing visible.
                  sinfo->InClip(kFALSE);
               }
               else
               {
                  // Scene is completely inside of whole clip object -
                  // draw all scene without clipping.
                  sinfo->ClipMode(TGLSceneInfo::kClipNone);
               }
               // In either case further checks not needed.
               sinfo->ClipPlanes().clear();
               return;
         }
         ++it;
      }
      sinfo->SetLastClip(ctx.Clip());
      sinfo->SetClipStamp(ctx.Clip()->TimeStamp());
   }

   sinfo->SetLastCamera(ctx.GetCamera());
   sinfo->SetCameraStamp(ctx.GetCamera()->TimeStamp());
}

//______________________________________________________________________________
void TGLSceneBase::LodifySceneInfo(TGLRnrCtx& ctx)
{
   // Setup LOD-dependant values in scene-info.
   //
   // Nothing to be done here but to store the last LOD.

   if (gDebug > 3)
   {
      Info("TGLSceneBase::LodifySceneInfo",
           "'%s' timestamp=%u lod=%d",
           GetName(), fTimeStamp, ctx.CombiLOD());
   }

   TGLSceneInfo & sInfo = * ctx.GetSceneInfo();
   sInfo.SetLastLOD(ctx.CombiLOD());
}


/**************************************************************************/
// Rendering
/**************************************************************************/

//______________________________________________________________________________
void TGLSceneBase::PreDraw(TGLRnrCtx & rnrCtx)
{
   // Perform basic pre-render initialization:
   //  - calculate LOD, Style, Clipping,
   //  - build draw lists.
   //
   // This is called in the beginning of the GL-viewer draw cycle.

   if ( ! IsDrawOrSelectLock()) {
      Error("TGLSceneBase::FullRender", "expected Draw or Select Lock");
   }

   TGLSceneInfo& sInfo = * rnrCtx.GetSceneInfo();

   // Bounding-box check done elsewhere (in viewer::pre-render)

   if (fTimeStamp > sInfo.SceneStamp())
   {
      RebuildSceneInfo(rnrCtx);
   }


   Bool_t needUpdate =  sInfo.HasUpdateTimeouted();

   if (rnrCtx.GetCamera() != sInfo.LastCamera())
   {
      sInfo.ResetCameraStamp();
      needUpdate = kTRUE;
   }
   else if (rnrCtx.GetCamera()->TimeStamp() > sInfo.CameraStamp())
   {
      needUpdate = kTRUE;
   }

   TGLClip* clip = 0;
   if (sInfo.Clip() != 0) clip = sInfo.Clip();
   else if (fClip   != 0) clip = fClip;
   else                   clip = rnrCtx.ViewerClip();
   if (clip != sInfo.LastClip())
   {
      sInfo.ResetClipStamp();
      needUpdate = kTRUE;
   }
   else if (clip && clip->TimeStamp() > sInfo.ClipStamp())
   {
      needUpdate = kTRUE;
   }
   rnrCtx.SetClip(clip);

   if (needUpdate)
   {
      UpdateSceneInfo(rnrCtx);
   }


   // Setup LOD ... optionally lodify.
   Short_t lod;
   if (sInfo.LOD() != TGLRnrCtx::kLODUndef) lod = sInfo.LOD();
   else if  (fLOD  != TGLRnrCtx::kLODUndef) lod = fLOD;
   else                                     lod = rnrCtx.ViewerLOD();
   rnrCtx.SetSceneLOD(lod);
   rnrCtx.SetCombiLOD(TMath::Min(rnrCtx.ViewerLOD(), rnrCtx.SceneLOD()));
   if (needUpdate || rnrCtx.CombiLOD() != sInfo.LastLOD())
   {
      LodifySceneInfo(rnrCtx);
   }

   // Setup style.
   Short_t style;
   if (sInfo.Style() != TGLRnrCtx::kStyleUndef) style = sInfo.Style();
   else if  (fStyle  != TGLRnrCtx::kStyleUndef) style = fStyle;
   else                                         style = rnrCtx.ViewerStyle();
   rnrCtx.SetSceneStyle(style);
   sInfo.SetLastStyle(style);

   // Wireframe line width.
   Float_t wf_linew;
   if (sInfo.WFLineW() != 0) wf_linew = sInfo.WFLineW();
   else if  (fWFLineW  != 0) wf_linew = fWFLineW;
   else                      wf_linew = rnrCtx.ViewerWFLineW();
   rnrCtx.SetSceneWFLineW(wf_linew);
   sInfo.SetLastWFLineW(wf_linew);
   // Outline line width.
   Float_t ol_linew;
   if (sInfo.OLLineW() != 0) ol_linew = sInfo.OLLineW();
   else if  (fOLLineW  != 0) ol_linew = fOLLineW;
   else                      ol_linew = rnrCtx.ViewerOLLineW();
   rnrCtx.SetSceneOLLineW(ol_linew);
   sInfo.SetLastOLLineW(ol_linew);
}

//______________________________________________________________________________
void TGLSceneBase::PreRender(TGLRnrCtx & rnrCtx)
{
   // Perform pre-render initialization - fill rnrCtx with
   // values stored during PreDraw().
   //
   // This is called each time before RenderXyzz().

   TGLSceneInfo& sInfo = * rnrCtx.GetSceneInfo();

   rnrCtx.SetClip         (sInfo.LastClip());
   rnrCtx.SetCombiLOD     (sInfo.LastLOD());
   rnrCtx.SetSceneStyle   (sInfo.LastStyle());
   rnrCtx.SetSceneWFLineW (sInfo.LastWFLineW());
   rnrCtx.SetSceneOLLineW (sInfo.LastOLLineW());

   // !!!
   // eventually handle matrix stack.
   // glPushMatrix();
   // glMultMatrix(something-from-scene-info);
   // Should also fix camera matrices
}

//______________________________________________________________________________
void TGLSceneBase::Render(TGLRnrCtx & rnrCtx)
{
   // This function does rendering of all stages, the shapes are
   // rendered in the following order: opaque, transparent,
   // selected-opaque, selected-transparent.
   //
   // GL-depth buffer is cleared after transparent shapes have been
   // rendered.
   //
   // This is never called from ROOT GL directly. Use it if you know
   // you are rendering a single scene.

   RenderOpaque(rnrCtx);
   RenderTransp(rnrCtx);
   RenderSelOpaque(rnrCtx);
   RenderSelTransp(rnrCtx);
}

//______________________________________________________________________________
void TGLSceneBase::RenderOpaque(TGLRnrCtx & /*rnrCtx*/)
{
   // Render opaque elements.
}

//______________________________________________________________________________
void TGLSceneBase::RenderTransp(TGLRnrCtx & /*rnrCtx*/)
{
   // Render transparent elements.
}

//______________________________________________________________________________
void TGLSceneBase::RenderSelOpaque(TGLRnrCtx & /*rnrCtx*/)
{
   // Render selected opaque elements.
}

//______________________________________________________________________________
void TGLSceneBase::RenderSelTransp(TGLRnrCtx & /*rnrCtx*/)
{
   // Render selected transparent elements for highlight.
}

//______________________________________________________________________________
void TGLSceneBase::RenderSelOpaqueForHighlight(TGLRnrCtx & /*rnrCtx*/)
{
   // Render selected opaque elements for highlight.
}

//______________________________________________________________________________
void TGLSceneBase::RenderSelTranspForHighlight(TGLRnrCtx & /*rnrCtx*/)
{
   // Render selected transparent elements.
}

//______________________________________________________________________________
void TGLSceneBase::PostRender(TGLRnrCtx & /*rnrCtx*/)
{
   // Perform post-render clean-up.

   // !!!
   // Cleanup matrix stack
   // glPopMatrix();
   // Should also fix camera matrices
}

//______________________________________________________________________________
void TGLSceneBase::PostDraw(TGLRnrCtx & /*rnrCtx*/)
{
   // Finalize drawing.
   //
   // This is called at the end of the GL-viewer draw cycle.
}

/**************************************************************************/
// Selection
/**************************************************************************/

//______________________________________________________________________________
Bool_t TGLSceneBase::ResolveSelectRecord(TGLSelectRecord & /*rec*/,
                                         Int_t             /*curIdx*/)
{
   // Process selection record rec.
   // 'curIdx' is the item position where the scene should start
   // its processing.
   // Return TRUE if an object has been identified or FALSE otherwise.
   // The scene-info member of the record is already set by the caller.
   //
   // See implementation in sub-class TGLScene, here we just return FALSE.

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