Make sure getArmourStacks is called whenever possible

This commit is contained in:
Sollace 2024-05-04 23:50:17 +01:00
parent 4b6fdd4752
commit c4968aed4c
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
4 changed files with 64 additions and 57 deletions

View file

@ -49,7 +49,7 @@ public abstract class AbstractPonyRenderer<T extends MobEntity, M extends Entity
protected void addFeatures(EntityRendererFactory.Context context) { protected void addFeatures(EntityRendererFactory.Context context) {
addFeature(new ArmourFeature<>(this, context.getModelManager())); addFeature(new ArmourFeature<>(this, context.getModelManager()));
addFeature(createHeldItemFeature(context)); addFeature(createHeldItemFeature(context));
addFeature(new SkullFeature<>(this, context.getModelLoader())); addFeature(new SkullFeature<>(this, context.getModelLoader(), context.getItemRenderer()));
addFeature(new ElytraFeature<>(this)); addFeature(new ElytraFeature<>(this));
addFeature(new GearFeature<>(this)); addFeature(new GearFeature<>(this));
} }

View file

@ -56,7 +56,7 @@ public class PlayerPonyRenderer extends PlayerEntityRenderer implements PonyRend
addLayer(new HeldItemFeature(this, context.getHeldItemRenderer())); addLayer(new HeldItemFeature(this, context.getHeldItemRenderer()));
addLayer(new DJPon3Feature<>(this)); addLayer(new DJPon3Feature<>(this));
addLayer(new CapeFeature<>(this)); addLayer(new CapeFeature<>(this));
addLayer(new SkullFeature<>(this, context.getModelLoader())); addLayer(new SkullFeature<>(this, context.getModelLoader(), context.getItemRenderer()));
addLayer(new ElytraFeature<>(this)); addLayer(new ElytraFeature<>(this));
addLayer(new PassengerFeature<>(this, context)); addLayer(new PassengerFeature<>(this, context));
addLayer(new GearFeature<>(this)); addLayer(new GearFeature<>(this));

View file

@ -5,6 +5,7 @@ import com.minelittlepony.api.model.PonyModel;
import com.minelittlepony.api.pony.PonyPosture; import com.minelittlepony.api.pony.PonyPosture;
import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.ModelType;
import com.minelittlepony.client.model.PonyElytra; import com.minelittlepony.client.model.PonyElytra;
import com.minelittlepony.client.model.armour.ArmourLayer;
import com.minelittlepony.client.model.armour.ArmourRendererPlugin; import com.minelittlepony.client.model.armour.ArmourRendererPlugin;
import com.minelittlepony.client.render.PonyRenderContext; import com.minelittlepony.client.render.PonyRenderContext;
@ -22,39 +23,39 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
public class ElytraFeature<T extends LivingEntity, M extends EntityModel<T> & PonyModel<T>> extends AbstractPonyFeature<T, M> { public class ElytraFeature<T extends LivingEntity, M extends EntityModel<T> & PonyModel<T>> extends AbstractPonyFeature<T, M> {
private static final Identifier TEXTURE = new Identifier("textures/entity/elytra.png"); private static final Identifier TEXTURE = new Identifier("textures/entity/elytra.png");
@SuppressWarnings("unchecked") private final PonyElytra<T> model = ModelType.ELYTRA.createModel();
private final PonyElytra<T> model = (PonyElytra<T>)ModelType.ELYTRA.createModel();
public ElytraFeature(PonyRenderContext<T, M> rp) { public ElytraFeature(PonyRenderContext<T, M> context) {
super(rp); super(context);
} }
@Override @Override
public void render(MatrixStack matrices, VertexConsumerProvider provider, int light, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) { public void render(MatrixStack matrices, VertexConsumerProvider provider, int light, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) {
ItemStack stack = entity.getEquippedStack(EquipmentSlot.CHEST);
ArmourRendererPlugin plugin = ArmourRendererPlugin.INSTANCE.get(); ArmourRendererPlugin plugin = ArmourRendererPlugin.INSTANCE.get();
float alpha = plugin.getElytraAlpha(stack, model, entity);
if (alpha <= 0) { for (ItemStack stack : plugin.getArmorStacks(entity, EquipmentSlot.CHEST, ArmourLayer.OUTER)) {
return; float alpha = plugin.getElytraAlpha(stack, model, entity);
if (alpha <= 0) {
return;
}
VertexConsumer vertexConsumer = plugin.getElytraConsumer(stack, model, entity, provider, getElytraTexture(entity));
if (vertexConsumer == null) {
return;
}
matrices.push();
preRenderCallback(matrices);
getContextModel().copyStateTo(model);
model.isSneaking = PonyPosture.isCrouching(getContext().getEntityPony(entity), entity);
model.setAngles(entity, limbDistance, limbAngle, age, headYaw, headPitch);
model.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, 1, 1, 1, alpha);
matrices.pop();
} }
VertexConsumer vertexConsumer = plugin.getElytraConsumer(stack, model, entity, provider, getElytraTexture(entity));
if (vertexConsumer == null) {
return;
}
matrices.push();
preRenderCallback(matrices);
getContextModel().copyStateTo(model);
model.isSneaking = PonyPosture.isCrouching(getContext().getEntityPony(entity), entity);
model.setAngles(entity, limbDistance, limbAngle, age, headYaw, headPitch);
model.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, 1, 1, 1, alpha);
matrices.pop();
} }
protected void preRenderCallback(MatrixStack stack) { protected void preRenderCallback(MatrixStack stack) {

View file

@ -3,6 +3,8 @@ package com.minelittlepony.client.render.entity.feature;
import com.minelittlepony.api.model.BodyPart; import com.minelittlepony.api.model.BodyPart;
import com.minelittlepony.api.model.PonyModel; import com.minelittlepony.api.model.PonyModel;
import com.minelittlepony.client.model.AbstractPonyModel; import com.minelittlepony.client.model.AbstractPonyModel;
import com.minelittlepony.client.model.armour.ArmourLayer;
import com.minelittlepony.client.model.armour.ArmourRendererPlugin;
import com.minelittlepony.client.render.PonyRenderContext; import com.minelittlepony.client.render.PonyRenderContext;
import java.util.Map; import java.util.Map;
@ -10,12 +12,12 @@ import java.util.Map;
import net.minecraft.block.AbstractSkullBlock; import net.minecraft.block.AbstractSkullBlock;
import net.minecraft.block.SkullBlock; import net.minecraft.block.SkullBlock;
import net.minecraft.block.SkullBlock.SkullType; import net.minecraft.block.SkullBlock.SkullType;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.*; import net.minecraft.client.render.*;
import net.minecraft.client.render.block.entity.SkullBlockEntityModel; import net.minecraft.client.render.block.entity.SkullBlockEntityModel;
import net.minecraft.client.render.block.entity.SkullBlockEntityRenderer; import net.minecraft.client.render.block.entity.SkullBlockEntityRenderer;
import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.model.EntityModel;
import net.minecraft.client.render.entity.model.EntityModelLoader; import net.minecraft.client.render.entity.model.EntityModelLoader;
import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.render.model.json.ModelTransformationMode; import net.minecraft.client.render.model.json.ModelTransformationMode;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.component.DataComponentTypes; import net.minecraft.component.DataComponentTypes;
@ -30,66 +32,70 @@ import net.minecraft.village.VillagerDataContainer;
public class SkullFeature<T extends LivingEntity, M extends EntityModel<T> & PonyModel<T>> extends AbstractPonyFeature<T, M> { public class SkullFeature<T extends LivingEntity, M extends EntityModel<T> & PonyModel<T>> extends AbstractPonyFeature<T, M> {
private final ItemRenderer itemRenderer;
private final Map<SkullBlock.SkullType, SkullBlockEntityModel> headModels; private final Map<SkullBlock.SkullType, SkullBlockEntityModel> headModels;
public SkullFeature(PonyRenderContext<T, M> renderPony, EntityModelLoader entityModelLoader) { public SkullFeature(PonyRenderContext<T, M> renderPony, EntityModelLoader entityModelLoader, ItemRenderer itemRenderer) {
super(renderPony); super(renderPony);
headModels = SkullBlockEntityRenderer.getModels(entityModelLoader); headModels = SkullBlockEntityRenderer.getModels(entityModelLoader);
this.itemRenderer = itemRenderer;
} }
@Override @Override
public void render(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) { public void render(MatrixStack matrices, VertexConsumerProvider provider, int light, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) {
ItemStack itemstack = entity.getEquippedStack(EquipmentSlot.HEAD); for (ItemStack stack : ArmourRendererPlugin.INSTANCE.get().getArmorStacks(entity, EquipmentSlot.HEAD, ArmourLayer.OUTER)) {
if (!itemstack.isEmpty()) { if (stack.isEmpty()) {
continue;
}
M model = getModelWrapper().body(); M model = getModelWrapper().body();
Item item = itemstack.getItem(); Item item = stack.getItem();
stack.push(); matrices.push();
model.transform(BodyPart.HEAD, stack); model.transform(BodyPart.HEAD, matrices);
model.getHead().rotate(stack); model.getHead().rotate(matrices);
if (model instanceof AbstractPonyModel) { if (model instanceof AbstractPonyModel) {
stack.translate(0, 0.225F, 0); matrices.translate(0, 0.225F, 0);
} else { } else {
stack.translate(0, 0, 0.15F); matrices.translate(0, 0, 0.15F);
} }
if (item instanceof BlockItem && ((BlockItem) item).getBlock() instanceof AbstractSkullBlock) { if (item instanceof BlockItem b && b.getBlock() instanceof AbstractSkullBlock) {
boolean isVillager = entity instanceof VillagerDataContainer; boolean isVillager = entity instanceof VillagerDataContainer;
renderSkull(stack, renderContext, itemstack, isVillager, limbDistance, lightUv); renderSkull(matrices, provider, stack, isVillager, limbDistance, light);
} else if (!(item instanceof ArmorItem) || ((ArmorItem)item).getSlotType() != EquipmentSlot.HEAD) { } else if (!(item instanceof ArmorItem a) || a.getSlotType() != EquipmentSlot.HEAD) {
renderBlock(stack, renderContext, entity, itemstack, lightUv); renderBlock(matrices, provider, entity, stack, light);
} }
stack.pop(); matrices.pop();
} }
} }
private void renderBlock(MatrixStack stack, VertexConsumerProvider renderContext, T entity, ItemStack itemstack, int lightUv) { private void renderBlock(MatrixStack matrices, VertexConsumerProvider provider, T entity, ItemStack stack, int light) {
stack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(180)); matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(180));
stack.scale(0.625F, -0.625F, -0.625F); matrices.scale(0.625F, -0.625F, -0.625F);
stack.translate(0, 0.6F, -0.21F); matrices.translate(0, 0.6F, -0.21F);
MinecraftClient.getInstance().getItemRenderer() itemRenderer.renderItem(entity, stack, ModelTransformationMode.HEAD, false, matrices, provider, entity.getWorld(), light, OverlayTexture.DEFAULT_UV, entity.getId() + ModelTransformationMode.HEAD.ordinal());
.renderItem(entity, itemstack, ModelTransformationMode.HEAD, false, stack, renderContext, entity.getWorld(), lightUv, OverlayTexture.DEFAULT_UV, entity.getId() + ModelTransformationMode.HEAD.ordinal());
} }
private void renderSkull(MatrixStack stack, VertexConsumerProvider renderContext, ItemStack itemstack, boolean isVillager, float limbDistance, int lightUv) { private void renderSkull(MatrixStack matrices, VertexConsumerProvider provider, ItemStack stack, boolean isVillager, float limbDistance, int light) {
stack.translate(0, 0, -0.14F); matrices.translate(0, 0, -0.14F);
float f = 1.1875f; float f = 1.1875f;
stack.scale(f, -f, -f); matrices.scale(f, -f, -f);
if (isVillager) { if (isVillager) {
stack.translate(0, 0.0625F, 0); matrices.translate(0, 0.0625F, 0);
} }
stack.translate(-0.5, 0, -0.5); matrices.translate(-0.5, 0, -0.5);
SkullType type = ((AbstractSkullBlock) ((BlockItem) itemstack.getItem()).getBlock()).getSkullType(); SkullType type = ((AbstractSkullBlock) ((BlockItem) stack.getItem()).getBlock()).getSkullType();
SkullBlockEntityModel skullBlockEntityModel = (SkullBlockEntityModel)this.headModels.get(type); SkullBlockEntityModel skullBlockEntityModel = (SkullBlockEntityModel)this.headModels.get(type);
RenderLayer renderLayer = SkullBlockEntityRenderer.getRenderLayer(type, itemstack.get(DataComponentTypes.PROFILE)); RenderLayer renderLayer = SkullBlockEntityRenderer.getRenderLayer(type, stack.get(DataComponentTypes.PROFILE));
SkullBlockEntityRenderer.renderSkull(null, 180, f, stack, renderContext, lightUv, skullBlockEntityModel, renderLayer); SkullBlockEntityRenderer.renderSkull(null, 180, f, matrices, provider, light, skullBlockEntityModel, renderLayer);
} }
} }