Don't recreate unbakedmodels
This commit is contained in:
parent
a981cd28c2
commit
657c597e87
@ -16,7 +16,6 @@ Template blocks can be placed in the world, then right-clicked with a full-size
|
||||
|
||||
## Todo
|
||||
|
||||
* Evaluate whether I need to keep the `Supplier` in TemplatesModelProvider, or whether I can reuse my `UnbakedModel`s indefinitely
|
||||
* `templates:block/slope_base` needs a suspicious amount of custom rotations. Maybe the model is pointing the wrong way.
|
||||
* `uvlock` in a blockstate will not work for `RetexturedMeshTemplateUnbakedModel`s. Can it be fixed?
|
||||
* Upside-down slopes would be nice...
|
||||
|
@ -56,12 +56,12 @@ public class TemplatesClient implements ClientModInitializer {
|
||||
|
||||
BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), Templates.SLOPE, Templates.SLAB);
|
||||
|
||||
provider.addTemplateModel(Templates.id("slope_special"), () -> new RetexturedMeshUnbakedModel(Templates.id("block/slope_base"), SlopeBaseMesh::make));
|
||||
provider.addTemplateModel(Templates.id("slope_special"), new RetexturedMeshUnbakedModel(Templates.id("block/slope_base"), SlopeBaseMesh::make));
|
||||
provider.assignItemModel(Templates.id("slope_special"), Templates.SLOPE);
|
||||
|
||||
provider.addTemplateModel(Templates.id("cube_special"), () -> new RetexturedJsonModelUnbakedModel(Templates.id("block/cube")));
|
||||
provider.addTemplateModel(Templates.id("slab_bottom_special"), () -> new RetexturedJsonModelUnbakedModel(Templates.id("block/slab_bottom")));
|
||||
provider.addTemplateModel(Templates.id("slab_top_special"), () -> new RetexturedJsonModelUnbakedModel(Templates.id("block/slab_top")));
|
||||
provider.addTemplateModel(Templates.id("cube_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/cube")));
|
||||
provider.addTemplateModel(Templates.id("slab_bottom_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/slab_bottom")));
|
||||
provider.addTemplateModel(Templates.id("slab_top_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/slab_top")));
|
||||
provider.assignItemModel(Templates.id("slab_bottom_special"), Templates.SLAB);
|
||||
}
|
||||
}
|
||||
|
@ -18,32 +18,18 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class TemplatesModelProvider implements ModelResourceProvider, ModelVariantProvider {
|
||||
private final Map<Identifier, Supplier<UnbakedModel>> factories = new HashMap<>();
|
||||
private final Map<Identifier, UnbakedModel> models = new HashMap<>();
|
||||
private final Map<ModelIdentifier, Identifier> itemAssignments = new HashMap<>();
|
||||
|
||||
private final Map<Identifier, UnbakedModel> cache = new HashMap<>();
|
||||
private volatile TemplateAppearanceManager appearanceManager;
|
||||
|
||||
/// model loading
|
||||
/// fabric model provider api
|
||||
|
||||
@Override
|
||||
public @Nullable UnbakedModel loadModelResource(Identifier resourceId, ModelProviderContext context) throws ModelProviderException {
|
||||
UnbakedModel cacheResult = cache.get(resourceId);
|
||||
if(cacheResult != null) return cacheResult;
|
||||
|
||||
//Either we have a factory for this model (just haven't cached its output yet),
|
||||
Supplier<UnbakedModel> factory = factories.get(resourceId);
|
||||
if(factory != null) {
|
||||
UnbakedModel freshModel = factory.get();
|
||||
cache.put(resourceId, freshModel);
|
||||
return freshModel;
|
||||
}
|
||||
|
||||
//or we don't cover this model at all.
|
||||
return null;
|
||||
public @Nullable UnbakedModel loadModelResource(Identifier resourceId, ModelProviderContext context) {
|
||||
return models.get(resourceId);
|
||||
}
|
||||
|
||||
//For blocks, you can point the game directly at the custom model in the blockstate json file.
|
||||
@ -51,19 +37,19 @@ public class TemplatesModelProvider implements ModelResourceProvider, ModelVaria
|
||||
//You *would* be able to create a model json for it and set the "parent" field to the custom model,
|
||||
//but json models are never allowed to have non-json models as a parent, and template unbaked models are not json models. Ah well.
|
||||
//So, instead, we use a ModelVariantProvider to clunkily redirect the item:id#inventory model to the blockmodel.
|
||||
//Not my favorite solution (for one, it precludes setting custom rotations in the item model) but we'll live.
|
||||
//Not my favorite solution but we'll live.
|
||||
@Override
|
||||
public @Nullable UnbakedModel loadModelVariant(ModelIdentifier modelId, ModelProviderContext context) throws ModelProviderException {
|
||||
public @Nullable UnbakedModel loadModelVariant(ModelIdentifier modelId, ModelProviderContext context) {
|
||||
Identifier customModelId = itemAssignments.get(modelId);
|
||||
return customModelId == null ? null : loadModelResource(customModelId, context);
|
||||
}
|
||||
|
||||
/// template appearance manager cache, & other cache stuff
|
||||
/// template appearance manager cache
|
||||
|
||||
public TemplateAppearanceManager getOrCreateTemplateApperanceManager(Function<SpriteIdentifier, Sprite> spriteLookup) {
|
||||
//This is kind of needlessly fancy using the volatile "double checked locking" pattern.
|
||||
//I'd like all the template models to use the same TemplateApperanceManager, despite the model
|
||||
//making process happening concurrently on several threads.
|
||||
//This is kind of needlessly fancy using the "volatile double checked locking" pattern.
|
||||
//I'd like all template models to use the same TemplateApperanceManager, despite the model
|
||||
//baking process happening concurrently on several threads.
|
||||
|
||||
//Volatile field read:
|
||||
TemplateAppearanceManager read = appearanceManager;
|
||||
@ -85,14 +71,13 @@ public class TemplatesModelProvider implements ModelResourceProvider, ModelVaria
|
||||
}
|
||||
|
||||
public void dumpCache() {
|
||||
cache.clear();
|
||||
appearanceManager = null;
|
||||
}
|
||||
|
||||
/// "public api"
|
||||
|
||||
public void addTemplateModel(Identifier id, Supplier<UnbakedModel> modelFactory) {
|
||||
factories.put(id, modelFactory);
|
||||
public void addTemplateModel(Identifier id, UnbakedModel modelFactory) {
|
||||
models.put(id, modelFactory);
|
||||
}
|
||||
|
||||
public void assignItemModel(Identifier templateModelId, ModelIdentifier... modelIds) {
|
||||
|
Loading…
Reference in New Issue
Block a user