Example #1
0
void NormalCompressorDXT1::compressBlock(ColorSet & set, nvtt::AlphaMode alphaMode, const nvtt::CompressionOptions::Private & compressionOptions, void * output)
{
    set.setUniformWeights();
    set.createMinimalSet(false);

	ClusterFit fit;
	fit.setMetric(compressionOptions.colorWeight);

    BlockDXT1 * block = new(output) BlockDXT1;
    
    if (set.isSingleColor(true))
	{
        Color32 c;
        c.r = uint8(clamp(set.colors[0].x, 0.0f, 1.0f) * 255);
        c.g = uint8(clamp(set.colors[0].y, 0.0f, 1.0f) * 255);
        c.b = uint8(clamp(set.colors[0].z, 0.0f, 1.0f) * 255);
        c.a = 255;
		OptimalCompress::compressDXT1(c, block);
	}
	else
	{
		fit.setColourSet(&set);
		
        Vector3 start, end;
        
        fit.compress4(&start, &end);
        QuickCompress::outputBlock4(set, start, end, block);

        if (fit.compress3(&start, &end)) {
            QuickCompress::outputBlock3(set, start, end, block);
        }
	}
}
void nv::compress_dxt1_cluster_fit(const Vector3 input_colors[16], const Vector3 * colors, const float * weights, int count, const Vector3 & color_weights, BlockDXT1 * output)
{
    ClusterFit fit;
    fit.setColorWeights(Vector4(color_weights, 1));
    fit.setColorSet(colors, weights, count);

    // start & end are in [0, 1] range.
    Vector3 start, end;
    fit.compress4(&start, &end);

    if (fit.compress3(&start, &end)) {
        output_block3(input_colors, color_weights, start, end, output);
    }
    else {
        output_block4(input_colors, color_weights, start, end, output);
    }
}