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 
365 void Renderable3DEntity::applyPosition(const QVector3D& position)
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 
381 void Renderable3DEntity::setPosition(const QVector3D& position)
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 
392  m_position = position;
394 }
395 
396 //=============================================================================================================
397 
399 {
400  if(m_fScale == scale) {
401  return;
402  }
403 
404  m_fScale *= scale;
405  emit scaleChanged(m_fScale);
406 
407  QMatrix4x4 m = m_pTransform->matrix();
408  m.scale(scale);
409  m_pTransform->setMatrix(m);
410 }
411 
412 //=============================================================================================================
413 
415 {
416  if(m_fScale == scale) {
417  return;
418  }
419 
420  // Revert present scaling because we are in the set (not apply) function
421  QMatrix4x4 m = m_pTransform->matrix();
422  m.scale(scale/m_fScale);
423  m_pTransform->setMatrix(m);
424 
425  m_fScale = scale;
426  emit scaleChanged(m_fScale);
427 }
428 
429 //=============================================================================================================
430 
432 {
433  for(int i = 0; i < this->childNodes().size(); ++i) {
434  this->childNodes()[i]->setEnabled(state);
435  }
436  this->setEnabled(state);
437 }
438 
439 //=============================================================================================================
440 
442  const QString &sParameterName)
443 {
444  setMaterialParameterRecursive(this, data, sParameterName);
445 }
446 
447 //=============================================================================================================
448 
449 QVariant Renderable3DEntity::getMaterialParameter(const QString &sParameterName)
450 {
451  QPair<bool, QVariant> resultPair = getMaterialParameterRecursive(this, sParameterName);
452 
453  return resultPair.second;
454 }
455 
456 //=============================================================================================================
457 
459  const QVariant &data,
460  const QString &sParameterName)
461 {
462  if(QParameter* pParameter = dynamic_cast<QParameter*>(pObject)) {
463  if(pParameter->name() == sParameterName) {
464  pParameter->setValue(data);
465  }
466  }
467 
468  for(int i = 0; i < pObject->children().size(); ++i) {
469  setMaterialParameterRecursive(pObject->children().at(i), data, sParameterName);
470  }
471 }
472 
473 //=============================================================================================================
474 
475 QPair<bool, QVariant> Renderable3DEntity::getMaterialParameterRecursive(QObject * pObject,
476  const QString &sParameterName)
477 {
478  if(QParameter* pParameter = dynamic_cast<QParameter*>(pObject)) {
479  if(pParameter->name() == sParameterName) {
480  return QPair<bool, QVariant>(true, pParameter->value());
481  }
482  }
483 
484  for(int i = 0; i < pObject->children().size(); ++i) {
485  QPair<bool, QVariant> pair = getMaterialParameterRecursive(pObject->children().at(i), sParameterName);
486 
487  if(pair.first) {
488  return pair;
489  }
490  }
491 
492  return QPair<bool, QVariant>(false, QVariant());
493 }
DISP3DLIB::Renderable3DEntity::getMaterialParameterRecursive
virtual QPair< bool, QVariant > getMaterialParameterRecursive(QObject *pObject, const QString &sParameterName)
Definition: renderable3Dentity.cpp:475
DISP3DLIB::Renderable3DEntity::applyRotY
virtual void applyRotY(float rotY)
Definition: renderable3Dentity.cpp:299
DISP3DLIB::Renderable3DEntity::applyRotX
virtual void applyRotX(float rotX)
Definition: renderable3Dentity.cpp:266
DISP3DLIB::Renderable3DEntity::setRotX
virtual void setRotX(float rotX)
Definition: renderable3Dentity.cpp:282
DISP3DLIB::Renderable3DEntity::setMaterialParameterRecursive
virtual void setMaterialParameterRecursive(QObject *pObject, const QVariant &data, const QString &sParameterName)
Definition: renderable3Dentity.cpp:458
DISP3DLIB::Renderable3DEntity::getMaterialParameter
virtual QVariant getMaterialParameter(const QString &sParameterName)
Definition: renderable3Dentity.cpp:449
DISP3DLIB::Renderable3DEntity::m_position
QVector3D m_position
Definition: renderable3Dentity.h:336
DISP3DLIB::Renderable3DEntity::setVisible
virtual void setVisible(bool state)
Definition: renderable3Dentity.cpp:431
FIFFLIB::FiffCoordTrans::invtrans
Eigen::Matrix< float, 4, 4, Eigen::DontAlign > invtrans
Definition: fiff_coord_trans.h:298
DISP3DLIB::Renderable3DEntity::m_fScale
float m_fScale
Definition: renderable3Dentity.h:332
fiff_coord_trans.h
FiffCoordTrans class declaration.
DISP3DLIB::Renderable3DEntity::applyRotZ
virtual void applyRotZ(float rotZ)
Definition: renderable3Dentity.cpp:332
DISP3DLIB::Renderable3DEntity::setRotZ
virtual void setRotZ(float rotZ)
Definition: renderable3Dentity.cpp:348
DISP3DLIB::Renderable3DEntity::rotXChanged
void rotXChanged(float rotX)
DISP3DLIB::Renderable3DEntity::rotZChanged
void rotZChanged(float rotZ)
DISP3DLIB::Renderable3DEntity::scaleValue
virtual float scaleValue() const
Definition: renderable3Dentity.cpp:231
DISP3DLIB::Renderable3DEntity::rotYChanged
void rotYChanged(float rotY)
DISP3DLIB::Renderable3DEntity::applyTransform
virtual void applyTransform(const Qt3DCore::QTransform &transform)
Definition: renderable3Dentity.cpp:177
renderable3Dentity.h
Renderable3DEntity class declaration.
DISP3DLIB::Renderable3DEntity::~Renderable3DEntity
virtual ~Renderable3DEntity()
Definition: renderable3Dentity.cpp:95
DISP3DLIB::Renderable3DEntity::m_fRotY
float m_fRotY
Definition: renderable3Dentity.h:334
DISP3DLIB::Renderable3DEntity::setScale
virtual void setScale(float scale)
Definition: renderable3Dentity.cpp:414
DISP3DLIB::Renderable3DEntity::m_fRotX
float m_fRotX
Definition: renderable3Dentity.h:333
DISP3DLIB::Renderable3DEntity::m_pTransform
QPointer< Qt3DCore::QTransform > m_pTransform
Definition: renderable3Dentity.h:330
DISP3DLIB::Renderable3DEntity::scaleChanged
void scaleChanged(float scale)
DISP3DLIB::Renderable3DEntity::m_fRotZ
float m_fRotZ
Definition: renderable3Dentity.h:335
DISP3DLIB::Renderable3DEntity::positionChanged
void positionChanged(QVector3D position)
DISP3DLIB::Renderable3DEntity::Renderable3DEntity
Renderable3DEntity(Qt3DCore::QEntity *parent=0)
Definition: renderable3Dentity.cpp:81
DISP3DLIB::Renderable3DEntity::applyScale
virtual void applyScale(float scale)
Definition: renderable3Dentity.cpp:398
DISP3DLIB::Renderable3DEntity::setPosition
virtual void setPosition(const QVector3D &position)
Definition: renderable3Dentity.cpp:381
FIFFLIB::FiffCoordTrans
Coordinate transformation description.
Definition: fiff_coord_trans.h:74
DISP3DLIB::Renderable3DEntity::setRotY
virtual void setRotY(float rotY)
Definition: renderable3Dentity.cpp:315
FIFFLIB::FiffCoordTrans::trans
Eigen::Matrix< float, 4, 4, Eigen::DontAlign > trans
Definition: fiff_coord_trans.h:297
DISP3DLIB::Renderable3DEntity::applyPosition
virtual void applyPosition(const QVector3D &position)
Definition: renderable3Dentity.cpp:365
DISP3DLIB::Renderable3DEntity::setMaterialParameter
virtual void setMaterialParameter(const QVariant &data, const QString &sParameterName)
Definition: renderable3Dentity.cpp:441
DISP3DLIB::Renderable3DEntity::setTransform
virtual void setTransform(const Qt3DCore::QTransform &transform)
Definition: renderable3Dentity.cpp:123