DragonNest/Server/DNGameServer/MAActorRenderBase.cpp

207 lines
5 KiB
C++
Raw Permalink Normal View History

#include "Stdafx.h"
#include "MAActorRenderBase.h"
#include "PerfCheck.h"
MAActorRenderBase::MAActorRenderBase()
: m_vAniDistance( 0.f, 0.f, 0.f )
, m_vAddAniDistance( 0.f, 0.f, 0.f )
, m_vScale( 1.f, 1.f, 1.f )
{
ResetActorRenderBase();
}
MAActorRenderBase::~MAActorRenderBase()
{
}
void MAActorRenderBase::ResetActorRenderBase()
{
m_LocalTime = 0;
m_AniTime = 0;
m_nAniIndex = -1;
m_nBlendAniIndex = -1;
m_fBlendAniFrame = 0.f;
m_fBlendFrame = 0.f;
m_fBlendStartFrame = 0.f;
m_fBlendCurFrame = 0.f;
m_fFrame = m_fPrevFrame = 0.f;
m_vAniDistance = EtVector3( 0.f, 0.f, 0.f );
m_vAddAniDistance = EtVector3( 0.f, 0.f, 0.f );
m_vScale = EtVector3( 1.f, 1.f, 1.f );
m_fFPS = 60.f;
}
void MAActorRenderBase::ChangeAnimation( int nAniIndex, float fFrame, float fBlendFrame )
{
m_nBlendAniIndex = m_nAniIndex;
m_fBlendStartFrame = fFrame;
m_fBlendFrame = fBlendFrame;
if( m_fBlendFrame == 0.f ) m_nBlendAniIndex = -1;
if( m_nBlendAniIndex != -1 ) {
m_fBlendAniFrame = m_fFrame;
float fAniLength = (float)m_hObject->GetLastFrame( m_nBlendAniIndex );
if( m_fBlendAniFrame >= fAniLength ) {
m_fBlendAniFrame = fAniLength;
}
}
m_nAniIndex = nAniIndex;
m_AniTime = m_LocalTime - (LOCAL_TIME)( fFrame / m_fFPS * 1000.f );
if( m_AniTime < 0 ) m_AniTime = 0;
m_fFrame = fFrame;
m_fPrevFrame = fFrame;
}
int MAActorRenderBase::GetBoneIndex( const char *szBoneName )
{
return m_hObject->GetAniHandle()->GetBoneIndex( szBoneName );
}
const char *MAActorRenderBase::GetBoneName( int nBoneIndex )
{
if( nBoneIndex < 0 || nBoneIndex >= m_hObject->GetAniHandle()->GetBoneCount() ) return "";
return m_hObject->GetAniHandle()->GetBone( nBoneIndex )->GetName();
}
void MAActorRenderBase::Process( EtMatrix *pmatWorld, LOCAL_TIME LocalTime, float fDelta )
{
m_LocalTime = LocalTime;
if( !m_hObject ) return;
EtMatrix matTemp, matScale;
EtMatrixScaling( &matScale, m_vScale.x, m_vScale.y, m_vScale.z );
EtMatrixMultiply( &matTemp, &matScale, pmatWorld );
m_hObject->Update( &matTemp );
}
void MAActorRenderBase::CalcAniDistance( int nAniIndex, float fFrame, float fPrevFrame, EtVector3 &vDist )
{
vDist = EtVector3( 0.f, 0.f, 0.f );
if( m_hObject ) m_hObject->CalcAniDistance( nAniIndex, fFrame, fPrevFrame, vDist );
}
void MAActorRenderBase::PreProcess( LOCAL_TIME LocalTime, float fDelta )
{
if( m_nAniIndex == -1 ) return;
if( !m_hObject || !m_hObject->GetAniHandle() ) return;
if( m_nAniIndex >= m_hObject->GetAniCount() ) return;
// Calc Ani
if( 0.0f < m_fFPS )
m_fFrame = ( ( m_LocalTime - m_AniTime ) / 1000.f ) * m_fFPS;
float fAniLength = (float)m_hObject->GetLastFrame( m_nAniIndex );
if( m_fFrame < 0.f ) m_fFrame = fAniLength;
if( m_fFrame >= fAniLength ) {
m_fFrame = fAniLength;
}
m_hObject->SetAniFrame( m_nAniIndex, m_fFrame );
// Calc Ani Distance
CalcAniDistance( m_nAniIndex, m_fFrame, m_fPrevFrame, m_vAniDistance );
m_vAniDistance += m_vAddAniDistance;
m_vAddAniDistance = EtVector3( 0.f, 0.f, 0.f );
if( m_hObject->GetCalcPositionFlag() & CALC_POSITION_X ) m_vAniDistance.x = 0.f;
if( m_hObject->GetCalcPositionFlag() & CALC_POSITION_Y ) m_vAniDistance.y = 0.f;
if( m_hObject->GetCalcPositionFlag() & CALC_POSITION_Z ) m_vAniDistance.z = 0.f;
m_fPrevFrame = m_fFrame;
}
int MAActorRenderBase::GetAniIndex( const char *szAniName )
{
if( !m_hObject || szAniName == NULL) return -1;
for( int i=0; i<m_hObject->GetAniCount(); i++ ) {
if( strcmp( m_hObject->GetAniName(i), szAniName ) == NULL ) return i;
}
return -1;
}
EtMatrix MAActorRenderBase::GetBoneMatrix( const char *szBoneName )
{
EtMatrix mat;
if( !m_hObject || szBoneName == NULL )
{
EtMatrixIdentity( &mat );
return mat;
}
int nBoneIndex = m_hObject->GetAniHandle()->GetBoneIndex( szBoneName );
if( nBoneIndex == -1 )
return *m_hObject->GetWorldMat();;
EtMatrix *pmatBoneTransMat = m_hObject->GetBoneTransMat( nBoneIndex );
if( pmatBoneTransMat == NULL )
return *m_hObject->GetWorldMat();
EtMatrixMultiply( &mat, m_hObject->GetBoneTransMat( nBoneIndex ), m_hObject->GetWorldMat() );
return mat;
}
void MAActorRenderBase::AddAniDistance( EtVector3 &vVec )
{
m_vAddAniDistance += vVec;
}
EtVector3 *MAActorRenderBase::GetAniDistance()
{
return &m_vAniDistance;
}
bool MAActorRenderBase::GetBoundingSphere( SSphere &Sphere )
{
if( !m_hObject ) return false;
m_hObject->GetBoundingSphere( Sphere );
return true;
}
bool MAActorRenderBase::GetBoundingBox( SAABox &Box )
{
if( !m_hObject ) return false;
m_hObject->GetBoundingBox( Box );
return true;
}
bool MAActorRenderBase::GetOriginalBoundingBox( SAABox &Box )
{
if( !m_hObject ) return false;
m_hObject->GetOriginalBoundingBox( Box );
return true;
}
void MAActorRenderBase::SetFPS( float fValue )
{
m_AniTime = m_LocalTime - (LOCAL_TIME)( m_fFrame / fValue * 1000.f );
m_fFPS = fValue;
}
float MAActorRenderBase::GetFPS()
{
return m_fFPS;
}
void MAActorRenderBase::SetFrame( float fValue )
{
m_fFrame = fValue;
m_AniTime = m_LocalTime - (LOCAL_TIME)( m_fFrame / m_fFPS * 1000.f );
if( m_AniTime < 0 ) m_AniTime = 0;
}
void MAActorRenderBase::SetPrevFrame( float fValue )
{
m_fPrevFrame = fValue;
}