CylinderView::CylinderView(QWindow *parent) : QGLView(parent) { QGLBuilder builder; // Evil hack: it is not possible to just call glClearColor on any device // but it is possible to have a huge, dark SkyBox. Without this hack the // cylinder floats over a transparent background, displaying the contents // of the last app builder << QGL::Smooth << QGLCube(1000.0f); // Add the cylinder builder << QGL::Smooth << QGLCylinder(2.0, 1.5, 2.0, 36, 3, true, true); QGLMaterial *matLid = new QGLMaterial; matLid->setAmbientColor(Qt::gray); matLid->setDiffuseColor(Qt::gray); QUrl urlLid; urlLid.setPath(QLatin1String(":/latte.png")); urlLid.setScheme(QLatin1String("file")); matLid->setTextureUrl(urlLid); QGLMaterial *matSides = new QGLMaterial; matSides->setColor(QColor(170, 202, 0)); QUrl urlSides; urlSides.setPath(QLatin1String(":/cupTexture.png")); urlSides.setScheme(QLatin1String("file")); matSides->setTextureUrl(urlSides); QGLSceneNode *root = builder.sceneNode(); QGLSceneNode *lid = root->findChild<QGLSceneNode *>("Cylinder Top"); int lidMat = root->palette()->addMaterial(matLid); lid->setMaterialIndex(lidMat); lid->setEffect(QGL::LitDecalTexture2D); QGLSceneNode *sides = root->findChild<QGLSceneNode *>("Cylinder Sides"); int sideMat = root->palette()->addMaterial(matSides); sides->setMaterialIndex(sideMat); sides->setEffect(QGL::LitDecalTexture2D); cylinder = builder.finalizedSceneNode(); QGLMaterial *mat = new QGLMaterial; mat->setAmbientColor(Qt::gray); mat->setDiffuseColor(Qt::gray); cylinder->setMaterial(mat); cylinder->setEffect(QGL::LitMaterial); }
void LabelView::initializeGL(QGLPainter *painter) { // in the constructor construct a builder on the stack QGLBuilder builder; float fac = 10.0f; builder << QGL::Faceted; m_pSceneNodeBrain = builder.currentNode(); builder.pushNode(); // Collor palette qint32 index; QSharedPointer<QGLMaterialCollection> palette = builder.sceneNode()->palette(); // register color palette within the root node // // Build each hemisphere in its separate node // for(qint32 h = 0; h < 2; ++h) { builder.newNode();//create new hemisphere node { MatrixX3i tris; MatrixX3f rr = m_surfSet[h].rr(); builder.pushNode(); // // Create each ROI in its own node // for(qint32 k = 0; k < m_qListLabels.size(); ++k) { //check if label hemi fits current hemi if(m_qListLabels[k].hemi != h) continue; //Ggenerate label tri information tris = m_qListLabels[k].selectTris(m_surfSet[h]); // add new ROI node when current ROI node is not empty if(builder.currentNode()->count() > 0) builder.newNode(); QGeometryData t_GeometryDataTri; MatrixXf t_TriCoords(3,3*tris.rows()); for(qint32 i = 0; i < tris.rows(); ++i) { t_TriCoords.col(i*3) = rr.row( tris(i,0) ).transpose(); t_TriCoords.col(i*3+1) = rr.row( tris(i,1) ).transpose(); t_TriCoords.col(i*3+2) = rr.row( tris(i,2) ).transpose(); } t_TriCoords *= fac; t_GeometryDataTri.appendVertexArray(QArray<QVector3D>::fromRawData( reinterpret_cast<const QVector3D*>(t_TriCoords.data()), t_TriCoords.cols() )); // // If triangles are available. // if (t_GeometryDataTri.count() > 0) { // // Add triangles to current node // builder.addTriangles(t_GeometryDataTri); // // Colorize ROI // QGLMaterial *t_pMaterialROI = new QGLMaterial(); int r, g, b; r = m_qListRGBAs[k][0]; g = m_qListRGBAs[k][1]; b = m_qListRGBAs[k][2]; t_pMaterialROI->setColor(QColor(r,g,b,200)); // t_pMaterialROI->setEmittedLight(QColor(100,100,100,255)); // t_pMaterialROI->setSpecularColor(QColor(10,10,10,20)); index = palette->addMaterial(t_pMaterialROI); builder.currentNode()->setMaterialIndex(index); } } } // Go one level up builder.popNode(); } // Go one level up builder.popNode(); // Optimze current scene for display and calculate lightning normals m_pSceneNode = builder.finalizedSceneNode(); m_pSceneNode->setParent(this); // // Create light models // m_pLightModel = new QGLLightModel(this); m_pLightModel->setAmbientSceneColor(Qt::white); m_pLightModel->setViewerPosition(QGLLightModel::LocalViewer); m_pLightModel = new QGLLightModel(this); m_pLightParametersScene = new QGLLightParameters(this); m_pLightParametersScene->setPosition(QVector3D(0.0f, 0.0f, 3.0f)); painter->setMainLight(m_pLightParametersScene); simCount = 0; // // Set stereo type // if (m_bStereo) { this->setStereoType(QGLView::RedCyanAnaglyph); camera()->setEyeSeparation(0.4f); m_pCameraFrontal->setEyeSeparation(0.1f); } }
void BrainView::genSurface() { if(m_SurfaceSet.size() == 0) return; if(m_pSceneNode) { delete m_pSceneNode; m_pSceneNode = NULL; } // in the constructor construct a builder on the stack QGLBuilder builder; float fac = 100.0f; // too small vertices distances cause clipping errors --> 100 is a good value for freesurfer brain measures builder << QGL::Smooth;//QGL::Faceted; m_pSceneNodeBrain = builder.currentNode(); builder.pushNode(); // // Collor palette // qint32 index; QSharedPointer<QGLMaterialCollection> palette = builder.sceneNode()->palette(); // register color palette within the root node // // get bounding box // calcBoundingBox(); // // Build each surface in its separate node // QMap<qint32, Surface>::const_iterator it = m_SurfaceSet.data().constBegin(); for (it = m_SurfaceSet.data().begin(); it != m_SurfaceSet.data().end(); ++it) { builder.pushNode(); { Matrix3Xf rr = it.value().rr().transpose(); //Centralize for(qint32 i = 0; i < 3; ++i) rr.row(i) = rr.row(i).array() - m_vecBoundingBoxCenter[i]; QGeometryData t_GeometryDataTri; MatrixXf t_TriCoords = MatrixXf::Zero(3,3*(it.value().tris().rows())); for(qint32 i = 0; i < it.value().tris().rows(); ++i) for(qint32 j = 0; j < 3; ++j) t_TriCoords.col(i*3+j) = rr.col( it.value().tris()(i,j) ); t_TriCoords *= fac; t_GeometryDataTri.appendVertexArray(QArray<QVector3D>::fromRawData( reinterpret_cast<const QVector3D*>(t_TriCoords.data()), t_TriCoords.cols() )); // // Add triangles to current node // builder.addTriangles(t_GeometryDataTri); // // Colorize Surface // QGLMaterial *t_pMaterialROI = new QGLMaterial(); t_pMaterialROI->setColor(QColor(100,100,100,230)); index = palette->addMaterial(t_pMaterialROI); builder.currentNode()->setMaterialIndex(index); } // Go one level up builder.popNode(); } m_bRenderPerVertex = false; // Optimze current scene for display and calculate lightning normals m_pSceneNode = builder.finalizedSceneNode(); m_pSceneNode->setParent(this); }
void ClustStcView::initializeGL(QGLPainter *painter) { if(!m_pModel) return; // in the constructor construct a builder on the stack QGLBuilder builder; float fac = 100.0f; // too small vertices distances cause clipping errors --> 100 is a good value for freesurfer brain measures builder << QGL::Faceted; if(m_pSceneNodeBrain) delete m_pSceneNodeBrain; m_pSceneNodeBrain = builder.currentNode(); builder.pushNode(); // Collor palette qint32 index; QSharedPointer<QGLMaterialCollection> palette = builder.sceneNode()->palette(); // register color palette within the root node m_qMapLabelIdIndex.clear(); // // // // Build each hemisphere in its separate node // // // for(qint32 h = 0; h < 1; ++h) // { builder.newNode();//create new hemisphere node { // // Create each ROI in its own node // for(qint32 k = 0; k < m_pModel->rowCount(); ++k) { // add new ROI node when current ROI node is not empty if(builder.currentNode()->count() > 0) builder.newNode(); QGeometryData t_GeometryDataTri; Matrix3Xf t_TriCoords = m_pModel->data(k,6,Qt::DisplayRole).value<Matrix3Xf>(); t_TriCoords *= fac; t_GeometryDataTri.appendVertexArray(QArray<QVector3D>::fromRawData( reinterpret_cast<const QVector3D*>(t_TriCoords.data()), t_TriCoords.cols() )); // // If triangles are available. // if (t_GeometryDataTri.count() > 0) { // // Add triangles to current node // builder.addTriangles(t_GeometryDataTri); // // Colorize ROI // QGLMaterial *t_pMaterialROI = new QGLMaterial(); if(m_bShowRegions) t_pMaterialROI->setColor(m_pModel->data(k,5,Qt::DisplayRole).value<QColor>()); else t_pMaterialROI->setColor(QColor(100,100,100,230)); index = palette->addMaterial(t_pMaterialROI); builder.currentNode()->setMaterialIndex(index); m_qMapLabelIdIndex.insert(m_pModel->data(k,4,Qt::DisplayRole).value<Label>().label_id, index); } } } // Go one level up builder.popNode(); // } // // Go one level up // builder.popNode(); // Optimze current scene for display and calculate lightning normals if(m_pSceneNode) delete m_pSceneNode; m_pSceneNode = builder.finalizedSceneNode(); m_pSceneNode->setParent(this); // // Create light models // if(m_pLightModel) delete m_pLightModel; m_pLightModel = new QGLLightModel(this); m_pLightModel->setAmbientSceneColor(Qt::white); m_pLightModel->setViewerPosition(QGLLightModel::LocalViewer); m_pLightModel = new QGLLightModel(this); if(m_pLightParametersScene) delete m_pLightParametersScene; m_pLightParametersScene = new QGLLightParameters(this); m_pLightParametersScene->setPosition(QVector3D(0.0f, 0.0f, 3.0f)); painter->setMainLight(m_pLightParametersScene); // // Set stereo type // if (m_bStereo) { this->setStereoType(m_stereoType); // camera()->setEyeSeparation(0.4f); // m_pCameraFrontal->setEyeSeparation(0.1f); //LNdT DEMO camera()->setCenter(QVector3D(0,0,m_fOffsetZ));//0.8f*fac)); camera()->setEyeSeparation(0.4f); camera()->setFieldOfView(30); camera()->setEye(QVector3D(0,0,m_fOffsetZEye)); //LNdT DEMO end } else { camera()->setCenter(QVector3D(0,0,m_fOffsetZ)); camera()->setFieldOfView(30); camera()->setEye(QVector3D(0,0,m_fOffsetZEye)); } // //set background to light grey-blue // glClearColor(0.8f, 0.8f, 1.0f, 0.0f); // //set background to light white glClearColor(1.0f, 1.0f, 1.0f, 0.0f); m_bIsInitialized = true; }