A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
RailManager.cc
1#include "RailManager.hh"
2
3#include "game/system/CourseMap.hh"
4#include "game/system/map/MapdataGeoObj.hh"
5
6namespace Kinoko::Field {
7
9RailManager *RailManager::CreateInstance() {
10 ASSERT(!s_instance);
11 s_instance = new RailManager;
12 s_instance->createPaths();
13 return s_instance;
14}
15
17void RailManager::DestroyInstance() {
18 ASSERT(s_instance);
19 auto *instance = s_instance;
20 s_instance = nullptr;
21 delete instance;
22}
23
25RailManager::RailManager() = default;
26
28RailManager::~RailManager() {
29 if (s_instance) {
30 s_instance = nullptr;
31 WARN("RailManager instance not explicitly handled!");
32 }
33
34 for (auto *&rail : m_rails) {
35 delete rail;
36 }
37}
38
40void RailManager::createPaths() {
41 auto *courseMap = System::CourseMap::Instance();
42 m_pointCount = courseMap->getPointInfoCount();
43 m_extraInterplatorCount = 8;
44 u16 geoCount = courseMap->getGeoObjCount();
45 m_rails.reserve(m_pointCount + m_extraInterplatorCount);
46
47 for (u16 i = 0; i < m_pointCount; ++i) {
48 bool isObjectRoute = false;
49 auto *pointInfo = courseMap->getPointInfo(i);
50 bool isSpline = pointInfo->setting(0);
51
52 for (u16 j = 0; j < geoCount; ++j) {
53 auto *geoObj = courseMap->getGeoObj(j);
54
55 if (geoObj->pathId() != i) {
56 continue;
57 }
58
59 if (isSpline) {
60 m_rails.push_back(new RailSpline(i, pointInfo));
61 } else {
62 m_rails.push_back(new RailLine(i, pointInfo));
63 }
64
65 isObjectRoute = true;
66 break;
67 }
68
69 if (isObjectRoute) {
70 continue;
71 }
72
73 if (isSpline) {
74 m_rails.push_back(new RailSpline(i, pointInfo));
75 } else {
76 m_rails.push_back(new RailLine(i, pointInfo));
77 }
78 }
79}
80
81RailManager *RailManager::s_instance = nullptr;
82
83} // namespace Kinoko::Field
Pertains to collision.