2022-11-20 23:11:54 +02:00
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "GrpShadowTexture.h"
|
|
|
|
#include "StateManager.h"
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
void CGraphicShadowTexture::Destroy()
|
|
|
|
{
|
|
|
|
CGraphicTexture::Destroy();
|
|
|
|
|
|
|
|
if (m_lpd3dShadowSurface)
|
|
|
|
{
|
|
|
|
m_lpd3dShadowSurface->Release();
|
|
|
|
m_lpd3dShadowSurface = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_lpd3dDepthSurface)
|
|
|
|
{
|
|
|
|
m_lpd3dDepthSurface->Release();
|
|
|
|
m_lpd3dDepthSurface = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_lpd3dShadowTexture)
|
|
|
|
{
|
|
|
|
m_lpd3dShadowTexture->Release();
|
|
|
|
m_lpd3dShadowTexture = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
Initialize();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CGraphicShadowTexture::Create(int width, int height)
|
|
|
|
{
|
|
|
|
Destroy();
|
|
|
|
|
|
|
|
m_width = width;
|
|
|
|
m_height = height;
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
if (FAILED(ms_lpd3dDevice->CreateTexture(m_width, m_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_lpd3dShadowTexture, NULL)))
|
2022-11-20 23:11:54 +02:00
|
|
|
return false;
|
|
|
|
|
|
|
|
if (FAILED(m_lpd3dShadowTexture->GetSurfaceLevel(0, &m_lpd3dShadowSurface)))
|
|
|
|
return false;
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
if (FAILED(ms_lpd3dDevice->CreateDepthStencilSurface(m_width, m_height, D3DFMT_R32F, D3DMULTISAMPLE_NONE, 0, false, &m_lpd3dDepthSurface, NULL)))
|
2022-11-20 23:11:54 +02:00
|
|
|
return false;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicShadowTexture::Set(int stage) const
|
|
|
|
{
|
|
|
|
STATEMANAGER.SetTexture(stage, m_lpd3dShadowTexture);
|
|
|
|
}
|
|
|
|
|
|
|
|
const D3DXMATRIX& CGraphicShadowTexture::GetLightVPMatrixReference() const
|
|
|
|
{
|
|
|
|
return m_d3dLightVPMatrix;
|
|
|
|
}
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
LPDIRECT3DTEXTURE9 CGraphicShadowTexture::GetD3DTexture() const
|
2022-11-20 23:11:54 +02:00
|
|
|
{
|
|
|
|
return m_lpd3dShadowTexture;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicShadowTexture::Begin()
|
|
|
|
{
|
|
|
|
D3DXMatrixMultiply(&m_d3dLightVPMatrix, &ms_matView, &ms_matProj);
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
ms_lpd3dDevice->GetRenderTarget(0, &m_lpd3dOldBackBufferSurface);
|
2022-11-20 23:11:54 +02:00
|
|
|
ms_lpd3dDevice->GetDepthStencilSurface(&m_lpd3dOldDepthBufferSurface);
|
|
|
|
ms_lpd3dDevice->GetViewport(&m_d3dOldViewport);
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
ms_lpd3dDevice->GetRenderTarget(0, &m_lpd3dShadowSurface);
|
|
|
|
ms_lpd3dDevice->GetDepthStencilSurface(&m_lpd3dDepthSurface);
|
2022-11-20 23:11:54 +02:00
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
D3DVIEWPORT9 d3dViewport;
|
2022-11-20 23:11:54 +02:00
|
|
|
d3dViewport.MinZ = 0.0f;
|
|
|
|
d3dViewport.MaxZ = 1.0f;
|
|
|
|
d3dViewport.X = 0;
|
|
|
|
d3dViewport.Y = 0;
|
|
|
|
d3dViewport.Width = m_width;
|
|
|
|
d3dViewport.Height = m_height;
|
|
|
|
|
|
|
|
ms_lpd3dDevice->SetViewport(&d3dViewport);
|
|
|
|
ms_lpd3dDevice->BeginScene();
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
ms_lpd3dDevice->Clear(0, nullptr, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0, 1.0f, 0);
|
2022-11-20 23:11:54 +02:00
|
|
|
|
|
|
|
STATEMANAGER.SaveRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
|
|
|
|
STATEMANAGER.SaveRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
|
|
|
|
STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, true);
|
|
|
|
STATEMANAGER.SaveRenderState(D3DRS_ALPHATESTENABLE, true);
|
|
|
|
STATEMANAGER.SaveRenderState(D3DRS_TEXTUREFACTOR, 0xbb000000);
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
STATEMANAGER.SetTexture(0, m_lpd3dShadowTexture);
|
2022-11-20 23:11:54 +02:00
|
|
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
|
|
|
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
|
|
|
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
|
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR);
|
|
|
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
|
|
|
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
STATEMANAGER.SaveSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
|
|
|
|
STATEMANAGER.SaveSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
|
|
|
|
STATEMANAGER.SaveSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
|
|
|
|
STATEMANAGER.SaveSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
|
|
STATEMANAGER.SaveSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
|
2022-11-20 23:11:54 +02:00
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
STATEMANAGER.SetTexture(1, nullptr);
|
2022-11-20 23:11:54 +02:00
|
|
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
|
|
|
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE);
|
|
|
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|
|
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
|
|
|
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
|
|
|
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
STATEMANAGER.SaveSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_POINT);
|
|
|
|
STATEMANAGER.SaveSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
|
|
|
|
STATEMANAGER.SaveSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
|
|
|
|
STATEMANAGER.SaveSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
|
|
STATEMANAGER.SaveSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
|
2022-11-20 23:11:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicShadowTexture::End()
|
|
|
|
{
|
|
|
|
assert(m_lpd3dOldBackBufferSurface != NULL);
|
|
|
|
assert(m_lpd3dOldDepthBufferSurface != NULL);
|
|
|
|
|
|
|
|
ms_lpd3dDevice->EndScene();
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
ms_lpd3dDevice->SetRenderTarget(0, m_lpd3dOldBackBufferSurface);
|
|
|
|
ms_lpd3dDevice->SetDepthStencilSurface(m_lpd3dOldDepthBufferSurface);
|
2022-11-20 23:11:54 +02:00
|
|
|
ms_lpd3dDevice->SetViewport(&m_d3dOldViewport);
|
|
|
|
|
|
|
|
m_lpd3dOldBackBufferSurface->Release();
|
|
|
|
m_lpd3dOldDepthBufferSurface->Release();
|
|
|
|
|
|
|
|
m_lpd3dOldBackBufferSurface = NULL;
|
|
|
|
m_lpd3dOldDepthBufferSurface = NULL;
|
|
|
|
|
|
|
|
STATEMANAGER.RestoreRenderState(D3DRS_CULLMODE);
|
|
|
|
STATEMANAGER.RestoreRenderState(D3DRS_ZFUNC);
|
|
|
|
STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);
|
|
|
|
STATEMANAGER.RestoreRenderState(D3DRS_ALPHATESTENABLE);
|
|
|
|
STATEMANAGER.RestoreRenderState(D3DRS_TEXTUREFACTOR);
|
|
|
|
|
|
|
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1);
|
|
|
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2);
|
|
|
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP);
|
|
|
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG1);
|
|
|
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG2);
|
|
|
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAOP);
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
STATEMANAGER.RestoreSamplerState(0, D3DSAMP_MINFILTER);
|
|
|
|
STATEMANAGER.RestoreSamplerState(0, D3DSAMP_MAGFILTER);
|
|
|
|
STATEMANAGER.RestoreSamplerState(0, D3DSAMP_MIPFILTER);
|
|
|
|
STATEMANAGER.RestoreSamplerState(0, D3DSAMP_ADDRESSU);
|
|
|
|
STATEMANAGER.RestoreSamplerState(0, D3DSAMP_ADDRESSV);
|
2022-11-20 23:11:54 +02:00
|
|
|
|
|
|
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_COLORARG1);
|
|
|
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_COLORARG2);
|
|
|
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_COLOROP);
|
|
|
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ALPHAARG1);
|
|
|
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ALPHAARG2);
|
|
|
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ALPHAOP);
|
|
|
|
|
2024-03-28 22:27:09 +02:00
|
|
|
STATEMANAGER.RestoreSamplerState(1, D3DSAMP_MINFILTER);
|
|
|
|
STATEMANAGER.RestoreSamplerState(1, D3DSAMP_MAGFILTER);
|
|
|
|
STATEMANAGER.RestoreSamplerState(1, D3DSAMP_MIPFILTER);
|
|
|
|
STATEMANAGER.RestoreSamplerState(1, D3DSAMP_ADDRESSU);
|
|
|
|
STATEMANAGER.RestoreSamplerState(1, D3DSAMP_ADDRESSV);
|
2022-11-20 23:11:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicShadowTexture::Initialize()
|
|
|
|
{
|
|
|
|
CGraphicTexture::Initialize();
|
|
|
|
|
|
|
|
m_lpd3dShadowSurface = NULL;
|
|
|
|
m_lpd3dDepthSurface = NULL;
|
|
|
|
m_lpd3dOldBackBufferSurface = NULL;
|
|
|
|
m_lpd3dOldDepthBufferSurface = NULL;
|
|
|
|
m_lpd3dShadowTexture = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
CGraphicShadowTexture::CGraphicShadowTexture()
|
|
|
|
{
|
|
|
|
Initialize();
|
|
|
|
}
|
|
|
|
|
|
|
|
CGraphicShadowTexture::~CGraphicShadowTexture()
|
|
|
|
{
|
|
|
|
Destroy();
|
|
|
|
}
|