-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
This commit is contained in:
Paolo Cignoni cignoni 2008-02-20 17:23:00 +00:00
parent c7474e3593
commit ccbe67eeca
14 changed files with 183 additions and 135 deletions

View File

@ -36,7 +36,7 @@ struct EQUALIZER_INFO
float minQualityVal;
float midQualityPercentage;
float maxQualityVal;
int brightness;
float brightness;
};
#endif

View File

@ -0,0 +1,102 @@
#include "meshmethods.h"
#include <cmath>
#include <limits>
#include <QFile>
#include <QTextStream>
pair<int,int> computeHistogramMinMaxY (Histogramf* histogram)
{
int maxY = 0;
int minY = std::numeric_limits<int>::max();
for (int i=0; i<histogram->n; i++)
{
if ( histogram->H[i] > maxY )
maxY = histogram->H[i];
if ( histogram->H[i] < minY )
minY = histogram->H[i];
}
pair<int,int> 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<NUMBER_OF_CHANNELS; 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<NUMBER_OF_CHANNELS; 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);
Color4b old = (*vi).C();
(*vi).C() = currentColor;
}
}

View File

@ -0,0 +1,25 @@
#ifndef _MESHMETHODS_H_
#define _MESHMETHODS_H_
#include "const_types.h"
#include "transferfunction.h"
#include <vcg/math/histogram.h>
#include <meshlab/meshmodel.h>
#include <cassert>
#include <utility>
#include <QString>
using namespace std;
using namespace vcg;
pair<int,int> 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

View File

@ -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();

View File

@ -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

View File

@ -1,10 +1,7 @@
#ifndef _EQHANDLE_H_
#define _EQHANDLE_H_
//#include <QObject>
//#include <QGraphicsItem>
#include "handle.h"
//#include "util.h"
enum EQUALIZER_HANDLE_TYPE
{

View File

@ -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

View File

@ -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);

View File

@ -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 <meshlab/meshmodel.h>
#include <meshlab/interfaces.h>
#include "../transferfunction.h"
#include "../qualitymapperdialog.h"
#include "../common/transferfunction.h"
#include "../common/meshmethods.h"
class QualityMapperFilter : public QObject, public MeshFilterInterface

View File

@ -5,7 +5,7 @@
#include <QGraphicsItem>
#include <QtGui>
#include <limits>
#include "util.h"
#include "common/util.h"
/* Drag&Drop generic handle to be used in QGrahicsScenes */
class Handle : public QObject, public QGraphicsItem

View File

@ -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();

View File

@ -16,102 +16,9 @@ bool TfHandleCompare(TFHandle*h1, TFHandle*h2)
void TFDoubleClickCatcher::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{ emit TFdoubleClicked(event->scenePos()); }
pair<int,int> QualityMapperDialog::computeHistogramMinMaxY (Histogramf* histogram)
{
int maxY = 0;
int minY = std::numeric_limits<int>::max();
for (int i=0; i<histogram->n; i++)
{
if ( histogram->H[i] > maxY )
maxY = histogram->H[i];
if ( histogram->H[i] < minY )
minY = histogram->H[i];
}
pair<int,int> 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<CMeshO>::ComputePerVertexQualityMinMax(mesh->cm));
this->ComputePerVertexQualityHistogram(mesh->cm, histogramRange, _equalizer_histogram, numberOfBins);
Frange histogramRange(tri::Stat<CMeshO>::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->minX<ui.minSpinBox->value())?_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<int,int> 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 );

View File

@ -20,7 +20,8 @@
#include "../../meshlabplugins/meshcolorize/curvature.h" //<--contains Frange
#include <vcg/complex/trimesh/stat.h>
#include <meshlab/glarea.h>
#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<int,int> 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();

View File

@ -2,8 +2,7 @@
#define _TFHANDLE_H_
#include "handle.h"
#include "util.h"
#include "transferfunction.h"
#include "common/transferfunction.h"
/* Specific handle for TransferFunctionScene*/