minecraft-src/net/minecraft/client/renderer/CubeMap.java
2025-07-04 02:00:41 +03:00

124 lines
5.2 KiB
Java

package net.minecraft.client.renderer;
import com.mojang.blaze3d.ProjectionType;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.BufferUploader;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.blaze3d.vertex.VertexFormat;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.resources.ResourceLocation;
import org.joml.Matrix4f;
import org.joml.Matrix4fStack;
@Environment(EnvType.CLIENT)
public class CubeMap {
private static final int SIDES = 6;
private final ResourceLocation[] images = new ResourceLocation[6];
public CubeMap(ResourceLocation baseImageLocation) {
for (int i = 0; i < 6; i++) {
this.images[i] = baseImageLocation.withPath(baseImageLocation.getPath() + "_" + i + ".png");
}
}
public void render(Minecraft mc, float pitch, float yaw, float alpha) {
Tesselator tesselator = Tesselator.getInstance();
Matrix4f matrix4f = new Matrix4f().setPerspective(1.4835298F, (float)mc.getWindow().getWidth() / mc.getWindow().getHeight(), 0.05F, 10.0F);
RenderSystem.backupProjectionMatrix();
RenderSystem.setProjectionMatrix(matrix4f, ProjectionType.PERSPECTIVE);
Matrix4fStack matrix4fStack = RenderSystem.getModelViewStack();
matrix4fStack.pushMatrix();
matrix4fStack.rotationX((float) Math.PI);
RenderSystem.setShader(CoreShaders.POSITION_TEX_COLOR);
RenderSystem.enableBlend();
RenderSystem.disableCull();
RenderSystem.depthMask(false);
int i = 2;
for (int j = 0; j < 4; j++) {
matrix4fStack.pushMatrix();
float f = (j % 2 / 2.0F - 0.5F) / 256.0F;
float g = (j / 2 / 2.0F - 0.5F) / 256.0F;
float h = 0.0F;
matrix4fStack.translate(f, g, 0.0F);
matrix4fStack.rotateX(pitch * (float) (Math.PI / 180.0));
matrix4fStack.rotateY(yaw * (float) (Math.PI / 180.0));
for (int k = 0; k < 6; k++) {
RenderSystem.setShaderTexture(0, this.images[k]);
BufferBuilder bufferBuilder = tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR);
int l = Math.round(255.0F * alpha) / (j + 1);
if (k == 0) {
bufferBuilder.addVertex(-1.0F, -1.0F, 1.0F).setUv(0.0F, 0.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(-1.0F, 1.0F, 1.0F).setUv(0.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(1.0F, 1.0F, 1.0F).setUv(1.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(1.0F, -1.0F, 1.0F).setUv(1.0F, 0.0F).setWhiteAlpha(l);
}
if (k == 1) {
bufferBuilder.addVertex(1.0F, -1.0F, 1.0F).setUv(0.0F, 0.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(1.0F, 1.0F, 1.0F).setUv(0.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(1.0F, 1.0F, -1.0F).setUv(1.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(1.0F, -1.0F, -1.0F).setUv(1.0F, 0.0F).setWhiteAlpha(l);
}
if (k == 2) {
bufferBuilder.addVertex(1.0F, -1.0F, -1.0F).setUv(0.0F, 0.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(1.0F, 1.0F, -1.0F).setUv(0.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(-1.0F, 1.0F, -1.0F).setUv(1.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(-1.0F, -1.0F, -1.0F).setUv(1.0F, 0.0F).setWhiteAlpha(l);
}
if (k == 3) {
bufferBuilder.addVertex(-1.0F, -1.0F, -1.0F).setUv(0.0F, 0.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(-1.0F, 1.0F, -1.0F).setUv(0.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(-1.0F, 1.0F, 1.0F).setUv(1.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(-1.0F, -1.0F, 1.0F).setUv(1.0F, 0.0F).setWhiteAlpha(l);
}
if (k == 4) {
bufferBuilder.addVertex(-1.0F, -1.0F, -1.0F).setUv(0.0F, 0.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(-1.0F, -1.0F, 1.0F).setUv(0.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(1.0F, -1.0F, 1.0F).setUv(1.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(1.0F, -1.0F, -1.0F).setUv(1.0F, 0.0F).setWhiteAlpha(l);
}
if (k == 5) {
bufferBuilder.addVertex(-1.0F, 1.0F, 1.0F).setUv(0.0F, 0.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(-1.0F, 1.0F, -1.0F).setUv(0.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(1.0F, 1.0F, -1.0F).setUv(1.0F, 1.0F).setWhiteAlpha(l);
bufferBuilder.addVertex(1.0F, 1.0F, 1.0F).setUv(1.0F, 0.0F).setWhiteAlpha(l);
}
BufferUploader.drawWithShader(bufferBuilder.buildOrThrow());
}
matrix4fStack.popMatrix();
RenderSystem.colorMask(true, true, true, false);
}
RenderSystem.colorMask(true, true, true, true);
RenderSystem.restoreProjectionMatrix();
matrix4fStack.popMatrix();
RenderSystem.depthMask(true);
RenderSystem.enableCull();
RenderSystem.enableDepthTest();
}
public CompletableFuture<Void> preload(TextureManager texMngr, Executor backgroundExecutor) {
CompletableFuture<?>[] completableFutures = new CompletableFuture[6];
for (int i = 0; i < completableFutures.length; i++) {
completableFutures[i] = texMngr.preload(this.images[i], backgroundExecutor);
}
return CompletableFuture.allOf(completableFutures);
}
}