// File: crn_dxt_endpoint_refiner.h
// See Copyright Notice and license at the end of inc/crnlib.h
#pragma once
#include "crn_dxt.h"

namespace crnlib
{
   // TODO: Experimental/Not fully implemented
   class dxt_endpoint_refiner
   {
   public:
      dxt_endpoint_refiner();

      struct params
      {
         params() :
            m_block_index(0),
            m_pPixels(NULL),
            m_num_pixels(0),
            m_pSelectors(NULL),
            m_alpha_comp_index(0),
            m_error_to_beat(cUINT64_MAX),
            m_dxt1_selectors(true),
            m_perceptual(true),
            m_highest_quality(true)
         {
         }

         uint                 m_block_index;

         const color_quad_u8* m_pPixels;
         uint                 m_num_pixels;

         const uint8*         m_pSelectors;

         uint                 m_alpha_comp_index;

         uint64               m_error_to_beat;

         bool                 m_dxt1_selectors;
         bool                 m_perceptual;
         bool                 m_highest_quality;
      };

      struct results
      {
         uint16   m_low_color;
         uint16   m_high_color;
         uint64   m_error;
      };

      bool refine(const params& p, results& r);

   private:
      const params* m_pParams;
      results* m_pResults;

      void optimize_dxt1(vec3F low_color, vec3F high_color);
      void optimize_dxt5(vec3F low_color, vec3F high_color);
   };

} // namespace crnlib