3 #include "TPCSegmentGL.h"
7 #include <TStopwatch.h>
10 using namespace Alieve;
13 /**************************************************************************/
15 TPCSegmentGL::TPCSegmentGL() : TGLObject()
22 TPCSegmentGL::~TPCSegmentGL()
24 if(fImage) delete fImage;
25 if(fTexture) glDeleteTextures(1, &fTexture);
29 /**************************************************************************/
31 Bool_t TPCSegmentGL::SetModel(TObject* obj)
33 if( set_model(obj, "Alieve::TPCSegment")){
34 fSegment = (TPCSegment*) fExternalObj;
40 void TPCSegmentGL::SetBBox()
42 set_axis_aligned_bbox(((TPCSegment*)fExternalObj)->AssertBBox());
45 /**************************************************************************/
47 void TPCSegmentGL::DirectDraw(const TGLDrawFlags & ) const
49 // printf("TPCSegmentGL::DirectDraw \n");
51 if(fSegment->fInfo == 0 ) return;
52 TPCDigitsInfo* info = fSegment->fInfo;
54 if(fRTS < fSegment->fRTS) {
56 fRTS = fSegment->fRTS;
59 glPushAttrib(GL_CURRENT_BIT | GL_DEPTH_BUFFER_BIT |
60 GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT | GL_POLYGON_BIT);
62 glDisable(GL_LIGHTING);
63 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
64 glEnable(GL_COLOR_MATERIAL);
65 glDisable(GL_CULL_FACE);
69 if(fSegment->fUseTexture) {
72 glDepthMask(GL_FALSE);
73 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
74 glShadeModel(GL_FLAT);
76 glBindTexture (GL_TEXTURE_2D, fTexture);
79 glEnable(GL_POLYGON_OFFSET_FILL);
81 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
82 glBindTexture(GL_TEXTURE_2D, fTexture);
83 glEnable(GL_TEXTURE_2D);
85 DisplayTexture(info->fInnSeg.fPadWidth, info->fInnSeg.fPadLength, info->fInnSeg.fRlow,
86 info->fInnSeg.fNMaxPads, info->fInnSeg.fNRows, 0,0);
87 DisplayTexture(info->fOut1Seg.fPadWidth, info->fOut1Seg.fPadLength, info->fOut1Seg.fRlow,
88 info->fOut1Seg.fNMaxPads,info->fOut1Seg.fNRows,info->fInnSeg.fNMaxPads,0);
89 DisplayTexture(info->fOut2Seg.fPadWidth, info->fOut2Seg.fPadLength, info->fOut2Seg.fRlow,
90 info->fOut2Seg.fNMaxPads, info->fOut2Seg.fNRows,0,info->fOut1Seg.fNRows);
92 glDisable(GL_TEXTURE_2D);
94 DisplayQuads(info->fInnSeg.fPadWidth, info->fInnSeg.fPadLength, info->fInnSeg.fRlow,
95 info->fInnSeg.fNMaxPads, info->fInnSeg.fNRows, 0,0);
96 DisplayQuads(info->fOut1Seg.fPadWidth, info->fOut1Seg.fPadLength, info->fOut1Seg.fRlow,
97 info->fOut1Seg.fNMaxPads,info->fOut1Seg.fNRows,info->fInnSeg.fNMaxPads,0);
98 DisplayQuads(info->fOut2Seg.fPadWidth, info->fOut2Seg.fPadLength, info->fOut2Seg.fRlow,
99 info->fOut2Seg.fNMaxPads, info->fOut2Seg.fNRows,0,info->fOut1Seg.fNRows);
102 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
108 /**************************************************************************/
110 void TPCSegmentGL::LoadPadrow(Int_t row, Int_t col_off) const
112 AliSimDigits *digit = &fSegment->fInfo->fSimDigits;
115 Int_t time, pad, val;
118 Int_t min_time = fSegment->fMinTime;
119 Int_t max_time = fSegment->fMaxTime;
120 Bool_t half_border_time = ((fSegment->fMaxTime - fSegment->fMinTime) % 2 == 0);
122 Bool_t done_p = false;
123 Bool_t save_p = false;
128 time = digit->CurrentRow();
129 pad = digit->CurrentColumn();
130 val = digit->CurrentDigit();
132 Bool_t use_digit = true;
134 if(fSegment->fShowMax) {
139 // Integrate int max_val.
140 if(time >= min_time && time <= max_time) {
141 if(half_border_time && (time == min_time || time == max_time))
150 if(pad != digit->CurrentColumn())
158 pad_var = TMath::Min(pad_var, fSegment->fMaxVal);
159 if(pad_var > fSegment->fTreshold) {
160 img_pos = GetRowCol(row, pad + col_off);
161 SetCol(pad_var, img_pos);
169 /**************************************************************************/
171 void TPCSegmentGL::SetCol(Float_t z, UChar_t* pixel) const
174 Int_t n_col = gStyle->GetNumberOfColors();
176 Int_t ci = gStyle->GetColorPalette
177 (TMath::Min(n_col - 1,
178 Int_t((n_col*(z - fSegment->fTreshold))/(fSegment->fMaxVal - fSegment->fTreshold))));
180 TColor* c = gROOT->GetColor(ci);
183 // UChar_t *x = (UChar_t*) &c;
184 pixel[0] = (UChar_t)(255*c->GetRed());
185 pixel[1] = (UChar_t)(255*c->GetGreen());
186 pixel[2] = (UChar_t)(255*c->GetBlue());
191 /**************************************************************************/
193 void TPCSegmentGL::CreateTexture(TPCDigitsInfo* info) const
195 AliSimDigits *digit = &info->fSimDigits;
196 AliTPCParam *par = info->fParameter;
198 TTree* t = info->fTree;
199 Int_t s, row, ent, off;
201 TStopwatch* sw = new TStopwatch();
206 fImage = new UChar_t[ImageWidth*ImageHeight*4];
207 glGenTextures(1, &fTexture);
209 memset(fImage, 0, ImageWidth*ImageHeight*4);
211 ent = info->fSegEnt[fSegment->fID];
214 // info->fInnSeg.Dump();
215 while(ent < t->GetEntriesFast()) {
217 par->AdjustSectorRow(digit->GetID(),s,row);
218 // printf("AdjustSectorRow DigitID %d sector %d row %d \n",digit->GetID(),s,row );
219 if(s != fSegment->fID) break;
220 off = (info->fInnSeg.fNMaxPads - par->GetNPadsLow(row))/2;
221 LoadPadrow(row, off);
225 ent = info->fSegEnt[fSegment->fID + 36];
228 // info->fOut1Seg.Dump();
229 while(ent < t->GetEntriesFast()) {
231 par->AdjustSectorRow(digit->GetID(),s,row);
232 // printf("AdjustSectorRow DigitID %d sector %d row %d \n",digit->GetID(),s,row );
233 if(s != (fSegment->fID+36)) break;
235 if(row < par->GetNRowUp1()) {
236 off = (info->fOut1Seg.fNMaxPads - par->GetNPadsUp(row))/2;
237 LoadPadrow(row, off + info->fInnSeg.fNMaxPads);
239 off = (info->fOut2Seg.fNMaxPads - par->GetNPadsUp(row))/2;
240 LoadPadrow(row, off); // info->fInnSeg.fNRows - info->fOut1Seg.fNRows);
246 // printf("TPCSegment::CreateTexture timer %f\n", sw->RealTime());
249 glBindTexture (GL_TEXTURE_2D, fTexture);
250 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);
251 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);
252 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
253 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
254 // glTexEnvf (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE, GL_MODULATE); // Lightning is off anyway.
255 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, ImageWidth, ImageHeight,
256 0, GL_RGBA, GL_UNSIGNED_BYTE, fImage);
260 void TPCSegmentGL::DisplayTexture(Float_t pw, Float_t pl, Float_t vR,
261 Int_t fNMaxPads, Int_t fNRows,
262 Int_t startCol, Int_t startRow) const
264 Float_t w = fNMaxPads*pw/2;
265 Float_t v1 = 1.0*startRow/ImageHeight;
266 Float_t v2 = v1 + 1.0*fNRows/ImageHeight;
267 Float_t u1 = 1.0 *startCol/ImageWidth;
268 Float_t u2 = u1 + 1.0 *fNMaxPads/ImageWidth;
269 // printf("tex coord u1,v1: (%f, %f), v2,u2: (%f,%f) \n", v1, u1, v2, u2);
270 // printf("vertex coord >>> nPads %d pw %f, w: %f, y1: %f, y2: %f \n",fNMaxPads,pw, w, vR, vR+fNRows*pl);
271 // glColor4f(1.,1.,1.,fSegment->mAlpha);
272 // glColor4f(1.,1.,1.,1);
275 glTexCoord2f(u1, v1); glVertex3f (-w, vR, 0.0);
276 glTexCoord2f(u1, v2); glVertex3f (-w, vR+fNRows*pl, 0.0);
277 glTexCoord2f(u2, v2); glVertex3f ( w, vR+fNRows*pl, 0.0);
278 glTexCoord2f(u2, v1); glVertex3f ( w, vR, 0.0);
283 /**************************************************************************/
285 void TPCSegmentGL::DisplayQuads(Float_t pw, Float_t pl, Float_t vR,
286 Int_t fNMaxPads, Int_t fNRows,
287 Int_t startCol, Int_t startRow) const
294 for(Int_t row = 0; row<fNRows; row++){
297 x_off = -fNMaxPads*pw/2;
298 for(Int_t pad = 0; pad<fNMaxPads; pad++){
299 pix = GetRowCol(row + startRow, pad + startCol);
303 glVertex3f(x+pw, y_d, 0);
304 glVertex3f(x, y_d, 0);
305 glVertex3f(x, y_u, 0);
306 glVertex3f(x+pw, y_u, 0);
313 /**************************************************************************/
315 void TPCSegmentGL::DisplayFrame(TPCDigitsInfo* info) const
319 TColor* c = gROOT->GetColor(fSegment->fFrameCol);
322 // x[0] = (UChar_t)(255*c->GetRed()); x[1] = (UChar_t)(255*c->GetGreen());
323 // x[2] = (UChar_t)(255*c->GetBlue()); x[3] = 255;
325 glColor3ub((UChar_t)(255*c->GetRed()),
326 (UChar_t)(255*c->GetGreen()),
327 (UChar_t)(255*c->GetBlue()));
329 seg = &info->fInnSeg;
330 glBegin(GL_LINE_LOOP);
336 seg = &info->fOut1Seg;
337 glBegin(GL_LINE_LOOP);
343 seg = &info->fOut2Seg;
344 glBegin(GL_LINE_STRIP);