Smooth shadow and skidmarks for remote players

This commit is contained in:
Benau 2018-06-18 00:10:49 +08:00
parent 3b4353a2c9
commit c58119be87
4 changed files with 50 additions and 29 deletions

View File

@ -93,8 +93,9 @@ void Shadow::update(bool enabled)
const btWheelInfo& wi = m_kart.getVehicle()->getWheelInfo(i);
Vec3 up_vector = kart_trans.getBasis().getColumn(1);
up_vector = up_vector * (wi.m_raycastInfo.m_suspensionLength - 0.02f);
v[i].m_position =
Vec3(kart_trans(Vec3(v[i].m_position)) - up_vector).toIrrVector();
Vec3 pos = kart_trans(Vec3(v[i].m_position)) - up_vector;
m_kart.transformSmoothedPosition(&pos);
v[i].m_position = pos.toIrrVector();
v[i].m_normal = MiniGLM::compressVector3
(Vec3(wi.m_raycastInfo.m_contactNormalWS).toIrrVector());
}

View File

@ -151,10 +151,17 @@ void SkidMarks::update(float dt, bool force_skid_marks,
// but it produces good enough results
float distance = (newPoint - start).length();
m_left.back()->add(raycast_left-delta, raycast_left+delta,
m_kart.getNormal(), distance);
m_right.back()->add(raycast_right-delta, raycast_right+delta,
m_kart.getNormal(), distance);
Vec3 p1 = raycast_left - delta;
Vec3 p2 = raycast_left + delta;
Vec3 p3 = raycast_right - delta;
Vec3 p4 = raycast_right + delta;
m_kart.transformSmoothedPosition(&p1);
m_kart.transformSmoothedPosition(&p2);
m_kart.transformSmoothedPosition(&p3);
m_kart.transformSmoothedPosition(&p4);
m_left.back()->add(p1, p2, m_kart.getNormal(), distance);
m_right.back()->add(p3, p4, m_kart.getNormal(), distance);
return;
}
@ -184,15 +191,22 @@ void SkidMarks::update(float dt, bool force_skid_marks,
m_right.erase(m_right.begin());
}
Vec3 p1 = raycast_left - delta;
Vec3 p2 = raycast_left + delta;
Vec3 p3 = raycast_right - delta;
Vec3 p4 = raycast_right + delta;
m_kart.transformSmoothedPosition(&p1);
m_kart.transformSmoothedPosition(&p2);
m_kart.transformSmoothedPosition(&p3);
m_kart.transformSmoothedPosition(&p4);
m_left.emplace_back(
new SkidMarkQuads(raycast_left-delta, raycast_left+delta,
m_kart.getNormal(), m_material, m_shader,
m_avoid_z_fighting, custom_color));
new SkidMarkQuads(p1, p2, m_kart.getNormal(), m_material, m_shader,
m_avoid_z_fighting, custom_color));
m_right.emplace_back(
new SkidMarkQuads(raycast_right-delta, raycast_right+delta,
m_kart.getNormal(), m_material, m_shader,
m_avoid_z_fighting, custom_color));
new SkidMarkQuads(p3, p4, m_kart.getNormal(), m_material, m_shader,
m_avoid_z_fighting, custom_color));
m_skid_marking = true;
} // update

View File

@ -2938,23 +2938,6 @@ SFXBase* Kart::getNextEmitter()
*/
void Kart::updateGraphics(float dt)
{
static video::SColor pink(255, 255, 133, 253);
static video::SColor green(255, 61, 87, 23);
#ifndef SERVER_ONLY
// draw skidmarks if relevant (we force pink skidmarks on when hitting
// a bubblegum)
if (m_kart_properties->getSkidEnabled() && m_skidmarks)
{
m_skidmarks->update(dt,
m_bubblegum_ticks > 0,
(m_bubblegum_ticks > 0
? (m_has_caught_nolok_bubblegum ? &green
: &pink)
: NULL));
}
#endif
// Upate particle effects (creation rate, and emitter size
// depending on speed)
// --------------------------------------------------------
@ -3043,6 +3026,23 @@ void Kart::updateGraphics(float dt)
Moveable::updateGraphics(dt, center_shift,
btQuaternion(heading, 0, -m_current_lean));
static video::SColor pink(255, 255, 133, 253);
static video::SColor green(255, 61, 87, 23);
#ifndef SERVER_ONLY
// draw skidmarks if relevant (we force pink skidmarks on when hitting
// a bubblegum)
if (m_kart_properties->getSkidEnabled() && m_skidmarks)
{
m_skidmarks->update(dt,
m_bubblegum_ticks > 0,
(m_bubblegum_ticks > 0
? (m_has_caught_nolok_bubblegum ? &green
: &pink)
: NULL));
}
#endif
// m_speed*dt is the distance the kart has moved, which determines
// how much the wheels need to rotate.
m_kart_model->update(dt, m_speed*dt, getSteerPercent(), m_speed, lean_height);

View File

@ -170,6 +170,12 @@ public:
static std::string unused("unused");
return unused;
}
// ------------------------------------------------------------------------
void transformSmoothedPosition(Vec3* position) const
{
Vec3 p = m_transform.inverse()(*position);
*position = m_smoothed_transform(p);
}
}; // class Moveable