/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   2015/08/08 - 2015/08/11
/// 
/// @brief  描画テクスチャ関連
/// 
/// ****************************************************************************

#pragma once

#include "CPL_DX_Kernel.h"


namespace CPL {
namespace DX {


// _____________________________________________________________________________
/// @brief 描画用２Dテクスチャクラス
///
// *****************************************************************************
class RenderTexture
{
public:
  RenderTexture(){}
  RenderTexture
  ( _in<size_t       > in_width
  , _in<size_t       > in_height
  , _in<DXGI_FORMAT  > in_format_color = DXGI_FORMAT_R8G8B8A8_UNORM
  , _in<DXGI_FORMAT  > in_format_depth = DXGI_FORMAT_D24_UNORM_S8_UINT
  );
  RenderTexture( cref<RenderTexture> in_render_texture );

  RenderTexture& operator = ( cref<RenderTexture> in_render_tex )
  {
    if( &in_render_tex != this )
    {
      m_cp_tex_color            = in_render_tex.m_cp_tex_color;
      m_cp_view_shader_resource = in_render_tex.m_cp_view_shader_resource;
      m_cp_view_render_target   = in_render_tex.m_cp_view_render_target;
      m_cp_tex_depth_stencil    = in_render_tex.m_cp_tex_depth_stencil;
      m_cp_view_depth_stencil   = in_render_tex.m_cp_view_depth_stencil;
    }
    return *this;
  }

  bool
    Create
      ( _in<size_t     > in_width
      , _in<size_t     > in_height
      , _in<DXGI_FORMAT> in_format_color = DXGI_FORMAT_R8G8B8A8_UNORM
      , _in<DXGI_FORMAT> in_format_depth = DXGI_FORMAT_D24_UNORM_S8_UINT
      );
  bool
    Resize( _in<size_t> in_width, _in<size_t> in_height );

  bool ChangeTarget();
  void ClearColor( _in<float4> in_rgba );
  void ClearDepthStencil( _in<float> in_depth, _in<U8> in_stencil );
  void ClearDepth( _in<float> in_depth );
  void ClearStencil( _in<U8> in_stencil );

  /// シェーダーリソースビューの取得
  DX::CpDXShaderResourceView
       GetShaderResourceView() const { return m_cp_view_shader_resource; }
  /// レンダリングターゲットビュー取得
  DX::CpDXRenderTargetView
       GetRenderTargetView() const { return m_cp_view_render_target; }
  /// クライアント領域用の震度ステンシルバッファ。
  DX::CpDXDepthStencilView
       GetDepthStencilView() const { return m_cp_view_depth_stencil; }
protected:
  //
  DX::CpDXTexture2D           m_cp_tex_color;
  /// レンダリング画像保持用テクスチャリソース。\n
  /// ※ レンダリングターゲットビューとも関連付けられるが、直接参照できると
  ///    都合が良いので、ポインタを保持しておく。
  DX::CpDXShaderResourceView  m_cp_view_shader_resource;
  /// レンダリングターゲットビュー。
  DX::CpDXRenderTargetView    m_cp_view_render_target;

  ///
  DX::CpDXTexture2D           m_cp_tex_depth_stencil;
  /// 震度ステンシルバッファ。
  DX::CpDXDepthStencilView    m_cp_view_depth_stencil;
};


} // namespace DX
} // namespace CPL
