mathe/Library/PackageCache/com.unity.render-pipelines.core@14.0.8/Runtime/Utilities/TileLayoutUtils.cs
2024-09-20 20:30:10 +02:00

149 lines
4.9 KiB
C#

namespace UnityEngine.Rendering
{
/// <summary>Utility for tiles layout</summary>
public static class TileLayoutUtils
{
/// <summary>Try decompose the givent rect into tiles given the parameter</summary>
/// <param name="src">The rect to split</param>
/// <param name="tileSize">The size of the tiles</param>
/// <param name="main">Computed main area</param>
/// <param name="topRow">Computed top row area</param>
/// <param name="rightCol">Computed right column area</param>
/// <param name="topRight">Computed top right corner area</param>
/// <returns>If true, the tiles decomposition is a success</returns>
public static bool TryLayoutByTiles(
RectInt src,
uint tileSize,
out RectInt main,
out RectInt topRow,
out RectInt rightCol,
out RectInt topRight)
{
if (src.width < tileSize || src.height < tileSize)
{
main = new RectInt(0, 0, 0, 0);
topRow = new RectInt(0, 0, 0, 0);
rightCol = new RectInt(0, 0, 0, 0);
topRight = new RectInt(0, 0, 0, 0);
return false;
}
int mainRows = src.height / (int)tileSize;
int mainCols = src.width / (int)tileSize;
int mainWidth = mainCols * (int)tileSize;
int mainHeight = mainRows * (int)tileSize;
main = new RectInt
{
x = src.x,
y = src.y,
width = mainWidth,
height = mainHeight,
};
topRow = new RectInt
{
x = src.x,
y = src.y + mainHeight,
width = mainWidth,
height = src.height - mainHeight
};
rightCol = new RectInt
{
x = src.x + mainWidth,
y = src.y,
width = src.width - mainWidth,
height = mainHeight
};
topRight = new RectInt
{
x = src.x + mainWidth,
y = src.y + mainHeight,
width = src.width - mainWidth,
height = src.height - mainHeight
};
return true;
}
/// <summary>Try decompose the givent rect into rows given the parameter</summary>
/// <param name="src">The rect to split</param>
/// <param name="tileSize">The size of the tiles</param>
/// <param name="main">Computed main area</param>
/// <param name="other">Computed other area</param>
/// <returns>If true, the tiles decomposition is a success</returns>
public static bool TryLayoutByRow(
RectInt src,
uint tileSize,
out RectInt main,
out RectInt other)
{
if (src.height < tileSize)
{
main = new RectInt(0, 0, 0, 0);
other = new RectInt(0, 0, 0, 0);
return false;
}
int mainRows = src.height / (int)tileSize;
int mainHeight = mainRows * (int)tileSize;
main = new RectInt
{
x = src.x,
y = src.y,
width = src.width,
height = mainHeight,
};
other = new RectInt
{
x = src.x,
y = src.y + mainHeight,
width = src.width,
height = src.height - mainHeight
};
return true;
}
/// <summary>Try decompose the givent rect into columns given the parameter</summary>
/// <param name="src">The rect to split</param>
/// <param name="tileSize">The size of the tiles</param>
/// <param name="main">Computed main area</param>
/// <param name="other">Computed other area</param>
/// <returns>If true, the tiles decomposition is a success</returns>
public static bool TryLayoutByCol(
RectInt src,
uint tileSize,
out RectInt main,
out RectInt other)
{
if (src.width < tileSize)
{
main = new RectInt(0, 0, 0, 0);
other = new RectInt(0, 0, 0, 0);
return false;
}
int mainCols = src.width / (int)tileSize;
int mainWidth = mainCols * (int)tileSize;
main = new RectInt
{
x = src.x,
y = src.y,
width = mainWidth,
height = src.height,
};
other = new RectInt
{
x = src.x + mainWidth,
y = src.y,
width = src.width - mainWidth,
height = src.height
};
return true;
}
}
}