/**************************************************************************** * VCGLib o o * * Visual and Computer Graphics Library o o * * _ O _ * * Copyright(C) 2007 \/)\/ * * Visual Computing Lab /\/| * * ISTI - Italian National Research Council | * * \ * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * * for more details. * * * ****************************************************************************/ /**************************************************************************** History $Log: not supported by cvs2svn $ ****************************************************************************/ #include "mainwindow.h" #include "glarea.h" #include #include #include #include #include QProgressBar *MainWindow::qb; QStatusBar* MainWindow::sb; MainWindow::MainWindow (QWidget * parent) :QMainWindow (parent),mi(2000000000),mesh() { ui.setupUi (this); initTable(); QGridLayout* grid = new QGridLayout(); //parent is set to NULL in order to avoid QT bug on MAC (business as usual...). //The QGLWidget are destroyed by hand in the MainWindow destructor... shared = new SharedDataOpenGLContext(mesh,mi,NULL); shared->setHidden(true); shared->myInitGL(); for(unsigned int ii = 0;ii < 2;++ii) { rendbox[ii] = new QComboBox(this); for(QMap::iterator it = stringrendtable.begin();it != stringrendtable.end();++it) rendbox[ii]->addItem(it.value()); rendbox[ii]->setCurrentIndex((int) MDM_SMOOTH); glar[ii] = new GLArea(shared,this); connect(rendbox[ii],SIGNAL(activated(int)),glar[ii],SIGNAL(updateRenderModalityRequested(int))); connect(glar[ii],SIGNAL(updateRenderModalityRequested(int)),this,SLOT(updateRenderModality(int))); //connect(shared,SIGNAL(dataReadyToBeRead(MyDrawMode,vcg::GLFeederInfo::ReqAtts&)),glar[ii], SLOT(updateRequested(MyDrawMode,vcg::GLFeederInfo::ReqAtts&))); grid->addWidget(rendbox[ii],0,ii,1,1,Qt::AlignRight); grid->addWidget(glar[ii],1,ii,1,1); } ui.glbox->setLayout(grid); connect(ui.actionLoad_Mesh,SIGNAL(triggered()),this,SLOT(chooseMesh())); connect (ui.actionLoad_Tetrahedron, SIGNAL (triggered()),this, SLOT (loadTetrahedron())); connect (ui.actionLoad_Dodecahedron, SIGNAL (triggered()),this, SLOT (loadDodecahedron())); sb = statusBar(); qb=new QProgressBar(this); qb->setMaximum(100); qb->setMinimum(0); qb->reset(); statusBar()->addPermanentWidget(qb,0); } // mesh chooser file dialog void MainWindow::chooseMesh() { mesh.Clear(); QString plyext("ply"); QString objext("obj"); QString extoptions = QString("Poly Model (*.") + plyext + ");;OBJ Model (*." + objext + ")"; QString fileName = QFileDialog::getOpenFileName(this, tr("Open Mesh"), QDir::currentPath(), extoptions); QFileInfo fi(fileName); QTime loadingtime; loadingtime.start(); int err=0; if (fi.suffix() == plyext) err=vcg::tri::io::ImporterPLY::Open(mesh,(fileName.toStdString()).c_str(),qCallBack); else if (fi.suffix() == objext) { int loadmask; err=vcg::tri::io::ImporterOBJ::Open(mesh,(fileName.toStdString()).c_str(),loadmask,qCallBack); } int msec = loadingtime.elapsed(); if(err!=0) { const char* errmsg=vcg::tri::io::ImporterPLY::ErrorMsg(err); QMessageBox::warning(this,tr("Error Loading Mesh"),QString(errmsg)); } QString msg = fileName + " vtx: " + QString::number(mesh.VN()) + " fcs: " + QString::number(mesh.FN()) + " loading time: " + QString::number(msec) + " msec"; initMesh(msg); } void MainWindow::loadTetrahedron() { mesh.Clear(); vcg::tri::Tetrahedron(mesh); initMesh(tr("Tethraedron [builtin]")); } void MainWindow::loadDodecahedron() { mesh.Clear(); vcg::tri::Dodecahedron(mesh); initMesh(tr("Dodecahedron [builtin]")); } void MainWindow::initMesh(QString& message) { if (shared != NULL) shared->deAllocateBO(); // update bounding box vcg::tri::UpdateBounding::Box(mesh); // update Normals vcg::tri::UpdateNormal::PerVertexNormalizedPerFaceNormalized(mesh); QTime rdsetuptime; rdsetuptime.start(); for(unsigned int ii = 0;ii < 2;++ii) if ((glar[ii] != NULL) && (rendbox[ii] != NULL)) { glar[ii]->resetTrackBall(); MyDrawMode mdm = (MyDrawMode) rendbox[ii]->currentIndex(); QMap >::iterator it = rendtable.find(mdm); if (it == rendtable.end()) return; shared->setPerViewRendAtts(glar[ii]->context(),it.value().first,it.value().second); } shared->manageBuffers(); for(unsigned int ii = 0;ii < 2;++ii) glar[ii]->updateGL(); qb->reset(); int msec = rdsetuptime.elapsed(); message += " bo creation: " + QString::number(msec) + " msec"; statusBar()->showMessage(message); } void MainWindow::updateRenderModality(int clickedindex) { GLArea* glasender = qobject_cast(sender()); if (glasender == NULL) return; updateRenderModality(glasender,clickedindex); } void MainWindow::updateRenderModality( GLArea* area,int clickedindex ) { if ((shared == NULL) || (area == NULL)) return; MyDrawMode mdm = (MyDrawMode) clickedindex; QMap >::iterator it = rendtable.find(mdm); if (it == rendtable.end()) return; shared->setPerViewRendAtts(area->context(),it.value().first,it.value().second); shared->manageBuffers(); for(unsigned int ii = 0;ii < 2;++ii) glar[ii]->updateGL(); } MainWindow::~MainWindow() { for(int ii = 0;ii < 2;++ii) delete glar[ii]; delete shared; } void MainWindow::initTable() { stringrendtable[MDM_SMOOTH] = QString("Solid Smooth"); stringrendtable[MDM_FLAT] = QString("Solid Flat"); stringrendtable[MDM_WIRE] = QString("Wire"); stringrendtable[MDM_POINTS] = QString("Points"); stringrendtable[MDM_QUAD_WIRE] = QString("Wire Quad"); stringrendtable[MDM_QUAD_SMOOTH_WIRE] = QString("Wire Solid Smooth Quad"); vcg::GLMeshAttributesInfo::PRIMITIVE_MODALITY_MASK mmask = vcg::GLMeshAttributesInfo::PR_SOLID; vcg::GLMeshAttributesInfo::RendAtts ratts; ratts[vcg::GLMeshAttributesInfo::ATT_NAMES::ATT_VERTPOSITION] = true; ratts[vcg::GLMeshAttributesInfo::ATT_NAMES::ATT_VERTNORMAL] = true; rendtable[MDM_SMOOTH] = qMakePair(mmask,ratts); ratts.reset(true); ratts[vcg::GLMeshAttributesInfo::ATT_NAMES::ATT_FACENORMAL] = true; rendtable[MDM_FLAT] = qMakePair(mmask,ratts); ratts.reset(true); mmask = vcg::GLMeshAttributesInfo::PR_WIREFRAME_TRIANGLES; rendtable[MDM_WIRE] = qMakePair(mmask,ratts); ratts.reset(true); mmask = vcg::GLMeshAttributesInfo::PR_POINTS; ratts[vcg::GLMeshAttributesInfo::ATT_NAMES::ATT_VERTNORMAL] = true; rendtable[MDM_POINTS] = qMakePair(mmask,ratts); ratts.reset(true); mmask = vcg::GLMeshAttributesInfo::PR_WIREFRAME_EDGES; rendtable[MDM_QUAD_WIRE] = qMakePair(mmask,ratts); ratts.reset(true); mmask = vcg::GLMeshAttributesInfo::PR_WIREFRAME_EDGES | vcg::GLMeshAttributesInfo::PR_SOLID; ratts[vcg::GLMeshAttributesInfo::ATT_NAMES::ATT_VERTNORMAL] = true; rendtable[MDM_QUAD_SMOOTH_WIRE] = qMakePair(mmask,ratts); } bool MainWindow::qCallBack(const int pos, const char * str) { int static lastPos=-1; if(pos==lastPos) return true; lastPos=pos; static QTime currTime = QTime::currentTime(); if(currTime.elapsed()< 100) return true; currTime.start(); sb->showMessage(str,5000); qb->show(); qb->setEnabled(true); qb->setValue(pos); sb->update(); qApp->processEvents(); return true; } SharedDataOpenGLContext::MultiViewManager* MainWindow::getMultiviewerManager() { if (shared == NULL) return NULL; return &(shared->manager); }