diff --git a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java index b42b0449..ed1b8a12 100644 --- a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java @@ -455,7 +455,7 @@ public abstract class AbstractPonyModel extends Clien * @param entity The entity we are being called for. */ protected final void swingItem(T state) { - if (state.getSwingAmount() > 0 && !state.attributes.isLyingDown) { + if (state.handSwingProgress > 0 && !state.attributes.isLyingDown) { swingArm(state, getArm(state.preferredArm)); } } @@ -466,10 +466,10 @@ public abstract class AbstractPonyModel extends Clien * @param arm The arm to swing */ protected final void swingArm(T state, ModelPart arm) { - float swing = 1 - (float)Math.pow(1 - state.getSwingAmount(), 3); + float swing = 1 - (float)Math.pow(1 - state.handSwingProgress, 3); float deltaX = MathHelper.sin(swing * MathHelper.PI); - float deltaZ = MathHelper.sin(state.getSwingAmount() * MathHelper.PI); + float deltaZ = MathHelper.sin(state.handSwingProgress * MathHelper.PI); float deltaAim = deltaZ * (0.7F - head.pitch) * 0.75F; diff --git a/src/main/java/com/minelittlepony/client/model/ModelType.java b/src/main/java/com/minelittlepony/client/model/ModelType.java index f92e62e0..10cc34c7 100644 --- a/src/main/java/com/minelittlepony/client/model/ModelType.java +++ b/src/main/java/com/minelittlepony/client/model/ModelType.java @@ -2,7 +2,6 @@ package com.minelittlepony.client.model; import net.minecraft.client.model.Model; import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.ArmorStandEntityModel; import net.minecraft.entity.LivingEntity; import com.minelittlepony.api.model.BodyPart; @@ -48,7 +47,7 @@ public final class ModelType { public static final ModelKey> ELYTRA = register("elytra", PonyElytra::new); - public static final ModelKey ARMOUR_STAND = register("armour_stand", PonyArmourStandModel::new); + public static final ModelKey ARMOUR_STAND = register("armour_stand", PonyArmourStandModel::new); public static final ModelKey> INNER_VANILLA_ARMOR = register("armor/inner_vanilla_armor", PonyArmourModel::new); public static final ModelKey> OUTER_VANILLA_ARMOR = register("armor/outer_vanilla_armor", PonyArmourModel::new); public static final ModelKey> INNER_PONY_ARMOR = register("armor/inner_pony_armor", PonyArmourModel::new); diff --git a/src/main/java/com/minelittlepony/client/model/entity/IllagerPonyModel.java b/src/main/java/com/minelittlepony/client/model/entity/IllagerPonyModel.java index 371faa74..fa86f462 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/IllagerPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/IllagerPonyModel.java @@ -25,8 +25,8 @@ public class IllagerPonyModel extends Alico if (pose == IllagerEntity.State.ATTACKING) { // vindicator attacking - float f = MathHelper.sin(state.getSwingAmount() * (float) Math.PI); - float f1 = MathHelper.sin((1 - (1 - state.getSwingAmount()) * (1 - state.getSwingAmount())) * (float) Math.PI); + float f = MathHelper.sin(state.handSwingProgress * (float) Math.PI); + float f1 = MathHelper.sin((1 - (1 - state.handSwingProgress) * (1 - state.handSwingProgress)) * (float) Math.PI); float cos = MathHelper.cos(state.age * 0.09F) * 0.05F + 0.05F; float sin = MathHelper.sin(state.age * 0.067F) * 0.05F; diff --git a/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java b/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java index 2d5bf007..e6d063b5 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java @@ -2,11 +2,11 @@ package com.minelittlepony.client.model.entity; import com.minelittlepony.api.model.MobPosingHelper; import com.minelittlepony.client.model.entity.race.AlicornModel; -import com.minelittlepony.client.render.entity.ZomponyRenderer; +import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.client.model.ModelPart; -public class ZomponyModel extends AlicornModel { +public class ZomponyModel extends AlicornModel { public ZomponyModel(ModelPart tree) { super(tree, false); } diff --git a/src/main/java/com/minelittlepony/client/model/entity/race/AlicornModel.java b/src/main/java/com/minelittlepony/client/model/entity/race/AlicornModel.java index a1e018ac..1ad7e2e1 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/race/AlicornModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/race/AlicornModel.java @@ -20,7 +20,7 @@ public class AlicornModel extends UnicornModel imp public void init(ModelView context) { super.init(context); wings = addPart(context.findByName("wings")); - bodyRenderList.add(forPart(this::getWings).checked(() -> currentState.getRace().hasWings())); + bodyRenderList.add(forPart(this::getWings).checked(() -> currentState.race.hasWings())); } @Override diff --git a/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java b/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java index 8178b211..ca2ef9b2 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java @@ -34,7 +34,7 @@ public class UnicornModel extends EarthPonyModel i public void init(ModelView context) { super.init(context); horn = addPart(context.findByName("horn")); - headRenderList.add(RenderList.of().add(head::rotate).add(forPart(horn)).checked(() -> currentState.getRace().hasHorn())); + headRenderList.add(RenderList.of().add(head::rotate).add(forPart(horn)).checked(() -> currentState.race.hasHorn())); this.mainRenderList.add(withStage(BodyPart.HEAD, RenderList.of().add(head::rotate).add((stack, vertices, overlay, light, color) -> { horn.renderMagic(stack, vertices, currentState.attributes.metadata.glowColor()); })).checked(() -> currentState.hasMagicGlow() && isCasting(currentState))); diff --git a/src/main/java/com/minelittlepony/client/model/part/PonyEars.java b/src/main/java/com/minelittlepony/client/model/part/PonyEars.java index e0e6f813..deefe4dd 100644 --- a/src/main/java/com/minelittlepony/client/model/part/PonyEars.java +++ b/src/main/java/com/minelittlepony/client/model/part/PonyEars.java @@ -57,8 +57,8 @@ public class PonyEars implements SubModel, MsonModel { @Override public void setVisible(boolean visible, PonyRenderState state) { - right.visible = visible && !state.getRace().isHuman(); - left.visible = visible && !state.getRace().isHuman(); + right.visible = visible && !state.race.isHuman(); + left.visible = visible && !state.race.isHuman(); if (state.attributes.isHorsey) { left.pivotX = -1; diff --git a/src/main/java/com/minelittlepony/client/model/part/PonyWings.java b/src/main/java/com/minelittlepony/client/model/part/PonyWings.java index 24e6d164..435983ad 100644 --- a/src/main/java/com/minelittlepony/client/model/part/PonyWings.java +++ b/src/main/java/com/minelittlepony/client/model/part/PonyWings.java @@ -50,19 +50,18 @@ public class PonyWings implements SubModel, MsonMo public Wing getRight(S state) { return ( - state.isEmbedded(Wearable.SADDLE_BAGS_BOTH) - || state.isEmbedded(Wearable.SADDLE_BAGS_LEFT) - || state.isEmbedded(Wearable.SADDLE_BAGS_RIGHT) + state.getAttributes().isEmbedded(Wearable.SADDLE_BAGS_BOTH) + || state.getAttributes().isEmbedded(Wearable.SADDLE_BAGS_LEFT) + || state.getAttributes().isEmbedded(Wearable.SADDLE_BAGS_RIGHT) ) ? legacyWing : rightWing; } @Override public void setPartAngles(S state, float bodySwing) { float flap = 0; - float progress = state.getSwingAmount(); - if (progress > 0) { - flap = MathHelper.sin(MathHelper.sqrt(progress) * MathHelper.TAU); + if (state.handSwingProgress > 0) { + flap = MathHelper.sin(MathHelper.sqrt(state.handSwingProgress) * MathHelper.TAU); } else { float pi = MathHelper.PI * (float) Math.pow(state.limbAmplitudeMultiplier, 16); @@ -92,9 +91,9 @@ public class PonyWings implements SubModel, MsonMo boolean bags = !extended && state.isWearing(Wearable.SADDLE_BAGS_BOTH); boolean useLegacyWing = ( - state.isEmbedded(Wearable.SADDLE_BAGS_BOTH) - || state.isEmbedded(Wearable.SADDLE_BAGS_LEFT) - || state.isEmbedded(Wearable.SADDLE_BAGS_RIGHT) + state.getAttributes().isEmbedded(Wearable.SADDLE_BAGS_BOTH) + || state.getAttributes().isEmbedded(Wearable.SADDLE_BAGS_LEFT) + || state.getAttributes().isEmbedded(Wearable.SADDLE_BAGS_RIGHT) ); leftWing.open = extended; @@ -156,12 +155,12 @@ public class PonyWings implements SubModel, MsonMo extended.visible = open; folded.visible = !open; folded.yaw = swing * walkingRotationSpeed; - if (state.getRace().hasBugWings()) { + if (state.race.hasBugWings()) { extended.yaw = folded.yaw; } extended.roll = roll; - if (state.getRace().hasBugWings()) { + if (state.race.hasBugWings()) { folded.roll = roll; } } diff --git a/src/main/java/com/minelittlepony/client/render/DebugBoundingBoxRenderer.java b/src/main/java/com/minelittlepony/client/render/DebugBoundingBoxRenderer.java index 6b17491e..c90c27c7 100644 --- a/src/main/java/com/minelittlepony/client/render/DebugBoundingBoxRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/DebugBoundingBoxRenderer.java @@ -37,10 +37,26 @@ public final class DebugBoundingBoxRenderer { } public static Box getBoundingBox(PonyRenderState state) { - final float scale = state.size.scaleFactor(); - final float width = state.width * scale; - final float height = state.height * scale; + return getBoundingBox(state.x, state.y, state.z, state.size.scaleFactor(), state.width, state.height); + } - return new Box(-width, 0, -width, width, height, width).offset(state.x, state.y, state.z); + public static Box getBoundingBox(double x, double y, double z, float scale, float width, float height) { + width *= scale; + height *= scale; + return new Box(x - width, y, z - width, x + width, y + height, z + width); + } + + public static Box applyScale(float scale, Box box) { + double w = (box.maxX - box.minX) * 0.5F, + h = (box.maxY - box.minY), + d = (box.maxZ - box.minZ) * 0.5F, + x = box.minX + w, + z = box.minZ + d; + w *= scale; + d *= scale; + return new Box( + x - w, box.minY, z - d, + x + w, box.minY + h * scale, z + d + ); } } diff --git a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java index 0539dcc7..b293f0b1 100644 --- a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java +++ b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java @@ -6,6 +6,8 @@ import com.minelittlepony.api.events.PonyDataCallback; import com.minelittlepony.api.model.*; import com.minelittlepony.api.pony.Pony; import com.minelittlepony.api.pony.PonyData; +import com.minelittlepony.api.pony.meta.Race; +import com.minelittlepony.api.pony.meta.SizePreset; import com.minelittlepony.client.PonyDataLoader; import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.render.entity.state.PonyRenderState; @@ -19,12 +21,13 @@ import java.util.function.Supplier; import net.fabricmc.api.EnvType; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.Frustum; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.Util; +import net.minecraft.util.math.Box; import org.jetbrains.annotations.Nullable; @@ -35,19 +38,23 @@ public class EquineRenderManager< private Models models; - private Function> modelsLookup = s -> models; + private Function> modelsLookup = race -> models; private final PonyRenderContext context; private final Transformer transformer; - private final FrustrumCheck frustrum = new FrustrumCheck<>(); - - private final MinecraftClient client = MinecraftClient.getInstance(); - public static void disableModelRenderProfile() { RenderSystem.disableBlend(); } + public EquineRenderManager(PonyRenderContext context, Transformer transformer, Function> modelsLookup) { + this.context = context; + this.transformer = transformer; + setModelsLookup(modelsLookup); + this.models = this.modelsLookup.apply(Race.EARTH); + context.setModel(models.body()); + } + public EquineRenderManager(PonyRenderContext context, Transformer transformer, Models models) { this.context = context; this.transformer = transformer; @@ -60,30 +67,30 @@ public class EquineRenderManager< this(context, transformer, new Models(key)); } - public void setModelsLookup(Function> modelsLookup) { - this.modelsLookup = modelsLookup; + public void setModelsLookup(Function> modelsLookup) { + this.modelsLookup = Util.memoize(modelsLookup); } public Models getModels() { return models; } - public Frustum getFrustrum(T entity, Frustum vanilla) { - if (RenderPass.getCurrent() == RenderPass.HUD) { - return FrustrumCheck.ALWAYS_VISIBLE; - } + public Box getBoundingBox(T entity, Box box) { if (entity.isSleeping() || !PonyConfig.getInstance().frustrum.get()) { - return vanilla; + return box; } - return frustrum.withCamera(context.getVanillaRenderer().getAndUpdateRenderState(entity, client.getRenderTickCounter().getTickDelta(false)), vanilla); + Pony pony = context.getEntityPony(entity); + float scale = (entity.isBaby() ? SizePreset.FOAL : pony.size()).scaleFactor(); + return DebugBoundingBoxRenderer.applyScale(scale, box); } public void updateState(T entity, S state, ModelAttributes.Mode mode) { - models = modelsLookup.apply(state); + Pony pony = context.getEntityPony(entity); + models = modelsLookup.apply(pony.race()); context.setModel(models.body()); - state.updateState(entity, models.body(), context.getEntityPony(entity), mode); + state.updateState(entity, models.body(), pony, mode); } public void setupTransforms(S state, MatrixStack stack, float animationProgress, float bodyYaw) { diff --git a/src/main/java/com/minelittlepony/client/render/FrustrumCheck.java b/src/main/java/com/minelittlepony/client/render/FrustrumCheck.java index 90ae179b..9ea8c9a7 100644 --- a/src/main/java/com/minelittlepony/client/render/FrustrumCheck.java +++ b/src/main/java/com/minelittlepony/client/render/FrustrumCheck.java @@ -1,36 +1,49 @@ package com.minelittlepony.client.render; import net.minecraft.client.render.Frustum; +import net.minecraft.entity.LivingEntity; import net.minecraft.util.math.Box; +import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; -import com.minelittlepony.client.render.entity.state.PonyRenderState; +import com.minelittlepony.api.pony.Pony; +import com.minelittlepony.api.pony.meta.SizePreset; -public class FrustrumCheck extends Frustum { +@Deprecated +public final class FrustrumCheck extends Frustum { public static final Frustum ALWAYS_VISIBLE = new Frustum(new Matrix4f(), new Matrix4f()) { public boolean isVisible(Box bounds) { return true; } }; - private T entity; - private Frustum vanilla; + @Nullable + private Box boxOverride; public FrustrumCheck() { super(new Matrix4f(), new Matrix4f()); } - public Frustum withCamera(T entity, Frustum vanillaFrustrum) { - this.entity = entity; + public Frustum withCamera(PonyRenderContext context, T entity, Frustum vanillaFrustrum) { vanilla = vanillaFrustrum; + + Pony pony = context.getEntityPony(entity); + boolean baby = entity.isBaby(); + + boxOverride = DebugBoundingBoxRenderer.getBoundingBox( + entity.getX(), entity.getY(), entity.getZ(), + (baby ? SizePreset.FOAL : pony.size()).scaleFactor(), + entity.getWidth(), + entity.getHeight() + ); return this; } @Override public boolean isVisible(Box bounds) { - return vanilla.isVisible(DebugBoundingBoxRenderer.getBoundingBox(entity)); + return vanilla.isVisible(boxOverride == null ? bounds : boxOverride); } @Override diff --git a/src/main/java/com/minelittlepony/client/render/MobRenderers.java b/src/main/java/com/minelittlepony/client/render/MobRenderers.java index 6fa20bf4..0c8a880c 100644 --- a/src/main/java/com/minelittlepony/client/render/MobRenderers.java +++ b/src/main/java/com/minelittlepony/client/render/MobRenderers.java @@ -62,7 +62,7 @@ public record MobRenderers (String name, BiConsumer { - registry.registerEntityRenderer(EntityType.ARMOR_STAND, state, PonyStandRenderer::new); + registry.registerEntityRenderer(EntityType.ARMOR_STAND, e -> state.option().get() && PonyStandRenderer.isPonyStand(e), PonyStandRenderer::new); }); public static final MobRenderers STRIDER = register("striders", (state, registry) -> { registry.registerEntityRenderer(EntityType.STRIDER, state, StriderRenderer::new); diff --git a/src/main/java/com/minelittlepony/client/render/PonyRenderContext.java b/src/main/java/com/minelittlepony/client/render/PonyRenderContext.java index fcb2655f..4177e907 100644 --- a/src/main/java/com/minelittlepony/client/render/PonyRenderContext.java +++ b/src/main/java/com/minelittlepony/client/render/PonyRenderContext.java @@ -2,6 +2,7 @@ package com.minelittlepony.client.render; import com.minelittlepony.api.model.gear.Gear; import com.minelittlepony.api.pony.Pony; +import com.minelittlepony.api.pony.meta.Wearable; import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.render.entity.state.PonyRenderState; @@ -10,6 +11,7 @@ import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.state.EntityRenderState; import net.minecraft.entity.LivingEntity; +import net.minecraft.util.Identifier; import org.jetbrains.annotations.Nullable; @@ -21,9 +23,16 @@ public interface PonyRenderContext< Pony getEntityPony(T entity); - EquineRenderManager getInternalRenderer(); + EquineRenderManager getEquineManager(); - void setModel(M model); + default void setModel(M model) { + + } + + @Override + default Identifier getDefaultTexture(S entity, Wearable wearable) { + return wearable.getDefaultTexture(); + } @Nullable @SuppressWarnings("unchecked") diff --git a/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java index 6da3dbb8..737371e4 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java @@ -15,8 +15,6 @@ import com.minelittlepony.mson.api.ModelKey; import java.util.*; import java.util.function.*; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.Frustum; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.MobEntityRenderer; @@ -24,9 +22,13 @@ import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.HeadFeatureRenderer; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.mob.MobEntity; +import net.minecraft.item.Items; +import net.minecraft.resource.ResourceManager; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import net.minecraft.util.math.Box; public abstract class AbstractPonyRenderer< T extends MobEntity, @@ -36,10 +38,12 @@ public abstract class AbstractPonyRenderer< protected final EquineRenderManager manager; - private final Map wearableTextures = new EnumMap<>(Wearable.class); + private final Map wearableTextures = new HashMap<>(); private final TextureSupplier texture; + private final ResourceManager resources; + private final float scale; public AbstractPonyRenderer(EntityRendererFactory.Context context, ModelKey key, TextureSupplier texture, float scale) { @@ -47,6 +51,7 @@ public abstract class AbstractPonyRenderer< this.manager = new EquineRenderManager(this, super::setupTransforms, key); this.texture = texture; this.scale = scale; + resources = context.getResourceManager(); addFeatures(context); } @@ -97,8 +102,16 @@ public abstract class AbstractPonyRenderer< } @Override - public boolean shouldRender(T entity, Frustum visibleRegion, double camX, double camY, double camZ) { - return super.shouldRender(entity, manager.getFrustrum(entity, visibleRegion), camX, camY, camZ); + protected final Box getBoundingBox(T entity) { + Box box = manager.getBoundingBox(entity, getUnscaledBoundingBox(entity)); + if (entity.getEquippedStack(EquipmentSlot.HEAD).isOf(Items.DRAGON_HEAD)) { + return box.expand(0.5, 0.5, 0.5); + } + return box; + } + + protected Box getUnscaledBoundingBox(T entity) { + return entity.getBoundingBox(); } @Override @@ -130,14 +143,8 @@ public abstract class AbstractPonyRenderer< @Override public Identifier getDefaultTexture(S state, Wearable wearable) { - return wearableTextures.computeIfAbsent(wearable, w -> { - Identifier texture = getTexture(state).withPath(path -> path.split("\\.")[0] + "_" + wearable.name().toLowerCase(Locale.ROOT) + ".png"); - - if (MinecraftClient.getInstance().getResourceManager().getResource(texture).isPresent()) { - return texture; - } - return wearable.getDefaultTexture(); - }); + Identifier texture = getTexture(state).withPath(path -> path.split("\\.")[0] + "_" + wearable.name().toLowerCase(Locale.ROOT) + ".png"); + return wearableTextures.computeIfAbsent(texture, t -> resources.getResource(t).isPresent() ? t : wearable.getDefaultTexture()); } @Override @@ -146,7 +153,7 @@ public abstract class AbstractPonyRenderer< } @Override - public EquineRenderManager getInternalRenderer() { + public EquineRenderManager getEquineManager() { return manager; } diff --git a/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java index 807f7b85..3b63258c 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java @@ -1,7 +1,6 @@ package com.minelittlepony.client.render.entity; import com.minelittlepony.api.model.*; -import com.minelittlepony.api.pony.Pony; import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.model.ModelType; @@ -16,7 +15,6 @@ import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.feature.StuckArrowsFeatureRenderer; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.EndermanEntity; import net.minecraft.util.Arm; import net.minecraft.util.Identifier; @@ -36,11 +34,6 @@ public class EnderStallionRenderer extends PonyRenderer(this)); } + @Override + public State createRenderState() { + return new State(); + } + + @Override + public void updateRenderState(EndermanEntity entity, State state, float tickDelta) { + super.updateRenderState(entity, state, tickDelta); + boolean isAlicorn = entity.getUuid().getLeastSignificantBits() % 3 == 0; + state.isBoss = !isAlicorn && entity.getUuid().getLeastSignificantBits() % 90 == 0; + state.race = isAlicorn ? (state.attributes.metadata.race().hasHorn() ? Race.ALICORN : Race.PEGASUS) : state.attributes.metadata.race(); + state.angry = entity.isAngry(); + state.carriedBlock = entity.getCarriedBlock(); + + if (state.carriedBlock != null) { + if (state.mainArm == Arm.RIGHT) { + state.rightHandStack = state.carriedBlock.getBlock().asItem().getDefaultStack(); + } else { + state.leftHandStack = state.carriedBlock.getBlock().asItem().getDefaultStack(); + } + } + state.attributes.wingsSpread = state.isAttacking; + state.attributes.wingAngle = MathHelper.sin(state.age) + WingedPonyModel.WINGS_HALF_SPREAD_ANGLE; + } + @Override protected HeldItemFeature createHeldItemFeature(EntityRendererFactory.Context context) { return new HeldItemFeature(this, context.getItemRenderer()); @@ -72,34 +90,6 @@ public class EnderStallionRenderer extends PonyRenderer model, Pony pony, ModelAttributes.Mode mode) { - super.updateState(entity, model, pony, mode); - isUnicorn = true; - isAlicorn = entity.getUuid().getLeastSignificantBits() % 3 == 0; - isBoss = !isAlicorn && entity.getUuid().getLeastSignificantBits() % 90 == 0; - - angry = ((EndermanEntity)entity).isAngry(); - carriedBlock = ((EndermanEntity)entity).getCarriedBlock(); - - if (carriedBlock != null) { - if (mainArm == Arm.RIGHT) { - rightHandStack = carriedBlock.getBlock().asItem().getDefaultStack(); - } else { - leftHandStack = carriedBlock.getBlock().asItem().getDefaultStack(); - } - } - - attributes.wingsSpread = isAttacking; - attributes.wingAngle = MathHelper.sin(age) + WingedPonyModel.WINGS_HALF_SPREAD_ANGLE; - } - - @Override - public Race getRace() { - return isAlicorn ? (super.getRace().hasHorn() ? Race.ALICORN : Race.PEGASUS) : super.getRace(); - } } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java index a1d17ff3..a997cf16 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java @@ -1,9 +1,7 @@ package com.minelittlepony.client.render.entity; import com.minelittlepony.api.model.ModelAttributes; -import com.minelittlepony.api.model.Models; import com.minelittlepony.api.pony.Pony; -import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.api.pony.meta.Wearable; import com.minelittlepony.client.model.*; import com.minelittlepony.client.render.DebugBoundingBoxRenderer; @@ -14,11 +12,9 @@ import com.minelittlepony.client.render.entity.state.PonyRenderState; import com.minelittlepony.common.util.render.RenderLayerUtil; import java.util.*; -import java.util.function.Function; import com.minelittlepony.client.render.EquineRenderManager; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.*; import net.minecraft.client.render.entity.EntityRendererFactory; @@ -29,8 +25,7 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EntityPose; import net.minecraft.text.Text; import net.minecraft.util.*; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.*; public class PlayerPonyRenderer extends PlayerEntityRenderer @@ -39,21 +34,15 @@ public class PlayerPonyRenderer PlayerPonyRenderState, ClientPonyModel > { - private final Function>> modelsCache; protected final EquineRenderManager> manager; private ModelAttributes.Mode mode = ModelAttributes.Mode.THIRD_PERSON; + @SuppressWarnings({"unchecked", "rawtypes"}) public PlayerPonyRenderer(EntityRendererFactory.Context context, boolean slim) { super(context, slim); - modelsCache = Util.memoize(race -> ModelType.getPlayerModel(race).create(slim)); - manager = new EquineRenderManager<>(this, super::setupTransforms, modelsCache.apply(Race.EARTH)); - manager.setModelsLookup(entity -> modelsCache.apply(getPlayerRace(entity))); - addPonyFeatures(context); - } + manager = new EquineRenderManager<>(this, super::setupTransforms, race -> ModelType.getPlayerModel(race).create(slim)); - @SuppressWarnings({"unchecked", "rawtypes"}) - protected void addPonyFeatures(EntityRendererFactory.Context context) { // remove vanilla features (keep modded ones) features.removeIf(feature -> { return feature instanceof ArmorFeatureRenderer @@ -129,11 +118,6 @@ public class PlayerPonyRenderer stack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(yaw)); } */ - - } - - protected Race getPlayerRace(PlayerPonyRenderState state) { - return state.getRace(); } @Override @@ -142,12 +126,8 @@ public class PlayerPonyRenderer } @Override - public boolean shouldRender(AbstractClientPlayerEntity entity, Frustum camera, double camX, double camY, double camZ) { - if (entity.isSleeping() && entity == MinecraftClient.getInstance().player) { - return !MinecraftClient.getInstance().options.getPerspective().isFirstPerson() - && super.shouldRender(entity, camera, camX, camY, camZ); - } - return super.shouldRender(entity, manager.getFrustrum(entity, camera), camX, camY, camZ); + protected Box getBoundingBox(AbstractClientPlayerEntity entity) { + return manager.getBoundingBox(entity, entity.getBoundingBox()); } @Override @@ -205,7 +185,7 @@ public class PlayerPonyRenderer } @Override - public EquineRenderManager> getInternalRenderer() { + public EquineRenderManager> getEquineManager() { return manager; } @@ -225,7 +205,7 @@ public class PlayerPonyRenderer return state.wearabledTextures.get(wearable); } - if (wearable.isSaddlebags() && state.getRace().supportsLegacySaddlebags()) { + if (wearable.isSaddlebags() && state.race.supportsLegacySaddlebags()) { return getTexture(state); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/PonyPiglinRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PonyPiglinRenderer.java index 5d30a6ef..36b3d619 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PonyPiglinRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyPiglinRenderer.java @@ -8,6 +8,7 @@ import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.entity.PiglinPonyModel; import com.minelittlepony.client.render.entity.npc.textures.TextureSupplier; +import com.minelittlepony.client.render.entity.state.PonyRenderState; public class PonyPiglinRenderer extends PonyRenderer { public static final Identifier PIGLIN = MineLittlePony.id("textures/entity/piglin/piglin_pony.png"); @@ -39,16 +40,10 @@ public class PonyPiglinRenderer extends PonyRenderer> { +public class PonyStandRenderer extends LivingEntityRenderer { static final Pony PONY = new Pony(Identifier.ofVanilla("null"), () -> Optional.of(PonyData.NULL)); - private final PonyArmourStandModel pony = ModelType.ARMOUR_STAND.createModel(); - private final Models> models = ModelType.EARTH_PONY.create(false); - private final ArmorStandArmorEntityModel human; + private final PonifiedContext context = new PonifiedContext(); - private final EquineRenderManager> manager; + public static boolean isPonyStand(Entity entity) { + return entity.hasCustomName() && "Ponita".equals(entity.getCustomName().getString()); + } public PonyStandRenderer(EntityRendererFactory.Context context) { - super(context); - human = model; - this.manager = new EquineRenderManager<>(this, (state, stack, progress, yaw) -> {}, models); - - Predicate swapPredicate = state -> ((State)state).hasPonyForm; - Function converter = state -> ((State)state).ponyState; - - for (int i = 0; i < features.size(); i++) { - var feature = features.get(i); - if (feature instanceof ArmorFeatureRenderer) { - features.set(i, new SwappableFeature<>(this, feature, new Armour(context), swapPredicate, converter)); - } - if (feature instanceof ElytraFeatureRenderer) { - features.set(i, new SwappableFeature<>(this, - feature, - new ElytraFeature<>(() -> models.body(), context.getEquipmentRenderer()), swapPredicate, converter)); - } - if (feature instanceof HeadFeatureRenderer) { - features.set(i, new SwappableFeature<>(this, - feature, - new SkullFeature>( - this, - context.getModelLoader(), - context.getItemRenderer(), - HeadFeatureRenderer.HeadTransformation.DEFAULT, - false - ), swapPredicate, converter)); - } - } - } - - - @Override - public Identifier getDefaultTexture(PonyRenderState entity, Wearable wearable) { - return wearable.getDefaultTexture(); + super(context, ModelType.ARMOUR_STAND.createModel(), 0); + addFeature(new PonifiedFeature(this, new ArmourFeature<>(this.context, context.getEquipmentModelLoader()))); + addFeature(new PonifiedFeature(this, new HeldItemFeature<>(this.context, context.getItemRenderer()))); + addFeature(new PonifiedFeature(this, new ElytraFeature<>(this.context, context.getEquipmentRenderer()))); + addFeature(new PonifiedFeature(this, new SkullFeature<>(this.context, context.getModelLoader(), context.getItemRenderer(), HeadFeatureRenderer.HeadTransformation.DEFAULT, false))); } @Override - public Pony getEntityPony(ArmorStandEntity entity) { - return PONY; - } - - @Override - public EquineRenderManager> getInternalRenderer() { - return manager; - } - - @Override - public void setModel(EarthPonyModel model) { } - - @Override - public ArmorStandEntityRenderState createRenderState() { + public State createRenderState() { return new State(); } - public void updateRenderState(ArmorStandEntity entity, ArmorStandEntityRenderState state, float tickDelta) { - boolean ponified = entity.hasCustomName() && "Ponita".equals(entity.getCustomName().getString()); + @Override + public Identifier getTexture(State state) { + return ArmorStandEntityRenderer.TEXTURE; + } + public void updateRenderState(ArmorStandEntity entity, State state, float tickDelta) { super.updateRenderState(entity, state, tickDelta); - ((State)state).hasPonyForm = ponified; - if (ponified) { - BipedEntityRenderer.updateBipedRenderState(entity, ((State)state).ponyState, tickDelta); - manager.updateState(entity, ((State)state).ponyState, Mode.OTHER); - state.pitch = 0.017453292F * entity.getHeadRotation().getPitch(); - state.yawDegrees = 0.017453292F * entity.getHeadRotation().getYaw(); - } + BipedEntityRenderer.updateBipedRenderState(entity, state.ponyState, tickDelta); + context.manager.updateState(entity, state.ponyState, Mode.OTHER); + state.pitch = MathHelper.RADIANS_PER_DEGREE * entity.getHeadRotation().getPitch(); + state.yawDegrees = MathHelper.RADIANS_PER_DEGREE * entity.getHeadRotation().getYaw(); } @Override - protected void setupTransforms(ArmorStandEntityRenderState state, MatrixStack stack, float animationProgress, float bodyYaw) { - super.setupTransforms(state, stack, animationProgress, bodyYaw); - if (((State)state).hasPonyForm) { - stack.translate(0, 0, state.baseScale * -4/16F); - this.model = pony; - } else { - this.model = human; + protected void setupTransforms(State state, MatrixStack matrices, float animationProgress, float bodyYaw) { + matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(180 - animationProgress)); + if (state.timeSinceLastHit < 5) { + matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(MathHelper.sin(state.timeSinceLastHit / 1.5F * (float) Math.PI) * 3.0F)); } + matrices.translate(0, 0, state.baseScale * -4/16F); } - class Armour extends FeatureRenderer> { - private final PonifiedEquipmentRenderer equipmentRenderer; + @Override + protected boolean hasLabel(ArmorStandEntity entity, double squaredDistanceToCamera) { + return entity.isCustomNameVisible(); + } - public Armour(EntityRendererFactory.Context context) { - super(() -> models.body()); - equipmentRenderer = new PonifiedEquipmentRenderer(context.getEquipmentModelLoader()); + @SuppressWarnings({"unchecked", "rawtypes"}) + @Override + @Nullable + protected RenderLayer getRenderLayer(State state, boolean showBody, boolean translucent, boolean showOutline) { + if (context.getModel() instanceof BipedEntityModel bipedModel) { + bipedModel.copyTransforms((BipedEntityModel)model); + } + if (!state.marker) { + return super.getRenderLayer(state, showBody, translucent, showOutline); + } + + Identifier identifier = getTexture(state); + if (translucent) { + return RenderLayer.getEntityTranslucent(identifier, false); + } + + return showBody ? RenderLayer.getEntityCutoutNoCull(identifier, false) : null; + } + + private class PonifiedContext implements + FeatureRendererContext>, + PonyRenderContext> { + private final EquineRenderManager> manager + = new EquineRenderManager<>(this, (state, stack, progress, yaw) -> {}, ModelType.EARTH_PONY.create(false)); + + @Override + public Pony getEntityPony(ArmorStandEntity entity) { + return PONY; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, PonyRenderState state, float limbAngle, float limbDistance) { - getContextModel().setAngles(state); - ArmourFeature.renderArmor(models, matrices, vertices, light, state, limbDistance, limbAngle, equipmentRenderer); + public EquineRenderManager> getEquineManager() { + return manager; + } + + @Override + public EarthPonyModel getModel() { + return manager.getModels().body(); + } + } + + private class PonifiedFeature extends FeatureRenderer { + private final FeatureRenderer feature; + + public PonifiedFeature(FeatureRendererContext context, + FeatureRenderer feature) { + super(context); + this.feature = feature; + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + @Override + public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, PonyStandRenderer.State state, float limbAngle, float limbDistance) { + ((FeatureRenderer)feature).render(matrices, vertices, light, state.ponyState, limbAngle, limbDistance); } } public static final class State extends ArmorStandEntityRenderState { - public boolean hasPonyForm; public PonyRenderState ponyState = new PonyRenderState(); } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/SkeleponyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/SkeleponyRenderer.java index a3dede1e..98e7b814 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/SkeleponyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/SkeleponyRenderer.java @@ -67,19 +67,13 @@ public class SkeleponyRenderer extends PonyRen } public static class State extends PonyRenderState { - public boolean isUnicorn; - public boolean isWithered; public boolean isAttacking; public void updateState(LivingEntity entity, PonyModel model, Pony pony, ModelAttributes.Mode mode) { - isUnicorn = entity.getUuid().getLeastSignificantBits() % 3 != 0; - isWithered = entity instanceof WitherSkeletonEntity; isAttacking = entity instanceof HostileEntity h && h.isAttacking(); - } - - @Override - public Race getRace() { - return isUnicorn ? super.getRace() : Race.EARTH; + if (entity.getUuid().getLeastSignificantBits() % 3 == 0) { + race = Race.EARTH; + } } @Override diff --git a/src/main/java/com/minelittlepony/client/render/entity/WitchRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/WitchRenderer.java index af15d485..2bdababb 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/WitchRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/WitchRenderer.java @@ -1,8 +1,5 @@ package com.minelittlepony.client.render.entity; -import com.minelittlepony.api.model.ModelAttributes; -import com.minelittlepony.api.model.PonyModel; -import com.minelittlepony.api.pony.Pony; import com.minelittlepony.api.pony.meta.Wearable; import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.model.ModelType; @@ -11,7 +8,6 @@ import com.minelittlepony.client.render.entity.npc.textures.TextureSupplier; import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.WitchEntity; import net.minecraft.util.Identifier; @@ -27,19 +23,16 @@ public class WitchRenderer extends PonyRenderer model, Pony pony, ModelAttributes.Mode mode) { - super.updateState(entity, model, pony, mode); - drinking = entity instanceof WitchEntity w && w.isDrinking(); - attributes.visualHeight += 0.5F; - if (customName != null && "Filly".equals(customName.getString())) { - baby = true; - } - } - @Override public boolean isWearing(Wearable wearable) { return wearable == Wearable.HAT || super.isWearing(wearable); diff --git a/src/main/java/com/minelittlepony/client/render/entity/ZomponyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/ZomponyRenderer.java index dd363d5d..f788e880 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/ZomponyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/ZomponyRenderer.java @@ -5,9 +5,6 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.*; import net.minecraft.util.Identifier; -import com.minelittlepony.api.model.ModelAttributes; -import com.minelittlepony.api.model.PonyModel; -import com.minelittlepony.api.pony.Pony; import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.model.ModelType; @@ -15,7 +12,7 @@ import com.minelittlepony.client.model.entity.ZomponyModel; import com.minelittlepony.client.render.entity.npc.textures.TextureSupplier; import com.minelittlepony.client.render.entity.state.PonyRenderState; -public class ZomponyRenderer extends PonyRenderer> { +public class ZomponyRenderer extends PonyRenderer> { public static final Identifier ZOMBIE = MineLittlePony.id("textures/entity/zombie/zombie_pony.png"); public static final Identifier HUSK = MineLittlePony.id("textures/entity/zombie/husk_pony.png"); public static final Identifier DROWNED = MineLittlePony.id("textures/entity/zombie/drowned_pony.png"); @@ -27,8 +24,14 @@ public class ZomponyRenderer extends PonyRenderer zombie(EntityRendererFactory.Context context) { @@ -51,19 +54,7 @@ public class ZomponyRenderer extends PonyRenderer model, Pony pony, ModelAttributes.Mode mode) { - super.updateState(entity, model, pony, mode); - isCozyGlow = isCozyGlow(entity); - isWinged = entity.getUuid().getLeastSignificantBits() % 30 == 0; - } - - @Override - public Race getRace() { - return isWinged ? (super.getRace().hasHorn() ? Race.ALICORN : Race.PEGASUS) : super.getRace(); - } + static boolean isWinged(LivingEntity entity) { + return entity.getUuid().getLeastSignificantBits() % 30 == 0; } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyFeature.java index 6b49279f..4a74b24d 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyFeature.java @@ -28,10 +28,10 @@ public abstract class AbstractPonyFeature< @Override public final M getContextModel() { - return context.getInternalRenderer().getModels().body(); + return context.getEquineManager().getModels().body(); } protected Models getModelWrapper() { - return context.getInternalRenderer().getModels(); + return context.getEquineManager().getModels(); } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java index 24649991..090c0eb4 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java @@ -29,7 +29,7 @@ public class CapeFeature extends CapeFeatureRenderer { @Override public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, PlayerEntityRenderState player, float limbAngle, float limbDistance) { - ClientPonyModel model = context.getInternalRenderer().getModels().body(); + ClientPonyModel model = context.getEquineManager().getModels().body(); if (!player.invisible && player.capeVisible) { ArmourRendererPlugin plugin = ArmourRendererPlugin.INSTANCE.get(); diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java index 836aa60e..06ca5069 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java @@ -69,7 +69,7 @@ public class ElytraFeature< if (state instanceof PonyRenderState ponyState && context instanceof PonyRenderContext context) { stack.translate(0, ponyState.riderOffset, 0.125); - ((ClientPonyModel)context.getInternalRenderer().getModels().body()).transform(ponyState, BodyPart.BODY, stack); + ((ClientPonyModel)context.getEquineManager().getModels().body()).transform(ponyState, BodyPart.BODY, stack); } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java index 5a1f9e3f..72ab2d25 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java @@ -29,7 +29,7 @@ public class HeldItemFeature< public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, S state, float limbAngle, float limbDistance) { if (!state.leftHandStack.isEmpty() || !state.rightHandStack.isEmpty()) { - M model = context.getInternalRenderer().getModels().body(); + M model = context.getEquineManager().getModels().body(); matrices.push(); model.transform(state, BodyPart.LEGS, matrices); diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/PassengerFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/PassengerFeature.java index 4565de8a..3b461073 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/PassengerFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/PassengerFeature.java @@ -32,7 +32,6 @@ public class PassengerFeature< parrotState.parrotPose = ParrotEntityModel.Pose.ON_SHOULDER; } - @Override public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, S state, float limbAngle, float limbDistance) { if (state.leftShoulderParrotVariant != null) { diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/SwappableFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/SwappableFeature.java deleted file mode 100644 index 7ad99210..00000000 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/SwappableFeature.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.minelittlepony.client.render.entity.feature; - -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.util.math.MatrixStack; - -import java.util.function.Function; -import java.util.function.Predicate; - -public final class SwappableFeature< - S extends EntityRenderState, - M extends EntityModel, - P extends EntityRenderState, - N extends EntityModel - > extends FeatureRenderer { - - private final FeatureRenderer normal; - private final FeatureRenderer swapped; - - private final Predicate swapCondition; - private final Function stateConverter; - - public SwappableFeature( - FeatureRendererContext context, - FeatureRenderer normal, - FeatureRenderer swapped, - Predicate swapCondition, - Function stateConverter - ) { - super(context); - this.normal = normal; - this.swapped = swapped; - this.swapCondition = swapCondition; - this.stateConverter = stateConverter; - } - - @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, S state, float limbAngle, float limbDistance) { - if (swapCondition.test(state)) { - swapped.render(matrices, vertices, light, stateConverter.apply(state), limbAngle, limbDistance); - } else { - normal.render(matrices, vertices, light, state, limbAngle, limbDistance); - } - } -} diff --git a/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java index 4479dbcf..02dc5a8f 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java @@ -3,10 +3,8 @@ package com.minelittlepony.client.render.entity.npc; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.entity.mob.MobEntity; import net.minecraft.util.Identifier; -import net.minecraft.util.Util; import net.minecraft.village.*; -import com.minelittlepony.api.model.*; import com.minelittlepony.api.model.gear.Gear; import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.api.pony.meta.Wearable; @@ -14,24 +12,21 @@ import com.minelittlepony.client.model.*; import com.minelittlepony.client.render.entity.PonyRenderer; import com.minelittlepony.client.render.entity.npc.textures.*; -import java.util.function.Function; - abstract class AbstractNpcRenderer< T extends MobEntity & VillagerDataContainer, S extends SillyPonyTextureSupplier.State > extends PonyRenderer> { private final NpcClothingFeature, AbstractNpcRenderer> clothing; - private final Function>> models = Util.memoize(race -> { - if (race.isHuman()) { - race = Race.EARTH; - } - return ModelType.getPlayerModel(race).create(false, this::initializeModel); - }); public AbstractNpcRenderer(EntityRendererFactory.Context context, String type, TextureSupplier textureSupplier, TextureSupplier formatter) { super(context, ModelType.getPlayerModel(Race.EARTH).getKey(false), SillyPonyTextureSupplier.create(textureSupplier, formatter)); clothing = new NpcClothingFeature<>(this, type); - this.manager.setModelsLookup(entity -> models.apply(entity.getRace())); + this.manager.setModelsLookup(race -> { + if (race.isHuman()) { + race = Race.EARTH; + } + return ModelType.getPlayerModel(race).create(false, this::initializeModel); + }); addFeature(clothing); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java b/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java index d557a00e..135fd228 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java +++ b/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java @@ -33,6 +33,7 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode public Pony pony; public Size size; + public Race race; public void updateState(LivingEntity entity, PonyModel model, Pony pony, ModelAttributes.Mode mode) { this.pony = pony; @@ -45,7 +46,7 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode isInSneakingPose = attributes.isCrouching && !attributes.isLyingDown; sleepingInBed = entity.getSleepingPosition().isPresent() && entity.getEntityWorld().getBlockState(entity.getSleepingPosition().get()).getBlock() instanceof BedBlock; submergedInWater = entity.isSubmergedInWater(); - wobbleAmount = handSwingProgress <= 0 ? 0 : MathHelper.sin(MathHelper.sqrt(getSwingAmount()) * MathHelper.PI * 2) * 0.04F; + wobbleAmount = handSwingProgress <= 0 ? 0 : MathHelper.sin(MathHelper.sqrt(handSwingProgress) * MathHelper.PI * 2) * 0.04F; if (attributes.isSitting) { pose = EntityPose.SITTING; } @@ -57,23 +58,25 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode ) && entity.hasCustomName() && entity.getCustomName().getString().equalsIgnoreCase("technoblade") ); size = baby ? SizePreset.FOAL : PonyConfig.getEffectiveSize(attributes.metadata.size()); + race = PonyConfig.getEffectiveRace(attributes.metadata.race()); PonyPosture.of(attributes).updateState(entity, this); PonyModelPrepareCallback.EVENT.invoker().onPonyModelPrepared(attributes, model, ModelAttributes.Mode.OTHER); } @Override - public Race getRace() { - return PonyConfig.getEffectiveRace(attributes.metadata.race()); + public final Race getRace() { + return race; } public boolean hasMagicGlow() { - return getRace().hasHorn() && attributes.metadata.glowColor() != 0; + return race.hasHorn() && attributes.metadata.glowColor() != 0; } /** * Gets the current leg swing amount. */ + @Override public float getSwingAmount() { return this.handSwingProgress; } @@ -101,15 +104,7 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode * Tests if this model is wearing the given piece of gear. */ public boolean isWearing(Wearable wearable) { - return isEmbedded(wearable) || attributes.featureSkins.contains(wearable.getId()) || isTechnoblade && wearable == Wearable.CROWN; - } - - /** - * Tests if the chosen piece of gear is sourcing its texture from the main skin. - * i.e. Used to change wing rendering when using saddlebags. - */ - public boolean isEmbedded(Wearable wearable) { - return attributes.metadata.gear().matches(wearable); + return attributes.isEmbedded(wearable) || attributes.featureSkins.contains(wearable.getId()) || isTechnoblade && wearable == Wearable.CROWN; } private float getNamePlateYOffset(LivingEntity entity) {