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

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