mirror of
https://github.com/MineLittlePony/MineLittlePony.git
synced 2024-11-22 12:37:59 +01:00
Allow gear better control of how they're positioned
This commit is contained in:
parent
b686bba005
commit
bf7fe63b81
4 changed files with 30 additions and 44 deletions
|
@ -2,6 +2,7 @@ package com.minelittlepony.api.model.gear;
|
|||
|
||||
import net.minecraft.client.render.RenderLayer;
|
||||
import net.minecraft.client.render.VertexConsumer;
|
||||
import net.minecraft.client.render.entity.model.EntityModel;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
@ -9,10 +10,9 @@ import net.minecraft.util.Identifier;
|
|||
import com.minelittlepony.api.model.BodyPart;
|
||||
import com.minelittlepony.api.model.IModel;
|
||||
import com.minelittlepony.api.pony.meta.Wearable;
|
||||
import com.minelittlepony.client.model.IPonyModel;
|
||||
import com.minelittlepony.client.render.entity.feature.GearFeature;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
|
@ -57,32 +57,41 @@ public interface IGear {
|
|||
}
|
||||
|
||||
/**
|
||||
* Orients this wearable.
|
||||
* Applies body transformations for this wearable
|
||||
*/
|
||||
default void setModelAttributes(IModel model, Entity entity) {
|
||||
|
||||
default <M extends EntityModel<?> & IPonyModel<?>> void transform(M model, MatrixStack matrices) {
|
||||
BodyPart part = getGearLocation();
|
||||
model.transform(part, matrices);
|
||||
model.getBodyPart(part).rotate(matrices);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the model's various rotation angles.
|
||||
*
|
||||
* See {@link AbstractPonyMode.setRotationAndAngle} for an explanation of the various parameters.
|
||||
*/
|
||||
default void pose(boolean rainboom, UUID interpolatorId, float move, float swing, float bodySwing, float ticks) {
|
||||
|
||||
default void pose(IModel model, Entity entity, boolean rainboom, UUID interpolatorId, float move, float swing, float bodySwing, float ticks) {
|
||||
setModelAttributes(model, entity);
|
||||
pose(rainboom, interpolatorId, move, swing, bodySwing, ticks);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use pose(model, entity, rainboom, interpolatorId, move, swing, bodySwing, ticks) instead
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
default void setModelAttributes(IModel model, Entity entity) { }
|
||||
|
||||
/**
|
||||
* @deprecated Use pose(model, entity, rainboom, interpolatorId, move, swing, bodySwing, ticks) instead
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
default void pose(boolean rainboom, UUID interpolatorId, float move, float swing, float bodySwing, float ticks) { }
|
||||
|
||||
/**
|
||||
* Renders this model component.
|
||||
*/
|
||||
void render(MatrixStack stack, VertexConsumer vertices, int overlayUv, int lightUv, float red, float green, float blue, float alpha, UUID interpolatorId);
|
||||
|
||||
/**
|
||||
* Sets whether this part should be rendered.
|
||||
*/
|
||||
default void setVisible(boolean visible) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* A render context for instance of IGear.
|
||||
*
|
||||
|
@ -102,11 +111,6 @@ public interface IGear {
|
|||
return gear.canRender(model, entity);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
default M getEntityModel() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the default texture to use for this entity and wearable.
|
||||
*
|
||||
|
|
|
@ -50,12 +50,7 @@ public class ChristmasHat extends AbstractGear implements PonyModelConstants {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setModelAttributes(IModel model, Entity entity) {
|
||||
tint = model.getMetadata().getGlowColor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pose(boolean rainboom, UUID interpolatorId, float move, float swing, float bodySwing, float ticks) {
|
||||
public void pose(IModel model, Entity entity, boolean rainboom, UUID interpolatorId, float move, float swing, float bodySwing, float ticks) {
|
||||
float pi = PI * (float) Math.pow(swing, 16);
|
||||
|
||||
float mve = move * 0.6662f;
|
||||
|
@ -65,6 +60,7 @@ public class ChristmasHat extends AbstractGear implements PonyModelConstants {
|
|||
|
||||
bodySwing += 0.1F;
|
||||
|
||||
tint = model.getMetadata().getGlowColor();
|
||||
left.roll = bodySwing;
|
||||
right.roll = -bodySwing;
|
||||
}
|
||||
|
|
|
@ -28,8 +28,6 @@ public class SaddleBags extends AbstractGear implements PonyModelConstants {
|
|||
|
||||
float dropAmount = 0;
|
||||
|
||||
private IModel model;
|
||||
|
||||
public SaddleBags(ModelPart tree) {
|
||||
strap = tree.getChild("strap");
|
||||
leftBag = tree.getChild("left_bag");
|
||||
|
@ -37,18 +35,13 @@ public class SaddleBags extends AbstractGear implements PonyModelConstants {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setModelAttributes(IModel model, Entity entity) {
|
||||
this.model = model;
|
||||
|
||||
public void pose(IModel model, Entity entity, boolean rainboom, UUID interpolatorId, float move, float swing, float bodySwing, float ticks) {
|
||||
hangLow = false;
|
||||
|
||||
if (model instanceof IPegasus) {
|
||||
hangLow = model.canFly() && ((IPegasus)model).wingsAreOpen();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pose(boolean rainboom, UUID interpolatorId, float move, float swing, float bodySwing, float ticks) {
|
||||
float pi = PI * (float) Math.pow(swing, 16);
|
||||
|
||||
float mve = move * 0.6662f;
|
||||
|
@ -68,6 +61,7 @@ public class SaddleBags extends AbstractGear implements PonyModelConstants {
|
|||
rightBag.roll = -bodySwing;
|
||||
|
||||
dropAmount = hangLow ? 0.15F : 0;
|
||||
dropAmount = model.getMetadata().getInterpolator(interpolatorId).interpolate("dropAmount", dropAmount, 3);
|
||||
}
|
||||
|
||||
public void sethangingLow(boolean veryLow) {
|
||||
|
@ -76,8 +70,6 @@ public class SaddleBags extends AbstractGear implements PonyModelConstants {
|
|||
|
||||
@Override
|
||||
public void render(MatrixStack stack, VertexConsumer renderContext, int overlayUv, int lightUv, float red, float green, float blue, float alpha, UUID interpolatorId) {
|
||||
dropAmount = model.getMetadata().getInterpolator(interpolatorId).interpolate("dropAmount", dropAmount, 3);
|
||||
|
||||
stack.push();
|
||||
stack.translate(0, dropAmount, 0);
|
||||
|
||||
|
|
|
@ -69,8 +69,7 @@ public class GearFeature<T extends LivingEntity, M extends EntityModel<T> & IPon
|
|||
.forEach(entry -> {
|
||||
stack.push();
|
||||
BodyPart part = entry.gear.getGearLocation();
|
||||
model.transform(part, stack);
|
||||
model.getBodyPart(part).rotate(stack);
|
||||
entry.gear.transform(model, stack);
|
||||
|
||||
if (entry.gear instanceof IStackable) {
|
||||
renderStackingOffsets.compute(part, (k, v) -> {
|
||||
|
@ -89,13 +88,8 @@ public class GearFeature<T extends LivingEntity, M extends EntityModel<T> & IPon
|
|||
}
|
||||
|
||||
private void renderGear(M model, T entity, IGear gear, MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, float limbDistance, float limbAngle, float tickDelta) {
|
||||
gear.setModelAttributes(model, entity);
|
||||
gear.pose(model.getAttributes().isGoingFast, entity.getUuid(), limbDistance, limbAngle, model.getWobbleAmount(), tickDelta);
|
||||
|
||||
RenderLayer layer = RenderLayer.getEntityTranslucent(gear.getTexture(entity, getContext()));
|
||||
|
||||
VertexConsumer vertexConsumer = renderContext.getBuffer(layer);
|
||||
gear.render(stack, vertexConsumer, lightUv, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1, entity.getUuid());
|
||||
gear.pose(model, entity, model.getAttributes().isGoingFast, entity.getUuid(), limbDistance, limbAngle, model.getWobbleAmount(), tickDelta);
|
||||
gear.render(stack, renderContext.getBuffer(RenderLayer.getEntityTranslucent(gear.getTexture(entity, getContext()))), lightUv, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1, entity.getUuid());
|
||||
}
|
||||
|
||||
static record Entry(IGear gear, Wearable wearable) {}
|
||||
|
|
Loading…
Reference in a new issue