private void FilterSelfSubAreas(List <IntegerRectangle> areas) { for (int i = areas.Count - 1; i >= 0; i--) { IntegerRectangle filtered = areas[i]; for (int j = areas.Count - 1; j >= 0; j--) { if (i != j) { IntegerRectangle area = areas[j]; if (filtered.x >= area.x && filtered.y >= area.y && filtered.right <= area.right && filtered.top <= area.top) { filtered.Dispose(); IntegerRectangle topOfStack = areas.Pop(); if (i < areas.Count) { // Move the one on the top to the freed position areas[i] = topOfStack; } break; } } } } }
private IntegerRectangle InsertArea(int width, int height, out int index) { IntegerRectangle result = null; IntegerRectangle freeArea = null; DynamicAtlasPage page = null; for (int i = 0; i < m_PageList.Count; i++) { int fIndex = m_PageList[i].GetFreeAreaIndex(width, height, m_Padding); if (fIndex >= 0) { page = m_PageList[i]; freeArea = page.freeAreasList[fIndex]; break; } } if (freeArea == null) { Log.Error("No Free Area----Create New Page"); page = CreateNewPage(); freeArea = page.freeAreasList[0]; } result = IntegerRectangle.Create(freeArea.x, freeArea.y, width, height); GenerateNewFreeAreas(result, page); page.RemoveFreeArea(freeArea); index = page.index; return(result); }
private void GenerateNewFreeAreas(IntegerRectangle target, DynamicAtlasPage page) { int x = target.x; int y = target.y; int right = target.right + 1 + m_Padding; int top = target.top + 1 + m_Padding; IntegerRectangle targetWithPadding = null; if (m_Padding == 0) { targetWithPadding = target; } for (int i = page.freeAreasList.Count - 1; i >= 0; i--) { IntegerRectangle area = page.freeAreasList[i]; if (!(x >= area.right || right <= area.x || y >= area.top || top <= area.y)) { if (targetWithPadding == null) { targetWithPadding = IntegerRectangle.Create(target.x, target.y, target.width + m_Padding, target.height + m_Padding); } GenerateDividedAreas(targetWithPadding, area, m_WaitAddNewAreaList); IntegerRectangle topOfStack = page.freeAreasList.Pop(); if (i < page.freeAreasList.Count) { // Move the one on the top to the freed position page.freeAreasList[i] = topOfStack; } } } if (targetWithPadding != null && targetWithPadding != target) { targetWithPadding.Dispose(); } FilterSelfSubAreas(m_WaitAddNewAreaList); while (m_WaitAddNewAreaList.Count > 0) { var free = m_WaitAddNewAreaList.Pop(); page.AddFreeArea(free); } // if (target.right > m_PackedWidth) // m_PackedWidth = target.right; // if (target.top > m_PackedHeight) // m_PackedHeight = target.top; }
private void GenerateDividedAreas(IntegerRectangle divider, IntegerRectangle area, List <IntegerRectangle> results) { int count = 0; int rightDelta = area.right - divider.right; if (rightDelta > 0) { results.Add(IntegerRectangle.Create(divider.right, area.y, rightDelta, area.height)); count++; } int leftDelta = divider.x - area.x; if (leftDelta > 0) { results.Add(IntegerRectangle.Create(area.x, area.y, leftDelta, area.height)); count++; } int bottomDelta = area.top - divider.top; if (bottomDelta > 0) { results.Add(IntegerRectangle.Create(area.x, divider.top, area.width, bottomDelta)); count++; } int topDelta = divider.y - area.y; if (topDelta > 0) { results.Add(IntegerRectangle.Create(area.x, area.y, area.width, topDelta)); count++; } if (count == 0 && (divider.width < area.width || divider.height < area.height)) { // Only touching the area, store the area itself results.Add(area); } else { area.Dispose(); } }
private void OnRenderTexture(string name, Texture2D texture2D) { if (texture2D == null) { for (int i = m_GetTextureTaskList.Count - 1; i >= 0; i--) { GetTextureData task = m_GetTextureTaskList[i]; task.Dispose(); m_GetTextureTaskList.RemoveAt(i); } return; } int index = 0; IntegerRectangle useArea = InsertArea(texture2D.width, texture2D.height, out index); // Log.Info(name + ":texture2D:" + texture2D.width+" "+texture2D.height); if (useArea == null) { Log.Error("No Area"); return; } Rect uv = new Rect((useArea.x), (useArea.y), texture2D.width, texture2D.height); m_PageList[index].AddTexture(useArea.x, useArea.y, texture2D); SaveTextureData saveTextureData = SaveTextureData.Create(); saveTextureData.texIndex = index; saveTextureData.rect = uv; m_UsingTexture[name] = saveTextureData; for (int i = m_GetTextureTaskList.Count - 1; i >= 0; i--) { GetTextureData task = m_GetTextureTaskList[i]; if (task.name.Equals(name)) { m_UsingTexture[name].referenceCount++; } task.Dispose(); m_GetTextureTaskList.RemoveAt(i); } }
public static DynamicAtlasPage OnCreate(int index, int width, int height, Color32[] tempColor) { var res = MonoPool.Instance.Fetch(typeof(DynamicAtlasPage)) as DynamicAtlasPage; if (res.m_Width != width || res.m_Height == height) { res.SetData(width, height); } if (tempColor != null) { res.m_Texture.SetPixels32(0, 0, width, height, tempColor); res.m_Texture.Apply(false); } res.m_Texture.name = string.Format("DynamicAtlas-{0}*{1}-{2}", width, height, index); res.m_Index = index; var area = IntegerRectangle.Create(0, 0, res.m_Width, res.m_Height); res.m_FreeAreasList.Add(area); return(res); }