From e65b7b8704be0b1edee93183791368dc50d40dc6 Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Tue, 27 Mar 2007 12:20:18 +0000 Subject: [PATCH] Revamped logging iterface, changed function names in automatic parameters, better selection handling --- docs/ToDo.txt | 33 ++++++-- src/meshlab/GLLogStream.cpp | 13 +++- src/meshlab/GLLogStream.h | 11 ++- src/meshlab/LogStream.h | 8 +- src/meshlab/filterparameter.h | 38 +++------- src/meshlab/glarea.cpp | 7 +- src/meshlab/interfaces.h | 19 ++++- src/meshlab/main.cpp | 14 +++- src/meshlab/mainwindow.h | 33 +++++++- src/meshlab/mainwindow_Init.cpp | 8 +- src/meshlab/mainwindow_RunTime.cpp | 37 +++++---- src/meshlab/meshlab.pro | 5 +- src/meshlabplugins/meshfilter/meshfilter.cpp | 75 +++++++++++-------- src/meshlabplugins/meshfilter/quadricsimp.cpp | 10 ++- 14 files changed, 210 insertions(+), 101 deletions(-) diff --git a/docs/ToDo.txt b/docs/ToDo.txt index a20217999..d68403135 100644 --- a/docs/ToDo.txt +++ b/docs/ToDo.txt @@ -1,11 +1,30 @@ +25/3/2007 +x check selezione automatico, init numero selected in quadric. + + +23/3/2007 +o bug dialogo troppo piccolo per quando ci sono troppi parametri +o meccanismo piu' furbo per memorizzare i param da una volta alla successiva +x meno polimofrismo nelle fun di passaggio di parametri +x icona processing +x bug open su command line su mac. FATTO +o merge gllogstream e logstream + +15/3/2007 +x corrected bug simplification mac +x More parameter in pasodoble +x Added first step for layer management +x Changed log stream + + 1/2/2007 o bounding box non viene aggiornato dopo varie operazioni.. x Added Select border face x added more parameters to hole filling dialog 19/01/2007 -o Numero vertici facce selezionate deve essere mostrato -o refine distrugge la selezione +x Numero vertici facce selezionate deve essere mostrato +x refine se distrugge la selezione o refine e colore dda controllare. o mesh senza facce pianta?? o unify vertex deve smarcare i border e obbligarli a rifare?? @@ -141,7 +160,7 @@ x progress bar load obj do not work // DONE 6/7 x bug normali subdiv. non vengono ricalcolate // DONE 18/6 o bug border. non viene MAI ricalcolato x open/save recorded nella history // DONE 18/6 -o cursor icon selection +x cursor icon selection Done v100 15/6/06 o merge to a single surface @@ -168,7 +187,7 @@ o install cleaning. 25/5/06 x clustering nel filtro in input epoch // DONE 6/6 -o install doc e attempt. // DONE 26/5 +x install doc e attempt. // DONE 26/5 o Last Dir x selections plus/minus x Esc Pianta // DONE 26/5 @@ -178,7 +197,7 @@ x save 3ds pianta // DONE 18/6 o Uniformare i nomi degli slot nel main window o Measuring Tool -o risistemare Recent file stuff...(bug in apertura cambio dir?) +x risistemare Recent file stuff...(bug in apertura cambio dir?) o snapshot con fbo invece che con il rendering nel backbuffer. o Ambient Occlusion x Clustering dialog diag percentage <1 non va // DONE 7/6 @@ -212,6 +231,6 @@ o Ripulire glarea - Log - Paint X ScriptDialog // DONE 15/6 -o Generic dialog option +x Generic dialog option DONE 1.000 o Clustering con bound e selezione. -o Dialogo shaders che galleggia un po' troppo +x Dialogo shaders che galleggia un po' troppo diff --git a/src/meshlab/GLLogStream.cpp b/src/meshlab/GLLogStream.cpp index d58dfb2d8..6e6019b3a 100644 --- a/src/meshlab/GLLogStream.cpp +++ b/src/meshlab/GLLogStream.cpp @@ -23,6 +23,9 @@ /**************************************************************************** History $Log$ +Revision 1.14 2007/03/27 12:20:15 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.13 2007/03/03 02:03:25 cignoni Reformatted lower bar, added number of selected faces. Updated about dialog @@ -49,7 +52,9 @@ Fixed starting position ****************************************************************************/ -#include +#include +#include + #include #include "GLLogStream.h" @@ -64,7 +69,8 @@ void GLLogStream::print(QStringList &l) l << (*li).second.c_str(); } -void GLLogStream::Log(int Level, const char * f, ... ) + +void GLLogStream::Logf(int Level, const char * f, ... ) { char buf[4096]; va_list marker; @@ -72,8 +78,7 @@ void GLLogStream::Log(int Level, const char * f, ... ) vsprintf(buf,f,marker); va_end( marker ); - - S.push_back(make_pair(Level,buf)); + Log(Level,buf); } void GLLogStream::Save(int Level, const char * filename ) diff --git a/src/meshlab/GLLogStream.h b/src/meshlab/GLLogStream.h index f6c6871cd..eea847adf 100644 --- a/src/meshlab/GLLogStream.h +++ b/src/meshlab/GLLogStream.h @@ -24,6 +24,9 @@ /**************************************************************************** History $Log$ +Revision 1.6 2007/03/27 12:20:09 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.5 2006/05/25 09:46:37 cignoni missing std and and all the other gcc detected syntax errors @@ -75,8 +78,12 @@ public: void glDraw(QGLWidget *qgl, int Level, int nlines,float vSpacing,QFont font); void Save(int Level, const char *filename); void Clear() {S.clear();} - void Log(int Level, const char * f, ... ); - + void Logf(int Level, const char * f, ... ); + void Log(int Level, const char * buf ) + { + S.push_back(std::make_pair(Level,buf)); + } + private: std::list > S; }; diff --git a/src/meshlab/LogStream.h b/src/meshlab/LogStream.h index ad578b3d1..660562bf9 100644 --- a/src/meshlab/LogStream.h +++ b/src/meshlab/LogStream.h @@ -23,6 +23,9 @@ /**************************************************************************** History $Log$ +Revision 1.7 2007/03/27 12:20:14 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.6 2007/02/28 00:02:11 cignoni Added missing virtual destructors @@ -45,15 +48,14 @@ Initial Draft release; still to be adapted to our needs. #ifndef LOGSTREAM_H #define LOGSTREAM_H -#include #include - +class QGLWidget; class LogStream { public: typedef enum {Error=0, Warning=1, Info=2, Debug=3, Direct=4, OnlyFileLog=5, OnlyConsole=6} Level ; - virtual void Log(int Level, const char * f, ... ) = 0; + virtual void Logf(int Level, const char * f, ... ) = 0; virtual void glDraw(QGLWidget *qgl, int Level, int nlines,float vSpacing,QFont font) = 0; virtual ~LogStream(){} }; diff --git a/src/meshlab/filterparameter.h b/src/meshlab/filterparameter.h index b5b90daaf..95dd4833b 100644 --- a/src/meshlab/filterparameter.h +++ b/src/meshlab/filterparameter.h @@ -23,6 +23,9 @@ /**************************************************************************** History $Log$ +Revision 1.7 2007/03/27 12:20:13 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.6 2007/02/09 09:09:39 pirosu Added ToolTip support for standard parameters @@ -164,28 +167,7 @@ public: this->clear(); } - void addField(char *name, char* desc, bool val) - { - addField(name,desc,val,(char *)NULL); - } - void addField(char *name, char* desc, float val) - { - addField(name,desc,val,(char *)NULL); - } - void addField(char *name, char* desc, float val, float minv, float maxv) - { - addField(name,desc,val,minv,maxv,(char *)NULL); - } - void addField(char *name, char* desc, int val) - { - addField(name,desc,val,(char *)NULL); - } - void addField(char *name, char* desc, char *val) - { - addField(name,desc,val,(char *)NULL); - } - - void addField(char *name, char* desc, bool val,char *ttex) + void addFieldBool(char *name, char* desc, bool val,char *ttex=0) { MESHLAB_STDFIELD std; @@ -197,7 +179,8 @@ public: v.push_back(std); } - void addField(char *name, char* desc, float val,char *ttex) + + void addFieldFloat(char *name, char* desc, float val,char *ttex=0) { MESHLAB_STDFIELD std; @@ -209,7 +192,8 @@ public: v.push_back(std); } - void addField(char *name, char* desc, float val, float minv, float maxv,char *ttex) + + void addFieldAbsPerc(char *name, char* desc, float val, float minv, float maxv,char *ttex=0) { MESHLAB_STDFIELD std; @@ -223,7 +207,8 @@ public: v.push_back(std); } - void addField(char *name, char* desc, int val,char *ttex) + + void addFieldInt(char *name, char* desc, int val,char *ttex=0) { MESHLAB_STDFIELD std; @@ -235,7 +220,8 @@ public: v.push_back(std); } - void addField(char *name, char* desc, char *val,char *ttex) + + void addFieldString(char *name, char* desc, char *val,char *ttex=0) { MESHLAB_STDFIELD std; diff --git a/src/meshlab/glarea.cpp b/src/meshlab/glarea.cpp index bfdca409e..e1d72c359 100644 --- a/src/meshlab/glarea.cpp +++ b/src/meshlab/glarea.cpp @@ -24,6 +24,9 @@ History $Log$ +Revision 1.120 2007/03/27 12:20:17 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.119 2007/03/26 08:24:10 zifnab1974 When a user minimizes the window using a shortcut that uses modifiers (alt, ctrl, shift), the state of the button remained "pressed" after the window was reraised. Added a hideevent which resets the button state. @@ -238,11 +241,11 @@ void GLArea::pasteTile() ss.counter++; if (ss.counter>999) ss.counter=0; - log.Log(GLLogStream::Info,"Snapshot saved to %s",outfile.toLocal8Bit().constData()); + log.Logf(GLLogStream::Info,"Snapshot saved to %s",outfile.toLocal8Bit().constData()); } else { - log.Log(GLLogStream::Error,"Error saving %s",outfile.toLocal8Bit().constData()); + log.Logf(GLLogStream::Error,"Error saving %s",outfile.toLocal8Bit().constData()); } takeSnapTile=false; diff --git a/src/meshlab/interfaces.h b/src/meshlab/interfaces.h index 57bf3d596..3275c4727 100644 --- a/src/meshlab/interfaces.h +++ b/src/meshlab/interfaces.h @@ -23,6 +23,9 @@ /**************************************************************************** History $Log$ +Revision 1.55 2007/03/27 12:20:16 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.54 2007/02/28 00:02:12 cignoni Added missing virtual destructors @@ -64,6 +67,7 @@ added Filter History Dialogs #include #include #include "filterparameter.h" +#include "GLLogStream.h" @@ -75,7 +79,6 @@ class QMouseEvent; class MeshModel; class RenderMode; class GLArea; -class GLLogStream; class PluginInfo { @@ -177,6 +180,20 @@ public: protected: QList actionList; QList typeList; + void Log(int Level, const char * f, ... ) + { + if(log) + { + char buf[4096]; + va_list marker; + va_start( marker, f ); + vsprintf(buf,f,marker); + va_end( marker ); + log->Log(Level,buf); + } + } + +private: GLLogStream *log; }; diff --git a/src/meshlab/main.cpp b/src/meshlab/main.cpp index 2a00928a8..4d9bee1ac 100644 --- a/src/meshlab/main.cpp +++ b/src/meshlab/main.cpp @@ -23,6 +23,9 @@ /**************************************************************************** History $Log$ +Revision 1.6 2007/03/27 12:20:09 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.5 2006/11/08 01:04:48 cignoni First version with http communications @@ -38,6 +41,7 @@ Added copyright info ****************************************************************************/ #include +#include #include "mainwindow.h" int main(int argc, char *argv[]) @@ -48,9 +52,13 @@ int main(int argc, char *argv[]) MainWindow window; window.showMaximized(); + // This filter is installed to intercept the open events sent directly by the Operative System. + FileOpenEater *filterObj=new FileOpenEater(); + filterObj->mainWindow=&window; + app.installEventFilter(filterObj); + app.processEvents(); if(argc>1) window.open(argv[1]); - else window.open(); - - + else if(filterObj->noEvent) window.open(); + return app.exec(); } diff --git a/src/meshlab/mainwindow.h b/src/meshlab/mainwindow.h index e86b31df0..9b569c21e 100644 --- a/src/meshlab/mainwindow.h +++ b/src/meshlab/mainwindow.h @@ -23,6 +23,9 @@ /**************************************************************************** History $Log$ +Revision 1.82 2007/03/27 12:20:16 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.81 2007/03/05 12:23:01 cignoni v.1.0.0 string @@ -132,8 +135,6 @@ class QHttp; class MeshlabStdDialog; class MeshlabStdDialogFrame; - - class MainWindow : public QMainWindow,MainWindowInterface { Q_OBJECT @@ -151,7 +152,6 @@ public: public slots: void open(QString fileName=QString()); - private slots: @@ -340,4 +340,31 @@ private: QList TotalDecoratorsList; //////////////////////////////////////////////////// }; + +class FileOpenEater : public QObject +{ +Q_OBJECT + +public: +FileOpenEater() {noEvent=true;} +MainWindow *mainWindow; +bool noEvent; + +protected: + +bool eventFilter(QObject *obj, QEvent *event) + { + if (event->type() == QEvent::FileOpen) { + noEvent=false; + QFileOpenEvent *fileEvent = static_cast(event); + mainWindow->open(fileEvent->file()); + // QMessageBox::information(0,"Meshlab",fileEvent->file()); + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + } + }; + #endif diff --git a/src/meshlab/mainwindow_Init.cpp b/src/meshlab/mainwindow_Init.cpp index 30a73d907..83820971d 100644 --- a/src/meshlab/mainwindow_Init.cpp +++ b/src/meshlab/mainwindow_Init.cpp @@ -24,6 +24,9 @@ History $Log$ +Revision 1.74 2007/03/27 12:20:16 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.73 2007/03/20 16:22:34 cignoni Big small change in accessing mesh interface. First step toward layers @@ -123,6 +126,8 @@ Added short key lastFilter #include #include #include +#include + #include "meshmodel.h" #include "interfaces.h" @@ -170,7 +175,6 @@ MainWindow::MainWindow() //qb->reset(); } - // creates the standard plugin window void MainWindow::createStdPluginWnd() { @@ -178,7 +182,7 @@ void MainWindow::createStdPluginWnd() stddialog->setAllowedAreas ( Qt::NoDockWidgetArea ); //addDockWidget(Qt::RightDockWidgetArea,stddialog); stddialog->setFloating(true); - stddialog->move(0,120); + //stddialog->move(0,120); } diff --git a/src/meshlab/mainwindow_RunTime.cpp b/src/meshlab/mainwindow_RunTime.cpp index afa56e730..10bd0aecb 100644 --- a/src/meshlab/mainwindow_RunTime.cpp +++ b/src/meshlab/mainwindow_RunTime.cpp @@ -24,6 +24,9 @@ History $Log$ +Revision 1.125 2007/03/27 12:20:17 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.124 2007/03/26 08:25:09 zifnab1974 added eol at the end of the files @@ -287,7 +290,7 @@ void MainWindow::runFilterScript() int req=iFilter->getRequirements(action); GLA()->mm->updateDataMask(req); iFilter->applyFilter( action, *(GLA()->mm), (*ii).second, QCallBack ); - GLA()->log.Log(GLLogStream::Info,"Re-Applied filter %s",qPrintable((*ii).first)); + GLA()->log.Logf(GLLogStream::Info,"Re-Applied filter %s",qPrintable((*ii).first)); } } @@ -323,7 +326,9 @@ void MainWindow::executeFilter(QAction *action,FilterParameter *par) // (1) Ask for filter requirements (eg a filter can need topology, border flags etc) // and statisfy them int req=iFilter->getRequirements(action); - GLA()->mm->updateDataMask(req); + qApp->setOverrideCursor(QCursor(Qt::WaitCursor)); + GLA()->mm->updateDataMask(req); + qApp->restoreOverrideCursor(); // (2) Ask for filter parameters (e.g. user defined threshold that could require a widget) @@ -340,15 +345,18 @@ void MainWindow::executeFilter(QAction *action,FilterParameter *par) qb->show(); iFilter->setLog(&(GLA()->log)); // (4) Apply the Filter - GLA()->mm->busy=true; + + qApp->setOverrideCursor(QCursor(Qt::WaitCursor)); + GLA()->mm->busy=true; ret=iFilter->applyFilter(action, *(GLA()->mm), *par, QCallBack); GLA()->mm->busy=false; - + qApp->restoreOverrideCursor(); + // (5) Apply post filter actions (e.g. recompute non updated stuff if needed) if(ret) { - GLA()->log.Log(GLLogStream::Info,"Applied filter %s",qPrintable(action->text())); + GLA()->log.Logf(GLLogStream::Info,"Applied filter %s",qPrintable(action->text())); GLA()->setWindowModified(true); GLA()->setLastAppliedFilter(action); lastFilterAct->setText(QString("Apply filter ") + action->text()); @@ -391,7 +399,7 @@ void MainWindow::endEditMode() MeshEditInterface *iEdit = qobject_cast(action->parent()); GLA()->setEdit(iEdit,action); iEdit->StartEdit(action,*(GLA()->mm),GLA()); - GLA()->log.Log(GLLogStream::Info,"Started Mode %s",qPrintable (action->text())); + GLA()->log.Logf(GLLogStream::Info,"Started Mode %s",qPrintable (action->text())); GLA()->setSelectionRendering(true); } updateMenus(); @@ -412,7 +420,7 @@ void MainWindow::applyEditMode() GLA()->setLastAppliedEdit(action); iEdit->StartEdit(action,*(GLA()->mm),GLA()); - GLA()->log.Log(GLLogStream::Info,"Started Mode %s",qPrintable (action->text())); + GLA()->log.Logf(GLLogStream::Info,"Started Mode %s",qPrintable (action->text())); GLA()->setSelectionRendering(true); updateMenus(); } @@ -427,18 +435,18 @@ void MainWindow::applyRenderMode() if(action->text() == tr("None")) { - GLA()->log.Log(GLLogStream::Info,"No Shader"); + GLA()->log.Logf(GLLogStream::Info,"No Shader"); GLA()->setRenderer(0,0); //vertex and fragment programs not supported } else { if(iRenderTemp->isSupported()) { GLA()->setRenderer(iRenderTemp,action); - GLA()->log.Log(GLLogStream::Info,"%s",qPrintable(action->text())); // Prints out action name + GLA()->log.Logf(GLLogStream::Info,"%s",qPrintable(action->text())); // Prints out action name } else { GLA()->setRenderer(0,0); //vertex and fragment programs not supported - GLA()->log.Log(GLLogStream::Warning,"Shader not supported!"); + GLA()->log.Logf(GLLogStream::Warning,"Shader not supported!"); } } } @@ -450,7 +458,7 @@ void MainWindow::applyColorMode() MeshFilterInterface *iColorTemp = qobject_cast(action->parent()); iColorTemp->setLog(&(GLA()->log)); //iColorTemp->Compute(action,*(GLA()->mm ),GLA()->getCurrentRenderMode(), GLA()); - GLA()->log.Log(GLLogStream::Info,"Applied colorize %s",action->text().toLocal8Bit().constData()); + GLA()->log.Logf(GLLogStream::Info,"Applied colorize %s",action->text().toLocal8Bit().constData()); updateMenus(); } @@ -462,20 +470,20 @@ void MainWindow::applyDecorateMode() if(GLA()->iDecoratorsList==0){ GLA()->iDecoratorsList= new list >; GLA()->iDecoratorsList->push_back(make_pair(action,iDecorateTemp)); - GLA()->log.Log(GLLogStream::Info,"Enable Decorate mode %s",action->text().toLocal8Bit().constData()); + GLA()->log.Logf(GLLogStream::Info,"Enable Decorate mode %s",action->text().toLocal8Bit().constData()); }else{ bool found=false; pair p; foreach(p,*GLA()->iDecoratorsList){ if(iDecorateTemp==p.second && p.first->text()==action->text()){ GLA()->iDecoratorsList->remove(p); - GLA()->log.Log(0,"Disabled Decorate mode %s",action->text().toLocal8Bit().constData()); + GLA()->log.Logf(0,"Disabled Decorate mode %s",action->text().toLocal8Bit().constData()); found=true; } } if(!found){ GLA()->iDecoratorsList->push_back(make_pair(action,iDecorateTemp)); - GLA()->log.Log(GLLogStream::Info,"Enable Decorate mode %s",action->text().toLocal8Bit().constData()); + GLA()->log.Logf(GLLogStream::Info,"Enable Decorate mode %s",action->text().toLocal8Bit().constData()); } } } @@ -489,6 +497,7 @@ bool MainWindow::QCallBack(const int pos, const char * str) qb->setValue(pos); // qb->update(); MainWindow::globalStatusBar()->update(); + qApp->processEvents(); //qb->repaint(); //if(qb==0) return true; //qb->setWindowTitle (str); diff --git a/src/meshlab/meshlab.pro b/src/meshlab/meshlab.pro index e75e57439..b15a3428a 100644 --- a/src/meshlab/meshlab.pro +++ b/src/meshlab/meshlab.pro @@ -68,7 +68,6 @@ DEFINES += GLEW_STATIC INCLUDEPATH += . ../../../sf ../../../code/lib/glew/include CONFIG += stl -#win32:LIBS += ../../../code/lib/glew/lib/glew32.lib win32-g++{ #LIBS += glew32 #LIBPATH += ../../../code/lib/glew/lib/ @@ -80,4 +79,8 @@ CONFIG(debug, debug|release) { win32-g++:release:DEFINES -= NDEBUG } +macx{ +message( "We are on a mac: build universal binaries" ) +#CONFIG += ppc +} diff --git a/src/meshlabplugins/meshfilter/meshfilter.cpp b/src/meshlabplugins/meshfilter/meshfilter.cpp index b483f26d9..903ff2499 100644 --- a/src/meshlabplugins/meshfilter/meshfilter.cpp +++ b/src/meshlabplugins/meshfilter/meshfilter.cpp @@ -22,6 +22,9 @@ /**************************************************************************** History $Log$ +Revision 1.93 2007/03/27 12:20:18 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.92 2007/03/20 16:23:10 cignoni Big small change in accessing mesh interface. First step toward layers @@ -321,7 +324,7 @@ const QString ExtraMeshFilterPlugin::Info(QAction *action) case FP_REMOVE_FACES_BY_EDGE : return tr("Remove from the mesh all triangles whose have an edge with lenght greater or equal than a threshold"); case FP_LAPLACIAN_SMOOTH : return tr("Laplacian smooth of the mesh: for each vertex it calculates the average position with nearest vertex"); case FP_HC_LAPLACIAN_SMOOTH : return tr("HC Laplacian Smoothing, extended version of Laplacian Smoothing, based on the paper of Vollmer, Mencl, and Müller"); - case FP_TWO_STEP_SMOOTH : return tr("Two Step Smoothing, Normal Smoothing and vertex fitting smoothing, based on the paper of ..."); + case FP_TWO_STEP_SMOOTH : return tr("Two Step Smoothing, a feature preserving/enhancing fairing filter. It is based on a Normal Smoothing and vertex fitting smoothing, based on the paper of ..."); case FP_CLUSTERING : return tr("Collapse vertices by creating a three dimensional grid enveloping the mesh and discretizes them based on the cells of this grid"); case FP_QUADRIC_SIMPLIFICATION: return tr("Simplify a mesh using a Quadric based Edge Collapse Strategy, better than clustering but slower"); case FP_QUADRIC_TEXCOORD_SIMPLIFICATION:return tr("Simplify a textured mesh using a Quadric based Edge Collapse Strategy, better than clustering but slower"); @@ -384,23 +387,23 @@ bool ExtraMeshFilterPlugin::getStdFields(QAction *action, MeshModel &m, StdParLi switch(ID(action)) { case FP_QUADRIC_SIMPLIFICATION: - parlst.addField("TargetFaceNum","Target number of faces",(int)(m.cm().fn/2)); - parlst.addField("QualityThr","Quality threshold",lastq_QualityThr,"Quality threshold for penalizing bad shaped faces.\nThe value is in the range [0..1]\n 0 accept any kind of face (no penalties),\n 0.5 penalize faces with quality < 0.5, proportionally to their shape\n"); - parlst.addField("PreserveBoundary","Preserve Boundary of the mesh",lastq_PreserveBoundary,"The simplification process tries not to destroy mesh boundaries"); - parlst.addField("PreserveNormal","Preserve Normal",lastq_PreserveNormal,"Try to avoid face flipping effects and try to preserve the original orientation of the surface"); - parlst.addField("OptimalPlacement","Optimal position of simplified vertices",lastq_OptimalPlacement,"Each collapsed vertex is placed in the position minimizing the quadric error.\n It can fail (creating bad spikes) in case of very flat areas. \nIf disabled edges are collapsed onto one of the two original vertices. "); - parlst.addField("Selected","Simplify only selected faces",lastq_Selected,"The simplification is applied only to the selected set of faces.\n Take care of the target number of faces!"); + parlst.addFieldInt ("TargetFaceNum","Target number of faces", (m.cm().sfn>0) ? m.cm().sfn/2 : m.cm().fn/2); + parlst.addFieldFloat("QualityThr","Quality threshold",lastq_QualityThr,"Quality threshold for penalizing bad shaped faces.\nThe value is in the range [0..1]\n 0 accept any kind of face (no penalties),\n 0.5 penalize faces with quality < 0.5, proportionally to their shape\n"); + parlst.addFieldBool ("PreserveBoundary","Preserve Boundary of the mesh",lastq_PreserveBoundary,"The simplification process tries not to destroy mesh boundaries"); + parlst.addFieldBool ("PreserveNormal","Preserve Normal",lastq_PreserveNormal,"Try to avoid face flipping effects and try to preserve the original orientation of the surface"); + parlst.addFieldBool ("OptimalPlacement","Optimal position of simplified vertices",lastq_OptimalPlacement,"Each collapsed vertex is placed in the position minimizing the quadric error.\n It can fail (creating bad spikes) in case of very flat areas. \nIf disabled edges are collapsed onto one of the two original vertices. "); + parlst.addFieldBool ("Selected","Simplify only selected faces",m.cm().sfn>0,"The simplification is applied only to the selected set of faces.\n Take care of the target number of faces!"); break; case FP_QUADRIC_TEXCOORD_SIMPLIFICATION: - parlst.addField("TargetFaceNum","Target number of faces",(int)(m.cm().fn/2)); - parlst.addField("QualityThr","Quality threshold",lastqtex_QualityThr,"Quality threshold for penalizing bad shaped faces"); - parlst.addField("Extratcoordw","Texture discontinuity extra weight",lastqtex_extratw,"Additional weight for each extra Texture Coordinates for every (selected) vertex"); + parlst.addFieldInt ("TargetFaceNum","Target number of faces",(int)(m.cm().fn/2)); + parlst.addFieldFloat("QualityThr","Quality threshold",lastqtex_QualityThr,"Quality threshold for penalizing bad shaped faces"); + parlst.addFieldFloat("Extratcoordw","Texture discontinuity extra weight",lastqtex_extratw,"Additional weight for each extra Texture Coordinates for every (selected) vertex"); break; case FP_CLOSE_HOLES: - parlst.addField("MaxHoleSize","Max size to be closed ",(int)30,"The size is expressed as number of edges composing the hole boundary"); - parlst.addField("Selected","Close holes with selected faces",false); - parlst.addField("NewFaceSelected","Select the newly created faces",true); - parlst.addField("SelfIntersection","Prevent creation of selfIntersecting faces",true); + parlst.addFieldInt ("MaxHoleSize","Max size to be closed ",(int)30,"The size is expressed as number of edges composing the hole boundary"); + parlst.addFieldBool("Selected","Close holes with selected faces",m.cm().sfn>0); + parlst.addFieldBool("NewFaceSelected","Select the newly created faces",true); + parlst.addFieldBool("SelfIntersection","Prevent creation of selfIntersecting faces",true); break; case FP_LOOP_SS: case FP_BUTTERFLY_SS: @@ -408,9 +411,16 @@ bool ExtraMeshFilterPlugin::getStdFields(QAction *action, MeshModel &m, StdParLi case FP_REMOVE_FACES_BY_EDGE: case FP_CLUSTERING: maxVal = m.cm().bbox.Diag(); - parlst.addField("Threshold","Threshold",maxVal*0.01,0,maxVal); - parlst.addField("Selected","Affect only selected faces",false); + parlst.addFieldAbsPerc("Threshold","Threshold",maxVal*0.01,0,maxVal); + parlst.addFieldBool ("Selected","Affect only selected faces",m.cm().sfn>0); break; + case FP_TWO_STEP_SMOOTH: + parlst.addFieldInt ("stepSmoothNum","Smoothing steps", (int) 3, ""); + parlst.addFieldFloat("normalThr","Feature Angle Threshold (deg)", (float) 60, "Specify a threshold angle for features that you want to be preserved.\nFeatures forming angles LARGER than the specified threshold will be preserved."); + parlst.addFieldInt ("stepNormalNum","Normal Smoothing steps", (int) 20, ""); + parlst.addFieldBool ("Selected","Affect only selected faces",m.cm().sfn>0); + break; + default: return false; } @@ -429,6 +439,7 @@ bool ExtraMeshFilterPlugin::getStdParameters(QAction *action, QWidget *parent, M case FP_MIDPOINT : case FP_REMOVE_FACES_BY_EDGE: case FP_CLUSTERING: + case FP_TWO_STEP_SMOOTH: return true; } @@ -457,7 +468,6 @@ bool ExtraMeshFilterPlugin::getParameters(QAction *action, QWidget *parent, Mesh case FP_INVERT_FACES: case FP_HC_LAPLACIAN_SMOOTH: case FP_LAPLACIAN_SMOOTH: - case FP_TWO_STEP_SMOOTH: case FP_REMOVE_NON_MANIFOLD: case FP_NORMAL_EXTRAPOLATION: return true; // no parameters @@ -504,21 +514,20 @@ bool ExtraMeshFilterPlugin::applyFilter(QAction *filter, MeshModel &m, FilterPar if(filter->text() == ST(FP_REMOVE_FACES_BY_AREA) ) { int nullFaces=tri::Clean::RemoveFaceOutOfRangeArea(m.cm(),0); - if (log) log->Log(GLLogStream::Info, "Removed %d null faces", nullFaces); + Log(GLLogStream::Info, "Removed %d null faces", nullFaces); m.clearDataMask(MeshModel::MM_FACETOPO | MeshModel::MM_BORDERFLAG); } if(filter->text() == ST(FP_REMOVE_UNREFERENCED_VERTEX) ) { int delvert=tri::Clean::RemoveUnreferencedVertex(m.cm()); - if (log) log->Log(GLLogStream::Info, "Removed %d unreferenced vertices",delvert); + Log(GLLogStream::Info, "Removed %d unreferenced vertices",delvert); } if(filter->text() == ST(FP_REMOVE_DUPLICATED_VERTEX) ) { int delvert=tri::Clean::RemoveDuplicateVertex(m.cm()); - if (log) - log->Log(GLLogStream::Info, "Removed %d duplicated vertices", delvert); + Log(GLLogStream::Info, "Removed %d duplicated vertices", delvert); if (delvert != 0) vcg::tri::UpdateNormals::PerVertexNormalizedPerFace(m.cm()); } @@ -526,9 +535,9 @@ bool ExtraMeshFilterPlugin::applyFilter(QAction *filter, MeshModel &m, FilterPar if(filter->text() == ST(FP_REMOVE_NON_MANIFOLD) ) { int nonManif=tri::Clean::RemoveNonManifoldFace(m.cm()); - if (log) - if(nonManif) log->Log(GLLogStream::Info, "Removed %d Non Manifold Faces", nonManif); - else log->Log(GLLogStream::Info, "Mesh is two-manifold. Nothing done.", nonManif); + + if(nonManif) Log(GLLogStream::Info, "Removed %d Non Manifold Faces", nonManif); + else Log(GLLogStream::Info, "Mesh is two-manifold. Nothing done.", nonManif); } if(filter->text() == ST(FP_REORIENT) ) @@ -541,9 +550,11 @@ bool ExtraMeshFilterPlugin::applyFilter(QAction *filter, MeshModel &m, FilterPar if(filter->text() == ST(FP_LAPLACIAN_SMOOTH)) { + tri::UpdateSelection::ClearVertex(m.cm()); size_t cnt=tri::UpdateSelection::VertexFromFaceStrict(m.cm()); if(cnt>0) LaplacianSmooth(m.cm(),1,true); else LaplacianSmooth(m.cm(),1,false); + Log(GLLogStream::Info, "Smoothed %d vertices", cnt>0 ? cnt : m.cm().vn); tri::UpdateNormals::PerVertexNormalizedPerFace(m.cm()); } @@ -557,9 +568,14 @@ bool ExtraMeshFilterPlugin::applyFilter(QAction *filter, MeshModel &m, FilterPar if(filter->text() == ST(FP_TWO_STEP_SMOOTH)) { + //size_t cnt=tri::UpdateSelection::VertexFromFaceStrict(m.cm); + int stepSmoothNum = par.getInt("stepSmoothNum"); + float normalThr = cos(math::ToRad(par.getFloat("normalThr"))); + int stepNormalNum = par.getInt("stepNormalNum"); + //size_t cnt=tri::UpdateSelection::VertexFromFaceStrict(m.cm()); tri::UpdateNormals::PerFaceNormalized(m.cm()); - PasoDobleSmoothFast(m.cm(), 2, .1, 5); + PasoDobleSmoothFast(m.cm(), stepSmoothNum, normalThr, stepNormalNum); tri::UpdateNormals::PerVertexNormalizedPerFace(m.cm()); } @@ -585,10 +601,9 @@ bool ExtraMeshFilterPlugin::applyFilter(QAction *filter, MeshModel &m, FilterPar if (filter->text() == ST(FP_TRANSFORM) ) { Matrix44f matrix= par.getMatrix44("Transform"); - if (log) { - log->Log(GLLogStream::Info, + Log(GLLogStream::Info, transformDialog->getLog().toAscii().data()); - } + vcg::tri::UpdatePosition::Matrix(m.cm(), matrix); vcg::tri::UpdateNormals::PerVertexNormalizedPerFace(m.cm()); vcg::tri::UpdateBounding::Box(m.cm()); @@ -604,9 +619,9 @@ bool ExtraMeshFilterPlugin::applyFilter(QAction *filter, MeshModel &m, FilterPar lastq_OptimalPlacement = par.getBool("OptimalPlacement"); lastq_Selected = par.getBool("Selected"); - QuadricSimplification(m.cm(),TargetFaceNum,lastq_QualityThr, lastq_PreserveBoundary,lastq_PreserveNormal, lastq_OptimalPlacement,lastq_Selected, cb); + QuadricSimplification(m.cm(),TargetFaceNum,lastq_QualityThr, lastq_PreserveBoundary,lastq_PreserveNormal, lastq_OptimalPlacement,lastq_Selected, cb); tri::UpdateNormals::PerVertexNormalizedPerFace(m.cm()); - tri::UpdateBounding::Box(m.cm()); + tri::UpdateBounding::Box(m.cm()); } diff --git a/src/meshlabplugins/meshfilter/quadricsimp.cpp b/src/meshlabplugins/meshfilter/quadricsimp.cpp index 21890750c..f5bc7414a 100644 --- a/src/meshlabplugins/meshfilter/quadricsimp.cpp +++ b/src/meshlabplugins/meshfilter/quadricsimp.cpp @@ -22,6 +22,9 @@ /**************************************************************************** History $Log$ +Revision 1.8 2007/03/27 12:20:18 cignoni +Revamped logging iterface, changed function names in automatic parameters, better selection handling + Revision 1.7 2007/03/20 16:23:10 cignoni Big small change in accessing mesh interface. First step toward layers @@ -101,8 +104,8 @@ void QuadricSimplification(CMeshO &m,int TargetFaceNum, float QualityThr, TD.Start(QZero); MyTriEdgeCollapse::SetDefaultParams(); - MyTriEdgeCollapse::SetHint(MyTriEdgeCollapse::HNHasVFTopology); - MyTriEdgeCollapse::SetHint(MyTriEdgeCollapse::HNHasBorderFlag); + //MyTriEdgeCollapse::SetHint(MyTriEdgeCollapse::HNHasVFTopology); + //MyTriEdgeCollapse::SetHint(MyTriEdgeCollapse::HNHasBorderFlag); MyTriEdgeCollapse::Params().QualityThr=QualityThr; @@ -124,7 +127,8 @@ void QuadricSimplification(CMeshO &m,int TargetFaceNum, float QualityThr, if(PreserveBoundary && !Selected) MyTriEdgeCollapse::Params().FastPreserveBoundary=true; - MyTriEdgeCollapse::Params().OptimalPlacement=OptimalPlacement; + // MyTriEdgeCollapse::Params().OptimalPlacement=OptimalPlacement; + MyTriEdgeCollapse::Params().OptimalPlacement=true; if(PreserveNormal) { MyTriEdgeCollapse::Params().NormalCheck= true;