As the `touched` cell layer uses Boolean values, Array.IndexOf is able to use a fast vectorised search. Most values in the array are false, so the search is able to significantly improve the performance of finding the next true value in the array.
69 lines
1.5 KiB
C#
69 lines
1.5 KiB
C#
#region Copyright & License Information
|
|
/*
|
|
* Copyright (c) The OpenRA Developers and Contributors
|
|
* This file is part of OpenRA, which is free software. It is made
|
|
* available to you under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation, either version 3 of
|
|
* the License, or (at your option) any later version. For more
|
|
* information, see COPYING.
|
|
*/
|
|
#endregion
|
|
|
|
using System;
|
|
using OpenRA.Primitives;
|
|
|
|
namespace OpenRA
|
|
{
|
|
public sealed class ProjectedCellLayer<T> : CellLayerBase<T>
|
|
{
|
|
public int MaxIndex => Size.Width * Size.Height;
|
|
|
|
public ProjectedCellLayer(Map map)
|
|
: base(map) { }
|
|
|
|
public ProjectedCellLayer(MapGridType gridType, Size size)
|
|
: base(gridType, size) { }
|
|
|
|
// Resolve an array index from map coordinates.
|
|
public int Index(PPos uv)
|
|
{
|
|
return uv.V * Size.Width + uv.U;
|
|
}
|
|
|
|
public PPos PPosFromIndex(int index)
|
|
{
|
|
return new PPos(index % Size.Width, index / Size.Width);
|
|
}
|
|
|
|
public T this[int index]
|
|
{
|
|
get => Entries[index];
|
|
|
|
set => Entries[index] = value;
|
|
}
|
|
|
|
/// <summary>Gets or sets the layer contents using projected map coordinates.</summary>
|
|
public T this[PPos uv]
|
|
{
|
|
get => Entries[Index(uv)];
|
|
|
|
set => Entries[Index(uv)] = value;
|
|
}
|
|
|
|
public bool Contains(PPos uv)
|
|
{
|
|
return Bounds.Contains(uv.U, uv.V);
|
|
}
|
|
|
|
public int IndexOf(T value, int startIndex)
|
|
{
|
|
return Array.IndexOf(Entries, value, startIndex);
|
|
}
|
|
|
|
public void SetAll(T value)
|
|
{
|
|
Array.Fill(Entries, value);
|
|
}
|
|
}
|
|
}
|