62 lines
1.8 KiB
C++
62 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include "idlib/index.h"
|
|
#include "idlib/text/str.h"
|
|
|
|
#include <cstdint>
|
|
#include <utility>
|
|
|
|
// idAnimWebPath has no storage beyond its recovered idStr base.
|
|
class idAnimWebPath : public idStr {
|
|
public:
|
|
using idStr::idStr;
|
|
using idStr::operator=;
|
|
};
|
|
|
|
// The owning idDeclAnimWeb declaration is not compile-locked yet. This tag
|
|
// retains the recovered two-byte node-index representation without importing
|
|
// that malformed generated declaration into GameLib's active boundary.
|
|
enum class idAnimWebInvalidNodeIndex_t : int {
|
|
invalid = -1
|
|
};
|
|
|
|
using idAnimWebNodeIndex = idIndex<short, idAnimWebInvalidNodeIndex_t>;
|
|
|
|
struct idAnimWebRoute {
|
|
idAnimWebNodeIndex path[32];
|
|
int num;
|
|
int cost;
|
|
|
|
// Materialized in the authoritative animwebpath.h dump.
|
|
void Invert() {
|
|
for (int index = 0; index < num / 2; ++index) {
|
|
std::swap(path[index], path[num - index - 1]);
|
|
}
|
|
}
|
|
|
|
// Materialized in the authoritative animwebpath.h dump. A shared prefix
|
|
// node is consumed so concatenated routes do not duplicate their join.
|
|
void AppendPath(const idAnimWebRoute& other) {
|
|
int first = 0;
|
|
if (num > 0) {
|
|
while (first < other.num
|
|
&& path[num - 1].Get() == other.path[first].Get()) {
|
|
++first;
|
|
}
|
|
}
|
|
while (first < other.num && num < 32) {
|
|
path[num++] = other.path[first++];
|
|
}
|
|
cost += other.cost;
|
|
}
|
|
};
|
|
|
|
#if INTPTR_MAX == INT32_MAX
|
|
static_assert(sizeof(idAnimWebPath) == 32,
|
|
"Recovered idAnimWebPath ABI changed");
|
|
static_assert(sizeof(idAnimWebNodeIndex) == 2,
|
|
"Recovered AnimWeb node index ABI changed");
|
|
static_assert(sizeof(idAnimWebRoute) == 72,
|
|
"Recovered idAnimWebRoute ABI changed");
|
|
#endif
|