.NET Standard Utility Structs for games
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

187 lines
4.4 KiB

using System;
using System.Numerics;
namespace MoonTools.Structs
{
public struct Position2D : IEquatable<Position2D>
{
private Vector2 remainder;
private int _x;
private int _y;
public int X
{
get
{
return _x;
}
set
{
_x = value;
remainder.X = 0;
}
}
public int Y
{
get
{
return _y;
}
set
{
_y = value;
remainder.Y = 0;
}
}
public Position2D(float X, float Y)
{
_x = Truncate(X);
_y = Truncate(Y);
remainder = new Vector2(Remainder(X), Remainder(Y));
}
public Vector2 ToVector2()
{
return new Vector2
{
X = X + remainder.X,
Y = Y + remainder.Y
};
}
public Position2D Truncated()
{
return new Position2D(X, Y);
}
public static Position2D Zero
{
get
{
return new Position2D { X = 0, Y = 0 };
}
}
public static implicit operator Vector2(Position2D positionVector)
{
return positionVector.ToVector2();
}
public static explicit operator Position2D(Vector2 vector)
{
return new Position2D(vector.X, vector.Y);
}
public static Position2D operator +(Position2D value1, Position2D value2)
{
var newRemainder = new Vector2
{
X = value1.remainder.X + value2.X + value2.remainder.X,
Y = value1.remainder.Y + value2.Y + value2.remainder.Y
};
var xAmount = Floor(newRemainder.X);
var yAmount = Floor(newRemainder.Y);
newRemainder.X -= xAmount;
newRemainder.Y -= yAmount;
return new Position2D
{
X = value1.X + xAmount,
Y = value1.Y + yAmount,
remainder = newRemainder
};
}
public static Position2D operator +(Position2D value1, Vector2 value2)
{
var newRemainder = new Vector2
{
X = value1.remainder.X + value2.X,
Y = value1.remainder.Y + value2.Y
};
var xAmount = Floor(newRemainder.X);
var yAmount = Floor(newRemainder.Y);
newRemainder.X -= xAmount;
newRemainder.Y -= yAmount;
return new Position2D
{
X = value1.X + xAmount,
Y = value1.Y + yAmount,
remainder = newRemainder
};
}
public static Vector2 operator -(Position2D value1, Position2D value2)
{
return value1.ToVector2() - value2.ToVector2();
}
public static Vector2 operator -(Position2D value1, Vector2 value2)
{
return value1.ToVector2() - value2;
}
private static int Whole(float value)
{
return (int)Math.Truncate(value);
}
private static float Remainder(float value)
{
return value - (float)Math.Truncate(value);
}
private static int Round(float value)
{
return (int)Math.Round(value, 0);
}
private static int Floor(float value)
{
return (int)Math.Floor(value);
}
private static int Truncate(float value)
{
return (int)Math.Truncate(value);
}
public override bool Equals(object other)
{
if (other is Position2D otherPosition)
{
return Equals(otherPosition);
}
return false;
}
public bool Equals(Position2D other)
{
return
X == other.X &&
Y == other.Y;
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode();
}
public static bool operator ==(Position2D a, Position2D b)
{
return a.Equals(b);
}
public static bool operator !=(Position2D a, Position2D b)
{
return !(a == b);
}
}
}