package speiger.src.coreengine.rendering.models; import java.util.List; import java.util.Map; import speiger.src.collections.objects.maps.impl.hash.Object2ObjectLinkedOpenHashMap; import speiger.src.coreengine.assets.AssetLocation; import speiger.src.coreengine.assets.AssetManager; import speiger.src.coreengine.assets.reloader.IReloadableResource; import speiger.src.coreengine.rendering.models.loader.MergedModelData; import speiger.src.coreengine.rendering.models.loader.ModelLoader; import speiger.src.coreengine.rendering.models.loader.SimpleModelData; public class ModelCache implements IReloadableResource { AssetManager manager; Map> models = new Object2ObjectLinkedOpenHashMap<>(); public void setManager(AssetManager manager) { this.manager = manager; } @Override public void reload() { models.clear(); load(); } @Override public void destroy() { models.clear(); } public void load() { for(AssetLocation model : manager.gatherAssets("models", 512, this::isValidModel)) { if(model.getLocation().endsWith(".json")) addModel(model, ModelLoader.readModelData(model, manager)); else if(model.getLocation().endsWith(".spm")) addModel(model, ModelLoader.readLegacyModelData(model, manager)); } } protected void addModel(AssetLocation location, List data) { if(data.isEmpty()) { System.out.println("["+location+"] Found Empty Model Data"); return; } models.put(location, data); } protected boolean isValidModel(String fileName) { return fileName.endsWith(".json") || fileName.endsWith(".spm"); } public SimpleModelData getModel(AssetLocation location) { List data = models.get(location); return data == null ? null : data.get(0); } public List getModels(AssetLocation location) { return models.get(location); } public MergedModelData getMergedModel(AssetLocation location) { return getMergedModel(location, "MergedModel"); } public MergedModelData getMergedModel(AssetLocation location, String newName) { List data = models.get(location); return data == null ? null : MergedModelData.merge(newName, data); } }