Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarInterpolationTracker.cpp
blob: 494c52e00a74be04ff00afb8106090602e74e415 (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
#include "StarInterpolationTracker.hpp"
#include "StarRoot.hpp"
#include "StarAssets.hpp"

namespace Star {

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.getUInt("enittyUpdateDelta", 3);
  m_stepLead = config.getUInt("stepLead", 0);
  m_extrapolationHint = config.getUInt("extrapolationHint", 0);
  m_stepTrackFactor = config.getDouble("stepTrackFactor", 1.0);
  m_stepMaxDistance = config.getDouble("stepMaxDistance", 0.0);

  m_currentStep = 0.0;
}

bool InterpolationTracker::interpolationEnabled() const {
  return m_interpolationEnabled;
}

unsigned InterpolationTracker::extrapolationHint() const {
  if (m_interpolationEnabled)
    return m_extrapolationHint;
  else
    return 0;
}

unsigned InterpolationTracker::entityUpdateDelta() const {
  return m_entityUpdateDelta;
}

void InterpolationTracker::receiveStepUpdate(double remoteStep) {
  m_lastStepUpdate = remoteStep;
}

void InterpolationTracker::update(double newLocalStep) {
  double dt = newLocalStep - m_currentStep;
  m_currentStep = newLocalStep;
  if (!m_predictedStep || !m_lastStepUpdate || dt < 0.0f) {
    m_predictedStep = m_lastStepUpdate;
  } else {
    *m_lastStepUpdate += dt;
    *m_predictedStep += dt;
    *m_predictedStep += (*m_lastStepUpdate - *m_predictedStep) * m_stepTrackFactor;
    m_predictedStep = clamp<double>(*m_predictedStep, *m_lastStepUpdate - m_stepMaxDistance, *m_lastStepUpdate + m_stepMaxDistance);
  }
}

float InterpolationTracker::interpolationLeadSteps() const {
  if (!m_interpolationEnabled || !m_predictedStep || !m_lastStepUpdate)
    return 0.0f;
  return *m_lastStepUpdate - *m_predictedStep + m_stepLead;
}

}