Atlas是一个工具类,为完成贴图的图集打包提供帮助;
其中变量有一个Texture2D,表示将多个贴图合并在一起后的图集,将要合并的贴图放进这个图集的顺序是从图集的左到右,下到上。于是表示像素是否被占用的0,1矩阵也是从左下角Matrix[size-1][0]开始被占用的;
变量
private int[,] Matrix : 像素矩阵,已经使用了的像素格设为1,否则为0
private List<Rect> AvaliableRects : 可用的矩形,x,y是矩阵原点所在的行和列,当图集是空的时候,其AvaliableRects中应该只有一项,值为{size - 1, 0, size, size}
public Dictionary<Texture2D, Rect> UsedRects : 已经使用了的矩形,与使用这个矩形的贴图一一对应
public Dictionary<Texture2D, Rect> UniformedUsedRects : 归一化的已存图片矩形,用于uv映射
private Texture2D AtlasTexture : 这个图集的texture
private int TextureSize : 这个图集的texture的尺寸
public Shader ShaderType : 这个图集的shader
public List<int> TexturesNames : 打包在这个图集中的所有贴图的名字的链表,用来作为判断图集相等的依据
函数
public Atlas(int size, Shader shadertype) : 构造函数,用size和shadertype构造一个新的空白图集,将变量初始化
int RectComparor(Rect t1, Rect t2) : 比较两个矩形的函数,在给AvaliableRects排序时使用,使得优先选择左边的和下面的可用矩形
public bool AddTexture(Texture2D TextureToAdd) : 为这个Atlas类添加一个贴图TextureToAdd,根据是否成功返回true或false;
算法:将AvaliableRects进行排序后对其进行遍历,若遍历到一个可以放下要添加的贴图的矩形(TextureToAdd.width <= rect.width && TextureToAdd.height <= rect.height),则执行添加贴图操作(清空可用矩阵,填充像素矩阵,添加已用矩阵,为图集复制像素,重新计算可用矩阵)并返回true;若遍历到尾都没找到可用放下这个贴图的矩形则返回false
public Texture2D GetTexture() : 将TexturesNames排序并返回这个图集的texture
public Dictionary<Texture2D, Rect> GetUniformedRects() : 将已用矩阵归一化结果存在UniformedUsedRects中并返回
bool IsOrigin(int x, int y) : 检查像素坐标x,y是否可以作为一个矩形的原点,若像素矩阵中x,y的自身,上,右,右上像素都为0,则返回true,否则返回false
void ReCalculateAvaliableRects() : 根据像素矩阵和已用矩阵,重新计算可用的矩阵
算法:遍历每个已经使用了的矩形 rect{
从左到右遍历rect.x - height所在的行,看是否满足原点条件,若满足,则从原点起往右遍历找到其宽,从原点起往上遍历找到其高,将原点,宽,高这一矩形添加到可用的矩形中;
从下往上遍历rect.y + width所在的列,看是否满足原点条件,若满足,则从原点起往右遍历找到其宽,从原点起往上遍历找到其高,将原点,宽,高这一矩形添加到可用的矩形中;
}