public override void AffectParticles( ParticleSystem system, float timeElapsed )
{
// precalculate distance of plane from origin
float planeDistance = -_planeNormal.Dot( _planePoint ) / Utility.Sqrt( _planeNormal.Dot( _planeNormal ) );
Vector3 directionPart;
foreach ( Particle pi in system.Particles )
{
Vector3 direction = pi.Direction * timeElapsed;
if ( _planeNormal.Dot( pi.Position + direction ) + planeDistance <= 0.0f )
{
float a = _planeNormal.Dot( pi.Position ) + planeDistance;
if ( a > 0.0 )
{
// for intersection point
directionPart = direction * ( -a / direction.Dot( _planeNormal ) );
// set new position
pi.Position = ( pi.Position + ( directionPart ) ) + ( ( ( directionPart ) - direction ) * _bounce );
// reflect direction vector
pi.Direction = ( pi.Direction - ( 2.0f * pi.Direction.Dot( _planeNormal ) * _planeNormal ) ) * _bounce;
}
}
}
}