Files
Client/GameTools/Zallad3D SceneClass/Shader_Rain.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
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>
2025-11-29 20:17:20 +09:00

169 lines
5.1 KiB
C++
Raw Blame History

// Shader_Rain.cpp: implementation of the CShader_Rain class.
//
//////////////////////////////////////////////////////////////////////
#include "Shader_Rain.h"
#include "Shader_RainV.h"
#include "SceneManager.h"
#include "SceneStateMgr.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CShader_Rain::CShader_Rain()
{
m_pVertexShader = new CShader_RainV;
m_pDevice = CSceneManager::GetDevice();
}
CShader_Rain::~CShader_Rain()
{
if(m_pVertexShader != NULL) {
delete m_pVertexShader;
m_pVertexShader = NULL;
}
}
void CShader_Rain::Apply() {
if(m_pVertexShader != NULL) {
m_pVertexShader->Apply();
}
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING, FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_POINTSPRITEENABLE, TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALEENABLE, FALSE );
CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSIZE_MIN, FtoDW(0.1f) );
CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSIZE_MAX, FtoDW(64.0f) );
CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSIZE, FtoDW(32.0f) );
CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALE_A, FtoDW(1.00f) );
CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALE_B, FtoDW(0.00f) );
CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALE_C, FtoDW(0.00f) );
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE );
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE, FALSE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE );
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
}
void CShader_Rain::UnApply() {
ApplyOldState();
CSceneStateMgr::_SetD3DRenderState(D3DRS_POINTSPRITEENABLE, FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE, TRUE);
/*
CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSIZE_MIN, FtoDW(0.1f) );
CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSIZE_MAX, FtoDW(64.0f) );
CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSIZE, FtoDW(32.0f) );
*/
}
float CalcTriangleArea(D3DXVECTOR3 vecA,D3DXVECTOR3 vecB,D3DXVECTOR3 vecC) {
// <20><EFBFBD><EEB8AE> <20><>Ģ(Triangle<6C><65> <20><><EFBFBD><EFBFBD> return)
float fS;
float fLen[3];
D3DXVECTOR3 vecAB,vecBC,vecCA;
vecAB = vecB - vecA;
fLen[0] = D3DXVec3Length(&vecAB);
vecBC = vecC - vecB;
fLen[1] = D3DXVec3Length(&vecBC);
vecCA = vecA - vecC;
fLen[2] = D3DXVec3Length(&vecCA);
fS = (fLen[0] + fLen[1] + fLen[2]) / 2.0f;
return (float)sqrt(fS * (fS - fLen[0]) * (fS - fLen[1]) * (fS - fLen[2]));
}
// Create Rain(Point Sprite)Buffer
void CreateRainBuffer(LPDIRECT3DVERTEXBUFFER8 pRainBuffer,DWORD &dwVertsNum,D3DXVECTOR3 *pPos,D3DXVECTOR3 *pNormal,WORD *pIndex,int iIndexNum)
{
int i;
float fArea = 0.0f;
D3DXVECTOR3 vecA,vecB,vecC;
D3DXVECTOR3 vecNA,vecNB,vecNC;
if((pRainBuffer == NULL) || (dwVertsNum == 0)) {
if(pRainBuffer != NULL) {
pRainBuffer->Release();
pRainBuffer = NULL;
}
for(i=0; i < iIndexNum; i+=3 ) {
vecA = pPos[pIndex[i]];
vecB = pPos[pIndex[i+1]];
vecC = pPos[pIndex[i+2]];
fArea += CalcTriangleArea(vecA,vecB,vecC);
}
dwVertsNum = (fArea * SPLASH_RATIOS);
CSceneManager::GetDevice()->CreateVertexBuffer(dwVertsNum * sizeof(RainVertex),0,0,D3DPOOL_MANAGED,&pRainBuffer);
}
fArea = 0.0f;
RainVertex *pRainVert = NULL;
pRainBuffer->Lock(0,0,(BYTE **)&pRainVert,0);
for(i = 0; i < iIndexNum; i+=3) {
vecA = pPos[pIndex[i]];
vecB = pPos[pIndex[i+1]];
vecC = pPos[pIndex[i+2]];
vecNA = pNormal[pIndex[i]];
vecNB = pNormal[pIndex[i+1]];
vecNC = pNormal[pIndex[i+2]];
fArea += (SPLASH_RATIOS * CalcTriangleArea(vecA,vecB,vecC));
while(fArea > 1.0f) {
float fR1,fR2;
D3DXVECTOR3 vecS,vecT;
fR1 = ((float)(rand() % 1000)) / 1000.0f;
fR2 = 1.0f - fR1;
fR2 = fR2 * ((float)(rand() % 1000) / 1000.0f);
vecS = vecB - vecA;
vecT = vecC - vecA;
pRainVert->vecPos = D3DXVECTOR3((vecA.x + vecS.x * fR1 + vecT.x * fR2),
(vecA.y + vecS.y * fR1 + vecT.y * fR2),
(vecA.z + vecS.z * fR1 + vecT.z * fR2));
pRainVert->vecNormal = D3DXVECTOR3(((vecNA.x + vecNB.x + vecNC.x) / 3.0f),
((vecNA.y + vecNB.y + vecNC.y) / 3.0f),
((vecNA.z + vecNB.z + vecNC.z) / 3.0f));
pRainVert->fLoop = (float)(100 + rand() % 900) / 100.0f;
fArea -= 1.0f;
pRainVert++;
}
}
pRainBuffer->Unlock();
}