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>
208 lines
7.0 KiB
C++
208 lines
7.0 KiB
C++
// WBWaterVShader.cpp: implementation of the WBWaterVShader class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "WBWaterVShader.h"
|
|
//#include "WBCamera.h"
|
|
//#include "WBRenderState.h"
|
|
#include "ShaderConstants.h"
|
|
#include "SceneManager.h"
|
|
#include "WBEnvPlaneTex.h"
|
|
#include "SceneStateMgr.h"
|
|
|
|
//extern WBCamera g_Camera;
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
WBWaterVShader::WBWaterVShader()
|
|
{
|
|
DWORD vertexshaderdeclaration[]=
|
|
{
|
|
D3DVSD_STREAM(0),
|
|
(D3DVSD_REG(0, D3DVSDT_FLOAT3)), // vertex position
|
|
D3DVSD_REG(1, D3DVSDT_FLOAT2), // Texture
|
|
|
|
D3DVSD_END()
|
|
};
|
|
|
|
|
|
CreateVertexShader("c:/mp-project/Shaders/Water.vsh",vertexshaderdeclaration);
|
|
m_fDisScale = 0.8f;
|
|
m_fTexcoordDisScale = 0.3f;
|
|
//m_fTexcoordDisScale = 5.3f;
|
|
|
|
m_Const1 = D3DXVECTOR4( 0.0f, 0.5f, 1.0f, 2.0f );
|
|
|
|
m_Const2 = D3DXVECTOR4( 0.0f, 0.5f, -1.0f, 1.0f );
|
|
D3DXMatrixIdentity(&m_matTmWorld);
|
|
|
|
}
|
|
|
|
|
|
WBWaterVShader::~WBWaterVShader()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
void WBWaterVShader::Apply() {
|
|
CSceneManager::GetDevice()->SetVertexShader(m_dwVertexShader);
|
|
SetupVertexShaderConstants();
|
|
|
|
}
|
|
|
|
void WBWaterVShader::SetupVertexShaderConstants() {
|
|
|
|
/* CSceneManager::GetDevice()->SetVertexShaderConstant(CV_ZERO, D3DXVECTOR4(0.0f, 0.0f, 0.0f, 0.0f), 1);
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant(CV_ONE, D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f), 1);
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant(CV_HALF, D3DXVECTOR4(0.5f, 0.5f, 0.5f, 0.5f), 1);
|
|
*/
|
|
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_CONSTS_1, &m_Const1, 1 );
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_CONSTS_2, &m_Const2, 1 );
|
|
|
|
|
|
int i;
|
|
for( i=0; i < 4; i++ )
|
|
{
|
|
CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
|
|
CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
|
|
CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_MIPFILTER, D3DTEXF_POINT ); // nearest level
|
|
}
|
|
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ZENABLE, D3DZB_TRUE );
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ZWRITEENABLE, true );
|
|
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_WATERBUMPSCALE, D3DXVECTOR4(0.0f, 0.0f, 0.0f, 0.12f), 1);
|
|
////////////
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_CALC_SXT, D3DXVECTOR4( 0.0f, 1.0f, 0.0f, 0.0f), 1 );
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
|
|
|
|
// General setup
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_WRAP0, 0 );
|
|
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE, D3DCULL_NONE );
|
|
|
|
|
|
D3DXVECTOR4 vec = D3DXVECTOR4( m_fDisScale, m_fDisScale, m_fDisScale, m_fDisScale );
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_DISPSCALE, &vec, 1 );
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
|
|
vec = D3DXVECTOR4( m_fTexcoordDisScale, m_fTexcoordDisScale,m_fTexcoordDisScale, m_fTexcoordDisScale );
|
|
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_OFFSETSCALE, &vec, 1 );
|
|
|
|
|
|
// Texture 0 is set elsewhere to be the normal map
|
|
CSceneManager::GetDevice()->SetTexture( 1, NULL);
|
|
CSceneManager::GetDevice()->SetTexture( 2, NULL);
|
|
|
|
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState( 3, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP );
|
|
CSceneStateMgr::_SetD3DTextureStageState( 3, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP );
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_WRAP3, 0 );
|
|
|
|
// CSceneManager::GetDevice()->SetTexture( 3, m_pSkyTexture );
|
|
|
|
|
|
//////////////////////////////////////////////////////////
|
|
// alpha blend for quasi-Fresnel term
|
|
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, true );
|
|
// CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, false );
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_INVSRCALPHA );
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCALPHA );
|
|
|
|
/* CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCALPHA );*/
|
|
//////////////////////////////////////////////////////////
|
|
|
|
// Setup the vertex & pixel shaders
|
|
// CSceneManager::GetDevice()->SetVertexShader( m_dwVSH_Dot3x2EMBM_Displace );
|
|
// CSceneManager::GetDevice()->SetPixelShader( m_dwPSH_Dot3x2EMBM_Displace );
|
|
|
|
|
|
////////////
|
|
|
|
D3DXMATRIX matWorld,matView,matProject;
|
|
//CSceneManager::GetDevice()->GetTransform( D3DTS_WORLD ,&matWorld);
|
|
D3DXMatrixIdentity(&matWorld);
|
|
|
|
CSceneManager::GetDevice()->GetTransform( D3DTS_VIEW ,&matView);
|
|
CSceneManager::GetDevice()->GetTransform( D3DTS_PROJECTION,&matProject);
|
|
|
|
|
|
/*D3DXMATRIX matWorld = WBRenderState::GetWorldTransform();
|
|
D3DXMATRIX matView = WBRenderState::GetViewTransform();
|
|
D3DXMATRIX matProject = WBRenderState::GetProjectTransform();*/
|
|
D3DXMATRIX matTemp;
|
|
|
|
D3DXMATRIX matWorldViewProj;
|
|
D3DXMATRIX matWorldView;
|
|
|
|
D3DXMatrixMultiply(&matWorld,&matWorld,&m_matTmWorld);
|
|
D3DXMatrixMultiply(&matWorldView, &matWorld, &matView);
|
|
|
|
D3DXMatrixMultiply(&matTemp,&matView,&matProject);
|
|
D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matTemp);
|
|
|
|
// Projection to clip space
|
|
|
|
D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
|
|
|
|
|
|
D3DXMATRIX invWV;
|
|
|
|
D3DXMatrixInverse( &invWV, NULL, &matTemp );
|
|
|
|
// D3DXMatrixInverse( &invWV, NULL, &matWorldView );
|
|
|
|
D3DXVECTOR4 outV, inV;
|
|
inV = D3DXVECTOR4( 0.0f, 0.0f, 0.0f, 1.0f );
|
|
|
|
D3DXVec4Transform( &outV, &inV, &invWV );
|
|
|
|
// Homogenize and invert
|
|
|
|
outV.x = - outV.x / outV.w;
|
|
outV.y = - outV.y / outV.w;
|
|
outV.z = - outV.z / outV.w;
|
|
outV.w = outV.w / outV.w;
|
|
|
|
outV.x = -outV.x;
|
|
outV.y = -outV.y;
|
|
|
|
|
|
|
|
D3DXMatrixTranspose(&matWorldView,&matWorldView);
|
|
|
|
// This is now the eye location in obj space
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_EYE_OBJSPC, &outV, 1 );
|
|
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);
|
|
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_WORLD_0, &matWorldView(0, 0), 1);
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_WORLD_1, &matWorldView(1, 0), 1);
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_WORLD_2, &matWorldView(2, 0), 1);
|
|
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_BASISTRANSFORM_0, &matWorldView(0, 0), 1);
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_BASISTRANSFORM_1, &matWorldView(1, 0), 1);
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_BASISTRANSFORM_2, &matWorldView(2, 0), 1);
|
|
|
|
// D3DXMatrixTranspose(&(CSceneManager::m_pEnvPlaneTex->m_matReflect),&(CSceneManager::m_pEnvPlaneTex->m_matReflect));
|
|
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_REFLECTMAT_0,&(CSceneManager::m_pEnvPlaneTex->m_matReflect(0,0)),1);
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_REFLECTMAT_1,&(CSceneManager::m_pEnvPlaneTex->m_matReflect(1,0)),1);
|
|
CSceneManager::GetDevice()->SetVertexShaderConstant( CV_REFLECTMAT_2,&(CSceneManager::m_pEnvPlaneTex->m_matReflect(2,0)),1);
|
|
|
|
|
|
}
|