mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-02-20 03:44:23 +01:00
Render a damage overlay on the crystal heart
This commit is contained in:
parent
b0e61fbd11
commit
d39c003c2e
2 changed files with 47 additions and 9 deletions
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue