이펙트 출력
이펙트 애니메이션이 종료되는 시점(이펙트 애니메이션 시간)을 알아야한다.
아래 함수는 이펙트 애니메이션 길이(시간)을 알아내는
함수이다.
//////////////////////////////////////////////////////////////////////////////
<이펙트
출력 순서>
1. 이펙트를 로딩한다.
2. 아래 함수를 통해 애니메이션 길이(m_fAnimLength)을 구한다.
3.
이펙트 애니메이션 시작 시간을 정한다.
NiTimeController::StartAnimations( m_spEffect,
m_fStartTime );
4. 이펙트 종료를 체크한다.
if( fTime - m_fStartTime >=
m_fAnimLength )
m_spEffect = 0; // 이펙트 노드 제거
else
m_spEffect->Update( fTime
);
//////////////////////////////////////////////////////////////////////////////
void
RecursiveGetAnimRange(NiAVObject* pkObject, float& rfLoKeyTime, float&
rfHiKeyTime)
{
NiTimeController* pkController =
pkObject->GetControllers();
while ( pkController )
{
float fLoTime = pkController->GetBeginKeyTime();
float fHiTime =
pkController->GetEndKeyTime();
if ( fLoTime < rfLoKeyTime
)
rfLoKeyTime = fLoTime;
if ( fHiTime > rfHiKeyTime
)
rfHiKeyTime = fHiTime;
pkController->SetAnimType( NiTimeController::APP_INIT );
pkController = pkController->GetNext();
}
// Do the same for any animation controllers attached to the rendering
properties
if ( NiIsKindOf( NiAVObject, pkObject ) )
{
NiAVObject* pAVObj = (NiAVObject*)pkObject;
pAVObj->SetSelectiveUpdate(true);
pAVObj->SetSelectiveUpdateTransforms(true);
pAVObj->SetSelectiveUpdatePropertyControllers(true);
pAVObj->SetSelectiveUpdateRigid(false);
NiTListIterator kPos =
pAVObj->GetPropertyList().GetHeadPos();
while (
kPos )
{
NiProperty *pProp =
pAVObj->GetPropertyList().GetNext( kPos );
if ( pProp )
{
for ( pkController = pProp->GetControllers();
pkController; pkController = pkController->GetNext() )
{
float fLoTime =
pkController->GetBeginKeyTime();
float fHiTime =
pkController->GetEndKeyTime();
if ( fLoTime <
rfLoKeyTime )
rfLoKeyTime = fLoTime;
if ( fHiTime > rfHiKeyTime )
rfHiKeyTime =
fHiTime;
pkController->SetAnimType( NiTimeController::APP_INIT
);
}
}
}
}
if ( NiIsKindOf( NiNode, pkObject ) )
{
NiNode* pkNode
= (NiNode*)pkObject;
for ( unsigned int i = 0; i <
pkNode->GetArrayCount(); ++i )
{
NiAVObject*
pkChild = pkNode->GetAt( i );
if ( pkChild )
RecursiveGetAnimRange( pkChild, rfLoKeyTime, rfHiKeyTime );
}
}
}
------------------------------------------------------------------
ex)
float fLoTime = NI_INFINITY;
float fHiTime = -NI_INFINITY;
RecursiveGetAnimRange( m_spModel, fLoTime, fHiTime );
m_fAnimLength =
fHiTime - fLoTime; // 애니메이션 전체 시간 계산
[출처] GameBryo - 이펙트 출력|작성자 모냐
'Gamebryo > Effect' 카테고리의 다른 글
강의자료 - 파티클 예제 (0) | 2011.03.22 |
---|---|
Setup about Effect Dumy… (0) | 2011.03.21 |
파티클 컨트롤 해보기 (0) | 2011.02.24 |
이펙트 작업에 필요한 기능 (0) | 2011.01.27 |
검광, 검기 잔상 효과에 대하여... (1) | 2011.01.21 |