/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   2010/X/X - 2017/02/01
/// 
/// @brief  描画コンポーネント。
/// 
/// ****************************************************************************

#pragma once

#include "CPL_GUC_Layer.h"


namespace CPL {
namespace GUC {

typedef Container CPl_GUC_RENDER_BOX_BASE;
// _____________________________________________________________________________
/// @brief レンダリング用矩形クラス
/// 
/// レンダリング用テクスチャと、配置レイヤーを管理する。
/// なお、基本的にはRenderBoxではなくRenderClientを用いること。
///
// *****************************************************************************
class RenderBox final
  : public Container
{
  using td_base = Container;
  using td_self = RenderBox;
  friend Factory<td_self>;
  friend CallPrivateConstructor<td_self>;
public:
  //CPL_GUC_DECL_BASIC_SMARTPOINTER( RenderBox );

private:
  static int zzf_GetClassLevel(){
    return CPl_GUC_RENDER_BOX_BASE::zzf_GetClassLevel() + 1; }

  // 最終レンダリング用スプライトマネージャ
  using SpSpriteMng = sdptr<DX::SpriteDrawManager>;
  CPL_SINGLETON_INIT
    ( SpSpriteMng
    , sm_sp_render_sprite
    , CPL_MAKE_SHARED(CPL::DX::SpriteDrawManager)
    )

  ///// クライアント領域のレンダリング画像保持用テクスチャ。\n
  ///// ※ レンダリングターゲットビューとも関連付けられるが、直接参照できると
  /////    都合が良いので、ポインタを保持しておく。
  //DX::CpDXShaderResourceView  m_cp_render_texture;
  ///// クライアント領域のレンダリングターゲットビュー。
  //DX::CpDXRenderTargetView    m_cp_render_target_view;
  ///// クライアント領域用の震度ステンシルバッファ。
  //DX::CpDXDepthStencilView    m_cp_depth_stencil_view;
  DX::RenderTexture m_render_texture;
  // アイテム配置用レイヤー（オフセット簡易化等のため）
  sdptr<Layer> m_sp_layer_item;

  virtual void
    zzf_setupRenderTarget_
      ( _in<float> in_width
      , _in<float> in_height
      );

  virtual float2
    On_Paint
      ( _in<sdptr<Component>> in_sp_draw_owner
      , _in<float2          > in_pos_offs
      ) override;
  eEventReturnID
    On_Size( _in<sdptr<Component>> in_sp_component ) override;
  virtual bool
    SetupRenderTarget();

protected:
  // _____________________________________________________________________________
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  RenderBox
  ( _in<sdptr<Component>> in_sp_component_for_parent
  , _in<float2          > in_position_for_component
  , _in<float2          > in_size_for_component
  );
  // _____________________________________________________________________________
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  RenderBox( cref<RenderBox> in_render_box );

public:
  // _____________________________________________________________________________
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ~RenderBox();

  // _____________________________________________________________________________
  /// @brief レンダリングテクスチャの取得
  /// 
  /// @return レンダリングテクスチャを返します。
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  virtual DX::RenderTexture const&
    GetRenderTexture() const { return m_render_texture; }
  /// @copydoc GetRenderTexture()const
  virtual DX::RenderTexture&
    GetRenderTexture(){ return m_render_texture; }

  // _____________________________________________________________________________
  /// @brief アイテムレイヤーの取得
  /// 
  /// @return アイテムレイヤーを指すスマートポインタを返します。
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  sdptr<Layer>
    GetComponent_ItemLayer() const { return m_sp_layer_item; }

  // _____________________________________________________________________________
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  sdptr<Component>
    CreateClone
      ( _in<sdptr<Component>> in_sp_component_for_parent       = nullptr
      , _in<float2          > in_offset_position_from_original = float2{0,0}
      ) const override;
};


//CPL_GUC_DECL_BASIC_SMARTPOINTER( RenderBox );



} // namespace GUC
} // namespace CPL
