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 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 for (auto *&interpolator : m_interpolators) {
39 delete interpolator;
40 }
41
42 delete m_interpolators.data();
43}
44
46void RailManager::createPaths() {
47 auto *courseMap = System::CourseMap::Instance();
48 m_pointCount = courseMap->getPointInfoCount();
49 m_extraInterplatorCount = 8;
50 u16 geoCount = courseMap->getGeoObjCount();
51 m_rails.reserve(m_pointCount + m_extraInterplatorCount);
52 m_interpolatorTotal = m_pointCount;
53
54 // For now, assume screenCount of 1 instead of calling into RaceScenario
55 m_cameraPointCount = m_pointCount * 1;
56 m_interpolatorTotal = m_pointCount * 1 + m_extraInterplatorCount;
57 m_cameraCount = 1;
58
59 // The base game indexes based on i and j, so we need to resize regardless of isObjectRoute.
60 m_interpolators = std::span<RailInterpolator *>(new RailInterpolator *[m_interpolatorTotal],
61 m_interpolatorTotal);
62
63 // Avoid deallocation headache later
64 for (auto *&interpolator : m_interpolators) {
65 interpolator = nullptr;
66 }
67
68 for (u16 i = 0; i < m_pointCount; ++i) {
69 bool isObjectRoute = false;
70 auto *pointInfo = courseMap->getPointInfo(i);
71 bool isSpline = pointInfo->setting(0);
72
73 for (u16 j = 0; j < geoCount; ++j) {
74 auto *geoObj = courseMap->getGeoObj(j);
75
76 if (geoObj->pathId() != i) {
77 continue;
78 }
79
80 if (isSpline) {
81 m_rails.push_back(new RailSpline(i, pointInfo));
82 } else {
83 m_rails.push_back(new RailLine(i, pointInfo));
84 }
85
86 isObjectRoute = true;
87 break;
88 }
89
90 if (isObjectRoute) {
91 continue;
92 }
93
94 if (isSpline) {
95 m_rails.push_back(new RailSpline(i, pointInfo));
96
97 for (u16 j = 0; j < m_cameraCount; ++j) {
98 m_interpolators[j + i * m_cameraCount] = new RailSmoothInterpolator(0.0f, i);
99 }
100 } else {
101 m_rails.push_back(new RailLine(i, pointInfo));
102
103 for (u16 j = 0; j < m_cameraCount; ++j) {
104 m_interpolators[j + i * m_cameraCount] = new RailLinearInterpolator(0.0f, i);
105 }
106 }
107 }
108}
109
110RailManager *RailManager::s_instance = nullptr;
111
112} // namespace Field
Pertains to collision.