27#include "TGLIncludes.h"
64 fBinInfo.Form(
"(binx = %d; biny = %d; binc = %f)", binI, binJ,
65 fHist->GetBinContent(binI, binJ));
67 fBinInfo =
"Switch to true-color mode to obtain correct info";
79 switch (
fCoord->GetCoordType()) {
112 for (
Int_t i = 0, ir =
fCoord->GetFirstXBin();
i < nX; ++
i, ++ir) {
125 for (
Int_t i = 0, ir =
fCoord->GetFirstXBin();
i < nX; ++
i, ++ir) {
142 for (
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
147 if (
fYEdges[j].second > frame[2].Y())
149 if (
fYEdges[j].first < frame[0].Y())
151 if (
fYEdges[j].second < frame[0].Y())
155 for (
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
159 if (
fYEdges[j].second > frame[2].Y())
161 if (
fYEdges[j].first < frame[0].Y())
163 if (
fYEdges[j].second < frame[0].Y())
185 for (
Int_t j =
fCoord->GetFirstYBin(), e1 =
fCoord->GetLastYBin(); j <= e1; ++j) {
216 for (
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
228 for (
Int_t i = 0, ir =
fCoord->GetFirstXBin();
i < nX; ++
i, ++ir) {
245 for (
Int_t j =
fCoord->GetFirstYBin(), e1 =
fCoord->GetLastYBin(); j <= e1; ++j) {
272 for (
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
277 for (
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
288 for (
Int_t i = 0, ir =
fCoord->GetFirstXBin();
i < nX; ++
i, ++ir) {
311 for (
Int_t j =
fCoord->GetFirstYBin(), e1 =
fCoord->GetLastYBin(); j <= e1; ++j) {
336 for (
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
350 for (
Int_t i = 0, ir =
fCoord->GetFirstXBin();
i < nX; ++
i, ++ir) {
368 for (
Int_t j =
fCoord->GetFirstYBin(), e1 =
fCoord->GetLastYBin(); j <= e1; ++j) {
437 if (legoPos + 4 <
option.Length() && isdigit(
option[legoPos + 4])) {
438 switch (
option[legoPos + 4] -
'0') {
456 if (ePos == legoPos + 1)
457 ePos =
option.Index(
"e", legoPos + 4);
468 glEnable(GL_DEPTH_TEST);
469 glEnable(GL_LIGHTING);
472 glEnable(GL_CULL_FACE);
475 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,
GL_TRUE);
483 glDisable(GL_DEPTH_TEST);
484 glDisable(GL_LIGHTING);
485 glDisable(GL_LIGHT0);
486 glDisable(GL_CULL_FACE);
487 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,
GL_FALSE);
498 switch (
fCoord->GetCoordType()) {
525 glEnable(GL_POLYGON_OFFSET_FILL);
526 glPolygonOffset(1.f, 1.f);
531 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
541 Int_t iInit = 0, jInit = 0, irInit =
fCoord->GetFirstXBin(), jrInit =
fCoord->GetFirstYBin();
542 const Int_t addI = frontPoint == 2 || frontPoint == 1 ? 1 : (iInit = nX - 1, irInit =
fCoord->GetLastXBin(), -1);
543 const Int_t addJ = frontPoint == 2 || frontPoint == 3 ? 1 : (jInit = nY - 1, jrInit =
fCoord->GetLastYBin(), -1);
550 fPalette.EnableTexture(GL_MODULATE);
557 for(
Int_t j = jInit, jr = jrInit; addJ > 0 ? j < nY : j >= 0; j += addJ, jr += addJ) {
575 fPalette.GetTexCoord(zMax), frontPoint);
591 glDisable(GL_POLYGON_OFFSET_FILL);
594 glColor3d(0., 0., 0.);
596 glColor4d(0., 0., 0., 0.4);
597 glPolygonMode(GL_FRONT, GL_LINE);
600 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
602 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
605 for(
Int_t j = jInit, jr = jrInit; addJ > 0 ? j < nY : j >= 0; j += addJ, jr += addJ) {
617 fYEdges[j].second, zMax, errorZMax);
622 glPolygonMode(GL_FRONT, GL_FILL);
639 glEnable(GL_POLYGON_OFFSET_FILL);
640 glPolygonOffset(1.f, 1.f);
650 fPalette.EnableTexture(GL_MODULATE);
656 for(
Int_t i = 0, ir =
fCoord->GetFirstXBin();
i < nX; ++
i, ++ir) {
657 for(
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
693 glDisable(GL_POLYGON_OFFSET_FILL);
695 glColor3d(0., 0., 0.);
696 glPolygonMode(GL_FRONT, GL_LINE);
698 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
700 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
702 for(
Int_t i = 0, ir =
fCoord->GetFirstXBin();
i < nX; ++
i, ++ir) {
703 for(
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
719 glPolygonMode(GL_FRONT, GL_FILL);
734 if (legoR > 1. || legoR < 0.)
740 glEnable(GL_POLYGON_OFFSET_FILL);
741 glPolygonOffset(1.f, 1.f);
746 legoR *=
fCoord->GetXScale();
753 fPalette.EnableTexture(GL_MODULATE);
759 for(
Int_t i = 0, ir =
fCoord->GetFirstXBin();
i < nX; ++
i, ++ir) {
760 for(
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
762 Double_t zMax = legoR + (
fHist->GetBinContent(ir, jr) -
fCoord->GetZRange().first) / rRange * sc;
764 std::swap(zMin, zMax);
798 glDisable(GL_POLYGON_OFFSET_FILL);
800 glColor3d(0., 0., 0.);
801 glPolygonMode(GL_FRONT, GL_LINE);
804 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
806 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
808 for(
Int_t i = 0, ir =
fCoord->GetFirstXBin();
i < nX; ++
i, ++ir) {
809 for(
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
811 Double_t zMax = legoR + (
fHist->GetBinContent(ir, jr) -
fCoord->GetZRange().first) / rRange * sc;
813 std::swap(zMin, zMax);
827 glPolygonMode(GL_FRONT, GL_FILL);
843 if (legoR > 1. || legoR < 0.)
848 glEnable(GL_POLYGON_OFFSET_FILL);
849 glPolygonOffset(1.f, 1.f);
860 fPalette.EnableTexture(GL_MODULATE);
866 for(
Int_t i = 0, ir =
fCoord->GetFirstXBin();
i < nX; ++
i, ++ir) {
867 for(
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
869 Double_t zMax = legoR + (
fHist->GetBinContent(ir, jr) -
fCoord->GetZRange().first) / rRange * sc;
871 std::swap(zMin, zMax);
920 glDisable(GL_POLYGON_OFFSET_FILL);
922 glColor3d(0., 0., 0.);
923 glPolygonMode(GL_FRONT, GL_LINE);
925 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
927 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
929 for(
Int_t i = 0, ir =
fCoord->GetFirstXBin();
i < nX; ++
i, ++ir) {
930 for(
Int_t j = 0, jr =
fCoord->GetFirstYBin(); j < nY; ++j, ++jr) {
932 Double_t zMax = legoR + (
fHist->GetBinContent(ir, jr) -
fCoord->GetZRange().first) / rRange * sc;
934 std::swap(zMin, zMax);
964 glPolygonMode(GL_FRONT, GL_FILL);
976 Float_t diffColor[] = {0.8f, 0.8f, 0.8f, 0.15f};
980 c->GetRGB(diffColor[0], diffColor[1], diffColor[2]);
982 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffColor);
983 const Float_t specColor[] = {1.f, 1.f, 1.f, 1.f};
984 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specColor);
985 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 70.f);
1003 binY +=
fCoord->GetFirstYBin();
1004 glColor3d(1., 0., 0.);
1039 binX +=
fCoord->GetFirstXBin();
1040 glColor3d(1., 0., 0.);
1080 gROOT->ProcessLineFast(
Form(
"((TGLPlotPainter *)0x%zx)->Paint()", (
size_t)
this));
1084 Info(
"ProcessEvent",
"Box cut does not exist for lego");
1099 zVal *=
fCoord->GetZScale();
1103 if (zVal > frame[4].Z())
1104 zVal = frame[4].
Z();
1105 else if (zVal < frame[0].Z())
1106 zVal = frame[0].
Z();
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
Option_t Option_t TPoint TPoint angle
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t points
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
R__EXTERN TStyle * gStyle
The color creation and management class.
Plot-painter implementing LEGO rendering of TH2 histograms in cartesian, polar, cylindrical and spher...
Bool_t InitGeometryCartesian()
Geometry for lego in cartesian coords.
Bool_t PreparePalette() const
Initialize color palette.
void DrawSectionXOZ() const override
XOZ plane parallel section.
void DrawSectionXOY() const override
Empty. No such sections for lego.
void DrawLegoSpherical() const
Lego in spherical system.
std::vector< Rgl::Range_t > fXEdges
void StartPan(Int_t px, Int_t py) override
User clicks on a lego with middle mouse button (middle for pad).
Bool_t InitGeometryCylindrical()
Geometry for lego in cylindrical coords.
void AddOption(const TString &stringOption) override
Parse additional options.
void InitGL() const override
Initialize some gl state variables.
char * GetPlotInfo(Int_t px, Int_t py) override
Obtain bin's info (i, j, value).
void DrawLegoPolar() const
Lego in polar system.
void DrawSectionYOZ() const override
YOZ plane parallel section.
void Pan(Int_t px, Int_t py) override
Move lego or section.
Bool_t ClampZ(Double_t &zVal) const
Clamp z value.
Bool_t InitGeometrySpherical()
Geometry for lego in spherical coords.
void DrawPlot() const override
Select method corresponding to coordinate system.
TGLLegoPainter(const TGLLegoPainter &)
void DrawPalette() const
Draw.
void DrawLegoCartesian() const
Lego in cartesian system.
void SetLegoColor() const
Set lego's color.
std::vector< Rgl::Range_t > fYEdges
std::vector< CosSin_t > fCosSinTableX
void DeInitGL() const override
Return some gl states to original values.
void DrawLegoCylindrical() const
Lego in cylindrical system.
std::vector< CosSin_t > fCosSinTableY
Bool_t InitGeometryPolar()
Geometry for lego in polar coords.
void ProcessEvent(Int_t event, Int_t px, Int_t py) override
Remove all sections and repaint.
Bool_t InitGeometry() override
Select method.
void DrawPaletteAxis() const override
Draw. Palette. Axis.
Camera for TGLPlotPainter and sub-classes.
Helper class for plot-painters holding information about axis ranges, numbers of bins and flags if ce...
void DrawSections() const
Draw sections (if any).
TGLPlotPainter(TH1 *hist, TGLPlotCamera *camera, TGLPlotCoordinates *coord, Bool_t xoySelectable, Bool_t xozSelectable, Bool_t yozSelectable)
TGLPlotPainter's ctor.
std::vector< Double_t > fZLevels
void RestoreModelviewMatrix() const
TGLPlotCoordinates * fCoord
void Paint() override
Draw lego/surf/whatever you can.
void SaveProjectionMatrix() const
void SaveModelviewMatrix() const
void MoveSection(Int_t px, Int_t py)
Create dynamic profile using selected plane.
void RestoreProjectionMatrix() const
3 component (x/y/z) vertex class.
TH1 is the base class of all histogram classes in ROOT.
@ kUserContour
User specified contour levels.
void DrawTrapezoid(const Double_t ver[][2], Double_t zMin, Double_t zMax, Bool_t color=kTRUE)
void DrawTrapezoidTextured(const Double_t ver[][2], Double_t zMin, Double_t zMax, Double_t tMin, Double_t tMax)
In polar coordinates, box became trapezoid.
const Float_t gNullEmission[]
void ObjectIDToColor(Int_t objectID, Bool_t highColor)
Object id encoded as rgb triplet.
void SetZLevels(TAxis *zAxis, Double_t zMin, Double_t zMax, Double_t zScale, std::vector< Double_t > &zLevels)
void DrawPalette(const TGLPlotCamera *camera, const TGLLevelPalette &palette)
Draw. Palette.
void DrawPaletteAxis(const TGLPlotCamera *camera, const Range_t &minMax, Bool_t logZ)
void DrawTrapezoidTextured2(const Double_t ver[][2], Double_t zMin, Double_t zMax, Double_t tMin, Double_t tMax)
In polar coordinates, box became trapezoid.
void DrawCylinder(TGLQuadric *quadric, Double_t xMin, Double_t xMax, Double_t yMin, Double_t yMax, Double_t zMin, Double_t zMax)
Cylinder for lego3.
void DrawError(Double_t xMin, Double_t xMax, Double_t yMin, Double_t yMax, Double_t zMin, Double_t zMax)
std::pair< Double_t, Double_t > Range_t
void DrawBoxFront(Double_t xMin, Double_t xMax, Double_t yMin, Double_t yMax, Double_t zMin, Double_t zMax, Int_t fp)
Draws lego's bar as a 3d box.
void DrawBoxFrontTextured(Double_t xMin, Double_t xMax, Double_t yMin, Double_t yMax, Double_t zMin, Double_t zMax, Double_t tMin, Double_t tMax, Int_t front)
Draws lego's bar as a 3d box LULULULU.
const Float_t gOrangeEmission[]
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Double_t Log10(Double_t x)
Returns the common (base-10) logarithm of x.
constexpr Double_t TwoPi()