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