41 void ReplaceUVNames(
TString &equation)
49 for (
Ssiz_t i = 0; i < len;) {
50 const char c = equation[i];
56 if (c ==
'u' || c ==
'v') {
59 if (i == len || (!isalpha(equation[i]) && !isdigit(equation[i]) && equation[i] !=
'_')) {
61 equation[i - 1] = c ==
'u' ?
'x' : (++vFound,
'y');
65 while (i < len && (isalpha(equation[i]) || isdigit(equation[i]) || equation[i] ==
'_'))
69 while (i < len && (isalpha(equation[i]) || isdigit(equation[i]) || equation[i] ==
'_'))
134 if (!xFun.Length() || !yFun.Length() || !zFun.Length()) {
135 Error(
"TGLParametricEquation",
"One of string expressions is empty");
142 ReplaceUVNames(equation);
143 fXEquation.reset(
new TF2(name +
"xEquation", equation.
Data(), uMin, uMax, vMin, vMax));
145 if (fXEquation->IsZombie()) {
152 ReplaceUVNames(equation);
153 fYEquation.reset(
new TF2(name +
"yEquation", equation.
Data(), uMin, uMax, vMin, vMax));
155 if (fYEquation->IsZombie()) {
162 ReplaceUVNames(equation);
163 fZEquation.reset(
new TF2(name +
"zEquation", equation.
Data(), uMin, uMax, vMin, vMax));
165 if (fZEquation->IsZombie())
182 Error(
"TGLParametricEquation",
"Function ptr is null");
257 return fPainter->DistancetoPrimitive(px, py);
267 return fPainter->ExecuteEvent(event, px, py);
275 static char mess[] = {
"parametric surface" };
306 fXAxis = &fCartesianXAxis;
307 fYAxis = &fCartesianYAxis;
308 fZAxis = &fCartesianZAxis;
310 fCoord = &fCartesianCoord;
333 fMesh.SetRowLen(fMeshSize);
338 const Double_t dU = (uRange.second - uRange.first) / (fMeshSize - 1);
339 const Double_t dV = (vRange.second - vRange.first) / (fMeshSize - 1);
346 using namespace TMath;
352 min.
X() =
Min(min.
X(), newVert.
X());
354 min.
Y() =
Min(min.
Y(), newVert.
Y());
356 min.
Z() =
Min(min.
Z(), newVert.
Z());
359 fMesh[i][j].fPos = newVert;
366 TH3F hist(
"tmp",
"tmp", 2, -1., 1., 2, -1., 1., 2, -1., 1.);
457 static char mess[] = {
"parametric surface" };
477 gROOT->ProcessLineFast(
Form(
"((TGLPlotPainter *)0x%lx)->Paint()", (
ULong_t)
this));
483 Info(
"ProcessEvent",
"Switch to true color to use box cut");
506 glEnable(GL_DEPTH_TEST);
507 glEnable(GL_LIGHTING);
509 glDisable(GL_CULL_FACE);
510 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
518 glDisable(GL_DEPTH_TEST);
519 glDisable(GL_LIGHTING);
520 glDisable(GL_LIGHT0);
521 glDisable(GL_CULL_FACE);
522 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
536 glEnable(GL_POLYGON_OFFSET_FILL);
537 glPolygonOffset(1.
f, 1.
f);
543 glBegin(GL_TRIANGLES);
546 for (
Int_t j = 0; j < fMeshSize - 1; ++j) {
561 glNormal3dv(
fMesh[i + 1][j + 1].fNormal.CArr());
563 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
fMesh[i + 1][j + 1].fRGBA);
564 glVertex3dv(
fMesh[i + 1][j + 1].fPos.CArr());
566 glNormal3dv(
fMesh[i][j + 1].fNormal.CArr());
568 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
fMesh[i][j + 1].fRGBA);
569 glVertex3dv(
fMesh[i][j + 1].fPos.CArr());
571 glNormal3dv(
fMesh[i][j].fNormal.CArr());
573 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
fMesh[i][j].fRGBA);
574 glVertex3dv(
fMesh[i][j].fPos.CArr());
576 glNormal3dv(
fMesh[i + 1][j].fNormal.CArr());
578 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
fMesh[i + 1][j].fRGBA);
579 glVertex3dv(
fMesh[i + 1][j].fPos.CArr());
581 glNormal3dv(
fMesh[i + 1][j + 1].fNormal.CArr());
583 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
fMesh[i + 1][j + 1].fRGBA);
584 glVertex3dv(
fMesh[i + 1][j + 1].fPos.CArr());
586 glNormal3dv(
fMesh[i][j].fNormal.CArr());
588 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
fMesh[i][j].fRGBA);
589 glVertex3dv(
fMesh[i][j].fPos.CArr());
596 glDisable(GL_POLYGON_OFFSET_FILL);
601 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
602 glColor4d(0., 0., 0., 0.5);
603 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
605 for (
Int_t i = 0; i < fMeshSize - 1; ++i) {
606 for (
Int_t j = 0; j < fMeshSize - 1; ++j) {
621 glVertex3dv(
fMesh[i][j].fPos.CArr());
622 glVertex3dv(
fMesh[i][j + 1].fPos.CArr());
623 glVertex3dv(
fMesh[i + 1][j + 1].fPos.CArr());
624 glVertex3dv(
fMesh[i + 1][j].fPos.CArr());
629 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
684 const Float_t specular[] = {1.f, 1.f, 1.f, 1.f};
685 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
686 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 20.
f);
689 const Float_t outerDiff[] = {0.5f, 0.42f, 0.f, 1.f};
690 glMaterialfv(GL_FRONT, GL_DIFFUSE, outerDiff);
691 const Float_t innerDiff[] = {0.5f, 0.2f, 0.f, 1.f};
692 glMaterialfv(GL_BACK, GL_DIFFUSE, innerDiff);
void InitGL() const
Initialize gl state.
ParametricEquation_t fEquation
Camera for TGLPlotPainter and sub-classes.
static Vc_ALWAYS_INLINE int_v min(const int_v &x, const int_v &y)
const Rgl::Range_t & GetZRangeScaled() const
Scaled range.
void MoveBox(Int_t px, Int_t py, Int_t axisID)
Move box cut along selected direction.
void EvalVertex(TGLVertex3 &newVertex, Double_t u, Double_t v) const
Calculate vertex.
void Pan(Int_t px, Int_t py)
User's moving mouse cursor, with middle mouse button pressed (for pad).
virtual void SetDirectory(TDirectory *dir)
By default when an histogram is created, it is added to the list of histogram objects in the current ...
3-D histogram with a float per channel (see TH1 documentation)}
void DrawSectionYOZ() const
No such sections.
std::pair< Double_t, Double_t > Range_t
const Double_t * CArr() const
void StartPan(Int_t px, Int_t py)
User clicks somewhere (px, py).
void SetConstrained(Bool_t c)
Set constrained.
const Rgl::Range_t & GetYRangeScaled() const
Scaled range.
Short_t Min(Short_t a, Short_t b)
void ToLower()
Change string to lower-case.
void TurnOnOff()
Turn the box cut on/off.
Int_t DistancetoPrimitive(Int_t px, Int_t py)
Check, if parametric surface is under cursor.
void DeInitGL() const
Initialize gl state.
Double_t GetZScale() const
T * Normal2Plane(const T v1[3], const T v2[3], const T v3[3], T normal[3])
TGLViewer::ECameraType camera
const char * Data() const
void SaveProjectionMatrix() const
3 component (x/y/z) vertex class.
The TNamed class is the base class for all named ROOT classes.
Bool_t IsModified() const
Something was changed in parametric equation (or constrained option was changed). ...
TGL2DArray< Vertex_t > fMesh
void SetSurfaceColor() const
Set material properties.
void Info(const char *location, const char *msgfmt,...)
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
TGLParametricEquation(const TString &name, const TString &xEquation, const TString &yEquation, const TString &zEquation, Double_t uMin, Double_t uMax, Double_t vMin, Double_t vMax)
void Error(const char *location, const char *msgfmt,...)
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.
void RestoreProjectionMatrix() const
void ObjectIDToColor(Int_t objectID, Bool_t highColor)
Object id encoded as rgb triplet.
TGLParametricEquation * fEquation
void DrawBox(Bool_t selectionPass, Int_t selected) const
Draw cut as a semi-transparent box.
void Pan(Int_t px, Int_t py)
Pan camera.
char * Form(const char *fmt,...)
void SaveModelviewMatrix() const
void(* ParametricEquation_t)(TGLVertex3 &, Double_t u, Double_t v)
A parametric surface is a surface defined by a parametric equation, involving two parameters (u...
Base class for plot-painters that provide GL rendering of various 2D and 3D histograms, functions and parametric surfaces.
Rgl::Range_t GetVRange() const
[vMin, vMax]
void ExecuteEvent(Int_t event, Int_t px, Int_t py)
Pass event to painter.
Bool_t InitGeometry()
Build mesh.
Rgl::Range_t GetURange() const
[uMin, uMax]
void RestoreModelviewMatrix() const
virtual void Copy(TObject &axis) const
Copy axis structure to another axis.
Bool_t IsConstrained() const
Check is constrained.
void DrawSectionXOY() const
No such sections.
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.
void AddOption(const TString &option)
No additional options for parametric surfaces.
void DrawSectionXOZ() const
No such sections.
static Vc_ALWAYS_INLINE int_v max(const int_v &x, const int_v &y)
The histogram painter class using OpenGL.
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.
void GetColor(Float_t v, Float_t vmin, Float_t vmax, Int_t type, Float_t *rgba)
This function creates color for parametric surface's vertex, using its 'u' value. ...
void StartPan(Int_t px, Int_t py)
User clicks right mouse button (in a pad).
void Paint(Option_t *option)
Delegate paint.
const Rgl::Range_t & GetXRangeScaled() const
Scaled range.
void SetModified(Bool_t m)
Set modified.
Double_t GetYScale() const
void StartMovement(Int_t px, Int_t py)
Start cut's movement.
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.
void ProcessEvent(Int_t event, Int_t px, Int_t py)
Change color/mesh size or switch on/off mesh/box cut.
virtual void Set(Int_t nbins, Double_t xmin, Double_t xmax)
Initialize axis with fix bins.
void InitColors()
Calculate colors for vertices, using one of 20 color themes.
ClassImp(TGLParametricEquation) TGLParametricEquation
Surface is defined by three strings.
virtual void SetTitle(const char *title="")
Change (i.e. set) the title of the TNamed.
TGLPlotCoordinates * fCoord
virtual void Paint()
Draw lego/surf/whatever you can.
void SetCamera() const
Viewport and projection.
char * GetObjectInfo(Int_t px, Int_t py) const
No object info yet.
Int_t GetHeight() const
viewport[3]
void DrawPlot() const
Draw parametric surface.
char * GetPlotInfo(Int_t px, Int_t py)
No object info yet.