package com.minelittlepony.client.render; 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.util.Identifier; import net.minecraft.util.Util; import com.mojang.blaze3d.systems.RenderSystem; import com.minelittlepony.common.util.Color; import java.util.function.BiFunction; public abstract class MagicGlow extends RenderPhase { private MagicGlow(String name, Runnable beginAction, Runnable endAction) { super(name, beginAction, endAction); } private static final RenderLayer MAGIC = RenderLayer.of("mlp_magic_glow", VertexFormats.POSITION_COLOR_LIGHT, VertexFormat.DrawMode.QUADS, 256, RenderLayer.MultiPhaseParameters.builder() .shader(EYES_SHADER) .writeMaskState(COLOR_MASK) .depthTest(LEQUAL_DEPTH_TEST) .transparency(LIGHTNING_TRANSPARENCY) .lightmap(DISABLE_LIGHTMAP) .cull(DISABLE_CULLING) .build(false)); private static final BiFunction TINTED_LAYER = Util.memoize((texture, color) -> { return RenderLayer.of("mlp_tint_layer", VertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, VertexFormat.DrawMode.QUADS, 256, true, true, RenderLayer.MultiPhaseParameters.builder() .texture(new Colored(texture, color)) .shader(EYES_SHADER) .writeMaskState(COLOR_MASK) .depthTest(LEQUAL_DEPTH_TEST) .transparency(LIGHTNING_TRANSPARENCY) .lightmap(DISABLE_LIGHTMAP) .cull(DISABLE_CULLING) .build(true)); }); public static RenderLayer getRenderLayer() { return MAGIC; } public static RenderLayer getTintedTexturedLayer(Identifier texture, float red, float green, float blue, float alpha) { return TINTED_LAYER.apply(texture, Color.argbToHex(alpha, red, green, blue)); } private static class Colored extends Texture { private final float red; private final float green; private final float blue; private final float alpha; public Colored(Identifier texture, int color) { super(texture, false, false); this.red = Color.r(color); this.green = Color.g(color); this.blue = Color.b(color); this.alpha = Color.a(color); } @Override public void startDrawing() { RenderSystem.setShaderColor(red, green, blue, alpha); super.startDrawing(); } @Override public void endDrawing() { super.endDrawing(); RenderSystem.setShaderColor(1, 1, 1, 1); } @Override public boolean equals(Object other) { return super.equals(other) && ((Colored)other).red == red && ((Colored)other).green == green && ((Colored)other).blue == blue && ((Colored)other).alpha == alpha; } } }