Water ripples from projectiles sometimes are not spawned
The issue is noticable with mods which increase proejctiles speed.
With current approach we spawn ripples only when emitter's position is near water level:
void RippleSimulation::emitRipple(const osg::Vec3f& pos)
{
if (std::abs(pos.z() - mParticleNode->getPosition().z()) < 20)
{
// Spawn ripple
...
}
}
The problem is that we use a projectile rendering node as emitter's position for water ripples:
auto* projectile = mPhysics->getProjectile(projectileState.mProjectileId);
const auto pos = projectile->getSimulationPosition();
projectileState.mNode->setPosition(pos);
if (projectile->getHitWater())
mRendering->emitWaterRipple(pos);
This position is a quite arbitrary value (especially since ProjectileManager became asynchronous), so spawn condition sometimes fail.
A suggested solution is to use an actual hit position:
const auto hitPosition = Misc::Convert::toOsg(projectile->getHitPosition());
if (projectile->getHitWater())
mRendering->emitWaterRipple(hitPosition);
Edited by Andrei Kortunov