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);
    }
}
Example #3
0
void Compress( u8 const* rgba, void* block, int flags )
{
	// fix any bad flags
	flags = FixFlags( flags );

	// get the block locations
	void* colourBlock = block;
	void* alphaBock = block;
	if( ( flags & ( kDxt3 | kDxt5 ) ) != 0 )
		colourBlock = reinterpret_cast< u8* >( block ) + 8;

	// create the minimal point set
	ColourSet colours( rgba, flags );
	
	// check the compression type and compress colour
	if( colours.GetCount() == 1 )
	{
		// always do a single colour fit
		SingleColourFit fit;
        fit.SetColourSet( &colours, flags );
		fit.Compress( colourBlock );
	}
	else if( ( flags & kColourRangeFit ) != 0 )
	{
		// do a range fit
		RangeFit fit;
        fit.SetColourSet( &colours, flags );
		fit.Compress( colourBlock );
	}
	else
	{
		// default to a cluster fit
		ClusterFit fit;
        fit.SetColourSet( &colours, flags );
        fit.SetMetric( 1.0f, 1.0f, 1.0f );
		fit.Compress( colourBlock );
	}
	
	// compress alpha separately if necessary
	if( ( flags & kDxt3 ) != 0 )
		CompressAlphaDxt3( rgba, alphaBock );
	else if( ( flags & kDxt5 ) != 0 )
		CompressAlphaDxt5( rgba, alphaBock );
}