//----------------------------------------------------------------------------
/*
블로그에 공부 관련 글을 않 올릴려고 했는데 어익후.
그런 위주로 사용하는 네이버 블로그 용량이 않되잖아! 버럭. 유유
별 것도 아닌거 같고 애 먹은건 라이브러리 추가이다. 프로젝트 옵션에서 지정하면 코드상에서는 알 수 없기 때문에 코드상에 추가해놨다.
*/
//----------------------------------------------------------------------------

#include <d3d9.h>

//-----------------------------------------------------------------------------
// 헤더와 namespace를 선언한다.
#include "CEGUI.h"
#include "renderers/directx9GUIRenderer/d3d9renderer.h"
using namespace CEGUI;

//-----------------------------------------------------------------------------
// 라이브러리를 링크 시킨다. 편의상 코드상에서 추가하겠습니다.
// 아래의 코드를 실행하기 위해서는 "CEGUIBase_d.lib" "DirectX9GUIRenderer_d.lib"
// 가 필요합니다.
#pragma comment (lib, "DirectX9GUIRenderer_d.lib")
#pragma comment (lib, "CEGUIBase_d.lib")


//-----------------------------------------------------------------------------
// 전역 변수
//-----------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D   = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device
HWND     g_hWnd   = NULL;


//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
 // Create the D3D object, which is needed to create the D3DDevice.
 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
  return E_FAIL;

 // Set up the structure used to create the D3DDevice. Most parameters are
 // zeroed out. We set Windowed to TRUE, since we want to do D3D in a
 // window, and then set the SwapEffect to "discard", which is the most
 // efficient method of presenting the back buffer to the display.  And
 // we request a back buffer format that matches the current desktop display
 // format.
 D3DPRESENT_PARAMETERS d3dpp;
 ZeroMemory( &d3dpp, sizeof(d3dpp) );
 d3dpp.Windowed = TRUE;
 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
 d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

 // Create the Direct3D device. Here we are using the default adapter (most
 // systems only have one, unless they have multiple graphics hardware cards
 // installed) and requesting the HAL (which is saying we want the hardware
 // device rather than a software one). Software vertex processing is
 // specified since we know it will work on all cards. On cards that support
 // hardware vertex processing, though, we would see a big performance gain
 // by specifying hardware vertex processing.
 if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  &d3dpp, &g_pd3dDevice ) ) )
 {
  return E_FAIL;
 }

 // Device state would normally be set here
 // GUI렌더러 초기화

 return S_OK;
}



//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
 if( g_pd3dDevice != NULL)
  g_pd3dDevice->Release();

 if( g_pD3D != NULL)
  g_pD3D->Release();
}


//-----------------------------------------------------------------------------
// Name: initGUI()
// Desc: GUI객체를 초기화한다.
//-----------------------------------------------------------------------------
void initGUI()
{
 // 1. 사용하는 모듈에 따른 렌더러를 생성한다.
 CEGUI::DirectX9Renderer* myRenderer =   new CEGUI::DirectX9Renderer(g_pd3dDevice, 3000);
 // 2. CEGUI::System오브젝트를 동적할당 하고 생성된 렌더러에 대한 포인터를 넘긴다
 new CEGUI::System(myRenderer);
}


//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Draws the scene
//-----------------------------------------------------------------------------
VOID Render()
{
 if( NULL == g_pd3dDevice )
  return;

 CEGUI::System& guiSystem = CEGUI::System::getSingleton();
 // Clear the backbuffer to a blue color
 g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

 // Begin the scene
 if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
 {
  // 3. CEGUI::System::renderGUI메서드는 마지막 부분에서 호출해야 한다.
  guiSystem.renderGUI();
  // End the scene
  g_pd3dDevice->EndScene();
 }

 // Present the backbuffer contents to the display
 g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}



//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window's message handler
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
 switch( msg )
 {
 case WM_DESTROY:
  Cleanup();
  PostQuitMessage( 0 );
  return 0;

 case WM_PAINT:
  Render();
  ValidateRect( hWnd, NULL );
  return 0;
 }

 return DefWindowProc( hWnd, msg, wParam, lParam );
}



//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
 // Register the window class
 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
  GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
  "D3D Tutorial", NULL };
 RegisterClassEx( &wc );

 // Create the application's window
 HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice",
  WS_OVERLAPPEDWINDOW, 100, 100, 640, 480,
  GetDesktopWindow(), NULL, wc.hInstance, NULL );
 g_hWnd = hWnd;

 // Initialize Direct3D
 if( SUCCEEDED( InitD3D( hWnd ) ) )
 {
  initGUI();
  // Show the window
  ShowWindow( hWnd, SW_SHOWDEFAULT );
  UpdateWindow( hWnd );

  /// 메시지 루프
  MSG msg;
  ZeroMemory( &msg, sizeof(msg) );
  while( msg.message!=WM_QUIT )
  {
   /// 메시지큐에 메시지가 있으면 메시지 처리
   if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
   {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
   }
   else
    /// 처리할 메시지가 없으면 Render()함수 호출
    Render();
  }
 }


 UnregisterClass( "D3D Tutorial", wc.hInstance );
 return 0;
}


이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License