130 lines
3.9 KiB
C++
130 lines
3.9 KiB
C++
#include "paths.h"
|
|
#include <filesystem>
|
|
#include <regex>
|
|
|
|
PathsData pathsData;
|
|
|
|
void loadPaths() {
|
|
std::vector<FILE*> files;
|
|
|
|
for (const auto& entry : std::filesystem::directory_iterator(PATH)) {
|
|
const auto path = entry.path().string();
|
|
|
|
if (!std::regex_match(path, std::regex(".*NODES\\d{1,2}\\.DAT", std::regex_constants::icase)))
|
|
continue;
|
|
|
|
files.push_back(fopen(path.c_str(), "rb"));
|
|
}
|
|
|
|
for (FILE* file : files) {
|
|
SerializedHeader header = parseHeader(file);
|
|
pathsData.num_nodes += header.num_nodes;
|
|
pathsData.num_vehicle_nodes += header.num_vehicle_nodes;
|
|
pathsData.num_ped_nodes += header.num_ped_nodes;
|
|
pathsData.num_nav_nodes += header.num_nav_nodes;
|
|
pathsData.num_links += header.num_links;
|
|
fseek(file, 0, SEEK_SET);
|
|
}
|
|
|
|
pathsData.pathNodes = (PathNode*)malloc(pathsData.num_nodes * sizeof(PathNode));
|
|
pathsData.navNodes = (NavNode*)malloc(pathsData.num_nav_nodes * sizeof(NavNode));
|
|
pathsData.links = (Link*)malloc(pathsData.num_links * sizeof(Link));
|
|
pathsData.navLinks = (NavLink*)malloc(pathsData.num_links * sizeof(NavLink));
|
|
pathsData.linkLengths = (LinkLength*)malloc(pathsData.num_links * sizeof(LinkLength));
|
|
pathsData.intersectionFlags = (IntersectionFlags*)malloc(pathsData.num_links * sizeof(IntersectionFlags));
|
|
|
|
PathsData pathsDataPointers = pathsData;
|
|
for (FILE* file : files) {
|
|
parsePathsFile(file, &pathsDataPointers);
|
|
}
|
|
|
|
for (FILE* file : files) {
|
|
fclose(file);
|
|
}
|
|
}
|
|
|
|
void parsePathsFile(FILE* file, PathsData* pathsData) {
|
|
SerializedHeader header = parseHeader(file);
|
|
|
|
for (unsigned int i = 0; i < header.num_nodes; i++) {
|
|
parseNode(file, pathsData->pathNodes);
|
|
pathsData->pathNodes++;
|
|
}
|
|
|
|
for (unsigned int i = 0; i < header.num_nav_nodes; i++) {
|
|
parseNav(file, pathsData->navNodes);
|
|
pathsData->navNodes++;
|
|
}
|
|
|
|
for (unsigned int i = 0; i < header.num_links; i++) {
|
|
parseLink(file, pathsData->links);
|
|
pathsData->links++;
|
|
}
|
|
|
|
fseek(file, 768, SEEK_CUR); // Filler?
|
|
|
|
for (unsigned int i = 0; i < header.num_links; i++) {
|
|
parseNavLink(file, pathsData->navLinks);
|
|
pathsData->navLinks++;
|
|
}
|
|
|
|
for (unsigned int i = 0; i < header.num_links; i++) {
|
|
parseLinkLengths(file, pathsData->linkLengths);
|
|
pathsData->linkLengths++;
|
|
}
|
|
|
|
for (unsigned int i = 0; i < header.num_links; i++) {
|
|
parseIntersectionFlags(file, pathsData->intersectionFlags);
|
|
pathsData->intersectionFlags++;
|
|
}
|
|
}
|
|
|
|
SerializedHeader parseHeader(FILE* file) {
|
|
SerializedHeader header;
|
|
fread(&header, sizeof(header), 1, file);
|
|
return header;
|
|
}
|
|
|
|
void parseNode(FILE* file, PathNode* node) {
|
|
SerializedPathNode serializedNode;
|
|
fread(&serializedNode, sizeof(serializedNode), 1, file);
|
|
node->position_x = serializedNode.position_x / 8.f;
|
|
node->position_y = serializedNode.position_y / 8.f;
|
|
node->position_z = serializedNode.position_z / 8.f;
|
|
node->cost = serializedNode.cost;
|
|
node->link = serializedNode.link;
|
|
node->area = serializedNode.area;
|
|
node->node = serializedNode.node;
|
|
node->width = serializedNode.width;
|
|
node->flood_fill = serializedNode.flood_fill;
|
|
node->flags = *(NodeFlags*)&serializedNode.flags;
|
|
}
|
|
|
|
void parseNav(FILE* file, NavNode* node) {
|
|
SerializedNavNode serializedNode;
|
|
fread(&serializedNode, sizeof(serializedNode), 1, file);
|
|
node->position_x = serializedNode.position_x / 8.f;
|
|
node->position_y = serializedNode.position_y / 8.f;
|
|
node->area = serializedNode.area;
|
|
node->node = serializedNode.node;
|
|
node->direction_x = serializedNode.direction_x / 100.f;
|
|
node->direction_y = serializedNode.direction_y / 100.f;
|
|
node->flags = *(NavNodeFlags*)&serializedNode.flags;
|
|
}
|
|
|
|
void parseLink(FILE* file, Link* link) {
|
|
fread(link, sizeof(Link), 1, file);
|
|
}
|
|
|
|
void parseNavLink(FILE* file, NavLink* link) {
|
|
fread(link, sizeof(NavLink), 1, file);
|
|
}
|
|
|
|
void parseLinkLengths(FILE* file, LinkLength* length) {
|
|
fread(length, sizeof(LinkLength), 1, file);
|
|
}
|
|
|
|
void parseIntersectionFlags(FILE* file, IntersectionFlags* flags) {
|
|
fread(flags, sizeof(IntersectionFlags), 1, file);
|
|
}
|