// @(#)root/gl:$Id$
// Author:  Richard Maunder  16/09/2005

/*************************************************************************
 * Copyright (C) 1995-2005, 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 "TGLClip.h"
#include "TGLIncludes.h"
#include "TGLRnrCtx.h"
#include "TGLManipSet.h"

#include "TGLFaceSet.h"
#include "TBuffer3D.h"
#include "TBuffer3DTypes.h"

namespace
{

class TGLClipPlaneLogical : public TGLLogicalShape
{
protected:
   virtual void DirectDraw(TGLRnrCtx & rnrCtx) const
   {
      glBegin(rnrCtx.IsDrawPassFilled() ? GL_QUADS : GL_LINE_LOOP);
      glNormal3d (0.0, 0.0, 1.0);
      glVertex3dv(fBoundingBox[4].CArr());
      glVertex3dv(fBoundingBox[7].CArr());
      glVertex3dv(fBoundingBox[6].CArr());
      glVertex3dv(fBoundingBox[5].CArr());
      glEnd();
   }

public:
   TGLClipPlaneLogical() : TGLLogicalShape() { fDLCache = kFALSE; }
   virtual ~TGLClipPlaneLogical() {}

   void Resize(Double_t ext)
   {
      fBoundingBox.SetAligned(TGLVertex3(-ext, -ext, 0),
                              TGLVertex3( ext,  ext, 0));
      UpdateBoundingBoxesOfPhysicals();
   }

};


class TGLClipBoxLogical : public TGLLogicalShape
{
protected:
   virtual void DirectDraw(TGLRnrCtx & rnrCtx) const
   {
      glEnable(GL_NORMALIZE);
      fBoundingBox.Draw(rnrCtx.IsDrawPassFilled());
      glDisable(GL_NORMALIZE);
   }

public:
   TGLClipBoxLogical() : TGLLogicalShape() { fDLCache = kFALSE; }
   virtual ~TGLClipBoxLogical() {}

   void Resize(const TGLVertex3 & lowVertex, const TGLVertex3 & highVertex)
   {
      fBoundingBox.SetAligned(lowVertex, highVertex);
      UpdateBoundingBoxesOfPhysicals();
   }
};

}


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGLClip                                                              //
//                                                                      //
// Abstract clipping shape - derives from TGLPhysicalShape              //
// Adds clip mode (inside/outside) and pure virtual method to           //
// approximate shape as set of planes. This plane set is used to perform//
// interactive clipping using OpenGL clip planes.                       //
//////////////////////////////////////////////////////////////////////////

ClassImp(TGLClip);

//______________________________________________________________________________
TGLClip::TGLClip(const TGLLogicalShape & logical, const TGLMatrix & transform, const float color[4]) :
   TGLPhysicalShape(0, logical, transform, kTRUE, color),
   fMode      (kInside),
   fTimeStamp (1),
   fValid     (kFALSE)
{
   // Construct a stand-alone physical clipping object.

   logical.StrongRef(kTRUE);
}

//______________________________________________________________________________
TGLClip::~TGLClip()
{
   // Destroy clip object.
}

//______________________________________________________________________________
void TGLClip::Setup(const TGLVector3&, const TGLVector3&)
{
   // Setup the clipping object with two vectors.
   // The interpretation of the two is different for plane and box
   // clipping objects.

   Warning("TGLClip::Setup", "Called on base-class -- should be re-implemented in derived class.");
   
}

//______________________________________________________________________________
void TGLClip::Draw(TGLRnrCtx & rnrCtx) const
{
   // Draw out clipping object with blending and back + front filling.
   // Some clip objects are single face which we want to see both sides of.

   glDepthMask(GL_FALSE);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   glDisable(GL_CULL_FACE);
   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

   TGLPhysicalShape::Draw(rnrCtx);

   glPolygonMode(GL_FRONT, GL_FILL);
   glEnable(GL_CULL_FACE);
   glDisable(GL_BLEND);
   glDepthMask(GL_TRUE);
}

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGLClipPlane                                                         //
//                                                                      //
// Concrete clip plane object. This can be translated in all directions //
// rotated about the Y/Z local axes (the in-plane axes). It cannot be   //
// scaled.                                                              //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

ClassImp(TGLClipPlane);

const float TGLClipPlane::fgColor[4] = { 1.0, 0.6, 0.2, 0.5 };

//______________________________________________________________________________
TGLClipPlane::TGLClipPlane() :
   TGLClip(* new TGLClipPlaneLogical, TGLMatrix(), fgColor)
{
   // Construct a clip plane object, based on supplied 'plane', with
   // initial manipulation pivot at 'center', with drawn extents (in
   // local x/y axes) of 'extents'
   //
   // Plane can have center pivot translated in all directions, and
   // rotated round center in X/Y axes , the in-plane axes. It cannot
   // be scaled
   //
   // Note theorectically a plane is of course infinite - however we
   // want to draw the object in viewer - so we fake it with a single
   // GL face (polygon) - extents defines the width/depth of this -
   // should be several times scene extents - see Setup().

   SetManip(EManip(kTranslateAll | kRotateX | kRotateY));

   TGLPlane plane(0.0, -1.0, 0.0, 0.0);
   Set(plane);
   fValid = kFALSE;
}

//______________________________________________________________________________
TGLClipPlane::~TGLClipPlane()
{
   // Destroy clip plane object
}

//______________________________________________________________________________
void TGLClipPlane::Setup(const TGLBoundingBox & bbox)
{
   // Setup the clip object for scene encompassed by bbox.

   Double_t extents = bbox.Extents().Mag();
   TGLClipPlaneLogical* cpl = (TGLClipPlaneLogical*) GetLogical();
   cpl->Resize(extents);
   if (!fValid) {
      SetTransform(TGLMatrix(bbox.Center(), BoundingBox().GetNearPlane().Norm()));
   }
   IncTimeStamp();
   fValid = kTRUE;
}

//______________________________________________________________________________
void TGLClipPlane::Setup(const TGLVector3& point, const TGLVector3& normal)
{
   // Setup the clipping plane by point and normal.
   // Length of the normal determines the size of the plane drawn in
   // GL viewer. The normal points into the direction of visible half-plane.
   //
   // This only makes sense if you disable auto-update of the
   // clip-object:
   //   gl_viewer->SetClipAutoUpdate(kFALSE).
   // After calling this also call gl_viewer->RefreshPadEditor(gl_viewer)
   // and gl_viewer->RequestDraw().

   TGLVector3 n(normal);
   Double_t extents = n.Mag();
   if (extents > 0)
   {
      n /= extents;
      TGLClipPlaneLogical* cpl = (TGLClipPlaneLogical*) GetLogical();
      cpl->Resize(extents);
      SetTransform(TGLMatrix(point, n));

      IncTimeStamp();
      fValid = kTRUE;
   }
   else
   {
      Warning("TGLClipPlane::Setup", "Normal with zero length passed.");
   }
}

//______________________________________________________________________________
void TGLClipPlane::Set(const TGLPlane& plane)
{
   // Update clip plane object to follow passed 'plane' equation. Center pivot
   // is shifted to nearest point on new plane.

   TGLVertex3 oldCenter = BoundingBox().Center();
   TGLVertex3 newCenter = plane.NearestOn(oldCenter);
   SetTransform(TGLMatrix(newCenter, plane.Norm()));
   IncTimeStamp();
   fValid = kTRUE;
}

//______________________________________________________________________________
void TGLClipPlane::PlaneSet(TGLPlaneSet_t& set) const
{
   // Return set of planes (actually a single one) describing this clip plane.

   set.resize(1);
   set[0] = BoundingBox().GetNearPlane();
   set[0].Negate();
}

//////////////////////////////////////////////////////////////////////////
//
// TGLClipBox
//
// Concrete clip box object. Can be translated, rotated and scaled in
// all (xyz) axes. By default inside of the box is clipped away.
//
//////////////////////////////////////////////////////////////////////////

ClassImp(TGLClipBox);

const float TGLClipBox::fgColor[4] = { 1.0, 0.6, 0.2, 0.3 };

//______________________________________________________________________________
TGLClipBox::TGLClipBox() :
   TGLClip(* new TGLClipBoxLogical, TGLMatrix(), fgColor)
{
   // Construct an (initially) axis aligned clip pbox object, extents
   // 'halfLengths', centered on 'center' vertex.
   // Box can be translated, rotated and scaled in all (xyz) local axes.
}

//______________________________________________________________________________
TGLClipBox::~TGLClipBox()
{
   // Destroy clip box object.
}

//______________________________________________________________________________
void TGLClipBox::Setup(const TGLBoundingBox& bbox)
{
   // Setup the clip object for scene encompassed by bbox.

   TGLVector3 halfLengths = bbox.Extents() * 0.2501;
   TGLVertex3 center      = bbox.Center() + halfLengths;

   TGLClipBoxLogical* cbl = (TGLClipBoxLogical*) GetLogical();
   cbl->Resize(center - halfLengths, center + halfLengths);

   IncTimeStamp();
   fValid = kTRUE;
}

//______________________________________________________________________________
void TGLClipBox::Setup(const TGLVector3& min_point, const TGLVector3& max_point)
{
   // Setup the clip box with min/max points directly.
   //
   // This only makes sense if you disable auto-update of the
   // clip-object:
   //   gl_viewer->SetClipAutoUpdate(kFALSE).
   // After calling this also call gl_viewer->RefreshPadEditor(gl_viewer)
   // and gl_viewer->RequestDraw().

   TGLClipBoxLogical* cbl = (TGLClipBoxLogical*) GetLogical();
   cbl->Resize(min_point, max_point);

   IncTimeStamp();
   fValid = kTRUE; 
}

//______________________________________________________________________________
void TGLClipBox::PlaneSet(TGLPlaneSet_t& set) const
{
   // Return set of 6 planes describing faces of the box but invert them
   // so that they point inside of box.

   BoundingBox().PlaneSet(set);
   TGLPlaneSet_i i = set.begin();
   while (i != set.end()) {
      i->Negate();
      ++i;
   }
}


//////////////////////////////////////////////////////////////////////////
//
// TGLClipSet
//
// A collection of concrete TGLClip objects to be selected from.
//
//////////////////////////////////////////////////////////////////////////


ClassImp(TGLClipSet);

//______________________________________________________________________________
TGLClipSet::TGLClipSet() :
   TGLOverlayElement(kViewer), 
   fClipPlane   (new TGLClipPlane),
   fClipBox     (new TGLClipBox),
   fCurrentClip (0),
   fAutoUpdate  (kTRUE),
   fShowClip    (kFALSE),
   fShowManip   (kFALSE),
   fManip       (new TGLManipSet)
{
   // Constructor.
}

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

   delete fClipPlane;
   delete fClipBox;
   delete fManip;
}

//______________________________________________________________________
Bool_t TGLClipSet::MouseEnter(TGLOvlSelectRecord& selRec)
{
   // Mouse has enetered this element.
   // Forward to ManipSet.

   return fManip->MouseEnter(selRec);
}

Bool_t TGLClipSet::MouseStillInside(TGLOvlSelectRecord& selRec)
{
   // A new overlay hit is about to be processed.
   // Forward to ManipSet.

   return fManip->MouseStillInside(selRec);
}

//______________________________________________________________________
Bool_t TGLClipSet::Handle(TGLRnrCtx& rnrCtx, TGLOvlSelectRecord& selRec,
                          Event_t* event)
{
   // Handle overlay event.
   // Forward to ManipSet.

   return fManip->Handle(rnrCtx, selRec, event);
}

//______________________________________________________________________
void TGLClipSet::MouseLeave()
{
   // Mouse has left the element.
   // Forward to ManipSet.

   return fManip->MouseLeave();
}

//______________________________________________________________________________
void TGLClipSet::Render(TGLRnrCtx& rnrCtx)
{
   // Render clip-shape and manipulator.

   if (!fCurrentClip) return;

   rnrCtx.SetShapeLOD(TGLRnrCtx::kLODHigh);
   rnrCtx.SetDrawPass(TGLRnrCtx::kPassFill);
   if (fShowClip && ! rnrCtx.Selection())
   {
      fCurrentClip->Draw(rnrCtx);
   }
   if (fShowManip)
   {
      fManip->Render(rnrCtx);
   }
}

//______________________________________________________________________________
void TGLClipSet::FillPlaneSet(TGLPlaneSet_t& set) const
{
   // Forward request to fill the plane-set to the current clip.

   if (fCurrentClip)
      fCurrentClip->PlaneSet(set);
}

//______________________________________________________________________________
void TGLClipSet::SetupClips(const TGLBoundingBox& sceneBBox)
{
   // Setup clipping objects for given scene bounding box.

   fLastBBox = sceneBBox;
   fClipPlane->Setup(sceneBBox);
   fClipBox  ->Setup(sceneBBox);
}

//______________________________________________________________________________
void TGLClipSet::SetupCurrentClip(const TGLBoundingBox& sceneBBox)
{
   // Setup current clipping object for given scene bounding box.

   fLastBBox = sceneBBox;
   if (fCurrentClip)
      fCurrentClip->Setup(sceneBBox);
}

//______________________________________________________________________________
void TGLClipSet::SetupCurrentClipIfInvalid(const TGLBoundingBox& sceneBBox)
{
   // Setup current clipping object for given scene bounding box.

   fLastBBox = sceneBBox;
   if (fCurrentClip && ! fCurrentClip->IsValid())
      fCurrentClip->Setup(sceneBBox);
}

//______________________________________________________________________________
void TGLClipSet::InvalidateClips()
{
   // Invalidate clip objects.

   fClipPlane->Invalidate();
   fClipBox  ->Invalidate();
}

//______________________________________________________________________________
void TGLClipSet::InvalidateCurrentClip()
{
   // Invalidate current clip object.

   if (fCurrentClip)
      fCurrentClip->Invalidate();
}

//______________________________________________________________________________
void TGLClipSet::GetClipState(TGLClip::EType type, Double_t data[6]) const
{
   // Get state of clip object 'type' into data vector:
   //
   // 'type' requested - 'data' contents returned
   // kClipPlane   4 components - A,B,C,D - of plane eq : Ax+By+CZ+D = 0
   // kBoxPlane    6 components - Box Center X/Y/Z - Box Extents X/Y/Z

   switch (type)
   {
      case TGLClip::kClipNone:
         break;

      case TGLClip::kClipPlane:
      {
         if (!fClipPlane->IsValid())
            fClipPlane->Setup(fLastBBox);
         TGLPlaneSet_t planes;
         fClipPlane->PlaneSet(planes);
         data[0] = planes[0].A();
         data[1] = planes[0].B();
         data[2] = planes[0].C();
         data[3] = planes[0].D();
         break;
      }
      case TGLClip::kClipBox:
      {
         if (!fClipBox->IsValid())
            fClipBox->Setup(fLastBBox);
         const TGLBoundingBox & box = fClipBox->BoundingBox();
         TGLVector3 ext = box.Extents();
         data[0] = box.Center().X();
         data[1] = box.Center().Y();
         data[2] = box.Center().Z();
         data[3] = box.Extents().X();
         data[4] = box.Extents().Y();
         data[5] = box.Extents().Z();
         break;
      }
      default:
         Error("TGLClipSet::GetClipState", "invalid clip type '%d'.", type);
         break;
   }
}

//______________________________________________________________________________
void TGLClipSet::SetClipState(TGLClip::EType type, const Double_t data[6])
{
   // Set state of clip object 'type' into data vector:
   //
   // 'type' specified        'data' contents interpretation
   // kClipNone               ignored
   // kClipPlane              4 components - A,B,C,D - of plane eq : Ax+By+CZ+D = 0
   // kBoxPlane               6 components - Box Center X/Y/Z - Box Extents X/Y/Z

   switch (type) {
      case TGLClip::kClipNone: {
         break;
      }
      case TGLClip::kClipPlane: {
         TGLPlane newPlane(-data[0], -data[1], -data[2], -data[3]);
         fClipPlane->Set(newPlane);
         break;
      }
      case TGLClip::kClipBox: {
         //TODO: Pull these inside TGLPhysicalShape
         // Update clip box center
         const TGLBoundingBox & currentBox = fClipBox->BoundingBox();
         TGLVector3 shift(data[0] - currentBox.Center().X(),
                          data[1] - currentBox.Center().Y(),
                          data[2] - currentBox.Center().Z());
         fClipBox->Translate(shift);
         // Update clip box extents

         TGLVector3 currentScale = fClipBox->GetScale();
         TGLVector3 newScale(data[3] / currentBox.Extents().X() * currentScale.X(),
                             data[4] / currentBox.Extents().Y() * currentScale.Y(),
                             data[5] / currentBox.Extents().Z() * currentScale.Z());

         fClipBox->Scale(newScale);
         break;
      }
   }
}

//______________________________________________________________________________
TGLClip::EType TGLClipSet::GetClipType() const
{
   // Get current type active in viewer - returns one of kClipNone
   // kClipPlane or kClipBox.

  TGLClip::EType type;
   if (fCurrentClip == 0) {
      type = TGLClip::kClipNone;
   } else if (fCurrentClip == fClipPlane) {
      type = TGLClip::kClipPlane;
   } else if (fCurrentClip == fClipBox) {
      type = TGLClip::kClipBox;
   } else {
      Error("TGLClipSet::GetClipType" , "Unknown clip type");
      type = TGLClip::kClipNone;
   }
   return type;
}

//______________________________________________________________________________
void TGLClipSet::SetClipType(TGLClip::EType type)
{
   // Set current clip active in viewer - 'type' is one of kClipNone
   // kClipPlane or kClipBox.

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