42 fXOZSlice("XOZ", (
TH3 *)hist, coord, &fBackBox,
TGLTH3Slice::kXOZ),
43 fYOZSlice("YOZ", (
TH3 *)hist, coord, &fBackBox,
TGLTH3Slice::kYOZ),
44 fXOYSlice("XOY", (
TH3 *)hist, coord, &fBackBox,
TGLTH3Slice::kXOY),
57 fXOZSlice(
"XOZ", (
TH3 *)hist, coord, &fBackBox,
TGLTH3Slice::kXOZ),
58 fYOZSlice(
"YOZ", (
TH3 *)hist, coord, &fBackBox,
TGLTH3Slice::kYOZ),
59 fXOYSlice(
"XOY", (
TH3 *)hist, coord, &fBackBox,
TGLTH3Slice::kXOY),
84 fPlotInfo.
Form(
"(binx = %d; biny = %d; binz = %d; binc = %f)", binI, binJ, binK,
87 fPlotInfo =
"Switch to true color mode to get correct info";
130 for (
unsigned i = 0; i <
fPMPoints.size(); i += 3) {
211 if (boxPos + 3 < option.
Length() && isdigit(option[boxPos + 3]))
230 gROOT->ProcessLineFast(
Form(
"((TGLPlotPainter *)0x%lx)->Paint()", (
ULong_t)
this));
235 Info(
"ProcessEvent",
"Switch to true color mode to use box cut");
248 glEnable(GL_DEPTH_TEST);
249 glEnable(GL_LIGHTING);
252 glEnable(GL_CULL_FACE);
255 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
263 glDisable(GL_DEPTH_TEST);
264 glDisable(GL_LIGHTING);
265 glDisable(GL_LIGHT0);
266 glDisable(GL_CULL_FACE);
267 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
281 const Double_t ratio = onSphere ? 0.4 : 0.15;
282 const Double_t leftX = xMin + ratio * (xMax - xMin), rightX = xMax - ratio * (xMax - xMin);
283 const Double_t leftY = yMin + ratio * (yMax - yMin), rightY = yMax - ratio * (yMax - yMin);
284 const Double_t lowZ = zMin / 2. + zMax / 2. - 0.1 * (zMax - zMin);
285 const Double_t upZ = zMin / 2. + zMax / 2. + 0.1 * (zMax - zMin);
288 const Double_t minusVerts[][3] = {{xMin, leftY, lowZ}, {xMin, leftY, upZ}, {xMin, rightY, upZ}, {xMin, rightY, lowZ},
289 {leftX, yMin, lowZ}, {rightX, yMin, lowZ}, {rightX, yMin, upZ}, {leftX, yMin, upZ},
290 {xMax, leftY, lowZ}, {xMax, rightY, lowZ}, {xMax, rightY, upZ}, {xMax, leftY, upZ},
291 {rightX, yMax, lowZ}, {leftX, yMax, lowZ}, {leftX, yMax, upZ}, {rightX, yMax, upZ}};
292 const Int_t minusQuads[][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}, {12, 13, 14, 15}};
296 glColor3d(1., 0., 0.);
298 const Int_t frontPlanes[][2] = {{0, 1}, {1, 2}, {2, 3}, {3, 0}};
299 const Int_t *verts = minusQuads[frontPlanes[fp][0]];
302 glVertex3dv(minusVerts[verts[0]]);
303 glVertex3dv(minusVerts[verts[1]]);
304 glVertex3dv(minusVerts[verts[2]]);
305 glVertex3dv(minusVerts[verts[3]]);
308 verts = minusQuads[frontPlanes[fp][1]];
311 glVertex3dv(minusVerts[verts[0]]);
312 glVertex3dv(minusVerts[verts[1]]);
313 glVertex3dv(minusVerts[verts[2]]);
314 glVertex3dv(minusVerts[verts[3]]);
317 const Float_t nullEmission[] = {0.f, 0.f, 0.f, 1.f};
318 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, nullEmission);
319 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, nullEmission);
321 glColor4d(0., 0., 0., 0.25);
322 glPolygonMode(GL_FRONT, GL_LINE);
326 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
329 glEnable(GL_LINE_SMOOTH);
330 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
332 verts = minusQuads[frontPlanes[fp][0]];
335 glVertex3dv(minusVerts[verts[0]]);
336 glVertex3dv(minusVerts[verts[1]]);
337 glVertex3dv(minusVerts[verts[2]]);
338 glVertex3dv(minusVerts[verts[3]]);
341 verts = minusQuads[frontPlanes[fp][1]];
344 glVertex3dv(minusVerts[verts[0]]);
345 glVertex3dv(minusVerts[verts[1]]);
346 glVertex3dv(minusVerts[verts[2]]);
347 glVertex3dv(minusVerts[verts[3]]);
350 glPolygonMode(GL_FRONT, GL_FILL);
371 glDisable(GL_CULL_FACE);
373 glEnable(GL_CULL_FACE);
376 glEnable(GL_POLYGON_OFFSET_FILL);
377 glPolygonOffset(1.
f, 1.
f);
382 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
396 const Int_t addI = frontPoint == 2 || frontPoint == 1 ? 1 : (iInit = nX - 1, irInit =
fCoord->
GetLastXBin(), -1);
397 const Int_t addJ = frontPoint == 2 || frontPoint == 3 ? 1 : (jInit = nY - 1, jrInit =
fCoord->
GetLastYBin(), -1);
414 for(
Int_t ir = irInit, i = iInit; addI > 0 ? i < nX : i >= 0; ir += addI, i += addI) {
415 for(
Int_t jr = jrInit, j = jInit; addJ > 0 ? j < nY : j >= 0; jr += addJ, j += addJ) {
416 for(
Int_t kr = krInit, k = kInit; addK > 0 ? k < nZ : k >= 0; kr += addK, k += addK) {
458 glDisable(GL_POLYGON_OFFSET_FILL);
460 glColor4d(0., 0., 0., 0.25);
461 glPolygonMode(GL_FRONT, GL_LINE);
464 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
466 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
468 for(
Int_t ir = irInit, i = iInit; addI > 0 ? i < nX : i >= 0; ir += addI, i += addI) {
469 for(
Int_t jr = jrInit, j = jInit; addJ > 0 ? j < nY : j >= 0; jr += addJ, j += addJ) {
470 for(
Int_t kr = krInit, k = kInit; addK > 0 ? k < nZ : k >= 0; kr += addK, k += addK) {
490 glPolygonMode(GL_FRONT, GL_FILL);
511 glDisable(GL_LIGHTING);
514 const Double_t dX = (bb[1].
X() - bb[0].
X()) / 40.;
515 const Double_t dY = (bb[3].
Y() - bb[0].
Y()) / 40.;
516 const Double_t dZ = (bb[4].
Z() - bb[0].
Z()) / 40.;
520 glEnable(GL_LIGHTING);
528 Float_t diffColor[] = {0.8f, 0.8f, 0.8f, 0.05f};
537 c->GetRGB(diffColor[0], diffColor[1], diffColor[2]);
540 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffColor);
541 const Float_t specColor[] = {1.f, 1.f, 1.f, 1.f};
542 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specColor);
543 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 70.
f);
Camera for TGLPlotPainter and sub-classes.
Int_t GetNXBins() const
Number of X bins.
const Rgl::Range_t & GetZRangeScaled() const
Scaled range.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
void MoveBox(Int_t px, Int_t py, Int_t axisID)
Move box cut along selected direction.
const TGLLevelPalette & GetPalette() const
const Float_t gNullEmission[]
TGLBoxPainter(const TGLBoxPainter &)
void StartPan(Int_t px, Int_t py)
User clicks right mouse button (in a pad).
Int_t GetLastXBin() const
void StartPan(Int_t px, Int_t py)
User clicks somewhere (px, py).
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
const Rgl::Range_t & GetYRangeScaled() const
Scaled range.
Short_t Min(Short_t a, Short_t b)
Int_t GetFirstZBin() const
void TurnOnOff()
Turn the box cut on/off.
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width.
void DeInitGL() const
Return back some gl state variables.
void DrawPalette(const TGLPlotCamera *camera, const TGLLevelPalette &palette)
Draw. Palette.
void DrawPaletteAxis(const TGLPlotCamera *camera, const Range_t &minMax, Bool_t logZ)
void DrawPalette() const
Draw.
static void RenderPolyMarkers(const TAttMarker &marker, Char_t transp, Float_t *p, Int_t n, Int_t pick_radius=0, Bool_t selection=kFALSE, Bool_t sec_selection=kFALSE)
Render polymarkers at points specified by p-array.
void SetMinMax(const Rgl::Range_t &newRange)
std::vector< Double_t > fPMPoints
Double_t GetZScale() const
Int_t GetFirstXBin() const
Paints TH3 histograms by rendering variable-sized boxes matching the bin contents.
void DrawSectionXOY() const
Draw XOY parallel section.
const char * Data() const
void SaveProjectionMatrix() const
void ProcessEvent(Int_t event, Int_t px, Int_t py)
Remove sections.
ClassImp(TGLBoxPainter) TGLBoxPainter
Normal constructor.
3 component (x/y/z) vertex class.
void DrawSlice(Double_t pos) const
Draw slice.
Bool_t InitGeometry()
Set ranges, find min and max bin content.
void Info(const char *location, const char *msgfmt,...)
void SetYLog(Bool_t yLog)
If log changed, sections must be reset, set fModified.
void DrawSectionYOZ() const
Draw YOZ parallel section.
void AddOption(const TString &stringOption)
Box1 == spheres.
virtual Float_t * GetP() const
Double_t GetXScale() const
void Apply(Double_t phi, Double_t theta) const
Applies rotations and translations before drawing.
void SetViewVolume(const TGLVertex3 *box)
'box' is the TGLPlotPainter's back box's coordinates.
The 3-D histogram classes derived from the 1-D histogram classes.
Int_t GetNZBins() const
Number of Z bins.
const TPolyMarker3D * fPolymarker
Bool_t HasSections() const
Check, if any section exists.
Bool_t GetZLog() const
Get Z log.
void DrawCloud() const
Draw a frame and a polymarker inside.
void RestoreProjectionMatrix() const
void ObjectIDToColor(Int_t objectID, Bool_t highColor)
Object id encoded as rgb triplet.
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.
Class to manage histogram axis.
void DrawBox(Bool_t selectionPass, Int_t selected) const
Draw cut as a semi-transparent box.
Int_t GetLastZBin() const
virtual Double_t GetBinUpEdge(Int_t bin) const
Return up edge of bin.
void DrawSections() const
Draw sections (if any).
virtual Color_t GetFillColor() const
Helper class for plot-painters holding information about axis ranges, numbers of bins and flags if ce...
void ResetModified()
Reset modified.
void DrawPaletteAxis() const
Draw. Palette. Axis.
void Pan(Int_t px, Int_t py)
Pan camera.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
char * Form(const char *fmt,...)
void SaveModelviewMatrix() const
void SetXLog(Bool_t xLog)
If log changed, sections must be reset, set fModified.
virtual const char * GetName() const
Returns name of object.
Base class for plot-painters that provide GL rendering of various 2D and 3D histograms, functions and parametric surfaces.
char * GetPlotInfo(Int_t px, Int_t py)
Show box info (i, j, k, binContent).
std::vector< Double_t > fZLevels
const TGLVertex3 * Get2DBox() const
Get 2D box.
void RestoreModelviewMatrix() const
void Pan(Int_t px, Int_t py)
User's moving mouse cursor, with middle mouse button pressed (for pad).
void DrawSectionXOZ() const
Draw XOZ parallel section.
void DrawBox(Int_t selectedPart, Bool_t selectionPass, const std::vector< Double_t > &zLevels, Bool_t highColor) const
Draw back box for a plot.
Int_t GetFirstYBin() const
Int_t GetNYBins() const
Number of Y bins.
The color creation and management class.
Bool_t SetRanges(const TH1 *hist, Bool_t errors=kFALSE, Bool_t zBins=kFALSE)
Set bin ranges, ranges.
const TGLVertex3 * Get3DBox() const
Get 3D box.
Int_t GetFrontPoint() const
The nearest point.
Int_t GetPaletteSize() const
Get. Palette. Size.
void DrawSphere(TGLQuadric *quadric, Double_t xMin, Double_t xMax, Double_t yMin, Double_t yMax, Double_t zMin, Double_t zMax)
Cylinder for lego3.
Bool_t IsInCut(Double_t xMin, Double_t xMax, Double_t yMin, Double_t yMax, Double_t zMin, Double_t zMax) const
Check, if box defined by xmin/xmax etc. is in cut.
EGLCoordType GetCoordType() const
Get coordinates type.
const Rgl::Range_t & GetXRangeScaled() const
Scaled range.
const Float_t * fPhysicalShapeColor
void SetPlotColor() const
Set boxes color.
Double_t GetYScale() const
void SetZLog(Bool_t zLog)
If log changed, sections must be reset, set fModified.
void StartMovement(Int_t px, Int_t py)
Start cut's movement.
void MoveSection(Int_t px, Int_t py)
Create dynamic profile using selected plane.
Short_t Max(Short_t a, Short_t b)
void SetPlotBox(const Rgl::Range_t &xRange, const Rgl::Range_t &yRange, const Rgl::Range_t &zRange)
Set up a frame box.
Bool_t Modified() const
Modified.
Int_t GetLastYBin() const
virtual Int_t GetN() const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
std::complex< float_v > Z
TGLPlotCoordinates * fCoord
virtual void Paint()
Draw lego/surf/whatever you can.
const Float_t gOrangeEmission[]
void SetCamera() const
Viewport and projection.
Int_t GetHeight() const
viewport[3]
void InitGL() const
Initialize some gl state variables.