2024-12-21 10:04:04 +08:00
|
|
|
#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;
|
|
|
|
|
}
|