UHERenderDevice.h
UHERenderer.h
UHEPreriqusites.h
[/code] 其中,UHERenderDevice.h中定义了渲染器的纯基类,具体的内容如下:
[code]
//file: UHERenderDevice.h
#ifndef _INCLUDE_UHERENDERDEVICE_H
#define _INCLUDE_UHERENDERDEVICE_H
#include "UHEPrerequisites.h"
#include "UHEBasicStruct.h"
namespace UHEngine
{
class _UHE_Export UHERenderDevice
{
public:
UHERenderDevice(void){};
virtual ~UHERenderDevice(void){};
virtual HRESULT Init( HWND hWnd,
HINSTANCE hInst,
bool bWindowed,
DWORD dwWidth,
DWORD dwHeight) = 0;
virtual void ShutDown() = 0;
virtual HRESULT Prepare() = 0;
virtual bool IsRunning() = 0;
virtual void SetClearColor( float fR, float fG, float fB ) = 0;
virtual void Clear() = 0;
virtual void Render() = 0;
//这里我省略了。。。。。。。
};
};
#endif
[/code]
注意到_UHE_Export这个宏,在UHEPreriqusites.h中有定义:
[code]
//file: UHEPrerequisites.h
#ifndef _INCLUDE_UHEPREREQUISITES_H
#define _INCLUDE_UHEPREREQUISITES_H
#include <windows.h>
#define _UHE_Export __declspec( dllexport )
#endif
[/code]
如果想导出某个类的成员函数到.dll文件,就需要在类名前加上¬ _UHE_Export 。
在UHERenderer.h中,我们定义了面向用户的类:
[code]
//file: UHERenderer.h
#ifndef _INCLUDE_UHERENDERER_H
#define _INCLUDE_UHERENDERER_H
#include "UHEPrerequisites.h"
#include "UHERenderDevice.h"
namespace UHEngine
{
class _UHE_Export UHERenderer
{
public:
UHERenderer();
~UHERenderer();
void CreateDevice( int deviceType );
UHERenderDevice *GetRenderDevice(){return this->m_pRenderDevice;}
private:
UHERenderDevice *m_pRenderDevice;
HMODULE m_hDll;
};
};
#endif
[/code]
注意,CreateDevice( int deviceType )这个函数是关键,我们先看一下它的实现,在UHERenderer.cpp中:
[code]
void UHERenderer::CreateDevice( int deviceType )
{
if( i )
{
this->m_hDll = LoadLibrary( "UHERenderDX9.dll" );
}
else
{
this->m_hDll = LoadLibrary( "UHERenderGL.dll" );
}
void (*pFun)(UHERenderDevice* &);
pFun = (void (__cdecl *)(UHEngine::UHERenderDevice *&)) GetProcAddress( m_hDll, "dllCreate" );
(*pFun)( this->m_pRenderDevice );
}
[/code]
这里,我们规定当deviceType 大于0时,是使用的dx的渲染器,即加载的是 UHERenderDX9.dll。然后要注意这个"dllCreate"参数,这是从另一个工程中导出的.dll中的函数名,先放在这里,等一下在讨论。
这样,UHEMain中的部分的框架就差不多了。我们先写一个dx9的渲染器的实现。
建立新的项目,依然是.dll的空项目,没有预编译头文件。我们要先写一个dx的渲染器,继承于UHEMain中的渲染器纯虚类:
[code]
//file: UHERenderDX9.h
#ifndef _INCLUDE_UHERENDERDX9_H
#define _INCLUDE_UHERENDERDX9_H
#include "UHERenderDX9Base.h"
namespace UHEngine
{
class UHEDX9 : public UHERenderDevice
{
public:
UHEDX9();
UHEDX9( HWND hWnd,
HINSTANCE hInst,
bool bWindowed,
DWORD dwWidth,
DWORD dwHeight);
~UHEDX9();
HRESULT Init( HWND hWnd,
HINSTANCE hInst,
bool bWindowed,
DWORD dwWidth,
DWORD dwHeight);
HRESULT Prepare();
void ShutDown();
bool IsRunning(){ return m_bIsRunning; }
void SetClearColor( float fR, float fG, float fB );
void Clear();
void Render();
//这里我省略了。。。。。
private:
HRESULT BeginRendering( bool bClearPixel,
bool bClearDepth,
bool bClearStencil );
HRESULT EndRendering();
HRESULT Clear( bool bClearPixel,
bool bClearDepth,
bool bClearStencil );
D3DXCOLOR m_clearColor;
bool m_bIsRunning;
bool m_bIsSceneRunning;
bool m_bStencil;
HWND m_hWnd;
HINSTANCE m_hInst;
bool m_bWindowed;
DWORD m_dwHeight;
DWORD m_dwWidth;
LPDIRECT3D9 m_pDX9;
LPDIRECT3DDEVICE9 m_pDevice;
D3DPRESENT_PARAMETERS m_d3dpp;
//这里省略了。。。。。
};
};
#endif
[/code]
完成这个类的实现。这样还不行,应为我们需要导出初始化基类渲染器的函数到UHERenderDX9.dll中。新建一个UHERenderDX9.def文件作为.dll的导出模块文件,文件中的内容如下:
[code]
LIBRARY "UHERenderDX9"
EXPORTS
dllCreate @1
dllRelease @2
;end of file
[/code]
这样编译之后就可以将dllCreate和dllRelease函数导出到.dll中。
dllCreate的定义:
[code]
//file : UHERenderDX9Dll.cpp
#include "UHEDX9.h"
#include "UHERenderer.h"
namespace UHEngine
{
UHEDX9* pRenderDX9;
extern "C" __declspec( dllexport ) void dllCreate( UHERenderDevice * &pRenderer )
{
pRenderDX9 = new UHEDX9();
pRenderer = pRenderDX9;
}
extern "C" __declspec( dllexport ) void dllRelease(void)
{
delete pRenderDX9;
}
}