www.pudn.com > GameEngine.rar > GameEngine_SceneManager.cpp, change:2005-11-15,size:11052b
#include "..\GameEngine_Common.h"
#include "GameEngine_SceneManager.h"
#include "..\GameEngine_Texture\GameEngine_Texture.h"
#include "..\GameEngine_Material\GameEngine_Material.h"
#include "..\GameEngine_Light\GameEngine_Light.h"
#include "..\GameEngine_Camera\GameEngine_Camera.h"
CGameEngine_SceneManager::CGameEngine_SceneManager(){
}
CGameEngine_SceneManager::~CGameEngine_SceneManager(){
Closedown();
}
bool CGameEngine_SceneManager::Init(){
//创建IDirect3D9对象
m_pIDirect3D=Direct3DCreate9(D3D_SDK_VERSION);
if(m_pIDirect3D==NULL){
return false;
}
return true;
}
bool CGameEngine_SceneManager::SetRenderMode(HWND hWnd,bool bFullScreen,int iWidth,int iHeight){
//取得显示模式
D3DDISPLAYMODE d3dDisplayMode;
RECT clientRect;
RECT wndRect;
int iWndPosX,iWndPosY,iTitlebarWidth,iTitlebarHeight;
m_hWnd=hWnd;
if(FAILED(m_pIDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3dDisplayMode)))
return false;
//设置屏幕窗口大小
if(bFullScreen){
m_iWidth=iWidth;
m_iHeight=iHeight;
}
else{
if(iWidth>0 && iHeight>0){
m_iWidth=iWidth;
m_iHeight=iHeight;
GetClientRect(m_hWnd,&clientRect);
}
else
return false;
}
//窗口,则移动到屏幕中央位置
if(!bFullScreen){
iWndPosX=(d3dDisplayMode.Width - m_iWidth)/2;
iWndPosY=(d3dDisplayMode.Height - m_iHeight)/2;
GetWindowRect(m_hWnd,&wndRect);
iTitlebarWidth=(wndRect.right - wndRect.left) - clientRect.right;
iTitlebarHeight=(wndRect.bottom - wndRect.top) - clientRect.bottom;
MoveWindow(m_hWnd,iWndPosX,iWndPosY,iTitlebarWidth+m_iWidth,iTitlebarHeight+m_iHeight,true);
}
//设置D3D设备的属性参数
D3DPRESENT_PARAMETERS d3dPresent_Param; //渲染参数结构体
ZeroMemory(&d3dPresent_Param, sizeof(d3dPresent_Param)); //结构体清0
d3dPresent_Param.BackBufferFormat=d3dDisplayMode.Format;
if(bFullScreen){ //全屏幕方式
d3dPresent_Param.BackBufferWidth=m_iWidth;
d3dPresent_Param.BackBufferHeight=m_iHeight;
d3dPresent_Param.BackBufferCount=1;
d3dPresent_Param.hDeviceWindow=m_hWnd;
d3dPresent_Param.Windowed=false; //false为全屏幕显示方式
d3dPresent_Param.SwapEffect=D3DSWAPEFFECT_FLIP;
d3dPresent_Param.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dPresent_Param.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
d3dPresent_Param.EnableAutoDepthStencil=true;
d3dPresent_Param.AutoDepthStencilFormat=D3DFMT_D24S8;
}
else{
d3dPresent_Param.Windowed=true;
d3dPresent_Param.SwapEffect=D3DSWAPEFFECT_DISCARD;
}
//简单的硬件、软件渲染选择
D3DCAPS9 d3dcaps;
bool bHardwareProcess;
m_pIDirect3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&d3dcaps);
if(d3dcaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT){
bHardwareProcess=true;
}
else{
bHardwareProcess=false;
}
//创建d3d设备
if(bHardwareProcess){
if(FAILED(m_pIDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dPresent_Param,
&m_pIDirect3DDevice))){
return false;
}
}
else{
if(FAILED(m_pIDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dPresent_Param,
&m_pIDirect3DDevice))){
return false;
}
}
//设置渲染状态
m_pIDirect3DDevice->SetRenderState(D3DRS_LIGHTING,false);
m_pIDirect3DDevice->SetRenderState(D3DRS_ZENABLE,true);
m_pIDirect3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE,false);
m_pIDirect3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
m_pIDirect3DDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
m_pIDirect3DDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
//创建精灵
if(FAILED(D3DXCreateSprite(m_pIDirect3DDevice,&m_pSprite)))
return false;
return true;
}
void CGameEngine_SceneManager::SetSpriteAt(D3DXVECTOR3* pPos,CGameEngine_Camera* pCamera){
D3DXMATRIX faceUserMat,WorldMat,ViewMat;
D3DXMatrixScaling(&faceUserMat,1.0f,-1.0f,1.0f);
m_pSprite->SetTransform(&faceUserMat);
//
D3DXMatrixTranslation(&WorldMat,pPos->x,pPos->y,pPos->z);
pCamera->GetViewMatrix(&ViewMat);
m_pSprite->SetWorldViewLH(&WorldMat,&ViewMat);
}
void CGameEngine_SceneManager::DrawSprite(CGameEngine_Texture* pSpriteTexture){
m_pSprite->Begin(D3DXSPRITE_BILLBOARD|D3DXSPRITE_ALPHABLEND);
m_pSprite->Draw(pSpriteTexture->GetTexture(),NULL,NULL,NULL,0xffffffff);
m_pSprite->End();
}
bool CGameEngine_SceneManager::SetTexture(short id, CGameEngine_Texture *pGameTexture)
{
if(id<0 || id>7)
return false;
if(pGameTexture==NULL){
//清除纹理
if(FAILED(m_pIDirect3DDevice->SetTexture(id,NULL)))
return false;
}
else{
//设置新纹理
if(FAILED(m_pIDirect3DDevice->SetTexture(id,pGameTexture->GetTexture())))
return false;
}
return true;
}
bool CGameEngine_SceneManager::ClearScreen(D3DCOLOR c){
if(FAILED(m_pIDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,c,1.0f,0)))
return false;
return true;
}
bool CGameEngine_SceneManager::ClearZBuffer(float z){
if(FAILED(m_pIDirect3DDevice->Clear(0,NULL,D3DCLEAR_ZBUFFER,0,z,0)))
return false;
return true;
}
bool CGameEngine_SceneManager::ClearSZ(D3DCOLOR c,float z,DWORD s){
if(FAILED(m_pIDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL,c,z,s)))
return false;
return true;
}
bool CGameEngine_SceneManager::BeginRender(){
if(FAILED(m_pIDirect3DDevice->BeginScene()))
return false;
return true;
}
bool CGameEngine_SceneManager::EndRender(){
if(FAILED(m_pIDirect3DDevice->EndScene()))
return false;
if(FAILED(m_pIDirect3DDevice->Present(NULL, NULL, NULL, NULL)))
return false;
return true;
}
bool CGameEngine_SceneManager::SetLight(int id,CGameEngine_Light* pLight)
{
if(pLight==NULL)
return false;
if(FAILED(m_pIDirect3DDevice->SetLight(id,pLight->GetLight())))
return false;
return true;
}
void CGameEngine_SceneManager::EnableLight(int id,bool b){
m_pIDirect3DDevice->LightEnable(id,b);
}
void CGameEngine_SceneManager::OpenSceneLight(bool b){
m_pIDirect3DDevice->SetRenderState(D3DRS_LIGHTING,b);
}
void CGameEngine_SceneManager::EnableZBuffer(bool b){
m_pIDirect3DDevice->SetRenderState(D3DRS_ZENABLE,b);
}
void CGameEngine_SceneManager::EnableAlphaBlending(bool b,DWORD dwSrc,DWORD dwDest)
{
m_pIDirect3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,b);
//设置颜色混合值
if(b==true) {
m_pIDirect3DDevice->SetRenderState(D3DRS_SRCBLEND,dwSrc);
m_pIDirect3DDevice->SetRenderState(D3DRS_DESTBLEND,dwDest);
}
}
void CGameEngine_SceneManager::EnableAlphaTesting(bool b)
{
m_pIDirect3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE,b);
//设置比较条件
if(b==true) {
m_pIDirect3DDevice->SetRenderState(D3DRS_ALPHAREF,0x08);
m_pIDirect3DDevice->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL);
}
}
bool CGameEngine_SceneManager::SetMaterial(CGameEngine_Material* pMaterial)
{
if(pMaterial != NULL){
if(FAILED(m_pIDirect3DDevice->SetMaterial(pMaterial->GetMaterial())))
return false;
}
return true;
}
bool CGameEngine_SceneManager::SetCamera(CGameEngine_Camera* pCamera){
if(pCamera == NULL)
return false;
D3DXMATRIX ViewMat;
pCamera->GetViewMatrix(&ViewMat);
m_pIDirect3DDevice->SetTransform(D3DTS_VIEW,&ViewMat);
return true;
}
void CGameEngine_SceneManager::SetProjection(float fAngle,float d1,float d2)
{
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj,fAngle,(float)m_iWidth/m_iHeight, d1, d2);
m_pIDirect3DDevice->SetTransform( D3DTS_PROJECTION, &matProj);
}
//顶点线性雾化
void CGameEngine_SceneManager::SetLinearVertexFog(float Start,float End,DWORD Color,bool UseRange){
//使能雾化处理
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGENABLE,true);
//设置雾的颜色
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGCOLOR,Color);
//线性雾化
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_LINEAR);
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGSTART,*(DWORD*)(&Start));
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGEND,*(DWORD*)(&End));
//使基于距离的雾化有效
if(UseRange)
m_pIDirect3DDevice->SetRenderState(D3DRS_RANGEFOGENABLE, true);
}
//顶点指数exp雾化
void CGameEngine_SceneManager::SetExpVertexFog(DWORD Color,bool UseRange, float Density){
//使能雾化处理
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGENABLE,true);
//设置雾的颜色
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGCOLOR,Color);
//指数雾化(exp)
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_EXP);
//雾化密度
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
//使基于距离的雾化有效
if(UseRange)
m_pIDirect3DDevice->SetRenderState(D3DRS_RANGEFOGENABLE, true);
}
//顶点指数exp2雾化
void CGameEngine_SceneManager::SetExp2VertexFog(DWORD Color,bool UseRange, float Density){
//使能雾化处理
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGENABLE,true);
//设置雾的颜色
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGCOLOR,Color);
//指数雾化(exp2)
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_EXP2);
//雾化稠密度
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
//使基于距离的雾化有效
if(UseRange)
m_pIDirect3DDevice->SetRenderState(D3DRS_RANGEFOGENABLE, true);
}
//像素线性雾化
void CGameEngine_SceneManager::SetLinearPixelFog(float Start,float End,DWORD Color){
//使能雾化处理
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGENABLE,true);
//设置雾的颜色
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGCOLOR,Color);
//线性雾化
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGTABLEMODE,D3DFOG_LINEAR);
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGSTART,*(DWORD*)(&Start));
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGEND,*(DWORD*)(&End));
}
//像素指数exp雾化
void CGameEngine_SceneManager::SetExpPixelFog(DWORD Color,float Density){
//使能雾化处理
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGENABLE,true);
//设置雾的颜色
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGCOLOR,Color);
//指数雾化(exp)
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGTABLEMODE,D3DFOG_EXP);
//雾化密度
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
}
//像素指数exp2雾化
void CGameEngine_SceneManager::SetExp2PixelFog(DWORD Color,float Density){
//使能雾化处理
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGENABLE,true);
//设置雾的颜色
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGCOLOR,Color);
//指数雾化(exp2)
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGTABLEMODE,D3DFOG_EXP2);
//雾化稠密度
m_pIDirect3DDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
}
void CGameEngine_SceneManager::Closedown(){
SafeRelease(m_pSprite);
SafeRelease(m_pIDirect3DDevice);
SafeRelease(m_pIDirect3D);
}