A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
Context.cc
1#include "Context.hh"
2
3#include <egg/core/ExpHeap.hh>
4#include <egg/core/FrmHeap.hh>
5
6#include <egg/core/SceneManager.hh>
7
8#include <game/field/CollisionDirector.hh>
9#include <game/field/ObjectDirector.hh>
10#include <game/field/ObjectDrivableDirector.hh>
11#include <game/field/RailManager.hh>
12#include <game/field/jugem/JugemDirector.hh>
13#include <game/field/obj/ObjectBasabasa.hh>
14#include <game/field/obj/ObjectFlamePoleFoot.hh>
15
16#include <game/item/ItemDirector.hh>
17
18#include <game/kart/KartObjectManager.hh>
19#include <game/kart/KartParamFileManager.hh>
20
21#include <game/render/KartCamera.hh>
22
23#include <game/system/CourseMap.hh>
24#include <game/system/KPadDirector.hh>
25#include <game/system/RaceConfig.hh>
26#include <game/system/RaceManager.hh>
27
28namespace Kinoko::Host {
29
30Context::Context() {
31 m_contextMemoryHeapSize = RootHeapSize();
32
33 m_contextMemory = malloc(MEMORY_SPACE_SIZE);
34 ASSERT(m_contextMemory);
35 memcpy(m_contextMemory, static_cast<void *>(EGG::SceneManager::s_rootHeap),
36 m_contextMemoryHeapSize);
37
38 m_statics.m_rootList = Abstract::Memory::MEMiHeapHead::s_rootList;
39 m_statics.m_archiveList = EGG::Archive::s_archiveList;
40 m_statics.m_heapList = EGG::Heap::s_heapList;
41 m_statics.m_currentHeap = EGG::Heap::s_currentHeap;
42 m_statics.m_allocatableHeap = EGG::Heap::s_allocatableHeap;
43 m_statics.m_heapForCreateScene = EGG::SceneManager::s_heapForCreateScene;
44 m_statics.m_heapOptionFlg = EGG::SceneManager::s_heapOptionFlg;
45 m_statics.m_boxColMgr = Field::BoxColManager::s_instance;
46 m_statics.m_colDir = Field::CollisionDirector::s_instance;
47 m_statics.m_courseColMgr = Field::CourseColMgr::s_instance;
48 m_statics.m_jugemDir = Field::JugemDirector::s_instance;
49 m_statics.m_objDir = Field::ObjectDirector::s_instance;
50 m_statics.m_objDrivableDir = Field::ObjectDrivableDirector::s_instance;
51 m_statics.m_railMgr = Field::RailManager::s_instance;
52 m_statics.m_itemDir = Item::ItemDirector::s_instance;
53 m_statics.m_kartObjMgr = Kart::KartObjectManager::s_instance;
54 m_statics.m_paramFileMgr = Kart::KartParamFileManager::s_instance;
55 m_statics.m_courseMap = System::CourseMap::s_instance;
56 m_statics.m_padDir = System::KPadDirector::s_instance;
57 m_statics.m_raceConfig = System::RaceConfig::s_instance;
58 m_statics.m_onInitCallback = System::RaceConfig::s_onInitCallback;
59 m_statics.m_onInitCallbackArg = System::RaceConfig::s_onInitCallbackArg;
60 m_statics.m_raceMgr = System::RaceManager::s_instance;
61 m_statics.m_resMgr = System::ResourceManager::s_instance;
62 m_statics.m_kartCamera = Render::KartCamera::s_instance;
63 m_statics.m_thunderScaleUpAnmChr = Kart::KartObjectManager::s_thunderScaleUpAnmChr;
64 m_statics.m_thunderScaleDownAnmChr = Kart::KartObjectManager::s_thunderScaleDownAnmChr;
65 m_statics.m_pressScaleUpAnmChr = Kart::KartObjectManager::s_pressScaleUpAnmChr;
66 m_statics.m_frameCtrlBaseUpdateRate = Abstract::g3d::FrameCtrl::s_baseUpdateRate;
67 m_statics.m_dotProductCache = Field::ObjectCollisionBase::s_dotProductCache;
68 m_statics.m_wanwanMaxPitch = Field::ObjectDirector::s_wanwanMaxPitch;
69 m_statics.m_basabasaInitialXRange = Field::ObjectBasabasa::s_initialXRange;
70 m_statics.m_basabasaInitialYRange = Field::ObjectBasabasa::s_initialYRange;
71 m_statics.m_flamePoleCount = Field::ObjectFlamePoleFoot::s_flamePoleCount;
72}
73
74Context::Context(const Context &c) {
75 ASSERT(c.m_contextMemory);
76 m_contextMemory = malloc(MEMORY_SPACE_SIZE);
77 ASSERT(m_contextMemory);
78
79 // For performance, only memcpy the minimum required to recover the allocated region of the heap
80 memcpy(m_contextMemory, c.m_contextMemory, c.m_contextMemoryHeapSize);
81
82 m_contextMemoryHeapSize = c.m_contextMemoryHeapSize;
83 m_statics = c.m_statics;
84}
85
87Context::Context(Context &&c) {
88 m_contextMemory = c.m_contextMemory;
89 c.m_contextMemory = {};
90 m_contextMemoryHeapSize = c.m_contextMemoryHeapSize;
91 c.m_contextMemoryHeapSize = 0;
92 m_statics = c.m_statics;
93 c.m_statics = {};
94}
95
96Context::~Context() {
97 free(m_contextMemory);
98}
99
100Context &Context::operator=(const Context &rhs) {
101 if (*this == rhs) {
102 return *this;
103 }
104
105 ASSERT(m_contextMemory && rhs.m_contextMemory);
106
107 // For performance, only memcpy the minimum required to recover the allocated region of the heap
108 memcpy(m_contextMemory, rhs.m_contextMemory, rhs.m_contextMemoryHeapSize);
109
110 m_contextMemoryHeapSize = rhs.m_contextMemoryHeapSize;
111 m_statics = rhs.m_statics;
112
113 return *this;
114}
115
116Context &Context::operator=(Context &&rhs) {
117 free(m_contextMemory);
118 m_contextMemory = rhs.m_contextMemory;
119 rhs.m_contextMemory = nullptr;
120 m_contextMemoryHeapSize = rhs.m_contextMemoryHeapSize;
121 rhs.m_contextMemoryHeapSize = 0;
122 m_statics = rhs.m_statics;
123 rhs.m_statics = {};
124
125 return *this;
126}
127
128bool Context::operator==(const Context &rhs) const {
129 bool ret = m_contextMemory == rhs.m_contextMemory;
130 ret = ret && m_contextMemoryHeapSize == rhs.m_contextMemoryHeapSize;
131 ret = ret && m_statics.m_rootList == rhs.m_statics.m_rootList;
132 ret = ret && m_statics.m_archiveList == rhs.m_statics.m_archiveList;
133 ret = ret && m_statics.m_heapList == rhs.m_statics.m_heapList;
134 ret = ret && m_statics.m_currentHeap == rhs.m_statics.m_currentHeap;
135 ret = ret && m_statics.m_allocatableHeap == rhs.m_statics.m_allocatableHeap;
136 ret = ret && m_statics.m_heapForCreateScene == rhs.m_statics.m_heapForCreateScene;
137 ret = ret && m_statics.m_heapOptionFlg == rhs.m_statics.m_heapOptionFlg;
138 ret = ret && m_statics.m_boxColMgr == rhs.m_statics.m_boxColMgr;
139 ret = ret && m_statics.m_colDir == rhs.m_statics.m_colDir;
140 ret = ret && m_statics.m_courseColMgr == rhs.m_statics.m_courseColMgr;
141 ret = ret && m_statics.m_jugemDir == rhs.m_statics.m_jugemDir;
142 ret = ret && m_statics.m_objDir == rhs.m_statics.m_objDir;
143 ret = ret && m_statics.m_objDrivableDir == rhs.m_statics.m_objDrivableDir;
144 ret = ret && m_statics.m_railMgr == rhs.m_statics.m_railMgr;
145 ret = ret && m_statics.m_itemDir == rhs.m_statics.m_itemDir;
146 ret = ret && m_statics.m_kartObjMgr == rhs.m_statics.m_kartObjMgr;
147 ret = ret && m_statics.m_paramFileMgr == rhs.m_statics.m_paramFileMgr;
148 ret = ret && m_statics.m_courseMap == rhs.m_statics.m_courseMap;
149 ret = ret && m_statics.m_padDir == rhs.m_statics.m_padDir;
150 ret = ret && m_statics.m_raceConfig == rhs.m_statics.m_raceConfig;
151 ret = ret && m_statics.m_onInitCallbackArg == rhs.m_statics.m_onInitCallbackArg;
152 ret = ret && m_statics.m_raceMgr == rhs.m_statics.m_raceMgr;
153 ret = ret && m_statics.m_resMgr == rhs.m_statics.m_resMgr;
154 ret = ret && m_statics.m_kartCamera == rhs.m_statics.m_kartCamera;
155 ret = ret && m_statics.m_thunderScaleUpAnmChr == rhs.m_statics.m_thunderScaleUpAnmChr;
156 ret = ret && m_statics.m_thunderScaleDownAnmChr == rhs.m_statics.m_thunderScaleDownAnmChr;
157 ret = ret && m_statics.m_pressScaleUpAnmChr == rhs.m_statics.m_pressScaleUpAnmChr;
158 ret = ret && m_statics.m_frameCtrlBaseUpdateRate == rhs.m_statics.m_frameCtrlBaseUpdateRate;
159 ret = ret && m_statics.m_dotProductCache == rhs.m_statics.m_dotProductCache;
160 ret = ret && m_statics.m_wanwanMaxPitch == rhs.m_statics.m_wanwanMaxPitch;
161 ret = ret && m_statics.m_basabasaInitialXRange == rhs.m_statics.m_basabasaInitialXRange;
162 ret = ret && m_statics.m_basabasaInitialYRange == rhs.m_statics.m_basabasaInitialYRange;
163 ret = ret && m_statics.m_flamePoleCount == rhs.m_statics.m_flamePoleCount;
164
165 return ret;
166}
167
168void Context::SetActiveContext(const Context &rhs) {
169 ASSERT(EGG::SceneManager::s_rootHeap && rhs.m_contextMemory);
170
171 // For performance, only memcpy the minimum required to recover the allocated region of the heap
172 memcpy(static_cast<void *>(EGG::SceneManager::s_rootHeap), rhs.m_contextMemory,
173 rhs.m_contextMemoryHeapSize);
174
175 Abstract::Memory::MEMiHeapHead::s_rootList = rhs.m_statics.m_rootList;
176 EGG::Archive::s_archiveList = rhs.m_statics.m_archiveList;
177 EGG::Heap::s_heapList = rhs.m_statics.m_heapList;
178 EGG::Heap::s_currentHeap = rhs.m_statics.m_currentHeap;
179 EGG::Heap::s_allocatableHeap = rhs.m_statics.m_allocatableHeap;
180 EGG::SceneManager::s_heapForCreateScene = rhs.m_statics.m_heapForCreateScene;
181 EGG::SceneManager::s_heapOptionFlg = rhs.m_statics.m_heapOptionFlg;
182 Field::BoxColManager::s_instance = rhs.m_statics.m_boxColMgr;
183 Field::CollisionDirector::s_instance = rhs.m_statics.m_colDir;
184 Field::CourseColMgr::s_instance = rhs.m_statics.m_courseColMgr;
185 Field::JugemDirector::s_instance = rhs.m_statics.m_jugemDir;
186 Field::ObjectDirector::s_instance = rhs.m_statics.m_objDir;
187 Field::ObjectDrivableDirector::s_instance = rhs.m_statics.m_objDrivableDir;
188 Field::RailManager::s_instance = rhs.m_statics.m_railMgr;
189 Item::ItemDirector::s_instance = rhs.m_statics.m_itemDir;
190 Kart::KartObjectManager::s_instance = rhs.m_statics.m_kartObjMgr;
191 Kart::KartParamFileManager::s_instance = rhs.m_statics.m_paramFileMgr;
192 System::CourseMap::s_instance = rhs.m_statics.m_courseMap;
193 System::KPadDirector::s_instance = rhs.m_statics.m_padDir;
194 System::RaceConfig::s_instance = rhs.m_statics.m_raceConfig;
195 System::RaceConfig::s_onInitCallback = rhs.m_statics.m_onInitCallback;
196 System::RaceConfig::s_onInitCallbackArg = rhs.m_statics.m_onInitCallbackArg;
197 System::RaceManager::s_instance = rhs.m_statics.m_raceMgr;
198 System::ResourceManager::s_instance = rhs.m_statics.m_resMgr;
199 Render::KartCamera::s_instance = rhs.m_statics.m_kartCamera;
200 Kart::KartObjectManager::s_thunderScaleUpAnmChr = rhs.m_statics.m_thunderScaleUpAnmChr;
201 Kart::KartObjectManager::s_thunderScaleDownAnmChr = rhs.m_statics.m_thunderScaleDownAnmChr;
202 Kart::KartObjectManager::s_pressScaleUpAnmChr = rhs.m_statics.m_pressScaleUpAnmChr;
203 Abstract::g3d::FrameCtrl::s_baseUpdateRate = rhs.m_statics.m_frameCtrlBaseUpdateRate;
204 Field::ObjectCollisionBase::s_dotProductCache = rhs.m_statics.m_dotProductCache;
205 Field::ObjectDirector::s_wanwanMaxPitch = rhs.m_statics.m_wanwanMaxPitch;
206 Field::ObjectBasabasa::s_initialXRange = rhs.m_statics.m_basabasaInitialXRange;
207 Field::ObjectBasabasa::s_initialYRange = rhs.m_statics.m_basabasaInitialYRange;
208 Field::ObjectFlamePoleFoot::s_flamePoleCount = rhs.m_statics.m_flamePoleCount;
209}
210
215 auto *rootHeap = EGG::SceneManager::s_rootHeap;
216 ASSERT(rootHeap);
217
218 // Heaps are nested, but the last byte before the heap end will always belong to a leaf heap
219 auto *lastHeap = EGG::Heap::findContainHeap(static_cast<char *>(rootHeap->getEndAddress()) - 1);
220 ASSERT(lastHeap);
221
222 void *usedEnd = nullptr;
223
224 auto *expHeap = EGG::Heap::dynamicCastToExp(lastHeap);
225 auto *frmHeap = EGG::Heap::dynamicCastToFrm(lastHeap);
226 ASSERT(expHeap || frmHeap);
227 if (expHeap) {
228 auto *expHeapHead = expHeap->dynamicCastHandleToExp();
229 ASSERT(expHeapHead);
230 usedEnd = expHeapHead->calcUsedEnd();
231 } else if (frmHeap) {
232 auto *frmHeapHead = frmHeap->dynamicCastHandleToFrm();
233 ASSERT(frmHeapHead);
234 usedEnd = frmHeapHead->calcUsedEnd();
235 }
236
237 intptr_t heapSize = reinterpret_cast<intptr_t>(usedEnd) - reinterpret_cast<intptr_t>(rootHeap);
238 ASSERT(heapSize > 0 && static_cast<size_t>(heapSize) < MEMORY_SPACE_SIZE);
239
240 return static_cast<size_t>(heapSize);
241}
242
243} // namespace Kinoko::Host
static Abstract::Memory::MEMList s_archiveList
The linked list of all mounted archives.
Definition Archive.hh:51
Contexts can be used to restore a previous memory state for the current session.
Definition Context.hh:71
static size_t RootHeapSize()
Derives the minimum memcpy size required to preserve the entire state of the race.
Definition Context.cc:214
static void * s_onInitCallbackArg
The argument sent into the callback. This is expected to be reinterpret_casted.
Definition RaceConfig.hh:97
static InitCallback s_onInitCallback
Host-agnostic way of initializing RaceConfig. The type of the first player must be set to either Loca...
Definition RaceConfig.hh:96
Represents the host application.
Definition HeapCommon.hh:11