diff options
author | Linnea Gräf <nea@nea.moe> | 2024-09-24 11:40:15 +0200 |
---|---|---|
committer | Linnea Gräf <nea@nea.moe> | 2024-09-24 11:40:15 +0200 |
commit | 420f2a61e1cc64d68bf03825e8fd70cf49ac6a01 (patch) | |
tree | 540f2beaf99bda96af3c145cbfe81faebba76bee /src/main/kotlin/events/CustomItemModelEvent.kt | |
parent | 64099bd2628490b06392766c6d1b9425f26788a3 (diff) | |
download | firmament-420f2a61e1cc64d68bf03825e8fd70cf49ac6a01.tar.gz firmament-420f2a61e1cc64d68bf03825e8fd70cf49ac6a01.tar.bz2 firmament-420f2a61e1cc64d68bf03825e8fd70cf49ac6a01.zip |
Use weak caches for custom textures
Diffstat (limited to 'src/main/kotlin/events/CustomItemModelEvent.kt')
-rw-r--r-- | src/main/kotlin/events/CustomItemModelEvent.kt | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/src/main/kotlin/events/CustomItemModelEvent.kt b/src/main/kotlin/events/CustomItemModelEvent.kt index 27524a9..e50eca4 100644 --- a/src/main/kotlin/events/CustomItemModelEvent.kt +++ b/src/main/kotlin/events/CustomItemModelEvent.kt @@ -1,24 +1,25 @@ - - package moe.nea.firmament.events -import java.util.* +import java.util.Optional +import kotlin.jvm.optionals.getOrNull import net.minecraft.client.render.model.BakedModel import net.minecraft.client.render.model.BakedModelManager import net.minecraft.client.util.ModelIdentifier import net.minecraft.item.ItemStack +import moe.nea.firmament.util.collections.WeakCache data class CustomItemModelEvent( val itemStack: ItemStack, var overrideModel: ModelIdentifier? = null, ) : FirmamentEvent() { companion object : FirmamentEventBus<CustomItemModelEvent>() { - private val cache = IdentityHashMap<ItemStack?, Any>() - private val sentinelNull = Object() - - fun clearCache() { - cache.clear() - } + val cache = + WeakCache.memoize<ItemStack, BakedModelManager, Optional<BakedModel>>("CustomItemModels") { stack, models -> + val modelId = getModelIdentifier(stack) ?: return@memoize Optional.empty() + val bakedModel = models.getModel(modelId) + if (bakedModel === models.missingModel) return@memoize Optional.empty() + Optional.of(bakedModel) + } @JvmStatic fun getModelIdentifier(itemStack: ItemStack?): ModelIdentifier? { @@ -29,15 +30,7 @@ data class CustomItemModelEvent( @JvmStatic fun getModel(itemStack: ItemStack?, thing: BakedModelManager): BakedModel? { if (itemStack == null) return null - val cachedValue = cache.getOrPut(itemStack) { - val modelId = getModelIdentifier(itemStack) ?: return@getOrPut sentinelNull - val bakedModel = thing.getModel(modelId) - if (bakedModel === thing.missingModel) return@getOrPut sentinelNull - bakedModel - } - if (cachedValue === sentinelNull) - return null - return cachedValue as BakedModel + return cache.invoke(itemStack, thing).getOrNull() } } } |