Directx9 + CEGUI (0.8.2)

Directx9 + CEGUI (0.8.2)

CEGUI (0.8.2) 的設定請看這裡
http://blog.xuite.net/kamory0931/fightdreamer/84924124

DirectX9.0 最簡單的程式碼在這裡
http://blog.xuite.net/kamory0931/fightdreamer/59899354

環境
Windows 7 64-bit
Visual Studio 2010
Microsoft DirectX SDK (June 2010)
CEGUI 0.8.2

首先建立執行環境
把這些資料夾裡的東西通通放到同一個資料夾底下
程式將在這個資料夾底下執行

CEGUI-0.8.2\bin  <-主要是DLL
CEGUI-0.8.2\dependencies\bin  <-主要是DLL
cegui-0.8.2-src\datafiles <- copy 整個 datafiles 資料夾

再建立程式編譯環境
Include
D:\CEGUI\CEGUI-0.8.2\dependencies\include
D:\CEGUI\CEGUI-0.8.2\cegui\include
C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include

Lib
D:\CEGUI\CEGUI-0.8.2\dependencies\lib\static
D:\CEGUI\CEGUI-0.8.2\dependencies\lib\dynamic
D:\CEGUI\CEGUI-0.8.2\lib
C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86

main.h

#ifndef __MAIN_H
#define __MAIN_H

//windows 相關
#include <stdio.h>
#include <windows.h>
#include <tchar.h>

//directx 相關
#include <d3d9.h>
#include <d3dx9.h>

//CEGUI
#include <CEGUI\CEGUI.h>
#include <CEGUI\RendererModules\Direct3D9\Renderer.h>
using namespace CEGUI;

//directx 相關
#pragma comment(lib,"dsound.lib")
#pragma comment(lib,"dinput8.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dxof.lib")
#pragma comment(lib,"dxguid.lib")

//CEGUI 相關
#ifdef _DEBUG
#pragma comment(lib,"CEGUIBase-0_d.lib")
#pragma comment(lib,"CEGUIDirect3D9Renderer-0_d.lib")
#else
#pragma comment(lib,"CEGUIBase-0.lib")
#pragma comment(lib,"CEGUIDirect3D9Renderer-0.lib")
#endif

// 釋放記憶體
#define SAFE_DELETE(p)  { if(p) { delete (p);     (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }

//可以在視窗後面顯示一個 console 方便除錯
#pragma comment(linker, "/subsystem:console /entry:WinMainCRTStartup")	

//windows 相關
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//directx 相關
class MY_VERTEX
{
    public:
        D3DXVECTOR3 p;
	    DWORD       color;
};

const DWORD MY_VERTEX_FVF=(D3DFVF_XYZ | D3DFVF_DIFFUSE);

LPDIRECT3D9				g_pD3D;			
LPDIRECT3DDEVICE9		g_pD3DDevice;	
D3DPRESENT_PARAMETERS	g_D3DPP;

D3DXMATRIX g_proj;
D3DXMATRIX g_view;
D3DXMATRIX g_world;//

LPDIRECT3DVERTEXBUFFER9 g_pVB;
LPDIRECT3DTEXTURE9 g_pTexture;

void DirectXCreate(HWND hWnd);
void DirectXRender();
void DirectXDestroy();
void DirectXMatrix();
void DirectXRenderState();

//CEGUI 相關
void CEGUICreate();
void CEGUIDestroy();

#endif

 

main.cpp

 

#include "main.h"

//win 32 視窗程式進入點
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	//填好視窗資料
	WNDCLASSEX wndclass = {sizeof(wndclass), 
		CS_HREDRAW|CS_VREDRAW,                //style
		WndProc,                             
		0, 0, hInstance,                     
		LoadIcon(NULL, IDI_APPLICATION),      //hIcon
		LoadCursor(NULL,IDC_ARROW),           //hCursor
		(HBRUSH)(COLOR_WINDOW+1),             //hbrBackground
		NULL,                                 //hMenu
		_T("window"), 
		LoadIcon(NULL, IDI_APPLICATION)};     //hIconSm

	RegisterClassEx(&wndclass);

	//產生視窗
	HWND hWnd = CreateWindowEx(
		0,                              //dwExStyle 
		_T("window"), _T("window"),             //視窗標題
		WS_OVERLAPPEDWINDOW,            //dwStyle
		CW_USEDEFAULT, CW_USEDEFAULT,
		640, 480, 
		NULL, NULL, hInstance, NULL);

    ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	//DirectX 初始化
	DirectXCreate(hWnd);

	//CEGUI 資源與資料初始化
	CEGUICreate();

	MSG msg;
	while(TRUE)
	{
		if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{
		    if(msg.message==WM_QUIT) break;
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else
		{
			//DirectX 繪圖
			DirectXRender();
		}
	}
	//CEGUI 資源釋放
	CEGUIDestroy();

	//DirectX 資源釋放
	DirectXDestroy();

	return (int)msg.wParam;
}

//訊息迴圈
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
		case WM_MOUSEMOVE:
			CEGUI::System::getSingleton().getDefaultGUIContext().injectMousePosition((float)(LOWORD(lParam)), (float)(HIWORD(lParam)));
			return 0;
	}
	return DefWindowProc(hWnd, msg, wParam, lParam);
}

//DirectX 初始化
void DirectXCreate(HWND hWnd)
{
	//初始化directX
	D3DDISPLAYMODE d3ddm;
    
	if((g_pD3D = ::Direct3DCreate9(D3D_SDK_VERSION)) == 0) 
		return;
    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))) 
		return;
    
	ZeroMemory(&g_D3DPP, sizeof(D3DPRESENT_PARAMETERS));
	g_D3DPP.BackBufferCount			= 1;
	g_D3DPP.Windowed				= TRUE;				
	g_D3DPP.BackBufferFormat		= d3ddm.Format;			
	g_D3DPP.SwapEffect				= D3DSWAPEFFECT_DISCARD;	
	g_D3DPP.EnableAutoDepthStencil	= TRUE;						
	g_D3DPP.AutoDepthStencilFormat	= D3DFMT_D16;

	if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 
								   D3DCREATE_HARDWARE_VERTEXPROCESSING, 
								   &g_D3DPP, &g_pD3DDevice))) {
	if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 
								   D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
								   &g_D3DPP, &g_pD3DDevice))) {
	if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd, 
								   D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
								   &g_D3DPP, &g_pD3DDevice))) {
				return;
	}}}

	//初始化頂點資料
	if(FAILED(g_pD3DDevice->CreateVertexBuffer(4*sizeof(MY_VERTEX),D3DUSAGE_WRITEONLY,
												MY_VERTEX_FVF,D3DPOOL_MANAGED,
												&g_pVB, NULL ))) return;

	MY_VERTEX* v;
    g_pVB->Lock( 0, 0, (void**)&v, 0 );

    v[0].p = D3DXVECTOR3(-5.5f,  1.5f, 0.0f );
    v[1].p = D3DXVECTOR3(-1.5f,  1.5f, 0.0f );
    v[2].p = D3DXVECTOR3(-5.5f, -1.5f, 0.0f );
	v[3].p = D3DXVECTOR3(-1.5f, -1.5f, 0.0f );

    v[0].color = v[1].color = v[2].color = v[3].color =
	D3DXCOLOR( 1.0f, 1.0f,  1.0f,  1.0f);
    g_pVB->Unlock();
}
void DirectXMatrix()
{
	D3DXMatrixIdentity( &g_view);
	D3DXMatrixLookAtLH( &g_view, &D3DXVECTOR3(0.0f, 0.0f, -10.0f), 
								 &D3DXVECTOR3(0.0f, 0.0f, 0.0f), 
								 &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
    g_pD3DDevice->SetTransform(D3DTS_VIEW, &g_view);

	D3DVIEWPORT9    vp;
	if(FAILED(g_pD3DDevice->GetViewport(&vp))) return;
	float aspect;
	aspect = (float)vp.Width / (float)vp.Height;
	D3DXMatrixIdentity(&g_proj);
	D3DXMatrixPerspectiveFovLH(&g_proj, D3DXToRadian(45.0f), aspect, 5.0f, 1000.0f);
	g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &g_proj);

	D3DXMatrixIdentity(&g_world);
	g_pD3DDevice->SetTransform(D3DTS_WORLD, &g_world);
}
//DirectX 繪圖
void DirectXRender()
{
	g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,255,0),1.0f,0);
	g_pD3DDevice->BeginScene();

	//重設3D物件的矩陣
	DirectXMatrix();

	//重設3D物件的 render state
	DirectXRenderState();

	//3D物件的繪圖
	g_pD3DDevice->SetStreamSource( 0, g_pVB, 0, sizeof(MY_VERTEX) );
    g_pD3DDevice->SetFVF( MY_VERTEX_FVF );
    g_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );

	//CEGUI 繪圖
	CEGUI::System::getSingleton().renderAllGUIContexts();

	g_pD3DDevice->EndScene();
	g_pD3DDevice->Present(0,0,0,0);
}

//DirectX 資源釋放
void DirectXDestroy()
{
	SAFE_RELEASE(g_pVB);
	SAFE_RELEASE(g_pD3DDevice);
	SAFE_RELEASE(g_pD3D);
}
//CEGUI 資源與資料初始化
void CEGUICreate()
{
	CEGUI::Direct3D9Renderer* myRenderer = &CEGUI::Direct3D9Renderer::create(g_pD3DDevice);
	CEGUI::System::create(*myRenderer);

	CEGUI::DefaultResourceProvider* rp = static_cast<CEGUI::DefaultResourceProvider*>
		(CEGUI::System::getSingleton().getResourceProvider());
	rp->setResourceGroupDirectory("schemes", "datafiles/schemes/");
	rp->setResourceGroupDirectory("imagesets", "datafiles/imagesets/");
	rp->setResourceGroupDirectory("fonts", "datafiles/fonts/");
	rp->setResourceGroupDirectory("layouts", "datafiles/layouts/");
	rp->setResourceGroupDirectory("looknfeels", "datafiles/looknfeel/");
	rp->setResourceGroupDirectory("lua_scripts", "datafiles/lua_scripts/");
	rp->setResourceGroupDirectory("schemas", "datafiles/xml_schemas/");

	// set the default resource groups to be used
	CEGUI::ImageManager::setImagesetDefaultResourceGroup("imagesets");
	CEGUI::Font::setDefaultResourceGroup("fonts");
	CEGUI::Scheme::setDefaultResourceGroup("schemes");
	CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
	CEGUI::WindowManager::setDefaultResourceGroup("layouts");
	CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");
	// setup default group for validation schemas
	CEGUI::XMLParser* parser = CEGUI::System::getSingleton().getXMLParser();
	if (parser->isPropertyPresent("SchemaDefaultResourceGroup"))
		parser->setProperty("SchemaDefaultResourceGroup", "schemas");
	
	SchemeManager::getSingleton().createFromFile("TaharezLook.scheme");
	FontManager::getSingleton().createFromFile( "DejaVuSans-10.font" );
	System::getSingleton().getDefaultGUIContext().setDefaultFont( "DejaVuSans-10" );
	System::getSingleton().getDefaultGUIContext().getMouseCursor().setDefaultImage( "TaharezLook/MouseArrow" );
	WindowManager& wmgr = WindowManager::getSingleton();
	Window* myRoot = wmgr.createWindow( "DefaultWindow", "root" );
	System::getSingleton().getDefaultGUIContext().setRootWindow( myRoot );
	FrameWindow* fWnd = (FrameWindow*)wmgr.createWindow("TaharezLook/FrameWindow", "Demo Window");
	myRoot->addChild( fWnd );
	// position a quarter of the way in from the top-left of parent.
	fWnd->setPosition( UVector2( UDim( 0.25f, 0 ), UDim( 0.25f, 0 ) ) );
	// set size to be half the size of the parent
	fWnd->setSize( USize( UDim( 0.5f, 0 ), UDim( 0.5f, 0 ) ) );
	fWnd->setText( "Hello World!" );
}
//CEGUI 資源釋放
void CEGUIDestroy()
{
   CEGUI::Renderer *renderer = CEGUI::System::getSingleton().getRenderer();
	CEGUI::Direct3D9Renderer::destroy(
        *static_cast<CEGUI::Direct3D9Renderer*>(renderer));
	renderer = 0;
}
//重設3D物件的 render state
//http://www.cnitblog.com/xfxsworld/archive/2007/11/15/36330.html
void  DirectXRenderState()
{
	//  setup vertex stream 
	g_pD3DDevice -> SetFVF(NULL);
  
	//  set device states 
	g_pD3DDevice -> SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
	g_pD3DDevice -> SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
	g_pD3DDevice -> SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
	g_pD3DDevice -> SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
	g_pD3DDevice -> SetRenderState(D3DRS_FOGENABLE, FALSE);
	g_pD3DDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
   
	//  setup texture addressing settings/* 
	g_pD3DDevice -> SetSamplerState(  0 , D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
	g_pD3DDevice -> SetSamplerState(  0 , D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
   
	//  setup colour calculations 
	g_pD3DDevice -> SetTextureStageState( 0 , D3DTSS_COLORARG1, D3DTA_TEXTURE);
	g_pD3DDevice -> SetTextureStageState( 0 , D3DTSS_COLORARG2, D3DTA_CURRENT);
	g_pD3DDevice -> SetTextureStageState( 0 , D3DTSS_COLOROP, D3DTOP_SELECTARG1);
   
	//  setup alpha calculations 
	g_pD3DDevice -> SetTextureStageState( 0 , D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
	g_pD3DDevice -> SetTextureStageState( 0 , D3DTSS_ALPHAARG2, D3DTA_CURRENT);
	g_pD3DDevice -> SetTextureStageState( 0 , D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
   
	//  setup filtering 
	g_pD3DDevice -> SetSamplerState( 0 , D3DSAMP_MINFILTER, D3DTEXF_POINT);
	g_pD3DDevice -> SetSamplerState( 0 , D3DSAMP_MAGFILTER, D3DTEXF_POINT);
   
	//  disable texture stages we do not need. 
	g_pD3DDevice -> SetTextureStageState( 1 , D3DTSS_COLOROP, D3DTOP_DISABLE);
   
	//  setup scene alpha blending 
	g_pD3DDevice -> SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
	g_pD3DDevice -> SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
	g_pD3DDevice -> SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); 
}



拿之前的程式修改的
雖然結果是一樣的
但是改了很多地方

之前的
http://blog.xuite.net/kamory0931/fightdreamer/60024356 


留言

這個網誌中的熱門文章

MSVC 與 CRT 之間的恩怨情仇

EXCEL VBA

演員筆記