244 lines
9.4 KiB
C++
244 lines
9.4 KiB
C++
/****************************************************************************
|
|
* 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 <QGridLayout>
|
|
#include <QFileDialog>
|
|
#include <QMessageBox>
|
|
#include <QDebug>
|
|
#include <QTime>
|
|
|
|
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<MyDrawMode,QString>::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<CMeshO>::Open(mesh,(fileName.toStdString()).c_str(),qCallBack);
|
|
else
|
|
if (fi.suffix() == objext)
|
|
{
|
|
int loadmask;
|
|
err=vcg::tri::io::ImporterOBJ<CMeshO>::Open(mesh,(fileName.toStdString()).c_str(),loadmask,qCallBack);
|
|
}
|
|
int msec = loadingtime.elapsed();
|
|
if(err!=0)
|
|
{
|
|
const char* errmsg=vcg::tri::io::ImporterPLY<CMeshO>::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<CMeshO>::Box(mesh);
|
|
// update Normals
|
|
vcg::tri::UpdateNormal<CMeshO>::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<MyDrawMode,QPair<vcg::GLMeshAttributesInfo::PRIMITIVE_MODALITY_MASK, vcg::GLMeshAttributesInfo::RendAtts> >::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<GLArea*>(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<MyDrawMode,QPair<vcg::GLMeshAttributesInfo::PRIMITIVE_MODALITY_MASK, vcg::GLMeshAttributesInfo::RendAtts> >::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);
|
|
}
|