Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
187 lines
5.1 KiB
C++
187 lines
5.1 KiB
C++
|
|
#include "ShaderScene.h"
|
|
#include "SceneManager.h"
|
|
#include "SceneStateMgr.h"
|
|
|
|
/* ***********************
|
|
CVertexShader
|
|
************************* */
|
|
CVertexShader::~CVertexShader()
|
|
{
|
|
|
|
}
|
|
void CVertexShader::CreateVertexShaderFromBuffer(char *string,DWORD* vertexShaderDeclaration)
|
|
{
|
|
// Create pixel shader
|
|
LPD3DXBUFFER shadercode=NULL;
|
|
CShaderScene::PreprocessAndAssembleShaderFromBuffer(string, strlen(string), NULL, &shadercode);
|
|
|
|
CSceneManager::GetDevice()->CreateVertexShader(vertexShaderDeclaration,
|
|
(DWORD*)shadercode->GetBufferPointer(), &m_dwVertexShader, 0);
|
|
|
|
SAFE_RELEASE(shadercode);
|
|
}
|
|
|
|
|
|
void CVertexShader::CreateVertexShader(char* filename, DWORD* vertexShaderDeclaration)
|
|
{
|
|
// Create vertex VertexShader
|
|
LPD3DXBUFFER VertexShadercode=NULL;
|
|
|
|
CShaderScene::PreprocessAndAssembleShaderFromFile2(filename, NULL, &VertexShadercode);
|
|
CSceneManager::GetDevice()->CreateVertexShader(vertexShaderDeclaration,
|
|
(DWORD*)VertexShadercode->GetBufferPointer(), &m_dwVertexShader, 0);
|
|
|
|
SAFE_RELEASE(VertexShadercode);
|
|
}
|
|
|
|
/* ***********************
|
|
CPixelShader
|
|
************************* */
|
|
|
|
CPixelShader::~CPixelShader()
|
|
{
|
|
|
|
}
|
|
|
|
void CPixelShader::CreatePixelShaderFromFile(char* filename)
|
|
{
|
|
// Create pixel shader
|
|
LPD3DXBUFFER shadercode=NULL;
|
|
CShaderScene::PreprocessAndAssembleShaderFromFile2(filename, NULL, &shadercode);
|
|
|
|
CSceneManager::GetDevice()->CreatePixelShader( (DWORD*)shadercode->GetBufferPointer(),
|
|
&m_dwPixelShader);
|
|
|
|
SAFE_RELEASE(shadercode);
|
|
}
|
|
|
|
void CPixelShader::CreatePixelShaderFromBuffer(char *string)
|
|
{
|
|
// Create pixel shader
|
|
LPD3DXBUFFER shadercode=NULL;
|
|
CShaderScene::PreprocessAndAssembleShaderFromBuffer(string, strlen(string), NULL, &shadercode);
|
|
|
|
CSceneManager::GetDevice()->CreatePixelShader( (DWORD*)shadercode->GetBufferPointer(),
|
|
&m_dwPixelShader);
|
|
|
|
SAFE_RELEASE(shadercode);
|
|
}
|
|
|
|
|
|
/* ***********************
|
|
CShderScene
|
|
************************* */
|
|
|
|
CShaderScene::CShaderScene() {
|
|
m_pDevice = CSceneManager::GetDevice();
|
|
|
|
|
|
m_bGetState = false;
|
|
m_bSetState = false;
|
|
memset(m_strName,0,sizeof(char) * 256);
|
|
|
|
|
|
}
|
|
CShaderScene::~CShaderScene() {
|
|
|
|
}
|
|
HRESULT CShaderScene::PreprocessAndAssembleShaderFromBuffer(LPCVOID pSrcData, UINT SrcDataLen,
|
|
LPD3DXBUFFER *ppConstants,LPD3DXBUFFER *ppCode) {
|
|
LPD3DXBUFFER* ppErrors=NULL;
|
|
HRESULT hResult=D3DXAssembleShader(pSrcData, SrcDataLen, 0, ppConstants, ppCode, ppErrors);
|
|
return hResult;
|
|
|
|
}
|
|
|
|
HRESULT CShaderScene::PreprocessAndAssembleShaderFromFile2(LPCSTR szFile,LPD3DXBUFFER *ppConstants, LPD3DXBUFFER *ppCode) {
|
|
|
|
|
|
LPD3DXBUFFER* ppErrors=NULL;
|
|
HRESULT hResult = D3DXAssembleShaderFromFile(szFile, 0, ppConstants, ppCode, ppErrors);
|
|
return hResult;
|
|
|
|
}
|
|
|
|
void CShaderScene::ApplyOldState() {
|
|
if((m_pDevice != NULL) && m_bGetState) {
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,m_bOldEnable[ZBUFFER]);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,m_bOldEnable[ZWRITE]);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,m_bOldEnable[ALPHABLEND]);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,m_dwOldCullFace);
|
|
|
|
if(m_bEnable[ALPHABLEND] == true) {
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND,m_dwOldSrcBlend);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND,m_dwOldDestBlend);
|
|
}
|
|
|
|
}
|
|
}
|
|
void CShaderScene::ApplyState() {
|
|
if(m_bSetState = true) {
|
|
if(m_pDevice != NULL) {
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,m_bEnable[ZBUFFER]);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,m_bEnable[ZWRITE]);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,m_bEnable[ALPHABLEND]);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,m_dwCullFace);
|
|
|
|
if(m_bEnable[ALPHABLEND] == true) {
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND,m_dwSrcBlend);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND,m_dwDestBlend);
|
|
}
|
|
|
|
}
|
|
}
|
|
D3DXVec4Normalize(&m_vecLightDir,&m_vecLightDir);
|
|
m_pDevice->SetVertexShaderConstant(21, m_vecLightDir, 1);
|
|
|
|
}
|
|
void CShaderScene::SetState(int iFlag,bool bEnable,DWORD dwValue1,DWORD dwValue2) {
|
|
m_bEnable[ZBUFFER] = bEnable;
|
|
|
|
switch(iFlag) {
|
|
case ALPHABLEND:
|
|
m_dwSrcBlend = dwValue1;
|
|
m_dwDestBlend = dwValue2;
|
|
break;
|
|
case CULLMODE:
|
|
m_dwCullFace = dwValue1;
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
};
|
|
m_bSetState = true;
|
|
}
|
|
void CShaderScene::GetState() {
|
|
if(m_pDevice != NULL) {
|
|
DWORD dwValue;
|
|
|
|
m_pDevice->GetRenderState(D3DRS_ZENABLE ,&dwValue);
|
|
m_bOldEnable[ZBUFFER] = (dwValue == 1) ? true : false;
|
|
m_pDevice->GetRenderState(D3DRS_ZWRITEENABLE ,&dwValue);
|
|
m_bOldEnable[ZWRITE] = (dwValue == 1) ? true : false;
|
|
m_pDevice->GetRenderState(D3DRS_ALPHABLENDENABLE ,&dwValue);
|
|
m_bOldEnable[ALPHABLEND] = (dwValue == 1) ? true : false;
|
|
|
|
m_pDevice->GetRenderState(D3DRS_CULLMODE,&m_dwOldCullFace);
|
|
m_pDevice->GetRenderState(D3DRS_SRCBLEND,&m_dwOldSrcBlend);
|
|
m_pDevice->GetRenderState(D3DRS_DESTBLEND,&m_dwOldDestBlend);
|
|
|
|
m_bGetState = true;
|
|
|
|
}
|
|
}
|
|
void CShaderScene::Create(char *strShader) {
|
|
strcpy(m_strName,strShader);
|
|
}
|
|
void CShaderScene::SetLightDirection(D3DXVECTOR3 vecDir) {
|
|
m_vecLightDir = D3DXVECTOR4(vecDir.x,vecDir.y,vecDir.z,1.0f);
|
|
}
|
|
void CShaderScene::SetLightPos(D3DXVECTOR3 vecPos) {
|
|
m_vecLightPos = D3DXVECTOR4(vecPos.x,vecPos.y,vecPos.z,1.0f);
|
|
}
|
|
|