// WBEnvPlaneTex.cpp: implementation of the WBEnvPlaneTex class. // ////////////////////////////////////////////////////////////////////// #include "WBEnvPlaneTex.h" #include "SceneManager.h" #include "BaseGraphicsLayer.h" #include "SceneStateMgr.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// WBEnvPlaneTex::WBEnvPlaneTex() { m_pEnvPlaneTexture = NULL; // m_pEnvPlaneDepthTexture = NULL; m_pEnvPlaneSurf = NULL; m_pEnvDepthSurf= NULL; m_pBackColorSurf = NULL; m_pBackDepthSurf = NULL; memset(m_vecPlaneVertex,0,(sizeof(D3DXVECTOR3) * 4)); m_vecEyePos = D3DXVECTOR3(0.0f,0.0f,0.0f); m_pDevice = NULL; D3DXMatrixIdentity(&m_matReflect); m_iTexSizeX = m_iTexSizeY = 256; } WBEnvPlaneTex::~WBEnvPlaneTex() { if(m_pEnvPlaneTexture != NULL) m_pEnvPlaneTexture->Release(); /* if(m_pEnvPlaneDepthTexture != NULL) m_pEnvPlaneDepthTexture->Release(); */ if(m_pEnvPlaneSurf != NULL) m_pEnvPlaneSurf->Release(); if(m_pEnvDepthSurf != NULL) m_pEnvDepthSurf->Release(); } ///////////////////// /* vecA --------- vecB | | | | | | vecC --------- vecD */ void WBEnvPlaneTex::Init(LPDIRECT3DDEVICE8 pDevice,int iSizeX,int iSizeY) { m_pDevice = pDevice; if(m_pDevice != NULL) { m_iTexSizeX = iSizeX; m_iTexSizeY = iSizeY; m_pDevice->GetRenderTarget( &m_pBackColorSurf ); m_pDevice->GetDepthStencilSurface( &m_pBackDepthSurf ); if(m_pEnvPlaneTexture != NULL) m_pEnvPlaneTexture->Release(); m_pDevice->CreateTexture(m_iTexSizeX,m_iTexSizeY,1,D3DUSAGE_RENDERTARGET,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&m_pEnvPlaneTexture); m_pEnvPlaneTexture->GetSurfaceLevel(0,&m_pEnvPlaneSurf); m_pDevice->CreateDepthStencilSurface(m_iTexSizeX,m_iTexSizeY,D3DFMT_D16, D3DMULTISAMPLE_NONE, &m_pEnvDepthSurf ); /*HRESULT hr = m_pDevice->CreateTexture(m_iTexSizeX,m_iTexSizeY,1, D3DUSAGE_DEPTHSTENCIL, D3DFMT_D24S8,D3DPOOL_DEFAULT,&m_pEnvPlaneDepthTexture); m_pEnvPlaneDepthTexture->GetSurfaceLevel(0,&m_pEnvDepthSurf); */ //BaseGraphicsLayer::m_d3dpp.AutoDepthStencilFormat m_TexViewPort.X = m_TexViewPort.Y = 0; m_TexViewPort.Width = iSizeX; m_TexViewPort.Height = iSizeY; m_TexViewPort.MinZ = 0.0f; m_TexViewPort.MaxZ = 1.0f; } } void WBEnvPlaneTex::InitClipRange( D3DXVECTOR3 vecA,D3DXVECTOR3 vecB,D3DXVECTOR3 vecC,D3DXVECTOR3 vecD) { m_vecPlaneVertex[0] = vecA; m_vecPlaneVertex[1] = vecB; m_vecPlaneVertex[2] = vecC; m_vecPlaneVertex[3] = vecD; D3DXPlaneFromPoints( &m_Plane,&(m_vecPlaneVertex[0]), &(m_vecPlaneVertex[1]), &(m_vecPlaneVertex[2])); m_Plane.a *= 1.0f; m_Plane.b *= 1.0f; m_Plane.c *= 1.0f; D3DXMatrixReflect( &m_matReflect,&m_Plane); } void WBEnvPlaneTex::RenderBegin(D3DXVECTOR3 vecEye,D3DXMATRIX matWorld,float fWaterHeight) { DWORD dwCull; DWORD dwBlend; D3DXMATRIX matOriginView; D3DXMATRIX matOriginProject; m_pDevice->GetTransform(D3DTS_VIEW,&matOriginView); m_pDevice->GetTransform(D3DTS_PROJECTION,&matOriginProject); // Set Mirror Camera D3DXMATRIX matMirrorView = matOriginView; D3DXMATRIX matMirrorProject = matOriginProject; D3DXMATRIX matTransform; D3DXMatrixIdentity(&matTransform); matTransform._22 = -1.0f; matTransform._42 = 2.0f* fWaterHeight; D3DXMatrixMultiply(&matMirrorView,&matTransform,&matMirrorView); // D3DXMatrixMultiply(&matMirrorView,&matMirrorView,&matTransform); m_pDevice->SetTransform(D3DTS_VIEW,&matMirrorView); m_pDevice->SetTransform(D3DTS_PROJECTION,&matMirrorProject); D3DVIEWPORT8 m_OriginViewPort; m_pDevice->GetViewport(&m_OriginViewPort); m_pDevice->GetRenderTarget( &m_pBackColorSurf ); m_pDevice->GetDepthStencilSurface( &m_pBackDepthSurf ); // Set RenderTarget m_pDevice->SetRenderTarget(m_pEnvPlaneSurf,m_pEnvDepthSurf);//m_pEnvDepthSurf); // Set New Viewport m_pDevice->SetViewport(&m_TexViewPort); m_pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0x00000000, 1.0f, 0 ); m_pDevice->GetRenderState(D3DRS_ALPHABLENDENABLE,&dwBlend); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE); m_pDevice->GetRenderState(D3DRS_CULLMODE,&dwCull); m_Plane.a = 0.0f; m_Plane.b = 1.0f; m_Plane.c = 0.0f; m_Plane.d = -fWaterHeight + 0.25f; // Clip Plane CSceneStateMgr::_SetD3DRenderState( D3DRS_CLIPPLANEENABLE,D3DCLIPPLANE1 ); //CSceneStateMgr::_SetD3DRenderState( D3DRS_CLIPPLANEENABLE, 0x00 ); m_pDevice->SetClipPlane(1,m_Plane); // ³»ºÎ¿¡¼­ cullmode Setting ÇØÁÖ´Â°Íµé ´Ù ¹Ý´ë·Î ÇØÁÖ¾î¾ß ÇÑ´Ù.¤Ñ¤Ñ; CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CW); CSceneManager::m_WeatherManager.Render(CSceneManager::GetDevice()); CSceneManager::m_HeightField.Render(CSceneManager::GetDevice()); CSceneManager::m_CharacterManager.Render(CSceneManager::GetDevice()); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,dwCull); CSceneStateMgr::_SetD3DRenderState( D3DRS_CLIPPLANEENABLE, 0x00 ); // Back Render Target m_pDevice->SetRenderTarget(m_pBackColorSurf,m_pBackDepthSurf); m_pDevice->SetViewport(&m_OriginViewPort); m_pDevice->SetTransform(D3DTS_VIEW,&matOriginView); m_pDevice->SetTransform(D3DTS_PROJECTION,&matOriginProject); // Texture Transform Matrix D3DXMatrixIdentity(&m_matReflect); // Clear m_matReflect._11 = 0.0f; m_matReflect._22 = 0.0f; m_matReflect._33 = 0.0f; m_matReflect._44 = 0.0f; m_matReflect._11 = 0.5f; m_matReflect._22 = -0.5f; m_matReflect._41 = 0.5f; m_matReflect._42 = 0.5f; m_matReflect._43 = 1.0f; m_matReflect._44 = 1.0f; D3DXMatrixMultiply(&m_matReflect,&matMirrorProject,&m_matReflect); D3DXMatrixMultiply(&m_matReflect,&matMirrorView,&m_matReflect); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,dwBlend); } /* void WBEnvPlaneTex::RenderBegin(D3DXVECTOR3 vecEye,D3DXMATRIX matWorld) { m_matBackup = matWorld; m_vecEyePos = vecEye; m_pDevice->GetViewport(&m_BackViewPort); m_pDevice->SetTransform( D3DTS_WORLD,&m_matReflect); // Reflect À̹ǷΠreverse CSceneStateMgr::_SetD3DRenderState( D3DRS_CULLMODE,D3DCULL_CCW); m_pDevice->SetClipPlane(0,*D3DXPlaneFromPoints(&m_Plane,&m_vecPlaneVertex[1],&m_vecPlaneVertex[0],&m_vecEyePos)); m_pDevice->SetClipPlane(1,*D3DXPlaneFromPoints(&m_Plane,&m_vecPlaneVertex[3],&m_vecPlaneVertex[1],&m_vecEyePos)); m_pDevice->SetClipPlane(2,*D3DXPlaneFromPoints(&m_Plane,&m_vecPlaneVertex[2],&m_vecPlaneVertex[3],&m_vecEyePos)); m_pDevice->SetClipPlane(3,*D3DXPlaneFromPoints(&m_Plane,&m_vecPlaneVertex[0],&m_vecPlaneVertex[2],&m_vecEyePos)); CSceneStateMgr::_SetD3DRenderState( D3DRS_CLIPPLANEENABLE,D3DCLIPPLANE0 | D3DCLIPPLANE1 | D3DCLIPPLANE2 | D3DCLIPPLANE3 ); m_pDevice->SetPixelShader(NULL); m_pDevice->SetRenderTarget(m_pEnvPlaneSurf,NULL);//m_pEnvDepthSurf); //m_pDevice->SetRenderTarget(m_pEnvPlaneSurf,m_pEnvDepthSurf); m_pDevice->SetViewport(&m_TexViewPort); m_pDevice->Clear(0, NULL, D3DCLEAR_TARGET, 0x00000000, 1.0f, 0 ); //m_pDevice->Clear(0, NULL, D3DCLEAR_TARGET, 0x00000000, 1.0f, 0 ); }*/ void WBEnvPlaneTex::RenderEnd() { m_pDevice->SetRenderTarget(m_pBackColorSurf,m_pBackDepthSurf); m_pDevice->SetViewport(&m_BackViewPort); m_pDevice->SetTransform( D3DTS_WORLD, &m_matBackup); CSceneStateMgr::_SetD3DRenderState( D3DRS_CLIPPLANEENABLE, 0x00 ); CSceneStateMgr::_SetD3DRenderState( D3DRS_CULLMODE, D3DCULL_CCW); }