// @(#)root/g3d:$Id$
// Author: Rene Brun, Nenad Buncic, Evgueni Tcherniaev, Olivier Couet   18/08/95

/*************************************************************************
 * 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 "RConfigure.h"

#include "TVirtualPad.h"
#include "TView3D.h"
#include "TAxis3D.h"
#include "TPolyLine3D.h"
#include "TVirtualX.h"
#include "TROOT.h"
#include "TClass.h"
#include "TList.h"
#include "TPluginManager.h"
#include "TMath.h"

// Remove when TView3Der3DPad fix in ExecuteRotateView() is removed
#include "TVirtualViewer3D.h"

ClassImp(TView3D)

//const Int_t kPerspective = BIT(14);

const Int_t kCARTESIAN   = 1;
const Int_t kPOLAR       = 2;
const Double_t kRad = 3.14159265358979323846/180.0;


//______________________________________________________________________________
/* Begin_Html
<center><h2>The 3D view class</h2></center>
This package was originally written by Evgueni Tcherniaev from IHEP/Protvino.
<p>
The original Fortran implementation was adapted to HIGZ/PAW by Olivier Couet and
Evgueni Tcherniaev.
<p>
This View class is a subset of the original system. It has been converted to a
C++ class  by Rene Brun.
<p>
TView3D creates a 3-D view in the current pad. In this 3D view Lego and Surface
plots can be drawn and also 3D polyline and markers. Most of the time a TView3D
is created automatically when a 3D object needs to be painted in a pad (for
instance a Lego or a Surface plot).
<p>
In some case a TView3D should be explicitly. For instance to paint a 3D simple
scene composed of simple objects like polylines and polymarkers.
The following macro gives an example:
End_Html
Begin_Macro(source)
{
   cV3D = new TCanvas("cV3D","PolyLine3D & PolyMarker3D Window",200,10,500,500);

   // Creating a view
   TView3D *view = (TView3D*) TView::CreateView(1);
   view->SetRange(5,5,5,25,25,25);

   // Create a first PolyLine3D
   TPolyLine3D *pl3d1 = new TPolyLine3D(5);
   pl3d1->SetPoint(0, 10, 10, 10);
   pl3d1->SetPoint(1, 15, 15, 10);
   pl3d1->SetPoint(2, 20, 15, 15);
   pl3d1->SetPoint(3, 20, 20, 20);
   pl3d1->SetPoint(4, 10, 10, 20);

   // Create a first PolyMarker3D
   TPolyMarker3D *pm3d1 = new TPolyMarker3D(12);
   pm3d1->SetPoint(0, 10, 10, 10);
   pm3d1->SetPoint(1, 11, 15, 11);
   pm3d1->SetPoint(2, 12, 15, 9);
   pm3d1->SetPoint(3, 13, 17, 20);
   pm3d1->SetPoint(4, 14, 16, 15);
   pm3d1->SetPoint(5, 15, 20, 15);
   pm3d1->SetPoint(6, 16, 18, 10);
   pm3d1->SetPoint(7, 17, 15, 10);
   pm3d1->SetPoint(8, 18, 22, 15);
   pm3d1->SetPoint(9, 19, 28, 25);
   pm3d1->SetPoint(10, 20, 12, 15);
   pm3d1->SetPoint(11, 21, 12, 15);
   pm3d1->SetMarkerSize(2);
   pm3d1->SetMarkerColor(4);
   pm3d1->SetMarkerStyle(2);

   // Draw
   pl3d1->Draw();
   pm3d1->Draw();
}
End_Macro

Begin_Html
Several coordinate systems are available:
<ul>
<li> Cartesian
<li> Polar
<li> Cylindrical
<li> Spherical
<li> PseudoRapidity/Phi
</ul>
End_Html */


//______________________________________________________________________________
TView3D::TView3D() :TView()
{
   // Default constructor

   fSystem = 0;
   fOutline = 0;
   fDefaultOutline = kFALSE;
   fAutoRange      = kFALSE;
   fChanged        = kFALSE;

   fPsi = 0;
   Int_t i;
   for (i = 0; i < 3; i++) {
      fRmin[i] = 0;
      fRmax[i] = 1;
      fX1[i] = fX2[i] = fY1[i] = fY2[i] = fZ1[i] = fZ2[i] = 0;
   }

   if (gPad) {
      fLongitude = -90 - gPad->GetPhi();
      fLatitude  =  90 - gPad->GetTheta();
   } else {
      fLongitude = 0;
      fLatitude  = 0;
   }
   Int_t irep = 1;
   ResetView(fLongitude, fLatitude, fPsi, irep);
}


//______________________________________________________________________________
TView3D::TView3D(Int_t system, const Double_t *rmin, const Double_t *rmax) : TView()
{
   // TView3D constructor
   //
   //  Creates a 3-D view in the current pad
   //  rmin[3], rmax[3] are the limits of the object depending on
   //  the selected coordinate system
   //
   //  Before drawing a 3-D object in a pad, a 3-D view must be created.
   //  Note that a view is automatically created when drawing legos or surfaces.
   //
   //  The coordinate system is selected via system:
   //   system = 1  Cartesian
   //   system = 2  Polar
   //   system = 3  Cylindrical
   //   system = 4  Spherical
   //   system = 5  PseudoRapidity/Phi

   Int_t irep;

   SetBit(kMustCleanup);

   fSystem = system;
   fOutline = 0;
   fDefaultOutline = kFALSE;
   fAutoRange      = kFALSE;
   fChanged        = kFALSE;

   if (system == kCARTESIAN || system == kPOLAR || system == 11) fPsi = 0;
   else fPsi = 90;

   // By default pad range in 3-D view is (-1,-1,1,1), so ...
   if (gPad) gPad->Range(-1, -1, 1, 1);
   fAutoRange      = kFALSE;

   Int_t i;
   for (i = 0; i < 3; i++) {
      if (rmin) fRmin[i] = rmin[i];
      else      fRmin[i] = 0;
      if (rmax) fRmax[i] = rmax[i];
      else      fRmax[i] = 1;
      fX1[i] = fX2[i] = fY1[i] = fY2[i] = fZ1[i] = fZ2[i] = 0;
   }

   if (gPad) {
      fLongitude = -90 - gPad->GetPhi();
      fLatitude  =  90 - gPad->GetTheta();
   } else {
      fLongitude = 0;
      fLatitude  = 0;
   }
   ResetView(fLongitude, fLatitude, fPsi, irep);

   if (gPad) gPad->SetView(this);
   if (system == 11) SetPerspective();
}


//______________________________________________________________________________
TView3D::TView3D(const TView3D& tv)
  :TView(tv),
   fLatitude(tv.fLatitude),
   fLongitude(tv.fLongitude),
   fPsi(tv.fPsi),
   fDview(tv.fDview),
   fDproj(tv.fDproj),
   fUpix(tv.fUpix),
   fVpix(tv.fVpix),
   fSystem(tv.fSystem),
   fOutline(tv.fOutline),
   fDefaultOutline(tv.fDefaultOutline),
   fAutoRange(tv.fAutoRange),
   fChanged(tv.fChanged)
{
   // Copy constructor.

   for (Int_t i=0; i<16; i++) {
      fTN[i]=tv.fTN[i];
      fTB[i]=tv.fTB[i];
      fTnorm[i]=tv.fTnorm[i];
      fTback[i]=tv.fTback[i];
   }
   for(Int_t i=0; i<3; i++) {
      fRmax[i]=tv.fRmax[i];
      fRmin[i]=tv.fRmin[i];
      fX1[i]=tv.fX1[i];
      fX2[i]=tv.fX2[i];
      fY1[i]=tv.fY1[i];
      fY2[i]=tv.fY2[i];
      fZ1[i]=tv.fZ1[i];
      fZ2[i]=tv.fZ2[i];
   }
   for(Int_t i=0; i<4; i++)
      fUVcoord[i]=tv.fUVcoord[i];
}


//______________________________________________________________________________
TView3D& TView3D::operator=(const TView3D& tv)
{
   // Assignment operator.

   if (this!=&tv) {
      TView::operator=(tv);
      fLatitude=tv.fLatitude;
      fLongitude=tv.fLongitude;
      fPsi=tv.fPsi;
      fDview=tv.fDview;
      fDproj=tv.fDproj;
      fUpix=tv.fUpix;
      fVpix=tv.fVpix;
      fSystem=tv.fSystem;
      fOutline=tv.fOutline;
      fDefaultOutline=tv.fDefaultOutline;
      fAutoRange=tv.fAutoRange;
      fChanged=tv.fChanged;
      for(Int_t i=0; i<16; i++) {
         fTN[i]=tv.fTN[i];
         fTB[i]=tv.fTB[i];
         fTnorm[i]=tv.fTnorm[i];
         fTback[i]=tv.fTback[i];
      }
      for(Int_t i=0; i<3; i++) {
         fRmax[i]=tv.fRmax[i];
         fRmin[i]=tv.fRmin[i];
         fX1[i]=tv.fX1[i];
         fX2[i]=tv.fX2[i];
         fY1[i]=tv.fY1[i];
         fY2[i]=tv.fY2[i];
         fZ1[i]=tv.fZ1[i];
         fZ2[i]=tv.fZ2[i];
      }
      for(Int_t i=0; i<4; i++)
         fUVcoord[i]=tv.fUVcoord[i];
   }
   return *this;
}


//______________________________________________________________________________
TView3D::~TView3D()
{
   // TView3D default destructor.

   if (fOutline) fOutline->Delete();
   delete fOutline;
   fOutline = 0;
}


//______________________________________________________________________________
void TView3D::AxisVertex(Double_t ang, Double_t *av, Int_t &ix1, Int_t &ix2, Int_t &iy1, Int_t &iy2, Int_t &iz1, Int_t &iz2)
{
   // Define axis vertices.
   //
   //    Input  ANG     - angle between X and Y axis
   //
   //    Output: AV(3,8) - axis vertices
   //            IX1     - 1st point of X-axis
   //            IX2     - 2nd point of X-axis
   //            IY1     - 1st point of Y-axis
   //            IY2     - 2nd point of Y-axis
   //            IZ1     - 1st point of Z-axis
   //            IZ2     - 2nd point of Z-axis
   //
   /*
                     8                        6
                    / \                      /|\
                 5 /   \ 7                5 / | \ 7
                  |\   /|                  |  |  |
      THETA < 90  | \6/ |     THETA > 90   | /2\ |
      (Top view)  |  |  |   (Bottom view)  |/   \|
                 1 \ | /3                 1 \   /3
                    \|/                      \ /
                     2                        4
   */

   // Local variables
   Double_t cosa, sina;
   Int_t i, k;
   Double_t p[8]        /* was [2][4] */;
   Int_t i1, i2, i3, i4, ix, iy;
   ix = 0;

   // Parameter adjustments
   av -= 4;

   sina = TMath::Sin(ang*kRad);
   cosa = TMath::Cos(ang*kRad);
   p[0] = fRmin[0];
   p[1] = fRmin[1];
   p[2] = fRmax[0];
   p[3] = fRmin[1];
   p[4] = fRmax[0];
   p[5] = fRmax[1];
   p[6] = fRmin[0];
   p[7] = fRmax[1];
   //*-*-           F I N D   T H E   M O S T   L E F T   P O I N T */
   i1 = 1;
   if (fTN[0] < 0) i1 = 2;
   if (fTN[0]*cosa + fTN[1]*sina < 0) i1 = 5 - i1;

   //*-*-          S E T   O T H E R   P O I N T S */
   i2 = i1 % 4 + 1;
   i3 = i2 % 4 + 1;
   i4 = i3 % 4 + 1;

   //*-*-          S E T   A X I S   V E R T I X E S */
   av[4] = p[(i1 << 1) - 2];
   av[5] = p[(i1 << 1) - 1];
   av[7] = p[(i2 << 1) - 2];
   av[8] = p[(i2 << 1) - 1];
   av[10] = p[(i3 << 1) - 2];
   av[11] = p[(i3 << 1) - 1];
   av[13] = p[(i4 << 1) - 2];
   av[14] = p[(i4 << 1) - 1];
   for (i = 1; i <= 4; ++i) {
      av[i*3 +  3] = fRmin[2];
      av[i*3 + 13] = av[i*3 + 1];
      av[i*3 + 14] = av[i*3 + 2];
      av[i*3 + 15] = fRmax[2];
   }

   //*-*-          S E T   A X I S

   if (av[4] == av[7]) ix = 2;
   if (av[5] == av[8]) ix = 1;
   iy = 3 - ix;
   //*-*-          X - A X I S
   ix1 = ix;
   if (av[ix*3 + 1] > av[(ix + 1)*3 + 1])      ix1 = ix + 1;
   ix2 = (ix << 1) - ix1 + 1;
   //*-*-          Y - A X I S
   iy1 = iy;
   if (av[iy*3 + 2] > av[(iy + 1)*3 + 2])      iy1 = iy + 1;
   iy2 = (iy << 1) - iy1 + 1;
   //*-*-          Z - A X I S
   iz1 = 1;
   iz2 = 5;

   if (fTN[10] >= 0)   return;
   k = (ix1 - 1)*3 + ix2;
   if (k%2) return;
   if (k == 2) {
      ix1 = 4;
      ix2 = 3;
   }
   if (k == 4) {
      ix1 = 3;
      ix2 = 4;
   }
   if (k == 6) {
      ix1 = 1;
      ix2 = 4;
   }
   if (k == 8) {
      ix1 = 4;
      ix2 = 1;
   }

   k = (iy1 - 1)*3 + iy2;
   if (k%2) return;
   if (k == 2) {
      iy1 = 4;
      iy2 = 3;
      return;
   }
   if (k == 4) {
      iy1 = 3;
      iy2 = 4;
      return;
   }
   if (k == 6) {
      iy1 = 1;
      iy2 = 4;
      return;
   }
   if (k == 8) {
      iy1 = 4;
      iy2 = 1;
   }
}


//______________________________________________________________________________
void TView3D::DefinePerspectiveView()
{
   // Define perspective view.
   //
   // Compute transformation matrix from world coordinates
   // to normalised coordinates (-1 to +1)
   //   Input :
   //      theta, phi - spherical angles giving the direction of projection
   //      psi - screen rotation angle
   //      cov[3] - center of view
   //      dview - distance from COV to COP (center of projection)
   //      umin, umax, vmin, vmax - view window in projection plane
   //      dproj - distance from COP to projection plane
   //      bcut, fcut - backward/forward range w.r.t projection plane (fcut<=0)
   //   Output :
   //      nper[16] - normalizing transformation
   // compute tr+rot to get COV in origin, view vector parallel to -Z axis, up
   // vector parallel to Y.
   /*
                         ^Yv   UP ^  proj. plane
                        |        |   /|
                       |        |  /  |
                      |   dproj  /  x--- center of window (COW)
                 COV |----------|--x--|------------> Zv
                              /           | VRP'z
                       /   --->      |  /
                /     VPN       |/
               Xv
   */
   //   1 - translate COP to origin of MARS : Tper = T(-copx, -copy, -copz)
   //   2 - rotate VPN : R = Rz(-psi)*Rx(-theta)*Rz(-phi) (inverse Euler)
   //   3 - left-handed screen reference to right-handed one of MARS : Trl
   //
   //   T12 = Tper*R*Trl

   Double_t t12[16];
   Double_t cov[3];
   Int_t i;
   for (i=0; i<3; i++) cov[i] = 0.5*(fRmax[i]+fRmin[i]);

   Double_t c1 = TMath::Cos(fPsi*kRad);
   Double_t s1 = TMath::Sin(fPsi*kRad);
   Double_t c2 = TMath::Cos(fLatitude*kRad);
   Double_t s2 = TMath::Sin(fLatitude*kRad);
   Double_t s3 = TMath::Cos(fLongitude*kRad);
   Double_t c3 = -TMath::Sin(fLongitude*kRad);

   t12[0] =  c1*c3 - s1*c2*s3;
   t12[4] =  c1*s3 + s1*c2*c3;
   t12[8] =  s1*s2;
   t12[3] =  0;

   t12[1] =  -s1*c3 - c1*c2*s3;
   t12[5] = -s1*s3 + c1*c2*c3;
   t12[9] =  c1*s2;
   t12[7] =  0;

   t12[2] =  s2*s3;
   t12[6] =  -s2*c3;
   t12[10] = c2;      // contains Trl
   t12[11] =  0;

   // translate with -COP (before rotation):
   t12[12] = -(cov[0]*t12[0]+cov[1]*t12[4]+cov[2]*t12[8]);
   t12[13] = -(cov[0]*t12[1]+cov[1]*t12[5]+cov[2]*t12[9]);
   t12[14] = -(cov[0]*t12[2]+cov[1]*t12[6]+cov[2]*t12[10]);
   t12[15] =  1;

   // translate with (0, 0, -dview) after rotation

   t12[14] -= fDview;

   // reflection on Z :
   t12[2]  *= -1;
   t12[6]  *= -1;
   t12[10] *= -1;
   t12[14] *= -1;

   // Now we shear the center of window from (0.5*(umin+umax), 0.5*(vmin+vmax), dproj)
   //                                     to (0, 0, dproj)

   Double_t a2 = -fUVcoord[0]/fDproj;   // shear coef. on x
   Double_t b2 = -fUVcoord[1]/fDproj;   // shear coef. on y

   //               | 1  0  0  0 |
   //  SHz(a2,b2) = | 0  1  0  0 |
   //               | a2 b2 1  0 |
   //               | 0  0  0  1 |

   fTnorm[0] = t12[0] + a2*t12[2];
   fTnorm[1] = t12[1] + b2*t12[2];
   fTnorm[2] = t12[2];
   fTnorm[3] = 0;

   fTnorm[4] = t12[4] + a2*t12[6];
   fTnorm[5] = t12[5] + b2*t12[6];
   fTnorm[6] = t12[6];
   fTnorm[7] = 0;

   fTnorm[8]  = t12[8] + a2*t12[10];
   fTnorm[9]  = t12[9] + b2*t12[10];
   fTnorm[10] = t12[10];
   fTnorm[11] = 0;

   fTnorm[12] = t12[12] + a2*t12[14];
   fTnorm[13] = t12[13] + b2*t12[14];
   fTnorm[14] = t12[14];
   fTnorm[15] = 1;

   // Scale so that the view volume becomes the canonical one
   //
   // Sper = (2/(umax-umin), 2/(vmax-vmin), 1/dproj
   //
   Double_t sz = 1./fDproj;
   Double_t sx = 1./fUVcoord[2];
   Double_t sy = 1./fUVcoord[3];

   fTnorm[0] *= sx;
   fTnorm[4] *= sx;
   fTnorm[8] *= sx;
   fTnorm[1] *= sy;
   fTnorm[5] *= sy;
   fTnorm[9] *= sy;
   fTnorm[2] *= sz;
   fTnorm[6] *= sz;
   fTnorm[10] *= sz;
   fTnorm[12] *= sx;
   fTnorm[13] *= sy;
   fTnorm[14] *= sz;
}


//______________________________________________________________________________
void TView3D::DefineViewDirection(const Double_t *s, const Double_t *c,
                                Double_t cosphi, Double_t sinphi,
                                Double_t costhe, Double_t sinthe,
                                Double_t cospsi, Double_t sinpsi,
                                Double_t *tnorm, Double_t *tback)
{
   // Define view direction (in spherical coordinates)
   //
   //              Compute transformation matrix from world coordinates
   //              to normalised coordinates (-1 to +1)
   //
   //    Input: S(3)    - scale factors
   //           C(3)    - centre of scope
   //           COSPHI  - longitude COS
   //           SINPHI  - longitude SIN
   //           COSTHE  - latitude COS (angle between +Z and view direc.)
   //           SINTHE  - latitude SIN
   //           COSPSI  - screen plane rotation angle COS
   //           SINPSI  - screen plane rotation angle SIN

   if (IsPerspective()) {
      DefinePerspectiveView();
      return;
   }
   Int_t i, k;
   Double_t tran[16]   /* was [4][4] */, rota[16]      /* was [4][4] */;
   Double_t c1, c2, c3, s1, s2, s3, scalex, scaley, scalez;

   // Parameter adjustments
   tback -= 5;
   tnorm -= 5;

   scalex = s[0];
   scaley = s[1];
   scalez = s[2];

   //*-*-        S E T   T R A N S L A T I O N   M A T R I X
   tran[0] = 1 / scalex;
   tran[1] = 0;
   tran[2] = 0;
   tran[3] = -c[0] / scalex;

   tran[4] = 0;
   tran[5] = 1 / scaley;
   tran[6] = 0;
   tran[7] = -c[1] / scaley;

   tran[8] = 0;
   tran[9] = 0;
   tran[10] = 1 / scalez;
   tran[11] = -c[2] / scalez;

   tran[12] = 0;
   tran[13] = 0;
   tran[14] = 0;
   tran[15] = 1;

   //*-*-        S E T    R O T A T I O N   M A T R I X
   //    ( C(PSI) S(PSI) 0)   (1      0          0 )   ( C(90+PHI) S(90+PHI) 0)
   //    (-S(PSI) C(PSI) 0) * (0  C(THETA) S(THETA)) * (-S(90+PHI) C(90+PHI) 0)
   //    (   0      0    1)   (0 -S(THETA) C(THETA))   (     0           0   1)
   c1 = cospsi;
   s1 = sinpsi;
   c2 = costhe;
   s2 = sinthe;
   c3 = -sinphi;
   s3 = cosphi;

   rota[0] = c1*c3 - s1*c2*s3;
   rota[1] = c1*s3 + s1*c2*c3;
   rota[2] = s1*s2;
   rota[3] = 0;

   rota[4] = -s1*c3 - c1* c2*s3;
   rota[5] = -s1*s3 + c1* c2*c3;
   rota[6] = c1*s2;
   rota[7] = 0;

   rota[8] = s2*s3;
   rota[9] = -s2*c3;
   rota[10] = c2;
   rota[11] = 0;

   rota[12] = 0;
   rota[13] = 0;
   rota[14] = 0;
   rota[15] = 1;

   //*-*-        F I N D   T R A N S F O R M A T I O N   M A T R I X
   for (i = 1; i <= 3; ++i) {
      for (k = 1; k <= 4; ++k) {
         tnorm[k + (i << 2)] = rota[(i << 2) - 4]*tran[k - 1] + rota[(i
                 << 2) - 3]*tran[k + 3] + rota[(i << 2) - 2]*tran[k +7]
                 + rota[(i << 2) - 1]*tran[k + 11];
      }
   }

   //*-*-        S E T   B A C K   T R A N S L A T I O N   M A T R I X
   tran[0] = scalex;
   tran[3] = c[0];

   tran[5] = scaley;
   tran[7] = c[1];

   tran[10] = scalez;
   tran[11] = c[2];

   //*-*-        F I N D   B A C K   T R A N S F O R M A T I O N
   for (i = 1; i <= 3; ++i) {
      for (k = 1; k <= 4; ++k) {
         tback[k + (i << 2)] = tran[(i << 2) - 4]*rota[(k << 2) - 4] +
            tran[(i << 2) - 3]*rota[(k << 2) - 3] + tran[(i << 2) -2]
            *rota[(k << 2) - 2] + tran[(i << 2) - 1]*rota[(k <<2) - 1];
      }
   }
}


//______________________________________________________________________________
void TView3D::DrawOutlineCube(TList *outline, Double_t *rmin, Double_t *rmax)
{
   // Draw the outline of a cube while rotating a 3-d object in the pad.

   TPolyLine3D::DrawOutlineCube(outline,rmin,rmax);
}


//______________________________________________________________________________
void TView3D::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
   // Execute action corresponding to one event.

   ExecuteRotateView(event,px,py);
}


//______________________________________________________________________________
void TView3D::ExecuteRotateView(Int_t event, Int_t px, Int_t py)
{
   // Execute action corresponding to one event.
   //
   //  This member function is called when a object is clicked with the locator
   //
   //  If Left button clicked in the object area, while the button is kept down
   //  the cube representing the surrounding frame for the corresponding
   //  new latitude and longitude position is drawn.

   static Int_t system, framewasdrawn;
   static Double_t xrange, yrange, xmin, ymin, longitude1, latitude1, longitude2, latitude2;
   static Double_t newlatitude, newlongitude, oldlatitude, oldlongitude;
   Double_t dlatitude, dlongitude, x, y;
   Int_t irep = 0;
   Double_t psideg;
   Bool_t opaque  = gPad->OpaqueMoving();

   // All coordinates transformation are from absolute to relative
   if (!gPad->IsEditable()) return;
   gPad->AbsCoordinates(kTRUE);

   switch (event) {

   case kKeyPress :
      fChanged = kTRUE;
      MoveViewCommand(Char_t(px), py);
      break;

   case kMouseMotion:
      gPad->SetCursor(kRotate);
      break;

   case kButton1Down:

      // remember position of the cube
      xmin   = gPad->GetX1();
      ymin   = gPad->GetY1();
      xrange = gPad->GetX2() - xmin;
      yrange = gPad->GetY2() - ymin;
      x      = gPad->PixeltoX(px);
      y      = gPad->PixeltoY(py);
      system = GetSystem();
      framewasdrawn = 0;
      if (system == kCARTESIAN || system == kPOLAR || IsPerspective()) {
         longitude1 = 180*(x-xmin)/xrange;
         latitude1  =  90*(y-ymin)/yrange;
      } else {
         latitude1  =  90*(x-xmin)/xrange;
         longitude1 = 180*(y-ymin)/yrange;
      }
      newlongitude = oldlongitude = -90 - gPad->GetPhi();
      newlatitude  = oldlatitude  =  90 - gPad->GetTheta();
      psideg       = GetPsi();

      // if outline isn't set, make it look like a cube
      if(!fOutline)
         SetOutlineToCube();
      break;

   case kButton1Motion:
   {
      // draw the surrounding frame for the current mouse position
      // first: Erase old frame
      fChanged = kTRUE;
      if (framewasdrawn && !opaque) fOutline->Paint();
      framewasdrawn = 1;
      x = gPad->PixeltoX(px);
      y = gPad->PixeltoY(py);
      if (system == kCARTESIAN || system == kPOLAR || IsPerspective()) {
         longitude2 = 180*(x-xmin)/xrange;
         latitude2  =  90*(y-ymin)/yrange;
      } else {
         latitude2  =  90*(x-xmin)/xrange;
         longitude2 = 180*(y-ymin)/yrange;
      }
      dlongitude   = longitude2   - longitude1;
      dlatitude    = latitude2    - latitude1;
      newlatitude  = oldlatitude  + dlatitude;
      newlongitude = oldlongitude - dlongitude;
      psideg       = GetPsi();
      ResetView(newlongitude, newlatitude, psideg, irep);
      if (!opaque) {
         fOutline->Paint();
      } else {
         psideg = GetPsi();
         SetView(newlongitude, newlatitude, psideg, irep);
         gPad->SetPhi(-90-newlongitude);
         gPad->SetTheta(90-newlatitude);
         gPad->Modified(kTRUE);
      }

      break;
   }
   case kButton1Up:
      if (gROOT->IsEscaped()) {
         gROOT->SetEscape(kFALSE);
         if (opaque) {
            psideg = GetPsi();
            SetView(oldlongitude, oldlatitude, psideg, irep);
            gPad->SetPhi(-90-oldlongitude);
            gPad->SetTheta(90-oldlatitude);
            gPad->Modified(kTRUE);
         }
         break;
      }

      // Temporary fix for 2D drawing problems on pad. fOutline contains
      // a TPolyLine3D object for the rotation box. This will be painted
      // through a newly created TView3Der3DPad instance, which is left
      // behind on pad. This remaining creates 2D drawing problems.
      //
      // This is a TEMPORARY fix - will be removed when proper multiple viewers
      // on pad problems are resolved.
      if (gPad) {
         TVirtualViewer3D *viewer = gPad->GetViewer3D();
         if (viewer && !strcmp(viewer->IsA()->GetName(),"TView3Der3DPad")) {
            gPad->ReleaseViewer3D();
            delete viewer;
         }
      }
      // End fix

      // Recompute new view matrix and redraw
      psideg = GetPsi();
      SetView(newlongitude, newlatitude, psideg, irep);
      gPad->SetPhi(-90-newlongitude);
      gPad->SetTheta(90-newlatitude);
      gPad->Modified(kTRUE);

      // Set line color, style and width
      gVirtualX->SetLineColor(-1);
      gVirtualX->SetLineStyle(-1);
      gVirtualX->SetLineWidth(-1);
      break;
   }

   // set back to default transformation mode
   gPad->AbsCoordinates(kFALSE);
}


//______________________________________________________________________________
void TView3D::FindNormal(Double_t x, Double_t  y, Double_t z, Double_t &zn)
{
   // Find Z component of NORMAL in normalized coordinates.
   //
   //    Input: X - X-component of NORMAL
   //           Y - Y-component of NORMAL
   //           Z - Z-component of NORMAL
   //
   //    Output: ZN - Z-component of NORMAL in normalized coordinates

   zn = x*(fTN[1] * fTN[6] - fTN[2] * fTN[5]) + y*(fTN[2] * fTN[4] -
           fTN[0] * fTN[6]) + z*(fTN[0] * fTN[5] - fTN[1] * fTN[4]);
}


//______________________________________________________________________________
void TView3D::FindPhiSectors(Int_t iopt, Int_t &kphi, Double_t *aphi, Int_t &iphi1, Int_t &iphi2)
{
   // Find critical PHI sectors.
   //
   //    Input: IOPT    - options: 1 - from BACK to FRONT 'BF'
   //                              2 - from FRONT to BACK 'FB'
   //           KPHI    - number of phi sectors
   //           APHI(*) - PHI separators (modified internally)
   //
   //    Output: IPHI1  - initial sector
   //            IPHI2  - final sector

   Int_t iphi[2], i, k;
   Double_t dphi;
   Double_t x1, x2, z1, z2, phi1, phi2;

   // Parameter adjustments
   --aphi;

   if (aphi[kphi + 1] == aphi[1]) aphi[kphi + 1] += 360;
   dphi = TMath::Abs(aphi[kphi + 1] - aphi[1]);
   if (dphi != 360) {
      aphi[kphi + 2] = (aphi[1] + aphi[kphi + 1]) / (float)2. + 180;
      aphi[kphi + 3] = aphi[1] + 360;
      kphi += 2;
   }

   //*-*-       F I N D   C R I T I C A L   S E C T O R S
   k = 0;
   for (i = 1; i <= kphi; ++i) {
      phi1 = kRad*aphi[i];
      phi2 = kRad*aphi[i + 1];
      x1 = fTN[0]*TMath::Cos(phi1) + fTN[1]*TMath::Sin(phi1);
      x2 = fTN[0]*TMath::Cos(phi2) + fTN[1]*TMath::Sin(phi2);
      if (x1 >= 0 && x2 > 0) continue;
      if (x1 <= 0 && x2 < 0) continue;
      ++k;
      if (k == 3) break;
      iphi[k - 1] = i;
   }
   if (k != 2) {
      Error("FindPhiSectors", "something strange: num. of critical sector not equal 2");
      iphi1 = 1;
      iphi2 = 2;
      return;
   }

   //*-*-       F I N D   O R D E R   O F   C R I T I C A L   S E C T O R S
   phi1 = kRad*(aphi[iphi[0]] + aphi[iphi[0] + 1]) / (float)2.;
   phi2 = kRad*(aphi[iphi[1]] + aphi[iphi[1] + 1]) / (float)2.;
   z1 = fTN[8]*TMath::Cos(phi1) + fTN[9]*TMath::Sin(phi1);
   z2 = fTN[8]*TMath::Cos(phi2) + fTN[9]*TMath::Sin(phi2);
   if ((z1 <= z2 && iopt == 1) || (z1 > z2 && iopt == 2)) {
      iphi1 = iphi[0];
      iphi2 = iphi[1];
   } else {
      iphi1 = iphi[1];
      iphi2 = iphi[0];
   }
}


//______________________________________________________________________________
void TView3D::FindThetaSectors(Int_t iopt, Double_t phi, Int_t &kth, Double_t *ath, Int_t &ith1, Int_t &ith2)
{
   // Find critical THETA sectors for given PHI sector.
   //
   //    Input: IOPT        - options: 1 - from BACK to FRONT 'BF'
   //                                  2 - from FRONT to BACK 'FB'
   //           PHI         - PHI sector
   //           KTH         - number of THETA sectors
   //           ATH(*)      - THETA separators (modified internally)
   //
   //    Output: ITH1  - initial sector
   //            ITH2  - final sector

   Int_t i, k, ith[2];
   Double_t z1, z2, cosphi, sinphi, tncons, th1, th2, dth;

   // Parameter adjustments
   --ath;

   // Function Body
   dth = TMath::Abs(ath[kth + 1] - ath[1]);
   if (dth != 360) {
      ath[kth + 2] = 0.5*(ath[1] + ath[kth + 1]) + 180;
      ath[kth + 3] = ath[1] + 360;
      kth += 2;
   }

   //*-*-       F I N D   C R I T I C A L   S E C T O R S
   cosphi = TMath::Cos(phi*kRad);
   sinphi = TMath::Sin(phi*kRad);
   k = 0;
   for (i = 1; i <= kth; ++i) {
      th1 = kRad*ath[i];
      th2 = kRad*ath[i + 1];
      FindNormal(TMath::Cos(th1)*cosphi, TMath::Cos(th1)*sinphi, -TMath::Sin(th1), z1);
      FindNormal(TMath::Cos(th2)*cosphi, TMath::Cos(th2)*sinphi, -TMath::Sin(th2), z2);
      if (z1 >= 0 && z2 > 0) continue;
      if (z1 <= 0 && z2 < 0) continue;
      ++k;
      if (k == 3) break;
      ith[k - 1] = i;
   }
   if (k != 2) {
      Error("FindThetaSectors", "Something strange: num. of critical sectors not equal 2");
      ith1 = 1;
      ith2 = 2;
      return;
   }

   //*-*-       F I N D   O R D E R   O F   C R I T I C A L   S E C T O R S
   tncons = fTN[8]*TMath::Cos(phi*kRad) + fTN[9]*TMath::Sin(phi*kRad);
   th1    = kRad*(ath[ith[0]] + ath[ith[0] + 1]) / (float)2.;
   th2    = kRad*(ath[ith[1]] + ath[ith[1] + 1]) / (float)2.;
   z1     = tncons*TMath::Sin(th1) + fTN[10]*TMath::Cos(th1);
   z2     = tncons*TMath::Sin(th2) + fTN[10]*TMath::Cos(th2);
   if ((z1 <= z2 && iopt == 1) || (z1 > z2 && iopt == 2)) {
      ith1 = ith[0];
      ith2 = ith[1];
   } else {
      ith1 = ith[1];
      ith2 = ith[0];
   }
}


//______________________________________________________________________________
void TView3D::FindScope(Double_t *scale, Double_t *center, Int_t &irep)
{
   // Find centre of a MIN-MAX scope and scale factors
   //
   //    Output: SCALE(3)  - scale factors
   //            CENTER(3) - centre
   //            IREP      - reply (-1 if error in min-max)

   irep = 0;
   Double_t sqrt3 = 0.5*TMath::Sqrt(3.0);

   for (Int_t i = 0; i < 3; i++) {
      if (fRmin[i] >= fRmax[i]) { irep = -1; return;}
      scale[i]  = sqrt3*(fRmax[i] - fRmin[i]);
      center[i] = 0.5*(fRmax[i] + fRmin[i]);
   }
}


//______________________________________________________________________________
Int_t TView3D::GetDistancetoAxis(Int_t axis, Int_t px, Int_t py, Double_t &ratio)
{
   // Return distance to axis from point px,py.
   //
   //  Algorithm:
   /*
       A(x1,y1)         P                             B(x2,y2)
       ------------------------------------------------
                        I
                        I
                        I
                        I
                       M(x,y)
   */
   //  Let us call  a = distance AM     A=a**2
   //               b = distance BM     B=b**2
   //               c = distance AB     C=c**2
   //               d = distance PM     D=d**2
   //               u = distance AP     U=u**2
   //               v = distance BP     V=v**2     c = u + v
   //
   //  D = A - U
   //  D = B - V  = B -(c-u)**2
   //     ==> u = (A -B +C)/2c

   Double_t x1,y1,x2,y2;
   Double_t x     = px;
   Double_t y     = py;
   ratio = 0;

   if (fSystem != 1) return 9998; // only implemented for Cartesian coordinates
   if (axis == 1) {
      x1 = gPad->XtoAbsPixel(fX1[0]);
      y1 = gPad->YtoAbsPixel(fX1[1]);
      x2 = gPad->XtoAbsPixel(fX2[0]);
      y2 = gPad->YtoAbsPixel(fX2[1]);
   } else if (axis == 2) {
      x1 = gPad->XtoAbsPixel(fY1[0]);
      y1 = gPad->YtoAbsPixel(fY1[1]);
      x2 = gPad->XtoAbsPixel(fY2[0]);
      y2 = gPad->YtoAbsPixel(fY2[1]);
   } else {
      x1 = gPad->XtoAbsPixel(fZ1[0]);
      y1 = gPad->YtoAbsPixel(fZ1[1]);
      x2 = gPad->XtoAbsPixel(fZ2[0]);
      y2 = gPad->YtoAbsPixel(fZ2[1]);
   }
   Double_t xx1   = x  - x1;
   Double_t xx2   = x  - x2;
   Double_t x1x2  = x1 - x2;
   Double_t yy1   = y  - y1;
   Double_t yy2   = y  - y2;
   Double_t y1y2  = y1 - y2;
   Double_t a     = xx1*xx1   + yy1*yy1;
   Double_t b     = xx2*xx2   + yy2*yy2;
   Double_t c     = x1x2*x1x2 + y1y2*y1y2;
   if (c <= 0) return 9999;
   Double_t v     = TMath::Sqrt(c);
   Double_t u     = (a - b + c)/(2*v);
   Double_t d     = TMath::Abs(a - u*u);

   Int_t dist = Int_t(TMath::Sqrt(d) - 0.5);
   ratio = u/v;
   return dist;
}


//______________________________________________________________________________
Double_t TView3D::GetExtent() const
{
   // Get maximum view extent.

   Double_t dx = 0.5*(fRmax[0]-fRmin[0]);
   Double_t dy = 0.5*(fRmax[1]-fRmin[1]);
   Double_t dz = 0.5*(fRmax[2]-fRmin[2]);
   Double_t extent = TMath::Sqrt(dx*dx+dy*dy+dz*dz);
   return extent;
}


//______________________________________________________________________________
void TView3D::GetRange(Float_t *min, Float_t *max)
{
   // Get Range function.

   for (Int_t i = 0; i < 3; max[i] = fRmax[i], min[i] = fRmin[i], i++) { }
}


//______________________________________________________________________________
void TView3D::GetRange(Double_t *min, Double_t *max)
{
   // Get Range function.

   for (Int_t i = 0; i < 3; max[i] = fRmax[i], min[i] = fRmin[i], i++) { }
}


//______________________________________________________________________________
void TView3D::GetWindow(Double_t &u0, Double_t &v0, Double_t &du, Double_t &dv) const
{
   // Get current window extent.

   u0 = fUVcoord[0];
   v0 = fUVcoord[1];
   du = fUVcoord[2];
   dv = fUVcoord[3];
}


//______________________________________________________________________________
Bool_t TView3D::IsClippedNDC(Double_t *p) const
{
   // Check if point is clipped in perspective view.

   if (TMath::Abs(p[0])>p[2]) return kTRUE;
   if (TMath::Abs(p[1])>p[2]) return kTRUE;
   return kFALSE;
}


//______________________________________________________________________________
void TView3D::NDCtoWC(const Float_t* pn, Float_t* pw)
{
   // Transfer point from normalized to world coordinates.
   //
   //    Input: PN(3) - point in world coordinate system
   //           PW(3) - point in normalized coordinate system

   pw[0] = fTback[0]*pn[0] + fTback[1]*pn[1] + fTback[2]*pn[2]  + fTback[3];
   pw[1] = fTback[4]*pn[0] + fTback[5]*pn[1] + fTback[6]*pn[2]  + fTback[7];
   pw[2] = fTback[8]*pn[0] + fTback[9]*pn[1] + fTback[10]*pn[2] + fTback[11];
}


//______________________________________________________________________________
void TView3D::NDCtoWC(const Double_t* pn, Double_t* pw)
{
   // Transfer point from normalized to world coordinates.
   //
   //    Input: PN(3) - point in world coordinate system
   //           PW(3) - point in normalized coordinate system

   pw[0] = fTback[0]*pn[0] + fTback[1]*pn[1] + fTback[2]*pn[2]  + fTback[3];
   pw[1] = fTback[4]*pn[0] + fTback[5]*pn[1] + fTback[6]*pn[2]  + fTback[7];
   pw[2] = fTback[8]*pn[0] + fTback[9]*pn[1] + fTback[10]*pn[2] + fTback[11];
}


//______________________________________________________________________________
void TView3D::NormalWCtoNDC(const Float_t *pw, Float_t *pn)
{
   // Transfer vector of NORMAL from word to normalized coordinates.
   //
   //    Input: PW(3) - vector of NORMAL in word coordinate system
   //           PN(3) - vector of NORMAL in normalized coordinate system

   Double_t x, y, z, a1, a2, a3, b1, b2, b3, c1, c2, c3;

   x = pw[0];
   y = pw[1];
   z = pw[2];
   a1 = fTnorm[0];
   a2 = fTnorm[1];
   a3 = fTnorm[2];
   b1 = fTnorm[4];
   b2 = fTnorm[5];
   b3 = fTnorm[6];
   c1 = fTnorm[8];
   c2 = fTnorm[9];
   c3 = fTnorm[10];
   pn[0] = x*(b2*c3 - b3*c2) + y*(b3*c1 - b1*c3) + z*(b1*c2 - b2*c1);
   pn[1] = x*(c2*a3 - c3*a2) + y*(c3*a1 - c1*a3) + z*(c1*a2 - c2*a1);
   pn[2] = x*(a2*b3 - a3*b2) + y*(a3*b1 - a1*b3) + z*(a1*b2 - a2*b1);
}


//______________________________________________________________________________
void TView3D::NormalWCtoNDC(const Double_t *pw, Double_t *pn)
{
   // Transfer vector of NORMAL from word to normalized coordinates.
   //
   //    Input: PW(3) - vector of NORMAL in word coordinate system
   //           PN(3) - vector of NORMAL in normalized coordinate system

   Double_t x, y, z, a1, a2, a3, b1, b2, b3, c1, c2, c3;

   x = pw[0];
   y = pw[1];
   z = pw[2];
   a1 = fTnorm[0];
   a2 = fTnorm[1];
   a3 = fTnorm[2];
   b1 = fTnorm[4];
   b2 = fTnorm[5];
   b3 = fTnorm[6];
   c1 = fTnorm[8];
   c2 = fTnorm[9];
   c3 = fTnorm[10];
   pn[0] = x*(b2*c3 - b3*c2) + y*(b3*c1 - b1*c3) + z*(b1*c2 - b2*c1);
   pn[1] = x*(c2*a3 - c3*a2) + y*(c3*a1 - c1*a3) + z*(c1*a2 - c2*a1);
   pn[2] = x*(a2*b3 - a3*b2) + y*(a3*b1 - a1*b3) + z*(a1*b2 - a2*b1);
}


//______________________________________________________________________________
void TView3D::PadRange(Int_t rback)
{
   // Set the correct window size for lego and surface plots.
   //
   //  Set the correct window size for lego and surface plots.
   //  And draw the background if necessary.
   //
   //    Input parameters:
   //
   //   RBACK : Background colour

   Int_t i, k;
   Double_t x, y, z, r1, r2, r3, xx, yy, smax[2];
   Double_t xgraf[6], ygraf[6];

   for (i = 1; i <= 2; ++i) {
      smax[i - 1] = fTnorm[(i << 2) - 1];
      for (k = 1; k <= 3; ++k) {
         if (fTnorm[k + (i << 2) - 5] < 0) {
            smax[i - 1] += fTnorm[k + (i << 2) - 5]*fRmin[k-1];
         } else {
            smax[i - 1] += fTnorm[k + (i << 2) - 5]*fRmax[k-1];
         }
      }
   }

   //*-*- Compute x,y range
   Double_t xmin = -smax[0];
   Double_t xmax = smax[0];
   Double_t ymin = -smax[1];
   Double_t ymax = smax[1];
   Double_t dx   = xmax-xmin;
   Double_t dy   = ymax-ymin;
   Double_t dxr  = dx/(1 - gPad->GetLeftMargin() - gPad->GetRightMargin());
   Double_t dyr  = dy/(1 - gPad->GetBottomMargin() - gPad->GetTopMargin());

   // Range() could change the size of the pad pixmap and therefore should
   // be called before the other paint routines
   gPad->Range(xmin - dxr*gPad->GetLeftMargin(),
      ymin - dyr*gPad->GetBottomMargin(),
      xmax + dxr*gPad->GetRightMargin(),
      ymax + dyr*gPad->GetTopMargin());
   gPad->RangeAxis(xmin, ymin, xmax, ymax);

   //*-*-             Draw the background if necessary
   if (rback > 0) {
      r1 = -1;
      r2 = -1;
      r3 = -1;
      xgraf[0] = -smax[0];
      xgraf[1] = -smax[0];
      xgraf[2] = -smax[0];
      xgraf[3] = -smax[0];
      xgraf[4] =  smax[0];
      xgraf[5] =  smax[0];
      ygraf[0] = -smax[1];
      ygraf[1] =  smax[1];
      ygraf[2] = -smax[1];
      ygraf[3] =  smax[1];
      ygraf[5] =  smax[1];
      ygraf[4] = -smax[1];
      for (i = 1; i <= 8; ++i) {
         x = 0.5*((1 - r1)*fRmin[0] + (r1 + 1)*fRmax[0]);
         y = 0.5*((1 - r2)*fRmin[1] + (r2 + 1)*fRmax[1]);
         z = 0.5*((1 - r3)*fRmin[2] + (r3 + 1)*fRmax[2]);
         xx = fTnorm[0]*x + fTnorm[1]*y + fTnorm[2]*z + fTnorm[3];
         yy = fTnorm[4]*x + fTnorm[5]*y + fTnorm[6]*z + fTnorm[7];
         if (TMath::Abs(xx - xgraf[1]) <= 1e-4) {
            if (ygraf[1] >= yy) ygraf[1] = yy;
            if (ygraf[2] <= yy) ygraf[2] = yy;
         }
         if (TMath::Abs(xx - xgraf[5]) <= 1e-4) {
            if (ygraf[5] >= yy) ygraf[5] = yy;
            if (ygraf[4] <= yy) ygraf[4] = yy;
         }
         if (TMath::Abs(yy - ygraf[0]) <= 1e-4) xgraf[0] = xx;
         if (TMath::Abs(yy - ygraf[3]) <= 1e-4) xgraf[3] = xx;
         r1 = -r1;
         if (i % 2 == 0) r2 = -r2;
         if (i >= 4)     r3 = 1;
      }
      gPad->PaintFillArea(6, xgraf, ygraf);
   }
}


//______________________________________________________________________________
void  TView3D::SetAxisNDC(const Double_t *x1, const Double_t *x2, const Double_t *y1, const Double_t *y2, const Double_t *z1, const Double_t *z2)
{
   // Store axis coordinates in the NDC system.

   for (Int_t i=0;i<3;i++) {
      fX1[i] = x1[i];
      fX2[i] = x2[i];
      fY1[i] = y1[i];
      fY2[i] = y2[i];
      fZ1[i] = z1[i];
      fZ2[i] = z2[i];
   }
}


//______________________________________________________________________________
void TView3D::SetDefaultWindow()
{
   // Set default viewing window.

   if (!gPad) return;
   Double_t screen_factor = 1.;
   Double_t du, dv;
   Double_t extent = GetExtent();
   fDview = 3*extent;
   fDproj = 0.5*extent;

   // widh in pixels
   fUpix = gPad->GetWw()*gPad->GetAbsWNDC();

   // height in pixels
   fVpix = gPad->GetWh()*gPad->GetAbsHNDC();
   du = 0.5*screen_factor*fDproj;
   dv = du*fVpix/fUpix;   // keep aspect ratio
   SetWindow(0, 0, du, dv);
}


//______________________________________________________________________________
void TView3D::SetOutlineToCube()
{
   // This is a function which creates default outline.
   //
   //      x = fRmin[0]        X = fRmax[0]
   //      y = fRmin[1]        Y = fRmax[1]
   //      z = fRmin[2]        Z = fRmax[2]
   /*

               (x,Y,Z) +---------+ (X,Y,Z)
                      /         /|
                     /         / |
                    /         /  |
           (x,y,Z) +---------+   |
                   |         |   + (X,Y,z)
                   |         |  /
                   |         | /
                   |         |/
                   +---------+
                (x,y,z)   (X,y,z)
   */

   if (!fOutline) {
      fDefaultOutline = kTRUE;
      fOutline = new TList();
   }
   DrawOutlineCube((TList*)fOutline,fRmin,fRmax);
}


//______________________________________________________________________________
void TView3D::SetParallel()
{
   // Set the parallel option (default).

   if (!IsPerspective()) return;
   SetBit(kPerspective, kFALSE);
   Int_t irep;
   ResetView(fLongitude, fLatitude, fPsi, irep);
}


//______________________________________________________________________________
void TView3D::SetPerspective()
{
   // Set perspective option.

   if (IsPerspective()) return;
   SetBit(kPerspective, kTRUE);
   Int_t irep;
   SetDefaultWindow();
   ResetView(fLongitude, fLatitude, fPsi, irep);
}


//______________________________________________________________________________
void TView3D::SetRange(const Double_t *min, const Double_t *max)
{
   // Set Range function.

   Int_t irep;
   for (Int_t i = 0; i < 3; fRmax[i] = max[i], fRmin[i] = min[i], i++) { }
   if (IsPerspective()) SetDefaultWindow();
   ResetView(fLongitude, fLatitude, fPsi, irep);
   if(irep < 0)
      Error("SetRange", "problem setting view");
   if(fDefaultOutline) SetOutlineToCube();
}


//______________________________________________________________________________
void TView3D::SetRange(Double_t x0, Double_t y0, Double_t z0, Double_t x1, Double_t y1, Double_t z1, Int_t flag)
{
   // Set 3-D View range.
   //
   // Input:  x0, y0, z0 are minimum coordinates
   //         x1, y1, z1 are maximum coordinates
   //
   //         flag values are: 0 (set always) <- default
   //                          1 (shrink view)
   //                          2 (expand view)
   //

   Double_t rmax[3], rmin[3];

   switch (flag) {
      case 2:                     // expand view
         GetRange(rmin, rmax);
         rmin[0] = x0 < rmin[0] ? x0 : rmin[0];
         rmin[1] = y0 < rmin[1] ? y0 : rmin[1];
         rmin[2] = z0 < rmin[2] ? z0 : rmin[2];
         rmax[0] = x1 > rmax[0] ? x1 : rmax[0];
         rmax[1] = y1 > rmax[1] ? y1 : rmax[1];
         rmax[2] = z1 > rmax[2] ? z1 : rmax[2];
         break;

      case 1:                     // shrink view
         GetRange(rmin, rmax);
         rmin[0] = x0 > rmin[0] ? x0 : rmin[0];
         rmin[1] = y0 > rmin[1] ? y0 : rmin[1];
         rmin[2] = z0 > rmin[2] ? z0 : rmin[2];
         rmax[0] = x1 < rmax[0] ? x1 : rmax[0];
         rmax[1] = y1 < rmax[1] ? y1 : rmax[1];
         rmax[2] = z1 < rmax[2] ? z1 : rmax[2];
         break;

      default:
         rmin[0] = x0; rmax[0] = x1;
         rmin[1] = y0; rmax[1] = y1;
         rmin[2] = z0; rmax[2] = z1;
   }
   SetRange(rmin, rmax);
}


//______________________________________________________________________________
void TView3D::SetWindow(Double_t u0, Double_t v0, Double_t du, Double_t dv)
{
   // Set viewing window.

   fUVcoord[0] = u0;
   fUVcoord[1] = v0;
   fUVcoord[2] = du;
   fUVcoord[3] = dv;
}


//______________________________________________________________________________
void TView3D::SetView(Double_t longitude, Double_t latitude, Double_t psi, Int_t &irep)
{
   // Set view parameters.

   ResetView(longitude, latitude, psi, irep);
}


//______________________________________________________________________________
void TView3D::ResizePad()
{
   // Recompute window for perspective view.

   if (!IsPerspective()) return;
   Double_t upix = fUpix;
   Double_t vpix = fVpix;

   // widh in pixels
   fUpix = gPad->GetWw()*gPad->GetAbsWNDC();

   // height in pixels
   fVpix = gPad->GetWh()*gPad->GetAbsHNDC();
   Double_t u0 = fUVcoord[0]*fUpix/upix;
   Double_t v0 = fUVcoord[1]*fVpix/vpix;
   Double_t du = fUVcoord[2]*fUpix/upix;
   Double_t dv = fUVcoord[3]*fVpix/vpix;
   SetWindow(u0, v0, du, dv);
   DefinePerspectiveView();
}


//______________________________________________________________________________
void TView3D::ResetView(Double_t longitude, Double_t latitude, Double_t psi, Int_t &irep)
{
   // Set view direction (in spherical coordinates).
   //
   //    Input  PHI     - longitude
   //           THETA   - latitude (angle between +Z and view direction)
   //           PSI     - rotation in screen plane
   //
   //    Output: IREP   - reply (-1 if error in min-max)
   //
   //    Errors: error in min-max scope

   Double_t scale[3],  centre[3];
   Double_t c1, c2, c3, s1, s2, s3;

   //*-*-        F I N D   C E N T E R   O F   S C O P E   A N D
   //*-*-        S C A L E   F A C T O R S
   FindScope(scale, centre, irep);
   if (irep < 0) {
      Error("ResetView", "Error in min-max scope");
      return;
   }

   //*-*-        S E T   T R A N S F O R M A T I O N   M A T R I C E S
   fLongitude = longitude;
   fPsi       = psi;
   fLatitude  = latitude;

   if (IsPerspective()) {
      DefinePerspectiveView();
      return;
   }

   c1 = TMath::Cos(longitude*kRad);
   s1 = TMath::Sin(longitude*kRad);
   c2 = TMath::Cos(latitude*kRad);
   s2 = TMath::Sin(latitude*kRad);
   c3 = TMath::Cos(psi*kRad);
   s3 = TMath::Sin(psi*kRad);
   DefineViewDirection(scale, centre, c1, s1, c2, s2, c3, s3, fTnorm, fTback);
   c3 = 1;
   s3 = 0;
   DefineViewDirection(scale, centre, c1, s1, c2, s2, c3, s3, fTN, fTB);
}


//______________________________________________________________________________
void TView3D::WCtoNDC(const Float_t *pw, Float_t *pn)
{
   // Transfer point from world to normalized coordinates.
   //
   //    Input: PW(3) - point in world coordinate system
   //           PN(3) - point in normalized coordinate system

   // perspective view
   if (IsPerspective()) {
      for (Int_t i=0; i<3; i++)
         pn[i] = pw[0]*fTnorm[i]+pw[1]*fTnorm[i+4]+pw[2]*fTnorm[i+8]+fTnorm[i+12];
      if (pn[2]>0) {
         pn[0] /= pn[2];
         pn[1] /= pn[2];
      } else {
         pn[0] *= 1000.;
         pn[1] *= 1000.;
      }
      return;
   }
   // parallel view
   pn[0] = fTnorm[0]*pw[0] + fTnorm[1]*pw[1] + fTnorm[2]*pw[2]  + fTnorm[3];
   pn[1] = fTnorm[4]*pw[0] + fTnorm[5]*pw[1] + fTnorm[6]*pw[2]  + fTnorm[7];
   pn[2] = fTnorm[8]*pw[0] + fTnorm[9]*pw[1] + fTnorm[10]*pw[2] + fTnorm[11];
}


//______________________________________________________________________________
void TView3D::WCtoNDC(const Double_t *pw, Double_t *pn)
{
   // Transfer point from world to normalized coordinates.
   //
   //    Input: PW(3) - point in world coordinate system
   //           PN(3) - point in normalized coordinate system

   // perspective view
   if (IsPerspective()) {
      for (Int_t i=0; i<3; i++)
         pn[i] = pw[0]*fTnorm[i]+pw[1]*fTnorm[i+4]+pw[2]*fTnorm[i+8]+fTnorm[i+12];
      if (pn[2]>0) {
         pn[0] /= pn[2];
         pn[1] /= pn[2];
      } else {
         pn[0] *= 1000.;
         pn[1] *= 1000.;
      }
      return;
   }

   // parallel view
   pn[0] = fTnorm[0]*pw[0] + fTnorm[1]*pw[1] + fTnorm[2]*pw[2]  + fTnorm[3];
   pn[1] = fTnorm[4]*pw[0] + fTnorm[5]*pw[1] + fTnorm[6]*pw[2]  + fTnorm[7];
   pn[2] = fTnorm[8]*pw[0] + fTnorm[9]*pw[1] + fTnorm[10]*pw[2] + fTnorm[11];
}


//______________________________________________________________________________
void TView3D::AdjustPad(TVirtualPad *pad)
{
   // Force the current pad to be updated.

   TVirtualPad *thisPad = pad;
   if (!thisPad) thisPad = gPad;
   if (thisPad) {
#ifdef R__HAS_COCOA
      thisPad->AbsCoordinates(kFALSE);
#endif
      thisPad->Modified();
      thisPad->Update();
   }
}


//______________________________________________________________________________
void TView3D::RotateView(Double_t phi, Double_t theta, TVirtualPad *pad)
{
   // API to rotate view and adjust the pad provided it the current one.

   Int_t iret;
   Double_t p = phi;
   Double_t t = theta;
   SetView(p, t, 0, iret);

   // Adjust current pad too
   TVirtualPad *thisPad = pad;
   if (!thisPad) thisPad = gPad;
   if (thisPad) {
      thisPad->SetPhi(-90-p);
      thisPad->SetTheta(90-t);
      thisPad->Modified();
      thisPad->Update();
   }
}


//______________________________________________________________________________
void TView3D::SideView(TVirtualPad *pad)
{
   // Set to side view.

   RotateView(0,90.0,pad);
}


//______________________________________________________________________________
void TView3D::FrontView(TVirtualPad *pad)
{
   // Set to front view.

   RotateView(270.0,90.0,pad);
}


//______________________________________________________________________________
void TView3D::TopView(TVirtualPad *pad)
{
   // Set to top view.

   RotateView(270.0,0.0,pad);
}


//______________________________________________________________________________
void TView3D::ToggleRulers(TVirtualPad *pad)
{
   // Turn on /off 3D axis.

   TAxis3D::ToggleRulers(pad);
}


//______________________________________________________________________________
void TView3D::ToggleZoom(TVirtualPad *pad)
{
   // Turn on /off the interactive option to
   //  Zoom / Move / Change attributes of 3D axis correspond this view.

   TAxis3D::ToggleZoom(pad);
}


//______________________________________________________________________________
void TView3D::AdjustScales(TVirtualPad *pad)
{
   // Adjust all sides of view in respect of the biggest one.

   Double_t min[3],max[3];
   GetRange(min,max);
   int i;
   Double_t maxSide = 0;
   // Find the largest side
   for (i=0;i<3; i++) maxSide = TMath::Max(maxSide,max[i]-min[i]);
   //Adjust scales:
   for (i=0;i<3; i++) max[i] += maxSide - (max[i]-min[i]);
   SetRange(min,max);

   AdjustPad(pad);
}


//______________________________________________________________________________
void TView3D::Centered3DImages(TVirtualPad *pad)
{
   // Move view into the center of the scene.

   Double_t min[3],max[3];
   GetRange(min,max);
   int i;
   for (i=0;i<3; i++) {
      if (max[i] > 0) min[i] = -max[i];
      else            max[i] = -min[i];
   }
   SetRange(min,max);
   AdjustPad(pad);
}


//______________________________________________________________________________
void TView3D::UnzoomView(TVirtualPad *pad,Double_t unZoomFactor )
{
   // unZOOM this view.

   if (TMath::Abs(unZoomFactor) < 0.001) return;
   ZoomView(pad,1./unZoomFactor);
}


//______________________________________________________________________________
void TView3D::ZoomView(TVirtualPad *pad,Double_t zoomFactor)
{
   // ZOOM this view.

   if (TMath::Abs(zoomFactor) < 0.001) return;
   Double_t min[3],max[3];
   GetRange(min,max);
   int i;
   for (i=0;i<3; i++) {
      // Find center
      Double_t c = (max[i]+min[i])/2;
      // Find a new size
      Double_t s = (max[i]-min[i])/(2*zoomFactor);
      // Set a new size
      max[i] = c + s;
      min[i] = c - s;
   }
   SetRange(min,max);
   AdjustPad(pad);
}


//______________________________________________________________________________
void TView3D::MoveFocus(Double_t *cov, Double_t dx, Double_t dy, Double_t dz, Int_t nsteps,
                      Double_t dlong, Double_t dlat, Double_t dpsi)
{
   // Move focus to a different box position and extent in nsteps. Perform
   // rotation with dlat,dlong,dpsi at each step.

   if (!IsPerspective()) return;
   if (nsteps<1) return;
   Double_t fc = 1./Double_t(nsteps);
   Double_t oc[3], od[3], dir[3];
   dir[0] = 0;
   dir[1] = 0;
   dir[2] = 1.;
   Int_t i, j;
   for (i=0; i<3; i++) {
      oc[i] = 0.5*(fRmin[i]+fRmax[i]);
      od[i] = 0.5*(fRmax[i]-fRmin[i]);
   }
   Double_t dox = cov[0]-oc[0];
   Double_t doy = cov[1]-oc[1];
   Double_t doz = cov[2]-oc[2];

   Double_t dd = TMath::Sqrt(dox*dox+doy*doy+doz*doz);
   if (dd!=0) {;
   dir[0] = dox/dd;
   dir[1] = doy/dd;
   dir[2] = doz/dd;
   }
   dd *= fc;
   dox = fc*(dx-od[0]);
   doy = fc*(dy-od[1]);
   doz = fc*(dz-od[2]);
   for (i=0; i<nsteps; i++) {
      oc[0] += dd*dir[0];
      oc[1] += dd*dir[1];
      oc[2] += dd*dir[2];
      od[0]  += dox;
      od[1]  += doy;
      od[2]  += doz;
      for (j=0; j<3; j++) {
         fRmin[j] = oc[j]-od[j];
         fRmax[j] = oc[j]+od[j];
      }
      SetDefaultWindow();
      fLatitude += dlat;
      fLongitude += dlong;
      fPsi += dpsi;
      DefinePerspectiveView();
      if (gPad) {
         gPad->Modified();
         gPad->Update();
      }
   }
}


//______________________________________________________________________________
void TView3D::MoveViewCommand(Char_t option, Int_t count)
{
   // 'a' increase scale factor (clip cube borders)
   // 's' decrease scale factor (clip cube borders)

   if (count <= 0) count = 1;
   switch (option) {
      case '+':
         ZoomView();
         break;
      case '-':
         UnzoomView();
         break;
      case 's':
      case 'S':
         UnzoomView();
         break;
      case 'a':
      case 'A':
         ZoomView();
         break;
      case 'l':
      case 'L':
      case 'h':
      case 'H':
      case 'u':
      case 'U':
      case 'i':
      case 'I':
         MoveWindow(option);
         break;
      case 'j':
      case 'J':
         ZoomIn();
         break;
      case 'k':
      case 'K':
         ZoomOut();
         break;
      default:
         break;
   }
}


//______________________________________________________________________________
void TView3D::MoveWindow(Char_t option)
{
   // Move view window :
   // l,L - left
   // h,H - right
   // u,U - down
   // i,I - up

   if (!IsPerspective()) return;
   Double_t shiftu = 0.1*fUVcoord[2];
   Double_t shiftv = 0.1*fUVcoord[3];
   switch (option) {
      case 'l':
      case 'L':
         fUVcoord[0] += shiftu;
         break;
      case 'h':
      case 'H':
         fUVcoord[0] -= shiftu;
         break;
      case 'u':
      case 'U':
         fUVcoord[1] += shiftv;
         break;
      case 'i':
      case 'I':
         fUVcoord[1] -= shiftv;
         break;
      default:
         return;
   }
   DefinePerspectiveView();
   if (gPad) {
      gPad->Modified();
      gPad->Update();
   }
}


//______________________________________________________________________________
void TView3D::ZoomIn()
{
   // Zoom in.

   if (!IsPerspective()) return;
   Double_t extent = GetExtent();
   Double_t fc = 0.1;
   if (fDview<extent) {
      fDview -= fc*extent;
   } else {
      fDview /= 1.25;
   }
   DefinePerspectiveView();
   if (gPad) {
      gPad->Modified();
      gPad->Update();
   }
}


//______________________________________________________________________________
void TView3D::ZoomOut()
{
   // Zoom out.

   if (!IsPerspective()) return;
   Double_t extent = GetExtent();
   Double_t fc = 0.1;
   if (fDview<extent) {
      fDview += fc*extent;
   } else {
      fDview *= 1.25;
   }
   DefinePerspectiveView();
   if (gPad) {
      gPad->Modified();
      gPad->Update();
   }
}


//______________________________________________________________________________
void TView3D::Streamer(TBuffer &R__b)
{
   // Stream an object of class TView3D.

   if (R__b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
      if (R__v > 1) {
         R__b.ReadClassBuffer(TView3D::Class(), this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      //unfortunately we forgot to increment the TView3D version number
      //when the class was upgraded to double precision in version 2.25.
      //we are forced to use the file version number to recognize old files.
      if (R__b.GetParent() && R__b.GetVersionOwner() < 22500) { //old version in single precision
         TObject::Streamer(R__b);
         TAttLine::Streamer(R__b);
         Float_t single, sa[12];
         Int_t i;
         R__b >> fSystem;
         R__b >> single; fLatitude = single;
         R__b >> single; fLongitude = single;
         R__b >> single; fPsi = single;
         R__b.ReadStaticArray(sa);   for (i=0;i<12;i++) fTN[i] = sa[i];
         R__b.ReadStaticArray(sa);   for (i=0;i<12;i++) fTB[i] = sa[i];
         R__b.ReadStaticArray(sa);   for (i=0;i<3;i++)  fRmax[i] = sa[i];
         R__b.ReadStaticArray(sa);   for (i=0;i<3;i++)  fRmin[i] = sa[i];
         R__b.ReadStaticArray(sa);   for (i=0;i<12;i++) fTnorm[i] = sa[i];
         R__b.ReadStaticArray(sa);   for (i=0;i<12;i++) fTback[i] = sa[i];
         R__b.ReadStaticArray(sa);   for (i=0;i<3;i++)  fX1[i] = sa[i];
         R__b.ReadStaticArray(sa);   for (i=0;i<3;i++)  fX2[i] = sa[i];
         R__b.ReadStaticArray(sa);   for (i=0;i<3;i++)  fY1[i] = sa[i];
         R__b.ReadStaticArray(sa);   for (i=0;i<3;i++)  fY2[i] = sa[i];
         R__b.ReadStaticArray(sa);   for (i=0;i<3;i++)  fZ1[i] = sa[i];
         R__b.ReadStaticArray(sa);   for (i=0;i<3;i++)  fZ2[i] = sa[i];
         R__b >> fOutline;
         R__b >> fDefaultOutline;
         R__b >> fAutoRange;
      } else {
         TObject::Streamer(R__b);
         TAttLine::Streamer(R__b);
         R__b >> fLatitude;
         R__b >> fLongitude;
         R__b >> fPsi;
         R__b.ReadStaticArray(fTN);
         R__b.ReadStaticArray(fTB);
         R__b.ReadStaticArray(fRmax);
         R__b.ReadStaticArray(fRmin);
         R__b.ReadStaticArray(fTnorm);
         R__b.ReadStaticArray(fTback);
         R__b.ReadStaticArray(fX1);
         R__b.ReadStaticArray(fX2);
         R__b.ReadStaticArray(fY1);
         R__b.ReadStaticArray(fY2);
         R__b.ReadStaticArray(fZ1);
         R__b.ReadStaticArray(fZ2);
         R__b >> fSystem;
         R__b >> fOutline;
         R__b >> fDefaultOutline;
         R__b >> fAutoRange;
      }
      //====end of old versions

   } else {
      R__b.WriteClassBuffer(TView3D::Class(),this);
   }
}

//      Shortcuts for menus
void TView3D::Centered(){Centered3DImages();}
void TView3D::Front()   {FrontView();}
void TView3D::ShowAxis(){ToggleRulers(); }
void TView3D::Side()    {SideView();}
void TView3D::Top()     {TopView();}
void TView3D::ZoomMove(){ToggleZoom();}
void TView3D::Zoom()    {ZoomView();}
void TView3D::UnZoom()  {UnzoomView();}


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