Terrain/TerrainData.cs
namespace HC3.Terrain;

#nullable enable

/// <summary>
/// A grid of tiles with a certain size that can be accessed by x and y coordinate.
/// </summary>
public partial interface ITerrainData
{
	RectInt Bounds { get; }

	TerrainTile this[Vector2Int index] { get; }

	void CopyTo( RectInt srcRange, TileArraySlice dst );
}

public static class TerrainDataExtensions
{
	public static void CopyToClamped<T>( this T data, RectInt srcRange, TileArraySlice dst )
		where T : ITerrainData
	{
		var min = Vector2Int.Max( data.Bounds.Position, srcRange.Position );
		var max = Vector2Int.Min( data.Bounds.Position + data.Bounds.Size, srcRange.Position + srcRange.Size );

		if ( max.x <= min.x || max.y <= min.y ) return;

		data.CopyTo( new RectInt( min, max - min ),
			dst.Slice( new RectInt( min - srcRange.Position, max - min ) ) );
	}
}