package io.github.cottonmc.templates.model; import io.github.cottonmc.templates.TemplatesClient; import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.Baker; import net.minecraft.client.render.model.ModelBakeSettings; import net.minecraft.client.render.model.UnbakedModel; import net.minecraft.client.texture.Sprite; import net.minecraft.client.util.SpriteIdentifier; import net.minecraft.util.Identifier; import java.util.Collection; import java.util.Collections; import java.util.function.Function; import java.util.function.Supplier; public class RetexturedMeshUnbakedModel implements UnbakedModel { public RetexturedMeshUnbakedModel(Identifier parent, Supplier baseMeshFactory) { this(parent, __ -> baseMeshFactory.get()); } public RetexturedMeshUnbakedModel(Identifier parent, Function, Mesh> baseMeshFactory) { this.parent = parent; this.baseMeshFactory = baseMeshFactory; } protected final Identifier parent; protected final Function, Mesh> baseMeshFactory; @Override public Collection getModelDependencies() { return Collections.singletonList(parent); } @Override public void setParents(Function function) { function.apply(parent).setParents(function); } @Override public BakedModel bake(Baker baker, Function spriteLookup, ModelBakeSettings modelBakeSettings, Identifier identifier) { Mesh transformedBaseMesh = MeshTransformUtil.pretransformMesh(baseMeshFactory.apply(spriteLookup), MeshTransformUtil.applyAffine(modelBakeSettings)); return new RetexturingBakedModel( baker.bake(parent, modelBakeSettings), TemplatesClient.provider.getOrCreateTemplateApperanceManager(spriteLookup), modelBakeSettings, Blocks.AIR.getDefaultState() ) { @Override protected Mesh getBaseMesh(BlockState state) { return transformedBaseMesh; } }; } }