|
|
|
public static class GodotExtensions
|
|
|
|
{
|
|
|
|
public static T GetParentOrThrow<T>(this Node node)
|
|
|
|
where T : class
|
|
|
|
{
|
|
|
|
var parent = node.GetParent();
|
|
|
|
if (parent == null) throw new InvalidOperationException($"Parent of {node} is null");
|
|
|
|
if (parent is not T result) throw new InvalidCastException($"Parent of {node} is {node.GetType()}, not {typeof(T)}");
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static T GetNodeOrThrow<T>(this Node parent, NodePath path)
|
|
|
|
where T : class
|
|
|
|
{
|
|
|
|
var node = parent.GetNodeOrNull(path);
|
|
|
|
if (node == null) throw new InvalidOperationException($"Could not find node {path} from {parent}");
|
|
|
|
if (node is not T result) throw new InvalidCastException($"Node {path} from {parent} is {node.GetType()}, not {typeof(T)}");
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static (Corner, Corner) GetCorners(this Side side)
|
|
|
|
=> side switch {
|
|
|
|
Side.Left => (Corner.BottomLeft , Corner.TopLeft ),
|
|
|
|
Side.Top => (Corner.TopLeft , Corner.TopRight ),
|
|
|
|
Side.Right => (Corner.TopRight , Corner.BottomRight),
|
|
|
|
Side.Bottom => (Corner.BottomRight, Corner.BottomLeft ),
|
|
|
|
_ => throw new ArgumentException($"Invalid Side value '{side}'", nameof(side)),
|
|
|
|
};
|
|
|
|
|
|
|
|
public static Side GetOpposite(this Side side)
|
|
|
|
=> side switch {
|
|
|
|
Side.Left => Side.Right,
|
|
|
|
Side.Top => Side.Bottom,
|
|
|
|
Side.Right => Side.Left,
|
|
|
|
Side.Bottom => Side.Top,
|
|
|
|
_ => throw new ArgumentException($"Invalid Side value '{side}'", nameof(side)),
|
|
|
|
};
|
|
|
|
|
|
|
|
public static Corner GetOpposite(this Corner corner)
|
|
|
|
=> corner switch {
|
|
|
|
Corner.TopLeft => Corner.BottomRight,
|
|
|
|
Corner.TopRight => Corner.BottomLeft,
|
|
|
|
Corner.BottomRight => Corner.TopLeft,
|
|
|
|
Corner.BottomLeft => Corner.TopRight,
|
|
|
|
_ => throw new ArgumentException($"Invalid Corner value '{corner}'", nameof(corner)),
|
|
|
|
};
|
|
|
|
}
|