diff --git a/src/fgt/edit_quality/common/meshmethods.cpp b/src/fgt/edit_quality/common/meshmethods.cpp index 48c1fb22e..aaa412eeb 100644 --- a/src/fgt/edit_quality/common/meshmethods.cpp +++ b/src/fgt/edit_quality/common/meshmethods.cpp @@ -80,6 +80,7 @@ int loadEqualizerInfo(QString fileName, EQUALIZER_INFO *data) return result; } +/* void applyColorByVertexQuality(MeshModel& mesh, TransferFunction *transferFunction, float minQuality, float maxQuality, float midHandlePercentilePosition, float brightness) { CMeshO::VertexIterator vi; @@ -111,4 +112,15 @@ void applyColorByVertexQuality(MeshModel& mesh, TransferFunction *transferFuncti (*vi).C() = currentColor; } -} +}*/ + +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()) + (*vi).C() = transferFunction->getColorByQuality ((*vi).Q(), minQuality, maxQuality, midHandlePercentilePosition, brightness); +} \ No newline at end of file diff --git a/src/fgt/edit_quality/common/transferfunction.cpp b/src/fgt/edit_quality/common/transferfunction.cpp index d84873501..9f49a1ada 100644 --- a/src/fgt/edit_quality/common/transferfunction.cpp +++ b/src/fgt/edit_quality/common/transferfunction.cpp @@ -449,6 +449,34 @@ Color4b TransferFunction::getColorByQuality (float percentageQuality) 255 ); } +//converts a quality value into a color depending on the transfer function channels values, min quality, max quality, mid quality and brightness +Color4b TransferFunction::getColorByQuality (float absoluteQuality, float minQuality, float maxQuality, float midRelativeQuality, float brightness) +{ + float percentageQuality; + Color4b currentColor; + + if (absoluteQuality < minQuality) + percentageQuality = 0.0f; + else + if (absoluteQuality > maxQuality) + percentageQuality = 1.0f; + else + // calcultating relative quality and applying exponential function: rel(Q)^exp, exp=2*midHandleRelPos + percentageQuality = pow( (absoluteQuality - minQuality) / (maxQuality - minQuality) , (float)(2.0f*midRelativeQuality)); + + currentColor = getColorByQuality(percentageQuality); + + if (brightness!=1.0f) //Applying brightness to each color channel, 0maxQuality(); + float minQuality = _qualityMapperDialog->minQuality(); + float brightness = _qualityMapperDialog->brightness(); + float relativeMidQuality = _qualityMapperDialog->relativeMidQuality(); + float step = (float)(maxQuality - minQuality)/(float)steps; + float curQ; for(int i=0;i_transferFunction->getColorByQuality(float(i)/float(steps)); - cc[3]=64; - glColor(cc); - } - glVertex2f(barLeft,barTop); glVertex2f(barRight,barTop); + { + glVertex2f(barLeft,barBottom+delta*i); glVertex2f(barRight,barBottom+delta*i); + curQ = float(i)*step + minQuality; + // Color4b cc = _qualityMapperDialog->_transferFunction->getColorByQuality(float(i)/float(steps)); + Color4b cc = _qualityMapperDialog->_transferFunction->getColorByQuality(curQ, minQuality, maxQuality, relativeMidQuality, brightness); + cc[3]=64; + glColor(cc); + } + glVertex2f(barLeft,barTop); glVertex2f(barRight,barTop); glEnd(); diff --git a/src/fgt/edit_quality/qualitymapperdialog.h b/src/fgt/edit_quality/qualitymapperdialog.h index e967beb81..afa81ae0d 100644 --- a/src/fgt/edit_quality/qualitymapperdialog.h +++ b/src/fgt/edit_quality/qualitymapperdialog.h @@ -122,6 +122,11 @@ public: bool initEqualizerHistogram(void); void drawTransferFunction(void); + float minQuality() {return ui.minSpinBox->value();}; + float maxQuality() {return ui.maxSpinBox->value();}; + float relativeMidQuality() {return _equalizerMidHandlePercentilePosition;}; + float brightness() {return (1.0f - (float)(ui.brightnessSlider->value())/(float)(ui.brightnessSlider->maximum()) )*2.0;}; + private: Ui::QualityMapperDialogClass ui;