FACT++  1.0
Q3DCameraWidget.cc
Go to the documentation of this file.
1 /*
2  * Q3DCameraWidget.cc
3  *
4  * Created on: Aug 26, 2011
5  * Author: lyard
6  */
7 #include "Q3DCameraWidget.h"
8 
9 #include <math.h>
10 #include <sstream>
11 
12 #include <GL/glu.h>
13 
14 #include <QMouseEvent>
15 
16  Q3DCameraWidget::Q3DCameraWidget(QWidget* pparent) : BasicGlCamera(pparent),
17  currentLoc()
18  {
19  _data.resize(432000);
20  _colorR.resize(432000);
21  _colorG.resize(432000);
22  _colorB.resize(432000);
23  _x.resize(432000);
24  _y.resize(432000);
25  _z.resize(432000);
26  for (int i=0;i<432000;i++)
27  {
28  _data[i] = 0;
29  _colorR[i] = 0;
30  _colorG[i] = 0;
31  _colorB[i] = 0;
32  _x[i] = 0;
33  _y[i] = 0;
34  _z[i] = 0;
35  }
36  _warningWritten = false;
37  }
39  {
40 
41  }
43  {
44  updateGL();
45  }
46 
47  int rotation =130;
48  int rotationy = 30;
49  float transZ = 0;
50  void Q3DCameraWidget::mousePressEvent(QMouseEvent* cEvent)
51  {
52 
53  if (cEvent->buttons() & Qt::LeftButton)
54  {
55  rotationy = -60 + (cEvent->pos().y()/(float)height())*120.f;
56  rotation = 130 + (cEvent->pos().x()/(float)width())*180.f;
57  }
58  else if (cEvent->buttons() & Qt::RightButton)
59  {
60  if (cEvent->pos().y() > height()/2)
61  transZ -= 0.5;
62  else
63  transZ += 0.5;
64  }
65  updateGL();
66  }
67  void Q3DCameraWidget::mouseDoubleClickEvent(QMouseEvent *cEvent)
68  {
69 
70  }
71  void Q3DCameraWidget::mouseMoveEvent(QMouseEvent *cEvent)
72  {
73  if (cEvent->buttons() & Qt::LeftButton) {
74  mousePressEvent(cEvent);
75  }
76 
77  }
79  {
80  makeCurrent();
81  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
82  glLoadIdentity();
83 
84  glTranslatef(-0.0,-0.0, -5);
85  glTranslatef(0,0,(float)(transZ));
86  glRotatef((float)rotationy,1.0,0.0,0.0);
87  glRotatef((float)rotation, 0.0, 1.0, 0.0);
88 
89  glColor3f(1.0,0.0,0.0);
90 
91  glBegin(GL_TRIANGLES);
92  for (int i=0;i<1439;i++)
93  {
94  for (int j=6;j<250;j++)
95  {
96  //get the 4 vertices that we need for drawing this patch
97  glColor3f(_colorR[i*300+j],_colorG[i*300+j],_colorB[i*300+j]);
98  glVertex3f(_x[i*300+j], _y[i*300+j], _z[i*300+j]);
99  glColor3f(_colorR[i*300+j+1],_colorG[i*300+j+1],_colorB[i*300+j+1]);
100  glVertex3f(_x[i*300+j+1], _y[i*300+j+1], _z[i*300+j+1]);
101  glColor3f(_colorR[(i+1)*300+j],_colorG[(i+1)*300+j],_colorB[(i+1)*300+j]);
102  glVertex3f(_x[(i+1)*300+j], _y[(i+1)*300+j], _z[(i+1)*300+j]);
103 
104  glColor3f(_colorR[i*300+j+1],_colorG[i*300+j+1],_colorB[i*300+j+1]);
105  glVertex3f(_x[i*300+j+1], _y[i*300+j+1], _z[i*300+j+1]);
106  glColor3f(_colorR[(i+1)*300+j+1],_colorG[(i+1)*300+j+1],_colorB[(i+1)*300+j+1]);
107  glVertex3f(_x[(i+1)*300+j+1], _y[(i+1)*300+j+1], _z[(i+1)*300+j+1]);
108  glColor3f(_colorR[(i+1)*300+j],_colorG[(i+1)*300+j],_colorB[(i+1)*300+j]);
109  glVertex3f(_x[(i+1)*300+j], _y[(i+1)*300+j], _z[(i+1)*300+j]);
110 
111  }
112  }
113  glEnd();
114 
115  }
117  {
118  short min = 10000;
119  short max = -10000;
120  for (int k=0;k<1440;k++)
121  for (int j=6;j<251;j++)
122  {
123  int i = k*300+j;
124  if (_data[i] < min)
125  min = _data[i];
126  if (_data[i] > max)
127  max = _data[i];
128  }
129  float span = max - min;
130 
131 
132  //max should be at one, min at -1
133 
134  for (int i=0;i<1440;i++)
135  {
136  for (int j=6;j<251;j++)
137  {
138  _x[i*300+j] = -1 + (2.f*i)/1440.f;
139  _y[i*300+j] = -0.5 + 1.0f*(_data[i*300+j] - min)/span;
140  _z[i*300+j] = -1+(2.f*j)/300.f;
141  float value = (_data[i*300 + j] - min)/span;
142  if (value < 0.33)
143  {
144  _colorR[i*300+j] = 0;
145  _colorG[i*300+j] = 0;
146  _colorB[i*300+j] = value/0.33;
147  }
148  if (value >= 0.33 && value <= 0.66)
149  {
150  _colorR[i*300+j] = 0;
151  _colorG[i*300+j] = (value-0.33)/0.33;
152  _colorB[i*300+j] = 1 - ((value-0.33)/0.33);
153  }
154  if (value > 0.66)
155  {
156  _colorR[i*300+j] = (value-0.66)/0.33;
157  _colorG[i*300+j] = 1 - ((value-0.66)/0.33);
158  _colorB[i*300+j] = 0;
159 
160  }
161  }
162  }
163 
164 
165 
166  }
167  void Q3DCameraWidget::setData(float* ddata)
168  {
169  if (!_warningWritten)
170  {
171  _warningWritten = true;
172  cout << "Info : 3D plotter disabled. requires more work so that less than 300 slices per pixel can be loaded" << endl;
173  cout << "Contact Etienne (etienne.lyard@unige.ch) for more information." << endl;
174  }
175  //disabled for now as I am working with 150 slices only
176 /* for (int i=0;i<1440;i++)
177  for (int j=0;j<300;j++)
178  _data[i*300+j] = (short)(ddata[i*300 + j]);
179  calculateColorsAndPositions();
180  if (isVisible())
181  updateGL();
182 */
183  }
184  void Q3DCameraWidget::setData(short* ddata)
185  {
186  if (!_warningWritten)
187  {
188  _warningWritten = true;
189  cout << "Info : 3D plotter disabled. requires more work so that less than 300 slices per pixel can be loaded" << endl;
190  cout << "Contact Etienne (etienne.lyard@unige.ch) for more information." << endl;
191  }
192  /* for (int i=0;i<1440;i++)
193  for (int j=0;j<300;j++)
194  _data[i*300+j] = ddata[i* 300 + j];
195  calculateColorsAndPositions();
196  if (isVisible())
197  updateGL();
198 */
199  }
201  {
202  glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
203 
204  GLfloat color[4] = {0.8f, 1.f, 1.f, 1.f};
205  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
206  glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 1.0f);
207  gluCylinder( gluNewQuadric(),
208  0.62,
209  0.62,
210  1.83,
211  30,
212  2 );
213  glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
214 
215 
216 
217  }
218 
220  {
221  qglClearColor(QColor(25,25,38));
222 
223  glShadeModel(GL_SMOOTH);
224  glEnable(GL_DEPTH_TEST);
225  glDepthFunc(GL_LESS);
226  glDisable(GL_LIGHTING);
227 // glEnable(GL_LIGHTING);
228 // glEnable(GL_LIGHT0);
229 // glEnable(GL_AUTO_NORMAL);
230  glDisable(GL_CULL_FACE);
231 // glCullFace(GL_FRONT);
232 
233  glEnable(GL_POLYGON_SMOOTH);
234  glEnable(GL_BLEND);
235  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
236  glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
237  }
238  void Q3DCameraWidget::resizeGL(int cWidth, int cHeight)
239  {
240  glViewport(0,0,cWidth, cHeight);
241  glMatrixMode(GL_PROJECTION);
242  glLoadIdentity();
243  GLfloat windowRatio = (float)cWidth/(float)cHeight;
244  if (windowRatio < 1)
245  {
246 // windowRatio = 1.0f/windowRatio;
247  gluPerspective(40.f, windowRatio, 1, 100);
248 // gluOrtho2D(-viewSize, viewSize, -viewSize*windowRatio, viewSize*windowRatio);
249  pixelSize = 2*viewSize/(float)cWidth;
250  shownSizex = 2*viewSize;
251  shownSizey = 2*viewSize*windowRatio;
252  }
253  else
254  {
255  gluPerspective(40.f, windowRatio,1, 8);
256 // gluOrtho2D(-viewSize*windowRatio, viewSize*windowRatio, -viewSize, viewSize);
257  pixelSize = 2*viewSize/(float)cHeight;
258  shownSizex = 2*viewSize*windowRatio;
259  shownSizey = 2*viewSize;
260  }
261  glMatrixMode(GL_MODELVIEW);
262  }
void mouseMoveEvent(QMouseEvent *cEvent)
void resizeGL(int cWidth, int cHeight)
vector< float > _y
int rotation
int i
Definition: db_dim_client.c:21
void mouseDoubleClickEvent(QMouseEvent *cEvent)
vector< float > _colorG
vector< float > _colorB
vector< float > _x
void mousePressEvent(QMouseEvent *event)
void setData(float *data)
vector< float > _z
vector< short > _data
int rotationy
float transZ
float height
Definition: HeadersGPS.h:26
function color(col)
Definition: color.js:31
void calculateColorsAndPositions()
vector< float > _colorR
Q3DCameraWidget(QWidget *pparent=0)