package net.minecraft.client.renderer.special; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.blockentity.BedRenderer; import net.minecraft.client.resources.model.Material; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemDisplayContext; @Environment(EnvType.CLIENT) public class BedSpecialRenderer implements NoDataSpecialModelRenderer { private final BedRenderer bedRenderer; private final Material material; public BedSpecialRenderer(BedRenderer bedRenderer, Material material) { this.bedRenderer = bedRenderer; this.material = material; } @Override public void render( ItemDisplayContext displayContext, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay, boolean hasFoilType ) { this.bedRenderer.renderInHand(poseStack, bufferSource, packedLight, packedOverlay, this.material); } @Environment(EnvType.CLIENT) public record Unbaked(ResourceLocation texture) implements net.minecraft.client.renderer.special.SpecialModelRenderer.Unbaked { public static final MapCodec MAP_CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group(ResourceLocation.CODEC.fieldOf("texture").forGetter(BedSpecialRenderer.Unbaked::texture)) .apply(instance, BedSpecialRenderer.Unbaked::new) ); public Unbaked(DyeColor color) { this(Sheets.colorToResourceMaterial(color)); } @Override public MapCodec type() { return MAP_CODEC; } @Override public SpecialModelRenderer bake(EntityModelSet modelSet) { return new BedSpecialRenderer(new BedRenderer(modelSet), Sheets.BED_MAPPER.apply(this.texture)); } } }