forked from metin2/client
639 lines
16 KiB
C++
639 lines
16 KiB
C++
|
#include "StdAfx.h"
|
|||
|
#include "manager.h"
|
|||
|
|
|||
|
#include <EffectLib/EffectManager.h>
|
|||
|
#include <MilesLib/SoundManager.h>
|
|||
|
|
|||
|
int CManager::ms_iMode;
|
|||
|
int CManager::ms_icurType;
|
|||
|
bool CManager::ms_isEdit;
|
|||
|
bool CManager::ms_PlayFlag;
|
|||
|
bool CManager::ms_LoopFlag;
|
|||
|
DWORD CManager::ms_dwLocalFrame;
|
|||
|
float CManager::ms_fLocalTime;
|
|||
|
float CManager::ms_fLimitTime;
|
|||
|
int CManager::ms_iFrameCount;
|
|||
|
int CManager::ms_iLoopCount;
|
|||
|
int CManager::ms_icurLoopCount;
|
|||
|
float CManager::ms_fMotionStartTime;
|
|||
|
float CManager::ms_fElapsedTime;
|
|||
|
CManager::TTimeNodeList CManager::ms_TimeNodeList;
|
|||
|
DWORD CManager::ms_dwModelIndex;
|
|||
|
DWORD CManager::ms_dwShapeIndex;
|
|||
|
DWORD CManager::ms_dwMotionIndex;
|
|||
|
DWORD CManager::ms_dwSoundIndex;
|
|||
|
|
|||
|
CRaceDataAccessor CManager::ms_RaceData;
|
|||
|
CRaceManagerAccessor CManager::ms_RaceManager;
|
|||
|
CActorInstanceAccessor CManager::ms_ActorInstance;
|
|||
|
CEffectData * CManager::ms_pEffectData;
|
|||
|
|
|||
|
CManager::TCharacterDataMap CManager::ms_CharacterDataMap;
|
|||
|
CManager::TChangedDataObserverList CManager::ms_ChangedDataObserverList;
|
|||
|
CDynamicPool<CEffectInstance> CManager::ms_EffectInstancePool;
|
|||
|
CManager::TEffectInstanceList CManager::ms_EffectInstanceList;
|
|||
|
CManager::TSoundFileNameMap CManager::ms_SoundFileNameMap;
|
|||
|
CManager::TReserveMotionDeque CManager::ms_ReserveMotionDeque;
|
|||
|
CManager::TItemDataMap CManager::ms_ItemDataMap;
|
|||
|
|
|||
|
void CManager::SetLocalTime(float fTime)
|
|||
|
{
|
|||
|
ms_fLocalTime = fTime;
|
|||
|
ms_dwLocalFrame = DWORD(ms_fLocalTime / 0.033f);
|
|||
|
}
|
|||
|
|
|||
|
void CManager::SetLimitTime(float fTime)
|
|||
|
{
|
|||
|
ms_fLimitTime = fTime;
|
|||
|
ms_iFrameCount = fTime / 0.033333f;
|
|||
|
}
|
|||
|
|
|||
|
DWORD CManager::GetCurrentModelIndex()
|
|||
|
{
|
|||
|
return ms_dwModelIndex;
|
|||
|
}
|
|||
|
|
|||
|
DWORD CManager::GetCurrentMotionIndex()
|
|||
|
{
|
|||
|
return ms_dwMotionIndex;
|
|||
|
}
|
|||
|
|
|||
|
DWORD CManager::GetCurrentSoundIndex()
|
|||
|
{
|
|||
|
return ms_dwSoundIndex;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CManager::isModel()
|
|||
|
{
|
|||
|
return 0 != ms_dwModelIndex;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CManager::isMotion()
|
|||
|
{
|
|||
|
return 0 != ms_dwMotionIndex;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CManager::isSound()
|
|||
|
{
|
|||
|
return 0 != ms_dwSoundIndex;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CManager::isEffect()
|
|||
|
{
|
|||
|
return MODEL_TYPE_EFFECT == ms_icurType;
|
|||
|
}
|
|||
|
|
|||
|
float CManager::GetCurrentTime()
|
|||
|
{
|
|||
|
return float(CTimer::Instance().GetCurrentMillisecond()) / 1000.0f;
|
|||
|
}
|
|||
|
|
|||
|
float CManager::GetLimitTime()
|
|||
|
{
|
|||
|
return ms_fLimitTime;
|
|||
|
}
|
|||
|
|
|||
|
float CManager::GetLocalTime()
|
|||
|
{
|
|||
|
return ms_fLocalTime;
|
|||
|
}
|
|||
|
|
|||
|
struct FChangedModel
|
|||
|
{
|
|||
|
void operator() (CManager::IChangedDataObserver * pObserver)
|
|||
|
{
|
|||
|
pObserver->OnChangedModel();
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
struct FChangedMotion
|
|||
|
{
|
|||
|
void operator() (CManager::IChangedDataObserver * pObserver)
|
|||
|
{
|
|||
|
pObserver->OnChangedMotion();
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
struct FChangedSound
|
|||
|
{
|
|||
|
void operator() (CManager::IChangedDataObserver * pObserver)
|
|||
|
{
|
|||
|
pObserver->OnChangedSound();
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
struct FChangedReserveMotion
|
|||
|
{
|
|||
|
void operator() (CManager::IChangedDataObserver * pObserver)
|
|||
|
{
|
|||
|
pObserver->OnChangedReserveMotion();
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
void CManager::SetModelIndex(DWORD dwIndex)
|
|||
|
{
|
|||
|
if (dwIndex == ms_dwModelIndex)
|
|||
|
return;
|
|||
|
|
|||
|
BOOL bChangedModel = FALSE;
|
|||
|
if (ms_dwModelIndex != dwIndex)
|
|||
|
{
|
|||
|
bChangedModel = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
ms_dwModelIndex = dwIndex;
|
|||
|
ms_dwMotionIndex = GetRandomMotionIndex(dwIndex);
|
|||
|
Refresh();
|
|||
|
|
|||
|
if (bChangedModel)
|
|||
|
for_each(ms_ChangedDataObserverList.begin(), ms_ChangedDataObserverList.end(), FChangedModel());
|
|||
|
}
|
|||
|
|
|||
|
void CManager::SetMotionIndex(DWORD dwIndex)
|
|||
|
{
|
|||
|
if (dwIndex == ms_dwMotionIndex)
|
|||
|
return;
|
|||
|
|
|||
|
switch (ms_iMode)
|
|||
|
{
|
|||
|
case MODE_EDIT:
|
|||
|
ms_dwMotionIndex = dwIndex;
|
|||
|
Refresh();
|
|||
|
|
|||
|
for_each(ms_ChangedDataObserverList.begin(), ms_ChangedDataObserverList.end(), FChangedMotion());
|
|||
|
break;
|
|||
|
|
|||
|
case MODE_VIEW:
|
|||
|
ReserveMotionIndex(dwIndex);
|
|||
|
for_each(ms_ChangedDataObserverList.begin(), ms_ChangedDataObserverList.end(), FChangedReserveMotion());
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CManager::ReserveMotionIndex(DWORD dwIndex)
|
|||
|
{
|
|||
|
ms_ReserveMotionDeque.push_back(dwIndex);
|
|||
|
}
|
|||
|
|
|||
|
void CManager::SetSoundIndex(DWORD dwIndex)
|
|||
|
{
|
|||
|
ms_dwSoundIndex = dwIndex;
|
|||
|
|
|||
|
for_each(ms_ChangedDataObserverList.begin(), ms_ChangedDataObserverList.end(), FChangedSound());
|
|||
|
}
|
|||
|
|
|||
|
void CManager::ClearSoundIndex()
|
|||
|
{
|
|||
|
SetSoundIndex(0);
|
|||
|
}
|
|||
|
|
|||
|
void CManager::InsertSoundData(DWORD dwModelIndex, DWORD dwMotionIndex, float fTime, const char * c_szFileName)
|
|||
|
{
|
|||
|
TCharacterData * pCharacterData;
|
|||
|
if (!GetCharacterDataPointer(dwModelIndex, &pCharacterData))
|
|||
|
return;
|
|||
|
|
|||
|
NSound::TSoundData SoundData;
|
|||
|
SoundData.fTime = fTime;
|
|||
|
SoundData.strSoundFileName = c_szFileName;
|
|||
|
|
|||
|
if (isEffect())
|
|||
|
{
|
|||
|
InsertSoundData(&pCharacterData->SoundDataVector, SoundData);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
TMotionDataMap::iterator itorMotion = pCharacterData->MotionDataMap.find(ms_dwMotionIndex);
|
|||
|
if (itorMotion == pCharacterData->MotionDataMap.end())
|
|||
|
return;
|
|||
|
|
|||
|
TMotionData * pMotionData = &itorMotion->second;
|
|||
|
|
|||
|
InsertSoundData(&pMotionData->SoundDataVector, SoundData);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CManager::InsertSoundData(NSound::TSoundDataVector * pSoundDataVector, const NSound::TSoundData & c_rSoundData)
|
|||
|
{
|
|||
|
int iSize = int(pSoundDataVector->size()) - 1;
|
|||
|
int i;
|
|||
|
|
|||
|
for (i = 0; i < iSize; ++i)
|
|||
|
{
|
|||
|
if (c_rSoundData.fTime >= pSoundDataVector->at(i).fTime)
|
|||
|
if (c_rSoundData.fTime <= pSoundDataVector->at(i+1).fTime)
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
NSound::TSoundDataVector::iterator itor = pSoundDataVector->begin();
|
|||
|
|
|||
|
for (int j = 0; j < i; ++j)
|
|||
|
++itor;
|
|||
|
|
|||
|
pSoundDataVector->insert(itor, c_rSoundData);
|
|||
|
}
|
|||
|
|
|||
|
void CManager::Refresh()
|
|||
|
{
|
|||
|
ms_PlayFlag = false;
|
|||
|
ms_fLocalTime = 0.001f;
|
|||
|
ms_dwLocalFrame = 0;
|
|||
|
SetLimitTime(0.0f);
|
|||
|
ms_fMotionStartTime = float(CTimer::Instance().GetCurrentMillisecond()) / 1000.0f;
|
|||
|
ms_TimeNodeList.clear();
|
|||
|
ms_ActorInstance.__SetLocalTime(ms_fLocalTime);
|
|||
|
|
|||
|
//////////////////////////////////////
|
|||
|
|
|||
|
ms_RaceData.Destroy();
|
|||
|
ms_ActorInstance.Clear();
|
|||
|
ms_ActorInstance.ClearAttachingEffect();
|
|||
|
ms_pEffectData->Clear();
|
|||
|
CEffectManager::Instance().DeleteAllInstances();
|
|||
|
DestroyEffect();
|
|||
|
|
|||
|
//////////////////////////////////////
|
|||
|
|
|||
|
TCharacterDataMap::iterator itorModel = ms_CharacterDataMap.find(ms_dwModelIndex);
|
|||
|
if (itorModel == ms_CharacterDataMap.end())
|
|||
|
return;
|
|||
|
|
|||
|
TCharacterData & rCharacterData = itorModel->second;
|
|||
|
ms_icurType = rCharacterData.eModelType;
|
|||
|
|
|||
|
if (MODEL_TYPE_EFFECT == rCharacterData.eModelType)
|
|||
|
{
|
|||
|
const char * c_szFileName = rCharacterData.strModelScriptFileName.c_str();
|
|||
|
ms_pEffectData->Clear();
|
|||
|
if (!ms_pEffectData->LoadScript(c_szFileName))
|
|||
|
{
|
|||
|
Tracef(" Failed to load effect : %s\n", c_szFileName);
|
|||
|
}
|
|||
|
SetLimitTime(1.0f);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// Model
|
|||
|
ms_RaceData.Destroy();
|
|||
|
ms_RaceData.LoadRaceData(rCharacterData.strModelScriptFileName.c_str());
|
|||
|
ms_ActorInstance.SetRaceDataPointer(&ms_RaceData);
|
|||
|
ms_ActorInstance.RefreshActorInstance();
|
|||
|
ms_ActorInstance.SetShape(ms_dwShapeIndex);
|
|||
|
ms_ActorInstance.SetFlyTarget(D3DXVECTOR3(0.0f, -1000.0f, 50.0f));
|
|||
|
ms_ActorInstance.SetFishingPosition(D3DXVECTOR3(0.0f, -300.0f, 0.0f));
|
|||
|
RefreshEquipment(rCharacterData.EquipmentDataList); // Equipment of Model
|
|||
|
|
|||
|
// Motion - Temporary
|
|||
|
// <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ۴<D9B2>.
|
|||
|
// <20><EFBFBD> <20><><EFBFBD>°<EFBFBD> <20>Ǹ<EFBFBD> Refresh<73><68> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
|
|||
|
// <20><><EFBFBD><EFBFBD> ViewMode<64><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
ms_RaceData.RegisterMotionMode(0);
|
|||
|
TMotionDataMap::iterator itorMotion = rCharacterData.MotionDataMap.find(ms_dwMotionIndex);
|
|||
|
if (itorMotion != rCharacterData.MotionDataMap.end())
|
|||
|
{
|
|||
|
TMotionData & rMotionData = itorMotion->second;
|
|||
|
|
|||
|
DWORD dwID = 0;
|
|||
|
|
|||
|
ms_RaceData.RegisterMotionData(0, 0, rMotionData.strFullFileName.c_str());
|
|||
|
CRaceMotionData * pRaceMotionData;
|
|||
|
if (ms_RaceData.GetMotionDataPointer(dwID, &pRaceMotionData))
|
|||
|
{
|
|||
|
const char * c_szFileName = pRaceMotionData->GetMotionFileName();
|
|||
|
CGraphicThing * pMotion = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(c_szFileName);
|
|||
|
ms_ActorInstance.RegisterMotionThing(dwID, pMotion);
|
|||
|
ms_ActorInstance.SetMotion(0);
|
|||
|
ms_ActorInstance.SetMotionData(pRaceMotionData);
|
|||
|
ms_ActorInstance.SetPosition(0.0f, 0.0f, 0.0f);
|
|||
|
|
|||
|
SetLimitTime(ms_ActorInstance.GetMotionDuration(0));
|
|||
|
ms_iLoopCount = pRaceMotionData->GetLoopCount();
|
|||
|
ms_icurLoopCount = ms_iLoopCount;
|
|||
|
}
|
|||
|
|
|||
|
// Equipment of Motion
|
|||
|
RefreshEquipment(rMotionData.EquipmentDataList);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CManager::RefreshEquipment(const TEquipmentDataList & c_rEquipmentDataList)
|
|||
|
{
|
|||
|
TEquipmentDataList::const_iterator itor = c_rEquipmentDataList.begin();
|
|||
|
for (; itor != c_rEquipmentDataList.end(); ++itor)
|
|||
|
{
|
|||
|
const TEquipmentData & c_rEquipmentData = *itor;
|
|||
|
|
|||
|
ms_RaceData.RegisterAttachingBoneName(c_rEquipmentData.iPartIndex,
|
|||
|
c_rEquipmentData.strAttachingBoneName.c_str());
|
|||
|
|
|||
|
ms_ActorInstance.AttachWeapon(0, c_rEquipmentData.iPartIndex, c_rEquipmentData.pItemData);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CManager::BlendMotion(DWORD dwIndex, float fBlendTime)
|
|||
|
{
|
|||
|
if (ms_dwMotionIndex == dwIndex)
|
|||
|
return;
|
|||
|
|
|||
|
TCharacterDataMap::iterator itorModel = ms_CharacterDataMap.find(ms_dwModelIndex);
|
|||
|
if (itorModel == ms_CharacterDataMap.end())
|
|||
|
return;
|
|||
|
|
|||
|
TCharacterData & rCharacterData = itorModel->second;
|
|||
|
TMotionDataMap::iterator itorMotion = rCharacterData.MotionDataMap.find(dwIndex);
|
|||
|
if (itorMotion != rCharacterData.MotionDataMap.end())
|
|||
|
{
|
|||
|
const std::string & c_rMotionFileName = itorMotion->second.strFullFileName;
|
|||
|
CGraphicThing * pMotion = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(c_rMotionFileName.c_str());
|
|||
|
|
|||
|
/////
|
|||
|
|
|||
|
ms_dwMotionIndex = dwIndex;
|
|||
|
for_each(ms_ChangedDataObserverList.begin(), ms_ChangedDataObserverList.end(), FChangedMotion());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CManager::RegisterChangedDataObserver(IChangedDataObserver * pObserver)
|
|||
|
{
|
|||
|
ms_ChangedDataObserverList.push_back(pObserver);
|
|||
|
}
|
|||
|
|
|||
|
BOOL CManager::GetCharacterDataPointer(DWORD dwIndex, TCharacterData ** ppCharacterData)
|
|||
|
{
|
|||
|
TCharacterDataMap::iterator itorModel = ms_CharacterDataMap.find(dwIndex);
|
|||
|
if (itorModel == ms_CharacterDataMap.end())
|
|||
|
return FALSE;
|
|||
|
|
|||
|
*ppCharacterData = &itorModel->second;
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CManager::GetCharacterMotionDataPointer(DWORD dwModelIndex, DWORD dwMotionIndex, TMotionData ** ppMotionData)
|
|||
|
{
|
|||
|
TCharacterData * pCharacterData;
|
|||
|
if (!GetCharacterDataPointer(dwModelIndex, &pCharacterData))
|
|||
|
return FALSE;
|
|||
|
|
|||
|
TMotionDataMap::iterator itorMotion = pCharacterData->MotionDataMap.find(ms_dwMotionIndex);
|
|||
|
if (itorMotion == pCharacterData->MotionDataMap.end())
|
|||
|
return FALSE;
|
|||
|
|
|||
|
*ppMotionData = &itorMotion->second;
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CManager::GetCharacterSoundDataVector(DWORD dwModelIndex, DWORD dwMotionIndex, NSound::TSoundDataVector ** ppSoundDataVector)
|
|||
|
{
|
|||
|
if (MODEL_TYPE_EFFECT == ms_icurType)
|
|||
|
{
|
|||
|
TCharacterData * pCharacterData;
|
|||
|
if (!GetCharacterDataPointer(dwModelIndex, &pCharacterData))
|
|||
|
return FALSE;
|
|||
|
|
|||
|
*ppSoundDataVector = &(pCharacterData->SoundDataVector);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
TMotionData * pMotionData;
|
|||
|
if (!GetCharacterMotionDataPointer(dwModelIndex, dwMotionIndex, &pMotionData))
|
|||
|
return FALSE;
|
|||
|
|
|||
|
*ppSoundDataVector = &(pMotionData->SoundDataVector);
|
|||
|
}
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CManager::GetSoundFileName(DWORD dwSoundIndex, const char ** c_pszFileName)
|
|||
|
{
|
|||
|
TSoundFileNameMap::iterator itor = ms_SoundFileNameMap.find(dwSoundIndex);
|
|||
|
if (itor == ms_SoundFileNameMap.end())
|
|||
|
return FALSE;
|
|||
|
|
|||
|
*c_pszFileName = itor->second.c_str();
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
DWORD CManager::GetRandomMotionIndex(DWORD dwModelIndex)
|
|||
|
{
|
|||
|
TCharacterData * pCharacterData;
|
|||
|
if (GetCharacterDataPointer(GetCurrentModelIndex(), &pCharacterData))
|
|||
|
if (!pCharacterData->BasisMotionIDVector.empty())
|
|||
|
{
|
|||
|
int iRandomMotionArrayIndex = rand() % int(pCharacterData->BasisMotionIDVector.size());
|
|||
|
DWORD dwRandomMotionIndex = pCharacterData->BasisMotionIDVector[iRandomMotionArrayIndex];
|
|||
|
return dwRandomMotionIndex;
|
|||
|
}
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
void CManager::TimeProcess()
|
|||
|
{
|
|||
|
// Getting Elapsed Time
|
|||
|
static DWORD s_dwLastTime = CTimer::Instance().GetCurrentMillisecond();
|
|||
|
ms_fElapsedTime = float(CTimer::Instance().GetCurrentMillisecond() - s_dwLastTime) / 1000.0f;
|
|||
|
s_dwLastTime = CTimer::Instance().GetCurrentMillisecond();
|
|||
|
// Getting Elapsed Time
|
|||
|
|
|||
|
switch (ms_iMode)
|
|||
|
{
|
|||
|
case MODE_EDIT:
|
|||
|
if (ms_PlayFlag)
|
|||
|
{
|
|||
|
ms_fLocalTime += ms_fElapsedTime;
|
|||
|
|
|||
|
UpdateSound();
|
|||
|
++ms_dwLocalFrame;
|
|||
|
|
|||
|
CRaceMotionData * pRaceMotionData;
|
|||
|
if (ms_RaceData.GetMotionDataPointer(0, &pRaceMotionData))
|
|||
|
if (pRaceMotionData->IsLoopMotion())
|
|||
|
{
|
|||
|
if (ms_fLocalTime > pRaceMotionData->GetLoopEndTime())
|
|||
|
{
|
|||
|
if (ms_icurLoopCount > 1 || ms_icurLoopCount == -1)
|
|||
|
{
|
|||
|
if (ms_icurLoopCount > 1)
|
|||
|
--ms_icurLoopCount;
|
|||
|
SetLocalTime(pRaceMotionData->GetLoopStartTime());
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (ms_fLocalTime > ms_fLimitTime)
|
|||
|
{
|
|||
|
ms_fLocalTime = 0.001f;
|
|||
|
ms_dwLocalFrame = 0;
|
|||
|
ms_icurLoopCount = ms_iLoopCount;
|
|||
|
|
|||
|
ms_PlayFlag = false;
|
|||
|
|
|||
|
if (ms_LoopFlag)
|
|||
|
PlayMotion(TRUE);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case MODE_VIEW:
|
|||
|
ms_fLocalTime += ms_fElapsedTime;
|
|||
|
if (ms_fLocalTime-ms_fMotionStartTime > ms_fLimitTime - 0.3f)
|
|||
|
{
|
|||
|
ms_fMotionStartTime = float(CTimer::Instance().GetCurrentMillisecond()) / 1000.0f;
|
|||
|
|
|||
|
if (ms_ReserveMotionDeque.empty())
|
|||
|
{
|
|||
|
DWORD dwRandomMotionIndex = GetRandomMotionIndex(GetCurrentModelIndex());
|
|||
|
if (0 != dwRandomMotionIndex)
|
|||
|
{
|
|||
|
BlendMotion(dwRandomMotionIndex, 0.3f);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DWORD dwMotionIndex = ms_ReserveMotionDeque.front();
|
|||
|
BlendMotion(dwMotionIndex, 0.3f);
|
|||
|
ms_ReserveMotionDeque.pop_front();
|
|||
|
for_each(ms_ChangedDataObserverList.begin(), ms_ChangedDataObserverList.end(), FChangedReserveMotion());
|
|||
|
}
|
|||
|
}
|
|||
|
UpdateSound();
|
|||
|
++ms_dwLocalFrame;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CManager::UpdateSound()
|
|||
|
{
|
|||
|
NSound::TSoundDataVector * pSoundDataVector;
|
|||
|
if (!GetCharacterSoundDataVector(GetCurrentModelIndex(), GetCurrentMotionIndex(), &pSoundDataVector))
|
|||
|
return;
|
|||
|
|
|||
|
float fcurTime = GetCurrentTime();
|
|||
|
for (TTimeNodeList::iterator itor = ms_TimeNodeList.begin(); itor != ms_TimeNodeList.end();)
|
|||
|
{
|
|||
|
TTimeNode & rTimeNode = *itor;
|
|||
|
|
|||
|
NSound::TSoundInstanceVector SoundInstanceVector;
|
|||
|
NSound::DataToInstance(*pSoundDataVector, &SoundInstanceVector);
|
|||
|
|
|||
|
// Start - Update SoundInstanceVector
|
|||
|
for (DWORD i = 0; i < SoundInstanceVector.size(); ++i)
|
|||
|
{
|
|||
|
const NSound::TSoundInstance & c_rSoundInstance = SoundInstanceVector[i];
|
|||
|
|
|||
|
if (c_rSoundInstance.dwFrame == ms_dwLocalFrame)
|
|||
|
{
|
|||
|
CSoundManager::Instance().PlaySound2D(c_rSoundInstance.strSoundFileName.c_str());
|
|||
|
}
|
|||
|
}
|
|||
|
// End - Update SoundInstanceVector
|
|||
|
|
|||
|
if (fcurTime - rTimeNode.fStartTime >= ms_fLimitTime)
|
|||
|
{
|
|||
|
itor = ms_TimeNodeList.erase(itor);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
++itor;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CManager::PlayMotion(BOOL bLoopFlag)
|
|||
|
{
|
|||
|
if (MODE_VIEW == ms_iMode)
|
|||
|
return;
|
|||
|
|
|||
|
if (!isMotion() && !isEffect())
|
|||
|
return;
|
|||
|
|
|||
|
if (ms_PlayFlag)
|
|||
|
{
|
|||
|
SetLocalTime(0.0f);
|
|||
|
//return;
|
|||
|
}
|
|||
|
|
|||
|
ms_PlayFlag = true;
|
|||
|
ms_LoopFlag = bLoopFlag;
|
|||
|
|
|||
|
// Temporary
|
|||
|
if (MODEL_TYPE_EFFECT == ms_icurType)
|
|||
|
{
|
|||
|
CEffectInstance * pInstance = ms_EffectInstancePool.Alloc();
|
|||
|
pInstance->Clear();
|
|||
|
pInstance->SetEffectDataPointer(ms_pEffectData);
|
|||
|
ms_EffectInstanceList.push_back(pInstance);
|
|||
|
|
|||
|
TTimeNode TimeNode;
|
|||
|
TimeNode.fStartTime = GetCurrentTime();
|
|||
|
TimeNode.fLastTime = GetCurrentTime();
|
|||
|
ms_TimeNodeList.push_back(TimeNode);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
TTimeNode TimeNode;
|
|||
|
TimeNode.fStartTime = GetCurrentTime() - GetLocalTime() + 0.001f;
|
|||
|
TimeNode.fLastTime = GetCurrentTime();
|
|||
|
ms_TimeNodeList.push_back(TimeNode);
|
|||
|
|
|||
|
ms_ActorInstance.RefreshMotionEvent(0);
|
|||
|
ms_ActorInstance.StartAnimation(GetLocalTime());
|
|||
|
}
|
|||
|
// Temporary
|
|||
|
}
|
|||
|
|
|||
|
void CManager::RegisterSoundFileName(DWORD dwID, const char * c_szFileName)
|
|||
|
{
|
|||
|
ms_SoundFileNameMap.insert(TSoundFileNameMap::value_type(dwID, c_szFileName));
|
|||
|
}
|
|||
|
|
|||
|
void CManager::ClearAllSoundFileName()
|
|||
|
{
|
|||
|
ms_SoundFileNameMap.clear();
|
|||
|
}
|
|||
|
|
|||
|
void CManager::Edit()
|
|||
|
{
|
|||
|
ms_isEdit = true;
|
|||
|
}
|
|||
|
|
|||
|
void CManager::UnEdit()
|
|||
|
{
|
|||
|
ms_isEdit = false;
|
|||
|
}
|
|||
|
|
|||
|
bool CManager::isEdit()
|
|||
|
{
|
|||
|
return ms_isEdit;
|
|||
|
}
|
|||
|
|
|||
|
bool CManager::canEdit()
|
|||
|
{
|
|||
|
return MODE_EDIT == ms_iMode;
|
|||
|
}
|
|||
|
|
|||
|
void CManager::DestroyEffect()
|
|||
|
{
|
|||
|
TEffectInstanceList::iterator itor = ms_EffectInstanceList.begin();
|
|||
|
for (; itor != ms_EffectInstanceList.end(); ++itor)
|
|||
|
{
|
|||
|
CEffectInstance * pInstance = *itor;
|
|||
|
pInstance->Clear();
|
|||
|
}
|
|||
|
ms_EffectInstanceList.clear();
|
|||
|
}
|
|||
|
|
|||
|
CManager::CManager()
|
|||
|
{
|
|||
|
ms_iLoopCount = 0;
|
|||
|
ms_icurLoopCount = 0;
|
|||
|
ms_fMotionStartTime = 0.0f;
|
|||
|
}
|
|||
|
|
|||
|
CManager::~CManager()
|
|||
|
{
|
|||
|
}
|