From 60c4ab031fea72d80576afd60dfbf0b009595afa Mon Sep 17 00:00:00 2001 From: Ruslan Kabatsayev Date: Fri, 7 Apr 2023 23:44:13 +0400 Subject: [PATCH] Fix colors of StelPainter-colored renders --- src/core/StelPainter.cpp | 9 +++++---- src/core/StelSRGB.hpp | 9 +++++++++ src/core/VecMath.cpp | 13 +++++++++++++ src/core/VecMath.hpp | 2 ++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/core/StelPainter.cpp b/src/core/StelPainter.cpp index c703156c7cfd1d..35a0bf4b6c5b15 100644 --- a/src/core/StelPainter.cpp +++ b/src/core/StelPainter.cpp @@ -24,6 +24,7 @@ #include "StelLocaleMgr.hpp" #include "StelProjector.hpp" #include "StelProjectorClasses.hpp" +#include "StelSRGB.hpp" #include "StelUtils.hpp" #include "StelTextureMgr.hpp" #include "SaturationShader.hpp" @@ -766,7 +767,7 @@ void StelPainter::drawText(float x, float y, const QString& str, float angleDeg, QFont tmpFont = currentFont; tmpFont.setPixelSize(currentFont.pixelSize()*static_cast(static_cast(prj->getDevicePixelsPerPixel())*StelApp::getInstance().getGlobalScalingRatio())); painter.setFont(tmpFont); - painter.setPen(currentColor.toQColor()); + painter.setPen(srgbToLinear(currentColor).toQColor()); float scaleRatio = StelApp::getInstance().getGlobalScalingRatio(); xshift*=scaleRatio; @@ -2441,7 +2442,7 @@ void StelPainter::drawFromArray(DrawingMode mode, int count, int offset, bool do pr->setAttributeBuffer(wideLineShaderVars.vertex, projectedVertexArray.type, 0, projectedVertexArray.size); pr->enableAttributeArray(wideLineShaderVars.vertex); pr->setUniformValue(wideLineShaderVars.projectionMatrix, qMat); - pr->setUniformValue(wideLineShaderVars.color, currentColor[0], currentColor[1], currentColor[2], currentColor[3]); + pr->setUniformValue(wideLineShaderVars.color, srgbToLinear(currentColor).toQVector()); pr->setUniformValue(wideLineShaderVars.lineWidth, glState.lineWidth); GLint viewport[4] = {}; glGetIntegerv(GL_VIEWPORT, viewport); @@ -2456,7 +2457,7 @@ void StelPainter::drawFromArray(DrawingMode mode, int count, int offset, bool do pr->setAttributeBuffer(basicShaderVars.vertex, projectedVertexArray.type, 0, projectedVertexArray.size); pr->enableAttributeArray(basicShaderVars.vertex); pr->setUniformValue(basicShaderVars.projectionMatrix, qMat); - pr->setUniformValue(basicShaderVars.color, currentColor[0], currentColor[1], currentColor[2], currentColor[3]); + pr->setUniformValue(basicShaderVars.color, srgbToLinear(currentColor).toQVector()); } } else if (texCoordArray.enabled && !colorArray.enabled && !normalArray.enabled && !wideLineMode) @@ -2476,7 +2477,7 @@ void StelPainter::drawFromArray(DrawingMode mode, int count, int offset, bool do pr->setAttributeBuffer(texturesShaderVars.vertex, projectedVertexArray.type, 0, projectedVertexArray.size); pr->enableAttributeArray(texturesShaderVars.vertex); pr->setUniformValue(texturesShaderVars.projectionMatrix, qMat); - pr->setUniformValue(texturesShaderVars.texColor, currentColor[0], currentColor[1], currentColor[2], currentColor[3]); + pr->setUniformValue(texturesShaderVars.texColor, srgbToLinear(currentColor).toQVector()); pr->setAttributeBuffer(texturesShaderVars.texCoord, texCoordArray.type, texCoordDataOffset, texCoordArray.size); pr->enableAttributeArray(texturesShaderVars.texCoord); //pr->setUniformValue(texturesShaderVars.texture, 0); // use texture unit 0 diff --git a/src/core/StelSRGB.hpp b/src/core/StelSRGB.hpp index aff0c325fb40c3..48c02c3a768ca0 100644 --- a/src/core/StelSRGB.hpp +++ b/src/core/StelSRGB.hpp @@ -31,6 +31,15 @@ F srgbToLinear(const F c) : c / F(12.92); } +template +Vector4 srgbToLinear(const Vector4& srgba) +{ + return {srgbToLinear(srgba[0]), + srgbToLinear(srgba[1]), + srgbToLinear(srgba[2]), + srgba[3]}; +} + template Vector3 srgbToLinear(const Vector3& srgb) { diff --git a/src/core/VecMath.cpp b/src/core/VecMath.cpp index ec12b1ada6452b..40d2df4720146c 100644 --- a/src/core/VecMath.cpp +++ b/src/core/VecMath.cpp @@ -378,6 +378,19 @@ template<> QColor Vec4f::toQColor() const return QColor::fromRgbF(static_cast(v[0]), static_cast(v[1]), static_cast(v[2]), static_cast(v[3])); } +template<> QVector4D Vec4f::toQVector() const +{ + return QVector4D(v[0], v[1], v[2], v[3]); +} + +template<> QVector4D Vec4d::toQVector() const +{ + return QVector4D(static_cast(v[0]), + static_cast(v[1]), + static_cast(v[2]), + static_cast(v[3])); +} + template<> QColor Vec4d::toQColor() const { return QColor::fromRgbF(v[0], v[1], v[2], v[3]); diff --git a/src/core/VecMath.hpp b/src/core/VecMath.hpp index b1d31f490882fc..3429bee53e19db 100644 --- a/src/core/VecMath.hpp +++ b/src/core/VecMath.hpp @@ -374,6 +374,8 @@ template class Vector4 QString toStr() const; //! Convert to a QColor. QColor toQColor() const; + //! Convert to a QVector3D. + QVector4D toQVector() const; T v[4]; // The 4 values };