54 #include "qglbuilder.h"
57 #include <QtCore/qurl.h>
60 #include <QMouseEvent>
85 InverseView::InverseView(
const MNESourceSpace &p_sourceSpace, QList<Label> &p_qListLabels, QList<RowVector4i> &p_qListRGBAs, qint32 p_iFps,
bool p_bLoop,
bool p_bStereo,
bool p_bSlowMotion, QWindow *parent)
88 , m_sourceSpace(p_sourceSpace)
89 , m_qListLabels(p_qListLabels)
90 , m_qListRGBAs(p_qListRGBAs)
92 , m_bStereo(p_bStereo)
94 , m_fOffsetZEye(60.0f)
95 , m_pSceneNodeBrain(0)
98 qRegisterMetaType<QSharedPointer<Eigen::VectorXd> >(
"QSharedPointer<Eigen::VectorXd>");
106 QObject::connect(m_pInverseViewProducer.data(), &InverseViewProducer::sourceEstimateSample,
this, &InverseView::updateActivation);
114 m_pInverseViewProducer->stop();
124 m_pInverseViewProducer->pushSourceEstimate(p_sourceEstimate);
137 builder << QGL::Faceted;
138 m_pSceneNodeBrain = builder.currentNode();
144 QSharedPointer<QGLMaterialCollection> palette = builder.sceneNode()->palette();
146 m_qListMapLabelIdIndex << QMap<qint32, qint32>() << QMap<qint32, qint32>();
149 m_vecBoundingBoxMin.setX(m_sourceSpace[0].rr.col(0).minCoeff());
150 m_vecBoundingBoxMin.setY(m_sourceSpace[0].rr.col(1).minCoeff());
151 m_vecBoundingBoxMin.setZ(m_sourceSpace[0].rr.col(2).minCoeff());
152 m_vecBoundingBoxMax.setX(m_sourceSpace[0].rr.col(0).maxCoeff());
153 m_vecBoundingBoxMax.setY(m_sourceSpace[0].rr.col(1).maxCoeff());
154 m_vecBoundingBoxMax.setZ(m_sourceSpace[0].rr.col(2).maxCoeff());
156 m_vecBoundingBoxMin.setX(m_vecBoundingBoxMin.x() < m_sourceSpace[1].rr.col(0).minCoeff() ? m_vecBoundingBoxMin.x() : m_sourceSpace[1].rr.col(0).minCoeff());
157 m_vecBoundingBoxMin.setY(m_vecBoundingBoxMin.y() < m_sourceSpace[1].rr.col(1).minCoeff() ? m_vecBoundingBoxMin.y() : m_sourceSpace[1].rr.col(1).minCoeff());
158 m_vecBoundingBoxMin.setZ(m_vecBoundingBoxMin.z() < m_sourceSpace[1].rr.col(2).minCoeff() ? m_vecBoundingBoxMin.z() : m_sourceSpace[1].rr.col(2).minCoeff());
159 m_vecBoundingBoxMax.setX(m_vecBoundingBoxMax.x() > m_sourceSpace[1].rr.col(0).maxCoeff() ? m_vecBoundingBoxMax.x() : m_sourceSpace[1].rr.col(0).maxCoeff());
160 m_vecBoundingBoxMax.setY(m_vecBoundingBoxMax.y() > m_sourceSpace[1].rr.col(1).maxCoeff() ? m_vecBoundingBoxMax.y() : m_sourceSpace[1].rr.col(1).maxCoeff());
161 m_vecBoundingBoxMax.setZ(m_vecBoundingBoxMax.z() > m_sourceSpace[1].rr.col(2).maxCoeff() ? m_vecBoundingBoxMax.z() : m_sourceSpace[1].rr.col(2).maxCoeff());
163 m_vecBoundingBoxCenter.setX((m_vecBoundingBoxMin.x()+m_vecBoundingBoxMax.x())/2.0f);
164 m_vecBoundingBoxCenter.setY((m_vecBoundingBoxMin.y()+m_vecBoundingBoxMax.y())/2.0f);
165 m_vecBoundingBoxCenter.setZ((m_vecBoundingBoxMin.z()+m_vecBoundingBoxMax.z())/2.0f);
171 for(qint32 h = 0; h < 2; ++h)
176 MatrixX3f rr = m_sourceSpace[h].rr;
179 rr.col(0) = rr.col(0).array() - m_vecBoundingBoxCenter.x();
180 rr.col(1) = rr.col(1).array() - m_vecBoundingBoxCenter.y();
181 rr.col(2) = rr.col(2).array() - m_vecBoundingBoxCenter.z();
187 for(qint32 k = 0; k < m_qListLabels.size(); ++k)
190 if(m_qListLabels[k].hemi != h)
194 tris = m_qListLabels[k].selectTris(m_sourceSpace[h].tris);
197 if(builder.currentNode()->count() > 0)
201 QGeometryData t_GeometryDataTri;
204 MatrixXf t_TriCoords(3,3*tris.rows());
206 for(qint32 i = 0; i < tris.rows(); ++i)
208 t_TriCoords.col(i*3) = rr.row( tris(i,0) ).transpose();
209 t_TriCoords.col(i*3+1) = rr.row( tris(i,1) ).transpose();
210 t_TriCoords.col(i*3+2) = rr.row( tris(i,2) ).transpose();
214 t_GeometryDataTri.appendVertexArray(QArray<QVector3D>::fromRawData( reinterpret_cast<const QVector3D*>(t_TriCoords.data()), t_TriCoords.cols() ));
219 if (t_GeometryDataTri.count() > 0)
225 builder.addTriangles(t_GeometryDataTri);
230 QGLMaterial *t_pMaterialROI =
new QGLMaterial();
233 if(m_iColorMode == 0)
239 else if(m_iColorMode == 1)
241 r = m_qListRGBAs[k][0];
242 g = m_qListRGBAs[k][1];
243 b = m_qListRGBAs[k][2];
247 t_pMaterialROI->setColor(QColor(r,g,b,230));
251 index = palette->addMaterial(t_pMaterialROI);
252 builder.currentNode()->setMaterialIndex(index);
254 m_qListMapLabelIdIndex[h].insert(m_qListLabels[k].label_id, index);
265 m_pSceneNode = builder.finalizedSceneNode();
266 m_pSceneNode->setParent(
this);
271 m_pLightModel =
new QGLLightModel(
this);
272 m_pLightModel->setAmbientSceneColor(Qt::white);
273 m_pLightModel->setViewerPosition(QGLLightModel::LocalViewer);
275 m_pLightModel =
new QGLLightModel(
this);
277 m_pLightParametersScene =
new QGLLightParameters(
this);
278 m_pLightParametersScene->setPosition(QVector3D(0.0f, 0.0f, 3.0f));
279 painter->setMainLight(m_pLightParametersScene);
286 this->setStereoType(QGLView::StretchedLeftRight);
291 camera()->setCenter(QVector3D(0,0,m_fOffsetZ));
292 camera()->setEyeSeparation(0.4f);
293 camera()->setFieldOfView(30);
294 camera()->setEye(QVector3D(0,0,m_fOffsetZEye));
303 glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
306 m_pInverseViewProducer->start();
319 painter->modelViewMatrix().push();
320 painter->projectionMatrix().push();
322 painter->setStandardEffect(QGL::LitMaterial);
324 painter->setLightModel(m_pLightModel);
329 m_pSceneNode->draw(painter);
332 painter->modelViewMatrix().pop();
333 painter->projectionMatrix().pop();
341 camera()->setCenter(QVector3D(0,0,0));
343 float normEyeOld = sqrt(pow(camera()->eye().x(),2) + pow(camera()->eye().y(),2) + pow(camera()->eye().z(),2));
345 QGLView::keyPressEvent(e);
347 float dx = (camera()->eye().x()*m_fOffsetZ)/m_fOffsetZEye;
348 float dy = (camera()->eye().y()*m_fOffsetZ)/m_fOffsetZEye;
349 float dz = (camera()->eye().z()*m_fOffsetZ)/m_fOffsetZEye;
351 float normEye = sqrt(pow(camera()->eye().x(),2) + pow(camera()->eye().y(),2) + pow(camera()->eye().z(),2));
352 float scaleEye = normEyeOld/normEye;
353 camera()->setEye(QVector3D(camera()->eye().x()*scaleEye,camera()->eye().y()*scaleEye,camera()->eye().z()*scaleEye));
355 camera()->setCenter(QVector3D(dx,dy,dz));
363 camera()->setCenter(QVector3D(0,0,0));
365 float normEyeOld = sqrt(pow(camera()->eye().x(),2) + pow(camera()->eye().y(),2) + pow(camera()->eye().z(),2));
367 QGLView::mouseMoveEvent(e);
369 float dx = (camera()->eye().x()*m_fOffsetZ)/m_fOffsetZEye;
370 float dy = (camera()->eye().y()*m_fOffsetZ)/m_fOffsetZEye;
371 float dz = (camera()->eye().z()*m_fOffsetZ)/m_fOffsetZEye;
373 float normEye = sqrt(pow(camera()->eye().x(),2) + pow(camera()->eye().y(),2) + pow(camera()->eye().z(),2));
374 float scaleEye = normEyeOld/normEye;
375 camera()->setEye(QVector3D(camera()->eye().x()*scaleEye,camera()->eye().y()*scaleEye,camera()->eye().z()*scaleEye));
377 camera()->setCenter(QVector3D(dx,dy,dz));
386 if(e->buttons() & Qt::RightButton)
388 float normEye = sqrt(pow(camera()->eye().x(),2) + pow(camera()->eye().y(),2) + pow(camera()->eye().z(),2));
389 camera()->setCenter(QVector3D(0,0,m_fOffsetZ));
390 camera()->setEye(QVector3D(0,0,normEye));
393 QGLView::mousePressEvent(e);
412 void InverseView::updateActivation(QSharedPointer<Eigen::VectorXd> p_pVecActivation)
414 VectorXd t_curLabelActivation = VectorXd::Zero(m_pSceneNode->palette()->size());
417 for(qint32 h = 0; h < 2; ++h)
419 for(qint32 i = 0; i < m_sourceSpace[h].cluster_info.numClust(); ++i)
421 qint32 labelId = m_sourceSpace[h].cluster_info.clusterLabelIds[i];
422 qint32 colorIdx = m_qListMapLabelIdIndex[h][labelId];
425 if(abs(t_curLabelActivation[colorIdx]) < abs((*p_pVecActivation.data())[actCount]))
426 t_curLabelActivation[colorIdx] = (*p_pVecActivation.data())[actCount];
432 for(qint32 i = 0; i < m_pSceneNode->palette()->size(); ++i)
434 qint32 iVal = (t_curLabelActivation[i]/m_pInverseViewProducer->getGlobalMax()) * 255;
436 iVal = iVal > 255 ? 255 : iVal < 0 ? 0 : iVal;
441 qRgb = ColorMap::valueToHotNegative1((
double)iVal/255.0);
462 m_pSceneNode->palette()->material(i)->setSpecularColor(QColor(qRgb));
ColorMap class declaration.
void pushSourceEstimate(MNESourceEstimate &p_sourceEstimate)
void keyPressEvent(QKeyEvent *e)
void paintGL(QGLPainter *painter)
Source Space descritpion.
InverseViewProducer class declaration.
InverseView(const MNESourceSpace &p_sourceSpace, QList< Label > &p_qListLabels, QList< RowVector4i > &p_qListRGBAs, qint32 p_iFps=24, bool p_bLoop=true, bool p_bStereo=false, bool p_bSlowMotion=false, QWindow *parent=0)
void initializeGL(QGLPainter *painter)
void mousePressEvent(QMouseEvent *e)
InverseView class declaration.
void mouseMoveEvent(QMouseEvent *e)