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.entity.FloatingArtefactEntity;
import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.UItems;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.OverlayVertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider; 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.EntityRenderer;
import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.render.model.BakedModel; 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.render.model.json.ModelTransformationMode;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.screen.PlayerScreenHandler;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RotationAxis; import net.minecraft.util.math.RotationAxis;
public class FloatingArtefactEntityRenderer extends EntityRenderer<FloatingArtefactEntity> { public class FloatingArtefactEntityRenderer extends EntityRenderer<FloatingArtefactEntity> {
@ -26,7 +30,7 @@ public class FloatingArtefactEntityRenderer extends EntityRenderer<FloatingArtef
} }
@Override @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(); ItemStack stack = entity.getStack();
@ -42,16 +46,18 @@ public class FloatingArtefactEntityRenderer extends EntityRenderer<FloatingArtef
float scale = 1.6F; float scale = 1.6F;
transforms.push(); matrices.push();
transforms.scale(scale, scale, scale); matrices.scale(scale, scale, scale);
transforms.translate(0, verticalOffset + variance * modelScaleY, 0); matrices.translate(0, verticalOffset + variance * modelScaleY, 0);
transforms.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(entity.getRotation(timeDelta))); 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 @Override
@ -59,4 +65,17 @@ public class FloatingArtefactEntityRenderer extends EntityRenderer<FloatingArtef
return PlayerScreenHandler.BLOCK_ATLAS_TEXTURE; 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; package com.minelittlepony.unicopia.client.render;
import java.util.List;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import java.util.function.Function; import java.util.function.Function;
@ -7,8 +8,10 @@ import com.minelittlepony.common.util.Color;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.RenderPhase;
import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats; import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.render.model.ModelLoader;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.Util; import net.minecraft.util.Util;
@ -16,6 +19,18 @@ public final class RenderLayers extends RenderLayer {
private RenderLayers() { private RenderLayers() {
super(null, null, null, 0, false, false, null, null); 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, 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() VertexFormat.DrawMode.QUADS, 256, true, true, MultiPhaseParameters.builder()
@ -52,6 +67,10 @@ public final class RenderLayers extends RenderLayer {
.build(false)); .build(false));
}); });
public static RenderLayer getCrumbling(int stage) {
return BLOCK_DESTRUCTION_STAGE_LAYERS.get(stage);
}
public static RenderLayer getMagicNoColor() { public static RenderLayer getMagicNoColor() {
return MAGIC_NO_COLOR; return MAGIC_NO_COLOR;
} }