Merge changes from the-witness.
Fix DXT5n compressor.
This commit is contained in:
@ -221,10 +221,38 @@ void NormalCompressorDXT5::compressBlock(ColorBlock & rgba, nvtt::AlphaMode alph
|
||||
|
||||
void NormalCompressorDXT5n::compressBlock(ColorBlock & rgba, nvtt::AlphaMode alphaMode, const nvtt::CompressionOptions::Private & compressionOptions, void * output)
|
||||
{
|
||||
rgba.swizzle(4, 1, 5, 0); // 0xFF, G, 0, R
|
||||
|
||||
BlockDXT5 * block = new(output) BlockDXT5;
|
||||
|
||||
// Compress Y.
|
||||
if (compressionOptions.quality == Quality_Highest)
|
||||
{
|
||||
OptimalCompress::compressDXT1G(rgba, &block->color);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rgba.isSingleColor(Color32(0, 0xFF, 0, 0))) // Mask all but green channel.
|
||||
{
|
||||
OptimalCompress::compressDXT1G(rgba.color(0).g, &block->color);
|
||||
}
|
||||
else
|
||||
{
|
||||
ColorBlock tile = rgba;
|
||||
tile.swizzle(4, 1, 5, 3); // leave alpha in alpha channel.
|
||||
|
||||
nvsquish::WeightedClusterFit fit;
|
||||
fit.SetMetric(0, 1, 0);
|
||||
|
||||
int flags = 0;
|
||||
if (alphaMode == nvtt::AlphaMode_Transparency) flags |= nvsquish::kWeightColourByAlpha;
|
||||
|
||||
nvsquish::ColourSet colours((uint8 *)tile.colors(), flags);
|
||||
fit.SetColourSet(&colours, 0);
|
||||
fit.Compress(&block->color);
|
||||
}
|
||||
}
|
||||
|
||||
rgba.swizzle(4, 1, 5, 0); // 1, G, 0, R
|
||||
|
||||
// Compress X.
|
||||
if (compressionOptions.quality == Quality_Highest)
|
||||
{
|
||||
@ -234,31 +262,6 @@ void NormalCompressorDXT5n::compressBlock(ColorBlock & rgba, nvtt::AlphaMode alp
|
||||
{
|
||||
QuickCompress::compressDXT5A(rgba, &block->alpha);
|
||||
}
|
||||
|
||||
// Compress Y.
|
||||
if (compressionOptions.quality == Quality_Highest)
|
||||
{
|
||||
OptimalCompress::compressDXT1G(rgba, &block->color);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rgba.isSingleColor())
|
||||
{
|
||||
OptimalCompress::compressDXT1G(rgba.color(0), &block->color);
|
||||
}
|
||||
else
|
||||
{
|
||||
nvsquish::WeightedClusterFit fit;
|
||||
fit.SetMetric(0, 1, 0);
|
||||
|
||||
int flags = 0;
|
||||
if (alphaMode == nvtt::AlphaMode_Transparency) flags |= nvsquish::kWeightColourByAlpha;
|
||||
|
||||
nvsquish::ColourSet colours((uint8 *)rgba.colors(), flags);
|
||||
fit.SetColourSet(&colours, 0);
|
||||
fit.Compress(&block->color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -312,13 +312,19 @@ bool TexImage::setImage2D(nvtt::InputFormat format, int w, int h, int idx, const
|
||||
}
|
||||
|
||||
FloatImage * img = m->imageArray[idx];
|
||||
if (img->width() != w || img->height() != h)
|
||||
{
|
||||
return false;
|
||||
if (img != NULL) {
|
||||
if (img->width() != w || img->height() != h) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
detach();
|
||||
|
||||
if (img == NULL) {
|
||||
img = m->imageArray[idx] = new FloatImage();
|
||||
img->allocate(4, w, h);
|
||||
}
|
||||
|
||||
const int count = w * h;
|
||||
|
||||
float * restrict rdst = img->channel(0);
|
||||
@ -333,10 +339,10 @@ bool TexImage::setImage2D(nvtt::InputFormat format, int w, int h, int idx, const
|
||||
try {
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
rdst[i] = src[i].r;
|
||||
gdst[i] = src[i].g;
|
||||
bdst[i] = src[i].b;
|
||||
adst[i] = src[i].a;
|
||||
rdst[i] = float(src[i].r) / 255.0f;
|
||||
gdst[i] = float(src[i].g) / 255.0f;
|
||||
bdst[i] = float(src[i].b) / 255.0f;
|
||||
adst[i] = float(src[i].a) / 255.0f;
|
||||
}
|
||||
}
|
||||
catch(...) {
|
||||
|
@ -391,7 +391,6 @@ namespace nvtt
|
||||
/// A texture mipmap.
|
||||
struct TexImage
|
||||
{
|
||||
NVTT_API TexImage();
|
||||
NVTT_API TexImage(const TexImage & tex);
|
||||
NVTT_API ~TexImage();
|
||||
|
||||
@ -459,6 +458,7 @@ namespace nvtt
|
||||
NVTT_API bool copyChannel(const TexImage & srcImage, int srcChannel, int dstChannel);
|
||||
|
||||
private:
|
||||
TexImage();
|
||||
void detach();
|
||||
|
||||
friend struct Compressor;
|
||||
|
@ -558,7 +558,7 @@ int main(int argc, char *argv[])
|
||||
// fflush(stdout);
|
||||
// getchar();
|
||||
|
||||
Timer timer;
|
||||
nv::Timer timer;
|
||||
timer.start();
|
||||
|
||||
if (!context.process(inputOptions, compressionOptions, outputOptions))
|
||||
|
Reference in New Issue
Block a user