mirror of
https://github.com/MineLittlePony/MineLittlePony.git
synced 2025-02-18 02:24:22 +01:00
Rewrote the villager texture cache. It won't attempt to verify textures every time one is retrieved now. That should improve performance.
This commit is contained in:
parent
0ac62558f4
commit
8afe1ab07c
5 changed files with 129 additions and 46 deletions
|
@ -2,7 +2,9 @@ package com.minelittlepony.render.ponies;
|
||||||
|
|
||||||
import com.minelittlepony.model.PMAPI;
|
import com.minelittlepony.model.PMAPI;
|
||||||
import com.minelittlepony.render.RenderPonyMob;
|
import com.minelittlepony.render.RenderPonyMob;
|
||||||
|
import com.minelittlepony.util.render.FormattedTextureSupplier;
|
||||||
import com.minelittlepony.util.render.ITextureSupplier;
|
import com.minelittlepony.util.render.ITextureSupplier;
|
||||||
|
import com.minelittlepony.util.render.IntStringMapper;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
import net.minecraft.client.renderer.entity.RenderManager;
|
import net.minecraft.client.renderer.entity.RenderManager;
|
||||||
|
@ -11,17 +13,18 @@ import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
public class RenderPonyVillager extends RenderPonyMob<EntityVillager> {
|
public class RenderPonyVillager extends RenderPonyMob<EntityVillager> {
|
||||||
|
|
||||||
private static final ITextureSupplier<Integer> PROFESSIONS = new VillagerProfessionTextureCache(
|
/**
|
||||||
"textures/entity/villager/%d_pony.png",
|
* Key mapping from a villager profession id to a human readable name
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/villager/farmer_pony.png"),
|
*/
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/villager/librarian_pony.png"),
|
public static final IntStringMapper MAPPER = new IntStringMapper("farmer", "librarian", "priest", "smith", "butcher", "villager");
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/villager/priest_pony.png"),
|
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/villager/smith_pony.png"),
|
private static final ITextureSupplier<String> FORMATTER = new FormattedTextureSupplier("minelittlepony", "textures/entity/villager/%s_pony.png");
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/villager/butcher_pony.png"),
|
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/villager/villager_pony.png")
|
private static final ResourceLocation DEFAULT = FORMATTER.supplyTexture("villager");
|
||||||
);
|
private static final ResourceLocation EGG = FORMATTER.supplyTexture("silly");
|
||||||
private static final ResourceLocation EGG = new ResourceLocation("minelittlepony", "textures/entity/villager/silly_pony.png");
|
private static final ResourceLocation EGG_2 = FORMATTER.supplyTexture("tiny_silly");
|
||||||
private static final ResourceLocation EGG_2 = new ResourceLocation("minelittlepony", "textures/entity/villager/tiny_silly_pony.png");
|
|
||||||
|
private static final ITextureSupplier<Integer> PROFESSIONS = new VillagerProfessionTextureCache(FORMATTER, MAPPER, DEFAULT);
|
||||||
|
|
||||||
public RenderPonyVillager(RenderManager manager) {
|
public RenderPonyVillager(RenderManager manager) {
|
||||||
super(manager, PMAPI.villager);
|
super(manager, PMAPI.villager);
|
||||||
|
@ -30,7 +33,7 @@ public class RenderPonyVillager extends RenderPonyMob<EntityVillager> {
|
||||||
@Override
|
@Override
|
||||||
public void preRenderCallback(EntityVillager villager, float ticks) {
|
public void preRenderCallback(EntityVillager villager, float ticks) {
|
||||||
super.preRenderCallback(villager, ticks);
|
super.preRenderCallback(villager, ticks);
|
||||||
GlStateManager.scale(0.9375F, 0.9375F, 0.9375F);
|
GlStateManager.scale(BASE_MODEL_SCALE, BASE_MODEL_SCALE, BASE_MODEL_SCALE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,7 +2,9 @@ package com.minelittlepony.render.ponies;
|
||||||
|
|
||||||
import com.minelittlepony.model.PMAPI;
|
import com.minelittlepony.model.PMAPI;
|
||||||
import com.minelittlepony.render.RenderPonyMob;
|
import com.minelittlepony.render.RenderPonyMob;
|
||||||
|
import com.minelittlepony.util.render.FormattedTextureSupplier;
|
||||||
import com.minelittlepony.util.render.ITextureSupplier;
|
import com.minelittlepony.util.render.ITextureSupplier;
|
||||||
|
import com.minelittlepony.util.render.IntStringMapper;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.entity.RenderManager;
|
import net.minecraft.client.renderer.entity.RenderManager;
|
||||||
import net.minecraft.entity.monster.EntityZombieVillager;
|
import net.minecraft.entity.monster.EntityZombieVillager;
|
||||||
|
@ -10,17 +12,19 @@ import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
public class RenderPonyZombieVillager extends RenderPonyMob<EntityZombieVillager> {
|
public class RenderPonyZombieVillager extends RenderPonyMob<EntityZombieVillager> {
|
||||||
|
|
||||||
private static final ITextureSupplier<Integer> PROFESSIONS = new VillagerProfessionTextureCache(
|
/**
|
||||||
"textures/entity/zombie_villager/zombie_%d_pony.png",
|
* Ditto.
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/zombie_villager/zombie_farmer_pony.png"),
|
* @see RenderPonyVillager.MAPPER
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/zombie_villager/zombie_librarian_pony.png"),
|
*/
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/zombie_villager/zombie_priest_pony.png"),
|
public static final IntStringMapper MAPPER = new IntStringMapper("farmer", "librarian", "priest", "smith", "butcher", "villager");
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/zombie_villager/zombie_smith_pony.png"),
|
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/zombie_villager/zombie_butcher_pony.png"),
|
private static final ITextureSupplier<String> FORMATTER = new FormattedTextureSupplier("minelittlepony", "textures/entity/zombie_villager/zombie_%s_pony.png");
|
||||||
new ResourceLocation("minelittlepony", "textures/entity/zombie_villager/zombie_villager_pony.png")
|
|
||||||
);
|
private static final ResourceLocation DEFAULT = FORMATTER.supplyTexture("villager");
|
||||||
private static final ResourceLocation EGG = new ResourceLocation("minelittlepony", "textures/entity/zombie_villager/zombie_silly_pony.png");
|
private static final ResourceLocation EGG = FORMATTER.supplyTexture("silly");
|
||||||
private static final ResourceLocation EGG_2 = new ResourceLocation("minelittlepony", "textures/entity/zombie_villager/zombie_tiny_silly_pony.png");
|
private static final ResourceLocation EGG_2 = FORMATTER.supplyTexture("tiny_silly");
|
||||||
|
|
||||||
|
private static final ITextureSupplier<Integer> PROFESSIONS = new VillagerProfessionTextureCache(FORMATTER, MAPPER, DEFAULT);
|
||||||
|
|
||||||
public RenderPonyZombieVillager(RenderManager manager) {
|
public RenderPonyZombieVillager(RenderManager manager) {
|
||||||
super(manager, PMAPI.zombieVillager);
|
super(manager, PMAPI.zombieVillager);
|
||||||
|
|
|
@ -3,46 +3,57 @@ package com.minelittlepony.render.ponies;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
|
import com.minelittlepony.MineLittlePony;
|
||||||
import com.minelittlepony.util.render.ITextureSupplier;
|
import com.minelittlepony.util.render.ITextureSupplier;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cached pool of villager textures.
|
||||||
|
*/
|
||||||
class VillagerProfessionTextureCache implements ITextureSupplier<Integer> {
|
class VillagerProfessionTextureCache implements ITextureSupplier<Integer> {
|
||||||
|
|
||||||
private final ResourceLocation[] pool;
|
private final ITextureSupplier<String> formatter;
|
||||||
private final String path;
|
|
||||||
|
private final Function<Integer, String> keyMapper;
|
||||||
|
|
||||||
|
private final ResourceLocation fallback;
|
||||||
|
|
||||||
private final Map<Integer, ResourceLocation> cache = new HashMap<>();
|
private final Map<Integer, ResourceLocation> cache = new HashMap<>();
|
||||||
|
|
||||||
public VillagerProfessionTextureCache(String path, ResourceLocation... pool) {
|
/**
|
||||||
this.path = path;
|
* Creates a new profession cache
|
||||||
this.pool = pool;
|
*
|
||||||
|
* @param formatter Formatter used when creating new textures
|
||||||
|
* @param keyMapper Mapper to convert integer ids into a string value for format insertion
|
||||||
|
* @param fallback The default if any generated textures fail to load. This is stored in place of failing textures.
|
||||||
|
*/
|
||||||
|
public VillagerProfessionTextureCache(ITextureSupplier<String> formatter, Function<Integer, String> keyMapper, ResourceLocation fallback) {
|
||||||
|
this.formatter = formatter;
|
||||||
|
this.fallback = fallback;
|
||||||
|
this.keyMapper = keyMapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResourceLocation supplyTexture(Integer profession) {
|
public ResourceLocation supplyTexture(Integer profession) {
|
||||||
ResourceLocation texture = getVillagerTexture(profession);
|
return cache.computeIfAbsent(profession, this::getModProfessionResource);
|
||||||
|
|
||||||
try {
|
|
||||||
Minecraft.getMinecraft().getResourceManager().getResource(texture);
|
|
||||||
} catch (IOException e) {
|
|
||||||
return pool[pool.length - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
return texture;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ResourceLocation getVillagerTexture(int profession) {
|
|
||||||
if (profession >= pool.length) {
|
|
||||||
return cache.computeIfAbsent(profession, this::getModProfessionResource);
|
|
||||||
}
|
|
||||||
|
|
||||||
return pool[profession];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResourceLocation getModProfessionResource(int professionId) {
|
private ResourceLocation getModProfessionResource(int professionId) {
|
||||||
return new ResourceLocation("minelittlepony", String.format(path, professionId));
|
ResourceLocation generated = formatter.supplyTexture(keyMapper.apply(professionId));
|
||||||
|
|
||||||
|
try {
|
||||||
|
Minecraft.getMinecraft().getResourceManager().getResource(generated);
|
||||||
|
} catch (IOException e) {
|
||||||
|
MineLittlePony.logger.error("Error loading villager texture `" + generated + "`.", e);
|
||||||
|
|
||||||
|
// if texture loading fails, use the fallback.
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
return generated;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.minelittlepony.util.render;
|
||||||
|
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Supplies new resource locations based on a pre-defined domain and formatted path.
|
||||||
|
*/
|
||||||
|
public class FormattedTextureSupplier implements ITextureSupplier<String> {
|
||||||
|
|
||||||
|
private final String domain;
|
||||||
|
private final String path;
|
||||||
|
|
||||||
|
public FormattedTextureSupplier(String domain, String path) {
|
||||||
|
this.domain = domain;
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResourceLocation supplyTexture(String key) {
|
||||||
|
return new ResourceLocation(domain, String.format(path, key));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
package com.minelittlepony.util.render;
|
||||||
|
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple mapping from an integer index to a pre-defined set of strings.
|
||||||
|
* Returns the string representation of the index if no value was found.
|
||||||
|
*/
|
||||||
|
public class IntStringMapper implements Function<Integer, String> {
|
||||||
|
|
||||||
|
private final HashMap<Integer, String> values = Maps.newHashMap();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new string mapper pre-populated with the provided values by index.
|
||||||
|
*/
|
||||||
|
public IntStringMapper(String...values) {
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
this.values.put(i, Objects.requireNonNull(values[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the values. So you can actually modify it.
|
||||||
|
* I mean, if you want to @modders...
|
||||||
|
*/
|
||||||
|
public Map<Integer, String> getValues() {
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String apply(Integer t) {
|
||||||
|
if (values.containsKey(t)) {
|
||||||
|
return values.get(t);
|
||||||
|
}
|
||||||
|
return String.valueOf(t);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue