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 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); } }