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); 
}