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); } }
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 ); }