blob: 86259d2dd155b0758d9b11f28bed8dbc3604b5eb (
plain)
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
|
#include "StarInterpolationTracker.hpp"
#include "StarRoot.hpp"
#include "StarAssets.hpp"
namespace Star {
constexpr double VanillaStepsPerSecond = 60.0;
InterpolationTracker::InterpolationTracker(Json config) {
if (config.isNull()) {
config = JsonObject();
} else if (config.type() == Json::Type::String) {
auto assets = Root::singleton().assets();
config = assets->json(config.toString());
}
m_interpolationEnabled = config.getBool("interpolationEnabled", false);
m_entityUpdateDelta = config.getDouble("entityUpdateDelta", 3) / VanillaStepsPerSecond;
m_timeLead = config.getDouble("stepLead", 0) / VanillaStepsPerSecond;
m_extrapolationHint = config.getUInt("extrapolationHint", 0);
m_timeTrackFactor = config.getDouble("stepTrackFactor", 1.0);
m_timeMaxDistance = config.getDouble("stepMaxDistance", 0.0) / VanillaStepsPerSecond;
m_currentTime = 0.0;
}
bool InterpolationTracker::interpolationEnabled() const {
return m_interpolationEnabled;
}
unsigned InterpolationTracker::extrapolationHint() const {
if (m_interpolationEnabled)
return m_extrapolationHint;
else
return 0;
}
float InterpolationTracker::entityUpdateDelta() const {
return m_entityUpdateDelta;
}
void InterpolationTracker::receiveTimeUpdate(double remoteStep) {
m_lastTimeUpdate = remoteStep;
}
void InterpolationTracker::update(double newLocalTime) {
double dt = newLocalTime - m_currentTime;
m_currentTime = newLocalTime;
if (!m_predictedTime || !m_lastTimeUpdate || dt < 0.0f) {
m_predictedTime = m_lastTimeUpdate;
} else {
*m_lastTimeUpdate += dt;
*m_predictedTime += dt;
*m_predictedTime += (*m_lastTimeUpdate - *m_predictedTime) * m_timeTrackFactor;
m_predictedTime = clamp<double>(*m_predictedTime, *m_lastTimeUpdate - m_timeMaxDistance, *m_lastTimeUpdate + m_timeMaxDistance);
}
}
float InterpolationTracker::interpolationLeadTime() const {
if (!m_interpolationEnabled || !m_predictedTime || !m_lastTimeUpdate)
return 0.0f;
return *m_lastTimeUpdate - *m_predictedTime + m_timeLead;
}
}
|