Kinoko
v0.6
A reimplementation of Mario Kart Wii's physics engine in C++
Toggle main menu visibility
Loading...
Searching...
No Matches
GameScene.cc
Go to the documentation of this file.
1
#include "
GameScene.hh
"
2
3
#include "
game/render/KartCamera.hh
"
4
5
#include "
game/system/KPadDirector.hh
"
6
#include "
game/system/ResourceManager.hh
"
7
8
#include <
egg/core/SceneManager.hh
>
9
10
namespace
Kinoko::Scene
{
11
13
GameScene::GameScene
() {
14
m_heap
->
setName
(
"DefaultGameSceneHeap"
);
15
m_nextSceneId
= -1;
16
17
#ifdef BUILD_DEBUG
18
m_totalMemoryUsed
= 0;
19
EGG::ExpHeap
*
heap
=
EGG::Heap::dynamicCastToExp
(
m_heap
);
20
ASSERT
(
heap
);
21
22
heap
->
calcGroupSize
(&
m_groupSizeRecord
);
23
for
(
u16
groupID = 0; groupID <
m_groupSizeRecord
.
size
(); ++groupID) {
24
m_totalMemoryUsed
+=
m_groupSizeRecord
.
getGroupSize
(groupID);
25
}
26
#endif
// BUILD_DEBUG
27
}
28
30
GameScene::~GameScene
() {
31
m_resources
.clear();
32
33
#ifdef BUILD_DEBUG
34
EGG::ExpHeap
*
heap
=
EGG::Heap::dynamicCastToExp
(
m_heap
);
35
ASSERT
(
heap
);
36
37
heap
->
calcGroupSize
(&
m_groupSizeRecord
);
38
size_t
sum = 0;
39
for
(
u16
groupID = 0; groupID <
m_groupSizeRecord
.
size
(); ++groupID) {
40
sum +=
m_groupSizeRecord
.
getGroupSize
(groupID);
41
}
42
43
if
(sum >
m_totalMemoryUsed
) {
44
WARN
(
"MEMORY LEAK DETECTED: %zu bytes"
, sum -
m_totalMemoryUsed
);
45
getMemoryLeakTags();
46
}
47
#endif
// BUILD_DEBUG
48
}
49
51
void
GameScene::calc
() {
52
System::KPadDirector::Instance
()->
calc
();
53
calcEngines
();
54
calcCamera
();
55
}
56
58
void
GameScene::enter
() {
59
configure
();
60
initScene
();
61
}
62
64
void
GameScene::exit
() {
65
deinitScene
();
66
unmountResources
();
67
}
68
70
void
GameScene::reinit
() {
71
exit
();
72
if
(
m_nextSceneId
< 0) {
73
onReinit
();
74
initScene
();
75
}
else
{
76
m_sceneMgr
->
changeSiblingScene
(
m_nextSceneId
);
77
}
78
}
79
81
void
GameScene::initCamera
() {
82
Render::KartCamera::Instance
()->
init
();
83
}
84
86
void
GameScene::calcCamera
() {
87
Render::KartCamera::Instance
()->
calc
();
88
}
89
91
void
GameScene::appendResource
(
System::MultiDvdArchive
*archive,
s32
id
) {
92
m_resources
.push_back(
EGG::egg_new<Resource>
(archive,
id
));
93
}
94
96
GameScene::Resource::Resource
(
System::MultiDvdArchive
*
archive
,
s32
id
)
97
:
archive
(
archive
),
id
(
id
) {}
98
100
void
GameScene::initScene
() {
101
createEngines
();
102
System::KPadDirector::Instance
()->
reset
();
103
initEngines
();
104
#ifdef BUILD_DEBUG
105
checkMemory();
106
#endif
// BUILD_DEBUG
107
}
108
110
void
GameScene::deinitScene
() {
111
if
(
m_nextSceneId
>= 0) {
112
return
;
113
}
114
115
destroyEngines
();
116
System::KPadDirector::Instance
()->
clear
();
117
}
118
120
void
GameScene::unmountResources
() {
121
auto
*resourceManager =
System::ResourceManager::Instance
();
122
for
(
auto
iter =
m_resources
.begin(); iter !=
m_resources
.end();) {
123
Resource
*resource = *iter;
124
resourceManager->unmount(resource->
archive
);
125
iter =
m_resources
.erase(iter);
126
EGG::egg_delete
(resource);
127
}
128
}
129
130
#ifdef BUILD_DEBUG
131
void
GameScene::checkMemory() {
132
EGG::ExpHeap
*
heap
=
EGG::Heap::dynamicCastToExp
(
m_heap
);
133
ASSERT
(
heap
);
134
135
heap
->calcGroupSize(&
m_groupSizeRecord
);
136
size_t
defaultSize =
m_groupSizeRecord
.
getGroupSize
(
static_cast<
u16
>
(
GroupID::None
));
137
138
// Because we're working with a class that can be inherited (but not doubly-inherited),
139
// it's possible that derived classes can have a different size compared to GameScene
140
// We don't need to know the exact derived class, though, as we have the memory block head
141
// The scene is the first, always group ID 0 allocation to happen in the scene's heap
142
Abstract::Memory::MEMiExpBlockHead
*blockHead =
143
static_cast<
Abstract::Memory::MEMiExpBlockHead
*
>
(
144
SubOffset(
this
,
sizeof
(
Abstract::Memory::MEMiExpBlockHead
)));
145
size_t
initialAllocSize = blockHead->
m_size
;
146
ASSERT
(defaultSize >= initialAllocSize);
147
148
defaultSize -= initialAllocSize;
149
if
(defaultSize > 0) {
150
WARN
(
"Default memory usage found! %zu bytes"
, defaultSize);
151
}
152
153
for
(
u16
groupID = 1; groupID <
m_groupSizeRecord
.
size
(); ++groupID) {
154
size_t
size =
m_groupSizeRecord
.
getGroupSize
(groupID);
155
if
(size == 0) {
156
continue
;
157
}
158
159
DEBUG
(
"Group ID %d: Allocated %zu bytes"
, groupID, size);
160
}
161
}
162
163
void
GameScene::getMemoryLeakTags() {
164
size_t
count = getMemoryLeakTagCount();
165
if
(count == 0) {
166
return
;
167
}
168
169
owning_span<u32> tags =
owning_span<u32>
(count);
170
for
(
auto
&tag : tags) {
171
tag = 0;
// empty tag
172
}
173
174
EGG::Heap::dynamicCastToExp
(
m_heap
)->
dynamicCastHandleToExp
()->
visitAllocated
(ViewTags,
175
GetAddrNum(&tags));
176
177
DEBUG
(
"TAGGED MEMORY BLOCKS:"
);
178
printf(
"[%d"
, tags[0]);
179
for
(
u32
i = 1; i < tags.size(); ++i) {
180
printf(
", %d"
, tags[i]);
181
}
182
printf(
"]\n"
);
183
}
184
185
size_t
GameScene::getMemoryLeakTagCount() {
186
size_t
count = 0;
187
EGG::Heap::dynamicCastToExp
(
m_heap
)->
dynamicCastHandleToExp
()->
visitAllocated
(IncreaseTagCount,
188
GetAddrNum(&count));
189
return
count;
190
}
191
192
void
GameScene::ViewTags(
void
*block, Abstract::Memory::MEMiHeapHead *
/*heap*/
, uintptr_t param) {
193
Abstract::Memory::MEMiExpBlockHead *blockHead =
194
static_cast<
Abstract::Memory::MEMiExpBlockHead *
>
(
195
SubOffset(block,
sizeof
(Abstract::Memory::MEMiExpBlockHead)));
196
owning_span<u32> *span =
reinterpret_cast<
owning_span<u32> *
>
(param);
197
for
(
auto
&tag : *span) {
198
if
(tag == 0) {
199
tag = blockHead->m_tag;
200
break
;
201
}
202
}
203
}
204
205
void
GameScene::IncreaseTagCount(
void
*
/*block*/
, Abstract::Memory::MEMiHeapHead *
/*heap*/
,
206
uintptr_t param) {
207
size_t
&count = *
reinterpret_cast<
size_t
*
>
(param);
208
++count;
209
}
210
#endif
// BUILD_DEBUG
211
212
}
// namespace Kinoko::Scene
GameScene.hh
KPadDirector.hh
KartCamera.hh
DEBUG
#define DEBUG(m,...)
Definition
Logger.hh:49
ASSERT
#define ASSERT(e)
Definition
Logger.hh:25
WARN
#define WARN(m,...)
Definition
Logger.hh:33
ResourceManager.hh
SceneManager.hh
Kinoko::Abstract::Memory::MEMiExpHeapHead::visitAllocated
void visitAllocated(Visitor visitor, uintptr_t param)
Definition
abstract/memory/ExpHeap.cc:195
Kinoko::EGG::Disposer::m_heap
Heap * m_heap
Definition
Disposer.hh:24
Kinoko::EGG::ExpHeap::GroupSizeRecord::size
constexpr size_t size() const
Definition
egg/core/ExpHeap.hh:28
Kinoko::EGG::ExpHeap::GroupSizeRecord::getGroupSize
size_t getGroupSize(u16 groupID) const
Definition
egg/core/ExpHeap.cc:139
Kinoko::EGG::ExpHeap
High-level implementation of a memory heap for managing dynamic memory allocation....
Definition
egg/core/ExpHeap.hh:15
Kinoko::EGG::ExpHeap::dynamicCastHandleToExp
Abstract::Memory::MEMiExpHeapHead * dynamicCastHandleToExp()
Definition
egg/core/ExpHeap.cc:119
Kinoko::EGG::ExpHeap::calcGroupSize
void calcGroupSize(GroupSizeRecord *record)
Definition
egg/core/ExpHeap.cc:105
Kinoko::EGG::Heap::dynamicCastToExp
static ExpHeap * dynamicCastToExp(Heap *heap)
Definition
Heap.hh:107
Kinoko::EGG::Heap::setName
void setName(const char *name)
Definition
Heap.hh:92
Kinoko::EGG::SceneManager::changeSiblingScene
void changeSiblingScene(int nextSceneId)
Definition
SceneManager.cc:130
Kinoko::EGG::Scene::m_sceneMgr
SceneManager * m_sceneMgr
Definition
Scene.hh:85
Kinoko::EGG::Scene::m_heap
Heap * m_heap
Definition
Scene.hh:81
Kinoko::EGG::Scene::heap
Heap * heap() const
Definition
Scene.hh:55
Kinoko::Render::KartCamera::init
void init()
Definition
KartCamera.hh:48
Kinoko::Render::KartCamera::Instance
static KartCamera * Instance()
Definition
KartCamera.hh:63
Kinoko::Render::KartCamera::calc
void calc()
Definition
KartCamera.cc:13
Kinoko::Scene::GameScene::deinitScene
void deinitScene()
Definition
GameScene.cc:110
Kinoko::Scene::GameScene::enter
void enter() final
Definition
GameScene.cc:58
Kinoko::Scene::GameScene::m_groupSizeRecord
EGG::ExpHeap::GroupSizeRecord m_groupSizeRecord
Definition
GameScene.hh:60
Kinoko::Scene::GameScene::reinit
void reinit() final
Definition
GameScene.cc:70
Kinoko::Scene::GameScene::initScene
void initScene()
Definition
GameScene.cc:100
Kinoko::Scene::GameScene::m_totalMemoryUsed
size_t m_totalMemoryUsed
Definition
GameScene.hh:65
Kinoko::Scene::GameScene::onReinit
virtual void onReinit()
Definition
GameScene.hh:30
Kinoko::Scene::GameScene::createEngines
virtual void createEngines()=0
Kinoko::Scene::GameScene::calc
void calc() final
Definition
GameScene.cc:51
Kinoko::Scene::GameScene::appendResource
void appendResource(System::MultiDvdArchive *archive, s32 id)
Definition
GameScene.cc:91
Kinoko::Scene::GameScene::initCamera
static void initCamera()
Definition
GameScene.cc:81
Kinoko::Scene::GameScene::~GameScene
~GameScene() override
Definition
GameScene.cc:30
Kinoko::Scene::GameScene::destroyEngines
virtual void destroyEngines()=0
Kinoko::Scene::GameScene::calcCamera
static void calcCamera()
Definition
GameScene.cc:86
Kinoko::Scene::GameScene::calcEngines
virtual void calcEngines()=0
Kinoko::Scene::GameScene::m_resources
std::list< Resource *, EGG::Allocator< Resource * > > m_resources
List of all active resources in the scene.
Definition
GameScene.hh:62
Kinoko::Scene::GameScene::GameScene
GameScene()
Definition
GameScene.cc:13
Kinoko::Scene::GameScene::initEngines
virtual void initEngines()=0
Kinoko::Scene::GameScene::exit
void exit() final
Definition
GameScene.cc:64
Kinoko::Scene::GameScene::m_nextSceneId
int m_nextSceneId
Definition
GameScene.hh:63
Kinoko::Scene::GameScene::configure
virtual void configure()=0
Kinoko::Scene::GameScene::unmountResources
void unmountResources()
Definition
GameScene.cc:120
Kinoko::System::KPadDirector::calc
void calc()
Definition
KPadDirector.cc:6
Kinoko::System::KPadDirector::clear
void clear()
Definition
KPadDirector.hh:25
Kinoko::System::KPadDirector::Instance
static KPadDirector * Instance()
Definition
KPadDirector.hh:45
Kinoko::System::KPadDirector::reset
void reset()
Definition
KPadDirector.cc:18
Kinoko::System::MultiDvdArchive
Definition
MultiDvdArchive.hh:9
Kinoko::System::ResourceManager::Instance
static ResourceManager * Instance()
Definition
ResourceManager.hh:42
Kinoko::owning_span::owning_span
owning_span()
Uninitialized buffer.
Definition
Types.hh:35
Kinoko::EGG::egg_delete
void egg_delete(const T *ptr)
Definition
Heap.hh:154
Kinoko::EGG::egg_new
T * egg_new(Args &&...args)
Definition
Heap.hh:148
Kinoko::Scene
Pertains to scene handling.
Definition
GameScene.cc:10
Kinoko::GroupID::None
@ None
Definition
Common.hh:166
Kinoko::u16
uint16_t u16
Definition
Memory.hh:17
Kinoko::s32
int32_t s32
Definition
Memory.hh:13
Kinoko::u32
uint32_t u32
Definition
Memory.hh:18
Kinoko::Abstract::Memory::MEMiExpBlockHead
Head of the memory block. Contains information about the block and a link in the corresponding used/f...
Definition
abstract/memory/ExpHeap.hh:38
Kinoko::Abstract::Memory::MEMiExpBlockHead::m_size
u32 m_size
Definition
abstract/memory/ExpHeap.hh:59
Kinoko::Scene::GameScene::Resource
Definition
GameScene.hh:39
Kinoko::Scene::GameScene::Resource::archive
System::MultiDvdArchive * archive
Definition
GameScene.hh:42
Kinoko::Scene::GameScene::Resource::Resource
Resource(System::MultiDvdArchive *archive, s32 id)
Definition
GameScene.cc:96
Kinoko::Scene::GameScene::Resource::id
s32 id
Definition
GameScene.hh:43
game
scene
GameScene.cc
Made by
Malleo
. Logo by
vabold
. Website generated by
Doxygen
1.18.0