SimpleJavaEngine/src/main/java/speiger/src/coreengine/rendering/models/ModelCache.java

83 lines
2.2 KiB
Java

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<AssetLocation, List<SimpleModelData>> 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<SimpleModelData> 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<SimpleModelData> data = models.get(location);
return data == null ? null : data.get(0);
}
public List<SimpleModelData> getModels(AssetLocation location)
{
return models.get(location);
}
public MergedModelData getMergedModel(AssetLocation location)
{
return getMergedModel(location, "MergedModel");
}
public MergedModelData getMergedModel(AssetLocation location, String newName)
{
List<SimpleModelData> data = models.get(location);
return data == null ? null : MergedModelData.merge(newName, data);
}
}