1#include "SceneManager.hh"
3#include "egg/core/ExpHeap.hh"
4#include "egg/core/FrmHeap.hh"
15 m_currentScene =
nullptr;
18SceneManager::~SceneManager() =
default;
25void SceneManager::calc() {
30void SceneManager::calcCurrentScene() {
31 if (!m_currentScene) {
35 m_currentScene->calc();
43void SceneManager::createChildScene(
int id,
Scene *parent) {
44 outgoingParentScene(parent);
47 createScene(
id, parent);
51void SceneManager::createScene(
int id,
Scene *parent) {
52 Heap *parentHeap = parent ? parent->heap() : s_rootHeap;
55 bool locked = parentHeap->tstDisableAllocation();
57 parentHeap->enableAllocation();
61 ExpHeap *newHeap = ExpHeap::create(-1, parentHeap, s_heapOptionFlg);
63 Heap *newHeap =
nullptr;
64 if (parentHeap == s_rootHeap) {
66 newHeap = ExpHeap::create(-1, parentHeap, s_heapOptionFlg);
68 newHeap = FrmHeap::create(-1, parentHeap, s_heapOptionFlg);
71 s_heapForCreateScene = newHeap;
74 parentHeap->disableAllocation();
77 newHeap->becomeCurrentHeap();
78 newHeap->setName(
"DefaultSceneHeap");
80 Scene *newScene = m_creator->create(
id);
83 parent->setChild(newScene);
86 m_currentScene = newScene;
88 newScene->setParent(parent);
89 newScene->setSceneMgr(
this);
94void SceneManager::destroyScene(
Scene *scene) {
97 destroyScene(scene->child());
100 Scene *parent = scene->parent();
101 m_creator->destroy(scene->id());
105 auto *heap = scene->heap();
106 EGG::egg_delete(scene);
108 m_currentScene =
nullptr;
111 parent->setChild(
nullptr);
112 m_currentScene = parent;
116 Heap *parentHeap = parent ? parent->heap() : s_rootHeap;
117 parentHeap->becomeCurrentHeap();
121void SceneManager::changeScene(
int nextSceneId) {
122 while (m_currentScene) {
123 destroyCurrentSceneNoIncoming(
true);
126 changeSiblingScene(nextSceneId);
130void SceneManager::changeSiblingScene(
int nextSceneId) {
131 setNextSceneId(nextSceneId);
132 changeSiblingScene();
136void SceneManager::changeSiblingScene() {
137 Scene *parentScene = m_currentScene ? m_currentScene->parent() :
nullptr;
139 if (m_currentScene) {
140 destroyScene(m_currentScene);
141 m_currentScene =
nullptr;
144 int nextSceneId = m_nextSceneId;
146 createScene(nextSceneId, parentScene);
150void SceneManager::incomingCurrentScene() {
151 if (!m_currentScene) {
155 m_currentScene->incoming_childDestroy();
159void SceneManager::outgoingParentScene(
Scene *parent) {
160 parent->outgoing_childCreate();
164void SceneManager::reinitCurrentScene() {
165 if (!m_currentScene) {
169 m_currentScene->reinit();
173bool SceneManager::destroyCurrentSceneNoIncoming(
bool destroyRootIfNoParent) {
174 if (!m_currentScene) {
178 Scene *parent = m_currentScene->parent();
180 destroyScene(parent->child());
181 setNextSceneId(parent->id());
185 if (destroyRootIfNoParent) {
186 destroyScene(m_currentScene);
195bool SceneManager::destroyToSelectSceneId(
int id) {
196 Scene *parent = findParentScene(
id);
201 while (parent->id() != currentSceneId()) {
202 destroyCurrentSceneNoIncoming(
false);
204 incomingCurrentScene();
209Scene *SceneManager::findParentScene(
int id)
const {
210 Scene *scene = m_currentScene->parent();
211 for (; scene; scene = scene->parent()) {
212 if (scene->id() ==
id) {
221void SceneManager::setupNextSceneId() {
222 m_prevSceneId = m_currentSceneId;
223 m_currentSceneId = m_nextSceneId;
227Heap *SceneManager::s_heapForCreateScene =
nullptr;
228u16 SceneManager::s_heapOptionFlg = DEFAULT_OPT;
230Heap *SceneManager::s_rootHeap =
nullptr;
A high-level representation of a memory heap for managing dynamic memory allocation....
Interface for creating and destroying scenes.
Base class for all scenes.