forked from hitsz-ldjam/MixEngine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMixEngine.h
135 lines (102 loc) · 4.46 KB
/
MixEngine.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#pragma once
#ifndef MIX_ENGINE_H_
#define MIX_ENGINE_H_
#include "Mx/Engine/MxModuleHolder.h"
#include "Mx/Utils/MxEvent.h"
namespace Mix {
class Window;
class ApplicationBase;
class MixEngine : public GeneralBase::SingletonBase<MixEngine> {
friend SingletonBase<MixEngine>;
public:
~MixEngine();
int execute(std::shared_ptr<ApplicationBase> _app);
/**
* \brief Call to issue a request for the application to close. \n
* This will eventually trigger an quit event and onQuitRequested() will be called.
* \note ONLY call this after startUp() has been called
*/
void requestQuit();
private:
explicit MixEngine(int _argc = 0, char** _argv = nullptr);
void quit() { mQuit = true; mRunning = false; }
bool mRunning = true;
bool mQuit = false;
//////////////////////////////////////////////////////////////////
// FPS //
//////////////////////////////////////////////////////////////////
public:
void setFPSLimit(uint32_t _limit);
float getFPS() const { return mFramePerSecond; }
private:
uint32_t mFPSLimit = 0;
uint32_t mFrameCount = 0;
uint32_t mFrameSampleRate = 5;
float mFramePerSecond = 0.0f;
float mLastFrameTime = 0.0f;
float mFrameStep = 0.0f;
//////////////////////////////////////////////////////////////////
// Setup scene //
//////////////////////////////////////////////////////////////////
void loadMainScene();
//////////////////////////////////////////////////////////////////
// Main loop //
//////////////////////////////////////////////////////////////////
private:
/*void awake();
void init();*/
void update();
void fixedUpdate();
void lateUpdate();
//////////////////////////////////////////////////////////////////
// Render //
//////////////////////////////////////////////////////////////////
private:
void render();
void postRender();
//////////////////////////////////////////////////////////////////
// Modules //
//////////////////////////////////////////////////////////////////
public:
void loadModule();
void initModule();
template<typename _Ty>
bool hasModule() const { return mModuleHolder.has<_Ty>(); }
template<typename _Ty>
_Ty* getModule() const { return mModuleHolder.get<_Ty>(); }
template<typename _Ty, typename... _Args>
_Ty* addModule(_Args&&... _args) { return mModuleHolder.add<_Ty>(std::forward<_Args>(_args)...); }
template<typename _Ty>
void removeModule() { mModuleHolder.remove<_Ty>(); }
ModuleHolder& getModuleHolder() { return mModuleHolder; }
private:
std::shared_ptr<ApplicationBase> mApp;
ModuleHolder mModuleHolder;
//////////////////////////////////////////////////////////////////
// Callbacks //
//////////////////////////////////////////////////////////////////
void onQuitRequested();
//////////////////////////////////////////////////////////////////
// Events //
//////////////////////////////////////////////////////////////////
/*public:
Event<void()> ModuleLoadedEvent;
Event<void()> MoudleInitializedEvent;
Event<void()> MainSceneCreatedEvent;
Event<void()> AwakeEvent;
Event<void()> InitEvent;
Event<void()> UpdateEvent;
Event<void()> FixedUpdateEvent;
Event<void()> LateUpdateEvent;
Event<void()> RenderEvent;
Event<void()> PostRenderEvent;*/
//////////////////////////////////////////////////////////////////
// Command lines //
//////////////////////////////////////////////////////////////////
public:
const std::vector<std::string>& getCommandLines() const { return mCommandLines; }
private:
std::vector<std::string> mCommandLines;
};
}
#endif