public void CalculateGravity(float mass, Vector3 position, bool allowNormalGravity, float gravityModifier,
ref Vector3 forceVector)
{
if (NormalGravityEnabled && allowNormalGravity)
{
//normal gravity, one axis, no center
forceVector.X += gravityx*mass*gravityModifier;
forceVector.Y += gravityy*mass*gravityModifier;
forceVector.Z += gravityz*mass*gravityModifier;
}
if (PointGravityInUse)
{
//Find the nearby centers of gravity
foreach (PointGravity pg in m_pointGravityPositions.Values)
{
float distance = Vector3.DistanceSquared(pg.Position, position);
if (distance < pg.Radius*pg.Radius)
{
float d = (distance/(pg.Radius*pg.Radius));
float radiusScaling = 1 - d;
radiusScaling *= radiusScaling;
if (pg.PointForce)
{
//Applies forces to the actor when in range
forceVector.X += pg.ForceX*radiusScaling*mass*gravityModifier;
forceVector.Y += pg.ForceY*radiusScaling*mass*gravityModifier;
forceVector.Z += pg.ForceZ*radiusScaling*mass*gravityModifier;
}
else
{
//Pulls the actor toward the point
forceVector.X += (pg.Position.X - position.X)*pg.GravForce*radiusScaling*mass*
gravityModifier;
forceVector.Y += (pg.Position.Y - position.Y)*pg.GravForce*radiusScaling*mass*
gravityModifier;
forceVector.Z += (pg.Position.Z - position.Z)*pg.GravForce*radiusScaling*mass*
gravityModifier;
/*if (forceVector.Z < 50 && forceVector.Z > 0)
forceVector.Z = 0;
else if (forceVector.Z > -50 && forceVector.Z < 0)
forceVector.Z = 0;*/
}
}
}
}
}