94 lines
2.9 KiB
Java
94 lines
2.9 KiB
Java
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<RenderType> 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;
|
|
}
|
|
}
|
|
}
|