// @(#)root/gl:$Id$
// Author:  Timur Pocheptsov  26/01/2007

/*************************************************************************
 * 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.             *
 *************************************************************************/

#ifndef ROOT_TGLParametric
#define ROOT_TGLParametric

#include <memory>

#ifndef ROOT_TGLHistPainter
#include "TGLHistPainter.h"
#endif
#ifndef ROOT_TGLUtil
#include "TGLUtil.h"
#endif
#ifndef ROOT_TAxis
#include "TAxis.h"
#endif
#ifndef ROOT_TF2
#include "TF2.h"
#endif

class TString;

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGLParametricEquation                                                //
//                                                                      //
// Parametric equations drawing with GL.                                //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


typedef void (*ParametricEquation_t)(TGLVertex3 &, Double_t u, Double_t v);

class TGLParametricEquation : public TNamed {
private:
   typedef std::auto_ptr<TF2> Ptr_t;

   Ptr_t                fXEquation;
   Ptr_t                fYEquation;
   Ptr_t                fZEquation;

   ParametricEquation_t fEquation;

   Rgl::Range_t         fURange;
   Rgl::Range_t         fVRange;

   Bool_t               fConstrained;
   Bool_t               fModified;

   typedef std::auto_ptr<TGLHistPainter> Painter_t;
   //C++ compiler do not need TGLhistPainter definition here, but I'm not sure about CINT,
   //so I've included TGLHistPainter definition.
   Painter_t            fPainter;

public:
   TGLParametricEquation(const TString &name, const TString &xEquation,
                 const TString &yEquation, const TString &zEquation,
                 Double_t uMin, Double_t uMax,
                 Double_t vMin, Double_t vMax);
   TGLParametricEquation(const TString &name, ParametricEquation_t equation,
                 Double_t uMin, Double_t uMax, Double_t vMin, Double_t vMax);

   Rgl::Range_t GetURange()const;
   Rgl::Range_t GetVRange()const;

   Bool_t       IsConstrained()const;
   void         SetConstrained(Bool_t c);

   Bool_t       IsModified()const;
   void         SetModified(Bool_t m);

   void         EvalVertex(TGLVertex3 &newVertex, Double_t u, Double_t v)const;

   Int_t        DistancetoPrimitive(Int_t px, Int_t py);
   void         ExecuteEvent(Int_t event, Int_t px, Int_t py);
   char        *GetObjectInfo(Int_t px, Int_t py) const;
   void         Paint(Option_t *option);

private:

   TGLParametricEquation(const TGLParametricEquation &);
   TGLParametricEquation &operator = (const TGLParametricEquation &);

   ClassDef(TGLParametricEquation, 0)//Equation of parametric surface.
};

class TGLParametricPlot : public TGLPlotPainter {
private:
   struct Vertex_t {
      TGLVertex3 fPos;
      TGLVector3 fNormal;
      Float_t    fRGBA[4];
   };

   enum EMeshSize {kLow = 30, kHigh = 150};

   Int_t                  fMeshSize;
   TGL2DArray<Vertex_t>   fMesh;

   Bool_t                 fShowMesh;
   Int_t                  fColorScheme;

   TGLParametricEquation *fEquation;
   
   TAxis                  fCartesianXAxis;
   TAxis                  fCartesianYAxis;
   TAxis                  fCartesianZAxis;

   TGLPlotCoordinates     fCartesianCoord;

public:
   TGLParametricPlot(TGLParametricEquation *equation, TGLPlotCamera *camera);

   Bool_t   InitGeometry();
   void     StartPan(Int_t px, Int_t py);
   void     Pan(Int_t px, Int_t py);
   char    *GetPlotInfo(Int_t px, Int_t py);
   void     AddOption(const TString &option);
   void     ProcessEvent(Int_t event, Int_t px, Int_t py);

private:
   void     InitGL()const;
   void     DeInitGL()const;
   
   void     DrawPlot()const;

   void     InitColors();

   void     DrawSectionXOZ()const;
   void     DrawSectionYOZ()const;
   void     DrawSectionXOY()const;

   void     SetSurfaceColor()const;

   TGLParametricPlot(const TGLParametricPlot &);
   TGLParametricPlot &operator = (const TGLParametricPlot &);

   ClassDef(TGLParametricPlot, 0)//Parametric plot's painter.
};

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