Optimize saving of skidding state in network

This commit is contained in:
Benau 2018-07-30 15:35:59 +08:00
parent 59ebc48fe1
commit 782e966fa5
3 changed files with 32 additions and 24 deletions

View File

@ -268,8 +268,11 @@ std::function<void()> KartRewinder::getLocalStateRestoreFunction()
steer_val_r = pc->m_steer_val_r;
}
// Skidding local state
float remaining_jump_time = m_skidding->m_remaining_jump_time;
return [has_started, bounce_back_ticks, brake_ticks, min_nitro_ticks,
initial_speed, steer_val_l, steer_val_r, this]()
initial_speed, steer_val_l, steer_val_r, remaining_jump_time, this]()
{
m_has_started = has_started;
m_bounce_back_ticks = bounce_back_ticks;
@ -282,5 +285,6 @@ std::function<void()> KartRewinder::getLocalStateRestoreFunction()
pc->m_steer_val_l = steer_val_l;
pc->m_steer_val_r = steer_val_r;
}
m_skidding->m_remaining_jump_time = remaining_jump_time;
};
} // getLocalStateRestoreFunction

View File

@ -67,7 +67,7 @@ Skidding::~Skidding()
*/
void Skidding::reset()
{
m_skid_time = 0.0f;
m_skid_time = 0;
m_skid_state = SKID_NONE;
m_skid_factor = 1.0f;
m_real_steering = 0.0f;
@ -101,8 +101,7 @@ void Skidding::reset()
void Skidding::saveState(BareNetworkString *buffer)
{
buffer->addUInt8(m_skid_state);
buffer->addFloat(m_remaining_jump_time);
buffer->addFloat(m_skid_time);
buffer->addUInt16(m_skid_time);
buffer->addFloat(m_skid_factor);
buffer->addFloat(m_visual_rotation);
} // saveState
@ -114,8 +113,7 @@ void Skidding::saveState(BareNetworkString *buffer)
void Skidding::rewindTo(BareNetworkString *buffer)
{
m_skid_state = (SkidState)buffer->getUInt8();
m_remaining_jump_time = buffer->getFloat();
m_skid_time = buffer->getFloat();
m_skid_time = buffer->getUInt16();
m_skid_factor = buffer->getFloat();
m_visual_rotation = buffer->getFloat();
} // rewindTo
@ -146,9 +144,11 @@ void Skidding::checkSmoothing()
* kart skids either left or right, the steering fraction is bound by
* reduce-turn-min and reduce-turn-max.
*/
float Skidding::updateSteering(float steer, float dt)
float Skidding::updateSteering(float steer, int ticks)
{
float steer_result;
float dt = stk_config->ticks2Time(ticks);
float skid_time_float = stk_config->ticks2Time(m_skid_time);
float steer_result = 0.0f;
const KartProperties *kp = m_kart->getKartProperties();
@ -158,9 +158,10 @@ float Skidding::updateSteering(float steer, float dt)
case SKID_SHOW_GFX_RIGHT:
case SKID_NONE:
steer_result = steer;
if (m_skid_time < kp->getSkidVisualTime() && m_skid_time > 0)
if (skid_time_float < kp->getSkidVisualTime() &&
skid_time_float > 0)
{
float f = m_visual_rotation - m_visual_rotation*dt/m_skid_time;
float f = m_visual_rotation - m_visual_rotation*dt/skid_time_float;
// Floating point errors when m_skid_time is very close to 0
// can result in visual rotation set to a large number
if( (f<0 && m_visual_rotation>0 ) ||
@ -184,9 +185,9 @@ float Skidding::updateSteering(float steer, float dt)
float f = (1.0f+steer)*0.5f; // map [-1,1] --> [0, 1]
steer_result = kp->getSkidReduceTurnMin()
+ m_skid_reduce_turn_delta * f;
if(m_skid_time < kp->getSkidVisualTime())
if(skid_time_float < kp->getSkidVisualTime())
m_visual_rotation = kp->getSkidVisual()
* steer_result * m_skid_time
* steer_result * skid_time_float
/ kp->getSkidVisualTime();
else
m_visual_rotation = kp->getSkidVisual() * steer_result;
@ -197,9 +198,9 @@ float Skidding::updateSteering(float steer, float dt)
float f = (-1.0f+steer)*0.5f; // map [-1,1] --> [-1, 0]
steer_result = -kp->getSkidReduceTurnMin()
+ m_skid_reduce_turn_delta * f;
if(m_skid_time < kp->getSkidVisualTime())
if(skid_time_float < kp->getSkidVisualTime())
m_visual_rotation = kp->getSkidVisual()
* steer_result * m_skid_time
* steer_result * skid_time_float
/ kp->getSkidVisualTime();
else
m_visual_rotation = kp->getSkidVisual() * steer_result;
@ -466,7 +467,7 @@ void Skidding::update(int ticks, bool is_on_ground,
m_real_steering, m_kart->getSpeed(),
m_kart->getMaxSteerAngle(m_kart->getSpeed()));
#endif
m_skid_time += dt;
m_skid_time += ticks;
float bonus_time, bonus_speed, bonus_force;
unsigned int level = getSkidBonus(&bonus_time, &bonus_speed,
&bonus_force);
@ -488,13 +489,14 @@ void Skidding::update(int ticks, bool is_on_ground,
m_skid_state = m_skid_state == SKID_ACCUMULATE_LEFT
? SKID_SHOW_GFX_LEFT
: SKID_SHOW_GFX_RIGHT;
float t = std::min(m_skid_time, kp->getSkidVisualTime());
float skid_time_float = stk_config->ticks2Time(m_skid_time);
float t = std::min(skid_time_float, kp->getSkidVisualTime());
t = std::min(t, kp->getSkidRevertVisualTime());
btVector3 rot(0, m_visual_rotation * kp->getSkidPostSkidRotateFactor(), 0);
m_kart->getVehicle()->setTimedRotation(t, rot);
// skid_time is used to count backwards for the GFX
m_skid_time = t;
m_skid_time = stk_config->time2Ticks(t);
if(bonus_time>0)
{
m_kart->getKartGFX()
@ -525,10 +527,10 @@ void Skidding::update(int ticks, bool is_on_ground,
} // case
case SKID_SHOW_GFX_LEFT:
case SKID_SHOW_GFX_RIGHT:
m_skid_time -= dt;
if(m_skid_time<=0)
if (m_skid_time > 0)
m_skid_time -= ticks;
if (m_skid_time == 0)
{
m_skid_time = 0;
m_kart->getKartGFX()
->setCreationRateAbsolute(KartGFX::KGFX_SKIDL, 0);
m_kart->getKartGFX()
@ -538,7 +540,7 @@ void Skidding::update(int ticks, bool is_on_ground,
}
} // switch
m_real_steering = updateSteering(steering, dt);
m_real_steering = updateSteering(steering, ticks);
} // update
// ----------------------------------------------------------------------------
@ -560,7 +562,8 @@ unsigned int Skidding::getSkidBonus(float *bonus_time,
*bonus_force = 0;
for (unsigned int i = 0; i < kp->getSkidBonusSpeed().size(); i++)
{
if (m_skid_time <= kp->getSkidTimeTillBonus()[i])
if (stk_config->ticks2Time(m_skid_time) <=
kp->getSkidTimeTillBonus()[i])
return i;
*bonus_speed = kp->getSkidBonusSpeed()[i];
*bonus_time = kp->getSkidBonusTime()[i];

View File

@ -37,6 +37,7 @@ class ShowCurve;
class Skidding
{
friend class KartRewinder;
public:
LEAK_CHECK();
private:
@ -56,7 +57,7 @@ private:
/** Keeps track on how long a kart has been skidding, in order to
* trigger the skidding bonus. */
float m_skid_time;
uint16_t m_skid_time;
/** True if the kart has skidded long enough to get a skid bonus if it
* stopped skidding now. */
@ -99,7 +100,7 @@ private:
unsigned int getSkidBonus(float *bonus_time, float *bonus_speed,
float *bonus_force) const;
float updateSteering(float steer, float dt);
float updateSteering(float steer, int ticks);
public:
Skidding(Kart *kart);
~Skidding();