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/SceneManager.hh>
4
5#include <game/field/CollisionDirector.hh>
6#include <game/field/ObjectDirector.hh>
7#include <game/field/ObjectDrivableDirector.hh>
8#include <game/field/RailManager.hh>
9
10#include <game/item/ItemDirector.hh>
11
12#include <game/kart/KartObjectManager.hh>
13#include <game/kart/KartParamFileManager.hh>
14
15#include <game/system/CourseMap.hh>
16#include <game/system/KPadDirector.hh>
17#include <game/system/RaceConfig.hh>
18#include <game/system/RaceManager.hh>
19
20namespace Host {
21
22Context::Context() {
23 m_contextMemory = malloc(MEMORY_SPACE_SIZE);
24 ASSERT(m_contextMemory && EGG::SceneManager::s_rootHeap);
25 memcpy(m_contextMemory, EGG::SceneManager::s_rootHeap, MEMORY_SPACE_SIZE);
26
27 m_ptrs.m_rootList = Abstract::Memory::MEMiHeapHead::s_rootList;
28 m_ptrs.m_archiveList = EGG::Archive::s_archiveList;
29 m_ptrs.m_heapList = EGG::Heap::s_heapList;
30 m_ptrs.m_currentHeap = EGG::Heap::s_currentHeap;
31 m_ptrs.m_heapForCreateScene = EGG::SceneManager::s_heapForCreateScene;
32 m_ptrs.m_boxColMgr = Field::BoxColManager::s_instance;
33 m_ptrs.m_colDir = Field::CollisionDirector::s_instance;
34 m_ptrs.m_courseColMgr = Field::CourseColMgr::s_instance;
35 m_ptrs.m_objDir = Field::ObjectDirector::s_instance;
36 m_ptrs.m_objDrivableDir = Field::ObjectDrivableDirector::s_instance;
37 m_ptrs.m_railMgr = Field::RailManager::s_instance;
38 m_ptrs.m_itemDir = Item::ItemDirector::s_instance;
39 m_ptrs.m_kartObjMgr = Kart::KartObjectManager::s_instance;
40 m_ptrs.m_paramFileMgr = Kart::KartParamFileManager::s_instance;
41 m_ptrs.m_courseMap = System::CourseMap::s_instance;
42 m_ptrs.m_padDir = System::KPadDirector::s_instance;
43 m_ptrs.m_raceConfig = System::RaceConfig::s_instance;
44 m_ptrs.m_onInitCallback = System::RaceConfig::s_onInitCallback;
45 m_ptrs.m_onInitCallbackArg = System::RaceConfig::s_onInitCallbackArg;
46 m_ptrs.m_raceMgr = System::RaceManager::s_instance;
47 m_ptrs.m_resMgr = System::ResourceManager::s_instance;
48}
49
50Context::Context(const Context &c) {
51 m_contextMemory = malloc(MEMORY_SPACE_SIZE);
52 ASSERT(m_contextMemory && c.m_contextMemory);
53 memcpy(m_contextMemory, c.m_contextMemory, MEMORY_SPACE_SIZE);
54 m_ptrs = c.m_ptrs;
55}
56
58Context::Context(Context &&c) {
59 m_contextMemory = c.m_contextMemory;
60 c.m_contextMemory = nullptr;
61 m_ptrs = c.m_ptrs;
62 c.m_ptrs = {};
63}
64
65Context::~Context() {
66 free(m_contextMemory);
67}
68
69Context &Context::operator=(const Context &rhs) {
70 if (*this == rhs) {
71 return *this;
72 }
73
74 ASSERT(m_contextMemory && rhs.m_contextMemory && m_contextMemory != rhs.m_contextMemory);
75 memcpy(m_contextMemory, rhs.m_contextMemory, MEMORY_SPACE_SIZE);
76 m_ptrs = rhs.m_ptrs;
77
78 return *this;
79}
80
81Context &Context::operator=(Context &&rhs) {
82 free(m_contextMemory);
83 m_contextMemory = rhs.m_contextMemory;
84 rhs.m_contextMemory = nullptr;
85 m_ptrs = rhs.m_ptrs;
86 rhs.m_ptrs = {};
87
88 return *this;
89}
90
91bool Context::operator==(const Context &rhs) const {
92 bool ret = m_contextMemory == rhs.m_contextMemory;
93 ret = ret && m_ptrs.m_rootList == rhs.m_ptrs.m_rootList;
94 ret = ret && m_ptrs.m_archiveList == rhs.m_ptrs.m_archiveList;
95 ret = ret && m_ptrs.m_heapList == rhs.m_ptrs.m_heapList;
96 ret = ret && m_ptrs.m_currentHeap == rhs.m_ptrs.m_currentHeap;
97 ret = ret && m_ptrs.m_heapForCreateScene == rhs.m_ptrs.m_heapForCreateScene;
98 ret = ret && m_ptrs.m_boxColMgr == rhs.m_ptrs.m_boxColMgr;
99 ret = ret && m_ptrs.m_colDir == rhs.m_ptrs.m_colDir;
100 ret = ret && m_ptrs.m_courseColMgr == rhs.m_ptrs.m_courseColMgr;
101 ret = ret && m_ptrs.m_objDir == rhs.m_ptrs.m_objDir;
102 ret = ret && m_ptrs.m_objDrivableDir == rhs.m_ptrs.m_objDrivableDir;
103 ret = ret && m_ptrs.m_railMgr == rhs.m_ptrs.m_railMgr;
104 ret = ret && m_ptrs.m_itemDir == rhs.m_ptrs.m_itemDir;
105 ret = ret && m_ptrs.m_kartObjMgr == rhs.m_ptrs.m_kartObjMgr;
106 ret = ret && m_ptrs.m_paramFileMgr == rhs.m_ptrs.m_paramFileMgr;
107 ret = ret && m_ptrs.m_courseMap == rhs.m_ptrs.m_courseMap;
108 ret = ret && m_ptrs.m_padDir == rhs.m_ptrs.m_padDir;
109 ret = ret && m_ptrs.m_raceConfig == rhs.m_ptrs.m_raceConfig;
110 ret = ret && m_ptrs.m_onInitCallbackArg == rhs.m_ptrs.m_onInitCallbackArg;
111 ret = ret && m_ptrs.m_raceMgr == rhs.m_ptrs.m_raceMgr;
112 ret = ret && m_ptrs.m_resMgr == rhs.m_ptrs.m_resMgr;
113
114 return ret;
115}
116
117void Context::SetActiveContext(const Context &rhs) {
118 ASSERT(EGG::SceneManager::s_rootHeap && rhs.m_contextMemory);
119 memcpy(reinterpret_cast<void *>(EGG::SceneManager::s_rootHeap), rhs.m_contextMemory,
120 MEMORY_SPACE_SIZE);
121
122 Abstract::Memory::MEMiHeapHead::s_rootList = rhs.m_ptrs.m_rootList;
123 EGG::Archive::s_archiveList = rhs.m_ptrs.m_archiveList;
124 EGG::Heap::s_heapList = rhs.m_ptrs.m_heapList;
125 EGG::Heap::s_currentHeap = rhs.m_ptrs.m_currentHeap;
126 EGG::SceneManager::s_heapForCreateScene = rhs.m_ptrs.m_heapForCreateScene;
127 Field::BoxColManager::s_instance = rhs.m_ptrs.m_boxColMgr;
128 Field::CollisionDirector::s_instance = rhs.m_ptrs.m_colDir;
129 Field::CourseColMgr::s_instance = rhs.m_ptrs.m_courseColMgr;
130 Field::ObjectDirector::s_instance = rhs.m_ptrs.m_objDir;
131 Field::ObjectDrivableDirector::s_instance = rhs.m_ptrs.m_objDrivableDir;
132 Field::RailManager::s_instance = rhs.m_ptrs.m_railMgr;
133 Item::ItemDirector::s_instance = rhs.m_ptrs.m_itemDir;
134 Kart::KartObjectManager::s_instance = rhs.m_ptrs.m_kartObjMgr;
135 Kart::KartParamFileManager::s_instance = rhs.m_ptrs.m_paramFileMgr;
136 System::CourseMap::s_instance = rhs.m_ptrs.m_courseMap;
137 System::KPadDirector::s_instance = rhs.m_ptrs.m_padDir;
138 System::RaceConfig::s_instance = rhs.m_ptrs.m_raceConfig;
139 System::RaceConfig::s_onInitCallback = rhs.m_ptrs.m_onInitCallback;
140 System::RaceConfig::s_onInitCallbackArg = rhs.m_ptrs.m_onInitCallbackArg;
141 System::RaceManager::s_instance = rhs.m_ptrs.m_raceMgr;
142 System::ResourceManager::s_instance = rhs.m_ptrs.m_resMgr;
143}
144
145} // namespace Host
static Abstract::Memory::MEMList s_archiveList
The linked list of all mounted archives.
Definition Archive.hh:48
Contexts can be used to restore a previous memory state for the current session.
Definition Context.hh:59
static void * s_onInitCallbackArg
The argument sent into the callback. This is expected to be reinterpret_casted.
Definition RaceConfig.hh:93
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:92
Represents the host application.
Definition HeapCommon.hh:9