// @(#)root/eve:$Id$
// Author: Alja Mrak-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.             *
 *************************************************************************/

#ifndef ROOT_TEveCaloLegoGL
#define ROOT_TEveCaloLegoGL

#include "TGLObject.h"
#include "TGLAxisPainter.h"

#include "TEveCaloData.h"
#include "TEveVector.h"
#include "TEveCalo.h"

#include <map>

class TEveCaloLego;

class TEveCaloLegoGL : public TGLObject
{
   friend class TEveCaloLegoOverlay;

private:
   struct Cell2D_t
   {
      Int_t   fId;
      Float_t fSumVal;
      Int_t   fMaxSlice;

      Float_t  fX0, fX1, fY0, fY1;

      Cell2D_t(Int_t id, Float_t sumVal, Int_t maxSlice)
      {
         fId       = id;
         fSumVal   = sumVal;
         fMaxSlice = maxSlice;
         fX0 = fX1 = fY0 = fY1 = 0;
      }

      void SetGeom(Float_t x0, Float_t x1, Float_t y0, Float_t y1)
      {
         fX0 = x0; fX1 = x1;
         fY0 = y0; fY1 = y1;
      }

      Float_t MinSize() { return TMath::Min(fX1- fX0, fY1 - fY0); }
      Float_t X()       { return 0.5*(fX0 + fX1); }
      Float_t Y()       { return 0.5*(fY0 + fY1); }
   };

   typedef std::vector<Cell2D_t>             vCell2D_t;
   typedef std::vector<Cell2D_t>::iterator   vCell2D_i;

   typedef std::map<Int_t, UInt_t>           SliceDLMap_t;
   typedef std::map<Int_t, UInt_t>::iterator SliceDLMap_i;

   // histogram base
   mutable Color_t                   fGridColor;
   mutable Color_t                   fFontColor;

   mutable TAxis      *fEtaAxis;
   mutable TAxis      *fPhiAxis;
   mutable TAxis      *fZAxis;
   mutable TEveVector  fXAxisTitlePos;
   mutable TEveVector  fYAxisTitlePos;
   mutable TEveVector  fZAxisTitlePos;
   mutable TEveVector  fBackPlaneXConst[2];
   mutable TEveVector  fBackPlaneYConst[2];

   mutable TGLAxisPainter fAxisPainter;

   // cached
   TEveCaloLego                     *fM;
   mutable Bool_t                    fDLCacheOK;
   mutable vCell2D_t                 fCells2D;

   mutable TEveCaloData::RebinData_t fRebinData;
   mutable Float_t                   fMaxVal;
   mutable Float_t                   fValToPixel; // top logaritmic viewview
   mutable Int_t                     fCurrentPixelsPerBin;

   mutable SliceDLMap_t              fDLMap;
   mutable Bool_t                    fCells3D;

   mutable Int_t                     fBinStep;

   TEveCaloLegoGL(const TEveCaloLegoGL&);            // Stop default
   TEveCaloLegoGL& operator=(const TEveCaloLegoGL&); // Stop default

private:
   void    GetScaleForMatrix(Float_t& sx, Float_t& sy, Float_t& sz) const;
   Int_t   GetGridStep(TGLRnrCtx &rnrCtx) const;
   void    RebinAxis(TAxis *orig, TAxis *curr) const;

   void    SetAxis3DTitlePos(TGLRnrCtx &rnrCtx, Float_t x0, Float_t x1, Float_t y0, Float_t y1) const;
   void    DrawAxis3D(TGLRnrCtx &rnrCtx) const;
   void    DrawAxis2D(TGLRnrCtx &rnrCtx) const;
   void    DrawHistBase(TGLRnrCtx &rnrCtx) const;

   // highlight
   void    DrawSelectedCells(TGLRnrCtx & rnrCtx, TEveCaloData::vCellId_t cells) const;

   // top view
   void    PrepareCell2DData(TEveCaloData::vCellId_t& cellList, vCell2D_t& cells2D) const;
   void    PrepareCell2DDataRebin(TEveCaloData::RebinData_t& rebinData, vCell2D_t& cells2D) const;
   void    DrawCells2D(TGLRnrCtx & rnrCtx, vCell2D_t& cells2D) const;

   // 3D view
   void    DrawCells3D(TGLRnrCtx & rnrCtx) const;
   void    MakeQuad(Float_t x, Float_t y, Float_t z, Float_t xw, Float_t yw, Float_t zh) const;
   void    Make3DDisplayList(TEveCaloData::vCellId_t& cellList, SliceDLMap_t& map, Bool_t select) const;
   void    Make3DDisplayListRebin(TEveCaloData::RebinData_t& rebinData, SliceDLMap_t& map, Bool_t select) const;

   void    WrapTwoPi(Float_t &min, Float_t &max) const;

public:
   TEveCaloLegoGL();
   virtual ~TEveCaloLegoGL();

   virtual Bool_t SetModel(TObject* obj, const Option_t* opt = 0);

   virtual void   SetBBox();

   virtual void   DLCacheDrop();
   virtual void   DLCachePurge();

   virtual void   DirectDraw(TGLRnrCtx & rnrCtx) const;
   virtual void   DrawHighlight(TGLRnrCtx& rnrCtx, const TGLPhysicalShape* ps, Int_t lvl=-1) const;

   virtual Bool_t SupportsSecondarySelect() const { return kTRUE; }
   virtual Bool_t AlwaysSecondarySelect()   const { return kTRUE; }
   virtual void   ProcessSelection(TGLRnrCtx & rnrCtx, TGLSelectRecord & rec);

   ClassDef(TEveCaloLegoGL, 0); // GL renderer class for TEveCaloLego.
};

//______________________________________________________________________________
inline void TEveCaloLegoGL::WrapTwoPi(Float_t &min, Float_t &max) const
{
   if (fM->GetData()->GetWrapTwoPi())
   {
      if (fM->GetPhiMax()>TMath::Pi() && max<=fM->GetPhiMin())
      {
         min += TMath::TwoPi();
         max += TMath::TwoPi();
      }
      else if (fM->GetPhiMin()<-TMath::Pi() && min>=fM->GetPhiMax())
      {
         min -= TMath::TwoPi();
         max -= TMath::TwoPi();
      }
   }
}
#endif
 TEveCaloLegoGL.h:1
 TEveCaloLegoGL.h:2
 TEveCaloLegoGL.h:3
 TEveCaloLegoGL.h:4
 TEveCaloLegoGL.h:5
 TEveCaloLegoGL.h:6
 TEveCaloLegoGL.h:7
 TEveCaloLegoGL.h:8
 TEveCaloLegoGL.h:9
 TEveCaloLegoGL.h:10
 TEveCaloLegoGL.h:11
 TEveCaloLegoGL.h:12
 TEveCaloLegoGL.h:13
 TEveCaloLegoGL.h:14
 TEveCaloLegoGL.h:15
 TEveCaloLegoGL.h:16
 TEveCaloLegoGL.h:17
 TEveCaloLegoGL.h:18
 TEveCaloLegoGL.h:19
 TEveCaloLegoGL.h:20
 TEveCaloLegoGL.h:21
 TEveCaloLegoGL.h:22
 TEveCaloLegoGL.h:23
 TEveCaloLegoGL.h:24
 TEveCaloLegoGL.h:25
 TEveCaloLegoGL.h:26
 TEveCaloLegoGL.h:27
 TEveCaloLegoGL.h:28
 TEveCaloLegoGL.h:29
 TEveCaloLegoGL.h:30
 TEveCaloLegoGL.h:31
 TEveCaloLegoGL.h:32
 TEveCaloLegoGL.h:33
 TEveCaloLegoGL.h:34
 TEveCaloLegoGL.h:35
 TEveCaloLegoGL.h:36
 TEveCaloLegoGL.h:37
 TEveCaloLegoGL.h:38
 TEveCaloLegoGL.h:39
 TEveCaloLegoGL.h:40
 TEveCaloLegoGL.h:41
 TEveCaloLegoGL.h:42
 TEveCaloLegoGL.h:43
 TEveCaloLegoGL.h:44
 TEveCaloLegoGL.h:45
 TEveCaloLegoGL.h:46
 TEveCaloLegoGL.h:47
 TEveCaloLegoGL.h:48
 TEveCaloLegoGL.h:49
 TEveCaloLegoGL.h:50
 TEveCaloLegoGL.h:51
 TEveCaloLegoGL.h:52
 TEveCaloLegoGL.h:53
 TEveCaloLegoGL.h:54
 TEveCaloLegoGL.h:55
 TEveCaloLegoGL.h:56
 TEveCaloLegoGL.h:57
 TEveCaloLegoGL.h:58
 TEveCaloLegoGL.h:59
 TEveCaloLegoGL.h:60
 TEveCaloLegoGL.h:61
 TEveCaloLegoGL.h:62
 TEveCaloLegoGL.h:63
 TEveCaloLegoGL.h:64
 TEveCaloLegoGL.h:65
 TEveCaloLegoGL.h:66
 TEveCaloLegoGL.h:67
 TEveCaloLegoGL.h:68
 TEveCaloLegoGL.h:69
 TEveCaloLegoGL.h:70
 TEveCaloLegoGL.h:71
 TEveCaloLegoGL.h:72
 TEveCaloLegoGL.h:73
 TEveCaloLegoGL.h:74
 TEveCaloLegoGL.h:75
 TEveCaloLegoGL.h:76
 TEveCaloLegoGL.h:77
 TEveCaloLegoGL.h:78
 TEveCaloLegoGL.h:79
 TEveCaloLegoGL.h:80
 TEveCaloLegoGL.h:81
 TEveCaloLegoGL.h:82
 TEveCaloLegoGL.h:83
 TEveCaloLegoGL.h:84
 TEveCaloLegoGL.h:85
 TEveCaloLegoGL.h:86
 TEveCaloLegoGL.h:87
 TEveCaloLegoGL.h:88
 TEveCaloLegoGL.h:89
 TEveCaloLegoGL.h:90
 TEveCaloLegoGL.h:91
 TEveCaloLegoGL.h:92
 TEveCaloLegoGL.h:93
 TEveCaloLegoGL.h:94
 TEveCaloLegoGL.h:95
 TEveCaloLegoGL.h:96
 TEveCaloLegoGL.h:97
 TEveCaloLegoGL.h:98
 TEveCaloLegoGL.h:99
 TEveCaloLegoGL.h:100
 TEveCaloLegoGL.h:101
 TEveCaloLegoGL.h:102
 TEveCaloLegoGL.h:103
 TEveCaloLegoGL.h:104
 TEveCaloLegoGL.h:105
 TEveCaloLegoGL.h:106
 TEveCaloLegoGL.h:107
 TEveCaloLegoGL.h:108
 TEveCaloLegoGL.h:109
 TEveCaloLegoGL.h:110
 TEveCaloLegoGL.h:111
 TEveCaloLegoGL.h:112
 TEveCaloLegoGL.h:113
 TEveCaloLegoGL.h:114
 TEveCaloLegoGL.h:115
 TEveCaloLegoGL.h:116
 TEveCaloLegoGL.h:117
 TEveCaloLegoGL.h:118
 TEveCaloLegoGL.h:119
 TEveCaloLegoGL.h:120
 TEveCaloLegoGL.h:121
 TEveCaloLegoGL.h:122
 TEveCaloLegoGL.h:123
 TEveCaloLegoGL.h:124
 TEveCaloLegoGL.h:125
 TEveCaloLegoGL.h:126
 TEveCaloLegoGL.h:127
 TEveCaloLegoGL.h:128
 TEveCaloLegoGL.h:129
 TEveCaloLegoGL.h:130
 TEveCaloLegoGL.h:131
 TEveCaloLegoGL.h:132
 TEveCaloLegoGL.h:133
 TEveCaloLegoGL.h:134
 TEveCaloLegoGL.h:135
 TEveCaloLegoGL.h:136
 TEveCaloLegoGL.h:137
 TEveCaloLegoGL.h:138
 TEveCaloLegoGL.h:139
 TEveCaloLegoGL.h:140
 TEveCaloLegoGL.h:141
 TEveCaloLegoGL.h:142
 TEveCaloLegoGL.h:143
 TEveCaloLegoGL.h:144
 TEveCaloLegoGL.h:145
 TEveCaloLegoGL.h:146
 TEveCaloLegoGL.h:147
 TEveCaloLegoGL.h:148
 TEveCaloLegoGL.h:149
 TEveCaloLegoGL.h:150
 TEveCaloLegoGL.h:151
 TEveCaloLegoGL.h:152
 TEveCaloLegoGL.h:153
 TEveCaloLegoGL.h:154
 TEveCaloLegoGL.h:155
 TEveCaloLegoGL.h:156
 TEveCaloLegoGL.h:157
 TEveCaloLegoGL.h:158
 TEveCaloLegoGL.h:159
 TEveCaloLegoGL.h:160
 TEveCaloLegoGL.h:161