OpenBarnyard
 
Loading...
Searching...
No Matches
TScheduler.h
Go to the documentation of this file.
1#pragma once
2#include "TNodeTree.h"
3#include "THPTimer.h"
4#include "TSystem.h"
5#include "TTask.h"
6
8
9class TTask;
10
11class TScheduler : public TObject
12{
13public:
15
16public:
17 using t_DeltaTimeCalculator = TFLOAT ( * )( TFLOAT a_fRealDT );
18
19public:
20 TScheduler();
22
23 TTask* CreateTask( TClass* a_pClass, TTask* a_pParent = TNULL );
24
25 template <class T>
26 T* CreateTask( TTask* a_pParent = TNULL )
27 {
28 return TSTATICCAST( T, CreateTask( &TGetClass( T ), a_pParent ) );
29 }
30
31 void Update();
32
33 TFLOAT& GetDebugDeltaTime() { return m_DebugDeltaTime; }
34 TFLOAT GetDebugDeltaTime() const { return m_DebugDeltaTime; }
35
36 TFLOAT& GetDebugDeltaTimeMult() { return m_DebugDeltaTimeMult; }
37 TFLOAT GetDebugDeltaTimeMult() const { return m_DebugDeltaTimeMult; }
38
39 void SetDebugDeltaTimeMult( TBOOL useDebugDeltaTimeMult, TFLOAT debugDeltaTimeMult = 1.0f );
40
41 void SetDebugDeltaTime( TBOOL useDebugDeltaTime, TFLOAT debugDeltaTime = 0.0f )
42 {
43 m_UseDebugDeltaTime = useDebugDeltaTime;
44 m_DebugDeltaTime = debugDeltaTime;
45 }
46
47 void SetDebugPause( TBOOL pause )
48 {
49 if ( pause )
50 {
51 m_DebugDeltaTime = 0.0f;
52 }
53
54 m_UseDebugDeltaTime = pause;
55 }
56
57 void SetDebugSlowTime( TBOOL slowTime )
58 {
59 m_MaxDeltaTime = slowTime ? s_DebugSlowMaxTimeDeltaAllowed : s_MaxTimeDeltaAllowed;
60 }
61
63 {
64 return m_DeltaTime;
65 }
66
68 {
69 return m_TotalTime;
70 }
71
73 {
74 return m_uiNumFrames;
75 }
76
78 {
79 return &m_TaskTree;
80 }
81
82 void DeleteTask( TTask* a_pTask )
83 {
84 a_pTask->OnPreDestroy();
85 DeleteTaskRecurse( a_pTask->Child() );
86 DeleteTaskAtomic( a_pTask );
87 }
88
89 void DestroyTask( TTask* a_pTask )
90 {
91 TASSERT( a_pTask->IsDying() );
92 a_pTask->OnPreDestroy();
93
94 DeleteTaskRecurse( a_pTask->Child() );
95 DeleteTaskAtomic( a_pTask->Child() );
96 }
97
98private:
99 static void DestroyTaskRecurse( TTask* task )
100 {
101 TTask* currentTask = task;
102
103 while ( currentTask != TNULL && currentTask != task )
104 {
105 currentTask->GetFlags() |= TTask::State_Dying;
106
107 if ( currentTask->Child() != TNULL )
108 {
109 DestroyTaskRecurse( currentTask );
110 }
111
112 currentTask = currentTask->Next();
113 }
114 }
115
116 void DeleteTaskAtomic( TTask* task );
117
118 void DeleteTaskRecurse( TTask* task )
119 {
120 if ( task != TNULL )
121 {
122 TTask* currentTask = task->Prev();
123
124 while ( currentTask != TNULL )
125 {
126 TTask* nextTask = ( currentTask->Prev() != task ) ? currentTask->Prev() : TNULL;
127 DeleteTaskAtomic( currentTask );
128 currentTask = nextTask;
129 }
130 }
131 }
132
133 void DestroyAllTasks()
134 {
135 if ( m_TaskTree.ChildOfRoot() != TNULL )
136 {
137 DestroyTaskRecurse( m_TaskTree.ChildOfRoot() );
138 DestroyDyingTasks( m_TaskTree.ChildOfRoot() );
139 }
140 }
141
142 // Destroys all the dying tasks from the first one to the last one
143 void DestroyDyingTasks( TTask* task );
144
145 // Updates all the active tasks from the last one to the first one
146 void UpdateActiveTasks( TTask* task );
147
148private:
149 static TFLOAT s_DebugSlowMaxTimeDeltaAllowed;
150 static TFLOAT s_MaxTimeDeltaAllowed;
151
152private:
153 TNodeTree<TTask> m_TaskTree;
154 TFLOAT m_DeltaTime;
155 TFLOAT m_TotalTime;
156 TFLOAT m_MaxDeltaTime;
157 TUINT m_uiNumFrames;
158 t_DeltaTimeCalculator m_fnDeltaTimeCalculator;
159 TBOOL m_UseDebugDeltaTime;
160 TFLOAT m_DebugDeltaTime;
161 TFLOAT m_Unk1;
162 // ...
163 TBOOL m_Unk2;
164 TBOOL m_UseDebugDeltaTimeMult;
165 TFLOAT m_DebugDeltaTimeMult;
166};
167
#define TASSERT(X,...)
Definition Defines.h:138
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
#define TDECLARE_CLASS(THIS_CLASS, PARENT_CLASS)
Definition TObject.h:38
#define TGetClass(CLASS)
Definition TObject.h:13
unsigned int TUINT
Definition Typedefs.h:8
float TFLOAT
Definition Typedefs.h:4
#define TNULL
Definition Typedefs.h:23
bool TBOOL
Definition Typedefs.h:6
Definition TClass.h:8
T * Prev() const
Definition TNodeTree.h:35
T * Child() const
Definition TNodeTree.h:37
T * Next() const
Definition TNodeTree.h:34
TFLOAT(*)(TFLOAT a_fRealDT) t_DeltaTimeCalculator
Definition TScheduler.h:17
TFLOAT GetDebugDeltaTime() const
Definition TScheduler.h:34
TFLOAT GetCurrentDeltaTime() const
Definition TScheduler.h:62
void SetDebugDeltaTimeMult(TBOOL useDebugDeltaTimeMult, TFLOAT debugDeltaTimeMult=1.0f)
TFLOAT GetTotalTime() const
Definition TScheduler.h:67
TUINT GetFrameCount() const
Definition TScheduler.h:72
void DestroyTask(TTask *a_pTask)
Definition TScheduler.h:89
TFLOAT GetDebugDeltaTimeMult() const
Definition TScheduler.h:37
void SetDebugSlowTime(TBOOL slowTime)
Definition TScheduler.h:57
void SetDebugPause(TBOOL pause)
Definition TScheduler.h:47
void DeleteTask(TTask *a_pTask)
Definition TScheduler.h:82
T * CreateTask(TTask *a_pParent=nullptr)
Definition TScheduler.h:26
void Update()
TFLOAT & GetDebugDeltaTimeMult()
Definition TScheduler.h:36
TNodeTree< TTask > * GetTree()
Definition TScheduler.h:77
TFLOAT & GetDebugDeltaTime()
Definition TScheduler.h:33
TTask * CreateTask(TClass *a_pClass, TTask *a_pParent=nullptr)
void SetDebugDeltaTime(TBOOL useDebugDeltaTime, TFLOAT debugDeltaTime=0.0f)
Definition TScheduler.h:41
Definition TTask.h:13
TUINT32 & GetFlags()
Definition TTask.h:46
virtual void OnPreDestroy()
Definition TTask.cpp:85
TBOOL IsDying() const
Definition TTask.h:50
@ State_Dying
Definition TTask.h:24