Fixed third person magic rendering

This commit is contained in:
Sollace 2024-12-13 15:56:28 +01:00
parent 4e57f6a267
commit 2ace8f8f37
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
6 changed files with 52 additions and 25 deletions

View file

@ -43,8 +43,6 @@ abstract class MixinHeldItemRenderer {
VertexConsumerProvider vertices,
@Nullable World world,
int light, int overlay, int seed, Operation<Void> operation) {
if (!MineLittlePony.getInstance().getRenderDispatcher().getMagicRenderer().renderItem(target, entity, stack, mode, left, matrices, vertices, world, light, overlay, seed, operation)) {
operation.call(target, entity, stack, mode, left, matrices, vertices, world, light, overlay, seed);
}

View file

@ -528,15 +528,7 @@ public abstract class AbstractPonyModel<T extends PonyRenderState> extends Clien
hat.visible = false;
}
@Override
public final void setArmAngle(Arm arm, MatrixStack matrices) {
super.setArmAngle(arm, matrices);
if (currentState != null) {
positionheldItem(currentState, arm, matrices);
}
}
protected void positionheldItem(T state, Arm arm, MatrixStack matrices) {
public void positionheldItem(T state, Arm arm, MatrixStack matrices) {
float left = arm == Arm.LEFT ? -1 : 1;
UseAction action = state.attributes.heldStack.getUseAction();

View file

@ -48,7 +48,7 @@ public class WitchPonyModel extends EarthPonyModel<WitchRenderer.State> {
}
@Override
protected void positionheldItem(WitchRenderer.State state, Arm arm, MatrixStack matrices) {
public void positionheldItem(WitchRenderer.State state, Arm arm, MatrixStack matrices) {
super.positionheldItem(state, arm, matrices);
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(10));
}

View file

@ -78,7 +78,7 @@ public class UnicornModel<T extends PonyRenderState> extends EarthPonyModel<T> {
}
@Override
protected void positionheldItem(T state, Arm arm, MatrixStack matrices) {
public void positionheldItem(T state, Arm arm, MatrixStack matrices) {
super.positionheldItem(state, arm, matrices);
if (!PonyConfig.getInstance().tpsmagic.get() || !state.hasMagicGlow()) {

View file

@ -4,6 +4,7 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.minelittlepony.api.config.PonyConfig;
import com.minelittlepony.api.pony.Pony;
import com.minelittlepony.client.MineLittlePony;
import com.minelittlepony.client.render.entity.state.PonyRenderState;
import com.minelittlepony.common.util.render.RenderLayerUtil;
import org.jetbrains.annotations.Nullable;
@ -23,7 +24,7 @@ import net.minecraft.util.math.RotationAxis;
import net.minecraft.world.World;
public class LevitatingItemRenderer {
private VertexConsumerProvider getProvider(Pony pony, VertexConsumerProvider provider) {
public static VertexConsumerProvider getProvider(Pony pony, VertexConsumerProvider provider) {
final int color = pony.metadata().glowColor();
return layer -> {
if (layer.getVertexFormat() != VertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL) {
@ -59,7 +60,7 @@ public class LevitatingItemRenderer {
boolean doMagic = (mode.isFirstPerson() ? PonyConfig.getInstance().fpsmagic : PonyConfig.getInstance().tpsmagic).get() && state.hasMagicGlow();
if (doMagic && mode.isFirstPerson()) {
setupPerspective(entity, stack, left, matrices);
setupPerspective(state, stack, left, matrices);
}
original.call(itemRenderer, entity, stack, mode, left, matrices, vertices, world, light, overlay, seed);
@ -72,14 +73,11 @@ public class LevitatingItemRenderer {
stack.set(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, false);
}
float tickDelta = MinecraftClient.getInstance().getRenderTickCounter().getTickDelta(false) + entity.age;
float driftStrength = 0.002F;
float xDrift = MathHelper.sin(tickDelta / 20F) * driftStrength;
float zDrift = MathHelper.cos((tickDelta + 20) / 20F) * driftStrength;
float xDrift = MathHelper.sin(state.age / 20F) * driftStrength;
float zDrift = MathHelper.cos((state.age + 20) / 20F) * driftStrength;
float scale = 1.1F + (MathHelper.sin(tickDelta / 20F) + 1) * driftStrength;
float scale = 1.1F + (MathHelper.sin(state.age / 20F) + 1) * driftStrength;
matrices.scale(scale, scale, scale);
matrices.translate(0.015F + xDrift, 0.01F, 0.01F + zDrift);
@ -96,14 +94,14 @@ public class LevitatingItemRenderer {
/**
* Moves held items to look like they're floating in the player's field.
*/
private void setupPerspective(LivingEntity entity, ItemStack item, boolean left, MatrixStack stack) {
public static void setupPerspective(PonyRenderState state, ItemStack item, boolean left, MatrixStack stack) {
UseAction action = item.getUseAction();
boolean doNormal = entity.getItemUseTime() <= 0 || action == UseAction.NONE || (action == UseAction.CROSSBOW && CrossbowItem.isCharged(item));
boolean doNormal = state.itemUseTime <= 0 || action == UseAction.NONE || (action == UseAction.CROSSBOW && CrossbowItem.isCharged(item));
if (doNormal) { // eating, blocking, and drinking are not transformed. Only held items.
int sign = left ? 1 : -1;
float ticks = entity.age * sign;
float ticks = state.age * sign;
float floatAmount = -(float)Math.sin(ticks / 9F) / 40F;
float driftAmount = -(float)Math.cos(ticks / 6F) / 40F;

View file

@ -1,7 +1,10 @@
package com.minelittlepony.client.render.entity.feature;
import com.minelittlepony.api.config.PonyConfig;
import com.minelittlepony.api.model.*;
import com.minelittlepony.client.model.AbstractPonyModel;
import com.minelittlepony.client.model.ClientPonyModel;
import com.minelittlepony.client.render.LevitatingItemRenderer;
import com.minelittlepony.client.render.PonyRenderContext;
import com.minelittlepony.client.render.entity.state.PonyRenderState;
@ -9,12 +12,16 @@ import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.feature.PlayerHeldItemFeatureRenderer;
import net.minecraft.client.render.entity.state.PlayerEntityRenderState;
import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ModelTransformationMode;
import net.minecraft.util.Arm;
import net.minecraft.util.math.MathHelper;
import org.jetbrains.annotations.Nullable;
@SuppressWarnings(value = {"unchecked"})
public class HeldItemFeature<
S extends PonyRenderState,
M extends ClientPonyModel<S>
@ -27,6 +34,7 @@ public class HeldItemFeature<
this.context = context;
}
@SuppressWarnings(value = {"unchecked"})
@Deprecated
@Override
public final void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, PlayerEntityRenderState state, float limbAngle, float limbDistance) {
@ -50,4 +58,35 @@ public class HeldItemFeature<
matrices.pop();
}
}
@SuppressWarnings(value = {"unchecked"})
protected void renderItem(S state, @Nullable BakedModel model, ItemStack item, ModelTransformationMode mode, Arm arm, MatrixStack matrices, VertexConsumerProvider vertices, int light) {
if (context.getEquineManager().getModels().body() instanceof AbstractPonyModel m) {
m.positionheldItem(state, arm, matrices);
}
renderItem((PlayerEntityRenderState)state, model, item, mode, arm, matrices, vertices, light);
if (PonyConfig.getInstance().tpsmagic.get() && state.hasMagicGlow()) {
vertices = LevitatingItemRenderer.getProvider(state.pony, vertices);
if (item.hasGlint()) {
item = item.copy();
item.set(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, false);
}
float driftStrength = 0.002F;
float xDrift = MathHelper.sin(state.age / 10F) * driftStrength;
float zDrift = MathHelper.cos((state.age + 20) / 10F) * driftStrength;
float scale = 1.1F + (MathHelper.sin(state.age / 20F) + 1) * driftStrength;
matrices.scale(scale, scale, scale);
matrices.translate(0.045F + xDrift, 0.01F - 0.12F, 0.03F + zDrift);
renderItem((PlayerEntityRenderState)state, model, item, mode, arm, matrices, vertices, light);
matrices.scale(scale, scale, scale);
matrices.translate(0.1F, -0.1F, 0.1F);
matrices.translate(-0.03F - xDrift, -0.02F, -0.02F - zDrift);
renderItem((PlayerEntityRenderState)state, model, item, mode, arm, matrices, vertices, light);
}
}
}