MNE-CPP  0.1.9
A Framework for Electrophysiology
renderable3Dentity.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //=============================================================================================================
37 // INCLUDES
38 //=============================================================================================================
39 
40 #include "renderable3Dentity.h"
41 
42 //=============================================================================================================
43 // QT INCLUDES
44 //=============================================================================================================
45 
46 #include <Qt3DCore/QTransform>
47 
48 #include <fiff/fiff_coord_trans.h>
49 
50 //=============================================================================================================
51 // EIGEN INCLUDES
52 //=============================================================================================================
53 
54 //=============================================================================================================
55 // QT INCLUDES
56 //=============================================================================================================
57 
58 #include <QSharedPointer>
59 
60 #include <Qt3DRender/QMaterial>
61 #include <Qt3DExtras/QPerVertexColorMaterial>
62 #include <Qt3DExtras/QPhongMaterial>
63 #include <Qt3DCore/QComponent>
64 #include <Qt3DRender/QEffect>
65 #include <Qt3DRender/QParameter>
66 
67 //=============================================================================================================
68 // USED NAMESPACES
69 //=============================================================================================================
70 
71 using namespace DISP3DLIB;
72 using namespace Eigen;
73 using namespace Qt3DCore;
74 using namespace FIFFLIB;
75 using namespace Qt3DRender;
76 
77 //=============================================================================================================
78 // DEFINE MEMBER METHODS
79 //=============================================================================================================
80 
81 Renderable3DEntity::Renderable3DEntity(Qt3DCore::QEntity* parent)
82 : Qt3DCore::QEntity(parent)
83 , m_fScale(1.0f)
84 , m_fRotX(0.0f)
85 , m_fRotY(0.0f)
86 , m_fRotZ(0.0f)
87 , m_position(QVector3D(0.0f,0.0f,0.0f))
88 {
89  m_pTransform = new Qt3DCore::QTransform();
90  this->addComponent(m_pTransform);
91 }
92 
93 //=============================================================================================================
94 
96 {
97  //releaseNode(this);
98 }
99 
101 
102 //void Renderable3DEntity::releaseNode(Qt3DCore::QNode* node)
103 //{
104 // if (QEntity* entity = dynamic_cast<QEntity*>(node)) {
105 // QComponentVector components = entity->components();
106 
107 // foreach (QComponent* component, components) {
108 // entity->removeComponent(component);
109 // delete component;
110 // }
111 // }
112 
113 // QNodeVector nodes = node->childNodes();
114 
115 // foreach (QNode* nodeIt, nodes) {
116 // releaseNode(nodeIt);
117 // delete nodeIt;
118 // }
119 //}
120 
121 //=============================================================================================================
122 
123 void Renderable3DEntity::setTransform(const Qt3DCore::QTransform& transform)
124 {
125  m_pTransform->setMatrix(transform.matrix());
126 }
127 
128 //=============================================================================================================
129 
130 void Renderable3DEntity::setTransform(const FiffCoordTrans& transform, bool bApplyInverse)
131 {
132  Qt3DCore::QTransform transform3d;
133 
134  if(bApplyInverse) {
135  QMatrix4x4 matrix(transform.invtrans(0,0),
136  transform.invtrans(0,1),
137  transform.invtrans(0,2),
138  transform.invtrans(0,3),
139  transform.invtrans(1,0),
140  transform.invtrans(1,1),
141  transform.invtrans(1,2),
142  transform.invtrans(1,3),
143  transform.invtrans(2,0),
144  transform.invtrans(2,1),
145  transform.invtrans(2,2),
146  transform.invtrans(2,3),
147  transform.invtrans(3,0),
148  transform.invtrans(3,1),
149  transform.invtrans(3,2),
150  transform.invtrans(3,3));
151  transform3d.setMatrix(matrix);
152  } else {
153  QMatrix4x4 matrix(transform.trans(0,0),
154  transform.trans(0,1),
155  transform.trans(0,2),
156  transform.trans(0,3),
157  transform.trans(1,0),
158  transform.trans(1,1),
159  transform.trans(1,2),
160  transform.trans(1,3),
161  transform.trans(2,0),
162  transform.trans(2,1),
163  transform.trans(2,2),
164  transform.trans(2,3),
165  transform.trans(3,0),
166  transform.trans(3,1),
167  transform.trans(3,2),
168  transform.trans(3,3));
169  transform3d.setMatrix(matrix);
170  }
171 
172  m_pTransform->setMatrix(transform3d.matrix());
173 }
174 
175 //=============================================================================================================
176 
177 void Renderable3DEntity::applyTransform(const Qt3DCore::QTransform& transform)
178 {
179  m_pTransform->setMatrix(transform.matrix() * m_pTransform->matrix());
180 }
181 
182 //=============================================================================================================
183 
184 void Renderable3DEntity::applyTransform(const FiffCoordTrans& transform, bool bApplyInverse)
185 {
186  Qt3DCore::QTransform transform3d;
187 
188  if(bApplyInverse) {
189  QMatrix4x4 matrix(transform.invtrans(0,0),
190  transform.invtrans(0,1),
191  transform.invtrans(0,2),
192  transform.invtrans(0,3),
193  transform.invtrans(1,0),
194  transform.invtrans(1,1),
195  transform.invtrans(1,2),
196  transform.invtrans(1,3),
197  transform.invtrans(2,0),
198  transform.invtrans(2,1),
199  transform.invtrans(2,2),
200  transform.invtrans(2,3),
201  transform.invtrans(3,0),
202  transform.invtrans(3,1),
203  transform.invtrans(3,2),
204  transform.invtrans(3,3));
205  transform3d.setMatrix(matrix);
206  } else {
207  QMatrix4x4 matrix(transform.trans(0,0),
208  transform.trans(0,1),
209  transform.trans(0,2),
210  transform.trans(0,3),
211  transform.trans(1,0),
212  transform.trans(1,1),
213  transform.trans(1,2),
214  transform.trans(1,3),
215  transform.trans(2,0),
216  transform.trans(2,1),
217  transform.trans(2,2),
218  transform.trans(2,3),
219  transform.trans(3,0),
220  transform.trans(3,1),
221  transform.trans(3,2),
222  transform.trans(3,3));
223  transform3d.setMatrix(matrix);
224  }
225 
226  m_pTransform->setMatrix(transform3d.matrix() * m_pTransform->matrix());
227 }
228 
229 //=============================================================================================================
230 
232 {
233  return m_fScale;
234 }
235 
236 //=============================================================================================================
237 
238 float Renderable3DEntity::rotX() const
239 {
240  return m_fRotX;
241 }
242 
243 //=============================================================================================================
244 
245 float Renderable3DEntity::rotY() const
246 {
247  return m_fRotY;
248 }
249 
250 //=============================================================================================================
251 
252 float Renderable3DEntity::rotZ() const
253 {
254  return m_fRotZ;
255 }
256 
257 //=============================================================================================================
258 
259 QVector3D Renderable3DEntity::position() const
260 {
261  return m_position;
262 }
263 
264 //=============================================================================================================
265 
267 {
268  if(m_fRotX == rotX) {
269  return;
270  }
271 
272  m_fRotX += rotX;
273  emit rotXChanged(m_fRotX);
274 
275  QMatrix4x4 m = m_pTransform->matrix();
276  m.rotate(rotX, QVector3D(1.0f, 0.0f, 0.0f));
277  m_pTransform->setMatrix(m);
278 }
279 
280 //=============================================================================================================
281 
283 {
284  if(m_fRotX == rotX) {
285  return;
286  }
287 
288  // Revert X rotation translation because we are in the set (not apply) function
289  QMatrix4x4 m = m_pTransform->matrix();
290  m.rotate(-m_fRotX + rotX, QVector3D(1.0f, 0.0f, 0.0f));
291  m_pTransform->setMatrix(m);
292 
293  m_fRotX = rotX;
294  emit rotXChanged(m_fRotX);
295 }
296 
297 //=============================================================================================================
298 
300 {
301  if(m_fRotY == rotY) {
302  return;
303  }
304 
305  m_fRotY += rotY;
306  emit rotYChanged(m_fRotY);
307 
308  QMatrix4x4 m = m_pTransform->matrix();
309  m.rotate(rotY, QVector3D(0.0f, 1.0f, 0.0f));
310  m_pTransform->setMatrix(m);
311 }
312 
313 //=============================================================================================================
314 
316 {
317  if(m_fRotY == rotY) {
318  return;
319  }
320 
321  // Revert Y rotation translation because we are in the set (not apply) function
322  QMatrix4x4 m = m_pTransform->matrix();
323  m.rotate(-m_fRotY + rotY, QVector3D(0.0f, 1.0f, 0.0f));
324  m_pTransform->setMatrix(m);
325 
326  m_fRotY = rotY;
327  emit rotYChanged(m_fRotY);
328 }
329 
330 //=============================================================================================================
331 
333 {
334  if(m_fRotZ == rotZ) {
335  return;
336  }
337 
338  m_fRotZ += rotZ;
339  emit rotZChanged(m_fRotZ);
340 
341  QMatrix4x4 m = m_pTransform->matrix();
342  m.rotate(rotZ, QVector3D(0.0f, 0.0f, 1.0f));
343  m_pTransform->setMatrix(m);
344 }
345 
346 //=============================================================================================================
347 
349 {
350  if(m_fRotZ == rotZ) {
351  return;
352  }
353 
354  // Revert Z rotation translation because we are in the set (not apply) function
355  QMatrix4x4 m = m_pTransform->matrix();
356  m.rotate(-m_fRotZ + rotZ, QVector3D(0.0f, 0.0f, 1.0f));
357  m_pTransform->setMatrix(m);
358 
359  m_fRotZ = rotZ;
360  emit rotZChanged(m_fRotZ);
361 }
362 
363 //=============================================================================================================
364 
366 {
367  if(m_position == position) {
368  return;
369  }
370 
371  m_position += position;
373 
374  QMatrix4x4 m = m_pTransform->matrix();
375  m.translate(position);
376  m_pTransform->setMatrix(m);
377 }
378 
379 //=============================================================================================================
380 
382 {
383  if(m_position == position) {
384  return;
385  }
386 
387  // Revert present translation because we are in the set (not apply) function
388  QMatrix4x4 m = m_pTransform->matrix();
389  m.translate(-m_position + position);
390  m_pTransform->setMatrix(m);
391 
394 }
395 
396 
397 //=============================================================================================================
398 
400 {
401  if(m_fScale == scale) {
402  return;
403  }
404 
405  m_fScale *= scale;
406  emit scaleChanged(m_fScale);
407 
408  QMatrix4x4 m = m_pTransform->matrix();
409  m.scale(scale);
410  m_pTransform->setMatrix(m);
411 }
412 
413 //=============================================================================================================
414 
416 {
417  if(m_fScale == scale) {
418  return;
419  }
420 
421  // Revert present scaling because we are in the set (not apply) function
422  QMatrix4x4 m = m_pTransform->matrix();
423  m.scale(scale/m_fScale);
424  m_pTransform->setMatrix(m);
425 
426  m_fScale = scale;
427  emit scaleChanged(m_fScale);
428 }
429 
430 //=============================================================================================================
431 
433 {
434  for(int i = 0; i < this->childNodes().size(); ++i) {
435  this->childNodes()[i]->setEnabled(state);
436  }
437  this->setEnabled(state);
438 }
439 
440 //=============================================================================================================
441 
443  const QString &sParameterName)
444 {
445  setMaterialParameterRecursive(this, data, sParameterName);
446 }
447 
448 //=============================================================================================================
449 
450 QVariant Renderable3DEntity::getMaterialParameter(const QString &sParameterName)
451 {
452  QPair<bool, QVariant> resultPair = getMaterialParameterRecursive(this, sParameterName);
453 
454  return resultPair.second;
455 }
456 
457 //=============================================================================================================
458 
460  const QVariant &data,
461  const QString &sParameterName)
462 {
463  if(QParameter* pParameter = dynamic_cast<QParameter*>(pObject)) {
464  if(pParameter->name() == sParameterName) {
465  pParameter->setValue(data);
466  }
467  }
468 
469  for(int i = 0; i < pObject->children().size(); ++i) {
470  setMaterialParameterRecursive(pObject->children().at(i), data, sParameterName);
471  }
472 }
473 
474 //=============================================================================================================
475 
476 QPair<bool, QVariant> Renderable3DEntity::getMaterialParameterRecursive(QObject * pObject,
477  const QString &sParameterName)
478 {
479  if(QParameter* pParameter = dynamic_cast<QParameter*>(pObject)) {
480  if(pParameter->name() == sParameterName) {
481  return QPair<bool, QVariant>(true, pParameter->value());
482  }
483  }
484 
485  for(int i = 0; i < pObject->children().size(); ++i) {
486  QPair<bool, QVariant> pair = getMaterialParameterRecursive(pObject->children().at(i), sParameterName);
487 
488  if(pair.first) {
489  return pair;
490  }
491  }
492 
493  return QPair<bool, QVariant>(false, QVariant());
494 }
void scaleChanged(float scale)
void rotXChanged(float rotX)
FiffCoordTrans class declaration.
virtual void setMaterialParameterRecursive(QObject *pObject, const QVariant &data, const QString &sParameterName)
Renderable3DEntity class declaration.
void rotZChanged(float rotZ)
virtual QPair< bool, QVariant > getMaterialParameterRecursive(QObject *pObject, const QString &sParameterName)
virtual void setTransform(const Qt3DCore::QTransform &transform)
void positionChanged(QVector3D position)
Coordinate transformation description.
QPointer< Qt3DCore::QTransform > m_pTransform
Renderable3DEntity(Qt3DCore::QEntity *parent=0)
void rotYChanged(float rotY)
virtual void setRotZ(float rotZ)
virtual void setVisible(bool state)
virtual void setRotY(float rotY)
virtual void applyRotY(float rotY)
virtual QVector3D position() const
virtual void setScale(float scale)
virtual float rotY() const
Eigen::Matrix< float, 4, 4, Eigen::DontAlign > invtrans
virtual float rotX() const
Eigen::Matrix< float, 4, 4, Eigen::DontAlign > trans
virtual float rotZ() const
virtual void applyRotX(float rotX)
virtual void applyScale(float scale)
virtual void setRotX(float rotX)
virtual void applyPosition(const QVector3D &position)
virtual QVariant getMaterialParameter(const QString &sParameterName)
virtual void applyRotZ(float rotZ)
virtual void setMaterialParameter(const QVariant &data, const QString &sParameterName)
virtual void setPosition(const QVector3D &position)
virtual void applyTransform(const Qt3DCore::QTransform &transform)