DragonNest/Client/EtWorldPainter/ECRVolumeFog.cpp
2024-12-19 09:48:26 +08:00

81 lines
3.2 KiB
C++

#include "Stdafx.h"
#include "ECRVolumeFog.h"
#include "UnionValueProperty.h"
#include "TEtWorldEventArea.h"
#include "TEtWorldSector.h"
#include "TEtWorldEventControl.h"
CECRVolumeFog::CECRVolumeFog( const char *szEventControlName )
: CEventCustomRender( szEventControlName )
{
}
CECRVolumeFog::~CECRVolumeFog()
{
SAFE_RELEASE_SPTR( m_hVolumeFog );
}
void CECRVolumeFog::Initialize()
{
CTEtWorldSector *pSector = (CTEtWorldSector *)m_pEventArea->GetControl()->GetSector();
EtVector3 vOffset = *pSector->GetOffset();
vOffset.x -= ( pSector->GetTileWidthCount() * pSector->GetTileSize() ) / 2.f;
vOffset.z -= ( pSector->GetTileHeightCount() * pSector->GetTileSize() ) / 2.f;
vOffset.y = 0.f;
int nEventAreaCommonParamCount = 0;
for( int i=0; ; i++ ) {
if( g_EventAreaPropertyDefine[i].szCategory == NULL ) break;
nEventAreaCommonParamCount = i + 1;
}
SAFE_RELEASE_SPTR( m_hVolumeFog );
m_pEventArea->CalcOBB();
float fRadius = max( m_pEventArea->GetOBB()->Extent[0], m_pEventArea->GetOBB()->Extent[2] );
float fHeight = m_pEventArea->GetMax()->y - m_pEventArea->GetMin()->y;
D3DXCOLOR Color = m_pEventArea->GetProperty(2+nEventAreaCommonParamCount)->GetVariableVector4();
EtVector3 vCenter = m_pEventArea->GetOBB()->Center;
vCenter.y = pSector->GetHeight( m_pEventArea->GetOBB()->Center.x, m_pEventArea->GetOBB()->Center.z );
vCenter.y += m_pEventArea->GetMin()->y;
float fDensity = m_pEventArea->GetProperty(1+nEventAreaCommonParamCount)->GetVariableFloat();
if( fDensity <= 0.f ) fDensity = 0.001f;
char *szTexName = m_pEventArea->GetProperty(0+nEventAreaCommonParamCount)->GetVariableString();
m_hVolumeFog = CEtVolumeFog::CreateVolumeFog( ( szTexName ) ? szTexName : "", vCenter + vOffset, fRadius, fDensity, fHeight, Color );
}
void CECRVolumeFog::OnSelect()
{
}
void CECRVolumeFog::OnUnselect()
{
}
void CECRVolumeFog::OnModify()
{
CTEtWorldSector *pSector = (CTEtWorldSector *)m_pEventArea->GetControl()->GetSector();
EtVector3 vOffset = *pSector->GetOffset();
vOffset.x -= ( pSector->GetTileWidthCount() * pSector->GetTileSize() ) / 2.f;
vOffset.z -= ( pSector->GetTileHeightCount() * pSector->GetTileSize() ) / 2.f;
vOffset.y = 0.f;
int nEventAreaCommonParamCount = 0;
for( int i=0; ; i++ ) {
if( g_EventAreaPropertyDefine[i].szCategory == NULL ) break;
nEventAreaCommonParamCount = i + 1;
}
SAFE_RELEASE_SPTR( m_hVolumeFog );
m_pEventArea->CalcOBB();
float fRadius = max( m_pEventArea->GetOBB()->Extent[0], m_pEventArea->GetOBB()->Extent[2] );
float fHeight = m_pEventArea->GetMax()->y - m_pEventArea->GetMin()->y;
D3DXCOLOR Color = m_pEventArea->GetProperty(2+nEventAreaCommonParamCount)->GetVariableVector4();
EtVector3 vCenter = m_pEventArea->GetOBB()->Center;
vCenter.y = pSector->GetHeight( m_pEventArea->GetOBB()->Center.x, m_pEventArea->GetOBB()->Center.z );
vCenter.y += m_pEventArea->GetMin()->y;
float fDensity = m_pEventArea->GetProperty(1+nEventAreaCommonParamCount)->GetVariableFloat();
if( fDensity <= 0.f ) fDensity = 0.001f;
char *szTexName = m_pEventArea->GetProperty(0+nEventAreaCommonParamCount)->GetVariableString();
m_hVolumeFog = CEtVolumeFog::CreateVolumeFog( ( szTexName ) ? szTexName : "", vCenter + vOffset, fRadius, fDensity, fHeight, Color );
}