/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   200X/X/X - 2016/11/30
/// 
/// @brief  深度ステンシルステートヘルパークラス関連。
/// 
/// ****************************************************************************


#include "CPL_DX_Exception.h"
#include "CPL_DX_DepthStencilState.h"


namespace CPL {
namespace DX {


// _____________________________________________________________________________
/// @brief コンストラクタ
/// 
/// @param[in] in_depth_stencil_desc : 深度ステンシル情報構造体を指定します。
/// @param[in] in_stencil_ref
///   : 深度ステンシル テストの実行時に基準として使用される参照値です。\n
///   : OMSetDepthStencilStateに渡しているだけなので、詳細は検索してください。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DepthStencilState::DepthStencilState
( _in<DX_DEPTH_STENCIL_DESC> in_depth_stencil_desc
, _in<UINT                 > in_stencil_ref
)
{

  HRESULT hr = Create( in_depth_stencil_desc, in_stencil_ref );
  CPL_THROW_FAILED( hr, "CorePLi DirectX DepthStencilState error\n" );
}


// _____________________________________________________________________________
/// @brief デストラクタ
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DepthStencilState::~DepthStencilState()
{
  RELEASE( m_ptr_depth_stencil_state );
}



// _____________________________________________________________________________
/// @brief 深度ステンシルステートの構築
/// 
/// @param[in] in_depth_stencil_desc : 深度ステンシル情報構造体を指定します。
/// @param[in] in_stencil_ref
///   : 深度ステンシル テストの実行時に基準として使用される参照値です。\n
///   : OMSetDepthStencilStateに渡しているだけなので、詳細は検索してください。
/// 
/// @return
/// DirectXのリターンコード(HRESULT型)を返します。\n
/// CreateDepthStencilStateの返却値となります。詳細は検索してください。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HRESULT
  DepthStencilState::Create
    ( _in<DX_DEPTH_STENCIL_DESC> in_depth_stencil_desc
    , _in<UINT                 > in_stencil_ref
    )
{
  m_stencil_ref = in_stencil_ref;

  auto& cp_dev = Graphics_i_::GetDevice();
  CPL_DBG_OUTPUT_RETURN_VALUE_IF
    ( !cp_dev, E_POINTER
    , SwS("DX device pointer is invalid.\n\t -> CPL::DX::DepthStencilState::Create()\n")
    );

  HRESULT hr =
    cp_dev->CreateDepthStencilState
      ( &in_depth_stencil_desc
      , &m_ptr_depth_stencil_state
      );

  return hr;
}


// _____________________________________________________________________________
/// @brief 描画準備コールバック関数
/// 
/// ※ 基本的にユーザーが呼び出す必要はありません。
/// 
/// @return 必ずS_OKが返ります。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HRESULT DepthStencilState::RenderSetup( DXDeviceContext* in_ptr_d3d_IC )
{
  in_ptr_d3d_IC->OMSetDepthStencilState
    ( m_ptr_depth_stencil_state
    , m_stencil_ref
    );

  return S_OK;
}


}
} // namespace CPL