Files
GTASource/game/timecycle/TimeCycleAsyncQueryMgr.cpp
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

105 lines
2.5 KiB
C++

#include "timecycle/TimeCycleAsyncQueryMgr.h"
// rage headers
#include "atl/array.h"
#include "profile/timebars.h"
#include "system/ipc.h"
// framework headers
#include "system/dependencyscheduler.h"
// game headers
#include "Peds/Ped.h"
#include "scene/Entity.h"
#include "timecycle/CalcAmbientScaleAsync.h"
#include "timecycle/tcmodifier.h"
#include "timecycle/TimeCycle.h"
#include "vfx/VfxHelper.h"
atArray<CEntity*> g_aNonPedEntities;
atArray<CalcAmbientScalePedData> g_aPedEntities;
sysDependency g_TimeCycleAsyncQueryDependency;
u32 g_TimeCycleAsyncQueryDependencyRunning;
namespace CTimeCycleAsyncQueryMgr
{
void Init()
{
u32 flags = 0;
g_TimeCycleAsyncQueryDependency.Init( CalcAmbientScaleAsync::RunFromDependency, 0, flags );
g_TimeCycleAsyncQueryDependency.m_Priority = sysDependency::kPriorityLow;
}
void Shutdown()
{
}
void StartAsyncProcessing()
{
if (g_aPedEntities.GetCount() == 0 && g_aNonPedEntities.GetCount() == 0)
{
return;
}
g_timeCycle.BuildModifierTreeIfNeeded();
g_timeCycle.SetModifierBoxTreeRebuildProhibited(true);
tcModifier::SetOnlyMainThreadIsUpdating(false);
g_TimeCycleAsyncQueryDependency.m_Params[0].m_AsPtr = &g_aNonPedEntities;
g_TimeCycleAsyncQueryDependency.m_Params[1].m_AsPtr = &g_aPedEntities;
g_TimeCycleAsyncQueryDependency.m_Params[2].m_AsPtr = &g_TimeCycleAsyncQueryDependencyRunning;
g_TimeCycleAsyncQueryDependencyRunning = 1;
sysDependencyScheduler::Insert(&g_TimeCycleAsyncQueryDependency);
}
void WaitForAsyncProcessingToFinish()
{
PF_PUSH_TIMEBAR("CTimeCycleAsyncQueryMgr WaitForAsyncProcessingToFinish");
while(true)
{
volatile u32 *pDependencyRunning = &g_TimeCycleAsyncQueryDependencyRunning;
if(*pDependencyRunning == 0)
{
break;
}
sysIpcYield(PRIO_NORMAL);
}
g_aNonPedEntities.ResetCount();
g_aPedEntities.ResetCount();
g_timeCycle.SetModifierBoxTreeRebuildProhibited(false);
tcModifier::SetOnlyMainThreadIsUpdating(true);
PF_POP_TIMEBAR();
}
void AddNonPedEntity(CEntity* pEntity)
{
Assert(!pEntity->GetIsTypePed());
Assert(!g_TimeCycleAsyncQueryDependencyRunning);
g_aNonPedEntities.PushAndGrow(pEntity);
}
void AddPed(CPed* pPed, float incaredNess)
{
Assert(!g_TimeCycleAsyncQueryDependencyRunning);
CalcAmbientScalePedData& data = g_aPedEntities.Grow();
data.m_pPed = pPed;
data.m_incaredNess = incaredNess;
}
#if __ASSERT
bool IsRunning()
{
return (g_TimeCycleAsyncQueryDependencyRunning != 0);
}
#endif
} // end of namespace CTimeCycleAsyncQueryMgr