DragonNest/Common/EternityEngineSrv/EtAniObject.cpp

110 lines
1.9 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "EtAniObject.h"
using namespace EternityEngine;
CEtAniObject::CEtAniObject( CMultiRoom *pRoom )
: CEtObject( pRoom )
{
m_bCalcAni = false;
m_nCalcPositionFlag = CALC_POSITION_Y;
memset(&m_AniInfo, 0, sizeof(m_AniInfo));
}
CEtAniObject::~CEtAniObject(void)
{
if( m_hAni )
{
m_hAni->Release();
}
}
int CEtAniObject::Initialize( EtSkinHandle hSkin, EtAniHandle hAni )
{
m_hSkin = hSkin;
m_hAni = hAni;
if( m_hAni )
{
if( m_hSkin )
{
hSkin->GetMeshHandle()->LinkToAni( m_hAni );
if( hSkin->GetMeshHandle()->HasCollisionBone() )
{
m_bCalcAni = true;
}
}
}
if( m_hSkin ) {
CommonInitialize();
SetCollisionGroup( COLLISION_GROUP_DYNAMIC( 1 ) );
SetTargetCollisionGroup( COLLISION_GROUP_STATIC( 1 ) );
}
return ET_OK;
}
EtMatrix *CEtAniObject::GetBoneTransMat( int nBoneIndex )
{
if( !m_bCalcAni )
{
ASSERT( 0 && "Invalid Function Call" );
return NULL;
}
EtMatrix BoneWorldMat;
static EtMatrix BoneMat;
if( m_vecTransMat.empty() )
{
CalcAni();
}
std::vector< EtMatrix > &vecInvWordlList = GetMesh()->GetInvWorldMatList();
EtMatrixInverse( &BoneWorldMat, NULL, &vecInvWordlList[ nBoneIndex ] );
if( nBoneIndex >= m_vecTransMat.size() )
return NULL;
return EtMatrixMultiply( &BoneMat, &BoneWorldMat, &m_vecTransMat[ nBoneIndex ] );
}
EtMatrix *CEtAniObject::GetBoneMat( int nBoneIndex )
{
if( !m_bCalcAni )
{
ASSERT( 0 && "Invalid Function Call" );
return NULL;
}
if( m_vecTransMat.empty() )
{
CalcAni();
}
return &m_vecTransMat[ nBoneIndex ];
}
void CEtAniObject::SetAniFrame( int nAni, float fFrame )
{
ASSERT( fFrame >= 0.0f );
m_AniInfo.nAni = nAni;
m_AniInfo.fFrame = fFrame;
if( m_bCalcAni )
{
CalcAni();
}
}
void CEtAniObject::CalcAni()
{
if( !m_hAni )
{
return;
}
m_hAni->Reset();
m_hAni->SetCalcPositionFlag( m_nCalcPositionFlag );
m_hAni->SetAni( &m_AniInfo );
m_hAni->CalcAni( m_hSkin->GetMeshHandle()->GetInvWorldMatList(), m_vecTransMat );
}