minecraft-src/net/minecraft/client/renderer/ShapeRenderer.java
2025-07-04 02:49:36 +03:00

222 lines
10 KiB
Java

package net.minecraft.client.renderer;
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.core.Direction;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.VoxelShape;
import org.joml.Matrix4f;
import org.joml.Vector3f;
@Environment(EnvType.CLIENT)
public class ShapeRenderer {
public static void renderShape(PoseStack poseStack, VertexConsumer buffer, VoxelShape shape, double x, double y, double z, int color) {
PoseStack.Pose pose = poseStack.last();
shape.forAllEdges((g, h, j, k, l, m) -> {
Vector3f vector3f = new Vector3f((float)(k - g), (float)(l - h), (float)(m - j)).normalize();
buffer.addVertex(pose, (float)(g + x), (float)(h + y), (float)(j + z)).setColor(color).setNormal(pose, vector3f);
buffer.addVertex(pose, (float)(k + x), (float)(l + y), (float)(m + z)).setColor(color).setNormal(pose, vector3f);
});
}
public static void renderLineBox(PoseStack poseStack, VertexConsumer buffer, AABB box, float red, float green, float blue, float alpha) {
renderLineBox(poseStack, buffer, box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ, red, green, blue, alpha, red, green, blue);
}
public static void renderLineBox(
PoseStack poseStack,
VertexConsumer buffer,
double minX,
double minY,
double minZ,
double maxX,
double maxY,
double maxZ,
float red,
float green,
float blue,
float alpha
) {
renderLineBox(poseStack, buffer, minX, minY, minZ, maxX, maxY, maxZ, red, green, blue, alpha, red, green, blue);
}
public static void renderLineBox(
PoseStack poseStack,
VertexConsumer buffer,
double minX,
double minY,
double minZ,
double maxX,
double maxY,
double maxZ,
float red,
float green,
float blue,
float alpha,
float red2,
float green2,
float blue2
) {
PoseStack.Pose pose = poseStack.last();
float f = (float)minX;
float g = (float)minY;
float h = (float)minZ;
float i = (float)maxX;
float j = (float)maxY;
float k = (float)maxZ;
buffer.addVertex(pose, f, g, h).setColor(red, green2, blue2, alpha).setNormal(pose, 1.0F, 0.0F, 0.0F);
buffer.addVertex(pose, i, g, h).setColor(red, green2, blue2, alpha).setNormal(pose, 1.0F, 0.0F, 0.0F);
buffer.addVertex(pose, f, g, h).setColor(red2, green, blue2, alpha).setNormal(pose, 0.0F, 1.0F, 0.0F);
buffer.addVertex(pose, f, j, h).setColor(red2, green, blue2, alpha).setNormal(pose, 0.0F, 1.0F, 0.0F);
buffer.addVertex(pose, f, g, h).setColor(red2, green2, blue, alpha).setNormal(pose, 0.0F, 0.0F, 1.0F);
buffer.addVertex(pose, f, g, k).setColor(red2, green2, blue, alpha).setNormal(pose, 0.0F, 0.0F, 1.0F);
buffer.addVertex(pose, i, g, h).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, 1.0F, 0.0F);
buffer.addVertex(pose, i, j, h).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, 1.0F, 0.0F);
buffer.addVertex(pose, i, j, h).setColor(red, green, blue, alpha).setNormal(pose, -1.0F, 0.0F, 0.0F);
buffer.addVertex(pose, f, j, h).setColor(red, green, blue, alpha).setNormal(pose, -1.0F, 0.0F, 0.0F);
buffer.addVertex(pose, f, j, h).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, 0.0F, 1.0F);
buffer.addVertex(pose, f, j, k).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, 0.0F, 1.0F);
buffer.addVertex(pose, f, j, k).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, -1.0F, 0.0F);
buffer.addVertex(pose, f, g, k).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, -1.0F, 0.0F);
buffer.addVertex(pose, f, g, k).setColor(red, green, blue, alpha).setNormal(pose, 1.0F, 0.0F, 0.0F);
buffer.addVertex(pose, i, g, k).setColor(red, green, blue, alpha).setNormal(pose, 1.0F, 0.0F, 0.0F);
buffer.addVertex(pose, i, g, k).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, 0.0F, -1.0F);
buffer.addVertex(pose, i, g, h).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, 0.0F, -1.0F);
buffer.addVertex(pose, f, j, k).setColor(red, green, blue, alpha).setNormal(pose, 1.0F, 0.0F, 0.0F);
buffer.addVertex(pose, i, j, k).setColor(red, green, blue, alpha).setNormal(pose, 1.0F, 0.0F, 0.0F);
buffer.addVertex(pose, i, g, k).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, 1.0F, 0.0F);
buffer.addVertex(pose, i, j, k).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, 1.0F, 0.0F);
buffer.addVertex(pose, i, j, h).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, 0.0F, 1.0F);
buffer.addVertex(pose, i, j, k).setColor(red, green, blue, alpha).setNormal(pose, 0.0F, 0.0F, 1.0F);
}
public static void addChainedFilledBoxVertices(
PoseStack poseStack,
VertexConsumer buffer,
double minX,
double minY,
double minZ,
double maxX,
double maxY,
double maxZ,
float red,
float green,
float blue,
float alpha
) {
addChainedFilledBoxVertices(poseStack, buffer, (float)minX, (float)minY, (float)minZ, (float)maxX, (float)maxY, (float)maxZ, red, green, blue, alpha);
}
public static void addChainedFilledBoxVertices(
PoseStack poseStack,
VertexConsumer buffer,
float minX,
float minY,
float minZ,
float maxX,
float maxY,
float maxZ,
float red,
float green,
float blue,
float alpha
) {
Matrix4f matrix4f = poseStack.last().pose();
buffer.addVertex(matrix4f, minX, minY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, minY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, minY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, minY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, maxY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, maxY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, maxY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, minY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, maxY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, minY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, minY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, minY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, maxY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, maxY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, maxY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, minY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, maxY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, minY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, minY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, minY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, minY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, minY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, minY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, maxY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, maxY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, minX, maxY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, maxY, minZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, maxY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, maxY, maxZ).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, maxX, maxY, maxZ).setColor(red, green, blue, alpha);
}
public static void renderFace(
PoseStack poseStack,
VertexConsumer buffer,
Direction face,
float x1,
float y1,
float z1,
float x2,
float y2,
float z2,
float red,
float green,
float blue,
float alpha
) {
Matrix4f matrix4f = poseStack.last().pose();
switch (face) {
case DOWN:
buffer.addVertex(matrix4f, x1, y1, z1).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x2, y1, z1).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x2, y1, z2).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x1, y1, z2).setColor(red, green, blue, alpha);
break;
case UP:
buffer.addVertex(matrix4f, x1, y2, z1).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x1, y2, z2).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x2, y2, z2).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x2, y2, z1).setColor(red, green, blue, alpha);
break;
case NORTH:
buffer.addVertex(matrix4f, x1, y1, z1).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x1, y2, z1).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x2, y2, z1).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x2, y1, z1).setColor(red, green, blue, alpha);
break;
case SOUTH:
buffer.addVertex(matrix4f, x1, y1, z2).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x2, y1, z2).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x2, y2, z2).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x1, y2, z2).setColor(red, green, blue, alpha);
break;
case WEST:
buffer.addVertex(matrix4f, x1, y1, z1).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x1, y1, z2).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x1, y2, z2).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x1, y2, z1).setColor(red, green, blue, alpha);
break;
case EAST:
buffer.addVertex(matrix4f, x2, y1, z1).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x2, y2, z1).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x2, y2, z2).setColor(red, green, blue, alpha);
buffer.addVertex(matrix4f, x2, y1, z2).setColor(red, green, blue, alpha);
}
}
public static void renderVector(PoseStack poseStack, VertexConsumer buffer, Vector3f startPos, Vec3 vector, int color) {
PoseStack.Pose pose = poseStack.last();
buffer.addVertex(pose, startPos).setColor(color).setNormal(pose, (float)vector.x, (float)vector.y, (float)vector.z);
buffer.addVertex(pose, (float)(startPos.x() + vector.x), (float)(startPos.y() + vector.y), (float)(startPos.z() + vector.z))
.setColor(color)
.setNormal(pose, (float)vector.x, (float)vector.y, (float)vector.z);
}
}