Generalized SignModel handling
This commit is contained in:
parent
a39989b331
commit
cf2e0e012d
3 changed files with 71 additions and 37 deletions
53
src/main/java/ru/bclib/client/SignModelFactory.java
Normal file
53
src/main/java/ru/bclib/client/SignModelFactory.java
Normal file
|
@ -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<WoodType> TYPES = new HashSet<>();
|
||||||
|
|
||||||
|
public final Map<WoodType, SignRenderer.SignModel> 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,10 +15,9 @@ import net.minecraft.client.gui.GuiComponent;
|
||||||
import net.minecraft.client.gui.components.Button;
|
import net.minecraft.client.gui.components.Button;
|
||||||
import net.minecraft.client.gui.font.TextFieldHelper;
|
import net.minecraft.client.gui.font.TextFieldHelper;
|
||||||
import net.minecraft.client.gui.screens.Screen;
|
import net.minecraft.client.gui.screens.Screen;
|
||||||
import net.minecraft.client.model.geom.PartNames;
|
|
||||||
import net.minecraft.client.multiplayer.ClientPacketListener;
|
import net.minecraft.client.multiplayer.ClientPacketListener;
|
||||||
import net.minecraft.client.renderer.MultiBufferSource;
|
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.client.renderer.texture.OverlayTexture;
|
||||||
import net.minecraft.network.chat.CommonComponents;
|
import net.minecraft.network.chat.CommonComponents;
|
||||||
import net.minecraft.network.chat.TextComponent;
|
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.blockentities.BaseSignBlockEntity;
|
||||||
import ru.bclib.blocks.BaseSignBlock;
|
import ru.bclib.blocks.BaseSignBlock;
|
||||||
import ru.bclib.client.render.BaseSignBlockEntityRenderer;
|
import ru.bclib.client.render.BaseSignBlockEntityRenderer;
|
||||||
|
import ru.bclib.client.SignModelFactory;
|
||||||
|
|
||||||
@Environment(EnvType.CLIENT)
|
@Environment(EnvType.CLIENT)
|
||||||
public class BlockSignEditScreen extends Screen {
|
public class BlockSignEditScreen extends Screen {
|
||||||
private final SignModel model = new SignModel();
|
|
||||||
private final BaseSignBlockEntity sign;
|
private final BaseSignBlockEntity sign;
|
||||||
private int ticksSinceOpened;
|
private int ticksSinceOpened;
|
||||||
private int currentRow;
|
private int currentRow;
|
||||||
|
@ -39,10 +38,12 @@ public class BlockSignEditScreen extends Screen {
|
||||||
private final String[] text = (String[]) Util.make(new String[4], (strings) -> {
|
private final String[] text = (String[]) Util.make(new String[4], (strings) -> {
|
||||||
Arrays.fill(strings, "");
|
Arrays.fill(strings, "");
|
||||||
});
|
});
|
||||||
|
final private SignModelFactory signModelFactory;
|
||||||
|
|
||||||
public BlockSignEditScreen(BaseSignBlockEntity sign) {
|
public BlockSignEditScreen(BaseSignBlockEntity sign) {
|
||||||
super(new TranslatableComponent("sign.edit"));
|
super(new TranslatableComponent("sign.edit"));
|
||||||
this.sign = sign;
|
this.sign = sign;
|
||||||
|
signModelFactory = new SignModelFactory(this.minecraft.getEntityModels());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void init() {
|
protected void init() {
|
||||||
|
@ -119,6 +120,7 @@ public class BlockSignEditScreen extends Screen {
|
||||||
matrices.scale(93.75F, -93.75F, 93.75F);
|
matrices.scale(93.75F, -93.75F, 93.75F);
|
||||||
matrices.translate(0.0D, -1.3125D, 0.0D);
|
matrices.translate(0.0D, -1.3125D, 0.0D);
|
||||||
BlockState blockState = this.sign.getBlockState();
|
BlockState blockState = this.sign.getBlockState();
|
||||||
|
final SignRenderer.SignModel model = signModelFactory.getSignModel(blockState);
|
||||||
boolean bl = blockState.getValue(BaseSignBlock.FLOOR);
|
boolean bl = blockState.getValue(BaseSignBlock.FLOOR);
|
||||||
|
|
||||||
if (!bl) {
|
if (!bl) {
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package ru.bclib.client.render;
|
package ru.bclib.client.render;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.mojang.blaze3d.platform.NativeImage;
|
import com.mojang.blaze3d.platform.NativeImage;
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
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.fabricmc.fabric.api.client.rendereregistry.v1.EntityModelLayerRegistry;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.Font;
|
import net.minecraft.client.gui.Font;
|
||||||
import net.minecraft.client.model.geom.ModelLayerLocation;
|
|
||||||
import net.minecraft.client.model.geom.ModelLayers;
|
import net.minecraft.client.model.geom.ModelLayers;
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
import net.minecraft.client.renderer.MultiBufferSource;
|
import net.minecraft.client.renderer.MultiBufferSource;
|
||||||
import net.minecraft.client.renderer.RenderType;
|
import net.minecraft.client.renderer.RenderType;
|
||||||
import net.minecraft.client.renderer.Sheets;
|
import net.minecraft.client.renderer.Sheets;
|
||||||
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
|
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.blockentity.SignRenderer.SignModel;
|
||||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
|
||||||
import net.minecraft.client.resources.model.Material;
|
import net.minecraft.client.resources.model.Material;
|
||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.Registry;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
@ -27,47 +24,36 @@ import net.minecraft.util.Mth;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.item.DyeColor;
|
import net.minecraft.world.item.DyeColor;
|
||||||
import net.minecraft.world.level.block.Block;
|
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.StandingSignBlock;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.block.state.properties.WoodType;
|
import net.minecraft.world.level.block.state.properties.WoodType;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
import ru.bclib.blockentities.BaseSignBlockEntity;
|
import ru.bclib.blockentities.BaseSignBlockEntity;
|
||||||
import ru.bclib.blocks.BaseSignBlock;
|
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<BaseSignBlockEntity> {
|
public class BaseSignBlockEntityRenderer implements BlockEntityRenderer<BaseSignBlockEntity> {
|
||||||
private static final HashMap<Block, RenderType> LAYERS = Maps.newHashMap();
|
private static final HashMap<Block, RenderType> LAYERS = Maps.newHashMap();
|
||||||
private static final Set<WoodType> TYPES = new HashSet<>();
|
|
||||||
private static final RenderType defaultLayer;
|
private static final RenderType defaultLayer;
|
||||||
private final Font font;
|
private final Font font;
|
||||||
private final Map<WoodType, SignModel> signModels;
|
private final SignModelFactory signModelFactory;
|
||||||
private final SignModel defaultModel;
|
|
||||||
|
|
||||||
private static final int OUTLINE_RENDER_DISTANCE = Mth.square(16);
|
private static final int OUTLINE_RENDER_DISTANCE = Mth.square(16);
|
||||||
|
|
||||||
public BaseSignBlockEntityRenderer(EntityRendererProvider.Context ctx, ModelLayerLocation signLayerLocation) {
|
public BaseSignBlockEntityRenderer(BlockEntityRendererProvider.Context ctx) {
|
||||||
super();
|
super();
|
||||||
|
this.signModelFactory = new SignModelFactory(ctx.getModelSet());
|
||||||
//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.font = ctx.getFont();
|
this.font = ctx.getFont();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void render(BaseSignBlockEntity signBlockEntity, float tickDelta, PoseStack matrixStack,
|
public void render(BaseSignBlockEntity signBlockEntity, float tickDelta, PoseStack matrixStack,
|
||||||
MultiBufferSource provider, int light, int overlay) {
|
MultiBufferSource provider, int light, int overlay) {
|
||||||
BlockState state = signBlockEntity.getBlockState();
|
BlockState state = signBlockEntity.getBlockState();
|
||||||
WoodType woodType = getSignType(state.getBlock());
|
SignModel model = signModelFactory.getSignModel(state);
|
||||||
SignRenderer.SignModel model = this.signModels.get(woodType);
|
|
||||||
|
|
||||||
matrixStack.pushPose();
|
matrixStack.pushPose();
|
||||||
|
|
||||||
|
@ -135,6 +121,8 @@ public class BaseSignBlockEntityRenderer implements BlockEntityRenderer<BaseSign
|
||||||
matrixStack.popPose();
|
matrixStack.popPose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static boolean isOutlineVisible(BaseSignBlockEntity signBlockEntity, int i) {
|
private static boolean isOutlineVisible(BaseSignBlockEntity signBlockEntity, int i) {
|
||||||
if (i == DyeColor.BLACK.getTextColor()) {
|
if (i == DyeColor.BLACK.getTextColor()) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -151,19 +139,10 @@ public class BaseSignBlockEntityRenderer implements BlockEntityRenderer<BaseSign
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static WoodType getSignType(Block block) {
|
|
||||||
WoodType signType2;
|
|
||||||
if (block instanceof SignBlock) {
|
|
||||||
signType2 = ((SignBlock) block).type();
|
|
||||||
} else {
|
|
||||||
signType2 = WoodType.OAK;
|
|
||||||
}
|
|
||||||
|
|
||||||
return signType2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Material getModelTexture(Block block) {
|
public static Material getModelTexture(Block block) {
|
||||||
return Sheets.getSignMaterial(getSignType(block));
|
return Sheets.getSignMaterial(SignModelFactory.getSignType(block));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static VertexConsumer getConsumer(MultiBufferSource provider, Block block) {
|
public static VertexConsumer getConsumer(MultiBufferSource provider, Block block) {
|
||||||
|
@ -173,7 +152,7 @@ public class BaseSignBlockEntityRenderer implements BlockEntityRenderer<BaseSign
|
||||||
public static void registerCustomModel(Block block, EntityModelLayerRegistry.TexturedModelDataProvider provider) {
|
public static void registerCustomModel(Block block, EntityModelLayerRegistry.TexturedModelDataProvider provider) {
|
||||||
ResourceLocation blockId = Registry.BLOCK.getKey(block);
|
ResourceLocation blockId = Registry.BLOCK.getKey(block);
|
||||||
SignType type = new SignType(blockId.getPath());
|
SignType type = new SignType(blockId.getPath());
|
||||||
TYPES.add(type);
|
SignModelFactory.TYPES.add(type);
|
||||||
|
|
||||||
EntityModelLayerRegistry.registerModelLayer(ModelLayers.createSignModelName(type), provider);
|
EntityModelLayerRegistry.registerModelLayer(ModelLayers.createSignModelName(type), provider);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue