148 lines
4.2 KiB
Java
148 lines
4.2 KiB
Java
package net.minecraft.client.renderer.entity;
|
|
|
|
import com.mojang.blaze3d.vertex.PoseStack;
|
|
import com.mojang.blaze3d.vertex.VertexConsumer;
|
|
import net.fabricmc.api.EnvType;
|
|
import net.fabricmc.api.Environment;
|
|
import net.minecraft.client.renderer.MultiBufferSource;
|
|
import net.minecraft.client.renderer.RenderType;
|
|
import net.minecraft.client.renderer.entity.state.LightningBoltRenderState;
|
|
import net.minecraft.util.RandomSource;
|
|
import net.minecraft.world.entity.LightningBolt;
|
|
import org.joml.Matrix4f;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public class LightningBoltRenderer extends EntityRenderer<LightningBolt, LightningBoltRenderState> {
|
|
public LightningBoltRenderer(EntityRendererProvider.Context context) {
|
|
super(context);
|
|
}
|
|
|
|
public void render(LightningBoltRenderState renderState, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) {
|
|
float[] fs = new float[8];
|
|
float[] gs = new float[8];
|
|
float f = 0.0F;
|
|
float g = 0.0F;
|
|
RandomSource randomSource = RandomSource.create(renderState.seed);
|
|
|
|
for (int i = 7; i >= 0; i--) {
|
|
fs[i] = f;
|
|
gs[i] = g;
|
|
f += randomSource.nextInt(11) - 5;
|
|
g += randomSource.nextInt(11) - 5;
|
|
}
|
|
|
|
VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderType.lightning());
|
|
Matrix4f matrix4f = poseStack.last().pose();
|
|
|
|
for (int j = 0; j < 4; j++) {
|
|
RandomSource randomSource2 = RandomSource.create(renderState.seed);
|
|
|
|
for (int k = 0; k < 3; k++) {
|
|
int l = 7;
|
|
int m = 0;
|
|
if (k > 0) {
|
|
l = 7 - k;
|
|
}
|
|
|
|
if (k > 0) {
|
|
m = l - 2;
|
|
}
|
|
|
|
float h = fs[l] - f;
|
|
float n = gs[l] - g;
|
|
|
|
for (int o = l; o >= m; o--) {
|
|
float p = h;
|
|
float q = n;
|
|
if (k == 0) {
|
|
h += randomSource2.nextInt(11) - 5;
|
|
n += randomSource2.nextInt(11) - 5;
|
|
} else {
|
|
h += randomSource2.nextInt(31) - 15;
|
|
n += randomSource2.nextInt(31) - 15;
|
|
}
|
|
|
|
float r = 0.5F;
|
|
float s = 0.45F;
|
|
float t = 0.45F;
|
|
float u = 0.5F;
|
|
float v = 0.1F + j * 0.2F;
|
|
if (k == 0) {
|
|
v *= o * 0.1F + 1.0F;
|
|
}
|
|
|
|
float w = 0.1F + j * 0.2F;
|
|
if (k == 0) {
|
|
w *= (o - 1.0F) * 0.1F + 1.0F;
|
|
}
|
|
|
|
quad(matrix4f, vertexConsumer, h, n, o, p, q, 0.45F, 0.45F, 0.5F, v, w, false, false, true, false);
|
|
quad(matrix4f, vertexConsumer, h, n, o, p, q, 0.45F, 0.45F, 0.5F, v, w, true, false, true, true);
|
|
quad(matrix4f, vertexConsumer, h, n, o, p, q, 0.45F, 0.45F, 0.5F, v, w, true, true, false, true);
|
|
quad(matrix4f, vertexConsumer, h, n, o, p, q, 0.45F, 0.45F, 0.5F, v, w, false, true, false, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void quad(
|
|
Matrix4f pose,
|
|
VertexConsumer buffer,
|
|
float x1,
|
|
float z1,
|
|
int sectionY,
|
|
float x2,
|
|
float z2,
|
|
float red,
|
|
float green,
|
|
float blue,
|
|
float innerThickness,
|
|
float outerThickness,
|
|
boolean addThicknessLeftSideX,
|
|
boolean addThicknessLeftSideZ,
|
|
boolean addThicknessRightSideX,
|
|
boolean addThicknessRightSideZ
|
|
) {
|
|
buffer.addVertex(
|
|
pose,
|
|
x1 + (addThicknessLeftSideX ? outerThickness : -outerThickness),
|
|
(float)(sectionY * 16),
|
|
z1 + (addThicknessLeftSideZ ? outerThickness : -outerThickness)
|
|
)
|
|
.setColor(red, green, blue, 0.3F);
|
|
buffer.addVertex(
|
|
pose,
|
|
x2 + (addThicknessLeftSideX ? innerThickness : -innerThickness),
|
|
(float)((sectionY + 1) * 16),
|
|
z2 + (addThicknessLeftSideZ ? innerThickness : -innerThickness)
|
|
)
|
|
.setColor(red, green, blue, 0.3F);
|
|
buffer.addVertex(
|
|
pose,
|
|
x2 + (addThicknessRightSideX ? innerThickness : -innerThickness),
|
|
(float)((sectionY + 1) * 16),
|
|
z2 + (addThicknessRightSideZ ? innerThickness : -innerThickness)
|
|
)
|
|
.setColor(red, green, blue, 0.3F);
|
|
buffer.addVertex(
|
|
pose,
|
|
x1 + (addThicknessRightSideX ? outerThickness : -outerThickness),
|
|
(float)(sectionY * 16),
|
|
z1 + (addThicknessRightSideZ ? outerThickness : -outerThickness)
|
|
)
|
|
.setColor(red, green, blue, 0.3F);
|
|
}
|
|
|
|
public LightningBoltRenderState createRenderState() {
|
|
return new LightningBoltRenderState();
|
|
}
|
|
|
|
public void extractRenderState(LightningBolt entity, LightningBoltRenderState reusedState, float partialTick) {
|
|
super.extractRenderState(entity, reusedState, partialTick);
|
|
reusedState.seed = entity.seed;
|
|
}
|
|
|
|
protected boolean affectedByCulling(LightningBolt display) {
|
|
return false;
|
|
}
|
|
}
|