/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   2009/X/X - 2014/01/14
/// 
/// @brief  メッシュデータ構造。
/// 
/// ****************************************************************************


#include "CPL_CDI_MeshData.h"


namespace CPL {
namespace CDI {



// _____________________________________________________________________________
/// @brief LightMaterial デフォルトコンストラクタ
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MeshData::LightMaterial::LightMaterial()
{
}


// _____________________________________________________________________________
/// @brief LightMaterial コピーコンストラクタ
/// 
/// @param[in] in_data : コピー元のLightMaterialオブジェクトを指定します。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MeshData::LightMaterial::LightMaterial( cref<LightMaterial> in_data )
  : td_base( in_data )
{
  m_vec_pos = in_data.m_vec_pos;
  m_vec_rot = in_data.m_vec_rot;
  m_color   = in_data.m_color;
  m_power   = in_data.m_power;
  m_theta   = in_data.m_theta;
  m_phi     = in_data.m_phi;
  m_type    = in_data.m_type;
  m_wp_relation_keylist_pos   = in_data.m_wp_relation_keylist_pos;
  m_wp_relation_keylist_rot   = in_data.m_wp_relation_keylist_rot;
  m_wp_relation_keylist_color = in_data.m_wp_relation_keylist_color;
  m_wp_relation_keylist_power = in_data.m_wp_relation_keylist_power;
  m_wp_relation_matrix        = in_data.m_wp_relation_matrix;
}


// _____________________________________________________________________________
/// @brief LightMaterial ムーブコンストラクタ
/// 
/// @param[in] in_data : ムーブ元のLightMaterialオブジェクトを指定します。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MeshData::LightMaterial::LightMaterial( rvref<LightMaterial> in_data )
  : td_base( std::move(in_data) )
{
  m_vec_pos = in_data.m_vec_pos;
  m_vec_rot = in_data.m_vec_rot;
  m_color   = in_data.m_color;
  m_power   = in_data.m_power;
  m_theta   = in_data.m_theta;
  m_phi     = in_data.m_phi;
  m_type    = in_data.m_type;
  m_wp_relation_keylist_pos   = std::move(in_data.m_wp_relation_keylist_pos  );
  m_wp_relation_keylist_rot   = std::move(in_data.m_wp_relation_keylist_rot  );
  m_wp_relation_keylist_color = std::move(in_data.m_wp_relation_keylist_color);
  m_wp_relation_keylist_power = std::move(in_data.m_wp_relation_keylist_power);
  m_wp_relation_matrix        = std::move(in_data.m_wp_relation_matrix       );
}


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ライトマテリアル　データ読み込み
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void
  MeshData::LightMaterial::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
    )
{
  // 
  char_cptr ptr_data_addr = reinterpret_cast<char_cptr>(in_ptr_chunk);
  auto*
    ptr_info_light =
      reinterpret_cast<MFI_LightMaterial const*>(ptr_data_addr);
  // データポインタ登録
  io_table_for_data_pointer.Add( ptr_info_light->m_GID, this->GetLinkMyself() );
  // チャンクポインタ登録
  io_table_for_chunk_pointer.Add( this, in_ptr_chunk );
  // データ設定
  m_vec_pos = ptr_info_light->m_vec_pos;
  m_vec_rot = ptr_info_light->m_vec_rot;
  m_color   = CVector3
                ( ptr_info_light->m_color.GetR() / 255.0f
                , ptr_info_light->m_color.GetG() / 255.0f
                , ptr_info_light->m_color.GetB() / 255.0f
                );
  m_power   = ptr_info_light->m_power;
  m_theta   = ptr_info_light->m_theta;
  m_phi     = ptr_info_light->m_phi;
  m_type    = ptr_info_light->m_light_type;
}


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ライト　関連付けデータ
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void
  MeshData::LightMaterial::zzf_setupRelation_
    ( rio<Array_DataSPtr> io_table_for_data_pointer
    , rio<Array_ChunkPtr> io_table_for_chunk_pointer 
    )
{
  MeshFileInfo::Chunk const** pp_chunk_info = io_table_for_chunk_pointer.Find( this );
  if( !pp_chunk_info  ||  !*pp_chunk_info )
  {
    return;
  }
  MFI_LightMaterial const* ptr_info_light =
    static_cast<MFI_LightMaterial const*>(*pp_chunk_info);

  void_sptr* psp_data;
  // 座標キーリスト
  psp_data = io_table_for_data_pointer.Find( ptr_info_light->m_GID_keylist_pos );
  m_wp_relation_keylist_pos =
    psp_data ? std::static_pointer_cast<AnmKeyList>(*psp_data)
             : nullptr;

  // 角度キーリスト
  psp_data = io_table_for_data_pointer.Find( ptr_info_light->m_GID_keylist_rot );
  m_wp_relation_keylist_rot =
    psp_data ? std::static_pointer_cast<AnmKeyList>(*psp_data)
             : nullptr;

  // カラーキーリスト
  psp_data = io_table_for_data_pointer.Find( ptr_info_light->m_GID_keylist_power );
  m_wp_relation_keylist_color =
    psp_data ? std::static_pointer_cast<AnmKeyList>(*psp_data)
             : nullptr;

  // パワーキーリスト
  psp_data = io_table_for_data_pointer.Find( ptr_info_light->m_GID_keylist_power );
  m_wp_relation_keylist_power =
    psp_data ? std::static_pointer_cast<AnmKeyList>(*psp_data)
             : nullptr;

  // 属するマトリクス
  psp_data = io_table_for_data_pointer.Find( ptr_info_light->m_GID_relation_matrix );
  m_wp_relation_matrix =
    psp_data ? std::static_pointer_cast<baseData>(*psp_data)
             : nullptr;

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

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ライト　後始末
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void MeshData::LightMaterial::Release()
{
}




} // namespace CDI
} // namespace CPL



