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

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TH2GL.h"
#include "TH2.h"
#include "TVirtualPad.h"
#include "TAxis.h"
#include "TMath.h"

#include "TGLSurfacePainter.h"
#include "TGLHistPainter.h"
#include "TGLLegoPainter.h"
#include "TGLBoxPainter.h"
#include "TGLTF3Painter.h"
#include "TGLAxisPainter.h"
#include "TGLCamera.h"

#include "TGLRnrCtx.h"

#include "TGLIncludes.h"

//______________________________________________________________________________
//
// Rendering of TH2 and derived classes.
// Interface to plot-painters also used for gl-in-pad.

ClassImp(TH2GL);

//______________________________________________________________________________
TH2GL::TH2GL() :
   TGLPlot3D(), fM(0)
{
   // Constructor.
}

//______________________________________________________________________________
TH2GL::~TH2GL()
{
   // Destructor.
}

//______________________________________________________________________________
Bool_t TH2GL::SetModel(TObject* obj, const Option_t* opt)
{
   // Set model object.

   TString option(opt);
   option.ToLower();

   fM = SetModelDynCast<TH2>(obj);

   // Plot type
   if (option.Index("surf") != kNPOS)
      SetPainter( new TGLSurfacePainter(fM, 0, &fCoord) );
   else
      SetPainter( new TGLLegoPainter(fM, 0, &fCoord) );

   if (option.Index("sph") != kNPOS)
      fCoord.SetCoordType(kGLSpherical);
   else if (option.Index("pol") != kNPOS)
      fCoord.SetCoordType(kGLPolar);
   else if (option.Index("cyl") != kNPOS)
      fCoord.SetCoordType(kGLCylindrical);

   fPlotPainter->AddOption(option);

   Ssiz_t pos = option.Index("fb");
   if (pos != kNPOS) {
      option.Remove(pos, 2);
      fPlotPainter->SetDrawFrontBox(kFALSE);
   }

   pos = option.Index("bb");
   if (pos != kNPOS)
      fPlotPainter->SetDrawBackBox(kFALSE);

   pos = option.Index("a");
   if (pos != kNPOS)
      fPlotPainter->SetDrawAxes(kFALSE);

   fPlotPainter->InitGeometry();

   return kTRUE;
}

//______________________________________________________________________________
void TH2GL::SetBBox()
{
   // Setup bounding-box.

   fBoundingBox.Set(fPlotPainter->RefBackBox().Get3DBox());
}

//______________________________________________________________________________
void TH2GL::DirectDraw(TGLRnrCtx & rnrCtx) const
{
   // Render the object.

   fPlotPainter->RefBackBox().FindFrontPoint();

   glPushAttrib(GL_ENABLE_BIT | GL_LIGHTING_BIT);

   glEnable(GL_NORMALIZE);
   glDisable(GL_COLOR_MATERIAL);

   fPlotPainter->InitGL();
   fPlotPainter->DrawPlot();

   glDisable(GL_CULL_FACE);
   glPopAttrib();

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