63 lines
2.2 KiB
Java
63 lines
2.2 KiB
Java
/*
|
|
* Decompiled with CFR 0.152.
|
|
*
|
|
* Could not load the following classes:
|
|
* org.joml.Matrix4f
|
|
* org.joml.Matrix4fc
|
|
* org.lwjgl.system.MemoryStack
|
|
*/
|
|
package net.minecraft.client.renderer;
|
|
|
|
import com.mojang.blaze3d.buffers.GpuBuffer;
|
|
import com.mojang.blaze3d.buffers.GpuBufferSlice;
|
|
import com.mojang.blaze3d.buffers.Std140Builder;
|
|
import com.mojang.blaze3d.systems.GpuDevice;
|
|
import com.mojang.blaze3d.systems.RenderSystem;
|
|
import java.nio.ByteBuffer;
|
|
import org.joml.Matrix4f;
|
|
import org.joml.Matrix4fc;
|
|
import org.lwjgl.system.MemoryStack;
|
|
|
|
public class CachedOrthoProjectionMatrixBuffer
|
|
implements AutoCloseable {
|
|
private final GpuBuffer buffer;
|
|
private final GpuBufferSlice bufferSlice;
|
|
private final float zNear;
|
|
private final float zFar;
|
|
private final boolean invertY;
|
|
private float width;
|
|
private float height;
|
|
|
|
public CachedOrthoProjectionMatrixBuffer(String name, float zNear, float zFar, boolean invertY) {
|
|
this.zNear = zNear;
|
|
this.zFar = zFar;
|
|
this.invertY = invertY;
|
|
GpuDevice device = RenderSystem.getDevice();
|
|
this.buffer = device.createBuffer(() -> "Projection matrix UBO " + name, 136, RenderSystem.PROJECTION_MATRIX_UBO_SIZE);
|
|
this.bufferSlice = this.buffer.slice(0, RenderSystem.PROJECTION_MATRIX_UBO_SIZE);
|
|
}
|
|
|
|
public GpuBufferSlice getBuffer(float width, float height) {
|
|
if (this.width != width || this.height != height) {
|
|
Matrix4f projectionMatrix = this.createProjectionMatrix(width, height);
|
|
try (MemoryStack stack = MemoryStack.stackPush();){
|
|
ByteBuffer byteBuffer = Std140Builder.onStack(stack, RenderSystem.PROJECTION_MATRIX_UBO_SIZE).putMat4f((Matrix4fc)projectionMatrix).get();
|
|
RenderSystem.getDevice().createCommandEncoder().writeToBuffer(this.buffer.slice(), byteBuffer);
|
|
}
|
|
this.width = width;
|
|
this.height = height;
|
|
}
|
|
return this.bufferSlice;
|
|
}
|
|
|
|
private Matrix4f createProjectionMatrix(float width, float height) {
|
|
return new Matrix4f().setOrtho(0.0f, width, this.invertY ? height : 0.0f, this.invertY ? 0.0f : height, this.zNear, this.zFar);
|
|
}
|
|
|
|
@Override
|
|
public void close() {
|
|
this.buffer.close();
|
|
}
|
|
}
|
|
|