135 lines
6.8 KiB
Java
135 lines
6.8 KiB
Java
|
package net.minecraft.client.renderer;
|
||
|
|
||
|
import com.mojang.blaze3d.ProjectionType;
|
||
|
import com.mojang.blaze3d.buffers.BufferType;
|
||
|
import com.mojang.blaze3d.buffers.BufferUsage;
|
||
|
import com.mojang.blaze3d.buffers.GpuBuffer;
|
||
|
import com.mojang.blaze3d.pipeline.RenderPipeline;
|
||
|
import com.mojang.blaze3d.pipeline.RenderTarget;
|
||
|
import com.mojang.blaze3d.systems.CommandEncoder;
|
||
|
import com.mojang.blaze3d.systems.RenderPass;
|
||
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||
|
import com.mojang.blaze3d.textures.GpuTexture;
|
||
|
import com.mojang.blaze3d.vertex.BufferBuilder;
|
||
|
import com.mojang.blaze3d.vertex.ByteBufferBuilder;
|
||
|
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
|
||
|
import com.mojang.blaze3d.vertex.MeshData;
|
||
|
import com.mojang.blaze3d.vertex.VertexFormat;
|
||
|
import java.util.List;
|
||
|
import java.util.OptionalDouble;
|
||
|
import java.util.OptionalInt;
|
||
|
import java.util.stream.IntStream;
|
||
|
import javax.annotation.Nullable;
|
||
|
import net.minecraft.client.Minecraft;
|
||
|
import net.minecraft.client.renderer.texture.TextureManager;
|
||
|
import net.minecraft.resources.ResourceLocation;
|
||
|
import net.minecraftforge.api.distmarker.Dist;
|
||
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
||
|
import org.joml.Matrix4f;
|
||
|
import org.joml.Matrix4fStack;
|
||
|
|
||
|
@OnlyIn(Dist.CLIENT)
|
||
|
public class CubeMap {
|
||
|
private static final int SIDES = 6;
|
||
|
@Nullable
|
||
|
private GpuBuffer cubeMapBuffer = null;
|
||
|
private final List<ResourceLocation> sides;
|
||
|
|
||
|
public CubeMap(ResourceLocation p_108848_) {
|
||
|
this.sides = IntStream.range(0, 6).mapToObj(p_377762_ -> p_108848_.withPath(p_108848_.getPath() + "_" + p_377762_ + ".png")).toList();
|
||
|
}
|
||
|
|
||
|
public void render(Minecraft p_108850_, float p_108851_, float p_108852_, float p_108853_) {
|
||
|
if (this.cubeMapBuffer == null) {
|
||
|
this.initializeVertices();
|
||
|
}
|
||
|
|
||
|
Matrix4f matrix4f = new Matrix4f().setPerspective(1.4835298F, (float)p_108850_.getWindow().getWidth() / p_108850_.getWindow().getHeight(), 0.05F, 10.0F);
|
||
|
RenderSystem.backupProjectionMatrix();
|
||
|
RenderSystem.setProjectionMatrix(matrix4f, ProjectionType.PERSPECTIVE);
|
||
|
Matrix4fStack matrix4fstack = RenderSystem.getModelViewStack();
|
||
|
matrix4fstack.pushMatrix();
|
||
|
matrix4fstack.rotationX((float) Math.PI);
|
||
|
int i = 2;
|
||
|
RenderPipeline renderpipeline = RenderPipelines.PANORAMA;
|
||
|
RenderTarget rendertarget = Minecraft.getInstance().getMainRenderTarget();
|
||
|
GpuTexture gputexture = rendertarget.getColorTexture();
|
||
|
GpuTexture gputexture1 = rendertarget.getDepthTexture();
|
||
|
RenderSystem.AutoStorageIndexBuffer rendersystem$autostorageindexbuffer = RenderSystem.getSequentialBuffer(VertexFormat.Mode.QUADS);
|
||
|
GpuBuffer gpubuffer = rendersystem$autostorageindexbuffer.getBuffer(36);
|
||
|
|
||
|
try (RenderPass renderpass = RenderSystem.getDevice()
|
||
|
.createCommandEncoder()
|
||
|
.createRenderPass(gputexture, OptionalInt.empty(), gputexture1, OptionalDouble.empty())) {
|
||
|
renderpass.setPipeline(renderpipeline);
|
||
|
renderpass.setVertexBuffer(0, this.cubeMapBuffer);
|
||
|
renderpass.setIndexBuffer(gpubuffer, rendersystem$autostorageindexbuffer.type());
|
||
|
|
||
|
for (int j = 0; j < 4; j++) {
|
||
|
matrix4fstack.pushMatrix();
|
||
|
float f = (j % 2 / 2.0F - 0.5F) / 256.0F;
|
||
|
float f1 = (j / 2 / 2.0F - 0.5F) / 256.0F;
|
||
|
float f2 = 0.0F;
|
||
|
matrix4fstack.translate(f, f1, 0.0F);
|
||
|
matrix4fstack.rotateX(p_108851_ * (float) (Math.PI / 180.0));
|
||
|
matrix4fstack.rotateY(p_108852_ * (float) (Math.PI / 180.0));
|
||
|
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, p_108853_ / (j + 1));
|
||
|
|
||
|
for (int k = 0; k < 6; k++) {
|
||
|
renderpass.bindSampler("Sampler0", p_108850_.getTextureManager().getTexture(this.sides.get(k)).getTexture());
|
||
|
renderpass.drawIndexed(6 * k, 6);
|
||
|
}
|
||
|
|
||
|
matrix4fstack.popMatrix();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||
|
RenderSystem.restoreProjectionMatrix();
|
||
|
matrix4fstack.popMatrix();
|
||
|
}
|
||
|
|
||
|
private void initializeVertices() {
|
||
|
this.cubeMapBuffer = RenderSystem.getDevice()
|
||
|
.createBuffer(() -> "Cube map vertex buffer", BufferType.VERTICES, BufferUsage.DYNAMIC_WRITE, 24 * DefaultVertexFormat.POSITION_TEX.getVertexSize());
|
||
|
|
||
|
try (ByteBufferBuilder bytebufferbuilder = new ByteBufferBuilder(DefaultVertexFormat.POSITION_TEX.getVertexSize() * 4)) {
|
||
|
BufferBuilder bufferbuilder = new BufferBuilder(bytebufferbuilder, VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
|
||
|
bufferbuilder.addVertex(-1.0F, -1.0F, 1.0F).setUv(0.0F, 0.0F);
|
||
|
bufferbuilder.addVertex(-1.0F, 1.0F, 1.0F).setUv(0.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(1.0F, 1.0F, 1.0F).setUv(1.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(1.0F, -1.0F, 1.0F).setUv(1.0F, 0.0F);
|
||
|
bufferbuilder.addVertex(1.0F, -1.0F, 1.0F).setUv(0.0F, 0.0F);
|
||
|
bufferbuilder.addVertex(1.0F, 1.0F, 1.0F).setUv(0.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(1.0F, 1.0F, -1.0F).setUv(1.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(1.0F, -1.0F, -1.0F).setUv(1.0F, 0.0F);
|
||
|
bufferbuilder.addVertex(1.0F, -1.0F, -1.0F).setUv(0.0F, 0.0F);
|
||
|
bufferbuilder.addVertex(1.0F, 1.0F, -1.0F).setUv(0.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(-1.0F, 1.0F, -1.0F).setUv(1.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(-1.0F, -1.0F, -1.0F).setUv(1.0F, 0.0F);
|
||
|
bufferbuilder.addVertex(-1.0F, -1.0F, -1.0F).setUv(0.0F, 0.0F);
|
||
|
bufferbuilder.addVertex(-1.0F, 1.0F, -1.0F).setUv(0.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(-1.0F, 1.0F, 1.0F).setUv(1.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(-1.0F, -1.0F, 1.0F).setUv(1.0F, 0.0F);
|
||
|
bufferbuilder.addVertex(-1.0F, -1.0F, -1.0F).setUv(0.0F, 0.0F);
|
||
|
bufferbuilder.addVertex(-1.0F, -1.0F, 1.0F).setUv(0.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(1.0F, -1.0F, 1.0F).setUv(1.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(1.0F, -1.0F, -1.0F).setUv(1.0F, 0.0F);
|
||
|
bufferbuilder.addVertex(-1.0F, 1.0F, 1.0F).setUv(0.0F, 0.0F);
|
||
|
bufferbuilder.addVertex(-1.0F, 1.0F, -1.0F).setUv(0.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(1.0F, 1.0F, -1.0F).setUv(1.0F, 1.0F);
|
||
|
bufferbuilder.addVertex(1.0F, 1.0F, 1.0F).setUv(1.0F, 0.0F);
|
||
|
|
||
|
try (MeshData meshdata = bufferbuilder.buildOrThrow()) {
|
||
|
CommandEncoder commandencoder = RenderSystem.getDevice().createCommandEncoder();
|
||
|
commandencoder.writeToBuffer(this.cubeMapBuffer, meshdata.vertexBuffer(), 0);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void registerTextures(TextureManager p_376665_) {
|
||
|
for (ResourceLocation resourcelocation : this.sides) {
|
||
|
p_376665_.registerForNextReload(resourcelocation);
|
||
|
}
|
||
|
}
|
||
|
}
|