3 #include "NLTProjectorGL.h"
4 #include <Reve/NLTProjector.h>
7 #include <TGLIncludes.h>
15 //______________________________________________________________________
19 ClassImp(NLTProjectorGL)
21 NLTProjectorGL::NLTProjectorGL() :
32 fDLCache = kFALSE; // Disable display list.
33 fText = new TGLText();
34 fText->SetGLTextFont(40);
35 fText->SetTextColor(0);
38 NLTProjectorGL::~NLTProjectorGL()
40 /**************************************************************************/
41 const char* NLTProjectorGL::GetText(Float_t x) const
43 using namespace TMath;
44 // TODO: Form could be replaced with own version of printf
47 Float_t v = 10*TMath::Nint(x/10.0f);
48 return Form("%.0f", v);
50 else if( Abs(x) > 100 )
52 Float_t v = TMath::Nint(x);
53 return Form("%.0f", v);
55 else if ( Abs(x) > 10 )
57 return Form("%.1f", x);
59 else if ( Abs(x) > 1 )
61 return Form("%.2f", x);
65 return Form("%.3f", x);
69 /**************************************************************************/
70 void NLTProjectorGL::SetRange(Float_t pos, Int_t ax) const
72 using namespace TMath;
73 Float_t limit = fM->GetProjection()->GetLimit(ax, pos > 0 ? kTRUE: kFALSE);
74 // printf("NLTProjectorGL::SetRange pos %f range %f \n", pos, limit );
75 if ( fM->GetProjection()->GetDistortion() > 0.001 && Abs(pos) > Abs(limit *0.97))
77 fPos.push_back(limit *0.7);
78 fVals.push_back(fM->GetProjection()->GetValForScreenPos(ax, fPos.back()));
79 // printf("bbox value out of limit:: val %f, pos %f\n", limit, fVals.back());
85 fVals.push_back(fM->GetProjection()->GetValForScreenPos(ax, fPos.back()));
89 /**************************************************************************/
91 void NLTProjectorGL::DrawTickMarks(Float_t tm) const
94 for( std::list<Float_t>::iterator pi = fPos.begin(); pi!= fPos.end(); pi++)
96 glVertex3f(*pi, 0, 0.);
97 glVertex3f(*pi, tm, 0.);
102 /**************************************************************************/
104 void NLTProjectorGL::DrawHInfo() const
106 Float_t tms = fTMSize*fRange;
110 glRotatef(-90, 1, 0, 0);
111 glTranslatef(0, 0, -tms -fLabelOff*fRange);
113 Float_t llx, lly, llz, urx, ury, urz;
114 std::list<Float_t>::iterator vi = fVals.begin();
115 for( std::list<Float_t>::iterator pi = fPos.begin(); pi!= fPos.end(); pi++)
118 fText->BBox(txt, llx, lly, llz, urx, ury, urz);
119 fText->PaintGLText(*pi -(urx-llx)*fText->GetTextSize()*0.5, 0, 0, txt);
124 fPos.clear(); fVals.clear();
127 /**************************************************************************/
128 void NLTProjectorGL::DrawVInfo() const
130 Float_t tms = fTMSize*fRange;
131 glRotatef(90, 0, 0, 1);
133 glRotatef(-90, 0, 0, 1);
136 glRotatef(-90, 1, 0, 0);
137 glTranslatef(-fLabelOff*fRange -tms, 0, 0);
139 Float_t llx, lly, llz, urx, ury, urz;
140 std::list<Float_t>::iterator vi = fVals.begin();
141 for( std::list<Float_t>::iterator pi = fPos.begin(); pi!= fPos.end(); pi++)
144 fText->BBox(txt, llx, lly, llz, urx, ury, urz);
145 fText->PaintGLText(-(urx-llx)*fText->GetTextSize(), 0, *pi - (ury - lly)*fText->GetTextSize()*0.5, txt);
150 fPos.clear(); fVals.clear();
153 /**************************************************************************/
154 void NLTProjectorGL::SplitInterval(Int_t ax) const
156 if (fM->GetSplitInfoLevel())
158 if(fM->GetSplitInfoMode())
159 SplitIntervalByVal(fVals.front(), fVals.back(), ax, 0);
161 SplitIntervalByPos(fPos.front(), fPos.back(), ax, 0);
165 /**************************************************************************/
166 void NLTProjectorGL::SplitIntervalByPos(Float_t minp, Float_t maxp, Int_t ax, Int_t level) const
168 Float_t p = (minp+maxp)*0.5;
170 Float_t v = fM->GetProjection()->GetValForScreenPos(ax, p);
172 // printf("level %d position %f value %f\n", level, p,v);
174 if(level<fM->GetSplitInfoLevel())
176 SplitIntervalByPos(minp, p , ax, level);
177 SplitIntervalByPos(p, maxp, ax, level);
181 /**************************************************************************/
182 void NLTProjectorGL::SplitIntervalByVal(Float_t minv, Float_t maxv, Int_t ax, Int_t level) const
184 Float_t v = (minv+maxv)*0.5;
186 Float_t p = fM->GetProjection()->GetScreenVal(ax, v);
188 //printf("level %d position %f value %f MINMAX val(%f, %f)\n", level, p,v, minv, maxv);
190 if(level<fM->GetSplitInfoLevel())
192 SplitIntervalByVal(minv, v , ax, level);
193 SplitIntervalByVal(v, maxv, ax, level);
198 /**************************************************************************/
199 void NLTProjectorGL::DirectDraw(TGLRnrCtx & /*rnrCtx*/) const
201 // printf("NLTProjectorGL::DirectDraw %d\n.", fM->GetMainColor());
203 glGetBooleanv(GL_LIGHTING, &lightp);
204 if (lightp) glDisable(GL_LIGHTING);
206 Float_t* bbox = fM->GetBBox();
207 fRange = bbox[1] - bbox[0];
208 // printf("bbox %f, %f\n", bbox[0], bbox[1]);
210 fM->GetProjection()->ProjectVector(zeroPos);
211 fText->SetTextSize(fLabelSize*fRange);
212 fText->SetTextColor(fM->GetAxisColor());
216 glTranslatef(0, bbox[2], 0);
218 SetRange(bbox[0], 0);
219 fPos.push_back(zeroPos.x); fVals.push_back(0);
223 fPos.push_back(zeroPos.x); fVals.push_back(0);
224 SetRange(bbox[1], 0);
225 SplitInterval(0); fVals.pop_front(); fPos.pop_front();
231 glTranslatef(bbox[0], 0, 0);
233 fPos.push_back(zeroPos.y);fVals.push_back(0);
234 SetRange(bbox[2], 1);
238 fPos.push_back(zeroPos.y); fVals.push_back(0);
239 SetRange(bbox[3], 1);
240 SplitInterval(1);fPos.pop_front(); fVals.pop_front();
247 glVertex3f(bbox[0], bbox[2], 0.);
248 glVertex3f(bbox[1], bbox[2], 0.);
249 glVertex3f(bbox[0], bbox[2], 0.);
250 glVertex3f(bbox[0], bbox[3], 0.);
254 if(fM->GetDrawCenter())
256 Float_t* c = fM->GetProjection()->GetProjectedCenter();
257 glColor3f(1., 0., 0.);
259 glVertex3f(c[0] +d, c[1], c[2]); glVertex3f(c[0] - d, c[1] , c[2]);
260 glVertex3f(c[0] , c[1] +d, c[2]); glVertex3f(c[0] , c[1] -d, c[2]);
261 glVertex3f(c[0] , c[1], c[2] + d); glVertex3f(c[0] , c[1] , c[2] - d);
266 if(fM->GetDrawOrigin())
269 fM->GetProjection()->ProjectVector(zero);
270 glColor3f(1., 1., 1.);
272 glVertex3f(zero[0] +d, zero[1], zero[2]); glVertex3f(zero[0] - d, zero[1] , zero[2]);
273 glVertex3f(zero[0] , zero[1] +d, zero[2]); glVertex3f(zero[0] , zero[1] -d, zero[2]);
274 glVertex3f(zero[0] , zero[1], zero[2] + d); glVertex3f(zero[0] , zero[1] , zero[2] - d);
277 if (lightp) glEnable(GL_LIGHTING);
281 /**************************************************************************/
283 Bool_t NLTProjectorGL::SetModel(TObject* obj, const Option_t* /*opt*/)
285 if(SetModelCheckClass(obj, NLTProjector::Class())) {
286 fM = dynamic_cast<NLTProjector*>(obj);
292 /**************************************************************************/
294 void NLTProjectorGL::SetBBox()
296 // !! This ok if master sub-classed from TAttBBox
297 SetAxisAlignedBBox(((NLTProjector*)fExternalObj)->AssertBBox());