Loading [MathJax]/extensions/tex2jax.js
A reimplementation of Mario Kart Wii's physics engine in C++
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages Concepts
SceneManager.cc
1#include "SceneManager.hh"
2
3#include "egg/core/ExpHeap.hh"
4
5namespace EGG {
6
7/*------------*
8 Lifecycle
9 *------------*/
10
12SceneManager::SceneManager(SceneCreator *creator) {
13 m_creator = creator;
14 m_currentScene = nullptr;
15}
16
17SceneManager::~SceneManager() = default;
18
19/*----------*
20 Virtual
21 *----------*/
22
24void SceneManager::calc() {
25 calcCurrentScene();
26}
27
29void SceneManager::calcCurrentScene() {
30 if (!m_currentScene) {
31 return;
32 }
33
34 m_currentScene->calc();
35}
36
37/*----------*
38 Methods
39 *----------*/
40
42void SceneManager::createChildScene(int id, Scene *parent) {
43 outgoingParentScene(parent);
44 setNextSceneId(id);
45 setupNextSceneId();
46 createScene(id, parent);
47}
48
50void SceneManager::createScene(int id, Scene *parent) {
51 Heap *parentHeap = parent ? parent->heap() : s_rootHeap;
52
53 // We need to preserve the locked status to reinstate it later
54 bool locked = parentHeap->tstDisableAllocation();
55 if (locked) {
56 parentHeap->enableAllocation();
57 }
58
59 ExpHeap *newHeap = ExpHeap::create(-1, parentHeap, s_heapOptionFlg);
60 s_heapForCreateScene = newHeap;
61
62 if (locked) {
63 parentHeap->disableAllocation();
64 }
65
66 newHeap->becomeCurrentHeap();
67 newHeap->setName("DefaultSceneHeap");
68
69 Scene *newScene = m_creator->create(id);
70
71 if (parent) {
72 parent->setChild(newScene);
73 }
74
75 m_currentScene = newScene;
76 newScene->setId(id);
77 newScene->setParent(parent);
78 newScene->setSceneMgr(this);
79 newScene->enter();
80}
81
83void SceneManager::destroyScene(Scene *scene) {
84 scene->exit();
85 if (scene->child()) {
86 destroyScene(scene->child());
87 }
88
89 Scene *parent = scene->parent();
90 m_creator->destroy(scene->id());
91 m_currentScene = nullptr;
92
93 if (parent) {
94 parent->setChild(nullptr);
95 m_currentScene = parent;
96 }
97
98 scene->heap()->destroy();
99 Heap *parentHeap = parent ? parent->heap() : s_rootHeap;
100 parentHeap->becomeCurrentHeap();
101}
102
104void SceneManager::changeScene(int nextSceneId) {
105 while (m_currentScene) {
106 destroyCurrentSceneNoIncoming(true);
107 }
108
109 changeSiblingScene(nextSceneId);
110}
111
113void SceneManager::changeSiblingScene(int nextSceneId) {
114 setNextSceneId(nextSceneId);
115 changeSiblingScene();
116}
117
119void SceneManager::changeSiblingScene() {
120 Scene *parentScene = m_currentScene ? m_currentScene->parent() : nullptr;
121
122 if (m_currentScene) {
123 destroyScene(m_currentScene);
124 m_currentScene = nullptr;
125 }
126
127 int nextSceneId = m_nextSceneId;
128 setupNextSceneId();
129 createScene(nextSceneId, parentScene);
130}
131
133void SceneManager::incomingCurrentScene() {
134 if (!m_currentScene) {
135 return;
136 }
137
138 m_currentScene->incoming_childDestroy();
139}
140
142void SceneManager::outgoingParentScene(Scene *parent) {
143 parent->outgoing_childCreate();
144}
145
147void SceneManager::reinitCurrentScene() {
148 if (!m_currentScene) {
149 return;
150 }
151
152 m_currentScene->reinit();
153}
154
156bool SceneManager::destroyCurrentSceneNoIncoming(bool destroyRootIfNoParent) {
157 if (!m_currentScene) {
158 return false;
159 }
160
161 Scene *parent = m_currentScene->parent();
162 if (parent) {
163 destroyScene(parent->child());
164 setNextSceneId(parent->id());
165 setupNextSceneId();
166 return true;
167 } else {
168 if (destroyRootIfNoParent) {
169 destroyScene(m_currentScene);
170 setNextSceneId(-1);
171 setupNextSceneId();
172 }
173 return false;
174 }
175}
176
178bool SceneManager::destroyToSelectSceneId(int id) {
179 Scene *parent = findParentScene(id);
180 if (!parent) {
181 return false;
182 }
183
184 while (parent->id() != currentSceneId()) {
185 destroyCurrentSceneNoIncoming(false);
186 }
187 incomingCurrentScene();
188 return true;
189}
190
192Scene *SceneManager::findParentScene(int id) const {
193 Scene *scene = m_currentScene->parent();
194 for (; scene; scene = scene->parent()) {
195 if (scene->id() == id) {
196 break;
197 }
198 }
199
200 return scene;
201}
202
204void SceneManager::setupNextSceneId() {
205 m_prevSceneId = m_currentSceneId;
206 m_currentSceneId = m_nextSceneId;
207 m_nextSceneId = -1;
208}
209
210Heap *SceneManager::s_heapForCreateScene = nullptr;
211u16 SceneManager::s_heapOptionFlg = 2;
212
213Heap *SceneManager::s_rootHeap = nullptr;
214
215} // namespace EGG
EGG core library.
Definition Archive.cc:6
Pertains to scene handling.
Definition GameScene.cc:8