package net.minecraft.client.renderer; import com.mojang.blaze3d.vertex.ByteBufferBuilder; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexMultiConsumer; import java.util.Optional; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.renderer.MultiBufferSource.BufferSource; import net.minecraft.util.ARGB; @Environment(EnvType.CLIENT) public class OutlineBufferSource implements MultiBufferSource { private final BufferSource bufferSource; private final BufferSource outlineBufferSource = MultiBufferSource.immediate(new ByteBufferBuilder(1536)); private int teamR = 255; private int teamG = 255; private int teamB = 255; private int teamA = 255; public OutlineBufferSource(BufferSource bufferSource) { this.bufferSource = bufferSource; } @Override public VertexConsumer getBuffer(RenderType renderType) { if (renderType.isOutline()) { VertexConsumer vertexConsumer = this.outlineBufferSource.getBuffer(renderType); return new OutlineBufferSource.EntityOutlineGenerator(vertexConsumer, this.teamR, this.teamG, this.teamB, this.teamA); } else { VertexConsumer vertexConsumer = this.bufferSource.getBuffer(renderType); Optional optional = renderType.outline(); if (optional.isPresent()) { VertexConsumer vertexConsumer2 = this.outlineBufferSource.getBuffer((RenderType)optional.get()); OutlineBufferSource.EntityOutlineGenerator entityOutlineGenerator = new OutlineBufferSource.EntityOutlineGenerator( vertexConsumer2, this.teamR, this.teamG, this.teamB, this.teamA ); return VertexMultiConsumer.create(entityOutlineGenerator, vertexConsumer); } else { return vertexConsumer; } } } public void setColor(int red, int green, int blue, int alpha) { this.teamR = red; this.teamG = green; this.teamB = blue; this.teamA = alpha; } public void endOutlineBatch() { this.outlineBufferSource.endBatch(); } @Environment(EnvType.CLIENT) record EntityOutlineGenerator(VertexConsumer delegate, int color) implements VertexConsumer { public EntityOutlineGenerator(VertexConsumer delegate, int defaultR, int defaultG, int defaultB, int defaultA) { this(delegate, ARGB.color(defaultA, defaultR, defaultG, defaultB)); } @Override public VertexConsumer addVertex(float x, float y, float z) { this.delegate.addVertex(x, y, z).setColor(this.color); return this; } @Override public VertexConsumer setColor(int red, int green, int blue, int alpha) { return this; } @Override public VertexConsumer setUv(float u, float v) { this.delegate.setUv(u, v); return this; } @Override public VertexConsumer setUv1(int u, int v) { return this; } @Override public VertexConsumer setUv2(int u, int v) { return this; } @Override public VertexConsumer setNormal(float normalX, float normalY, float normalZ) { return this; } } }