5 #include "controlDialog.h"
6 #include "myglwidget.h"
7 #include "workerthread.h"
9 ControlDialog::ControlDialog(QWidget
*parent
)
12 qDebug("ControlDialog::ControlDialog()");
14 // Worker thread populates the data pool with coordinations and angles.
15 // It automatically blocks once the pool has reached a maximum number
16 // of data and wakes up when data resource are low.
23 connect(this, SIGNAL(glSceneNeedsUpdate()), &m_GLScene
, SLOT(updateGL()));
24 connect(fileNameEdit
, SIGNAL(returnPressed()), this, SLOT(on_fileNameChangedManually()));
25 connect(this, SIGNAL(fileNameChanged(QString
)), &m_thread
, SLOT(setFileName(QString
)));
28 connect(&m_timeLine
, SIGNAL(valueChanged(qreal
)), this, SLOT(pullData(qreal
)));
30 // Initialize axis, camera, sphere.
32 m_axisX
.setColor(QColor(255, 0, 0));
33 m_axisY
.setColor(QColor(0, 255, 0));
34 m_axisZ
.setColor(QColor(0, 0, 255));
35 m_localAxisSystem
= false;
38 m_camera
.setEyeX(eyeXEdit
->text().toFloat());
39 m_camera
.setEyeY(eyeYEdit
->text().toFloat());
40 m_camera
.setEyeZ(eyeZEdit
->text().toFloat());
42 m_camera
.setCenterX(centerXEdit
->text().toFloat());
43 m_camera
.setCenterY(centerYEdit
->text().toFloat());
44 m_camera
.setCenterZ(centerZEdit
->text().toFloat());
46 m_camera
.setUpX(upXEdit
->text().toFloat());
47 m_camera
.setUpY(upYEdit
->text().toFloat());
48 m_camera
.setUpZ(upZEdit
->text().toFloat());
51 m_sphere
.setRadius(radiusSpin
->value());
52 m_sphere
.setSlices(slicesSpin
->value());
53 m_sphere
.setStacks(stacksSpin
->value());
54 m_sphere
.setCulling(cullingCheck
->checkState() == Qt::Checked
?
57 // Pass objects to GL scene.
58 m_GLScene
.setAxis(AXIS_X
, &m_axisX
);
59 m_GLScene
.setAxis(AXIS_Y
, &m_axisY
);
60 m_GLScene
.setAxis(AXIS_Z
, &m_axisZ
);
62 m_GLScene
.setCamera(&m_camera
);
63 m_GLScene
.setSphere(&m_sphere
);
64 m_GLScene
.setCoordsAndAngles(&m_coordsAndAngles
);
67 m_GLScene
.setWindowTitle("GL Scene");
68 // Window manager might ignore the following line.
69 m_GLScene
.move(pos().x() + frameGeometry().width(), pos().y());
72 // At this point the animation isn't ready to begin.
73 // We still miss the WorkerThread::setFileName(),
74 // QTimeLine::setFrameRange(), ::setUpdateInterval() and ::setDuration().
77 ControlDialog::~ControlDialog()
79 qDebug("ControlDialog::~ControlDialog()");
83 void ControlDialog::on_startButton_clicked()
85 qDebug("ControlDialog::on_startButton_clicked()");
88 stopButton
->setEnabled(true);
91 void ControlDialog::on_stopButton_clicked()
93 qDebug("ControlDialog::on_stopButton_clicked()");
96 stopButton
->setEnabled(false);
99 void ControlDialog::on_exitButton_clicked()
101 // qApp is a global pointer referring to the unique application object.
102 qApp
->closeAllWindows();
105 void ControlDialog::on_xAxisVisibleCheck_stateChanged(int state
)
107 qDebug("ControlDialog::on_xAxisVisibleCheck_stateChanged()\n"
108 "New state = %d", state
);
110 m_axisX
.setVisible(state
== Qt::Checked
? true : false);
111 emit
glSceneNeedsUpdate();
114 void ControlDialog::on_yAxisVisibleCheck_stateChanged(int state
)
116 qDebug("ControlDialog::on_yAxisVisibleCheck_stateChanged()\n"
117 "New state = %d", state
);
119 m_axisY
.setVisible(state
== Qt::Checked
? true : false);
120 emit
glSceneNeedsUpdate();
123 void ControlDialog::on_zAxisVisibleCheck_stateChanged(int state
)
125 qDebug("ControlDialog::on_zAxisVisibleCheck_stateChanged()\n"
126 "New state = %d", state
);
128 m_axisZ
.setVisible(state
== Qt::Checked
? true : false);
129 emit
glSceneNeedsUpdate();
132 void ControlDialog::on_localAxisCheck_stateChanged(int state
)
134 qDebug("ControlDialog::on_localAxisCheck_stateChanged()\n"
135 "New state = %d", state
);
137 m_axisX
.setLocal(state
== Qt::Checked
? true : false);
138 m_axisY
.setLocal(state
== Qt::Checked
? true : false);
139 m_axisZ
.setLocal(state
== Qt::Checked
? true : false);
140 emit
glSceneNeedsUpdate();
143 void ControlDialog::on_stacksSpin_valueChanged(int i
)
145 qDebug("ControlDialog::on_stacksSpin_valueChanged()\n"
146 "New value = %d", i
);
148 m_sphere
.setStacks(i
);
149 emit
glSceneNeedsUpdate();
152 void ControlDialog::on_slicesSpin_valueChanged(int i
)
154 qDebug("ControlDialog::on_slicesSpin_valueChanged()\n"
155 "New value = %d", i
);
157 m_sphere
.setSlices(i
);
158 emit
glSceneNeedsUpdate();
161 void ControlDialog::on_radiusSpin_valueChanged(double d
)
163 qDebug("ControlDialog::on_radiusSpin_valueChanged()\n"
164 "New value = %f", d
);
166 m_sphere
.setRadius(d
);
167 emit
glSceneNeedsUpdate();
170 void ControlDialog::on_cullingCheck_stateChanged(int state
)
172 qDebug("ControlDialog::on_cullingCheck_stateChanged()\n"
173 "New state = %d", state
);
175 m_sphere
.setCulling(state
== Qt::Checked
? true : false);
176 emit
glSceneNeedsUpdate();
179 // Camera tab related slots
180 void ControlDialog::on_eyeXEdit_textChanged(const QString
& text
)
182 qDebug("ControlDialog::on_eyeXEdit_textChanged()\n"
183 "New eyeX = %f", text
.toFloat());
185 m_camera
.setEyeX(text
.toFloat());
186 emit
glSceneNeedsUpdate();
189 void ControlDialog::on_eyeYEdit_textChanged(const QString
& text
)
191 qDebug("ControlDialog::on_eyeYEdit_textChanged()\n"
192 "New eyeY = %f", text
.toFloat());
194 m_camera
.setEyeY(text
.toFloat());
195 emit
glSceneNeedsUpdate();
198 void ControlDialog::on_eyeZEdit_textChanged(const QString
& text
)
200 qDebug("ControlDialog::on_eyeZEdit_textChanged()\n"
201 "New eyeZ = %f", text
.toFloat());
203 m_camera
.setEyeZ(text
.toFloat());
204 emit
glSceneNeedsUpdate();
207 void ControlDialog::on_centerXEdit_textChanged(const QString
& text
)
209 qDebug("ControlDialog::on_centerXEdit_textChanged()\n"
210 "New centerX = %f", text
.toFloat());
212 m_camera
.setCenterX(text
.toFloat());
213 emit
glSceneNeedsUpdate();
216 void ControlDialog::on_centerYEdit_textChanged(const QString
& text
)
218 qDebug("ControlDialog::on_centerYEdit_textChanged()\n"
219 "New centerY = %f", text
.toFloat());
221 m_camera
.setCenterY(text
.toFloat());
222 emit
glSceneNeedsUpdate();
225 void ControlDialog::on_centerZEdit_textChanged(const QString
& text
)
227 qDebug("ControlDialog::on_centerZEdit_textChanged()\n"
228 "New centerZ = %f", text
.toFloat());
230 m_camera
.setCenterZ(text
.toFloat());
231 emit
glSceneNeedsUpdate();
234 void ControlDialog::on_upXEdit_textChanged(const QString
& text
)
236 qDebug("ControlDialog::on_upXEdit_textChanged()\n"
237 "New upX = %f", text
.toFloat());
239 m_camera
.setUpX(text
.toFloat());
240 emit
glSceneNeedsUpdate();
243 void ControlDialog::on_upYEdit_textChanged(const QString
& text
)
245 qDebug("ControlDialog::on_upYEdit_textChanged()\n"
246 "New upY = %f", text
.toFloat());
248 m_camera
.setUpY(text
.toFloat());
249 emit
glSceneNeedsUpdate();
252 void ControlDialog::on_upZEdit_textChanged(const QString
& text
)
254 qDebug("ControlDialog::on_upZEdit_textChanged()\n"
255 "New upZ = %f", text
.toFloat());
257 m_camera
.setUpZ(text
.toFloat());
258 emit
glSceneNeedsUpdate();
261 void ControlDialog::on_browseFileButton_clicked(void)
264 qDebug("ControlDialog::on_browseFileButton_clicked()");
266 fileName
= QFileDialog::getOpenFileName(this, tr("Open data file"),
267 "/home", "Data files(*.dat);; All files(*)");
268 if (fileName
== NULL
) {
269 qDebug("QFileDialog::getOpenFileName() returned NULL"
270 "(user pressed cancel");
274 // CAUTION: this lines must precede or else the
275 // WorkerThread::extractHeader() won't be called.
276 fileNameEdit
->setText(fileName
);
277 emit
fileNameChanged(fileName
);
280 m_timeLine
.setFrameRange(0, m_thread
.getNumOfRecords());
281 qDebug("End frame: %d\n", m_timeLine
.endFrame());
282 m_timeLine
.setUpdateInterval(1000 / fpsSpin
->value());
283 m_timeLine
.setDuration(m_thread
.getDuration() * 1000);
286 QString magicVersionStr
= QString("0x%1")
287 .arg(m_thread
.getMagicVersion(), 0, 16).toUpper();
288 QString protocolVersionStr
= QString::number(m_thread
.getProtocolVersion());
289 QString durationStr
= QString::number(m_thread
.getDuration());
290 QString numberOfRecordsStr
= QString::number(m_thread
.getNumOfRecords());
292 magicVersionOutputLabel
->setText(magicVersionStr
);
293 protocolVersionOutputLabel
->setText(protocolVersionStr
);
294 durationOutputLabel
->setText(durationStr
);
295 numberOfRecordsOutputLabel
->setText(numberOfRecordsStr
);
297 if (!startButton
->isEnabled())
298 startButton
->setEnabled(true);
301 void ControlDialog::on_fileNameChangedManually(void)
303 qDebug("ControlDialog::on_fileNameChangedManually()");
305 QString fileName
= fileNameEdit
->text();
306 emit
fileNameChanged(fileName
);
309 void ControlDialog::pullData(qreal time
)
311 float t
, xp
, yp
, zp
, xa
, ya
, za
;
312 qDebug("ControlDialog::pullData()");
314 m_thread
.m_mutex
.lock();
316 qDebug("Timeline[0, 1] = %f\tTarget time(sec) = %f\tCurrent time(sec) = %f",
317 time
, time
* m_thread
.getDuration(), m_t
);
319 if (m_thread
.m_data
.size() >= 1000) {
320 qDebug("Queue size = %d", m_thread
.m_data
.size());
321 m_t
= m_thread
.m_data
.dequeue();
322 xp
= m_thread
.m_data
.dequeue();
323 yp
= m_thread
.m_data
.dequeue();
324 zp
= m_thread
.m_data
.dequeue();
325 xa
= m_thread
.m_data
.dequeue();
326 ya
= m_thread
.m_data
.dequeue();
327 za
= m_thread
.m_data
.dequeue();
328 //qDebug("t = %f\txp = %f\typ = %f\tzp = %f\txa = %f\tya = %f\tza = %f",
329 // t, xp, yp, zp, xa, ya, za);
330 if (m_t
< m_thread
.getDuration() * time
)
333 m_coordsAndAngles
.setCoordsAndAngles(xp
, yp
, zp
, xa
, ya
, za
);
338 m_thread
.m_mutex
.unlock();
339 qDebug("WAKING THREAD");
340 m_thread
.condition
.wakeOne();
344 m_thread
.m_mutex
.unlock();
346 emit
glSceneNeedsUpdate();
349 void ControlDialog::on_fpsSpin_valueChanged(int i
)
351 qDebug("ControlDialog::on_fpsSpin_valueChanged()\n"
352 "New value = %d", i
);
355 m_timeLine
.setFrameRange(0, i
* m_thread
.getDuration());
356 qDebug("=======> %d\n", m_timeLine
.endFrame());
357 m_timeLine
.setUpdateInterval(1000 / i
);
358 //m_timeLine.start();
360 // Don't resume animation, unless it was running before.
361 if (stopButton
->isEnabled())