// Returns one of the layout's rectangles. TextureLayoutRectangle& TextureLayout::GetRectangle(int index) { ROCKET_ASSERT(index >= 0); ROCKET_ASSERT(index < GetNumRectangles()); return rectangles[index]; }
void TextureLayout::WriteCacheFile(FILE* f) { int sr = GetNumRectangles(); fwrite(&sr, sizeof(sr), 1, f); for (int i = 0; i < sr; ++i) { auto& rect = GetRectangle(i); TextureLayoutRectangleCache rectc; rectc.dimensions_x = rect.GetDimensions().x; rectc.dimensions_y = rect.GetDimensions().y; rectc.id = rect.GetId(); rectc.texture_index = rect.GetTextureIndex(); rectc.texture_position_x = rect.GetPosition().x; rectc.texture_position_y = rect.GetPosition().y; rectc.texture_stride = rect.GetTextureStride(); fwrite(&rectc, sizeof(TextureLayoutRectangleCache), 1, f); } int sl = GetNumTextures(); fwrite(&sl, sizeof(sl), 1, f); for (int i = 0; i < sl; ++i) { GetTexture(i).WriteCacheFile(f, &rectangles[0]); } }
// Attempts to generate an efficient texture layout for the rectangles. bool TextureLayout::GenerateLayout(int max_texture_dimensions) { // Sort the rectangles by height. std::sort(rectangles.begin(), rectangles.end(), RectangleSort()); int num_placed_rectangles = 0; while (num_placed_rectangles != GetNumRectangles()) { TextureLayoutTexture texture; int texture_size = texture.Generate(*this, max_texture_dimensions); if (texture_size == 0) return false; textures.push_back(texture); num_placed_rectangles += texture_size; } return true; }