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());
94 auto *heap = scene->heap();
97 m_currentScene =
nullptr;
100 parent->setChild(
nullptr);
101 m_currentScene = parent;
105 Heap *parentHeap = parent ? parent->heap() : s_rootHeap;
106 parentHeap->becomeCurrentHeap();
110void SceneManager::changeScene(
int nextSceneId) {
111 while (m_currentScene) {
112 destroyCurrentSceneNoIncoming(
true);
115 changeSiblingScene(nextSceneId);
119void SceneManager::changeSiblingScene(
int nextSceneId) {
120 setNextSceneId(nextSceneId);
121 changeSiblingScene();
125void SceneManager::changeSiblingScene() {
126 Scene *parentScene = m_currentScene ? m_currentScene->parent() :
nullptr;
128 if (m_currentScene) {
129 destroyScene(m_currentScene);
130 m_currentScene =
nullptr;
133 int nextSceneId = m_nextSceneId;
135 createScene(nextSceneId, parentScene);
139void SceneManager::incomingCurrentScene() {
140 if (!m_currentScene) {
144 m_currentScene->incoming_childDestroy();
148void SceneManager::outgoingParentScene(
Scene *parent) {
149 parent->outgoing_childCreate();
153void SceneManager::reinitCurrentScene() {
154 if (!m_currentScene) {
158 m_currentScene->reinit();
162bool SceneManager::destroyCurrentSceneNoIncoming(
bool destroyRootIfNoParent) {
163 if (!m_currentScene) {
167 Scene *parent = m_currentScene->parent();
169 destroyScene(parent->child());
170 setNextSceneId(parent->id());
174 if (destroyRootIfNoParent) {
175 destroyScene(m_currentScene);
184bool SceneManager::destroyToSelectSceneId(
int id) {
185 Scene *parent = findParentScene(
id);
190 while (parent->id() != currentSceneId()) {
191 destroyCurrentSceneNoIncoming(
false);
193 incomingCurrentScene();
198Scene *SceneManager::findParentScene(
int id)
const {
199 Scene *scene = m_currentScene->parent();
200 for (; scene; scene = scene->parent()) {
201 if (scene->id() ==
id) {
210void SceneManager::setupNextSceneId() {
211 m_prevSceneId = m_currentSceneId;
212 m_currentSceneId = m_nextSceneId;
216Heap *SceneManager::s_heapForCreateScene =
nullptr;
217u16 SceneManager::s_heapOptionFlg = 2;
219Heap *SceneManager::s_rootHeap =
nullptr;
Pertains to scene handling.