/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   2009/X/X - 2015/11/13
/// 
/// @brief  メッシュデータ構造
/// 
/// ****************************************************************************

#include "CPL_CDI_MeshData.h"


namespace CPL {
namespace CDI {


// _____________________________________________________________________________
/// @brief ColorMaterial デフォルトコンストラクタ
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MeshData::ColorMaterial::ColorMaterial()
{
  for( int i = 0; i < MeshFileInfo::kCOLOR_MTRL_PARAM_NUM; ++i )
  {
    m_color[ i ] = float4(1,1,1,1);
  }
}


// _____________________________________________________________________________
/// @brief ColorMaterial コピーコンストラクタ
/// 
/// @param[in] in_data : コピー元のColorMaterialオブジェクトを指定します。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MeshData::ColorMaterial::ColorMaterial( cref<ColorMaterial> in_data )
  : td_base( in_data )
{
  for( int i = 0; i < MeshFileInfo::kCOLOR_MTRL_PARAM_NUM; ++i )
  {
    m_wp_relation_keylist_color[ i ] = in_data.m_wp_relation_keylist_color[ i ];
    m_color[ i ] = in_data.m_color[ i ];
  }
}


// _____________________________________________________________________________
/// @brief ColorMaterial ムーブコンストラクタ
/// 
/// @param[in] in_data : ムーブ元のColorMaterialオブジェクトを指定します。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MeshData::ColorMaterial::ColorMaterial( rvref<ColorMaterial> in_data )
  : td_base( std::move(in_data) )
{
  for( int i = 0; i < MeshFileInfo::kCOLOR_MTRL_PARAM_NUM; ++i )
  {
    m_wp_relation_keylist_color[ i ] =
      std::move(in_data.m_wp_relation_keylist_color[ i ]);
    m_color[ i ] = in_data.m_color[ i ];
  }
}


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// カラーマテリアル
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void
  MeshData::ColorMaterial::zzf_setupData_by_File_
    ( pin<MeshFileInfo::Chunk> in_ptr_chunk
    , rio<Array_DataSPtr     > io_table_for_data_pointer
    , rio<Array_ChunkPtr     > io_table_for_chunk_pointer
    )
{
  for
    ( int mtrl_param_idx = 0
    ; mtrl_param_idx < MeshFileInfo::kCOLOR_MTRL_PARAM_NUM
    ; ++mtrl_param_idx
    )
  {
    m_wp_relation_keylist_color[ mtrl_param_idx ].reset();
  }

  char_cptr ptr_data_addr = reinterpret_cast<char_cptr>(in_ptr_chunk);
  MFI_ColorMaterial const* ptr_info_color_mtrl =
    reinterpret_cast<MFI_ColorMaterial const*>(ptr_data_addr);
  // データポインタ登録
  io_table_for_data_pointer.Add( ptr_info_color_mtrl->m_GID, this->GetLinkMyself() );
  // チャンクポインタ登録
  io_table_for_chunk_pointer.Add( this, in_ptr_chunk );
  // データ設定
  for( int param_idx = 0; param_idx < MeshFileInfo::kCOLOR_MTRL_PARAM_NUM; ++param_idx )
  {
    DWORD r = GetRed  (ptr_info_color_mtrl->m_param[ param_idx ].color);
    DWORD g = GetGreen(ptr_info_color_mtrl->m_param[ param_idx ].color);
    DWORD b = GetBlue (ptr_info_color_mtrl->m_param[ param_idx ].color);
    DWORD a = GetAlpha(ptr_info_color_mtrl->m_param[ param_idx ].color);
    this->m_color[ param_idx ] = float4( r/255.0f, g/255.0f, b/255.0f, a/255.0f );
  }
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// カラーマテリアル　関連付けデータ設定
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void
  MeshData::ColorMaterial::zzf_setupRelation_
    ( rio<Array_DataSPtr> io_table_for_data_pointer
    , rio<Array_ChunkPtr> io_table_for_chunk_pointer
    )
{
  const MeshFileInfo::Chunk** pp_chunk = io_table_for_chunk_pointer.Find( this );
  if( !pp_chunk )
  {
    return;
  }
  MFI_ColorMaterial const* ptr_color_mtrl =
    static_cast<MFI_ColorMaterial const*>(*pp_chunk);
  if( !ptr_color_mtrl )
  {
    return;
  }
  
  for( int mtrl_param_idx = 0;
       mtrl_param_idx < MeshFileInfo::kCOLOR_MTRL_PARAM_NUM;
       ++mtrl_param_idx )
  {
    // カラーキーリスト
    void_sptr*
      psp_data =
        io_table_for_data_pointer.Find(
           ptr_color_mtrl->m_param[ mtrl_param_idx ].GID );
    m_wp_relation_keylist_color[ mtrl_param_idx ] =
      psp_data ? std::static_pointer_cast<AnmKeyList>(*psp_data)
               : nullptr;
  }

//  m_ptr_info_material = nullptr; // ファイルデータへのポインタをクリア
}




} // namespace CDI
} // namespace CPL



