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

313 lines
No EOL
6.5 KiB
C++

#include "StdAfx.h"
#include "EtEffectObject.h"
#include "EtEffectData.h"
#include "EtEffectElement.h"
#include "EtMatrixEx.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
DECL_SMART_PTR_STATIC( CEtEffectObject, 500 )
CEtEffectObject::CEtEffectObject()
{
m_bDelete = false;
m_nPrevTick = 0;
m_nEffectTick = 0;
m_fFloatTick = 0.0f;
m_bLoop = false;
m_fScale = 1.f;
m_bLink = false;
m_bShow = true;
EtMatrixIdentity( &m_WorldMat );
m_RenderType = RT_SCREEN;
m_LinkBoneIndex = 0;
m_nLinkType = 0;
}
CEtEffectObject::~CEtEffectObject()
{
SAFE_RELEASE_SPTR( m_hEffectData );
SAFE_DELETE_PVEC( m_vecEffectElement );
}
void CEtEffectObject::Initialize( EtEffectDataHandle hEffectData, EtMatrix *pInitMat )
{
SAFE_RELEASE_SPTR( m_hEffectData );
m_hEffectData = hEffectData;
hEffectData->AddRef();
if( pInitMat )
{
m_WorldMat = *pInitMat;
}
int i, nElementCount;
CEtEffectElement *pElement = NULL;
nElementCount = hEffectData->GetElementCount();
for( i = 0; i < nElementCount; i++ )
{
switch( hEffectData->GetElementType( i ) )
{
case ERT_MESH:
pElement = new CEtEffectMeshElement();
break;
case ERT_PARTICLE:
pElement = new CEtEffectBillboardEffectElement();
break;
case ERT_POINT_LIGHT:
pElement = new CEtEffectPointLightElement();
break;
default:
ASSERT( 0 );
break;
}
pElement->Initialize( hEffectData->GetElementData( i ) );
m_vecEffectElement.push_back( pElement );
}
}
void CEtEffectObject::ProcessLink( EtMatrix &WorldMat )
{
WorldMat = m_WorldMat;
if( m_bLink )
{
MatrixEx Cross;
Cross = m_LinkWorldMat;
MatrixEx CrossOrigin = Cross;
if( m_LinkBoneIndex != -1 )
{
EtMatrix MatParent;
EtMatrixIdentity(&MatParent);
if( m_hLinkParent )
{
if( m_nLinkType == CEtObject::LT_BONE )
{
EtMatrixMultiply( &MatParent, m_hLinkParent->GetBoneTransMat( m_LinkBoneIndex ), m_hLinkParent->GetWorldMat() );
}
else
if( m_nLinkType == CEtObject::LT_MESH_DUMMY )
{
EtMatrixMultiply( &MatParent, m_hLinkParent->GetDummyTransMat( m_LinkBoneIndex ), m_hLinkParent->GetWorldMat() );
}
}
memcpy( &Cross.m_vXAxis, &MatParent._11, sizeof(EtVector3) );
memcpy( &Cross.m_vYAxis, &MatParent._21, sizeof(EtVector3) );
memcpy( &Cross.m_vZAxis, &MatParent._31, sizeof(EtVector3) );
Cross.m_vPosition += *(EtVector3*)&MatParent._41;
Cross.m_vPosition -= *(EtVector3*)&m_LinkWorldMat._41;
}
else
{
if( m_nLinkType == CEtObject::LT_OBJECT )
{
}
}
Cross.MoveLocalZAxis( m_LinkPos.z );
Cross.MoveLocalXAxis( m_LinkPos.x );
Cross.MoveLocalYAxis( m_LinkPos.y );
Cross.RotateYaw( m_LinkRotate.y );
Cross.RotateRoll( m_LinkRotate.z );
Cross.RotatePitch( m_LinkRotate.x );
WorldMat = Cross;
}
}
void CEtEffectObject::Render( float fElapsedTime )
{
if( !m_bShow )
{
return;
}
EtMatrix WorldMat;
ProcessLink( WorldMat );
int i;
for( i = 0; i < ( int )m_vecEffectElement.size(); i++ )
{
m_vecEffectElement[ i ]->Process( WorldMat, m_nEffectTick, m_fScale );
m_vecEffectElement[ i ]->Render();
}
}
void CEtEffectObject::RenderImmediate( float fElapsedTime )
{
if( !m_bShow )
{
return;
}
EtMatrix WorldMat;
ProcessLink( WorldMat );
int i;
for( i = 0; i < ( int )m_vecEffectElement.size(); i++ )
{
m_vecEffectElement[ i ]->Process( WorldMat, m_nEffectTick, m_fScale );
m_vecEffectElement[ i ]->RenderImmediate();
}
}
bool CEtEffectObject::CalcTick( float fElapsedTime )
{
if( !m_hEffectData ) {
m_bDelete = true;
return true;
}
int nTickAdd;
m_nPrevTick = m_nEffectTick;
m_fFloatTick += ( fElapsedTime * 60 );
nTickAdd = ( int )( m_fFloatTick );
m_nEffectTick += nTickAdd;
m_fFloatTick -= nTickAdd;
if( m_nEffectTick >= ( int )m_hEffectData->GetEffectLength() )
{
if( m_bLoop ) {
m_nEffectTick -= ( int )m_hEffectData->GetEffectLength();
}
else {
m_bDelete = true;
return true;
}
}
return false;
}
void CEtEffectObject::RenderEffectObjectList( float fElapsedTime )
{
ScopeLock<CSyncLock> Lock( s_SmartPtrLock );
int i, nCount;
EtEffectObjectHandle hHandle;
std::vector< EtEffectObjectHandle > vecDeleteList;
nCount = GetItemCount();
for( i = 0; i < nCount; i++ )
{
hHandle = GetItem( i );
if( hHandle->m_bDelete )
{
vecDeleteList.push_back( hHandle );
continue;
}
hHandle->CalcTick( fElapsedTime );
if( hHandle->GetRenderType() == RT_SCREEN )
{
hHandle->Render( fElapsedTime );
}
}
nCount = ( int )vecDeleteList.size();
for( i = 0; i < nCount; i++ )
{
SAFE_RELEASE_SPTR( vecDeleteList[ i ] );
}
}
void CEtEffectObject::ProcessDeleteEffectObjectList( float fElapsedTime )
{
ScopeLock<CSyncLock> Lock( s_SmartPtrLock );
int i, nCount;
EtEffectObjectHandle hHandle;
std::vector< EtEffectObjectHandle > vecDeleteList;
nCount = GetItemCount();
for( i = 0; i < nCount; i++ )
{
hHandle = GetItem( i );
if( hHandle->m_bDelete )
{
vecDeleteList.push_back( hHandle );
continue;
}
hHandle->CalcTick( fElapsedTime );
}
nCount = ( int )vecDeleteList.size();
for( i = 0; i < nCount; i++ )
{
SAFE_RELEASE_SPTR( vecDeleteList[ i ] );
}
}
void CEtEffectObject::SetWorldMat( EtMatrix *mat )
{
m_WorldMat = *mat;
}
void CEtEffectObject::SetScale( float fScale )
{
m_fScale = fScale;
}
void CEtEffectObject::SetAlpha( float fAlpha )
{
for( DWORD i=0; i<m_vecEffectElement.size(); i++ ) {
m_vecEffectElement[ i ]->SetAlpha( fAlpha );
}
}
RenderType CEtEffectObject::SetRenderType( RenderType Type )
{
int i;
for( i = 0; i < ( int )m_vecEffectElement.size(); i++ )
{
m_vecEffectElement[ i ]->SetRenderType( Type );
}
RenderType Ret = m_RenderType;
m_RenderType = Type;
return Ret;
}
void CEtEffectObject::SetLink( EtMatrix WorldMat, char *szBoneName, EtVector3 vPos, EtVector3 vRotate, EtAniObjectHandle hParent )
{
m_LinkWorldMat = WorldMat;
m_LinkBoneIndex = -1;
m_nLinkType = CEtObject::LT_OBJECT;
if( hParent && szBoneName && strlen(szBoneName) > 0 )
{
EtMeshHandle hMesh = hParent->GetMesh();
if( hMesh )
{
m_LinkBoneIndex = hMesh->FindDummy( szBoneName );
if( m_LinkBoneIndex != -1 )
{
m_nLinkType = CEtObject::LT_MESH_DUMMY;
}
else
{
m_LinkBoneIndex = hMesh->FindBone( szBoneName );
m_nLinkType = CEtObject::LT_BONE;
}
}
}
m_LinkPos = vPos;
m_LinkRotate = vRotate;
m_hLinkParent = hParent;
m_bLink = true;
}
const char *CEtEffectObject::GetEffectFileName()
{
if( !m_hEffectData ) return "";
return m_hEffectData->GetFileName();
}
void CEtEffectObject::EnableCull( bool bEnable )
{
for( DWORD i=0; i<m_vecEffectElement.size(); i++ ) {
m_vecEffectElement[i]->EnableCull( bEnable );
}
}