2024-12-21 10:04:04 +08:00
|
|
|
|
#include "StdAfx.h"
|
|
|
|
|
|
#include "EtAniObject.h"
|
|
|
|
|
|
#include "EtSaveMat.h"
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
|
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
using namespace EternityEngine;
|
|
|
|
|
|
|
|
|
|
|
|
CSyncLock CEtAniObject::s_CalcAniLock;
|
|
|
|
|
|
|
|
|
|
|
|
CEtAniObject::CEtAniObject(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_bShadowCast = true;
|
|
|
|
|
|
m_bShadowReceive = false;
|
|
|
|
|
|
m_nCalcPositionFlag = CALC_POSITION_Y;
|
|
|
|
|
|
m_nSaveMatIndex = -1;
|
|
|
|
|
|
EnableLightMapInfluence( true );
|
|
|
|
|
|
m_bSkipPhysics = false;
|
|
|
|
|
|
m_bForceSkipSimulateAni = false;
|
|
|
|
|
|
|
|
|
|
|
|
m_nExtraAniIndex = -1;
|
|
|
|
|
|
m_fExtraAniFrame = 0.0f;
|
|
|
|
|
|
|
|
|
|
|
|
m_bAniObject = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CEtAniObject::~CEtAniObject(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
SAFE_RELEASE_SPTR( m_hAni );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CEtAniObject::Initialize( EtSkinHandle hSkin, EtAniHandle hAni )
|
|
|
|
|
|
{
|
|
|
|
|
|
bool bSkinReady, bAniReady;
|
|
|
|
|
|
|
|
|
|
|
|
m_hSkin = hSkin;
|
|
|
|
|
|
m_hAni = hAni;
|
|
|
|
|
|
m_pSkinInstance = new CEtSkinInstance();
|
|
|
|
|
|
|
|
|
|
|
|
bSkinReady = !m_hSkin->AddCallback( this );
|
|
|
|
|
|
bAniReady = false;
|
|
|
|
|
|
|
|
|
|
|
|
if( m_hAni )
|
|
|
|
|
|
{
|
|
|
|
|
|
bAniReady = !m_hAni->AddCallback( this );
|
|
|
|
|
|
if( ( bSkinReady ) && ( bAniReady ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( m_hSkin->GetMeshHandle() ) {
|
|
|
|
|
|
m_hSkin->GetMeshHandle()->LinkToAni( m_hAni );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( bSkinReady )
|
|
|
|
|
|
{
|
|
|
|
|
|
CommonInitialize();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SetCollisionGroup( COLLISION_GROUP_DYNAMIC( 1 ) );
|
|
|
|
|
|
SetTargetCollisionGroup( COLLISION_GROUP_STATIC( 1 ) );
|
|
|
|
|
|
|
|
|
|
|
|
return ET_OK;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EtMatrix *CEtAniObject::GetBoneTransMat( int nBoneIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
EtMatrix BoneWorldMat;
|
|
|
|
|
|
static EtMatrix BoneMat;
|
|
|
|
|
|
|
|
|
|
|
|
nBoneIndex = m_hAni->ConvertBoneIndex( nBoneIndex );
|
|
|
|
|
|
if( !GetEtSaveMat()->IsValidIndex( m_nSaveMatIndex ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
CalcAni();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::vector< EtMatrix > &vecInvWordlList = GetMesh()->GetInvWorldMatList();
|
|
|
|
|
|
// <20>ӽ<EFBFBD> siva - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD> <20>ٲߴϴ<DFB4>.
|
|
|
|
|
|
if( nBoneIndex < 0 || nBoneIndex >= (int)vecInvWordlList.size() ) {
|
|
|
|
|
|
_ASSERT(0&&"<EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8>̽<EFBFBD><CCBD>ϴ<EFBFBD>.");
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
EtMatrixInverse( &BoneWorldMat, NULL, &vecInvWordlList[ nBoneIndex ] );
|
|
|
|
|
|
|
|
|
|
|
|
if( GetEtSaveMat()->IsValidIndex( m_nSaveMatIndex + nBoneIndex ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
return EtMatrixMultiply( &BoneMat, &BoneWorldMat, GetEtSaveMat()->GetMatrix( m_nSaveMatIndex + nBoneIndex ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
EtMatrixIdentity( &BoneMat );
|
|
|
|
|
|
|
|
|
|
|
|
return &BoneMat;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EtMatrix *CEtAniObject::GetDummyTransMat( int nDummyIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
EtMeshHandle hMesh = m_hSkin->GetMeshHandle();
|
|
|
|
|
|
if( hMesh )
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector< EtMatrix > &vecDummyMat = hMesh->GetDummyMatrixList();
|
|
|
|
|
|
std::vector< std::string > &vecParentName = hMesh->GetDummyParentNameList();
|
|
|
|
|
|
if( nDummyIndex < ( int )vecDummyMat.size() )
|
|
|
|
|
|
{
|
|
|
|
|
|
static EtMatrix ReturnMat;
|
|
|
|
|
|
int nParentIndex = -1;
|
|
|
|
|
|
if( m_hAni )
|
|
|
|
|
|
{
|
|
|
|
|
|
nParentIndex = m_hAni->GetBoneIndex( vecParentName[ nDummyIndex ].c_str() );
|
|
|
|
|
|
}
|
|
|
|
|
|
if( nParentIndex == -1 )
|
|
|
|
|
|
{
|
|
|
|
|
|
ReturnMat = vecDummyMat[ nDummyIndex ];
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
EtMatrixMultiply( &ReturnMat, &vecDummyMat[ nDummyIndex ], GetBoneTransMat( nParentIndex ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
return &ReturnMat;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EtMatrix *CEtAniObject::GetBoneMat( int nBoneIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
nBoneIndex = m_hAni->ConvertBoneIndex( nBoneIndex );
|
|
|
|
|
|
if( !GetEtSaveMat()->IsValidIndex( m_nSaveMatIndex ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
CalcAni();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( GetEtSaveMat()->IsValidIndex( m_nSaveMatIndex ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
return GetEtSaveMat()->GetMatrix( m_nSaveMatIndex + nBoneIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::ResetAniFrame()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_vecAniInfo.clear();
|
|
|
|
|
|
m_vecBlendAniInfo.clear();
|
|
|
|
|
|
m_vecDisableBone.clear();
|
|
|
|
|
|
m_vecBoneRotation.clear();
|
|
|
|
|
|
m_vecBoneScale.clear();
|
|
|
|
|
|
m_nSaveMatIndex = -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::SetAniFrame( int nAni, float fFrame, int nBoneIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
ASSERT( fFrame >= 0.0f );
|
|
|
|
|
|
|
|
|
|
|
|
if( nBoneIndex == 0 ) // <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִϸ<D6B4><CFB8>̼<EFBFBD><CCBC><EFBFBD> <20>ʱ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
|
|
|
|
|
{
|
|
|
|
|
|
ResetAniFrame();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SAniInfo AniInfo;
|
|
|
|
|
|
|
|
|
|
|
|
if( nAni == -1 ) return;
|
|
|
|
|
|
AniInfo.BoneAniInfo.nAni = nAni;
|
|
|
|
|
|
AniInfo.BoneAniInfo.fFrame = fFrame;
|
|
|
|
|
|
AniInfo.nBoneIndex = nBoneIndex;
|
|
|
|
|
|
m_vecAniInfo.push_back( AniInfo );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::BlendAniFrame( int nBlendAni, float fBlendFrame, float fBlendWeight, int nBlendBoneIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
SAniInfo AniInfo;
|
|
|
|
|
|
|
|
|
|
|
|
if( nBlendAni == -1 ) return;
|
|
|
|
|
|
if( fBlendWeight < 0.0f || fBlendWeight > 10.0f )
|
|
|
|
|
|
{
|
|
|
|
|
|
ASSERT( 0 && "<EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>" );
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
AniInfo.BoneAniInfo.nAni = nBlendAni;
|
|
|
|
|
|
AniInfo.BoneAniInfo.fFrame = fBlendFrame;
|
|
|
|
|
|
AniInfo.BoneAniInfo.fWeight = fBlendWeight;
|
|
|
|
|
|
AniInfo.nBoneIndex = nBlendBoneIndex;
|
|
|
|
|
|
m_vecBlendAniInfo.push_back( AniInfo );
|
|
|
|
|
|
m_vecDisableBone.resize( m_vecBlendAniInfo.size() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::BlendAniFrame( int nBlendAni, float fBlendFrame, float fBlendWeight, int nBlendBoneIndex, std::vector< int > &vecDisableBone )
|
|
|
|
|
|
{
|
|
|
|
|
|
BlendAniFrame( nBlendAni, fBlendFrame, fBlendWeight, nBlendBoneIndex );
|
|
|
|
|
|
int nBlendCount = ( int )m_vecBlendAniInfo.size();
|
|
|
|
|
|
if( nBlendCount == 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if( !vecDisableBone.empty() )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_vecDisableBone[ nBlendCount - 1 ].resize( vecDisableBone.size() );
|
|
|
|
|
|
std::copy( vecDisableBone.begin(), vecDisableBone.end(), m_vecDisableBone[ nBlendCount - 1 ].begin() );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::BlendAniFrame( int nBlendAni, float fBlendFrame, float fBlendWeight, int nBlendBoneIndex, int nDisableBoneIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
BlendAniFrame( nBlendAni, fBlendFrame, fBlendWeight, nBlendBoneIndex );
|
|
|
|
|
|
int nBlendCount = ( int )m_vecBlendAniInfo.size();
|
|
|
|
|
|
if( nBlendCount == 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if( nDisableBoneIndex != -1 )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_vecDisableBone[ nBlendCount - 1 ].insert( m_vecDisableBone[ nBlendCount - 1 ].begin(), nDisableBoneIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20≯<EFBFBD> CalcAni()<29><> <20>ҷ<EFBFBD><D2B7><EFBFBD> m_nSaveMatIndex<65><78> Valid<69><64> <20><><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> BlendAni<6E><69> SetBoneRotation<6F><6E> <20>Ҹ<EFBFBD><D2B8><EFBFBD>
|
|
|
|
|
|
// m_nSaveMatIndex<65><78> Invalid<69><64><EFBFBD><EFBFBD> ǥ<><C7A5><EFBFBD>Ѵ<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_nSaveMatIndex<65><78> -1<><31> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִϸ<D6B4><CFB8>̼<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǹ鼭
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><DEB8> <20>Ҵ<EFBFBD> <20><> <20><><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD> <20>ִ<EFBFBD>.
|
|
|
|
|
|
m_bValidSaveMatIndex = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::SetBoneRotation( int nBoneIndex, EtVector3 &BoneRotation )
|
|
|
|
|
|
{
|
|
|
|
|
|
SBoneRotationInfo BoneRotationInfo;
|
|
|
|
|
|
|
|
|
|
|
|
if( nBoneIndex == -1 ) {
|
|
|
|
|
|
ASSERT( 0 && "Rotate Bone Index -1" );
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
BoneRotationInfo.nBoneIndex = nBoneIndex;
|
|
|
|
|
|
BoneRotationInfo.BoneRotation = BoneRotation;
|
|
|
|
|
|
m_vecBoneRotation.push_back( BoneRotationInfo );
|
|
|
|
|
|
// <20≯<EFBFBD> CalcAni()<29><> <20>ҷ<EFBFBD><D2B7><EFBFBD> m_nSaveMatIndex<65><78> Valid<69><64> <20><><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> BlendAni<6E><69> SetBoneRotation<6F><6E> <20>Ҹ<EFBFBD><D2B8><EFBFBD>
|
|
|
|
|
|
// m_nSaveMatIndex<65><78> Invalid<69><64><EFBFBD><EFBFBD> ǥ<><C7A5><EFBFBD>Ѵ<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_nSaveMatIndex<65><78> -1<><31> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִϸ<D6B4><CFB8>̼<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǹ鼭
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><DEB8> <20>Ҵ<EFBFBD> <20><> <20><><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD> <20>ִ<EFBFBD>.
|
|
|
|
|
|
m_bValidSaveMatIndex = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::SetBoneScale( int nBoneIndex, float fScale )
|
|
|
|
|
|
{
|
|
|
|
|
|
SBoneScaleInfo BoneScaleInfo;
|
|
|
|
|
|
|
|
|
|
|
|
if( nBoneIndex == -1 ) {
|
|
|
|
|
|
ASSERT( 0 && "Scale Bone Index -1" );
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
BoneScaleInfo.nBoneIndex = nBoneIndex;
|
|
|
|
|
|
BoneScaleInfo.fScale = fScale;
|
|
|
|
|
|
m_vecBoneScale.push_back( BoneScaleInfo );
|
|
|
|
|
|
m_bValidSaveMatIndex = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::ReBuildSkin( EtSkinHandle hSkin )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( ! hSkin ) return;
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_RELEASE_SPTR( m_hSkin );
|
|
|
|
|
|
SAFE_DELETE( m_pSkinInstance );
|
|
|
|
|
|
|
|
|
|
|
|
bool bSkinReady, bAniReady;
|
|
|
|
|
|
m_hSkin = hSkin;
|
|
|
|
|
|
m_pSkinInstance = new CEtSkinInstance();
|
|
|
|
|
|
|
|
|
|
|
|
bSkinReady = !m_hSkin->AddCallback( this );
|
|
|
|
|
|
bAniReady = false;
|
|
|
|
|
|
|
|
|
|
|
|
if( m_hAni )
|
|
|
|
|
|
{
|
|
|
|
|
|
bAniReady = !m_hAni->AddCallback( this );
|
|
|
|
|
|
if( ( bSkinReady ) && ( bAniReady ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( m_hSkin->GetMeshHandle() ) {
|
|
|
|
|
|
m_hSkin->GetMeshHandle()->LinkToAni( m_hAni );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( bSkinReady )
|
|
|
|
|
|
{
|
|
|
|
|
|
CommonInitialize();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::CalcAni()
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>忡<EFBFBD><E5BFA1> <20><><EFBFBD>ÿ<EFBFBD> ȣ<><C8A3><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.. <20><><EFBFBD>ƾ<EFBFBD> <20>Ѵ<EFBFBD>..
|
|
|
|
|
|
ScopeLock< CSyncLock > Lock( s_CalcAniLock );
|
|
|
|
|
|
|
|
|
|
|
|
if( !m_hAni )
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int i, j;
|
|
|
|
|
|
|
|
|
|
|
|
m_hAni->Reset();
|
|
|
|
|
|
m_hAni->SetCalcPositionFlag( m_nCalcPositionFlag );
|
|
|
|
|
|
if( m_nExtraAniIndex != -1 )
|
|
|
|
|
|
{
|
|
|
|
|
|
SBoneAniInfo BoneInfo;
|
|
|
|
|
|
BoneInfo.nAni = m_nExtraAniIndex;
|
|
|
|
|
|
BoneInfo.fFrame = m_fExtraAniFrame;
|
|
|
|
|
|
BoneInfo.fWeight = 0.0f;
|
|
|
|
|
|
m_hAni->SetAni( &BoneInfo, 0 );
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
for( i = 0; i < ( int )m_vecAniInfo.size(); i++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_hAni->SetAni( &m_vecAniInfo[ i ].BoneAniInfo, m_vecAniInfo[ i ].nBoneIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
for( i = 0; i < ( int )m_vecBlendAniInfo.size(); i++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
for( j = 0; j < ( int )m_vecDisableBone[ i ].size(); j++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_hAni->EnableBlend( m_vecDisableBone[ i ][ j ], false );
|
|
|
|
|
|
}
|
|
|
|
|
|
m_hAni->BlendAni( &m_vecBlendAniInfo[ i ].BoneAniInfo, m_vecBlendAniInfo[ i ].nBoneIndex );
|
|
|
|
|
|
for( j = 0; j < ( int )m_vecDisableBone[ i ].size(); j++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_hAni->EnableBlend( m_vecDisableBone[ i ][ j ], true );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
for( i = 0; i < ( int )m_vecBoneRotation.size(); i++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_hAni->SetBoneRotation( m_vecBoneRotation[ i ].nBoneIndex, &m_vecBoneRotation[ i ].BoneRotation );
|
|
|
|
|
|
}
|
|
|
|
|
|
for( i = 0; i < ( int )m_vecBoneScale.size(); i++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_hAni->SetBoneScale( m_vecBoneScale[ i ].nBoneIndex, m_vecBoneScale[ i ].fScale );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_nSaveMatIndex = m_hAni->CalcAni( GetMesh()->GetInvWorldMatList() );
|
|
|
|
|
|
m_bValidSaveMatIndex = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::CreateSimulation( const char *szFileName )
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map<std::string, int > boneIndexMap;
|
|
|
|
|
|
int nBoneCount = m_hAni->GetBoneCount();
|
|
|
|
|
|
for( int i = 0; i < nBoneCount; i++) {
|
|
|
|
|
|
boneIndexMap[ m_hAni->GetBone(i)->GetName() ] = i;
|
|
|
|
|
|
}
|
|
|
|
|
|
m_Spring.Create( szFileName, GetMesh()->GetInvWorldMatList(), boneIndexMap );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::SimulateAni()
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ִ<EFBFBD> <20>߸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>Ʒ<EFBFBD> InvWorldMatList <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|
|
|
|
|
if( m_hAni->GetBoneCount() > (int)(GetMesh()->GetInvWorldMatList().size()) )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
m_Spring.Simulate( m_WorldMat, GetMesh()->GetInvWorldMatList() );
|
|
|
|
|
|
|
|
|
|
|
|
int nBoneCount = m_hAni->GetBoneCount();
|
|
|
|
|
|
|
|
|
|
|
|
EtMatrix *pLockedMatrices = NULL;
|
|
|
|
|
|
m_nSaveMatIndex = GetEtSaveMat()->LockMatrix( nBoneCount, &pLockedMatrices);
|
|
|
|
|
|
for( i = 0; i < nBoneCount; i++) {
|
|
|
|
|
|
EtMatrix TransMat, VertexTransMat;
|
|
|
|
|
|
if( i == 0 ) {
|
|
|
|
|
|
EtMatrixIdentity( &VertexTransMat );
|
|
|
|
|
|
pLockedMatrices[ i ] = VertexTransMat;
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
EtMatrix InvWorldMat;
|
|
|
|
|
|
EtMatrixInverse(&InvWorldMat, NULL, &m_WorldMat);
|
|
|
|
|
|
int nChildOffset = 0;
|
|
|
|
|
|
if( m_hAni->GetBone( i )->GetChildBoneCount() > 0 ) {
|
|
|
|
|
|
nChildOffset = m_hAni->GetBone( i )->GetChild( 0 )->GetBoneIndex() - m_hAni->GetBone( i )->GetBoneIndex();
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
nChildOffset = m_hAni->GetBone( i )->GetParent()->GetBoneIndex() - m_hAni->GetBone( i )->GetBoneIndex();
|
|
|
|
|
|
}
|
|
|
|
|
|
TransMat = m_Spring.GetMatrix( i, nChildOffset );
|
|
|
|
|
|
EtMatrixMultiply( &TransMat, &TransMat, &InvWorldMat);
|
|
|
|
|
|
EtMatrixMultiply( &VertexTransMat, &GetMesh()->GetInvWorldMatList()[i], &TransMat );
|
|
|
|
|
|
pLockedMatrices[ i ] = VertexTransMat;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::ForceSkipSimulateAni( bool bForceSkip, bool bApplyChild )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( m_Spring.IsEnable() )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_bForceSkipSimulateAni = bForceSkip;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( bApplyChild )
|
|
|
|
|
|
{
|
|
|
|
|
|
for( int i = 0; i < ( int )m_vecChild.size(); i++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( m_vecChild[ i ]->IsAniObject() )
|
|
|
|
|
|
( ( EtAniObjectHandle )m_vecChild[ i ] )->ForceSkipSimulateAni( bForceSkip );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::InitRender( int nSaveMatIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !IsShow() )
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// #25479
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /go 404<30>ϴ°<CFB4> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>ӵ<EFBFBD><D3B5> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><> <20>ٽ<EFBFBD> /go 404 <20>Ҷ<EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>ũ<EFBFBD><C5A9> Process<73>Լ<EFBFBD><D4BC><EFBFBD> EtInterface::Process( fDelta ); <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ鼭 <20><><EFBFBD>̵<EFBFBD> <20>ƿ<EFBFBD><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̴ϼ<CCB4><CFBC><EFBFBD> <20>Ѵ<EFBFBD>.
|
|
|
|
|
|
// <20>̶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4>...
|
|
|
|
|
|
// <20><> <20>Ʒ<EFBFBD> EternityEngine::RenderFrame( fDelta ); <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>ٶ<EFBFBD><D9B6><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD> FLT_MAX <20>ʱⰪ <20><><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20>ְ<EFBFBD> <20>ȴ<EFBFBD>.
|
|
|
|
|
|
// <20><> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD>İ<EFBFBD><C4B0><EFBFBD><EFBFBD>ϴ°<CFB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> ȣ<><C8A3><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> ȣ<><C8A3><EFBFBD>ɶ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>,
|
|
|
|
|
|
// <20>ùķ<C3B9><C4B7>̼<EFBFBD><CCBC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<CFB1><E2B6A7><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9>̶<EFBFBD><CCB6><EFBFBD> FLT_MAX<41><58><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD> <20>ǹ<EFBFBD><C7B9><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
// <20><EFBFBD><D7B7><EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD> FLT_MAX<41><58><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD><C7B4>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> Invalid<69>ϴٸ<CFB4> SimulateAni<6E><69> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>ϰڴ<CFB0>.
|
|
|
|
|
|
bool bInvalidPos = ( m_PrevWorldMat._11 == FLT_MAX );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȿ<EFBFBD><C8BF> <20>ֻ<EFBFBD><D6BB><EFBFBD> <20>θ<EFBFBD><CEB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><C4B0><EFBFBD> <20>̻<EFBFBD><CCBB>ϸ<EFBFBD> <20>ùķ<C3B9><C4B7>̼<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
|
// <20><>Ÿ<EFBFBD>鼭 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Face<63><65><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> InitRenderȣ<72><C8A3><EFBFBD>ϴ<EFBFBD> <20>͵鶧<CDB5><E9B6A7><EFBFBD><EFBFBD>, <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>찡 <20>ִ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
if( m_hParent )
|
|
|
|
|
|
{
|
|
|
|
|
|
EtObjectHandle hParent = m_hParent;
|
|
|
|
|
|
while( 1 )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( hParent->GetParent() )
|
|
|
|
|
|
hParent = hParent->GetParent();
|
|
|
|
|
|
else
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( hParent->GetWorldMat()->_41 == FLT_MAX )
|
|
|
|
|
|
bInvalidPos = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
if( m_hParent )
|
|
|
|
|
|
{
|
|
|
|
|
|
CalcParentBoneMat();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( m_hAni )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( m_Spring.IsEnable() ) {
|
|
|
|
|
|
if( m_bSkipPhysics ) {
|
|
|
|
|
|
CalcAni();
|
|
|
|
|
|
m_Spring.InputKeyframe( m_WorldMat, m_nSaveMatIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
if( m_bForceSkipSimulateAni == false && bInvalidPos == false )
|
|
|
|
|
|
SimulateAni();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
if( m_hParent ) {
|
|
|
|
|
|
if( m_hAni->GetMyIndex() != m_hParent->GetAniFileIndex() )
|
|
|
|
|
|
{
|
|
|
|
|
|
nSaveMatIndex = -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if( m_nLinkBoneIndex != -1 )
|
|
|
|
|
|
{
|
|
|
|
|
|
// SaveMatIndex<65><78> <20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰڴ<CFB0>.
|
|
|
|
|
|
// <20>ֵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ani<6E><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݺ<EFBFBD><DDBA>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SaveMatIndex<65><78><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE>ΰ<EFBFBD>,
|
|
|
|
|
|
// (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20>Ӹ<EFBFBD>, <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʋ<EFBFBD><C6B2> <20><><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>θ<EFBFBD><CEB8>Ʒ<EFBFBD> <20>ִ<EFBFBD> <20>ڽ<EFBFBD><DABD>̱<CCB1><E2B6A7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SaveMatIndex<65><78> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˴ϴ<CBB4>.)
|
|
|
|
|
|
// RenderStack::RenderBlock <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> SetWorldMatArray ȣ<><C8A3><EFBFBD>Ҷ<EFBFBD>
|
|
|
|
|
|
// <20>ش<EFBFBD> Object<63><74> WorldMat<61><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SaveMat<61><74><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> EtSaveMat::m_vecTransMat<61><74> <20>־<EFBFBD><D6BE>ΰ<EFBFBD> <20><><EFBFBD>Եȴ<D4B5>.
|
|
|
|
|
|
//
|
|
|
|
|
|
// <20><EFBFBD><D7B7><EFBFBD> <20><> Ani<6E><69><EFBFBD>ϸ<EFBFBD> <20>˻<EFBFBD><CBBB>ϴ°ŷδ<C5B7> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DFBB><EFBFBD> <20><> <20>ִ<EFBFBD>.
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SaveMatIndex<65><78> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> Object<63><74> <20>߿<EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_nLinkBoneIndex<65><78> -1<>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF> <20><><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִٸ<D6B4>, <20><> Object<63><74> WorldMat<61><74> <20><EFBFBD><DEB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
// <20>̶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD><C6BE> Ÿ<>鼭 <20><><EFBFBD><EFBFBD> RenderBlock<63><6B> ȣ<><C8A3><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TransMat<61><74> <20>ѹ<EFBFBD> <20><><EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߸<EFBFBD> <20><>ũ<EFBFBD>Ȱ<EFBFBD>ó<EFBFBD><C3B3> <20><><EFBFBD>̰<EFBFBD> <20>ȴ<EFBFBD>.
|
|
|
|
|
|
// <20><EFBFBD><D7B7><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> LinkBoneIndex<65><78> -1<><31> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20>θ<EFBFBD><CEB8>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><DEB9><EFBFBD> SaveMatIndex<65><78> <20><>ȿȭ<C8BF><C8AD>Ű<EFBFBD><C5B0>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_nSaveMatIndex<65><78> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
|
|
|
|
|
|
nSaveMatIndex = -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
bool bMySaveMatInvalid = false;
|
|
|
|
|
|
if( ( !GetEtSaveMat()->IsValidIndex( m_nSaveMatIndex ) ) || ( !m_bValidSaveMatIndex ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
bMySaveMatInvalid = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
if( ( !GetEtSaveMat()->IsValidIndex( nSaveMatIndex ) ) && ( bMySaveMatInvalid ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
CalcAni();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if( !GetEtSaveMat()->IsValidIndex( m_nSaveMatIndex ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_nSaveMatIndex = nSaveMatIndex;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for( i = 0; i < ( int )m_vecChild.size(); i++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_vecChild[ i ]->InitRender( m_nSaveMatIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CEtAniObject::OnLoadComplete( CBackgroundLoader *pLoader )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( m_hAni )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( ( m_hSkin->IsReady() ) && ( m_hAni->IsReady() ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( m_hSkin->GetMeshHandle() ) {
|
|
|
|
|
|
m_hSkin->GetMeshHandle()->LinkToAni( m_hAni );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if( m_hSkin->IsReady() )
|
|
|
|
|
|
{
|
|
|
|
|
|
return CEtObject::OnLoadComplete( pLoader );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CBackgroundLoaderCallback::OnLoadComplete( pLoader );
|
|
|
|
|
|
}
|
|
|
|
|
|
|