Пример #1
0
        static float computeAlphaError(BC5Block src, BC5Block dst, float bestError = float.MaxValue)
        {
            //byte[] alphas = new byte[8];
            //dst.evaluatePalette(alphas, false); // @@ Use target decoder.

            float totalError = 0;

            //for (uint i = 0; i< 16; i++)
            //{
            //    byte alpha = src.alpha[i];

            //    int minDist = int.MaxValue;
            //    for (uint p = 0; p< 8; p++)
            //    {
            //        int dist = alphaDistance(alpha, alphas[p]);
            //        minDist = Math.Min(dist, minDist);
            //    }

            //    totalError += minDist* src.weights[i];

            //    if (totalError > bestError)
            //    {
            //        // early out
            //        return totalError;
            //    }
            //}

            return(totalError);
        }
Пример #2
0
        internal static void CompressBC5Block(BC5Block src, BC5Block dst)
        {
            //byte mina = 255;
            //byte maxa = 0;

            //byte mina_no01 = 255;
            //byte maxa_no01 = 0;

            //// Get min/max alpha.
            //for (uint i = 0; i < 16; i++)
            //{
            //    byte alpha = src.alpha[i];
            //    mina = Math.Min(mina, alpha);
            //    maxa = Math.Max(maxa, alpha);

            //    if (alpha != 0 && alpha != 255)
            //    {
            //        mina_no01 = Math.Min(mina_no01, alpha);
            //        maxa_no01 = Math.Max(maxa_no01, alpha);
            //    }
            //}

            //if (maxa - mina < 8)
            //{
            //    dst.alpha0 = maxa;
            //    dst.alpha1 = mina;

            //    //nvDebugCheck(computeAlphaError(src, dst) == 0);
            //}
            //else if (maxa_no01 - mina_no01 < 6)
            //{
            //    dst.alpha0 = mina_no01;
            //    dst.alpha1 = maxa_no01;

            //    //nvDebugCheck(computeAlphaError(src, dst) == 0);
            //}
            //else
            //{
            //    float besterror = computeAlphaError(src, dst);
            //    int besta0 = maxa;
            //    int besta1 = mina;

            //    // Expand search space a bit.
            //    const byte alphaExpand = 8;
            //    mina = (byte)((mina <= alphaExpand) ? 0 : mina - alphaExpand);
            //    maxa = (byte)((maxa >= 255 - alphaExpand) ? (byte)255 : maxa + alphaExpand);

            //    for (int a0 = mina + 9; a0 < maxa; a0++)
            //    {
            //        for (int a1 = mina; a1 < a0 - 8; a1++)
            //        {
            //            //nvDebugCheck(a0 - a1 > 8);

            //            dst.alpha0 = (byte)a0;
            //            dst.alpha1 = (byte)a1;
            //            float error = computeAlphaError(src, dst, besterror);

            //            if (error < besterror)
            //            {
            //                besterror = error;
            //                besta0 = a0;
            //                besta1 = a1;
            //            }
            //        }
            //    }

            //    // Try using the 6 step encoding.
            //    /*if (mina == 0 || maxa == 255)*/
            //    {

            //        // Expand search space a bit.
            //        const int alphaExpand = 6;
            //        mina_no01 = (mina_no01 <= alphaExpand) ? 0 : mina_no01 - alphaExpand;
            //        maxa_no01 = (maxa_no01 >= 255 - alphaExpand) ? 255 : maxa_no01 + alphaExpand;

            //        for (int a0 = mina_no01 + 9; a0 < maxa_no01; a0++)
            //        {
            //            for (int a1 = mina_no01; a1 < a0 - 8; a1++)
            //            {
            //                nvDebugCheck(a0 - a1 > 8);

            //                dst->alpha0 = a1;
            //                dst->alpha1 = a0;
            //                float error = computeAlphaError(src, dst, besterror);

            //                if (error < besterror)
            //                {
            //                    besterror = error;
            //                    besta0 = a1;
            //                    besta1 = a0;
            //                }
            //            }
            //        }
            //    }

            //    dst->alpha0 = besta0;
            //    dst->alpha1 = besta1;
            //}

            //computeAlphaIndices(src, dst);
        }