minecraft-src/net/minecraft/client/renderer/entity/LightningBoltRenderer.java
2025-07-04 03:45:38 +03:00

149 lines
4.3 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.EntityRendererProvider.Context;
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(Context context) {
super(context);
}
public void render(LightningBoltRenderState lightningBoltRenderState, PoseStack poseStack, MultiBufferSource multiBufferSource, int i) {
float[] fs = new float[8];
float[] gs = new float[8];
float f = 0.0F;
float g = 0.0F;
RandomSource randomSource = RandomSource.create(lightningBoltRenderState.seed);
for (int j = 7; j >= 0; j--) {
fs[j] = f;
gs[j] = g;
f += randomSource.nextInt(11) - 5;
g += randomSource.nextInt(11) - 5;
}
VertexConsumer vertexConsumer = multiBufferSource.getBuffer(RenderType.lightning());
Matrix4f matrix4f = poseStack.last().pose();
for (int k = 0; k < 4; k++) {
RandomSource randomSource2 = RandomSource.create(lightningBoltRenderState.seed);
for (int l = 0; l < 3; l++) {
int m = 7;
int n = 0;
if (l > 0) {
m = 7 - l;
}
if (l > 0) {
n = m - 2;
}
float h = fs[m] - f;
float o = gs[m] - g;
for (int p = m; p >= n; p--) {
float q = h;
float r = o;
if (l == 0) {
h += randomSource2.nextInt(11) - 5;
o += randomSource2.nextInt(11) - 5;
} else {
h += randomSource2.nextInt(31) - 15;
o += randomSource2.nextInt(31) - 15;
}
float s = 0.5F;
float t = 0.45F;
float u = 0.45F;
float v = 0.5F;
float w = 0.1F + k * 0.2F;
if (l == 0) {
w *= p * 0.1F + 1.0F;
}
float x = 0.1F + k * 0.2F;
if (l == 0) {
x *= (p - 1.0F) * 0.1F + 1.0F;
}
quad(matrix4f, vertexConsumer, h, o, p, q, r, 0.45F, 0.45F, 0.5F, w, x, false, false, true, false);
quad(matrix4f, vertexConsumer, h, o, p, q, r, 0.45F, 0.45F, 0.5F, w, x, true, false, true, true);
quad(matrix4f, vertexConsumer, h, o, p, q, r, 0.45F, 0.45F, 0.5F, w, x, true, true, false, true);
quad(matrix4f, vertexConsumer, h, o, p, q, r, 0.45F, 0.45F, 0.5F, w, x, 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 lightningBolt, LightningBoltRenderState lightningBoltRenderState, float f) {
super.extractRenderState(lightningBolt, lightningBoltRenderState, f);
lightningBoltRenderState.seed = lightningBolt.seed;
}
protected boolean affectedByCulling(LightningBolt lightningBolt) {
return false;
}
}