diff --git a/src/main/java/electroblob/wizardry/client/model/ModelBookshelf.java b/src/main/java/electroblob/wizardry/client/model/ModelBookshelf.java index 8a7d7e1c..5bd3aa7e 100644 --- a/src/main/java/electroblob/wizardry/client/model/ModelBookshelf.java +++ b/src/main/java/electroblob/wizardry/client/model/ModelBookshelf.java @@ -13,17 +13,17 @@ import net.minecraftforge.client.model.IModel; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.common.model.IModelState; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; import java.util.function.Function; public class ModelBookshelf implements IModel { - private static final ResourceLocation DEFAULT_BOOK_TEXTURE = new ResourceLocation(Wizardry.MODID, "blocks/books"); + //private static final ResourceLocation DEFAULT_BOOK_TEXTURE = new ResourceLocation(Wizardry.MODID, "blocks/books"); private static final List bookModelLocations = new ArrayList<>(); + private static final Map bakedBookModels = new HashMap<>(); + private final ModelResourceLocation bookshelfModelLocation; private final String variant; @@ -49,19 +49,7 @@ public class ModelBookshelf implements IModel { // I don't know why default state works here (surely it ought to be the state param?), but it works so who cares IBakedModel bookshelf = bookshelfModel.bake(bookshelfModel.getDefaultState(), format, bakedTextureGetter); - ImmutableList textures = BlockBookshelf.getBookTextures(); - - IBakedModel[][] books = new IBakedModel[textures.size()][BlockBookshelf.SLOT_COUNT]; - - for(int i = 0; i < textures.size(); i++){ - - ImmutableMap retexturer = ImmutableMap.of("books", textures.get(i).toString()); - - for(int j = 0; j < BlockBookshelf.SLOT_COUNT; j++){ - IModel bookModel = ModelLoaderRegistry.getModel(new ModelResourceLocation(bookModelLocations.get(j), variant)).retexture(retexturer); - books[i][j] = bookModel.bake(bookModel.getDefaultState(), format, bakedTextureGetter); // Same here! - } - } + IBakedModel[][] books = getBakedBookModels(format, bakedTextureGetter); // To clarify: the whole point of doing this was to avoid having to bake 4 * 2^12 models per bookshelf type // Therefore we have to have a baked bookshelf model that's kind of dynamic @@ -74,6 +62,29 @@ public class ModelBookshelf implements IModel { } + /** Retrieves the baked book models, or bakes them if they haven't been created yet. */ + protected IBakedModel[][] getBakedBookModels(VertexFormat format, Function bakedTextureGetter) throws Exception{ + + if(bakedBookModels.get(variant) == null){ + + ImmutableList textures = BlockBookshelf.getBookTextures(); + + bakedBookModels.put(variant, new IBakedModel[textures.size()][BlockBookshelf.SLOT_COUNT]); + + for(int i = 0; i < textures.size(); i++){ + + ImmutableMap retexturer = ImmutableMap.of("books", textures.get(i).toString()); + + for(int j = 0; j < BlockBookshelf.SLOT_COUNT; j++){ + IModel bookModel = ModelLoaderRegistry.getModel(new ModelResourceLocation(bookModelLocations.get(j), variant)).retexture(retexturer); + bakedBookModels.get(variant)[i][j] = bookModel.bake(bookModel.getDefaultState(), format, bakedTextureGetter); // Same here! + } + } + } + + return bakedBookModels.get(variant); + } + @Override public Collection getDependencies(){ return bookModelLocations;