public static List <TexturedMesh> MultiCombineTextures(List <TexturedMesh> Texturedmeshes) { List <TexturedMesh> output = new List <TexturedMesh>(); int maxwidth = 2048; int maxheight = 2048; List <TextureBlock> TextureBlocks = new List <TextureBlock>(); // add meshes to textureblocks foreach (TexturedMesh item in Texturedmeshes) { bool placed = false; foreach (TextureBlock tb in TextureBlocks) { if (tb.Texturename == item.TextureName) { tb.meshes.Add(item.mesh); placed = true; } } if (placed == false) { TextureBlocks.Add(new TextureBlock(item)); } } //sort textures by decreasing height TextureBlocks = SortTextures(TextureBlocks); // add textures to shelfs List <Shelf> shelfs = new List <Shelf>(); shelfs.Add(new Shelf(maxwidth)); bool blockplaced = false; foreach (TextureBlock texblock in TextureBlocks) { foreach (Shelf shelf in shelfs) { blockplaced = false; blockplaced = shelf.AddTexture(texblock); } if (blockplaced == false) { Shelf shelf = new Shelf(maxwidth); shelf.AddTexture(texblock); shelfs.Add(shelf); } } // combine shelfs into stacks of maxheight bool finished = false; List <Shelf> combinedShelfs; List <int> shelfids; while (finished == false) { combinedShelfs = new List <Shelf>(); shelfids = new List <int>(); int totalheight = 0; for (int i = 0; i < shelfs.Count; i++) { if (totalheight + shelfs[i].height < maxheight) { combinedShelfs.Add(shelfs[i]); shelfids.Add(i); totalheight += shelfs[i].height; } } shelfids.Reverse(); foreach (int item in shelfids) { shelfs.RemoveAt(item); } output.Add(createTexturedMesh(combinedShelfs)); if (shelfs.Count == 0) { finished = true; } } return(output); }
public static TexturedMesh CombineMeshes(List <TexturedMesh> Texturedmeshes) { double totalArea = 0; double widest = 0; double highest = 0; foreach (TexturedMesh item in Texturedmeshes) { totalArea += item.texture.width * item.texture.height; if (item.texture.width > widest) { widest = item.texture.width; } if (item.texture.height > highest) { highest = item.texture.height; } } int size = GetMinimumSize(totalArea, widest, highest); if (size == (int)totalArea) { Debug.Log("afbeeldingen te groot"); return(null); } List <TextureBlock> TextureBlocks = new List <TextureBlock>(); // add meshes to textureblocks foreach (TexturedMesh item in Texturedmeshes) { bool placed = false; foreach (TextureBlock tb in TextureBlocks) { if (tb.Texturename == item.TextureName) { tb.meshes.Add(item.mesh); placed = true; } } if (placed == false) { TextureBlocks.Add(new TextureBlock(item)); } } TextureBlocks = SortTextures(TextureBlocks); List <Shelf> shelfs = new List <Shelf>(); shelfs.Add(new Shelf(size)); bool blockplaced = false; foreach (TextureBlock texblock in TextureBlocks) { foreach (Shelf shelf in shelfs) { blockplaced = false; blockplaced = shelf.AddTexture(texblock); } if (blockplaced == false) { Shelf shelf = new Shelf(size); shelf.AddTexture(texblock); shelfs.Add(shelf); } } int totalheight = 0; foreach (Shelf shelf in shelfs) { totalheight += shelf.height; } Texture2D TotaalTexture = new Texture2D(size, totalheight); int baseheight = 0; List <CombineInstance> submeshes = new List <CombineInstance>(); //create the combined texture foreach (Shelf shelf in shelfs) { Color[] shelfpixels = shelf.ShelfTexture.GetPixels(0, 0, size, shelf.height, 0); TotaalTexture.SetPixels(0, baseheight, size, shelf.height, shelfpixels, 0); TotaalTexture.Apply(true); shelf.baseheight = baseheight; baseheight += shelf.height; } foreach (Shelf shelf in shelfs) { List <CombineInstance> shelfmeshes = shelf.ReturnMeshes(baseheight); foreach (CombineInstance item in shelfmeshes) { submeshes.Add(item); } } TexturedMesh output = new TexturedMesh(); Mesh totalMesh = new Mesh(); totalMesh.CombineMeshes(submeshes.ToArray(), true, false); foreach (var meshHolder in submeshes) { Destroy(meshHolder.mesh); } output.mesh = totalMesh; output.texture = TotaalTexture; return(output); }