Skip to content
Snippets Groups Projects
TGLPlotPainter.h 9.62 KiB
Newer Older
// @(#)root/gl:$Id$
// Author:  Timur Pocheptsov  14/06/2006
Rene Brun's avatar
Rene Brun committed

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

Olivier Couet's avatar
Olivier Couet committed
#ifndef ROOT_TGLPlotPainter
#define ROOT_TGLPlotPainter
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
#include <vector>
Olivier Couet's avatar
Olivier Couet committed

#ifndef ROOT_TVirtualGL
#include "TVirtualGL.h"
#endif
Olivier Couet's avatar
Olivier Couet committed
#ifndef ROOT_TGLPlotBox
#include "TGLPlotBox.h"
Olivier Couet's avatar
Olivier Couet committed
#endif
#ifndef ROOT_TPoint
#include "TPoint.h"
#endif
Olivier Couet's avatar
Olivier Couet committed
#ifndef ROOT_TGLUtil
#include "TGLUtil.h"
#endif
Olivier Couet's avatar
Olivier Couet committed
#ifndef ROOT_TNamed
#include "TNamed.h"
#endif
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
class TGLPlotCoordinates;
class TGLOrthoCamera;
Olivier Couet's avatar
Olivier Couet committed
class TString;
class TColor;
class TAxis;
class TH1;
Olivier Couet's avatar
Olivier Couet committed
class TH3;
Rene Brun's avatar
Rene Brun committed
class TF3;
Olivier Couet's avatar
Olivier Couet committed

/*
Olivier Couet's avatar
Olivier Couet committed
   Box cut. When attached to a plot, cuts away a part of it.
   Can be moved in a plot's own area in X/Y/Z directions.
Olivier Couet's avatar
Olivier Couet committed
*/

Olivier Couet's avatar
Olivier Couet committed
class TGLBoxCut {
private:
   Double_t                   fXLength;
   Double_t                   fYLength;
   Double_t                   fZLength;
   TGLVertex3                 fCenter;
   Rgl::Range_t               fXRange;
   Rgl::Range_t               fYRange;
   Rgl::Range_t               fZRange;

   const TGLPlotBox * const   fPlotBox;
   Bool_t                     fActive;
   Double_t                   fFactor;

   TPoint                     fMousePos;

public:
   TGLBoxCut(const TGLPlotBox *plotBox);
   virtual ~TGLBoxCut();

   void   TurnOnOff();
   Bool_t IsActive()const{return fActive;}
   void   SetFactor(Double_t f){fFactor = f;}

   void   DrawBox(Bool_t selectionPass, Int_t selected)const;
Rene Brun's avatar
Rene Brun committed

Olivier Couet's avatar
Olivier Couet committed
   void   StartMovement(Int_t px, Int_t py);
Olivier Couet's avatar
Olivier Couet committed
   void   MoveBox(Int_t px, Int_t py, Int_t axisID);
Rene Brun's avatar
Rene Brun committed

Olivier Couet's avatar
Olivier Couet committed
   Bool_t IsInCut(Double_t xMin, Double_t xMax, Double_t yMin, Double_t yMax,
                  Double_t zMin, Double_t zMax)const;
private:
   void AdjustBox();

Olivier Couet's avatar
Olivier Couet committed
   ClassDef(TGLBoxCut, 0)//Cuts away part of a plot.
Olivier Couet's avatar
Olivier Couet committed
};

Olivier Couet's avatar
Olivier Couet committed
/*
   2D contour for TH3 slicing.
*/

class TGLTH3Slice : public TNamed {
public:
   enum ESliceAxis {kXOZ, kYOZ, kXOY};
Rene Brun's avatar
Rene Brun committed

Olivier Couet's avatar
Olivier Couet committed
private:
   ESliceAxis                fAxisType;
   TAxis                    *fAxis;
   mutable TGLLevelPalette   fPalette;

   const TGLPlotCoordinates *fCoord;
   const TGLPlotBox         *fBox;
   Int_t                     fSliceWidth;

   const TH3                *fHist;
Rene Brun's avatar
Rene Brun committed
   const TF3                *fF3;
Olivier Couet's avatar
Olivier Couet committed

   mutable TGL2DArray<Double_t> fTexCoords;
Rene Brun's avatar
Rene Brun committed

Rene Brun's avatar
Rene Brun committed
   mutable Rgl::Range_t         fMinMax;
Olivier Couet's avatar
Olivier Couet committed

public:
Rene Brun's avatar
Rene Brun committed
   TGLTH3Slice(const TString &sliceName,
               const TH3 *hist,
               const TGLPlotCoordinates *coord,
Olivier Couet's avatar
Olivier Couet committed
               const TGLPlotBox * box,
               ESliceAxis axis);
Rene Brun's avatar
Rene Brun committed
   TGLTH3Slice(const TString &sliceName,
Rene Brun's avatar
Rene Brun committed
               const TH3 *hist, const TF3 *fun,
Rene Brun's avatar
Rene Brun committed
               const TGLPlotCoordinates *coord,
Rene Brun's avatar
Rene Brun committed
               const TGLPlotBox * box,
               ESliceAxis axis);
Olivier Couet's avatar
Olivier Couet committed

Rene Brun's avatar
Rene Brun committed
   void   DrawSlice(Double_t pos)const;
Olivier Couet's avatar
Olivier Couet committed
   //SetSliceWidth must have "menu" comment.
Rene Brun's avatar
Rene Brun committed
   void   SetSliceWidth(Int_t width = 1); // *MENU*
Rene Brun's avatar
Rene Brun committed

Rene Brun's avatar
Rene Brun committed
   void   SetMinMax(const Rgl::Range_t &newRange)
   {
      fMinMax = newRange;
   }
Rene Brun's avatar
Rene Brun committed

Olivier Couet's avatar
Olivier Couet committed

private:
Rene Brun's avatar
Rene Brun committed
   void   PrepareTexCoords(Double_t pos, Int_t sliceBegin, Int_t sliceEnd)const;
   void   FindMinMax(Int_t sliceBegin, Int_t sliceEnd)const;
   Bool_t PreparePalette()const;
Olivier Couet's avatar
Olivier Couet committed
   void   DrawSliceTextured(Double_t pos)const;
   void   DrawSliceFrame(Int_t low, Int_t up)const;

   ClassDef(TGLTH3Slice, 0) // TH3 slice
};


Olivier Couet's avatar
Olivier Couet committed
/*
   TGLPlotPainter class defines interface to different plot painters.
*/

Olivier Couet's avatar
Olivier Couet committed
class TGLPlotPainter : public TVirtualGLPainter {
private:
Rene Brun's avatar
Rene Brun committed
//   Int_t                 fGLContext;
   TGLPaintDevice       *fGLDevice;
Olivier Couet's avatar
Olivier Couet committed
   const TColor         *fPadColor;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
protected:
   TH1                  *fHist;
   TAxis                *fXAxis;
   TAxis                *fYAxis;
   TAxis                *fZAxis;

   TGLPlotCoordinates   *fCoord;
   TGLOrthoCamera       *fCamera;
   TGLSelectionBuffer    fSelection;
   Bool_t                fUpdateSelection;
   Bool_t                fSelectionPass;
   Int_t                 fSelectedPart;
   TPoint                fMousePosition;
   mutable Double_t      fXOZSectionPos;
   mutable Double_t      fYOZSectionPos;
   mutable Double_t      fXOYSectionPos;
   TGLPlotBox            fBackBox;
Olivier Couet's avatar
Olivier Couet committed
   TGLBoxCut             fBoxCut;
Olivier Couet's avatar
Olivier Couet committed

   std::vector<Double_t> fZLevels;
Rene Brun's avatar
Rene Brun committed
   Bool_t                fHighColor;
Rene Brun's avatar
Rene Brun committed

Olivier Couet's avatar
Olivier Couet committed
   enum ESelectionBase{
      kHighColorSelectionBase = 7,
Olivier Couet's avatar
Olivier Couet committed
      kTrueColorSelectionBase = 10
Olivier Couet's avatar
Olivier Couet committed
   };
Rene Brun's avatar
Rene Brun committed

Olivier Couet's avatar
Olivier Couet committed
   ESelectionBase        fSelectionBase;
Olivier Couet's avatar
Olivier Couet committed

public:
Rene Brun's avatar
Rene Brun committed
/*   TGLPlotPainter(TH1 *hist, TGLOrthoCamera *camera, TGLPlotCoordinates *coord, Int_t context,
Olivier Couet's avatar
Olivier Couet committed
                  Bool_t xoySelectable, Bool_t xozSelectable, Bool_t yozSelectable);
Rene Brun's avatar
Rene Brun committed
   TGLPlotPainter(TGLOrthoCamera *camera, Int_t context);*/
   TGLPlotPainter(TH1 *hist, TGLOrthoCamera *camera, TGLPlotCoordinates *coord, TGLPaintDevice *dev,
                  Bool_t xoySelectable, Bool_t xozSelectable, Bool_t yozSelectable);
   TGLPlotPainter(TGLOrthoCamera *camera, TGLPaintDevice *dev);

   const TGLPlotBox& RefBackBox() const { return fBackBox; }
Olivier Couet's avatar
Olivier Couet committed

Rene Brun's avatar
Rene Brun committed
   virtual void     InitGL()const = 0;
   virtual void     DrawPlot()const = 0;
Olivier Couet's avatar
Olivier Couet committed
   virtual void     Paint();
Rene Brun's avatar
Rene Brun committed

Olivier Couet's avatar
Olivier Couet committed
   //Checks, if mouse cursor is above plot.
   virtual Bool_t   PlotSelected(Int_t px, Int_t py);
Olivier Couet's avatar
Olivier Couet committed
   //Init geometry does plot's specific initialization.
   virtual Bool_t   InitGeometry() = 0;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   virtual void     StartPan(Int_t px, Int_t py) = 0;
Olivier Couet's avatar
Olivier Couet committed
   //Pan function is already declared in TVirtualGLPainter.

   //Add string option, it can be a digit in "lego" or "surf".
Olivier Couet's avatar
Olivier Couet committed
   virtual void     AddOption(const TString &stringOption) = 0;
Olivier Couet's avatar
Olivier Couet committed
   //Function to process additional events (key presses, mouse clicks.)
Olivier Couet's avatar
Olivier Couet committed
   virtual void     ProcessEvent(Int_t event, Int_t px, Int_t py) = 0;
Olivier Couet's avatar
Olivier Couet committed
   //Used by GLpad
Rene Brun's avatar
Rene Brun committed
   //   void             SetGLContext(Int_t context);
   void             SetGLDevice(TGLPaintDevice *dev){fGLDevice = dev;}
Olivier Couet's avatar
Olivier Couet committed
   void             SetPadColor(const TColor *color);
   virtual void     SetFrameColor(const TColor *frameColor);
   //Camera is external to painter, if zoom was changed, or camera
   //was rotated, selection must be invalidated.
   void             InvalidateSelection();

Olivier Couet's avatar
Olivier Couet committed
   enum ECutAxisID {
      kXAxis = 7,
      kYAxis = 8,
      kZAxis = 9
   };

Rene Brun's avatar
Rene Brun committed
   Bool_t           CutAxisSelected()const{return !fHighColor && fSelectedPart <= kZAxis && fSelectedPart >= kXAxis;}
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
protected:
Rene Brun's avatar
Rene Brun committed
//   Int_t            GetGLContext()const;
Olivier Couet's avatar
Olivier Couet committed
   const TColor    *GetPadColor()const;
   Bool_t           MakeGLContextCurrent()const;
   //
   void             MoveSection(Int_t px, Int_t py);
   void             DrawSections()const;
Olivier Couet's avatar
Olivier Couet committed
   virtual void     DrawSectionXOZ()const = 0;
   virtual void     DrawSectionYOZ()const = 0;
   virtual void     DrawSectionXOY()const = 0;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   virtual void     ClearBuffers()const;

Olivier Couet's avatar
Olivier Couet committed
   void             PrintPlot()const;
   //
Olivier Couet's avatar
Olivier Couet committed

   ClassDef(TGLPlotPainter, 0) //Base for gl plots
};

Olivier Couet's avatar
Olivier Couet committed
/*
   Auxiliary class, which holds different
   information about plot's current coordinate system
*/

Olivier Couet's avatar
Olivier Couet committed
class TGLPlotCoordinates {
private:
   EGLCoordType    fCoordType;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   Rgl::BinRange_t fXBins;
   Rgl::BinRange_t fYBins;
   Rgl::BinRange_t fZBins;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   Double_t        fXScale;
   Double_t        fYScale;
   Double_t        fZScale;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   Rgl::Range_t    fXRange;
   Rgl::Range_t    fYRange;
   Rgl::Range_t    fZRange;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   Rgl::Range_t    fXRangeScaled;
   Rgl::Range_t    fYRangeScaled;
   Rgl::Range_t    fZRangeScaled;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   Bool_t          fXLog;
   Bool_t          fYLog;
   Bool_t          fZLog;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   Bool_t          fModified;
   Double_t        fFactor;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
public:
   TGLPlotCoordinates();
   virtual ~TGLPlotCoordinates();
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   void         SetCoordType(EGLCoordType type);
   EGLCoordType GetCoordType()const;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   void   SetXLog(Bool_t xLog);
   Bool_t GetXLog()const;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   void   SetYLog(Bool_t yLog);
   Bool_t GetYLog()const;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   void   SetZLog(Bool_t zLog);
   Bool_t GetZLog()const;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   void   ResetModified();
   Bool_t Modified()const;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   Bool_t SetRanges(const TH1 *hist, Bool_t errors = kFALSE, Bool_t zBins = kFALSE);

   Int_t  GetNXBins()const;
   Int_t  GetNYBins()const;
   Int_t  GetNZBins()const;
Olivier Couet's avatar
Olivier Couet committed

Olivier Couet's avatar
Olivier Couet committed
   const Rgl::BinRange_t &GetXBins()const;
   const Rgl::BinRange_t &GetYBins()const;
   const Rgl::BinRange_t &GetZBins()const;

   const Rgl::Range_t    &GetXRange()const;
   Double_t               GetXLength()const;
   const Rgl::Range_t    &GetYRange()const;
   Double_t               GetYLength()const;
   const Rgl::Range_t    &GetZRange()const;
   Double_t               GetZLength()const;

   const Rgl::Range_t    &GetXRangeScaled()const;
   const Rgl::Range_t    &GetYRangeScaled()const;
   const Rgl::Range_t    &GetZRangeScaled()const;

   Double_t GetXScale()const{return fXScale;}
   Double_t GetYScale()const{return fYScale;}
   Double_t GetZScale()const{return fZScale;}

   Int_t    GetFirstXBin()const{return fXBins.first;}
   Int_t    GetLastXBin()const{return fXBins.second;}
   Int_t    GetFirstYBin()const{return fYBins.first;}
   Int_t    GetLastYBin()const{return fYBins.second;}
   Int_t    GetFirstZBin()const{return fZBins.first;}
   Int_t    GetLastZBin()const{return fZBins.second;}

   Double_t GetFactor()const;

private:
   Bool_t SetRangesCartesian(const TH1 *hist, Bool_t errors, Bool_t zBins);
   Bool_t SetRangesPolar(const TH1 *hist);
   Bool_t SetRangesCylindrical(const TH1 *hist);
   Bool_t SetRangesSpherical(const TH1 *hist);

   TGLPlotCoordinates(const TGLPlotCoordinates &);
   TGLPlotCoordinates &operator = (const TGLPlotCoordinates &);

   ClassDef(TGLPlotCoordinates, 0)//Auxilary class, holds plot dimensions.
};
Olivier Couet's avatar
Olivier Couet committed

#endif