diff --git a/ChangeLog b/ChangeLog index d868b11..23a9945 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,10 @@ NVIDIA Texture Tools version 2.1.0 * Support alpha premultiplication by Charles Nicholson. See issue 30. * Improved decompressor tool submitted by Amorilia. See issue 41. +NVIDIA Texture Tools version 2.0.3 + * More accurate DXT3 compressor. Fixes issue 38. + * Remove legacy compressors. Fix issue 34? + NVIDIA Texture Tools version 2.0.2 * Fix copy ctor error reported by Richard Sim. * Fix indexMirror error reported by Chris Lambert. diff --git a/src/nvimage/ColorBlock.cpp b/src/nvimage/ColorBlock.cpp index bbf6857..2c9945f 100644 --- a/src/nvimage/ColorBlock.cpp +++ b/src/nvimage/ColorBlock.cpp @@ -114,9 +114,12 @@ void ColorBlock::splatY() /// Returns true if the block has a single color. bool ColorBlock::isSingleColor() const { - for(int i = 1; i < 16; i++) + Color32 mask(0xFF, 0xFF, 0xFF, 0x00); + uint u = m_color[0].u & mask.u; + + for (int i = 1; i < 16; i++) { - if (m_color[0] != m_color[i]) + if (u != (m_color[i].u & mask.u)) { return false; } @@ -134,10 +137,13 @@ bool ColorBlock::isSingleColorNoAlpha() const { if (m_color[i].a != 0) c = m_color[i]; } - + + Color32 mask(0xFF, 0xFF, 0xFF, 0x00); + uint u = c.u & mask.u; + for(; i < 16; i++) { - if (c != m_color[i]) + if (u != (m_color[i].u & mask.u)) { return false; } diff --git a/src/nvtt/CompressDXT.cpp b/src/nvtt/CompressDXT.cpp index a50e2e0..52de101 100644 --- a/src/nvtt/CompressDXT.cpp +++ b/src/nvtt/CompressDXT.cpp @@ -237,7 +237,16 @@ void nv::compressDXT1a(const Image * image, const OutputOptions::Private & outpu rgba.init(image, x, y); - if (rgba.isSingleColor()) + bool anyAlpha = false; + bool allAlpha = true; + + for (uint i = 0; i < 16; i++) + { + if (rgba.color(i).a < 128) anyAlpha = true; + else allAlpha = false; + } + + if ((!anyAlpha && rgba.isSingleColor() || allAlpha)) { OptimalCompress::compressDXT1a(rgba.color(0), &block); } @@ -274,11 +283,18 @@ void nv::compressDXT3(const Image * image, const OutputOptions::Private & output // Compress explicit alpha. OptimalCompress::compressDXT3A(rgba, &block.alpha); - + // Compress color. - squish::ColourSet colours((uint8 *)rgba.colors(), squish::kWeightColourByAlpha); - fit.SetColourSet(&colours, 0); - fit.Compress(&block.color); + if (rgba.isSingleColor()) + { + OptimalCompress::compressDXT1(rgba.color(0), &block.color); + } + else + { + squish::ColourSet colours((uint8 *)rgba.colors(), squish::kWeightColourByAlpha); + fit.SetColourSet(&colours, 0); + fit.Compress(&block.color); + } if (outputOptions.outputHandler != NULL) { outputOptions.outputHandler->writeData(&block, sizeof(block)); @@ -314,9 +330,16 @@ void nv::compressDXT5(const Image * image, const OutputOptions::Private & output } // Compress color. - squish::ColourSet colours((uint8 *)rgba.colors(), squish::kWeightColourByAlpha); - fit.SetColourSet(&colours, 0); - fit.Compress(&block.color); + if (rgba.isSingleColor()) + { + OptimalCompress::compressDXT1(rgba.color(0), &block.color); + } + else + { + squish::ColourSet colours((uint8 *)rgba.colors(), squish::kWeightColourByAlpha); + fit.SetColourSet(&colours, 0); + fit.Compress(&block.color); + } if (outputOptions.outputHandler != NULL) { outputOptions.outputHandler->writeData(&block, sizeof(block)); diff --git a/src/nvtt/QuickCompressDXT.cpp b/src/nvtt/QuickCompressDXT.cpp index bfd7ee4..b31b46a 100644 --- a/src/nvtt/QuickCompressDXT.cpp +++ b/src/nvtt/QuickCompressDXT.cpp @@ -481,7 +481,17 @@ void QuickCompress::compressDXT1(const ColorBlock & rgba, BlockDXT1 * dxtBlock) void QuickCompress::compressDXT1a(const ColorBlock & rgba, BlockDXT1 * dxtBlock) { - if (!rgba.hasAlpha()) + bool hasAlpha = false; + + for (uint i = 0; i < 16; i++) + { + if (rgba.color(i).a < 128) { + hasAlpha = true; + break; + } + } + + if (!hasAlpha) { compressDXT1(rgba, dxtBlock); }