diff --git a/src/fgt/edit_quality/common/const_types.h b/src/fgt/edit_quality/common/const_types.h index 7bef1a4be..aaa3de73c 100644 --- a/src/fgt/edit_quality/common/const_types.h +++ b/src/fgt/edit_quality/common/const_types.h @@ -36,7 +36,7 @@ struct EQUALIZER_INFO float minQualityVal; float midQualityPercentage; float maxQualityVal; - int brightness; + float brightness; }; #endif \ No newline at end of file diff --git a/src/fgt/edit_quality/common/meshmethods.cpp b/src/fgt/edit_quality/common/meshmethods.cpp new file mode 100644 index 000000000..431f4802f --- /dev/null +++ b/src/fgt/edit_quality/common/meshmethods.cpp @@ -0,0 +1,102 @@ +#include "meshmethods.h" +#include +#include +#include +#include + + + +pair computeHistogramMinMaxY (Histogramf* histogram) +{ + int maxY = 0; + int minY = std::numeric_limits::max(); + for (int i=0; in; i++) + { + if ( histogram->H[i] > maxY ) + maxY = histogram->H[i]; + + if ( histogram->H[i] < minY ) + minY = histogram->H[i]; + } + pair minMaxY(minY,maxY); + return minMaxY; +} + +void loadEqualizerInfo(QString fileName, EQUALIZER_INFO *data) +{ + QFile inFile( fileName ); + + if ( !inFile.open(QIODevice::ReadOnly | QIODevice::Text)) + return; + + QTextStream inStream( &inFile ); + QString line; + QStringList splittedString; + + int channel_code = 0; + do + { + line = inStream.readLine(); + + //if a line is a comment, it's not processed. imply ignoring it! + if ( !line.startsWith(CSV_FILE_COMMENT) ) + channel_code ++; + } while( (!line.isNull()) && (channel_code < NUMBER_OF_CHANNELS) ); + + do + { + line = inStream.readLine(); + + //if a line is a comment, it's not processed. imply ignoring it! + if ( !line.startsWith(CSV_FILE_COMMENT) ) + { + splittedString = line.split(CSV_FILE_SEPARATOR, QString::SkipEmptyParts); + assert(splittedString.size() == 4); + + data->minQualityVal = splittedString[0].toFloat(); + data->midQualityPercentage = splittedString[1].toFloat(); + data->maxQualityVal = splittedString[2].toFloat(); + data->brightness = splittedString[3].toFloat(); + + break; + } + } while(!line.isNull()); + + inFile.close(); +} + + +void applyColorByVertexQuality(MeshModel& mesh, TransferFunction *transferFunction, float minQuality, float maxQuality, float midHandlePercentilePosition, float brightness) +{ + CMeshO::VertexIterator vi; + float percentageQuality; + Color4b currentColor; + + for(vi=mesh.cm.vert.begin(); vi!=mesh.cm.vert.end(); ++vi) + if(!(*vi).IsD()) + { + float vertexQuality = (*vi).Q(); + if (vertexQuality < minQuality) + percentageQuality = 0.0; + else + if (vertexQuality > maxQuality) + percentageQuality = 1.0; + else + percentageQuality = pow( ((*vi).Q() - minQuality) / (maxQuality - minQuality) , (float)(2.0*midHandlePercentilePosition)); + + currentColor = transferFunction->getColorByQuality(percentageQuality); + + if (brightness!=1.0f) //Applying brightness to each color channel + if (brightness<1.0f) + for (int i=0; i +#include +#include +#include + +#include + +using namespace std; +using namespace vcg; + +pair computeHistogramMinMaxY (Histogramf*); + +// Apply colors to mesh vertexes by quality +void applyColorByVertexQuality(MeshModel& mesh, TransferFunction *transferFunction, float minQuality, float maxQuality, float midHandlePercentilePosition, float brightness); + +// Opens a CSV file and gets its equalizer parameters +void loadEqualizerInfo(QString fileName, EQUALIZER_INFO *data); + + +#endif diff --git a/src/fgt/edit_quality/common/transferfunction.cpp b/src/fgt/edit_quality/common/transferfunction.cpp index 9ca0aac2e..c758a9bb8 100644 --- a/src/fgt/edit_quality/common/transferfunction.cpp +++ b/src/fgt/edit_quality/common/transferfunction.cpp @@ -432,7 +432,7 @@ QString TransferFunction::saveColorBand( QString fn, EQUALIZER_INFO& info ) outStream << endl; } - outStream << CSV_FILE_COMMENT << "THE FOLLOWING 4 VALUES REPRESENT EQUALIZER SETTINGS - the first and the third values represent respectively the minimum and the maximum quality values used in histogram, the second one represent the position (in percentage) of the middle quality, and the last one represent the level of brightness" << endl; + outStream << CSV_FILE_COMMENT << "THE FOLLOWING 4 VALUES REPRESENT EQUALIZER SETTINGS - the first and the third values represent respectively the minimum and the maximum quality values used in histogram, the second one represent the position (in percentage) of the middle quality, and the last one represent the level of brightness as a floating point number (0 copletely dark, 1 original brightness, 2 completely white)" << endl; outStream << info.minQualityVal << CSV_FILE_SEPARATOR << info.midQualityPercentage << CSV_FILE_SEPARATOR << info.maxQualityVal << CSV_FILE_SEPARATOR << info.brightness << CSV_FILE_SEPARATOR << endl; outFile.close(); diff --git a/src/fgt/edit_quality/edit_quality.pro b/src/fgt/edit_quality/edit_quality.pro index f92668f41..7bcb2f471 100644 --- a/src/fgt/edit_quality/edit_quality.pro +++ b/src/fgt/edit_quality/edit_quality.pro @@ -2,19 +2,22 @@ TEMPLATE = lib CONFIG += plugin CONFIG += stl INCLUDEPATH += ../.. ../../../../sf ../../../../code/lib/glew/include -HEADERS = const_types.h \ +HEADERS = common/const_types.h \ qualitymapper.h \ qualitymapperdialog.h \ - transferfunction.h \ - util.h \ + common/transferfunction.h \ + common/util.h \ + common/meshmethods.h\ handle.h \ eqhandle.h \ tfhandle.h SOURCES = qualitymapper.cpp\ - transferfunction.cpp\ qualitymapperdialog.cpp\ - util.cpp handle.cpp\ + common/transferfunction.cpp\ + common/util.cpp \ + common/meshmethods.cpp\ + handle.cpp\ eqhandle.cpp \ tfhandle.cpp diff --git a/src/fgt/edit_quality/eqhandle.h b/src/fgt/edit_quality/eqhandle.h index f651525c6..670b6fcf6 100644 --- a/src/fgt/edit_quality/eqhandle.h +++ b/src/fgt/edit_quality/eqhandle.h @@ -1,10 +1,7 @@ #ifndef _EQHANDLE_H_ #define _EQHANDLE_H_ -//#include -//#include #include "handle.h" -//#include "util.h" enum EQUALIZER_HANDLE_TYPE { diff --git a/src/fgt/edit_quality/filter_quality/filter_quality.pro b/src/fgt/edit_quality/filter_quality/filter_quality.pro index ec1d97eb5..606296d1b 100644 --- a/src/fgt/edit_quality/filter_quality/filter_quality.pro +++ b/src/fgt/edit_quality/filter_quality/filter_quality.pro @@ -2,16 +2,16 @@ TEMPLATE = lib CONFIG += plugin CONFIG += stl INCLUDEPATH += ../../.. ../../../../../sf ../../../../../code/lib/glew/include -HEADERS = ../const_types.h \ - ../transferfunction.h \ - ../util.h \ - ../qualitymapperdialog.h \ +HEADERS = ../common/const_types.h \ + ../common/transferfunction.h \ + ../common/util.h \ + ../common/meshmethods.h \ filterqualitymapper.h \ ../../../meshlab/filterparameter.h -SOURCES = ../transferfunction.cpp \ - ../util.cpp \ - ../qualitymapperdialog.cpp \ +SOURCES = ../common/transferfunction.cpp \ + ../common/util.cpp \ + ../common/meshmethods.cpp \ filterqualitymapper.cpp \ ../../../meshlab/filterparameter.cpp diff --git a/src/fgt/edit_quality/filter_quality/filterqualitymapper.cpp b/src/fgt/edit_quality/filter_quality/filterqualitymapper.cpp index 735af6a0c..4363158ea 100644 --- a/src/fgt/edit_quality/filter_quality/filterqualitymapper.cpp +++ b/src/fgt/edit_quality/filter_quality/filterqualitymapper.cpp @@ -23,6 +23,16 @@ /**************************************************************************** History $Log$ +Revision 1.6 2008/02/20 17:23:00 fbellucci +-changed folders\files organizations. Added Common folder to contain files used by both projects + +-many minor changed due to update of incude file paths + +- changed representation of brightness level value in csv files +- fixed bug in apply method of filter + +-other minor changes + Revision 1.5 2008/02/20 14:52:57 fbellucci Refactoring of method necessary ti FilterQualityMapper @@ -135,19 +145,19 @@ void QualityMapperFilter::initParameterSet(QAction *action,MeshModel &m, FilterP eqData.minQualityVal = 0.0f; eqData.midQualityPercentage = 0.5f; eqData.maxQualityVal = 100.0f; - eqData.brightness = 50; + eqData.brightness = 1.0f; if (!csvFileName.isNull()) { //setting equalizer values - QualityMapperDialog::loadEqualizerInfo(csvFileName, &eqData); + loadEqualizerInfo(csvFileName, &eqData); } parlst.addString("csvFileName", csvFileName, "CSV input File" ); parlst.addFloat("minQualityVal", eqData.minQualityVal, "Minimum mesh quality" ); parlst.addFloat("maxQualityVal", eqData.maxQualityVal, "Maximum mesh quality" ); parlst.addAbsPerc("midHandlePos", eqData.midQualityPercentage, 0.0f, 1.0f, "Middle quality percentage position", "defines the percentage position of middle quality value"); - parlst.addInt("brightness", eqData.brightness, "mesh brightness" ); + parlst.addFloat("brightness", eqData.brightness, "mesh brightness" ); break; default : assert(0); @@ -163,8 +173,7 @@ bool QualityMapperFilter::applyFilter(QAction *filter, MeshModel &m, FilterParam { //building new TF object from external file TransferFunction transferFunction( csvFileName ); - - QualityMapperDialog::applyColorByVertexQuality(m, &transferFunction, par.getFloat("minQualityVal"), par.getFloat("maxQualityVal"), par.getFloat("midHandlePos"), par.getFloat("brightness")); + applyColorByVertexQuality(m, &transferFunction, par.getFloat("minQualityVal"), par.getFloat("maxQualityVal"), par.getAbsPerc("midHandlePos"), par.getFloat("brightness")); // Log function dump textual info in the lower part of the MeshLab screen. //Log(0,"Successfully displaced %i vertices",m.cm.vn); diff --git a/src/fgt/edit_quality/filter_quality/filterqualitymapper.h b/src/fgt/edit_quality/filter_quality/filterqualitymapper.h index bb71ae314..9ee22c1f1 100644 --- a/src/fgt/edit_quality/filter_quality/filterqualitymapper.h +++ b/src/fgt/edit_quality/filter_quality/filterqualitymapper.h @@ -23,6 +23,16 @@ /**************************************************************************** History $Log$ +Revision 1.3 2008/02/20 17:23:00 fbellucci +-changed folders\files organizations. Added Common folder to contain files used by both projects + +-many minor changed due to update of incude file paths + +- changed representation of brightness level value in csv files +- fixed bug in apply method of filter + +-other minor changes + Revision 1.2 2008/02/20 14:52:57 fbellucci Refactoring of method necessary ti FilterQualityMapper @@ -50,8 +60,8 @@ add sampleplugins #include #include -#include "../transferfunction.h" -#include "../qualitymapperdialog.h" +#include "../common/transferfunction.h" +#include "../common/meshmethods.h" class QualityMapperFilter : public QObject, public MeshFilterInterface diff --git a/src/fgt/edit_quality/handle.h b/src/fgt/edit_quality/handle.h index 2f39d3739..e784d0498 100644 --- a/src/fgt/edit_quality/handle.h +++ b/src/fgt/edit_quality/handle.h @@ -5,7 +5,7 @@ #include #include #include -#include "util.h" +#include "common/util.h" /* Drag&Drop generic handle to be used in QGrahicsScenes */ class Handle : public QObject, public QGraphicsItem diff --git a/src/fgt/edit_quality/qualitymapper.cpp b/src/fgt/edit_quality/qualitymapper.cpp index 8ea35256a..834db9ab0 100644 --- a/src/fgt/edit_quality/qualitymapper.cpp +++ b/src/fgt/edit_quality/qualitymapper.cpp @@ -94,12 +94,12 @@ void QualityMapperPlugin::Decorate(QAction *, MeshModel&, GLArea *) { } -void QualityMapperPlugin::StartEdit(QAction *mode, MeshModel &m, GLArea *gla ) +void QualityMapperPlugin::StartEdit(QAction *mode, MeshModel& m, GLArea *gla ) { // gla->setCursor(QCursor(QPixmap(":/images/cur_info.png"),1,1)); if(_qualityMapperDialog==0) - _qualityMapperDialog = new QualityMapperDialog(gla->window(), &m, gla); + _qualityMapperDialog = new QualityMapperDialog(gla->window(), m, gla); //drawing histogram //bool ret = _qualityMapperDialog->initEqualizerHistogram(); diff --git a/src/fgt/edit_quality/qualitymapperdialog.cpp b/src/fgt/edit_quality/qualitymapperdialog.cpp index b3248719c..01d78f331 100644 --- a/src/fgt/edit_quality/qualitymapperdialog.cpp +++ b/src/fgt/edit_quality/qualitymapperdialog.cpp @@ -16,102 +16,9 @@ bool TfHandleCompare(TFHandle*h1, TFHandle*h2) void TFDoubleClickCatcher::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { emit TFdoubleClicked(event->scenePos()); } -pair QualityMapperDialog::computeHistogramMinMaxY (Histogramf* histogram) -{ - int maxY = 0; - int minY = std::numeric_limits::max(); - for (int i=0; in; i++) - { - if ( histogram->H[i] > maxY ) - maxY = histogram->H[i]; - - if ( histogram->H[i] < minY ) - minY = histogram->H[i]; - } - pair minMaxY(minY,maxY); - return minMaxY; -} - -void QualityMapperDialog::loadEqualizerInfo(QString fileName, EQUALIZER_INFO *data) -{ - QFile inFile( fileName ); - - if ( !inFile.open(QIODevice::ReadOnly | QIODevice::Text)) - return; - - QTextStream inStream( &inFile ); - QString line; - QStringList splittedString; - - int channel_code = 0; - do - { - line = inStream.readLine(); - - //if a line is a comment, it's not processed. imply ignoring it! - if ( !line.startsWith(CSV_FILE_COMMENT) ) - channel_code ++; - } while( (!line.isNull()) && (channel_code < NUMBER_OF_CHANNELS) ); - - do - { - line = inStream.readLine(); - - //if a line is a comment, it's not processed. imply ignoring it! - if ( !line.startsWith(CSV_FILE_COMMENT) ) - { - splittedString = line.split(CSV_FILE_SEPARATOR, QString::SkipEmptyParts); - assert(splittedString.size() == 4); - - data->minQualityVal = splittedString[0].toFloat(); - data->midQualityPercentage = splittedString[1].toFloat(); - data->maxQualityVal = splittedString[2].toFloat(); - data->brightness = splittedString[3].toFloat(); - - break; - } - } while(!line.isNull()); - - inFile.close(); -} - - -void QualityMapperDialog::applyColorByVertexQuality(MeshModel& mesh, TransferFunction *transferFunction, float minQuality, float maxQuality, float midHandlePercentilePosition, float brightness) -{ - CMeshO::VertexIterator vi; - float percentageQuality; - Color4b currentColor; - - for(vi=mesh.cm.vert.begin(); vi!=mesh.cm.vert.end(); ++vi) - if(!(*vi).IsD()) - { - float vertexQuality = (*vi).Q(); - if (vertexQuality < minQuality) - percentageQuality = 0.0; - else - if (vertexQuality > maxQuality) - percentageQuality = 1.0; - else - percentageQuality = pow( ((*vi).Q() - minQuality) / (maxQuality - minQuality) , (float)(2.0*midHandlePercentilePosition)); - - currentColor = transferFunction->getColorByQuality(percentageQuality); - - if (brightness!=1.0f) //Applying brightness to each color channel - if (brightness<1.0f) - for (int i=0; i<3; i++) - //currentColor[i] = relative2AbsoluteVali(pow(absolute2RelativeValf(currentColor[i],255.0f),brightness), 255.0f); - currentColor[i] = relative2AbsoluteVali(pow(absolute2RelativeValf(currentColor[i]+1,257.0f),brightness), 255.0f); - else - for (int i=0; i<3; i++) - //currentColor[i] = relative2AbsoluteVali(1.0f-pow(1.0f-absolute2RelativeValf(currentColor[i],255.0f),2-brightness), 255.0f); - currentColor[i] = relative2AbsoluteVali(1.0f-pow(1.0f-absolute2RelativeValf(currentColor[i]+1,257.0f),2-brightness), 255.0f); - - (*vi).C() = currentColor; - } -} //class constructor -QualityMapperDialog::QualityMapperDialog(QWidget *parent, MeshModel *m, GLArea *gla) : QDockWidget(parent), mesh(m) +QualityMapperDialog::QualityMapperDialog(QWidget *parent, MeshModel& m, GLArea *gla) : QDockWidget(parent), mesh(m) { ui.setupUi(this); @@ -493,8 +400,8 @@ bool QualityMapperDialog::drawEqualizerHistogram(bool leftHandleIsInsideHistogra { // This block is called only the first time _equalizer_histogram = new Histogramf(); - Frange histogramRange(tri::Stat::ComputePerVertexQualityMinMax(mesh->cm)); - this->ComputePerVertexQualityHistogram(mesh->cm, histogramRange, _equalizer_histogram, numberOfBins); + Frange histogramRange(tri::Stat::ComputePerVertexQualityMinMax(mesh.cm)); + this->ComputePerVertexQualityHistogram(mesh.cm, histogramRange, _equalizer_histogram, numberOfBins); if (histogramRange.minV == histogramRange.maxV) { int ret = QMessageBox::warning(this, tr("Quality Mapper"), tr("The model has no vertex quality"), QMessageBox::Ok); @@ -523,7 +430,7 @@ bool QualityMapperDialog::drawEqualizerHistogram(bool leftHandleIsInsideHistogra float minX = (_histogram_info->minXvalue())?_histogram_info->minX:ui.minSpinBox->value(); float maxX = (_histogram_info->maxX>ui.maxSpinBox->value())?_histogram_info->maxX:ui.maxSpinBox->value(); Frange mmmq(minX, maxX); - this->ComputePerVertexQualityHistogram(mesh->cm, mmmq, _equalizer_histogram, numberOfBins); + this->ComputePerVertexQualityHistogram(mesh.cm, mmmq, _equalizer_histogram, numberOfBins); pair minMaxY = computeHistogramMinMaxY(_equalizer_histogram); _histogram_info->minY = minMaxY.first; @@ -831,7 +738,7 @@ void QualityMapperDialog::on_savePresetButton_clicked() eqInfo.minQualityVal = ui.minSpinBox->value(); eqInfo.midQualityPercentage = _equalizerMidHandlePercentilePosition; eqInfo.maxQualityVal = ui.maxSpinBox->value(); - eqInfo.brightness = ui.brightnessSlider->value(); + eqInfo.brightness = (1.0f - (float)(ui.brightnessSlider->value())/(float)(ui.brightnessSlider->maximum()) )*2.0; QString tfPath = _transferFunction->saveColorBand( tfName, eqInfo ); diff --git a/src/fgt/edit_quality/qualitymapperdialog.h b/src/fgt/edit_quality/qualitymapperdialog.h index 2d6d92e9e..0abd9fa90 100644 --- a/src/fgt/edit_quality/qualitymapperdialog.h +++ b/src/fgt/edit_quality/qualitymapperdialog.h @@ -20,7 +20,8 @@ #include "../../meshlabplugins/meshcolorize/curvature.h" //<--contains Frange #include #include -#include "transferfunction.h" +#include "common/transferfunction.h" +#include "common/meshmethods.h" #include "eqhandle.h" #include "tfhandle.h" @@ -81,7 +82,7 @@ class QualityMapperDialog : public QDockWidget Q_OBJECT public: - QualityMapperDialog(QWidget *parent=0, MeshModel *m=0, GLArea *gla=0); + QualityMapperDialog(QWidget *parent, MeshModel& m, GLArea *gla=0); ~QualityMapperDialog(); // inline void setMesh(MeshModel *m){ mesh=m; } @@ -93,11 +94,6 @@ public: void drawTransferFunction(); - static pair computeHistogramMinMaxY (Histogramf*); - // Apply colors to mesh vertexes by quality - static void applyColorByVertexQuality(MeshModel& mesh, TransferFunction *transferFunction, float minQuality, float maxQuality, float midHandlePercentilePosition, float brightness); - // Opens a CSV file and gets its equalizer parameters - static void loadEqualizerInfo(QString fileName, EQUALIZER_INFO *data); private: @@ -128,7 +124,7 @@ private: GRAPHICS_ITEMS_LIST _removed_items; - MeshModel *mesh; + MeshModel& mesh; GLArea *gla; void initTF(); diff --git a/src/fgt/edit_quality/tfhandle.h b/src/fgt/edit_quality/tfhandle.h index 0511d1d82..f21e63904 100644 --- a/src/fgt/edit_quality/tfhandle.h +++ b/src/fgt/edit_quality/tfhandle.h @@ -2,8 +2,7 @@ #define _TFHANDLE_H_ #include "handle.h" -#include "util.h" -#include "transferfunction.h" +#include "common/transferfunction.h" /* Specific handle for TransferFunctionScene*/