From 76a1deb882ad068117f87170a05332feccd46fd5 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 30 Mar 2015 11:22:25 +0200 Subject: [PATCH 1/2] Apply bayer dither to TGA16 export for smoother lightmaps --- code/nel/tools/3d/tga_2_dds/tga2dds.cpp | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/code/nel/tools/3d/tga_2_dds/tga2dds.cpp b/code/nel/tools/3d/tga_2_dds/tga2dds.cpp index 292280349..19fd70d32 100644 --- a/code/nel/tools/3d/tga_2_dds/tga2dds.cpp +++ b/code/nel/tools/3d/tga_2_dds/tga2dds.cpp @@ -359,6 +359,13 @@ void dividSize (CBitmap &bitmap) } } +const int bayerDiv8[4][4] = { + 0, 4, 1, 5, + 6, 2, 7, 3, + 1, 5, 0, 4, + 7, 3, 6, 2, +}; + // *************************************************************************** int main(int argc, char **argv) { @@ -601,6 +608,26 @@ int main(int argc, char **argv) Reduce--; } + if (algo == TGA16) + { + // Apply bayer dither + CObjectVector &rgba = picSrc.getPixels(0); + const uint32 w = picSrc.getWidth(0); + uint32 x = 0; + uint32 y = 0; + for (uint32 i = 0; i < rgba.size(); i += 4) + { + NLMISC::CRGBA &c = reinterpret_cast(rgba[i]); + c.R = (uint8)std::min(255, (int)c.R + bayerDiv8[x % 4][y % 4]); + c.G = (uint8)std::min(255, (int)c.G + bayerDiv8[x % 4][y % 4]); + c.B = (uint8)std::min(255, (int)c.B + bayerDiv8[x % 4][y % 4]); + ++x; + x %= w; + if (x == 0) + ++y; + } + } + // 8 or 16 bits TGA or PNG ? if ((algo == TGA16) || (algo == TGA8) || (algo == PNG16) || (algo == PNG8)) { From 4c91c4a7d9d0a33c37fa7332ef8ad74575c90495 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 30 Mar 2015 12:04:35 +0200 Subject: [PATCH 2/2] Separate dither matrix per color channel --- code/nel/tools/3d/tga_2_dds/tga2dds.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/code/nel/tools/3d/tga_2_dds/tga2dds.cpp b/code/nel/tools/3d/tga_2_dds/tga2dds.cpp index 19fd70d32..34b47735f 100644 --- a/code/nel/tools/3d/tga_2_dds/tga2dds.cpp +++ b/code/nel/tools/3d/tga_2_dds/tga2dds.cpp @@ -359,13 +359,27 @@ void dividSize (CBitmap &bitmap) } } -const int bayerDiv8[4][4] = { +const int bayerDiv8R[4][4] = { + 7, 3, 6, 2, + 1, 5, 0, 4, + 6, 2, 7, 3, + 0, 4, 1, 5, +}; + +const int bayerDiv8G[4][4] = { 0, 4, 1, 5, 6, 2, 7, 3, 1, 5, 0, 4, 7, 3, 6, 2, }; +const int bayerDiv8B[4][4] = { + 5, 1, 4, 0, + 3, 7, 2, 6, + 4, 0, 5, 1, + 2, 6, 3, 7, +}; + // *************************************************************************** int main(int argc, char **argv) { @@ -618,9 +632,9 @@ int main(int argc, char **argv) for (uint32 i = 0; i < rgba.size(); i += 4) { NLMISC::CRGBA &c = reinterpret_cast(rgba[i]); - c.R = (uint8)std::min(255, (int)c.R + bayerDiv8[x % 4][y % 4]); - c.G = (uint8)std::min(255, (int)c.G + bayerDiv8[x % 4][y % 4]); - c.B = (uint8)std::min(255, (int)c.B + bayerDiv8[x % 4][y % 4]); + c.R = (uint8)std::min(255, (int)c.R + bayerDiv8R[x % 4][y % 4]); + c.G = (uint8)std::min(255, (int)c.G + bayerDiv8G[x % 4][y % 4]); + c.B = (uint8)std::min(255, (int)c.B + bayerDiv8B[x % 4][y % 4]); ++x; x %= w; if (x == 0)