diff --git a/src/main/java/ru/bclib/client/SignModelFactory.java b/src/main/java/ru/bclib/client/SignModelFactory.java new file mode 100644 index 00000000..71550d88 --- /dev/null +++ b/src/main/java/ru/bclib/client/SignModelFactory.java @@ -0,0 +1,53 @@ +package ru.bclib.client; + +import com.google.common.collect.ImmutableMap; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.blockentity.SignRenderer; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SignBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.WoodType; +import org.jetbrains.annotations.ApiStatus; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +@ApiStatus.Internal +public class SignModelFactory { + public static final Set TYPES = new HashSet<>(); + + public final Map signModels; + public final SignRenderer.SignModel defaultModel; + + public SignModelFactory(EntityModelSet ctx) { + //build a list of all new sign models. + this.signModels = (Map) TYPES.stream().collect(ImmutableMap.toImmutableMap((signType) -> { + return signType; + }, (signType) -> { + return new SignRenderer.SignModel(ctx.bakeLayer(ModelLayers.createSignModelName(signType))); + })); + + //set up a default model + defaultModel = new SignRenderer.SignModel(ctx.bakeLayer(ModelLayers.createSignModelName(WoodType.OAK))); + } + + public static WoodType getSignType(Block block) { + WoodType signType2; + if (block instanceof SignBlock) { + signType2 = ((SignBlock) block).type(); + } else { + signType2 = WoodType.OAK; + } + + return signType2; + } + + public SignRenderer.SignModel getSignModel(BlockState state) { + WoodType woodType = getSignType(state.getBlock()); + SignRenderer.SignModel model = this.signModels.get(woodType); + return model; + } +} diff --git a/src/main/java/ru/bclib/client/gui/BlockSignEditScreen.java b/src/main/java/ru/bclib/client/gui/BlockSignEditScreen.java index 9bfd66a0..daa30e44 100644 --- a/src/main/java/ru/bclib/client/gui/BlockSignEditScreen.java +++ b/src/main/java/ru/bclib/client/gui/BlockSignEditScreen.java @@ -15,10 +15,9 @@ import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.font.TextFieldHelper; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.model.geom.PartNames; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.blockentity.SignRenderer.SignModel; +import net.minecraft.client.renderer.blockentity.SignRenderer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.TextComponent; @@ -28,10 +27,10 @@ import net.minecraft.world.level.block.state.BlockState; import ru.bclib.blockentities.BaseSignBlockEntity; import ru.bclib.blocks.BaseSignBlock; import ru.bclib.client.render.BaseSignBlockEntityRenderer; +import ru.bclib.client.SignModelFactory; @Environment(EnvType.CLIENT) public class BlockSignEditScreen extends Screen { - private final SignModel model = new SignModel(); private final BaseSignBlockEntity sign; private int ticksSinceOpened; private int currentRow; @@ -39,10 +38,12 @@ public class BlockSignEditScreen extends Screen { private final String[] text = (String[]) Util.make(new String[4], (strings) -> { Arrays.fill(strings, ""); }); + final private SignModelFactory signModelFactory; public BlockSignEditScreen(BaseSignBlockEntity sign) { super(new TranslatableComponent("sign.edit")); this.sign = sign; + signModelFactory = new SignModelFactory(this.minecraft.getEntityModels()); } protected void init() { @@ -119,6 +120,7 @@ public class BlockSignEditScreen extends Screen { matrices.scale(93.75F, -93.75F, 93.75F); matrices.translate(0.0D, -1.3125D, 0.0D); BlockState blockState = this.sign.getBlockState(); + final SignRenderer.SignModel model = signModelFactory.getSignModel(blockState); boolean bl = blockState.getValue(BaseSignBlock.FLOOR); if (!bl) { diff --git a/src/main/java/ru/bclib/client/render/BaseSignBlockEntityRenderer.java b/src/main/java/ru/bclib/client/render/BaseSignBlockEntityRenderer.java index 4d06b65e..5437accc 100644 --- a/src/main/java/ru/bclib/client/render/BaseSignBlockEntityRenderer.java +++ b/src/main/java/ru/bclib/client/render/BaseSignBlockEntityRenderer.java @@ -1,6 +1,5 @@ package ru.bclib.client.render; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.vertex.PoseStack; @@ -9,16 +8,14 @@ import com.mojang.math.Vector3f; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityModelLayerRegistry; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; -import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.renderer.blockentity.SignRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.blockentity.SignRenderer.SignModel; -import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.resources.model.Material; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; @@ -27,47 +24,36 @@ import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.SignBlock; import net.minecraft.world.level.block.StandingSignBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.WoodType; import net.minecraft.world.phys.Vec3; import ru.bclib.blockentities.BaseSignBlockEntity; import ru.bclib.blocks.BaseSignBlock; +import ru.bclib.client.SignModelFactory; -import java.util.*; +import java.util.HashMap; +import java.util.List; public class BaseSignBlockEntityRenderer implements BlockEntityRenderer { private static final HashMap LAYERS = Maps.newHashMap(); - private static final Set TYPES = new HashSet<>(); private static final RenderType defaultLayer; private final Font font; - private final Map signModels; - private final SignModel defaultModel; + private final SignModelFactory signModelFactory; + private static final int OUTLINE_RENDER_DISTANCE = Mth.square(16); - public BaseSignBlockEntityRenderer(EntityRendererProvider.Context ctx, ModelLayerLocation signLayerLocation) { + public BaseSignBlockEntityRenderer(BlockEntityRendererProvider.Context ctx) { super(); - - //build a list of all new sign models. - this.signModels = (Map) TYPES.stream().collect(ImmutableMap.toImmutableMap((signType) -> { - return signType; - }, (signType) -> { - return new SignRenderer.SignModel(ctx.bakeLayer(ModelLayers.createSignModelName(signType))); - })); - - //set up a default model - defaultModel = new SignRenderer.SignModel(ctx.bakeLayer(ModelLayers.createSignModelName(WoodType.OAK))); - + this.signModelFactory = new SignModelFactory(ctx.getModelSet()); this.font = ctx.getFont(); } public void render(BaseSignBlockEntity signBlockEntity, float tickDelta, PoseStack matrixStack, MultiBufferSource provider, int light, int overlay) { BlockState state = signBlockEntity.getBlockState(); - WoodType woodType = getSignType(state.getBlock()); - SignRenderer.SignModel model = this.signModels.get(woodType); + SignModel model = signModelFactory.getSignModel(state); matrixStack.pushPose(); @@ -135,6 +121,8 @@ public class BaseSignBlockEntityRenderer implements BlockEntityRenderer