/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   200X/X/X - 2014/01/24
/// 
/// @brief  DirectGraphics全般。
/// 
/// ****************************************************************************

#pragma once

#include "../Win/CPL_WINDOWS.h"

#include "CPL_DX_Kernel.h"

#include "CPL_DX_VertexTypes.h"
#include "CPL_DX_Viewport.h"
#include "CPL_DX_Projection.h"
#include "CPL_DX_Camera.h"
#include "CPL_DX_RasterizerState.h"
#include "CPL_DX_SamplerState.h"
#include "CPL_DX_BlendState.h"
#include "CPL_DX_DepthStencilState.h"

#include "CPL_DX_Buffer.h"
#include "CPL_DX_Shader_VS.h"
#include "CPL_DX_Shader_PS.h"
//
//#include "CPL_DX_Window.h"


namespace CPL {
namespace DX {



//inline void
//  SetTextureColorStage(
//    DXDevice*  in_ptr_dev,
//    int           in_stage,
//    DWORD         in_op,
//    DWORD         in_arg1,
//    DWORD         in_arg2 )
//{
//  in_ptr_dev->SetTextureStageState( in_stage, D3DTSS_COLOROP, in_op );
//  in_ptr_dev->SetTextureStageState( in_stage, D3DTSS_COLORARG1, in_arg1 );
//  in_ptr_dev->SetTextureStageState( in_stage, D3DTSS_COLORARG2, in_arg2 );
//}


//inline void
//  SetTextureAlphaStage(
//    DXDevice*  in_ptr_dev,
//    int           in_stage,
//    DWORD         in_op,
//    DWORD         in_arg1,
//    DWORD         in_arg2 )
//{
//  in_ptr_dev->SetTextureStageState( in_stage, D3DTSS_ALPHAOP, in_op );
//  in_ptr_dev->SetTextureStageState( in_stage, D3DTSS_ALPHAARG1, in_arg1 );
//  in_ptr_dev->SetTextureStageState( in_stage, D3DTSS_ALPHAARG2, in_arg2 );
//}




// _____________________________________________________________________________
/// @brief Graphics 管理クラス
///
// *****************************************************************************
class Graphics
  : public Graphics_i_
{
protected:
private:
  typedef Core::Array::Dynamic< cptr<DX::Window> >  WindowPointerTable; // ※ 型はスマートポインタにしてはいけない（Graphicsがウィンドウの寿命に関連するとややこしい）
  typedef Core::List::DoublyChain< GISwapChain* >   SwapChainTable;

  sdptr<DX::Window>  m_sp_auto_window; // 自動生成ウィンドウ用（スマートポインタなのはデストラクタを呼ぶため）
  WindowPointerTable m_window_table;   // 関連付けられたウィンドウのテーブル

protected:

public:
  // 初期化周り
  bool Create( _in<CreateDeviceInfo> io_create_info ) override;

  // 解放
  void Release() override;

  // ウィンドウ関連
  cptr<DX::Window> GetWindow( _in<int> in_index ) const override;
  //ptr<DX::Window>  GetWindow( int in_index );
  size_t           GetWindowNum() const override { return m_window_table.GetNum(); }
  HRESULT          AddWindow( DX::Window* in_ptr_dx_window ) override;
  void             SendDestroyWindow( DX::Window* in_ptr_dx_window ) override;

  // 取得
  //int2 GetMaxViewSize() const;
  //int  GetDepthBufferSize( u_int2* out_ptr_size, int in_window_idx = 0 ) const;
  //UINT GetAdapterCount() const;
  int  EnumAdapters( AdapterTable& out_adapter_table ) const override;

  Graphics
  ( DXDevice*        in_ptr_d3d_dev = nullptr
  , DXDeviceContext* in_ptr_d3d_IC  = nullptr
  );
  virtual ~Graphics();
};




} // namespace DX
} // namespace CPL
