#include <algorithm>

#include "KeySymbols.h"
#include "TVirtualX.h"
#include "Buttons.h"
#include "TString.h"
#include "TROOT.h"
#include "TClass.h"
#include "TColor.h"
#include "TStyle.h"
#include "TH3.h"
#include "TF1.h"

#include "TGLVoxelPainter.h"
#include "TGLPlotCamera.h"
#include "TGLIncludes.h"

//______________________________________________________________________________
//
// Paint TH3 histograms as "voxels" - colored boxes, transparent if transfer function was specified.
//

ClassImp(TGLVoxelPainter)

//______________________________________________________________________________
TGLVoxelPainter::TGLVoxelPainter(TH1 *hist, TGLPlotCamera *cam, TGLPlotCoordinates *coord)
                  : TGLPlotPainter(hist, cam, coord, kFALSE, kFALSE, kFALSE),
                    fTransferFunc(0)
{
   // Constructor.
   //This plot always needs a palette.
   fDrawPalette = kTRUE;
}


//______________________________________________________________________________
char *TGLVoxelPainter::GetPlotInfo(Int_t, Int_t)
{
   //Show box info (i, j, k, binContent).
   fPlotInfo = "";

   if (fSelectedPart) {
      if (fSelectedPart < fSelectionBase) {
         if (fHist->Class())
            fPlotInfo += fHist->Class()->GetName();
         fPlotInfo += "::";
         fPlotInfo += fHist->GetName();
      } else if (!fHighColor){
         const Int_t arr2Dsize = fCoord->GetNYBins() * fCoord->GetNZBins();
         const Int_t binI = (fSelectedPart - fSelectionBase) / arr2Dsize + fCoord->GetFirstXBin();
         const Int_t binJ = (fSelectedPart - fSelectionBase) % arr2Dsize / fCoord->GetNZBins() + fCoord->GetFirstYBin();
         const Int_t binK = (fSelectedPart - fSelectionBase) % arr2Dsize % fCoord->GetNZBins() + fCoord->GetFirstZBin();

         fPlotInfo.Form("(binx = %d; biny = %d; binz = %d; binc = %f)", binI, binJ, binK,
                        fHist->GetBinContent(binI, binJ, binK));
      } else
         fPlotInfo = "Switch to true color mode to get correct info";
   }

   return (Char_t *)fPlotInfo.Data();
}


//______________________________________________________________________________
Bool_t TGLVoxelPainter::InitGeometry()
{
  //Set ranges, find min and max bin content.

   fCoord->SetZLog(kFALSE);
   fCoord->SetYLog(kFALSE);
   fCoord->SetXLog(kFALSE);

   if (!fCoord->SetRanges(fHist, kFALSE, kTRUE))//kFALSE == drawErrors, kTRUE == zAsBins
      return kFALSE;

   fBackBox.SetPlotBox(fCoord->GetXRangeScaled(), fCoord->GetYRangeScaled(), fCoord->GetZRangeScaled());
   if(fCamera) fCamera->SetViewVolume(fBackBox.Get3DBox());

   fMinMaxVal.second  = fHist->GetBinContent(fCoord->GetFirstXBin(), fCoord->GetFirstYBin(), fCoord->GetFirstZBin());
   fMinMaxVal.first = fMinMaxVal.second;
   //Bad. You can up-date some bin value and get wrong picture.
   for (Int_t ir = fCoord->GetFirstXBin(); ir <= fCoord->GetLastXBin(); ++ir) {
      for (Int_t jr = fCoord->GetFirstYBin(); jr <= fCoord->GetLastYBin(); ++jr) {
         for (Int_t kr = fCoord->GetFirstZBin();  kr <= fCoord->GetLastZBin(); ++kr) {
            fMinMaxVal.second = TMath::Max(fMinMaxVal.second, fHist->GetBinContent(ir, jr, kr));
            fMinMaxVal.first = TMath::Min(fMinMaxVal.first, fHist->GetBinContent(ir, jr, kr));
         }
      }
   }

   if (fCoord->Modified()) {
      fUpdateSelection = kTRUE;
      fXOZSectionPos = fBackBox.Get3DBox()[0].Y();
      fYOZSectionPos = fBackBox.Get3DBox()[0].X();
      fXOYSectionPos = fBackBox.Get3DBox()[0].Z();
      fCoord->ResetModified();
   }

   const TList *funcList = fHist->GetListOfFunctions();
   fTransferFunc = dynamic_cast<TF1*>(funcList->FindObject("TransferFunction"));

   return kTRUE;
}


//______________________________________________________________________________
void TGLVoxelPainter::StartPan(Int_t px, Int_t py)
{
   // User clicks right mouse button (in a pad).

   fMousePosition.fX = px;
   fMousePosition.fY = fCamera->GetHeight() - py;
   fCamera->StartPan(px, py);
   fBoxCut.StartMovement(px, fCamera->GetHeight() - py);
}


//______________________________________________________________________________
void TGLVoxelPainter::Pan(Int_t px, Int_t py)
{
   // User's moving mouse cursor, with middle mouse button pressed (for pad).
   // Calculate 3d shift related to 2d mouse movement.

   // User's moving mouse cursor, with middle mouse button pressed (for pad).
   // Calculate 3d shift related to 2d mouse movement.
   if (fSelectedPart >= fSelectionBase) {//Pan camera.
      SaveModelviewMatrix();
      SaveProjectionMatrix();

      fCamera->SetCamera();
      fCamera->Apply(fPadPhi, fPadTheta);
      fCamera->Pan(px, py);

      RestoreProjectionMatrix();
      RestoreModelviewMatrix();
   } else if (fSelectedPart > 0) {
      //Convert py into bottom-top orientation.
      //Possibly, move box here
      py = fCamera->GetHeight() - py;
      SaveModelviewMatrix();
      SaveProjectionMatrix();

      fCamera->SetCamera();
      fCamera->Apply(fPadPhi, fPadTheta);


      if (!fHighColor) {
         if (fBoxCut.IsActive() && (fSelectedPart >= kXAxis && fSelectedPart <= kZAxis))
            fBoxCut.MoveBox(px, py, fSelectedPart);
         else
            MoveSection(px, py);
      } else {
         MoveSection(px, py);
      }

      RestoreProjectionMatrix();
      RestoreModelviewMatrix();
   }

   fMousePosition.fX = px, fMousePosition.fY = py;
   fUpdateSelection = kTRUE;
}


//______________________________________________________________________________
void TGLVoxelPainter::AddOption(const TString &option)
{
   // "z" draw palette or not.
   option.Index("z") == kNPOS ? fDrawPalette = kFALSE : fDrawPalette = kTRUE;

}

//______________________________________________________________________________
void TGLVoxelPainter::ProcessEvent(Int_t event, Int_t /*px*/, Int_t py)
{
   // Remove sections, switch on/off box cut.

   if (event == kButton1Double && fBoxCut.IsActive()) {
      if (fBoxCut.IsActive())
         fBoxCut.TurnOnOff();
      if (!gVirtualX->IsCmdThread())
         gROOT->ProcessLineFast(Form("((TGLPlotPainter *)0x%lx)->Paint()", ULong_t(this)));
      else
         Paint();
   } else if (event == kKeyPress && (py == kKey_c || py == kKey_C)) {
      if (fHighColor)
         Info("ProcessEvent", "Switch to true color mode to use box cut");
      else {
         fBoxCut.TurnOnOff();
         fUpdateSelection = kTRUE;
      }
   }
}

//______________________________________________________________________________
void TGLVoxelPainter::InitGL()const
{
   // Initialize some gl state variables.

   glEnable(GL_DEPTH_TEST);
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);

   glEnable(GL_CULL_FACE);
   glCullFace(GL_BACK);

   glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
}

//______________________________________________________________________________
void TGLVoxelPainter::DeInitGL()const
{
   // Return back some gl state variables.

   glDisable(GL_DEPTH_TEST);
   glDisable(GL_LIGHTING);
   glDisable(GL_LIGHT0);
   glDisable(GL_CULL_FACE);
   glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
}

//______________________________________________________________________________
void TGLVoxelPainter::DrawPlot()const
{
   // Draw "voxels".

   //Shift plot to point of origin.
   const Rgl::PlotTranslation trGuard(this);

   if (!fSelectionPass)
      PreparePalette();

   fBackBox.DrawBox(fSelectedPart, fSelectionPass, fZLevels, fHighColor);

   TGLDisableGuard depthTest(GL_DEPTH_TEST);

   if (!fSelectionPass) {
      glEnable(GL_BLEND);//[1
      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   }

   //Using front point, find the correct order to draw boxes from
   //back to front/from bottom to top (it's important only for semi-transparent boxes).
   const Int_t frontPoint = fBackBox.GetFrontPoint();
   Int_t irInit = fCoord->GetFirstXBin(), iInit = 0;
   const Int_t nX = fCoord->GetNXBins();
   Int_t jrInit = fCoord->GetFirstYBin(), jInit = 0;
   const Int_t nY = fCoord->GetNYBins();
   Int_t krInit = fCoord->GetFirstZBin(), kInit = 0;
   const Int_t nZ = fCoord->GetNZBins();

   const Int_t addI = frontPoint == 2 || frontPoint == 1 ? 1 : (iInit = nX - 1, irInit = fCoord->GetLastXBin(), -1);
   const Int_t addJ = frontPoint == 2 || frontPoint == 3 ? 1 : (jInit = nY - 1, jrInit = fCoord->GetLastYBin(), -1);
   const Int_t addK = fBackBox.Get2DBox()[frontPoint + 4].Y() > fBackBox.Get2DBox()[frontPoint].Y() ? 1
                     : (kInit = nZ - 1, krInit = fCoord->GetLastZBin(),-1);
   const Double_t xScale = fCoord->GetXScale();
   const Double_t yScale = fCoord->GetYScale();
   const Double_t zScale = fCoord->GetZScale();
   const TAxis   *xA = fXAxis;
   const TAxis   *yA = fYAxis;
   const TAxis   *zA = fZAxis;

   if (fSelectionPass && fHighColor)
      Rgl::ObjectIDToColor(fSelectionBase, fHighColor);//base + 1 == 7

   Double_t maxContent = TMath::Max(TMath::Abs(fMinMaxVal.first), TMath::Abs(fMinMaxVal.second));
   if(!maxContent)//bad, find better way to check zero.
      maxContent = 1.;

   Float_t rgba[4] = {};

   for(Int_t ir = irInit, i = iInit; addI > 0 ? i < nX : i >= 0; ir += addI, i += addI) {
      for(Int_t jr = jrInit, j = jInit; addJ > 0 ? j < nY : j >= 0; jr += addJ, j += addJ) {
//         for(Int_t kr = krInit, k = kInit; addK > 0 ? k < nZ : k >= 0; kr += addK, k += addK) {
         for(Int_t kr = krInit, k = kInit; addK > 0 ? k < nZ : k >= 0; kr += addK, k += addK) {
            const Double_t xMin = xScale * xA->GetBinLowEdge(ir);
            const Double_t xMax = xScale * xA->GetBinUpEdge(ir);
            const Double_t yMin = yScale * yA->GetBinLowEdge(jr);
            const Double_t yMax = yScale * yA->GetBinUpEdge(jr);
            const Double_t zMin = zScale * zA->GetBinLowEdge(kr);
            const Double_t zMax = zScale * zA->GetBinUpEdge(kr);

            if (fBoxCut.IsActive() && fBoxCut.IsInCut(xMin, xMax, yMin, yMax, zMin, zMax))
               continue;

            FindVoxelColor(fHist->GetBinContent(ir, jr, kr), rgba);

            if (rgba[3] < 0.01f)
               continue;

            if (!fSelectionPass)
               SetVoxelColor(rgba);

            const Int_t binID = fSelectionBase + i * fCoord->GetNZBins() * fCoord->GetNYBins() + j * fCoord->GetNZBins() + k;

            if (fSelectionPass && !fHighColor)
               Rgl::ObjectIDToColor(binID, fHighColor);
            else if(!fHighColor && fSelectedPart == binID)
               glMaterialfv(GL_FRONT, GL_EMISSION, Rgl::gOrangeEmission);

            Rgl::DrawBoxFront(xMin, xMax, yMin, yMax, zMin, zMax, frontPoint);

            if (!fSelectionPass && !fHighColor && fSelectedPart == binID)
               glMaterialfv(GL_FRONT, GL_EMISSION, Rgl::gNullEmission);
         }
      }
   }

   if (fBoxCut.IsActive())
      fBoxCut.DrawBox(fSelectionPass, fSelectedPart);

   if (!fSelectionPass) {
      if (fDrawPalette)
         DrawPalette();
      glDisable(GL_BLEND);//1]
   }
}

//______________________________________________________________________________
void TGLVoxelPainter::DrawSectionXOZ()const
{
   // Noop.
}

//______________________________________________________________________________
void TGLVoxelPainter::DrawSectionYOZ()const
{
   // Noop.
}


//______________________________________________________________________________
void TGLVoxelPainter::DrawSectionXOY()const
{
   // Noop.
}

//______________________________________________________________________________
void TGLVoxelPainter::DrawPalette()const
{
   //Draw. Palette.
   if (!fPalette.GetPaletteSize() || !fCamera)
      return;

   if (!fHist->TestBit(TH1::kUserContour))
      Rgl::DrawPalette(fCamera, fPalette);
   else
      Rgl::DrawPalette(fCamera, fPalette, fLevels);

   glFinish();

   fCamera->SetCamera();
   fCamera->Apply(fPadPhi, fPadTheta);
}

//______________________________________________________________________________
void TGLVoxelPainter::DrawPaletteAxis()const
{
   //Draw. Palette. Axis.
   if (fCamera) {
      gVirtualX->SetDrawMode(TVirtualX::kCopy);//TCanvas by default sets in kInverse
      Rgl::DrawPaletteAxis(fCamera, fMinMaxVal, kFALSE);
   }
}

//______________________________________________________________________________
void TGLVoxelPainter::PreparePalette()const
{
   //Generate palette.
   if(fMinMaxVal.first == fMinMaxVal.second)
      return;//must be std::abs(fMinMaxVal.second - fMinMaxVal.first) < ...

   fLevels.clear();
   UInt_t paletteSize = 0;

   if (fHist->TestBit(TH1::kUserContour)) {
      if (const UInt_t trySize = fHist->GetContour()) {
         fLevels.reserve(trySize);

         for (UInt_t i = 0; i < trySize; ++i) {
            const Double_t level = fHist->GetContourLevel(Int_t(i));
            if (level <= fMinMaxVal.first || level >= fMinMaxVal.second)
               continue;
            fLevels.push_back(level);
         }
         //sort levels
         if (fLevels.size()) {
            std::sort(fLevels.begin(), fLevels.end());
            fLevels.push_back(fMinMaxVal.second);
            fLevels.insert(fLevels.begin(), fMinMaxVal.first);
            fPalette.SetContours(&fLevels);
            paletteSize = fLevels.size() - 1;
         }
      }

      if (!paletteSize)
         fHist->ResetBit(TH1::kUserContour);
   }

   if (!paletteSize && !(paletteSize = gStyle->GetNumberContours()))
      paletteSize = 20;

   fPalette.GeneratePalette(paletteSize, fMinMaxVal);
}

//______________________________________________________________________________
void TGLVoxelPainter::FindVoxelColor(Double_t binContent, Float_t *rgba)const
{
   // Find box color.
   const UChar_t * tc = fPalette.GetColour(binContent);
   rgba[3] = 0.06f; //Just a constant transparency.


   if (fTransferFunc) {
      rgba[3] = fTransferFunc->Eval(binContent);
   }

   rgba[0] = tc[0] / 255.f;
   rgba[1] = tc[1] / 255.f;
   rgba[2] = tc[2] / 255.f;
}


//______________________________________________________________________________
void TGLVoxelPainter::SetVoxelColor(const Float_t *diffColor)const
{
   // Set box color.
   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffColor);
   const Float_t specColor[] = {1.f, 1.f, 1.f, 1.f};
   glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specColor);
   glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 70.f);
}
 TGLVoxelPainter.cxx:1
 TGLVoxelPainter.cxx:2
 TGLVoxelPainter.cxx:3
 TGLVoxelPainter.cxx:4
 TGLVoxelPainter.cxx:5
 TGLVoxelPainter.cxx:6
 TGLVoxelPainter.cxx:7
 TGLVoxelPainter.cxx:8
 TGLVoxelPainter.cxx:9
 TGLVoxelPainter.cxx:10
 TGLVoxelPainter.cxx:11
 TGLVoxelPainter.cxx:12
 TGLVoxelPainter.cxx:13
 TGLVoxelPainter.cxx:14
 TGLVoxelPainter.cxx:15
 TGLVoxelPainter.cxx:16
 TGLVoxelPainter.cxx:17
 TGLVoxelPainter.cxx:18
 TGLVoxelPainter.cxx:19
 TGLVoxelPainter.cxx:20
 TGLVoxelPainter.cxx:21
 TGLVoxelPainter.cxx:22
 TGLVoxelPainter.cxx:23
 TGLVoxelPainter.cxx:24
 TGLVoxelPainter.cxx:25
 TGLVoxelPainter.cxx:26
 TGLVoxelPainter.cxx:27
 TGLVoxelPainter.cxx:28
 TGLVoxelPainter.cxx:29
 TGLVoxelPainter.cxx:30
 TGLVoxelPainter.cxx:31
 TGLVoxelPainter.cxx:32
 TGLVoxelPainter.cxx:33
 TGLVoxelPainter.cxx:34
 TGLVoxelPainter.cxx:35
 TGLVoxelPainter.cxx:36
 TGLVoxelPainter.cxx:37
 TGLVoxelPainter.cxx:38
 TGLVoxelPainter.cxx:39
 TGLVoxelPainter.cxx:40
 TGLVoxelPainter.cxx:41
 TGLVoxelPainter.cxx:42
 TGLVoxelPainter.cxx:43
 TGLVoxelPainter.cxx:44
 TGLVoxelPainter.cxx:45
 TGLVoxelPainter.cxx:46
 TGLVoxelPainter.cxx:47
 TGLVoxelPainter.cxx:48
 TGLVoxelPainter.cxx:49
 TGLVoxelPainter.cxx:50
 TGLVoxelPainter.cxx:51
 TGLVoxelPainter.cxx:52
 TGLVoxelPainter.cxx:53
 TGLVoxelPainter.cxx:54
 TGLVoxelPainter.cxx:55
 TGLVoxelPainter.cxx:56
 TGLVoxelPainter.cxx:57
 TGLVoxelPainter.cxx:58
 TGLVoxelPainter.cxx:59
 TGLVoxelPainter.cxx:60
 TGLVoxelPainter.cxx:61
 TGLVoxelPainter.cxx:62
 TGLVoxelPainter.cxx:63
 TGLVoxelPainter.cxx:64
 TGLVoxelPainter.cxx:65
 TGLVoxelPainter.cxx:66
 TGLVoxelPainter.cxx:67
 TGLVoxelPainter.cxx:68
 TGLVoxelPainter.cxx:69
 TGLVoxelPainter.cxx:70
 TGLVoxelPainter.cxx:71
 TGLVoxelPainter.cxx:72
 TGLVoxelPainter.cxx:73
 TGLVoxelPainter.cxx:74
 TGLVoxelPainter.cxx:75
 TGLVoxelPainter.cxx:76
 TGLVoxelPainter.cxx:77
 TGLVoxelPainter.cxx:78
 TGLVoxelPainter.cxx:79
 TGLVoxelPainter.cxx:80
 TGLVoxelPainter.cxx:81
 TGLVoxelPainter.cxx:82
 TGLVoxelPainter.cxx:83
 TGLVoxelPainter.cxx:84
 TGLVoxelPainter.cxx:85
 TGLVoxelPainter.cxx:86
 TGLVoxelPainter.cxx:87
 TGLVoxelPainter.cxx:88
 TGLVoxelPainter.cxx:89
 TGLVoxelPainter.cxx:90
 TGLVoxelPainter.cxx:91
 TGLVoxelPainter.cxx:92
 TGLVoxelPainter.cxx:93
 TGLVoxelPainter.cxx:94
 TGLVoxelPainter.cxx:95
 TGLVoxelPainter.cxx:96
 TGLVoxelPainter.cxx:97
 TGLVoxelPainter.cxx:98
 TGLVoxelPainter.cxx:99
 TGLVoxelPainter.cxx:100
 TGLVoxelPainter.cxx:101
 TGLVoxelPainter.cxx:102
 TGLVoxelPainter.cxx:103
 TGLVoxelPainter.cxx:104
 TGLVoxelPainter.cxx:105
 TGLVoxelPainter.cxx:106
 TGLVoxelPainter.cxx:107
 TGLVoxelPainter.cxx:108
 TGLVoxelPainter.cxx:109
 TGLVoxelPainter.cxx:110
 TGLVoxelPainter.cxx:111
 TGLVoxelPainter.cxx:112
 TGLVoxelPainter.cxx:113
 TGLVoxelPainter.cxx:114
 TGLVoxelPainter.cxx:115
 TGLVoxelPainter.cxx:116
 TGLVoxelPainter.cxx:117
 TGLVoxelPainter.cxx:118
 TGLVoxelPainter.cxx:119
 TGLVoxelPainter.cxx:120
 TGLVoxelPainter.cxx:121
 TGLVoxelPainter.cxx:122
 TGLVoxelPainter.cxx:123
 TGLVoxelPainter.cxx:124
 TGLVoxelPainter.cxx:125
 TGLVoxelPainter.cxx:126
 TGLVoxelPainter.cxx:127
 TGLVoxelPainter.cxx:128
 TGLVoxelPainter.cxx:129
 TGLVoxelPainter.cxx:130
 TGLVoxelPainter.cxx:131
 TGLVoxelPainter.cxx:132
 TGLVoxelPainter.cxx:133
 TGLVoxelPainter.cxx:134
 TGLVoxelPainter.cxx:135
 TGLVoxelPainter.cxx:136
 TGLVoxelPainter.cxx:137
 TGLVoxelPainter.cxx:138
 TGLVoxelPainter.cxx:139
 TGLVoxelPainter.cxx:140
 TGLVoxelPainter.cxx:141
 TGLVoxelPainter.cxx:142
 TGLVoxelPainter.cxx:143
 TGLVoxelPainter.cxx:144
 TGLVoxelPainter.cxx:145
 TGLVoxelPainter.cxx:146
 TGLVoxelPainter.cxx:147
 TGLVoxelPainter.cxx:148
 TGLVoxelPainter.cxx:149
 TGLVoxelPainter.cxx:150
 TGLVoxelPainter.cxx:151
 TGLVoxelPainter.cxx:152
 TGLVoxelPainter.cxx:153
 TGLVoxelPainter.cxx:154
 TGLVoxelPainter.cxx:155
 TGLVoxelPainter.cxx:156
 TGLVoxelPainter.cxx:157
 TGLVoxelPainter.cxx:158
 TGLVoxelPainter.cxx:159
 TGLVoxelPainter.cxx:160
 TGLVoxelPainter.cxx:161
 TGLVoxelPainter.cxx:162
 TGLVoxelPainter.cxx:163
 TGLVoxelPainter.cxx:164
 TGLVoxelPainter.cxx:165
 TGLVoxelPainter.cxx:166
 TGLVoxelPainter.cxx:167
 TGLVoxelPainter.cxx:168
 TGLVoxelPainter.cxx:169
 TGLVoxelPainter.cxx:170
 TGLVoxelPainter.cxx:171
 TGLVoxelPainter.cxx:172
 TGLVoxelPainter.cxx:173
 TGLVoxelPainter.cxx:174
 TGLVoxelPainter.cxx:175
 TGLVoxelPainter.cxx:176
 TGLVoxelPainter.cxx:177
 TGLVoxelPainter.cxx:178
 TGLVoxelPainter.cxx:179
 TGLVoxelPainter.cxx:180
 TGLVoxelPainter.cxx:181
 TGLVoxelPainter.cxx:182
 TGLVoxelPainter.cxx:183
 TGLVoxelPainter.cxx:184
 TGLVoxelPainter.cxx:185
 TGLVoxelPainter.cxx:186
 TGLVoxelPainter.cxx:187
 TGLVoxelPainter.cxx:188
 TGLVoxelPainter.cxx:189
 TGLVoxelPainter.cxx:190
 TGLVoxelPainter.cxx:191
 TGLVoxelPainter.cxx:192
 TGLVoxelPainter.cxx:193
 TGLVoxelPainter.cxx:194
 TGLVoxelPainter.cxx:195
 TGLVoxelPainter.cxx:196
 TGLVoxelPainter.cxx:197
 TGLVoxelPainter.cxx:198
 TGLVoxelPainter.cxx:199
 TGLVoxelPainter.cxx:200
 TGLVoxelPainter.cxx:201
 TGLVoxelPainter.cxx:202
 TGLVoxelPainter.cxx:203
 TGLVoxelPainter.cxx:204
 TGLVoxelPainter.cxx:205
 TGLVoxelPainter.cxx:206
 TGLVoxelPainter.cxx:207
 TGLVoxelPainter.cxx:208
 TGLVoxelPainter.cxx:209
 TGLVoxelPainter.cxx:210
 TGLVoxelPainter.cxx:211
 TGLVoxelPainter.cxx:212
 TGLVoxelPainter.cxx:213
 TGLVoxelPainter.cxx:214
 TGLVoxelPainter.cxx:215
 TGLVoxelPainter.cxx:216
 TGLVoxelPainter.cxx:217
 TGLVoxelPainter.cxx:218
 TGLVoxelPainter.cxx:219
 TGLVoxelPainter.cxx:220
 TGLVoxelPainter.cxx:221
 TGLVoxelPainter.cxx:222
 TGLVoxelPainter.cxx:223
 TGLVoxelPainter.cxx:224
 TGLVoxelPainter.cxx:225
 TGLVoxelPainter.cxx:226
 TGLVoxelPainter.cxx:227
 TGLVoxelPainter.cxx:228
 TGLVoxelPainter.cxx:229
 TGLVoxelPainter.cxx:230
 TGLVoxelPainter.cxx:231
 TGLVoxelPainter.cxx:232
 TGLVoxelPainter.cxx:233
 TGLVoxelPainter.cxx:234
 TGLVoxelPainter.cxx:235
 TGLVoxelPainter.cxx:236
 TGLVoxelPainter.cxx:237
 TGLVoxelPainter.cxx:238
 TGLVoxelPainter.cxx:239
 TGLVoxelPainter.cxx:240
 TGLVoxelPainter.cxx:241
 TGLVoxelPainter.cxx:242
 TGLVoxelPainter.cxx:243
 TGLVoxelPainter.cxx:244
 TGLVoxelPainter.cxx:245
 TGLVoxelPainter.cxx:246
 TGLVoxelPainter.cxx:247
 TGLVoxelPainter.cxx:248
 TGLVoxelPainter.cxx:249
 TGLVoxelPainter.cxx:250
 TGLVoxelPainter.cxx:251
 TGLVoxelPainter.cxx:252
 TGLVoxelPainter.cxx:253
 TGLVoxelPainter.cxx:254
 TGLVoxelPainter.cxx:255
 TGLVoxelPainter.cxx:256
 TGLVoxelPainter.cxx:257
 TGLVoxelPainter.cxx:258
 TGLVoxelPainter.cxx:259
 TGLVoxelPainter.cxx:260
 TGLVoxelPainter.cxx:261
 TGLVoxelPainter.cxx:262
 TGLVoxelPainter.cxx:263
 TGLVoxelPainter.cxx:264
 TGLVoxelPainter.cxx:265
 TGLVoxelPainter.cxx:266
 TGLVoxelPainter.cxx:267
 TGLVoxelPainter.cxx:268
 TGLVoxelPainter.cxx:269
 TGLVoxelPainter.cxx:270
 TGLVoxelPainter.cxx:271
 TGLVoxelPainter.cxx:272
 TGLVoxelPainter.cxx:273
 TGLVoxelPainter.cxx:274
 TGLVoxelPainter.cxx:275
 TGLVoxelPainter.cxx:276
 TGLVoxelPainter.cxx:277
 TGLVoxelPainter.cxx:278
 TGLVoxelPainter.cxx:279
 TGLVoxelPainter.cxx:280
 TGLVoxelPainter.cxx:281
 TGLVoxelPainter.cxx:282
 TGLVoxelPainter.cxx:283
 TGLVoxelPainter.cxx:284
 TGLVoxelPainter.cxx:285
 TGLVoxelPainter.cxx:286
 TGLVoxelPainter.cxx:287
 TGLVoxelPainter.cxx:288
 TGLVoxelPainter.cxx:289
 TGLVoxelPainter.cxx:290
 TGLVoxelPainter.cxx:291
 TGLVoxelPainter.cxx:292
 TGLVoxelPainter.cxx:293
 TGLVoxelPainter.cxx:294
 TGLVoxelPainter.cxx:295
 TGLVoxelPainter.cxx:296
 TGLVoxelPainter.cxx:297
 TGLVoxelPainter.cxx:298
 TGLVoxelPainter.cxx:299
 TGLVoxelPainter.cxx:300
 TGLVoxelPainter.cxx:301
 TGLVoxelPainter.cxx:302
 TGLVoxelPainter.cxx:303
 TGLVoxelPainter.cxx:304
 TGLVoxelPainter.cxx:305
 TGLVoxelPainter.cxx:306
 TGLVoxelPainter.cxx:307
 TGLVoxelPainter.cxx:308
 TGLVoxelPainter.cxx:309
 TGLVoxelPainter.cxx:310
 TGLVoxelPainter.cxx:311
 TGLVoxelPainter.cxx:312
 TGLVoxelPainter.cxx:313
 TGLVoxelPainter.cxx:314
 TGLVoxelPainter.cxx:315
 TGLVoxelPainter.cxx:316
 TGLVoxelPainter.cxx:317
 TGLVoxelPainter.cxx:318
 TGLVoxelPainter.cxx:319
 TGLVoxelPainter.cxx:320
 TGLVoxelPainter.cxx:321
 TGLVoxelPainter.cxx:322
 TGLVoxelPainter.cxx:323
 TGLVoxelPainter.cxx:324
 TGLVoxelPainter.cxx:325
 TGLVoxelPainter.cxx:326
 TGLVoxelPainter.cxx:327
 TGLVoxelPainter.cxx:328
 TGLVoxelPainter.cxx:329
 TGLVoxelPainter.cxx:330
 TGLVoxelPainter.cxx:331
 TGLVoxelPainter.cxx:332
 TGLVoxelPainter.cxx:333
 TGLVoxelPainter.cxx:334
 TGLVoxelPainter.cxx:335
 TGLVoxelPainter.cxx:336
 TGLVoxelPainter.cxx:337
 TGLVoxelPainter.cxx:338
 TGLVoxelPainter.cxx:339
 TGLVoxelPainter.cxx:340
 TGLVoxelPainter.cxx:341
 TGLVoxelPainter.cxx:342
 TGLVoxelPainter.cxx:343
 TGLVoxelPainter.cxx:344
 TGLVoxelPainter.cxx:345
 TGLVoxelPainter.cxx:346
 TGLVoxelPainter.cxx:347
 TGLVoxelPainter.cxx:348
 TGLVoxelPainter.cxx:349
 TGLVoxelPainter.cxx:350
 TGLVoxelPainter.cxx:351
 TGLVoxelPainter.cxx:352
 TGLVoxelPainter.cxx:353
 TGLVoxelPainter.cxx:354
 TGLVoxelPainter.cxx:355
 TGLVoxelPainter.cxx:356
 TGLVoxelPainter.cxx:357
 TGLVoxelPainter.cxx:358
 TGLVoxelPainter.cxx:359
 TGLVoxelPainter.cxx:360
 TGLVoxelPainter.cxx:361
 TGLVoxelPainter.cxx:362
 TGLVoxelPainter.cxx:363
 TGLVoxelPainter.cxx:364
 TGLVoxelPainter.cxx:365
 TGLVoxelPainter.cxx:366
 TGLVoxelPainter.cxx:367
 TGLVoxelPainter.cxx:368
 TGLVoxelPainter.cxx:369
 TGLVoxelPainter.cxx:370
 TGLVoxelPainter.cxx:371
 TGLVoxelPainter.cxx:372
 TGLVoxelPainter.cxx:373
 TGLVoxelPainter.cxx:374
 TGLVoxelPainter.cxx:375
 TGLVoxelPainter.cxx:376
 TGLVoxelPainter.cxx:377
 TGLVoxelPainter.cxx:378
 TGLVoxelPainter.cxx:379
 TGLVoxelPainter.cxx:380
 TGLVoxelPainter.cxx:381
 TGLVoxelPainter.cxx:382
 TGLVoxelPainter.cxx:383
 TGLVoxelPainter.cxx:384
 TGLVoxelPainter.cxx:385
 TGLVoxelPainter.cxx:386
 TGLVoxelPainter.cxx:387
 TGLVoxelPainter.cxx:388
 TGLVoxelPainter.cxx:389
 TGLVoxelPainter.cxx:390
 TGLVoxelPainter.cxx:391
 TGLVoxelPainter.cxx:392
 TGLVoxelPainter.cxx:393
 TGLVoxelPainter.cxx:394
 TGLVoxelPainter.cxx:395
 TGLVoxelPainter.cxx:396
 TGLVoxelPainter.cxx:397
 TGLVoxelPainter.cxx:398
 TGLVoxelPainter.cxx:399
 TGLVoxelPainter.cxx:400
 TGLVoxelPainter.cxx:401
 TGLVoxelPainter.cxx:402
 TGLVoxelPainter.cxx:403
 TGLVoxelPainter.cxx:404
 TGLVoxelPainter.cxx:405
 TGLVoxelPainter.cxx:406
 TGLVoxelPainter.cxx:407
 TGLVoxelPainter.cxx:408
 TGLVoxelPainter.cxx:409
 TGLVoxelPainter.cxx:410
 TGLVoxelPainter.cxx:411
 TGLVoxelPainter.cxx:412
 TGLVoxelPainter.cxx:413
 TGLVoxelPainter.cxx:414
 TGLVoxelPainter.cxx:415
 TGLVoxelPainter.cxx:416
 TGLVoxelPainter.cxx:417
 TGLVoxelPainter.cxx:418
 TGLVoxelPainter.cxx:419
 TGLVoxelPainter.cxx:420
 TGLVoxelPainter.cxx:421
 TGLVoxelPainter.cxx:422
 TGLVoxelPainter.cxx:423
 TGLVoxelPainter.cxx:424
 TGLVoxelPainter.cxx:425
 TGLVoxelPainter.cxx:426
 TGLVoxelPainter.cxx:427
 TGLVoxelPainter.cxx:428
 TGLVoxelPainter.cxx:429
 TGLVoxelPainter.cxx:430
 TGLVoxelPainter.cxx:431
 TGLVoxelPainter.cxx:432