Fix dynamic resources losing nested model loads sometimes

This commit is contained in:
embeddedt 2023-07-05 12:04:10 -04:00
parent c73cb8115e
commit 0a2601257c
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
2 changed files with 13 additions and 4 deletions

View File

@ -348,6 +348,8 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
return model;
}
private int mfix$nestedLoads = 0;
/**
* @author embeddedt
* @reason synchronize
@ -372,6 +374,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
while(!this.loadingStack.isEmpty()) {
ResourceLocation resourcelocation = this.loadingStack.iterator().next();
mfix$nestedLoads++;
try {
existing = this.unbakedCache.get(resourcelocation);
if (existing == null) {
@ -389,6 +392,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
this.unbakedCache.put(resourcelocation, iunbakedmodel);
smallLoadingCache.put(resourcelocation, iunbakedmodel);
} finally {
mfix$nestedLoads--;
this.loadingStack.remove(resourcelocation);
}
}
@ -398,7 +402,8 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
// the model immediately
UnbakedModel result = smallLoadingCache.getOrDefault(modelLocation, iunbakedmodel);
// We are done with loading, so clear this cache to allow GC of any unneeded models
smallLoadingCache.clear();
if(mfix$nestedLoads == 0)
smallLoadingCache.clear();
cir.setReturnValue(result);
}
}
@ -464,7 +469,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
if (iunbakedmodel instanceof BlockModel) {
BlockModel blockmodel = (BlockModel)iunbakedmodel;
if (blockmodel.getRootModel() == GENERATION_MARKER) {
ibakedmodel = ITEM_MODEL_GENERATOR.generateBlockModel(textureGetter, blockmodel).bake((ModelBakery)(Object)this, blockmodel, this.atlasSet::getSprite, arg2, arg, false);
ibakedmodel = ITEM_MODEL_GENERATOR.generateBlockModel(textureGetter, blockmodel).bake((ModelBakery)(Object)this, blockmodel, textureGetter, arg2, arg, false);
}
}
if(ibakedmodel == null) {

View File

@ -233,6 +233,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
smallLoadingCache.put(location, model);
}
private int mfix$nestedLoads = 0;
/**
* @author embeddedt
@ -258,6 +259,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
while(!this.loadingStack.isEmpty()) {
ResourceLocation resourcelocation = this.loadingStack.iterator().next();
mfix$nestedLoads++;
try {
existing = this.unbakedCache.get(resourcelocation);
if (existing == null) {
@ -275,6 +277,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
this.unbakedCache.put(resourcelocation, iunbakedmodel);
smallLoadingCache.put(resourcelocation, iunbakedmodel);
} finally {
mfix$nestedLoads--;
this.loadingStack.remove(resourcelocation);
}
}
@ -284,7 +287,8 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
// the model immediately
UnbakedModel result = smallLoadingCache.getOrDefault(modelLocation, iunbakedmodel);
// We are done with loading, so clear this cache to allow GC of any unneeded models
smallLoadingCache.clear();
if(mfix$nestedLoads == 0)
smallLoadingCache.clear();
cir.setReturnValue(result);
}
}
@ -337,7 +341,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
if (iunbakedmodel instanceof BlockModel) {
BlockModel blockmodel = (BlockModel)iunbakedmodel;
if (blockmodel.getRootModel() == GENERATION_MARKER) {
ibakedmodel = ITEM_MODEL_GENERATOR.generateBlockModel(textureGetter, blockmodel).bake((ModelBakery)(Object)this, blockmodel, this.atlasSet::getSprite, arg2, arg, false);
ibakedmodel = ITEM_MODEL_GENERATOR.generateBlockModel(textureGetter, blockmodel).bake((ModelBakery)(Object)this, blockmodel, textureGetter, arg2, arg, false);
}
}
if(ibakedmodel == null) {