Preserve vanilla GPS provider class values
This commit is contained in:
@@ -175,18 +175,23 @@ constexpr uintptr_t kGpsCostMultiplierTableRva = 0x3154D28;
|
||||
constexpr std::array<float, 7> kGpsPatchedCostMultipliers = {
|
||||
12.0f, 7.0f, 2.5f, 0.0f, 3.0f, 2.0f, 1.25f,
|
||||
};
|
||||
constexpr std::array<float, 64> kGpsPatchedProviderClassMultipliers = [] {
|
||||
std::array<float, 64> values{};
|
||||
values.fill(1.0f);
|
||||
constexpr size_t kGpsProviderClassCount = 64;
|
||||
|
||||
values[1] = 0.70f;
|
||||
values[3] = 1.45f;
|
||||
values[4] = 1.25f;
|
||||
values[5] = 1.75f;
|
||||
values[15] = 0.80f;
|
||||
struct GpsProviderClassOverride
|
||||
{
|
||||
size_t classId;
|
||||
float multiplier;
|
||||
};
|
||||
|
||||
return values;
|
||||
}();
|
||||
constexpr std::array<GpsProviderClassOverride, 5> kGpsProviderClassOverrides = {{
|
||||
{1, 0.70f},
|
||||
{3, 1.45f},
|
||||
{4, 1.25f},
|
||||
{5, 1.75f},
|
||||
{15, 0.80f},
|
||||
}};
|
||||
|
||||
constexpr std::array<size_t, 6> kGpsProviderClassProbeIds = {1, 3, 4, 5, 14, 15};
|
||||
|
||||
HMODULE gModule = nullptr;
|
||||
std::mutex gLogMutex;
|
||||
@@ -1635,6 +1640,52 @@ void AppendFloatArray(std::ostringstream& aLine, const char* aLabel, const float
|
||||
aLine.precision(precision);
|
||||
}
|
||||
|
||||
void AppendGpsProviderClassSamples(std::ostringstream& aLine, const char* aLabel, const float* aValues,
|
||||
size_t aCount)
|
||||
{
|
||||
const auto flags = aLine.flags();
|
||||
const auto precision = aLine.precision();
|
||||
aLine << " " << aLabel << "=[";
|
||||
bool first = true;
|
||||
for (const auto classId : kGpsProviderClassProbeIds)
|
||||
{
|
||||
if (classId >= aCount)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!first)
|
||||
{
|
||||
aLine << ",";
|
||||
}
|
||||
first = false;
|
||||
aLine << classId << ":" << std::fixed << std::setprecision(2) << aValues[classId];
|
||||
}
|
||||
aLine << "]";
|
||||
aLine.flags(flags);
|
||||
aLine.precision(precision);
|
||||
}
|
||||
|
||||
void AppendGpsProviderClassOverrides(std::ostringstream& aLine)
|
||||
{
|
||||
const auto flags = aLine.flags();
|
||||
const auto precision = aLine.precision();
|
||||
aLine << " overrides=[";
|
||||
for (size_t index = 0; index < kGpsProviderClassOverrides.size(); ++index)
|
||||
{
|
||||
if (index > 0)
|
||||
{
|
||||
aLine << ",";
|
||||
}
|
||||
|
||||
const auto& item = kGpsProviderClassOverrides[index];
|
||||
aLine << item.classId << ":" << std::fixed << std::setprecision(2) << item.multiplier;
|
||||
}
|
||||
aLine << "]";
|
||||
aLine.flags(flags);
|
||||
aLine.precision(precision);
|
||||
}
|
||||
|
||||
class ScopedGpsCostTablePatch
|
||||
{
|
||||
public:
|
||||
@@ -1763,7 +1814,13 @@ public:
|
||||
}
|
||||
|
||||
std::memcpy(m_original.data(), m_table, sizeof(m_original));
|
||||
std::memcpy(m_table, kGpsPatchedProviderClassMultipliers.data(), sizeof(m_original));
|
||||
for (const auto& item : kGpsProviderClassOverrides)
|
||||
{
|
||||
if (item.classId < m_original.size())
|
||||
{
|
||||
m_table[item.classId] = item.multiplier;
|
||||
}
|
||||
}
|
||||
m_active = true;
|
||||
LogPatch("gps-provider-class-patch applied", nullptr);
|
||||
}
|
||||
@@ -1788,7 +1845,7 @@ private:
|
||||
}
|
||||
|
||||
const auto patchLogCall = NextGpsAsyncLogCall(gGpsProviderClassPatchLogCount);
|
||||
if (patchLogCall >= 48)
|
||||
if (patchLogCall >= 128)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -1803,11 +1860,10 @@ private:
|
||||
}
|
||||
if (m_table && IsReadableMemory(m_table, sizeof(m_original)))
|
||||
{
|
||||
AppendFloatArray(line, "current", m_table, m_original.size());
|
||||
AppendGpsProviderClassSamples(line, "current", m_table, m_original.size());
|
||||
}
|
||||
AppendFloatArray(line, "original", m_original.data(), m_original.size());
|
||||
AppendFloatArray(line, "patched", kGpsPatchedProviderClassMultipliers.data(),
|
||||
kGpsPatchedProviderClassMultipliers.size());
|
||||
AppendGpsProviderClassSamples(line, "original", m_original.data(), m_original.size());
|
||||
AppendGpsProviderClassOverrides(line);
|
||||
LogRed4ext(line.str());
|
||||
}
|
||||
|
||||
@@ -1816,7 +1872,7 @@ private:
|
||||
uint32_t m_searchCall = 0;
|
||||
uintptr_t m_vtableRva = 0;
|
||||
bool m_active = false;
|
||||
std::array<float, kGpsPatchedProviderClassMultipliers.size()> m_original{};
|
||||
std::array<float, kGpsProviderClassCount> m_original{};
|
||||
};
|
||||
|
||||
void AppendRouteJobSummary(std::ostringstream& aLine, const char* aPrefix, void* aJob)
|
||||
|
||||
Reference in New Issue
Block a user