From e9e57cb9491f9747512374b0af9f67b362db919f Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 21 Jan 2021 11:22:09 +0200 Subject: [PATCH] Fixed shield rendering weirdly with fabulous graphics --- .../client/particle/SphereParticle.java | 5 +- .../unicopia/client/render/RenderLayers.java | 71 ++++++++++++++++--- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java b/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java index 02a9ba1d..4101c1cf 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java +++ b/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java @@ -120,6 +120,7 @@ public class SphereParticle extends Particle implements Attachment { } MatrixStack matrices = new MatrixStack(); + VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); model.setPosition( MathHelper.lerp(tickDelta, prevPosX, x) - camera.getPos().x, @@ -130,8 +131,10 @@ public class SphereParticle extends Particle implements Attachment { float lerpedRad = MathHelper.lerp(tickDelta, prevRadius, radius); - VertexConsumer buffer = immediate.getBuffer(RenderLayers.magic()); + VertexConsumer buffer; + buffer = immediate.getBuffer(RenderLayers.getTintedTexturedLayer(red, green, blue, alpha)); model.render(matrices, lerpedRad + 0.1F, buffer, 1, 1, red, green, blue, alpha); + buffer = immediate.getBuffer(RenderLayers.getTintedTexturedLayer(red * 0.9F, green * 0.9F, blue * 0.9F, Math.min(1, alpha + 0.2F))); model.render(matrices, lerpedRad - 0.1F, buffer, 1, 1, red * 0.9F, green * 0.9F, blue * 0.9F, Math.min(1, alpha + 0.2F)); immediate.draw(); diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/RenderLayers.java b/src/main/java/com/minelittlepony/unicopia/client/render/RenderLayers.java index 7d9f116b..7947e993 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/RenderLayers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/RenderLayers.java @@ -1,6 +1,11 @@ package com.minelittlepony.unicopia.client.render; +import com.mojang.blaze3d.platform.GlStateManager.DstFactor; +import com.mojang.blaze3d.platform.GlStateManager.SrcFactor; +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; @@ -11,15 +16,63 @@ public final class RenderLayers extends RenderLayer { super(name, vertexFormat, drawMode, expectedBufferSize, hasCrumbling, translucent, startAction, endAction); } - private static final RenderLayer MAGIC = of("mlp_magic_glow", VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL, 7, 256, RenderLayer.MultiPhaseParameters.builder() - .texture(NO_TEXTURE) - .writeMaskState(COLOR_MASK) - .transparency(LIGHTNING_TRANSPARENCY) - .lightmap(DISABLE_LIGHTMAP) - .cull(DISABLE_CULLING) - .build(false)); + protected static final RenderPhase.Transparency GLOWING_TRANSPARENCY = new RenderPhase.Transparency("glowing_transparency", () -> { + RenderSystem.enableBlend(); + RenderSystem.blendFuncSeparate( + SrcFactor.CONSTANT_COLOR, DstFactor.ONE, + SrcFactor.ONE, DstFactor.ZERO); + }, () -> { + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + }); - public static RenderLayer magic() { - return MAGIC; + public static RenderLayer getTintedTexturedLayer(float red, float green, float blue, float alpha) { + return RenderLayer.of("mlp_tint_layer", VertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, 7, 256, true, true, RenderLayer.MultiPhaseParameters.builder() + .texture(new Color(red, green, blue, alpha)) + .writeMaskState(COLOR_MASK) + .alpha(ONE_TENTH_ALPHA) + .transparency(GLOWING_TRANSPARENCY) + .shadeModel(SMOOTH_SHADE_MODEL) + .lightmap(DISABLE_LIGHTMAP) + .overlay(DISABLE_OVERLAY_COLOR) + .cull(DISABLE_CULLING) + .build(true)); + } + + private static class Color extends Texture { + + private final float red; + private final float green; + private final float blue; + private final float alpha; + + public Color(float red, float green, float blue, float alpha) { + super(); + this.red = red; + this.green = green; + this.blue = blue; + this.alpha = alpha; + } + + @Override + public void startDrawing() { + RenderSystem.blendColor(red, green, blue, alpha); + super.startDrawing(); + } + + @Override + public void endDrawing() { + super.endDrawing(); + RenderSystem.blendColor(1, 1, 1, 1); + } + + @Override + public boolean equals(Object other) { + return super.equals(other) + && ((Color)other).red == red + && ((Color)other).green == green + && ((Color)other).blue == blue + && ((Color)other).alpha == alpha; + } } }