/*
블로그에 공부 관련 글을 않 올릴려고 했는데 어익후.
그런 위주로 사용하는 네이버 블로그 용량이 않되잖아! 버럭. 유유
별 것도 아닌거 같고 애 먹은건 라이브러리 추가이다. 프로젝트 옵션에서 지정하면 코드상에서는 알 수 없기 때문에 코드상에 추가해놨다.
*/
//----------------------------------------------------------------------------
#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) | 2007/06/18 |
|---|---|
| 브레즌햄 픽킹 알고리즘. (0) | 2007/06/12 |
| CEGUI-Create Render. (0) | 2007/06/05 |
| 가상함수와 다형성 그리고 생성자와 소멸자의 내부적인 호출에 관한 코드 (0) | 2007/05/22 |
| 맵툴 히스토리 (0) | 2007/05/16 |
| 3D 그래픽스 프로그래밍 스터디 모임 시작. (0) | 2007/05/13 |
CEGUI-CreateRender.zip
CEGUI.a00
이올린에 북마크하기
이올린에 추천하기