Rewrite missing model emulation functionality for 1.20+ dynres implementation
Fixes #308
This commit is contained in:
parent
7be382a3ce
commit
2e9166c7df
|
|
@ -0,0 +1,8 @@
|
|||
package org.embeddedt.modernfix.duck;
|
||||
|
||||
public interface IExtendedModelBaker {
|
||||
/**
|
||||
* Causes the ModelBaker to throw when it finds a missing model instead of proceeding with the bake.
|
||||
*/
|
||||
void throwOnMissingModel();
|
||||
}
|
||||
|
|
@ -13,7 +13,5 @@ import net.minecraft.world.level.block.state.StateDefinition;
|
|||
public interface IExtendedModelBakery {
|
||||
ImmutableList<BlockState> getBlockStatesForMRL(StateDefinition<Block, BlockState> stateDefinition, ModelResourceLocation location);
|
||||
BakedModel bakeDefault(ResourceLocation modelLocation, ModelState state);
|
||||
BakedModel getBakedMissingModel();
|
||||
void setBakedMissingModel(BakedModel m);
|
||||
UnbakedModel mfix$getUnbakedMissingModel();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
package org.embeddedt.modernfix.dynamicresources;
|
||||
|
||||
public class ModelMissingException extends RuntimeException {
|
||||
|
||||
}
|
||||
|
|
@ -10,8 +10,10 @@ import net.minecraft.world.level.block.state.BlockState;
|
|||
import org.embeddedt.modernfix.ModernFix;
|
||||
import org.embeddedt.modernfix.ModernFixClient;
|
||||
import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration;
|
||||
import org.embeddedt.modernfix.duck.IExtendedModelBaker;
|
||||
import org.embeddedt.modernfix.duck.IExtendedModelBakery;
|
||||
import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider;
|
||||
import org.embeddedt.modernfix.dynamicresources.ModelMissingException;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
|
|
@ -27,7 +29,7 @@ import java.util.Optional;
|
|||
import java.util.function.Function;
|
||||
|
||||
@Mixin(value = ModelBakery.ModelBakerImpl.class, priority = 600)
|
||||
public abstract class ModelBakerImplMixin {
|
||||
public abstract class ModelBakerImplMixin implements IExtendedModelBaker {
|
||||
private static final boolean debugDynamicModelLoading = Boolean.getBoolean("modernfix.debugDynamicModelLoading");
|
||||
@Shadow @Final private ModelBakery field_40571;
|
||||
|
||||
|
|
@ -52,17 +54,17 @@ public abstract class ModelBakerImplMixin {
|
|||
}
|
||||
}
|
||||
|
||||
private void createBakedMissingModelIfNeeded(IExtendedModelBakery extendedBakery, UnbakedModel iunbakedmodel, ModelState arg2, ResourceLocation arg) {
|
||||
if(extendedBakery.getBakedMissingModel() == null) {
|
||||
extendedBakery.setBakedMissingModel(iunbakedmodel.bake((ModelBaker)this, this.modelTextureGetter, arg2, arg));
|
||||
((DynamicBakedModelProvider)this.field_40571.getBakedTopLevelModels()).setMissingModel(extendedBakery.getBakedMissingModel());
|
||||
}
|
||||
}
|
||||
|
||||
private ResourceLocation capturedLocation;
|
||||
private UnbakedModel capturedModel;
|
||||
private ModelState capturedState;
|
||||
|
||||
private boolean throwIfMissing;
|
||||
|
||||
@Override
|
||||
public void throwOnMissingModel() {
|
||||
throwIfMissing = true;
|
||||
}
|
||||
|
||||
@Inject(method = "bake", at = @At("HEAD"))
|
||||
private void captureState(ResourceLocation rl, ModelState state, CallbackInfoReturnable<BakedModel> cir) {
|
||||
capturedState = state;
|
||||
|
|
@ -111,8 +113,12 @@ public abstract class ModelBakerImplMixin {
|
|||
cir.getReturnValue().resolveParents(this.field_40571::getModel);
|
||||
capturedModel = cir.getReturnValue();
|
||||
if(cir.getReturnValue() == extendedBakery.mfix$getUnbakedMissingModel()) {
|
||||
if(arg != ModelBakery.MISSING_MODEL_LOCATION && debugDynamicModelLoading)
|
||||
ModernFix.LOGGER.warn("Model {} not present", arg);
|
||||
if(arg != ModelBakery.MISSING_MODEL_LOCATION) {
|
||||
if(debugDynamicModelLoading)
|
||||
ModernFix.LOGGER.warn("Model {} not present", arg);
|
||||
if(throwIfMissing)
|
||||
throw new ModelMissingException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import org.embeddedt.modernfix.ModernFix;
|
|||
import org.embeddedt.modernfix.ModernFixClient;
|
||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||
import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration;
|
||||
import org.embeddedt.modernfix.duck.IExtendedModelBaker;
|
||||
import org.embeddedt.modernfix.duck.IExtendedModelBakery;
|
||||
import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider;
|
||||
import org.embeddedt.modernfix.dynamicresources.ModelBakeryHelpers;
|
||||
|
|
@ -309,6 +310,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
|
|||
return m;
|
||||
ModelBakery self = (ModelBakery) (Object) this;
|
||||
ModelBaker theBaker = self.new ModelBakerImpl(textureGetter, modelLocation);
|
||||
((IExtendedModelBaker)theBaker).throwOnMissingModel();
|
||||
synchronized(this) { m = theBaker.bake(modelLocation, state); }
|
||||
if(m != null)
|
||||
loadedBakedModels.put(key, m);
|
||||
|
|
@ -320,16 +322,6 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
|
|||
return loadOnlyRelevantBlockState(stateDefinition, location);
|
||||
}
|
||||
|
||||
private BakedModel bakedMissingModel = null;
|
||||
|
||||
public void setBakedMissingModel(BakedModel m) {
|
||||
bakedMissingModel = m;
|
||||
}
|
||||
|
||||
public BakedModel getBakedMissingModel() {
|
||||
return bakedMissingModel;
|
||||
}
|
||||
|
||||
public UnbakedModel mfix$getUnbakedMissingModel() {
|
||||
return missingModel;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ import net.minecraft.resources.ResourceLocation;
|
|||
import org.embeddedt.modernfix.ModernFix;
|
||||
import org.embeddedt.modernfix.ModernFixClient;
|
||||
import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration;
|
||||
import org.embeddedt.modernfix.duck.IExtendedModelBaker;
|
||||
import org.embeddedt.modernfix.duck.IExtendedModelBakery;
|
||||
import org.embeddedt.modernfix.dynamicresources.ModelMissingException;
|
||||
import org.embeddedt.modernfix.forge.dynresources.IModelBakerImpl;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
|
|
@ -19,7 +21,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|||
import java.util.function.Function;
|
||||
|
||||
@Mixin(value = ModelBakery.ModelBakerImpl.class, priority = 600)
|
||||
public abstract class ModelBakerImplMixin implements IModelBakerImpl {
|
||||
public abstract class ModelBakerImplMixin implements IModelBakerImpl, IExtendedModelBaker {
|
||||
private static final boolean debugDynamicModelLoading = Boolean.getBoolean("modernfix.debugDynamicModelLoading");
|
||||
@Shadow @Final private ModelBakery field_40571;
|
||||
|
||||
|
|
@ -36,6 +38,13 @@ public abstract class ModelBakerImplMixin implements IModelBakerImpl {
|
|||
private UnbakedModel capturedModel;
|
||||
private ModelState capturedState;
|
||||
|
||||
private boolean throwIfMissing;
|
||||
|
||||
@Override
|
||||
public void throwOnMissingModel() {
|
||||
throwIfMissing = true;
|
||||
}
|
||||
|
||||
@Inject(method = "bake(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/resources/model/ModelState;Ljava/util/function/Function;)Lnet/minecraft/client/resources/model/BakedModel;", at = @At("HEAD"), remap = false)
|
||||
private void captureState(ResourceLocation arg, ModelState state, Function<Material, TextureAtlasSprite> sprites, CallbackInfoReturnable<BakedModel> cir) {
|
||||
capturedState = state;
|
||||
|
|
@ -71,8 +80,12 @@ public abstract class ModelBakerImplMixin implements IModelBakerImpl {
|
|||
cir.getReturnValue().resolveParents(this.field_40571::getModel);
|
||||
capturedModel = cir.getReturnValue();
|
||||
if(cir.getReturnValue() == extendedBakery.mfix$getUnbakedMissingModel()) {
|
||||
if(arg != ModelBakery.MISSING_MODEL_LOCATION && debugDynamicModelLoading)
|
||||
ModernFix.LOGGER.warn("Model {} not present", arg);
|
||||
if(arg != ModelBakery.MISSING_MODEL_LOCATION) {
|
||||
if(debugDynamicModelLoading)
|
||||
ModernFix.LOGGER.warn("Model {} not present", arg);
|
||||
if(throwIfMissing)
|
||||
throw new ModelMissingException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import net.minecraft.world.level.block.state.properties.Property;
|
|||
import org.embeddedt.modernfix.ModernFix;
|
||||
import org.embeddedt.modernfix.ModernFixClient;
|
||||
import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration;
|
||||
import org.embeddedt.modernfix.duck.IExtendedModelBaker;
|
||||
import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider;
|
||||
import org.embeddedt.modernfix.duck.IExtendedModelBakery;
|
||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||
|
|
@ -315,6 +316,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
|
|||
return m;
|
||||
ModelBakery self = (ModelBakery) (Object) this;
|
||||
ModelBaker theBaker = self.new ModelBakerImpl(textureGetter, modelLocation);
|
||||
((IExtendedModelBaker)theBaker).throwOnMissingModel();
|
||||
synchronized(this) { m = theBaker.bake(modelLocation, state, theBaker.getModelTextureGetter()); }
|
||||
if(m != null)
|
||||
loadedBakedModels.put(key, m);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user