// @(#)root/gl:$Id$
// Author: Matevz Tadel 2007

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

#include "TH3.h"
#include "TH3GL.h"
#include "TH2.h"
#include "TH2GL.h"
#include "TF2.h"
#include "TF2GL.h"
#include "TGLParametric.h"
#include "TPolyMarker3D.h"
#include "TGLParametricEquationGL.h"

#include "TVirtualPad.h"

//______________________________________________________________________________
// Description of TGLPlot3D
//

ClassImp(TGLPlot3D);

//______________________________________________________________________________
TGLPlot3D::TGLPlot3D() : TGLObject(), fPlotPainter(0)
{
   // Constructor.

   fDLCache = kFALSE; // Disable display list.
}

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

   delete fPlotPainter;
}

//______________________________________________________________________________
void TGLPlot3D::SetPainter(TGLPlotPainter* p)
{
   // Set painter object and destroy the old one.

   delete fPlotPainter;
   fPlotPainter = p;
}

//==============================================================================

//______________________________________________________________________________
TGLPlot3D* TGLPlot3D::InstantiatePlot(TObject* obj)
{
   // Instantiate the correct plot-painter for given object.
   // Protected method.

   if (obj->InheritsFrom(TH3::Class()))
   {
      return new TH3GL();
   }
   else if (obj->InheritsFrom(TH2::Class()))
   {
      return new TH2GL();
   }
   else if (obj->InheritsFrom(TF2::Class()))
   {
      return new TF2GL();
   }
   else if (obj->InheritsFrom(TGLParametricEquation::Class()))
   {
      return new TGLParametricEquationGL();
   }

   return 0;
}

//______________________________________________________________________________
TGLPlot3D* TGLPlot3D::CreatePlot(TH3 *th3, TPolyMarker3D *pm)
{
   // Create GL plot for specified TH3 and polymarker.

   TGLPlot3D* log = new TH3GL(th3, pm);
   log->SetBBox();

   return log;
}

//______________________________________________________________________________
TGLPlot3D* TGLPlot3D::CreatePlot(TObject* obj, const Option_t* opt, TVirtualPad* pad)
{
   // Create GL plot for specified object and options.
   // Which axes are logarithmic is determined from a pad.

   TGLPlot3D* log = InstantiatePlot(obj);

   if (log)
   {
      log->fCoord.SetXLog(pad->GetLogx());
      log->fCoord.SetYLog(pad->GetLogy());
      log->fCoord.SetZLog(pad->GetLogz());
      log->SetModel(obj, opt);
      log->SetBBox();
   }

   return log;
}

//______________________________________________________________________________
TGLPlot3D* TGLPlot3D::CreatePlot(TObject* obj, const Option_t* opt, Bool_t logx, Bool_t logy, Bool_t logz)
{
   // Create GL plot for specified object and options.
   // Which axes are logarithmic is determined from explicit arguments.

   TGLPlot3D* log = InstantiatePlot(obj);

   if (log)
   {
      log->fCoord.SetXLog(logx);
      log->fCoord.SetYLog(logy);
      log->fCoord.SetZLog(logz);
      log->SetModel(obj, opt);
      log->SetBBox();
   }

   return log;
}
 TGLPlot3D.cxx:1
 TGLPlot3D.cxx:2
 TGLPlot3D.cxx:3
 TGLPlot3D.cxx:4
 TGLPlot3D.cxx:5
 TGLPlot3D.cxx:6
 TGLPlot3D.cxx:7
 TGLPlot3D.cxx:8
 TGLPlot3D.cxx:9
 TGLPlot3D.cxx:10
 TGLPlot3D.cxx:11
 TGLPlot3D.cxx:12
 TGLPlot3D.cxx:13
 TGLPlot3D.cxx:14
 TGLPlot3D.cxx:15
 TGLPlot3D.cxx:16
 TGLPlot3D.cxx:17
 TGLPlot3D.cxx:18
 TGLPlot3D.cxx:19
 TGLPlot3D.cxx:20
 TGLPlot3D.cxx:21
 TGLPlot3D.cxx:22
 TGLPlot3D.cxx:23
 TGLPlot3D.cxx:24
 TGLPlot3D.cxx:25
 TGLPlot3D.cxx:26
 TGLPlot3D.cxx:27
 TGLPlot3D.cxx:28
 TGLPlot3D.cxx:29
 TGLPlot3D.cxx:30
 TGLPlot3D.cxx:31
 TGLPlot3D.cxx:32
 TGLPlot3D.cxx:33
 TGLPlot3D.cxx:34
 TGLPlot3D.cxx:35
 TGLPlot3D.cxx:36
 TGLPlot3D.cxx:37
 TGLPlot3D.cxx:38
 TGLPlot3D.cxx:39
 TGLPlot3D.cxx:40
 TGLPlot3D.cxx:41
 TGLPlot3D.cxx:42
 TGLPlot3D.cxx:43
 TGLPlot3D.cxx:44
 TGLPlot3D.cxx:45
 TGLPlot3D.cxx:46
 TGLPlot3D.cxx:47
 TGLPlot3D.cxx:48
 TGLPlot3D.cxx:49
 TGLPlot3D.cxx:50
 TGLPlot3D.cxx:51
 TGLPlot3D.cxx:52
 TGLPlot3D.cxx:53
 TGLPlot3D.cxx:54
 TGLPlot3D.cxx:55
 TGLPlot3D.cxx:56
 TGLPlot3D.cxx:57
 TGLPlot3D.cxx:58
 TGLPlot3D.cxx:59
 TGLPlot3D.cxx:60
 TGLPlot3D.cxx:61
 TGLPlot3D.cxx:62
 TGLPlot3D.cxx:63
 TGLPlot3D.cxx:64
 TGLPlot3D.cxx:65
 TGLPlot3D.cxx:66
 TGLPlot3D.cxx:67
 TGLPlot3D.cxx:68
 TGLPlot3D.cxx:69
 TGLPlot3D.cxx:70
 TGLPlot3D.cxx:71
 TGLPlot3D.cxx:72
 TGLPlot3D.cxx:73
 TGLPlot3D.cxx:74
 TGLPlot3D.cxx:75
 TGLPlot3D.cxx:76
 TGLPlot3D.cxx:77
 TGLPlot3D.cxx:78
 TGLPlot3D.cxx:79
 TGLPlot3D.cxx:80
 TGLPlot3D.cxx:81
 TGLPlot3D.cxx:82
 TGLPlot3D.cxx:83
 TGLPlot3D.cxx:84
 TGLPlot3D.cxx:85
 TGLPlot3D.cxx:86
 TGLPlot3D.cxx:87
 TGLPlot3D.cxx:88
 TGLPlot3D.cxx:89
 TGLPlot3D.cxx:90
 TGLPlot3D.cxx:91
 TGLPlot3D.cxx:92
 TGLPlot3D.cxx:93
 TGLPlot3D.cxx:94
 TGLPlot3D.cxx:95
 TGLPlot3D.cxx:96
 TGLPlot3D.cxx:97
 TGLPlot3D.cxx:98
 TGLPlot3D.cxx:99
 TGLPlot3D.cxx:100
 TGLPlot3D.cxx:101
 TGLPlot3D.cxx:102
 TGLPlot3D.cxx:103
 TGLPlot3D.cxx:104
 TGLPlot3D.cxx:105
 TGLPlot3D.cxx:106
 TGLPlot3D.cxx:107
 TGLPlot3D.cxx:108
 TGLPlot3D.cxx:109
 TGLPlot3D.cxx:110
 TGLPlot3D.cxx:111
 TGLPlot3D.cxx:112
 TGLPlot3D.cxx:113
 TGLPlot3D.cxx:114
 TGLPlot3D.cxx:115
 TGLPlot3D.cxx:116
 TGLPlot3D.cxx:117
 TGLPlot3D.cxx:118
 TGLPlot3D.cxx:119
 TGLPlot3D.cxx:120
 TGLPlot3D.cxx:121
 TGLPlot3D.cxx:122
 TGLPlot3D.cxx:123
 TGLPlot3D.cxx:124
 TGLPlot3D.cxx:125
 TGLPlot3D.cxx:126
 TGLPlot3D.cxx:127
 TGLPlot3D.cxx:128
 TGLPlot3D.cxx:129
 TGLPlot3D.cxx:130
 TGLPlot3D.cxx:131
 TGLPlot3D.cxx:132
 TGLPlot3D.cxx:133
 TGLPlot3D.cxx:134