1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#include "TrackBrowser.h"
#include "port/Engine.h"
#include "engine/editor/SceneManager.h"
#include "engine/tracks/CustomTrack.h"
#include <imgui.h>
TrackBrowser* TrackBrowser::Instance;
void TrackBrowser::FindCustomTracks() {
auto manager = GameEngine::Instance->context->GetResourceManager()->GetArchiveManager();
auto ptr2 = manager->ListDirectories("tracks/*");
if (!ptr2) {
return;
}
auto dirs = *ptr2;
for (const std::string& dir : dirs) {
std::string name = dir.substr(dir.find_last_of('/') + 1);
std::string sceneFile = dir + "/scene.json";
std::string minimapFile = dir + "/minimap.png";
// The track has a valid scene file, add it to the registry
if (manager->HasFile(sceneFile)) {
auto archive = manager->GetArchiveFromFile(sceneFile);
TrackInfo info;
info.Path = dir;
TrackEditor::LoadTrackInfo(info, archive, sceneFile);
if (info.ResourceName.empty()) {
printf("[TrackBrowser] Track has invalid resource name; expected format: author:mod_name");
info.ResourceName = std::string("mods:") + name;
}
printf("[TrackBrowser] Added custom track %s\n", info.Name.c_str());
gTrackRegistry.Add(info, [info, archive]() {
auto track = std::make_unique<CustomTrack>();
track->ResourceName = info.ResourceName;
track->Archive = archive;
GetWorld()->SetCurrentTrack(std::move(track));
});
} else { // The track does not have a valid scene file
const std::string file = dir + "/data_track_sections";
// If the track has a data_track_sections file,
// then it must at least be a valid track.
// So lets add it as an uninitialized track.
if (manager->HasFile(file)) {
printf("[TrackBrowser] [FindCustomTracks] Found a new custom track!\n");
printf(" Creating scene.json so the track can be configured in the editor\n");
TrackInfo info;
std::string resName = std::string("mods:") + name;
info.ResourceName = resName;
info.Name = name;
info.DebugName = name;
info.Path = dir;
// Create the track
auto archive = manager->GetArchiveFromFile(file);
auto track = std::make_unique<CustomTrack>();
track->Archive = archive;
track->ResourceName = info.ResourceName;
TrackEditor::SaveLevel(track.get(), static_cast<const TrackInfo*>(&info)); // Write scene file so it will show up in the track browser
printf("[TrackBrowser] [FindCustomTracks] Saved scene.json to new track!\n");
// Passing these through seems kinda bad. But it works?
gTrackRegistry.Add(info, [info, archive]() {
auto track = std::make_unique<CustomTrack>();
track->Archive = archive;
track->ResourceName = info.ResourceName;
GetWorld()->SetCurrentTrack(std::move(track));
});
} else {
printf("[TrackBrowser] Track '%s' missing required track files. Cannot add to game\n Missing %s/data_track_sections file\n", name.c_str(), dir.c_str());
}
}
}
}
extern "C" void TrackBrowser_SetTrack(const char* name) {
TrackBrowser::Instance->SetTrack(std::string(name));
}
extern "C" void TrackBrowser_SetTrackFromCup() {
TrackBrowser::Instance->SetTrack(GetWorld()->GetCurrentCup()->GetTrack());
}
extern "C" void TrackBrowser_NextTrack(void) {
TrackBrowser::Instance->NextTrack();
}
extern "C" void TrackBrowser_PreviousTrack(void) {
TrackBrowser::Instance->PreviousTrack();
}
extern "C" size_t TrackBrowser_GetTrackIndex(void) {
return TrackBrowser::Instance->GetTrackIndex();
}
extern "C" const char* TrackBrowser_GetTrackName(void) {
return TrackBrowser::Instance->GetTrackName();
}
extern "C" const char* TrackBrowser_GetTrackDebugName(void) {
return TrackBrowser::Instance->GetTrackDebugName();
}
extern "C" const char* TrackBrowser_GetTrackLength(void) {
return TrackBrowser::Instance->GetTrackLength();
}
extern "C" void TrackBrowser_SetTrackByIdx(size_t trackIndex) {
TrackBrowser::Instance->SetTrackByIdx(trackIndex);
}
extern "C" const char* TrackBrowser_GetTrackNameByIdx(size_t trackIndex) {
return TrackBrowser::Instance->GetTrackNameByIdx(trackIndex);
}
extern "C" const char* TrackBrowser_GetTrackDebugNameByIdx(size_t trackIndex) {
return TrackBrowser::Instance->GetTrackDebugNameByIdx(trackIndex);
}
extern "C" const char* TrackBrowser_GetTrackLengthByIdx(size_t trackIndex) {
return TrackBrowser::Instance->GetTrackLengthByIdx(trackIndex);
}
extern "C" const char* TrackBrowser_GetMinimapTextureByIdx(size_t trackIndex) {
return TrackBrowser::Instance->GetMinimapTextureByIdx(trackIndex);
}
|