public static void compressDXT1(ColorBlock rgba, BlockDXT1 dxtBlock) { if (rgba.isSingleColor()) { OptimalCompress.compressDXT1(rgba.color[0], dxtBlock); } else { // read block Vector3[] block = new Vector3[16]; extractColorBlockRGB(rgba, block); #if true // find min and max colors Vector3 maxColor = Vector3.zero, minColor = Vector3.zero; findMinMaxColorsBox(block, 16, ref maxColor, ref minColor); selectDiagonal(block, 16, ref maxColor, ref minColor); insetBBox(ref maxColor, ref minColor); #else float[] weights = new float[16] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; Vector3[] cluster = new Vector3[4]; int count = Fitting.Compute4Means(16, block, weights, Vector3.one, cluster); Vector3 maxColor, minColor; float bestError = FLT_MAX; for (int i = 1; i < 4; i++) { for (int j = 0; j < i; j++) { uint16 color0 = roundAndExpand(&cluster[i]); uint16 color1 = roundAndExpand(&cluster[j]); float error = evaluatePaletteError4(block, cluster[i], cluster[j]); if (error < bestError) { bestError = error; maxColor = cluster[i]; minColor = cluster[j]; } } } #endif ushort color0 = roundAndExpand(ref maxColor); ushort color1 = roundAndExpand(ref minColor); if (color0 < color1) { swap(ref maxColor, ref minColor); swap(ref color0, ref color1); } dxtBlock.col0 = new Color16(color0); dxtBlock.col1 = new Color16(color1); dxtBlock.indices = computeIndices4(block, maxColor, minColor); optimizeEndPoints4(block, dxtBlock); } }