Exemple #1
0
        protected ClusterFit(ColourSet colours, SquishOptions flags)
            : base(colours, flags)
        {
            // Set the iteration count.
            _IterationCount = flags.HasFlag(SquishOptions.ColourIterativeClusterFit) ? MaxIterations : 1;

            // Initialise the best error.
            _BestError = new Vector4(float.MaxValue);

            // Initialize the metric
            var perceptual = flags.HasFlag(SquishOptions.ColourMetricPerceptual);

            if (perceptual)
            {
                _Metric = new Vector4(0.2126f, 0.7152f, 0.0722f, 0.0f);
            }
            else
            {
                _Metric = new Vector4(1.0f);
            }

            // Get the covariance matrix.
            var covariance = Sym3x3.ComputeWeightedCovariance(colours.Count, colours.Points, colours.Weights);

            // Compute the principle component
            _Principle = Sym3x3.ComputePrincipledComponent(covariance);
        }
        public static byte[] CompressBlockMasked(byte[] rgba, int mask, SquishOptions flags)
        {
            flags = flags.FixFlags();

            ColourSet colours = new ColourSet(rgba, mask, flags);

            if (colours.Count == 1)
            {
                // Always do a single colour fit
                //SingleColourFit fit = new SingleColourFit(ref colours, flags);
            }
            else if (flags.HasFlag(SquishOptions.ColourRangeFit) || colours.Count == 0)
            {
                // Do a range fit
                //RangeFit fit = new RangeFit(ref colours, flags, metric);
            }
            else
            {
                // Default to a cluster fit (could be iterative or not)
                //ClusterFit fit = new ClusterFit(ref colours, flags, metric);
            }

            // Compress alpha separately if needed
            if (flags.HasFlag(SquishOptions.DXT3))
            {
                //Alpha.CompressAlphaDxt3(rgba, mask, alphaBlock);
            }
            else if (flags.HasFlag(SquishOptions.DXT5))
            {
                //Alpha.CompressAlphaDxt5(rgba, mask, alphaBlock);
            }

            throw new NotImplementedException();
        }
        private SingleColourFit(ColourSet colours, SquishOptions flags)
            : base(colours, flags)
        {
            Vector3 values = this._Colours.Points[0];

            this.colour[0] = (byte)FloatToInt(255.0f * values.X, 255);
            this.colour[1] = (byte)FloatToInt(255.0f * values.Y, 255);
            this.colour[2] = (byte)FloatToInt(255.0f * values.Z, 255);

            this.bestError = int.MaxValue;
        }