Atlas是一個(gè)工具類身辨,為完成貼圖的圖集打包提供幫助;
其中變量有一個(gè)Texture2D盗誊,表示將多個(gè)貼圖合并在一起后的圖集赵哲,將要合并的貼圖放進(jìn)這個(gè)圖集的順序是從圖集的左到右丛忆,下到上。于是表示像素是否被占用的0,1矩陣也是從左下角Matrix[size-1][0]開(kāi)始被占用的;
變量
private int[,] Matrix : 像素矩陣,已經(jīng)使用了的像素格設(shè)為1谈况,否則為0
private List<Rect> AvaliableRects : 可用的矩形,x递胧,y是矩陣原點(diǎn)所在的行和列碑韵,當(dāng)圖集是空的時(shí)候,其AvaliableRects中應(yīng)該只有一項(xiàng)缎脾,值為{size - 1, 0, size, size}
public Dictionary<Texture2D, Rect> UsedRects : 已經(jīng)使用了的矩形祝闻,與使用這個(gè)矩形的貼圖一一對(duì)應(yīng)
public Dictionary<Texture2D, Rect> UniformedUsedRects : 歸一化的已存圖片矩形,用于uv映射
private Texture2D AtlasTexture : 這個(gè)圖集的texture
private int TextureSize : 這個(gè)圖集的texture的尺寸
public Shader ShaderType : 這個(gè)圖集的shader
public List<int> TexturesNames : 打包在這個(gè)圖集中的所有貼圖的名字的鏈表遗菠,用來(lái)作為判斷圖集相等的依據(jù)
函數(shù)
public Atlas(int size, Shader shadertype) : 構(gòu)造函數(shù)治筒,用size和shadertype構(gòu)造一個(gè)新的空白圖集屉栓,將變量初始化
int RectComparor(Rect t1, Rect t2) : 比較兩個(gè)矩形的函數(shù)舷蒲,在給AvaliableRects排序時(shí)使用耸袜,使得優(yōu)先選擇左邊的和下面的可用矩形
public bool AddTexture(Texture2D TextureToAdd) : 為這個(gè)Atlas類添加一個(gè)貼圖TextureToAdd,根據(jù)是否成功返回true或false牲平;
??算法:將AvaliableRects進(jìn)行排序后對(duì)其進(jìn)行遍歷堤框,若遍歷到一個(gè)可以放下要添加的貼圖的矩形(TextureToAdd.width <= rect.width && TextureToAdd.height <= rect.height),則執(zhí)行添加貼圖操作(清空可用矩陣纵柿,填充像素矩陣蜈抓,添加已用矩陣,為圖集復(fù)制像素昂儒,重新計(jì)算可用矩陣)并返回true沟使;若遍歷到尾都沒(méi)找到可用放下這個(gè)貼圖的矩形則返回false
public Texture2D GetTexture() : 將TexturesNames排序并返回這個(gè)圖集的texture
public Dictionary<Texture2D, Rect> GetUniformedRects() : 將已用矩陣歸一化結(jié)果存在UniformedUsedRects中并返回
bool IsOrigin(int x, int y) : 檢查像素坐標(biāo)x,y是否可以作為一個(gè)矩形的原點(diǎn)渊跋,若像素矩陣中x腊嗡,y的自身,上拾酝,右燕少,右上像素都為0,則返回true蒿囤,否則返回false
void ReCalculateAvaliableRects() : 根據(jù)像素矩陣和已用矩陣客们,重新計(jì)算可用的矩陣
??算法:遍歷每個(gè)已經(jīng)使用了的矩形 rect{
?????從左到右遍歷rect.x - height所在的行,看是否滿足原點(diǎn)條件材诽,若滿足底挫,則從原點(diǎn)起往右遍歷找到其寬,從原點(diǎn)起往上遍歷找到其高脸侥,將原點(diǎn)建邓,寬,高這一矩形添加到可用的矩形中湿痢;
?????從下往上遍歷rect.y + width所在的列涝缝,看是否滿足原點(diǎn)條件,若滿足譬重,則從原點(diǎn)起往右遍歷找到其寬拒逮,從原點(diǎn)起往上遍歷找到其高,將原點(diǎn)臀规,寬滩援,高這一矩形添加到可用的矩形中;
??}