A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
MapdataPointInfo.cc
1#include "MapdataPointInfo.hh"
2
3#include "game/system/CourseMap.hh"
4
5namespace Kinoko::System {
6
7MapdataPointInfo::MapdataPointInfo(const SData *data) : m_rawData(data) {
8 EGG::RamStream stream =
9 EGG::RamStream(data, sizeof(SData) + parse<u16>(data->pointCount) * sizeof(Point));
10 read(stream);
11}
12
13MapdataPointInfo::~MapdataPointInfo() = default;
14
15void MapdataPointInfo::read(EGG::RamStream &stream) {
16 u16 count = stream.read_u16();
17
18 m_points = owning_span<Point>(count);
19
20 for (auto &setting : m_settings) {
21 setting = stream.read_u8();
22 }
23
24 for (auto &point : m_points) {
25 EGG::Vector3f pos;
26 pos.read(stream);
27
28 u16 settings[2];
29 settings[0] = stream.read_u16();
30 settings[1] = stream.read_u16();
31
32 point = Point(pos, {settings[0], settings[1]});
33 }
34}
35
37MapdataPointInfoAccessor::MapdataPointInfoAccessor(const MapSectionHeader *header)
38 : MapdataAccessorBase<MapdataPointInfo, MapdataPointInfo::SData>(header) {
39 init(reinterpret_cast<const MapdataPointInfo::SData *>(m_sectionHeader + 1),
40 parse<u16>(m_sectionHeader->count));
41}
42
43MapdataPointInfoAccessor::~MapdataPointInfoAccessor() = default;
44
45void MapdataPointInfoAccessor::init(const MapdataPointInfo::SData *start, u16 count) {
46 if (count != 0) {
47 m_entryCount = count;
48 m_entries = new MapdataPointInfo *[count];
49 }
50
51 uintptr_t data = reinterpret_cast<uintptr_t>(start);
52
53 for (u16 i = 0; i < count; ++i) {
54 m_entries[i] = new MapdataPointInfo(reinterpret_cast<MapdataPointInfo::SData *>(data));
55 data += m_entries[i]->pointCount() * sizeof(MapdataPointInfo::Point) +
56 offsetof(MapdataPointInfo::SData, points);
57 }
58}
59
60} // namespace Kinoko::System
High-level handling for generic system operations, such as input reading, race configuration,...
Definition CourseMap.cc:5