DragonNest/Common/EternityEngine/EtVolumeFog.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

131 lines
4 KiB
C++

#include "StdAfx.h"
#include "EtVolumeFog.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CEtVolumeFog::CEtVolumeFog()
{
}
CEtVolumeFog::~CEtVolumeFog()
{
Clear();
}
void CEtVolumeFog::Clear()
{
SAFE_RELEASE_SPTR( m_hTexture );
}
void CEtVolumeFog::Render( float fElapsedTime )
{
EtCameraHandle hCamera;
EtMatrix *pCamMat;
EtVector3 vOutput;
hCamera = CEtCamera::GetActiveCamera();
pCamMat = hCamera->GetInvViewMat();
m_CamXVector = *(EtVector4*)&pCamMat->_11;
m_CamYVector = *(EtVector4*)&pCamMat->_21;
m_CamPos = *(EtVector4*)&pCamMat->_41;
SRenderStackElement RenderElement;
RenderElement.hMaterial = m_hMaterial;
RenderElement.nTechniqueIndex = 0;
EtMatrixIdentity(&RenderElement.WorldMat );
RenderElement.nSaveMatIndex = -1;
RenderElement.pvecCustomParam = &m_vecCustomParam;
RenderElement.pRenderMeshStream = &m_MeshStream;
RenderElement.nBakeDepthIndex = DT_NONE;
SStateBlock RenderState;
RenderState.AddRenderState( D3DRS_CULLMODE, CULL_NONE );
RenderElement.nStateBlockIndex = CEtStateBlockManager::GetInstance().CreateStateBlock(&RenderState);
GetCurRenderStack()->AddAlphaRenderElement( RenderElement );
}
void CEtVolumeFog::Initialize( const char *pFogTexture, EtVector3 Pos, float fRadius, float fDensity, float fHeight, D3DXCOLOR FogColor )
{
int nIndexCount, nVertexCount;
EtVector2 *pTexCoord;
EtVector3 *pvPosition;
WORD *pwIndex;
int nCount = (int)__max( 5, ( fRadius * fRadius * 0.0001f * fDensity));
nVertexCount = 4 * nCount;
nIndexCount = 6 * nCount;
pvPosition = new EtVector3[ nVertexCount ];
pTexCoord = new EtVector2[ nVertexCount ];
pwIndex = new WORD[ nIndexCount ];
for( int i = 0; i < nCount; i++) {
float fAngle = 2*D3DX_PI*(rand()%1024)/1023.f;
float fDist = sqrtf((rand()%2048)/2047.f) * fRadius;
EtVector3 vPos;
vPos.x = cosf(fAngle)*fDist + Pos.x;
vPos.y = Pos.y + (rand()%50) - 25;
vPos.z = sinf(fAngle)*fDist + Pos.z;
pvPosition[ i*4+0 ] = vPos;
pvPosition[ i*4+1 ] = vPos;
pvPosition[ i*4+2 ] = vPos;
pvPosition[ i*4+3 ] = vPos;
pTexCoord[ i*4+0 ] = EtVector2(0, 1);
pTexCoord[ i*4+1 ] = EtVector2(0, 0);
pTexCoord[ i*4+2 ] = EtVector2(1, 1);
pTexCoord[ i*4+3 ] = EtVector2(1, 0);
pwIndex[ i*6+0 ] = i*4+0;
pwIndex[ i*6+1 ] = i*4+1;
pwIndex[ i*6+2 ] = i*4+2;
pwIndex[ i*6+3 ] = i*4+2;
pwIndex[ i*6+4 ] = i*4+1;
pwIndex[ i*6+5 ] = i*4+3;
}
CMemoryStream Stream;
Stream.Initialize( pvPosition, nVertexCount * sizeof( EtVector3 ) );
m_MeshStream.LoadVertexStream( &Stream, MST_POSITION, 0, nVertexCount );
Stream.Initialize( pTexCoord, nVertexCount * sizeof( EtVector2 ) );
m_MeshStream.LoadVertexStream( &Stream, MST_TEXCOORD, 0, nVertexCount );
Stream.Initialize( pwIndex, nIndexCount * sizeof( WORD ) );
m_MeshStream.LoadIndexStream( &Stream, false, nIndexCount );
delete [] pvPosition;
delete [] pTexCoord;
delete [] pwIndex;
m_hMaterial = LoadResource( "VolumeFog.fx", RT_SHADER );
#ifdef PRE_FIX_MATERIAL_DUMP
if( !m_hMaterial ) return;
#endif
m_hTexture = LoadResource( pFogTexture, RT_TEXTURE );
if( m_hTexture ) {
int nTexIndex = m_hTexture->GetMyIndex();
AddCustomParam( m_vecCustomParam, EPT_TEX, m_hMaterial, "g_VolumeFogTex", &nTexIndex );
}
AddCustomParam( m_vecCustomParam, EPT_VECTOR_PTR, m_hMaterial, "g_CamXVector", &m_CamXVector );
AddCustomParam( m_vecCustomParam, EPT_VECTOR_PTR, m_hMaterial, "g_CamYVector", &m_CamYVector );
AddCustomParam( m_vecCustomParam, EPT_VECTOR_PTR, m_hMaterial, "g_CamPos", &m_CamPos );
AddCustomParam( m_vecCustomParam, EPT_FLOAT, m_hMaterial, "g_fFogHeight", &fHeight );
AddCustomParam( m_vecCustomParam, EPT_VECTOR, m_hMaterial, "g_VolumeFogColor", &FogColor);
}
EtVolumeFogHandle CEtVolumeFog::CreateVolumeFog( const char *pRainTexture , EtVector3 Pos, float fRadius, float fDensity, float fHeight, D3DXCOLOR FogColor )
{
CEtVolumeFog *pRainEffect;
pRainEffect = new CEtVolumeFog();
pRainEffect->Initialize( pRainTexture, Pos, fRadius, fDensity, fHeight, FogColor );
return pRainEffect->GetMySmartPtr();
}