private void WorldCollision(float elapsedSeconds)
{
for (var i = 0; i < ParticleCount; ++i)
{
var newPos = Particles[i] + Velocities[i]*elapsedSeconds;
if (!_physics.IsEmpty(newPos))
{
var res = _physics.Raycast(Particles[i], newPos);
if (!res.HasHit)
{
Velocities[i] = new Vector2((float) _rng.NextDouble()*2 - 1, (float) _rng.NextDouble()*2 - 1);
var newPos2 = Particles[i] + Velocities[i] * elapsedSeconds;
var res2 = _physics.Raycast(Particles[i], newPos2);
if (!_physics.IsEmpty(newPos2) || res2.HasHit)
{
Velocities[i] = Vector2.Zero;
}
continue;
}
res.Entity?.PhysicsBody.ApplyForce(Velocities[i]*200f);
Velocities[i] = (Velocities[i] - (Vector2.Dot(Velocities[i], res.Normal)) * res.Normal * 2) * 0.5f;
}
}
}