41 #include "brainview.h"
49 #include "qglbuilder.h"
52 #include <QMouseEvent>
70 : m_pSceneNodeBrain(NULL)
73 , m_pLightParametersScene(NULL)
81 BrainView::BrainView(
const QString &subject_id, qint32 hemi,
const QString &surf,
const QString &subjects_dir)
82 : m_SurfaceSet(subject_id, hemi, surf, subjects_dir)
83 , m_pSceneNodeBrain(NULL)
86 , m_pLightParametersScene(NULL)
94 BrainView::BrainView(
const QString &subject_id, qint32 hemi,
const QString &surf,
const QString &atlas,
const QString &subjects_dir)
95 : m_SurfaceSet(subject_id, hemi, surf, subjects_dir)
96 , m_AnnotationSet(subject_id, hemi, atlas, subjects_dir)
97 , m_pSceneNodeBrain(NULL)
100 , m_pLightParametersScene(NULL)
109 : m_pSceneNodeBrain(NULL)
111 , m_pLightModel(NULL)
112 , m_pLightParametersScene(NULL)
115 m_SurfaceSet.
insert(t_Surf);
135 void BrainView::init()
138 m_bRenderPerVertex =
false;
139 m_fOffsetZ = -100.0f;
140 m_fOffsetZEye = 60.0f;
151 qDebug() <<
"m_SurfaceSet.surf()" << m_SurfaceSet.
surf();
152 if(QString::compare(m_SurfaceSet.
surf(),
"inflated") == 0)
154 genSurfacePerVertex();
165 m_pLightModel =
new QGLLightModel(
this);
166 m_pLightModel->setAmbientSceneColor(Qt::white);
167 m_pLightModel->setViewerPosition(QGLLightModel::LocalViewer);
169 m_pLightParametersScene =
new QGLLightParameters(
this);
170 m_pLightParametersScene->setPosition(QVector3D(0.0f, 0.0f, 3.0f));
171 painter->setMainLight(m_pLightParametersScene);
178 this->setStereoType(QGLView::StretchedLeftRight);
180 camera()->setCenter(QVector3D(0,0,m_fOffsetZ));
181 camera()->setEyeSeparation(0.4f);
182 camera()->setFieldOfView(30);
183 camera()->setEye(QVector3D(0,0,m_fOffsetZEye));
187 camera()->setCenter(QVector3D(0,0,m_fOffsetZ));
188 camera()->setFieldOfView(30);
189 camera()->setEye(QVector3D(0,0,m_fOffsetZEye));
193 glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
206 painter->modelViewMatrix().push();
207 painter->projectionMatrix().push();
209 painter->setStandardEffect(QGL::LitMaterial);
211 painter->setLightModel(m_pLightModel);
213 if(m_bRenderPerVertex)
215 material.bind(painter);
216 material.prepareToDraw(painter, painter->attributes());
220 m_pSceneNode->draw(painter);
223 painter->modelViewMatrix().pop();
224 painter->projectionMatrix().pop();
232 camera()->setCenter(QVector3D(0,0,0));
234 float normEyeOld = sqrt(pow(camera()->eye().x(),2) + pow(camera()->eye().y(),2) + pow(camera()->eye().z(),2));
236 QGLView::keyPressEvent(e);
238 float dx = (camera()->eye().x()*m_fOffsetZ)/m_fOffsetZEye;
239 float dy = (camera()->eye().y()*m_fOffsetZ)/m_fOffsetZEye;
240 float dz = (camera()->eye().z()*m_fOffsetZ)/m_fOffsetZEye;
242 float normEye = sqrt(pow(camera()->eye().x(),2) + pow(camera()->eye().y(),2) + pow(camera()->eye().z(),2));
243 float scaleEye = normEyeOld/normEye;
244 camera()->setEye(QVector3D(camera()->eye().x()*scaleEye,camera()->eye().y()*scaleEye,camera()->eye().z()*scaleEye));
246 camera()->setCenter(QVector3D(dx,dy,dz));
254 camera()->setCenter(QVector3D(0,0,0));
256 float normEyeOld = sqrt(pow(camera()->eye().x(),2) + pow(camera()->eye().y(),2) + pow(camera()->eye().z(),2));
258 QGLView::mouseMoveEvent(e);
260 float dx = (camera()->eye().x()*m_fOffsetZ)/m_fOffsetZEye;
261 float dy = (camera()->eye().y()*m_fOffsetZ)/m_fOffsetZEye;
262 float dz = (camera()->eye().z()*m_fOffsetZ)/m_fOffsetZEye;
264 float normEye = sqrt(pow(camera()->eye().x(),2) + pow(camera()->eye().y(),2) + pow(camera()->eye().z(),2));
265 float scaleEye = normEyeOld/normEye;
266 camera()->setEye(QVector3D(camera()->eye().x()*scaleEye,camera()->eye().y()*scaleEye,camera()->eye().z()*scaleEye));
268 camera()->setCenter(QVector3D(dx,dy,dz));
277 if(e->buttons() & Qt::RightButton)
279 float normEye = sqrt(pow(camera()->eye().x(),2) + pow(camera()->eye().y(),2) + pow(camera()->eye().z(),2));
280 camera()->setCenter(QVector3D(0,0,m_fOffsetZ));
281 camera()->setEye(QVector3D(0,0,normEye));
284 QGLView::mousePressEvent(e);
291 void BrainView::genSurfacePerVertex()
293 if(m_SurfaceSet.
size() == 0)
307 builder << QGL::Smooth;
308 m_pSceneNodeBrain = builder.currentNode();
320 QMap<qint32, Surface>::const_iterator it = m_SurfaceSet.
data().constBegin();
321 for (it = m_SurfaceSet.
data().begin(); it != m_SurfaceSet.
data().end(); ++it)
325 Matrix3Xf rr = it.value().rr().transpose();
328 for(qint32 i = 0; i < 3; ++i)
329 rr.row(i) = rr.row(i).array() - (m_vecBoundingBoxCenter[i] + it.value().offset()[i]);
332 QGeometryData t_GeometryDataTri;
334 MatrixXf t_TriCoords = MatrixXf::Zero(3,3*(it.value().tris().rows()));
335 QArray<QColor4ub> cdata;
336 for(qint32 i = 0; i < it.value().tris().rows(); ++i)
338 for(qint32 j = 0; j < 3; ++j)
340 t_TriCoords.col(i*3+j) = rr.col( it.value().tris()(i,j) );
342 if(it.value().curv()[it.value().tris()(i,j)] >= 0)
343 cdata.append(QColor( 50, 50, 50, 230));
345 cdata.append(QColor( 200, 200, 200, 230));
350 t_GeometryDataTri.appendVertexArray(QArray<QVector3D>::fromRawData( reinterpret_cast<const QVector3D*>(t_TriCoords.data()), t_TriCoords.cols() ));
352 t_GeometryDataTri.appendColorArray(cdata);
357 builder.addTriangles(t_GeometryDataTri);
363 m_bRenderPerVertex =
true;
366 m_pSceneNode = builder.finalizedSceneNode();
368 m_pSceneNode->setParent(
this);
374 void BrainView::genSurfacePerRegion()
376 if(m_SurfaceSet.
size() == 0)
390 builder << QGL::Smooth;
391 m_pSceneNodeBrain = builder.currentNode();
399 QSharedPointer<QGLMaterialCollection> palette = builder.sceneNode()->palette();
409 QMap<qint32, Surface>::const_iterator it = m_SurfaceSet.
data().constBegin();
410 for (it = m_SurfaceSet.
data().begin(); it != m_SurfaceSet.
data().end(); ++it)
414 Matrix3Xf rr = it.value().rr().transpose();
417 for(qint32 i = 0; i < 3; ++i)
418 rr.row(i) = rr.row(i).array() - m_vecBoundingBoxCenter[i];
421 QGeometryData t_GeometryDataTri;
423 MatrixXf t_TriCoords = MatrixXf::Zero(3,3*(it.value().tris().rows()));
424 for(qint32 i = 0; i < it.value().tris().rows(); ++i)
425 for(qint32 j = 0; j < 3; ++j)
426 t_TriCoords.col(i*3+j) = rr.col( it.value().tris()(i,j) );
429 t_GeometryDataTri.appendVertexArray(QArray<QVector3D>::fromRawData( reinterpret_cast<const QVector3D*>(t_TriCoords.data()), t_TriCoords.cols() ));
434 builder.addTriangles(t_GeometryDataTri);
439 QGLMaterial *t_pMaterialROI =
new QGLMaterial();
440 t_pMaterialROI->setColor(QColor(100,100,100,230));
441 index = palette->addMaterial(t_pMaterialROI);
442 builder.currentNode()->setMaterialIndex(index);
448 m_bRenderPerVertex =
false;
451 m_pSceneNode = builder.finalizedSceneNode();
453 m_pSceneNode->setParent(
this);
459 void BrainView::genSurface()
461 if(m_SurfaceSet.
size() == 0)
475 builder << QGL::Smooth;
476 m_pSceneNodeBrain = builder.currentNode();
484 QSharedPointer<QGLMaterialCollection> palette = builder.sceneNode()->palette();
495 QMap<qint32, Surface>::const_iterator it = m_SurfaceSet.
data().constBegin();
496 for (it = m_SurfaceSet.
data().begin(); it != m_SurfaceSet.
data().end(); ++it)
500 Matrix3Xf rr = it.value().rr().transpose();
503 for(qint32 i = 0; i < 3; ++i)
504 rr.row(i) = rr.row(i).array() - m_vecBoundingBoxCenter[i];
507 QGeometryData t_GeometryDataTri;
509 MatrixXf t_TriCoords = MatrixXf::Zero(3,3*(it.value().tris().rows()));
510 for(qint32 i = 0; i < it.value().tris().rows(); ++i)
511 for(qint32 j = 0; j < 3; ++j)
512 t_TriCoords.col(i*3+j) = rr.col( it.value().tris()(i,j) );
515 t_GeometryDataTri.appendVertexArray(QArray<QVector3D>::fromRawData( reinterpret_cast<const QVector3D*>(t_TriCoords.data()), t_TriCoords.cols() ));
520 builder.addTriangles(t_GeometryDataTri);
525 QGLMaterial *t_pMaterialROI =
new QGLMaterial();
526 t_pMaterialROI->setColor(QColor(100,100,100,230));
527 index = palette->addMaterial(t_pMaterialROI);
528 builder.currentNode()->setMaterialIndex(index);
534 m_bRenderPerVertex =
false;
537 m_pSceneNode = builder.finalizedSceneNode();
539 m_pSceneNode->setParent(
this);
545 void BrainView::calcBoundingBox()
547 QMap<qint32, Surface>::const_iterator it = m_SurfaceSet.
data().constBegin();
549 QVector3D min(it.value().rr().col(0).minCoeff(), it.value().rr().col(1).minCoeff(), it.value().rr().col(2).minCoeff());
550 QVector3D max(it.value().rr().col(0).maxCoeff(), it.value().rr().col(1).maxCoeff(), it.value().rr().col(2).maxCoeff());
552 for (it = m_SurfaceSet.
data().begin()+1; it != m_SurfaceSet.
data().end(); ++it)
554 for(qint32 i = 0; i < 3; ++i)
556 min[i] = min[i] > it.value().rr().col(i).minCoeff() ? it.value().rr().col(i).minCoeff() : min[i];
557 max[i] = max[i] < it.value().rr().col(i).maxCoeff() ? it.value().rr().col(i).maxCoeff() : max[i];
560 m_vecBoundingBoxMin = min;
561 m_vecBoundingBoxMax = max;
563 for(qint32 i = 0; i < 3; ++i)
564 m_vecBoundingBoxCenter[i] = (m_vecBoundingBoxMin[i]+m_vecBoundingBoxMax[i])/2.0f;
void mouseMoveEvent(QMouseEvent *e)
void paintGL(QGLPainter *painter)
void insert(const Surface &p_Surface)
QMap< qint32, Surface > & data()
void mousePressEvent(QMouseEvent *e)
void initializeGL(QGLPainter *painter)
void keyPressEvent(QKeyEvent *e)