diff --git a/ChangeLog b/ChangeLog index 357dd6e..cfadba9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -27,3 +27,5 @@ NVIDIA Texture Tools version 0.9.4 NVIDIA Texture Tools version 0.9.5 * Fixed PSNR formula. + * Added support for arbitrary RGB formats. + diff --git a/src/nvimage/BlockDXT.cpp b/src/nvimage/BlockDXT.cpp index ad19f63..517bb6c 100644 --- a/src/nvimage/BlockDXT.cpp +++ b/src/nvimage/BlockDXT.cpp @@ -553,6 +553,70 @@ void BlockATI2::flip2() } +void BlockCTX1::evaluatePalette(Color32 color_array[4]) const +{ + // Does bit expansion before interpolation. + color_array[0].b = 0x00; + color_array[0].g = col0[1]; + color_array[0].r = col0[0]; + color_array[0].a = 0xFF; + + color_array[1].r = 0x00; + color_array[1].g = col0[1]; + color_array[1].b = col1[0]; + color_array[1].a = 0xFF; + + color_array[2].r = 0x00; + color_array[2].g = (2 * color_array[0].g + color_array[1].g) / 3; + color_array[2].b = (2 * color_array[0].b + color_array[1].b) / 3; + color_array[2].a = 0xFF; + + color_array[3].r = 0x00; + color_array[3].g = (2 * color_array[1].g + color_array[0].g) / 3; + color_array[3].b = (2 * color_array[1].b + color_array[0].b) / 3; + color_array[3].a = 0xFF; +} + +void BlockCTX1::decodeBlock(ColorBlock * block) const +{ + nvDebugCheck(block != NULL); + + // Decode color block. + Color32 color_array[4]; + evaluatePalette(color_array); + + // Write color block. + for( uint j = 0; j < 4; j++ ) { + for( uint i = 0; i < 4; i++ ) { + uint idx = (row[j] >> (2 * i)) & 3; + block->color(i, j) = color_array[idx]; + } + } +} + +void BlockCTX1::setIndices(int * idx) +{ + indices = 0; + for(uint i = 0; i < 16; i++) { + indices |= (idx[i] & 3) << (2 * i); + } +} + + +/// Flip CTX1 block vertically. +inline void BlockCTX1::flip4() +{ + swap(row[0], row[3]); + swap(row[1], row[2]); +} + +/// Flip half CTX1 block vertically. +inline void BlockCTX1::flip2() +{ + swap(row[0], row[1]); +} + + Stream & nv::operator<<(Stream & stream, BlockDXT1 & block) @@ -592,3 +656,9 @@ Stream & nv::operator<<(Stream & stream, BlockATI2 & block) return stream << block.x << block.y; } +Stream & nv::operator<<(Stream & stream, BlockCTX1 & block) +{ + stream.serialize(&block, sizeof(block)); + return stream; +} + diff --git a/src/nvimage/BlockDXT.h b/src/nvimage/BlockDXT.h index c649e10..efaccfd 100644 --- a/src/nvimage/BlockDXT.h +++ b/src/nvimage/BlockDXT.h @@ -175,7 +175,7 @@ namespace nv void flip4(); void flip2(); }; - + /// ATI2 block. struct BlockATI2 { @@ -188,6 +188,26 @@ namespace nv void flip2(); }; + /// CTX1 block. + struct BlockCTX1 + { + uint8 col0[2]; + uint8 col1[2]; + union { + uint8 row[4]; + uint indices; + }; + + void evaluatePalette(Color32 color_array[4]) const; + void setIndices(int * idx); + + void decodeBlock(ColorBlock * block) const; + + void flip4(); + void flip2(); + }; + + // Serialization functions. NVIMAGE_API Stream & operator<<(Stream & stream, BlockDXT1 & block); NVIMAGE_API Stream & operator<<(Stream & stream, AlphaBlockDXT3 & block); @@ -196,6 +216,7 @@ namespace nv NVIMAGE_API Stream & operator<<(Stream & stream, BlockDXT5 & block); NVIMAGE_API Stream & operator<<(Stream & stream, BlockATI1 & block); NVIMAGE_API Stream & operator<<(Stream & stream, BlockATI2 & block); + NVIMAGE_API Stream & operator<<(Stream & stream, BlockCTX1 & block); } // nv namespace diff --git a/src/nvimage/nvtt/squish/fastclusterfit.h b/src/nvimage/nvtt/squish/fastclusterfit.h index b1bc018..19bf335 100644 --- a/src/nvimage/nvtt/squish/fastclusterfit.h +++ b/src/nvimage/nvtt/squish/fastclusterfit.h @@ -71,4 +71,4 @@ private: } // namespace squish -#endif // ndef SQUISH_CLUSTERFIT_H +#endif // ndef SQUISH_FASTCLUSTERFIT_H diff --git a/src/nvimage/nvtt/squish/maths.h b/src/nvimage/nvtt/squish/maths.h index ca86b35..357d62f 100644 --- a/src/nvimage/nvtt/squish/maths.h +++ b/src/nvimage/nvtt/squish/maths.h @@ -118,7 +118,13 @@ public: Vec3 copy( left ); return copy += right; } - + + friend Vec3 operator+( Arg left, float right ) + { + Vec3 copy( left ); + return copy += Vec3(right); + } + friend Vec3 operator-( Arg left, Arg right ) { Vec3 copy( left ); diff --git a/src/nvmath/Vector.h b/src/nvmath/Vector.h index 3875846..d79d498 100644 --- a/src/nvmath/Vector.h +++ b/src/nvmath/Vector.h @@ -76,8 +76,6 @@ public: void operator+=(Vector3::Arg v); void operator-=(Vector3::Arg v); void operator*=(scalar s); - inline void operator/=(scalar s) - { m_x /= s; m_y /= s; m_z /= s; } void operator*=(Vector3::Arg v); friend bool operator==(Vector3::Arg a, Vector3::Arg b);