using Microsoft.Xna.Framework;
using MLEM.Maths;
using MonoGame.Extended;
using MlemRectangleF = MLEM.Maths.RectangleF;
using ExtRectangleF = MonoGame.Extended.RectangleF;
namespace MLEM.Extended.Maths {
///
/// A set of extension methods that convert MLEM types to MonoGame.Extended types and vice versa.
///
public static class NumberExtensions {
///
/// Converts a MLEM to a MonoGame.Extended .
///
/// The rectangle to convert
/// The converted rectangle
public static ExtRectangleF ToExtended(this MlemRectangleF rect) {
return new ExtRectangleF(rect.X, rect.Y, rect.Width, rect.Height);
}
///
/// Converts a MonoGame.Extended to a MLEM .
///
/// The rectangle to convert
/// The converted rectangle
public static MlemRectangleF ToMlem(this ExtRectangleF rect) {
return new MlemRectangleF(rect.X, rect.Y, rect.Width, rect.Height);
}
///
/// Calculates the amount that the rectangle is penetrating the rectangle by.
/// If a penetration on both axes is occuring, the one with the lower value is returned.
/// This is useful for collision detection, as it can be used to push colliding objects out of each other.
///
/// The rectangle to do the penetration
/// The rectangle that should be penetrated
/// The direction that the penetration occured in
/// The amount that the penetration occured by, in the direction of
/// Whether or not a penetration occured
public static bool Penetrate(this ExtRectangleF rect, ExtRectangleF other, out Vector2 normal, out float penetration) {
return rect.ToMlem().Penetrate(other.ToMlem(), out normal, out penetration);
}
///
/// Returns how far between the given 's and value the given is, as a number between 0 and 1.
/// Note that, if the is outside the given , a correct proportional value outside the 0 to 1 range will still be returned.
/// This method is the reverse action of .
///
/// The range to query.
/// The value to query.
/// The percentage.
public static float GetPercentage(this Range range, float value) {
return (value - range.Min) / (range.Max - range.Min);
}
///
/// Returns how far between the given 's and value the given is, as a number between 0 and 1.
/// Note that, if the is outside the given , a correct proportional value outside the 0 to 1 range will still be returned.
/// This method is the reverse action of .
///
/// The range to query.
/// The value to query.
/// The percentage.
public static float GetPercentage(this Range range, float value) {
return (value - range.Min) / (range.Max - range.Min);
}
///
/// Returns a value within the given 's and values based on the given into the range.
/// Note that, if the is outside the 0 to 1 range, a correct value outside the will still be returned.
/// This method is the reverse action of .
///
/// The range to query.
/// The percentage to query.
/// The value.
public static float FromPercentage(this Range range, float percentage) {
return (range.Max - range.Min) * percentage + range.Min;
}
///
/// Returns a value within the given 's and values based on the given into the range.
/// Note that, if the is outside the 0 to 1 range, a correct value outside the will still be returned.
/// This method is the reverse action of .
///
/// The range to query.
/// The percentage to query.
/// The value.
public static float FromPercentage(this Range range, float percentage) {
return (range.Max - range.Min) * percentage + range.Min;
}
}
}