1#include "SceneManager.hh"
3#include "egg/core/ExpHeap.hh"
12SceneManager::SceneManager(SceneCreator *creator) {
14 m_currentScene =
nullptr;
17SceneManager::~SceneManager() =
default;
24void SceneManager::calc() {
29void SceneManager::calcCurrentScene() {
30 if (!m_currentScene) {
34 m_currentScene->calc();
42void SceneManager::createChildScene(
int id,
Scene *parent) {
43 outgoingParentScene(parent);
46 createScene(
id, parent);
50void SceneManager::createScene(
int id,
Scene *parent) {
51 Heap *parentHeap = parent ? parent->heap() : s_rootHeap;
54 bool locked = parentHeap->tstDisableAllocation();
56 parentHeap->enableAllocation();
59 ExpHeap *newHeap = ExpHeap::create(-1, parentHeap, s_heapOptionFlg);
60 s_heapForCreateScene = newHeap;
63 parentHeap->disableAllocation();
66 newHeap->becomeCurrentHeap();
67 newHeap->setName(
"DefaultSceneHeap");
69 Scene *newScene = m_creator->create(
id);
72 parent->setChild(newScene);
75 m_currentScene = newScene;
77 newScene->setParent(parent);
78 newScene->setSceneMgr(
this);
83void SceneManager::destroyScene(
Scene *scene) {
86 destroyScene(scene->child());
89 Scene *parent = scene->parent();
90 m_creator->destroy(scene->id());
91 m_currentScene =
nullptr;
94 parent->setChild(
nullptr);
95 m_currentScene = parent;
98 scene->heap()->destroy();
99 Heap *parentHeap = parent ? parent->heap() : s_rootHeap;
100 parentHeap->becomeCurrentHeap();
104void SceneManager::changeScene(
int nextSceneId) {
105 while (m_currentScene) {
106 destroyCurrentSceneNoIncoming(
true);
109 changeSiblingScene(nextSceneId);
113void SceneManager::changeSiblingScene(
int nextSceneId) {
114 setNextSceneId(nextSceneId);
115 changeSiblingScene();
119void SceneManager::changeSiblingScene() {
120 Scene *parentScene = m_currentScene ? m_currentScene->parent() :
nullptr;
122 if (m_currentScene) {
123 destroyScene(m_currentScene);
124 m_currentScene =
nullptr;
127 int nextSceneId = m_nextSceneId;
129 createScene(nextSceneId, parentScene);
133void SceneManager::incomingCurrentScene() {
134 if (!m_currentScene) {
138 m_currentScene->incoming_childDestroy();
142void SceneManager::outgoingParentScene(
Scene *parent) {
143 parent->outgoing_childCreate();
147void SceneManager::reinitCurrentScene() {
148 if (!m_currentScene) {
152 m_currentScene->reinit();
156bool SceneManager::destroyCurrentSceneNoIncoming(
bool destroyRootIfNoParent) {
157 if (!m_currentScene) {
161 Scene *parent = m_currentScene->parent();
163 destroyScene(parent->child());
164 setNextSceneId(parent->id());
168 if (destroyRootIfNoParent) {
169 destroyScene(m_currentScene);
178bool SceneManager::destroyToSelectSceneId(
int id) {
179 Scene *parent = findParentScene(
id);
184 while (parent->id() != currentSceneId()) {
185 destroyCurrentSceneNoIncoming(
false);
187 incomingCurrentScene();
192Scene *SceneManager::findParentScene(
int id)
const {
193 Scene *scene = m_currentScene->parent();
194 for (; scene; scene = scene->parent()) {
195 if (scene->id() ==
id) {
204void SceneManager::setupNextSceneId() {
205 m_prevSceneId = m_currentSceneId;
206 m_currentSceneId = m_nextSceneId;
210Heap *SceneManager::s_heapForCreateScene =
nullptr;
211u16 SceneManager::s_heapOptionFlg = 2;
213Heap *SceneManager::s_rootHeap =
nullptr;
Pertains to scene handling.