Render a damage overlay on the crystal heart

This commit is contained in:
Sollace 2023-08-30 21:33:13 +01:00
parent b0e61fbd11
commit d39c003c2e
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
2 changed files with 47 additions and 9 deletions

View file

@ -2,18 +2,22 @@ package com.minelittlepony.unicopia.client.render;
import com.minelittlepony.unicopia.entity.FloatingArtefactEntity;
import com.minelittlepony.unicopia.item.UItems;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.OverlayVertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.VertexConsumers;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.render.model.ModelLoader;
import net.minecraft.client.render.model.json.ModelTransformationMode;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.PlayerScreenHandler;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RotationAxis;
public class FloatingArtefactEntityRenderer extends EntityRenderer<FloatingArtefactEntity> {
@ -26,7 +30,7 @@ public class FloatingArtefactEntityRenderer extends EntityRenderer<FloatingArtef
}
@Override
public void render(FloatingArtefactEntity entity, float yaw, float timeDelta, MatrixStack transforms, VertexConsumerProvider renderContext, int lightUv) {
public void render(FloatingArtefactEntity entity, float yaw, float timeDelta, MatrixStack matrices, VertexConsumerProvider vertices, int lightUv) {
ItemStack stack = entity.getStack();
@ -42,16 +46,18 @@ public class FloatingArtefactEntityRenderer extends EntityRenderer<FloatingArtef
float scale = 1.6F;
transforms.push();
transforms.scale(scale, scale, scale);
transforms.translate(0, verticalOffset + variance * modelScaleY, 0);
transforms.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(entity.getRotation(timeDelta)));
matrices.push();
matrices.scale(scale, scale, scale);
matrices.translate(0, verticalOffset + variance * modelScaleY, 0);
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(entity.getRotation(timeDelta)));
itemRenderer.renderItem(stack, ModelTransformationMode.GROUND, false, transforms, renderContext, lightUv, OverlayTexture.DEFAULT_UV, model);
int destructionStage = (int)(MathHelper.clamp(1 - (entity.getHealth() / entity.getMaxHealth()), 0, 1) * (ModelLoader.field_32983 - 1));
transforms.pop();
itemRenderer.renderItem(stack, ModelTransformationMode.GROUND, false, matrices, getDestructionOverlayProvider(matrices, vertices, destructionStage), lightUv, OverlayTexture.DEFAULT_UV, model);
super.render(entity, yaw, timeDelta, transforms, renderContext, lightUv);
matrices.pop();
super.render(entity, yaw, timeDelta, matrices, vertices, lightUv);
}
@Override
@ -59,4 +65,17 @@ public class FloatingArtefactEntityRenderer extends EntityRenderer<FloatingArtef
return PlayerScreenHandler.BLOCK_ATLAS_TEXTURE;
}
static VertexConsumerProvider getDestructionOverlayProvider(MatrixStack matrices, VertexConsumerProvider vertices, int stage) {
if (stage <= 0) {
return vertices;
}
final MatrixStack.Entry entry = matrices.peek();
final OverlayVertexConsumer destructionOverlay = new OverlayVertexConsumer(
MinecraftClient.getInstance().getBufferBuilders().getEffectVertexConsumers().getBuffer(RenderLayers.getCrumbling(stage)),
entry.getPositionMatrix(),
entry.getNormalMatrix(),
4F
);
return layer -> layer.hasCrumbling() ? VertexConsumers.union(destructionOverlay, vertices.getBuffer(layer)) : vertices.getBuffer(layer);
}
}

View file

@ -1,5 +1,6 @@
package com.minelittlepony.unicopia.client.render;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
@ -7,8 +8,10 @@ import com.minelittlepony.common.util.Color;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.RenderPhase;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.render.model.ModelLoader;
import net.minecraft.util.Identifier;
import net.minecraft.util.Util;
@ -16,6 +19,18 @@ public final class RenderLayers extends RenderLayer {
private RenderLayers() {
super(null, null, null, 0, false, false, null, null);
}
private static final List<RenderLayer> BLOCK_DESTRUCTION_STAGE_LAYERS = ModelLoader.BLOCK_DESTRUCTION_STAGE_TEXTURES.stream().map(texture -> {
RenderPhase.Texture texture2 = new RenderPhase.Texture(texture, false, false);
return (RenderLayer)RenderLayer.of("alpha_crumbling", VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL, VertexFormat.DrawMode.QUADS, 256,
MultiPhaseParameters.builder()
.program(CRUMBLING_PROGRAM)
.texture(texture2)
.writeMaskState(COLOR_MASK)
.cull(DISABLE_CULLING)
.depthTest(EQUAL_DEPTH_TEST)
.transparency(CRUMBLING_TRANSPARENCY)
.build(false));
}).toList();
private static final RenderLayer MAGIC_NO_COLOR = of("magic_no_color", VertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL,
VertexFormat.DrawMode.QUADS, 256, true, true, MultiPhaseParameters.builder()
@ -52,6 +67,10 @@ public final class RenderLayers extends RenderLayer {
.build(false));
});
public static RenderLayer getCrumbling(int stage) {
return BLOCK_DESTRUCTION_STAGE_LAYERS.get(stage);
}
public static RenderLayer getMagicNoColor() {
return MAGIC_NO_COLOR;
}