OpenBarnyard
 
Loading...
Searching...
No Matches
TScheduler.cpp
Go to the documentation of this file.
1#include "ToshiPCH.h"
2#include "TScheduler.h"
3#include "TSystem.h"
4#include "TTask.h"
5
6//-----------------------------------------------------------------------------
7// Enables memory debugging.
8// Note: Should be the last include!
9//-----------------------------------------------------------------------------
10#include "Core/TMemoryDebugOn.h"
11
13
15
16TFLOAT TScheduler::s_MaxTimeDeltaAllowed = 0.25f;
17TFLOAT TScheduler::s_DebugSlowMaxTimeDeltaAllowed = 1.0f;
18
20{
21 m_DeltaTime = 0.0f;
22 m_TotalTime = 0.0f;
23 m_MaxDeltaTime = 0.25f;
24 m_uiNumFrames = 0;
25 m_fnDeltaTimeCalculator = TNULL;
26 m_UseDebugDeltaTime = TFALSE;
27 m_DebugDeltaTime = 0.01f;
28 m_UseDebugDeltaTimeMult = TFALSE;
29 m_DebugDeltaTimeMult = 1.0f;
30}
31
33{
34 DestroyAllTasks();
35}
36
38{
39 TASSERT( pClass->IsA( &TGetClass( TTask ) ) );
40
41 TTask* pTask = static_cast<TTask*>( pClass->CreateObject() );
42 TASSERT( pTask != TNULL );
43
44 m_TaskTree.InsertAtRoot( pTask );
45
46 if ( pParent != TNULL )
47 {
48 m_TaskTree.Remove( pTask, TFALSE );
49 m_TaskTree.Insert( pParent, pTask );
50 }
51
52 return pTask;
53}
54
56{
57 if ( !g_oSystemManager.ms_bWasEverUpdated )
58 {
59 g_oSystemManager.ms_bWasEverUpdated = TTRUE;
60 }
61
62 TFLOAT fDeltaTime = g_oSystemManager.GetTimer().GetDelta();
63 m_DeltaTime = fDeltaTime;
64 m_TotalTime += fDeltaTime;
65 m_uiNumFrames += 1;
66
67 // Control delta time
68 if ( m_DeltaTime >= 0.0f )
69 {
70 if ( m_DeltaTime >= m_MaxDeltaTime )
71 {
72 m_DeltaTime = m_MaxDeltaTime;
73 }
74 }
75 else
76 {
77 m_DeltaTime = 0.0f;
78 }
79
80 if ( m_fnDeltaTimeCalculator )
81 {
82 m_DeltaTime = m_fnDeltaTimeCalculator( m_DeltaTime );
83 }
84
85 if ( m_UseDebugDeltaTime )
86 {
87 m_DeltaTime = m_DebugDeltaTime;
88 }
89
90 if ( m_UseDebugDeltaTimeMult )
91 {
92 m_DeltaTime *= m_DebugDeltaTimeMult;
93 }
94
95 DestroyDyingTasks( m_TaskTree.ChildOfRoot() );
96 UpdateActiveTasks( m_TaskTree.ChildOfRoot() );
97}
98
99void TScheduler::DeleteTaskAtomic( TTask* task )
100{
101 if ( task != TNULL )
102 {
103 TTask* taskParent = TNULL;
104
105 if ( task->IsChildOfDefaultRoot() == TFALSE )
106 {
107 taskParent = task->Parent();
108
109 if ( taskParent->IsDying() == TFALSE && taskParent->OnChildDying( task ) == TFALSE )
110 {
111 // The parent is not dying and doesn't allow us to kill the task
112 return;
113 }
114 }
115
116 if ( task->Child() != TNULL )
117 {
118 TTask* node = task->Child()->Child();
119
120 while ( node != TNULL )
121 {
122 auto next = ( node->Prev() != node ) ? node->Prev() : TNULL;
123 DeleteTaskAtomic( node );
124 node = next;
125 }
126 }
127
128 TClass* pClass = task->GetClass();
129 task->OnDestroy();
130 m_TaskTree.Remove( task, TFALSE );
131 task->Delete();
132
133 if ( taskParent != TNULL )
134 {
135 taskParent->OnChildDied( pClass, task );
136 }
137 }
138}
139
140void TScheduler::DestroyDyingTasks( TTask* task )
141{
142 if ( task != TNULL )
143 {
144 TTask* currentTask = task->Prev();
145
146 while ( currentTask != TNULL )
147 {
148 TTask* nextTask = ( currentTask->Prev() != task ) ? currentTask->Prev() : TNULL;
149
150 if ( !currentTask->IsDying() )
151 {
152 if ( currentTask->Child() != TNULL )
153 {
154 DestroyDyingTasks( currentTask->Child() );
155 }
156 }
157 else
158 {
159 DeleteTask( currentTask );
160 }
161
162 currentTask = nextTask;
163 }
164 }
165}
166
167void TScheduler::UpdateActiveTasks( TTask* task )
168{
169 TTask* currentTask = task;
170
171 while ( currentTask != TNULL )
172 {
173 TTask* nextTask = ( currentTask->Next() != task ) ? currentTask->Next() : TNULL;
174
175 TBOOL recurse = TTRUE;
176 if ( task->IsCreated() && task->IsActive() )
177 {
178 recurse = currentTask->OnUpdate( m_DeltaTime );
179 }
180
181 if ( currentTask->Child() != TNULL && recurse )
182 {
183 UpdateActiveTasks( currentTask->Child() );
184 }
185
186 currentTask = nextTask;
187 }
188}
189
190// $Barnyard: FUNCTION 006bca00
191void TScheduler::SetDebugDeltaTimeMult( TBOOL useDebugDeltaTimeMult, TFLOAT debugDeltaTimeMult /*= 1.0f */ )
192{
193 m_UseDebugDeltaTimeMult = useDebugDeltaTimeMult;
194 m_DebugDeltaTimeMult = debugDeltaTimeMult;
195 TMath::Clip( m_DebugDeltaTimeMult, 0.0f, 100.0f );
196}
197
#define TASSERT(X,...)
Definition Defines.h:138
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
#define TGetClass(CLASS)
Definition TObject.h:13
#define TDEFINE_CLASS_NORUNTIME(...)
Definition TObject.h:138
TSystemManager g_oSystemManager
float TFLOAT
Definition Typedefs.h:4
#define TNULL
Definition Typedefs.h:23
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
TFORCEINLINE void Clip(T &rVal, const T &Min, const T &Max)
Definition TClass.h:8
class TObject * CreateObject() const
Definition TClass.cpp:116
TBOOL IsA(TClass *pClass)
Definition TClass.cpp:126
TBOOL IsChildOfDefaultRoot() const
Definition TNodeTree.h:26
T * Parent() const
Definition TNodeTree.h:33
T * Prev() const
Definition TNodeTree.h:35
T * Child() const
Definition TNodeTree.h:37
T * Next() const
Definition TNodeTree.h:34
virtual void Delete()
Definition TObject.cpp:14
void SetDebugDeltaTimeMult(TBOOL useDebugDeltaTimeMult, TFLOAT debugDeltaTimeMult=1.0f)
void DeleteTask(TTask *a_pTask)
Definition TScheduler.h:82
void Update()
TTask * CreateTask(TClass *a_pClass, TTask *a_pParent=nullptr)
Definition TTask.h:13
virtual void OnChildDied(TClass *a_pClass, TTask *a_pDeletedTask)
Definition TTask.cpp:98
virtual void OnDestroy()
Definition TTask.cpp:89
TBOOL IsDying() const
Definition TTask.h:50
virtual TBOOL OnUpdate(TFLOAT a_fDeltaTime)
Definition TTask.cpp:80
TBOOL IsActive() const
Definition TTask.h:48
virtual Toshi::TClass * GetClass() override
Definition TTask.cpp:12
virtual TBOOL OnChildDying(TTask *child)
Definition TTask.cpp:93
TBOOL IsCreated() const
Definition TTask.h:47