source: trunk/FACT++/gui/QCameraWidget.cc @ 19314

Last change on this file since 19314 was 15123, checked in by lyard, 6 years ago
linked statistic window do drawPatch checkbox
File size: 16.1 KB
Line 
1#include "QCameraWidget.h"
2
3#include <sstream>
4#include <iostream>
5
6#include <QMouseEvent>
7
8using namespace std;
9
10    QCameraWidget::QCameraWidget(QWidget *pparent) : BasicGlCamera(pparent)
11    {
12        fBold.resize(1440, false);
13        fEnable.resize(1440, true);
14        lastFace = -1;
15        fShowPixelMoveOver = false;
16        fShowPatchMoveOver = false;
17        fDrawPatch = false;
18
19        CalculatePixelsColor();
20
21   }
22
23    void QCameraWidget::paintGL()
24    {
25        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
26         glLoadIdentity();
27
28         glTranslatef(0,-0.44,0);
29         glTranslatef(-0.1,0,0);
30         glRotatef(cameraRotation, 0,0,-1);
31         if (cameraRotation == 90)
32         {
33             glTranslatef(-0.45,-0.45,0);
34  //           cout << "correction" << endl;
35         }
36         if (cameraRotation == -90)
37         {
38             glTranslatef(0.45,-0.45,0);
39         }
40         glScalef(1.5, 1.5, 1.0);
41         glTranslatef(0,0,-0.5);
42         drawCamera(true);
43         glTranslatef(0,0,0.1f);
44
45         if (fDrawPatch)
46             drawPatches();
47         glTranslatef(0,0,0.1f);
48
49         glLineWidth(1.0f);
50         glColor3fv(highlightedPixelsCoulour);
51         for (vector<int>::iterator it = highlightedPixels.begin(); it!= highlightedPixels.end(); it++)
52         {
53             drawHexagon(*it, false);
54         }
55
56        glLineWidth(1.0f);
57        glTranslatef(0,0,0.1f);
58
59        //glColor3f(1.f - pixelsColor[fWhite][0],1.f - pixelsColor[fWhite][1],1.f - pixelsColor[fWhite][2]);
60        if (fWhite != -1)
61        {
62            glColor3f(1.f, 0.f, 0.f);
63            drawHexagon(fWhite, false);
64        }
65        DrawCameraText();
66
67        DrawScale();
68
69//        if (linearButton->isVisible())
70//            repaintInterface();
71    }
72    void QCameraWidget::drawCamera(bool alsoWire)
73    {
74
75        if (!pixelColorUpToDate)
76            CalculatePixelsColor();
77        glLineWidth(1.0);
78        for (int i=0;i<ACTUAL_NUM_PIXELS;i++)
79        {
80            glColor3fv(pixelsColor[i]);
81            glLoadName(i);
82            drawHexagon(i,true);
83        }
84        if (!alsoWire)
85            return;
86        glTranslatef(0,0,0.1f);
87        glColor3fv(pixelContourColour);//0.0f,0.0f,0.0f);
88        for (int i=0;i<ACTUAL_NUM_PIXELS;i++)
89        {
90            drawHexagon(i, false);
91        }
92    }
93    void QCameraWidget::DrawCameraText()
94    {
95        if (!fTextEnabled) return;
96
97        glPushMatrix();
98        glLoadIdentity();
99
100
101
102//        int textSize = (int)(width()*14/600);
103//        setFont(QFont("Monospace", textSize));
104        qglColor(QColor(25, 22, 12));
105
106        //first let's draw the usual data
107        //title
108        renderText(-shownSizex/2.f + 0.01f, shownSizey/2.f - fTextSize*pixelSize - 0.01f, 0.f, QString(titleText.c_str()));
109        //stats
110        ostringstream str;
111        str.precision(2);
112        str.setf(ios::fixed,ios::floatfield);
113        str << "Med " << fmedian;// << unitsText;
114        renderText(3, height()-3-4*fTextSize-35, QString(str.str().c_str()));
115        str.str("");
116        str << "Avg " << fmean;// <<  unitsText;
117        renderText(3, height()-3-3*fTextSize-27, QString(str.str().c_str()));
118        str.str("");
119        str << "RMS " << frms;// <<  unitsText;
120        renderText(3, height()-3-2*fTextSize-21, QString(str.str().c_str()));
121        str.str("");
122        str << "Min " << fmin;// << unitsText;
123        renderText(3, height()-3-3, QString(str.str().c_str()));
124        str.str("");
125        str << "Max " << fmax;// << unitsText;
126        renderText(3, height()-3-1*fTextSize-8, QString(str.str().c_str()));
127        //then draw the values beside the scale
128        //the difficulty here is to write the correct min/max besides the scale
129        //it depends whether the actual mean of the data is given by the user
130        //or not. the values given by user are fMin and fMax, while the data
131        //real min/max are fmin and fmax (I know, quite confusing... sorry about that)
132        //so. first let's see what is the span of one pixel
133        float min = (fMin < fScaleLimit || fMax < fScaleLimit) ? fmin : fMin;
134        float max = (fMin < fScaleLimit || fMax < fScaleLimit) ? fmax : fMax;
135//        textSize = (int)(height()*12/600);
136 //       setFont(QFont("Monospace", textSize));
137        float pixelSpan = (height() - fTextSize - 1)/(max - min);
138
139        //draw the scale values
140        float value = min;
141        int fontWidth = fTextSize;
142        if (fTextSize > 12) fontWidth--;
143        if (fTextSize > 10) fontWidth--;
144        if (fTextSize > 7) fontWidth--;//else fontWidth -=1;
145//        if (fTextSize < 7) fontWidth++;
146        for (int i=0;i<11;i++)
147        {
148            str.str("");
149            str << value;
150            if (i==0 || i==10)
151                str << ' ' << unitsText;
152            str << ' ';
153            int h = (value - min)*pixelSpan;
154            if (logScale && h != 0)
155            {
156                float fh = h;
157                float mult = (max - min)*pixelSpan;
158                fh = log10(h*10.f/mult);
159                fh *= mult;
160                h = (int)fh;
161            }
162            h = height()-h;
163            int w = width() - (width()/50) - fontWidth*str.str().size();
164            if (i==0 || i==10) w -= width()/50;
165            if (i!=0 && i!=10) h -= fTextSize/2;
166            renderText(w, h, QString(str.str().c_str()));
167            value += (max - min)/10;
168        }
169
170/*
171        str.str("");
172        str << min << unitsText;
173        int fontWidth = textSize;
174        if (textSize > 12) fontWidth-=3; else fontWidth -= 2;
175        //height of min ?
176        int hmin = (min - min)*pixelSpan;
177        hmin = height() - hmin;
178        renderText(width() - (width()/25) - fontWidth*str.str().size(), hmin, QString(str.str().c_str()));
179        str.str("");
180        str << max << unitsText;
181        int hmax = (max - min)*pixelSpan;
182        hmax = height() - hmax;
183        renderText(width() - (width()/25) - fontWidth*str.str().size(), hmax, QString(str.str().c_str()));
184*/
185        glPopMatrix();
186
187//        textSize = (int)(600*14/600);
188//        setFont(QFont("Times", textSize));
189    }
190    void QCameraWidget::drawPatches()
191    {
192        glLineWidth(3.0f);
193        glColor3fv(patchesCoulour);
194         glBegin(GL_LINES);
195                 for (int i=0;i<NTMARK;i++)
196                {
197                     for (unsigned int j=0;j<patchesIndices[i].size();j++)
198                     {
199                         glVertex2fv(verticesList[patchesIndices[i][j].first]);
200                         glVertex2fv(verticesList[patchesIndices[i][j].second]);
201                     }
202                 }
203         glEnd();
204         glTranslatef(0,0,0.1f);
205
206         glColor3fv(highlightedPatchesCoulour);
207         glBegin(GL_LINES);
208         for (vector<int>::iterator it=highlightedPatches.begin(); it!= highlightedPatches.end(); it++)
209         {
210             for (unsigned int j=0;j<patchesIndices[*it].size();j++)
211             {
212                 glVertex2fv(verticesList[patchesIndices[*it][j].first]);
213                 glVertex2fv(verticesList[patchesIndices[*it][j].second]);
214             }
215         }
216         glEnd();
217         if (fWhitePatch != -1)
218         {
219             glTranslatef(0,0,0.01);
220             glColor3f(1.f, 0.6f, 0.f);//patchColour);//[0],patchColour[1],patchColour[2]);//0.5f, 0.5f, 0.3f);
221             glBegin(GL_LINES);
222             for (unsigned int j=0;j<patchesIndices[fWhitePatch].size();j++)
223             {
224                 glVertex2fv(verticesList[patchesIndices[fWhitePatch][j].first]);
225                 glVertex2fv(verticesList[patchesIndices[fWhitePatch][j].second]);
226             }
227             glEnd();
228         }
229
230    }
231    void QCameraWidget::Reset()
232    {
233        fBold.assign(1440, false);
234    }
235
236    void QCameraWidget::mousePressEvent(QMouseEvent *cEvent)
237    {
238        if (cEvent->pos().x() > width()-(width()/50.f))
239        {
240            toggleInterfaceDisplay();
241            return;
242        }
243        int face = PixelAtPosition(cEvent->pos());
244//        cout << face << endl;
245        if (face != -1) {
246            fWhite = face;
247            fWhitePatch = pixelsPatch[fWhite];
248 //           CalculatePatchColor();
249            emit signalCurrentPixel(face);
250            }
251        else
252        {
253            fWhite = -1;
254            fWhitePatch = -1;
255        }
256        updateGL();
257   }
258    void QCameraWidget::mouseMoveEvent(QMouseEvent* cEvent)
259    {
260        int face = PixelAtPosition(cEvent->pos());
261        if (face != -1 && lastFace != face) {
262            emit signalPixelMoveOver(face);
263        }
264        if (lastFace != face)
265        {
266            if (fShowPixelMoveOver)
267                fWhite = face;
268
269            if (fShowPatchMoveOver)
270                fWhitePatch = face != -1 ? pixelsPatch[face] : -1;
271        }
272
273        if (fShowPixelMoveOver || fShowPatchMoveOver)
274            if (lastFace != face && isVisible())
275                updateGL();
276
277        lastFace = face;
278    }
279    void QCameraWidget::mouseDoubleClickEvent(QMouseEvent* cEvent)
280    {
281        int face = PixelAtPosition(cEvent->pos());
282        if (face != -1) {
283 //           cout << "Event !" << endl;
284            fWhite = face;
285             fWhitePatch = pixelsPatch[fWhite];
286 //          highlightPixel(face);
287 //           highlightPatch(fWhitePatch);
288 //           CalculatePatchColor();
289            emit signalPixelDoubleClick(face);
290       }
291        else
292        {
293            fWhite = -1;
294            fWhitePatch = -1;
295 //           clearHighlightedPixels();
296 //           clearHighlightedPatches();
297        }
298        updateGL();
299
300    }
301    void QCameraWidget::ShowPixelCursor(bool on)
302    {
303        fShowPixelMoveOver = on;
304        if (isVisible() && autoRefresh)
305            updateGL();
306    }
307    void QCameraWidget::ShowPatchCursor(bool on)
308    {
309        fShowPatchMoveOver = on;
310        if (isVisible() && autoRefresh)
311            updateGL();
312    }
313    void QCameraWidget::SetEnable(int idx, bool b)
314    {
315         fEnable[idx] = b;
316     }
317
318     double QCameraWidget::GetData(int idx)
319     {
320         return fData[idx];
321     }
322     const char* QCameraWidget::GetName()
323     {
324         return "QCameraWidget";
325     }
326     char *QCameraWidget::GetObjectInfo(int px, int py)
327     {
328
329         static stringstream stream;
330         static string str;
331         const int pixel = this->PixelAtPosition(QPoint(px, py));
332         if (pixel >= 0)
333         {
334             stream << "Pixel=" << pixel << "   Data=" << fData[pixel] << '\0';
335         }
336         str = stream.str();
337         return const_cast<char*>(str.c_str());
338     }
339     void QCameraWidget::CalculatePixelsColor()
340     {
341         double dmin = fData[0];
342          double dmax = fData[0];
343          for (int ii=0;ii<ACTUAL_NUM_PIXELS;ii++)
344          {
345              if (finite(fData[ii]))
346              {
347                  dmin = dmax = fData[ii];
348                  break;
349              }
350          }
351          if (fMin < fScaleLimit || fMax < fScaleLimit)
352          {
353              for (int i=0;i<ACTUAL_NUM_PIXELS;i++)
354              {
355                  if (!finite(fData[i])) continue;
356                  if (!fEnable[i]) continue;
357                  if (fData[i] > dmax) dmax = fData[i];
358                  if (fData[i] < dmin) dmin = fData[i];
359              }
360          }
361          if (fMin > fScaleLimit) dmin = fMin;
362          if (fMax > fScaleLimit) dmax = fMax;
363//          cout << "min: " << dmin << " max: " << dmax << " fMin: " << fMin << " fMax: " << fMax << endl;
364          float color;
365          for (int i=0;i<ACTUAL_NUM_PIXELS;i++)
366           {
367              if (!fEnable[i])
368              {
369//                  cout << "not enabled !" << i << endl;
370                  pixelsColor[i][0] = 0.1f;
371                  pixelsColor[i][1] = 0.1f;
372                  pixelsColor[i][2] = 0.15f;
373                  continue;
374              }
375              if (!finite(fData[i]))
376              {
377//                  cout << "not enabled !" << i << endl;
378                  pixelsColor[i][0] = 0.9f;
379                  pixelsColor[i][1] = 0.0f;
380                  pixelsColor[i][2] = 0.9f;
381                  continue;
382              }
383              if (fData[i] < dmin)
384               {
385                   pixelsColor[i][0] = tooLowValueCoulour[0];
386                   pixelsColor[i][1] = tooLowValueCoulour[1];
387                   pixelsColor[i][2] = tooLowValueCoulour[2];
388                   continue;
389               }
390               if (fData[i] > dmax)
391               {
392                   pixelsColor[i][0] = tooHighValueCoulour[0];
393                   pixelsColor[i][1] = tooHighValueCoulour[1];
394                   pixelsColor[i][2] = tooHighValueCoulour[2];
395                   continue;
396               }
397               color = float((fData[i]-dmin)/(dmax-dmin));
398               if (logScale)
399               {
400                   color *= 9;
401                   color += 1;
402                   color = log10(color);
403               }
404
405               int index = 0;
406               while (ss[index] < color && index < 4)
407                   index++;
408               index--;
409               if (index < 0) index = 0;
410               float weight0 = (color-ss[index]) / (ss[index+1]-ss[index]);
411               if (weight0 > 1.0f) weight0 = 1.0f;
412               if (weight0 < 0.0f) weight0 = 0.0f;
413               float weight1 = 1.0f-weight0;
414               pixelsColor[i][0] = weight1*rr[index] + weight0*rr[index+1];
415               pixelsColor[i][1] = weight1*gg[index] + weight0*gg[index+1];
416               pixelsColor[i][2] = weight1*bb[index] + weight0*bb[index+1];
417          }
418          CalculatePatchColor();
419          UpdateText();
420          pixelColorUpToDate = true;
421     }
422     void QCameraWidget::CalculatePatchColor()
423     {
424         return;
425         //calculate the patch contour color. let's use the anti-colour of the pixels
426         GLfloat averagePatchColour[3] = {0.0f,0.0f,0.0f};
427         for (int i=0;i<9;i++)
428             for (int j=0;j<3;j++)
429                 averagePatchColour[j] += pixelsColor[softwareMapping[fWhitePatch*9+i]][j];
430         for (int j=0;j<3;j++)
431             averagePatchColour[j] /= 9;
432         for (int j=0;j<3;j++)
433             patchColour[j] = 1.0f - averagePatchColour[j];
434     }
435     void QCameraWidget::SetData(const valarray<double> &ddata)
436     {
437//             fData = ddata;
438         for (int i=0;i<ACTUAL_NUM_PIXELS;i++)
439             fData[i] = ddata[i];
440         pixelColorUpToDate = false;
441         if (isVisible() && autoRefresh)
442             updateGL();
443     }
444
445void QCameraWidget::SetData(const valarray<float> &ddata)
446     {
447//             fData = ddata;
448         for (int i=0;i<ACTUAL_NUM_PIXELS;i++)
449             fData[i] = ddata[i];
450         pixelColorUpToDate = false;
451         if (isVisible() && autoRefresh)
452             updateGL();
453     }
454
455
456     void QCameraWidget::highlightPixel(int idx, bool highlight)
457     {
458         if (idx < 0 || idx >= ACTUAL_NUM_PIXELS)
459         {
460           cout << "Error: requested pixel highlight out of bounds" << endl;
461           return;
462         }
463
464         const vector<int>::iterator v = ::find(highlightedPixels.begin(), highlightedPixels.end(), idx);
465         if (highlight)
466         {
467             if (v==highlightedPixels.end())
468                 highlightedPixels.push_back(idx);
469         }
470         else
471         {
472             if (v!=highlightedPixels.end())
473                 highlightedPixels.erase(v);
474         }
475
476         if (isVisible() && autoRefresh)
477             updateGL();
478     }
479     void QCameraWidget::highlightPatch(int idx, bool highlight)
480     {
481         if (idx < 0 || idx >= NTMARK)
482         {
483             cout << "Error: requested patch highlight out of bounds" << endl;
484             return;
485         }
486
487         const vector<int>::iterator v = ::find(highlightedPatches.begin(), highlightedPatches.end(), idx);
488         if (highlight)
489         {
490             if (v==highlightedPatches.end())
491                 highlightedPatches.push_back(idx);
492         }
493         else
494         {
495             if (v!=highlightedPatches.end())
496                 highlightedPatches.erase(v);
497         }
498
499         if (isVisible() && autoRefresh)
500             updateGL();
501
502     }
503     void QCameraWidget::clearHighlightedPatches()
504     {
505         highlightedPatches.clear();
506         if (isVisible() && autoRefresh)
507             updateGL();
508     }
509     void QCameraWidget::clearHighlightedPixels()
510     {
511         highlightedPixels.clear();
512         if (isVisible() && autoRefresh)
513             updateGL();
514     }
515
516
517
518
Note: See TracBrowser for help on using the repository browser.