MNE-CPP 0.1.9
A Framework for Electrophysiology
Loading...
Searching...
No Matches
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
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
71using namespace DISP3DLIB;
72using namespace Eigen;
73using namespace Qt3DCore;
74using namespace FIFFLIB;
75using namespace Qt3DRender;
76
77//=============================================================================================================
78// DEFINE MEMBER METHODS
79//=============================================================================================================
80
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
123void Renderable3DEntity::setTransform(const Qt3DCore::QTransform& transform)
124{
125 m_pTransform->setMatrix(transform.matrix());
126}
127
128//=============================================================================================================
129
130void 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
177void Renderable3DEntity::applyTransform(const Qt3DCore::QTransform& transform)
178{
179 m_pTransform->setMatrix(transform.matrix() * m_pTransform->matrix());
180}
181
182//=============================================================================================================
183
184void 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
238float Renderable3DEntity::rotX() const
239{
240 return m_fRotX;
241}
242
243//=============================================================================================================
244
245float Renderable3DEntity::rotY() const
246{
247 return m_fRotY;
248}
249
250//=============================================================================================================
251
252float Renderable3DEntity::rotZ() const
253{
254 return m_fRotZ;
255}
256
257//=============================================================================================================
258
259QVector3D 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
365void 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
381void 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;
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;
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
449QVariant 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
475QPair<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}
FiffCoordTrans class declaration.
Renderable3DEntity class declaration.
virtual void applyRotX(float rotX)
virtual void setMaterialParameterRecursive(QObject *pObject, const QVariant &data, const QString &sParameterName)
void rotYChanged(float rotY)
virtual void applyScale(float scale)
virtual void applyTransform(const Qt3DCore::QTransform &transform)
virtual void setVisible(bool state)
QPointer< Qt3DCore::QTransform > m_pTransform
virtual void setScale(float scale)
virtual void setPosition(const QVector3D &position)
Renderable3DEntity(Qt3DCore::QEntity *parent=0)
void scaleChanged(float scale)
virtual void setRotY(float rotY)
virtual QPair< bool, QVariant > getMaterialParameterRecursive(QObject *pObject, const QString &sParameterName)
void rotZChanged(float rotZ)
virtual QVariant getMaterialParameter(const QString &sParameterName)
virtual void applyPosition(const QVector3D &position)
void rotXChanged(float rotX)
virtual void setTransform(const Qt3DCore::QTransform &transform)
virtual void setMaterialParameter(const QVariant &data, const QString &sParameterName)
virtual void applyRotY(float rotY)
virtual void setRotZ(float rotZ)
void positionChanged(QVector3D position)
virtual void setRotX(float rotX)
virtual void applyRotZ(float rotZ)
Coordinate transformation description.
Eigen::Matrix< float, 4, 4, Eigen::DontAlign > trans
Eigen::Matrix< float, 4, 4, Eigen::DontAlign > invtrans