minecraft-source/src/com/mojang/blaze3d/pipeline/RenderTarget.java

266 lines
11 KiB
Java

package com.mojang.blaze3d.pipeline;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import java.nio.IntBuffer;
import com.mojang.blaze3d.platform.TextureUtil;
import com.mojang.blaze3d.platform.GlConst;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
public class RenderTarget {
public int width;
public int height;
public int viewWidth;
public int viewHeight;
public final boolean useDepth;
public int frameBufferId;
public int colorTextureId;
public int depthBufferId;
public final float[] clearChannels;
public int filterMode;
public RenderTarget(final int integer1, final int integer2, final boolean boolean3, final boolean boolean4) {
RenderSystem.assertThread(RenderSystem::isOnRenderThreadOrInit);
this.useDepth = boolean3;
this.frameBufferId = -1;
this.colorTextureId = -1;
this.depthBufferId = -1;
(this.clearChannels = new float[4])[0] = 1.0f;
this.clearChannels[1] = 1.0f;
this.clearChannels[2] = 1.0f;
this.clearChannels[3] = 0.0f;
this.resize(integer1, integer2, boolean4);
}
public void resize(final int integer1, final int integer2, final boolean boolean3) {
if (!RenderSystem.isOnRenderThread()) {
RenderSystem.recordRenderCall(() -> this._resize(integer1, integer2, boolean3));
}
else {
this._resize(integer1, integer2, boolean3);
}
}
private void _resize(final int integer1, final int integer2, final boolean boolean3) {
RenderSystem.assertThread(RenderSystem::isOnRenderThreadOrInit);
GlStateManager._enableDepthTest();
if (this.frameBufferId >= 0) {
this.destroyBuffers();
}
this.createBuffers(integer1, integer2, boolean3);
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, 0);
}
public void destroyBuffers() {
RenderSystem.assertThread(RenderSystem::isOnRenderThreadOrInit);
this.unbindRead();
this.unbindWrite();
if (this.depthBufferId > -1) {
TextureUtil.releaseTextureId(this.depthBufferId);
this.depthBufferId = -1;
}
if (this.colorTextureId > -1) {
TextureUtil.releaseTextureId(this.colorTextureId);
this.colorTextureId = -1;
}
if (this.frameBufferId > -1) {
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, 0);
GlStateManager._glDeleteFramebuffers(this.frameBufferId);
this.frameBufferId = -1;
}
}
public void copyDepthFrom(final RenderTarget dgf) {
RenderSystem.assertThread(RenderSystem::isOnRenderThreadOrInit);
if (GlStateManager.supportsFramebufferBlit()) {
GlStateManager._glBindFramebuffer(36008, dgf.frameBufferId);
GlStateManager._glBindFramebuffer(36009, this.frameBufferId);
GlStateManager._glBlitFrameBuffer(0, 0, dgf.width, dgf.height, 0, 0, this.width, this.height, 256, 9728);
}
else {
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, this.frameBufferId);
final int integer3 = GlStateManager.getFramebufferDepthTexture();
if (integer3 != 0) {
final int integer4 = GlStateManager.getActiveTextureName();
GlStateManager._bindTexture(integer3);
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, dgf.frameBufferId);
GlStateManager._glCopyTexSubImage2D(3553, 0, 0, 0, 0, 0, Math.min(this.width, dgf.width), Math.min(this.height, dgf.height));
GlStateManager._bindTexture(integer4);
}
}
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, 0);
}
public void createBuffers(final int integer1, final int integer2, final boolean boolean3) {
RenderSystem.assertThread(RenderSystem::isOnRenderThreadOrInit);
this.viewWidth = integer1;
this.viewHeight = integer2;
this.width = integer1;
this.height = integer2;
this.frameBufferId = GlStateManager.glGenFramebuffers();
this.colorTextureId = TextureUtil.generateTextureId();
if (this.useDepth) {
GlStateManager._bindTexture(this.depthBufferId = TextureUtil.generateTextureId());
GlStateManager._texParameter(3553, 10241, 9728);
GlStateManager._texParameter(3553, 10240, 9728);
GlStateManager._texParameter(3553, 10242, 10496);
GlStateManager._texParameter(3553, 10243, 10496);
GlStateManager._texParameter(3553, 34892, 0);
GlStateManager._texImage2D(3553, 0, 6402, this.width, this.height, 0, 6402, 5126, null);
}
this.setFilterMode(9728);
GlStateManager._bindTexture(this.colorTextureId);
GlStateManager._texImage2D(3553, 0, 32856, this.width, this.height, 0, 6408, 5121, null);
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, this.frameBufferId);
GlStateManager._glFramebufferTexture2D(GlConst.GL_FRAMEBUFFER, GlConst.GL_COLOR_ATTACHMENT0, 3553, this.colorTextureId, 0);
if (this.useDepth) {
GlStateManager._glFramebufferTexture2D(GlConst.GL_FRAMEBUFFER, GlConst.GL_DEPTH_ATTACHMENT, 3553, this.depthBufferId, 0);
}
this.checkStatus();
this.clear(boolean3);
this.unbindRead();
}
public void setFilterMode(final int integer) {
RenderSystem.assertThread(RenderSystem::isOnRenderThreadOrInit);
this.filterMode = integer;
GlStateManager._bindTexture(this.colorTextureId);
GlStateManager._texParameter(3553, 10241, integer);
GlStateManager._texParameter(3553, 10240, integer);
GlStateManager._texParameter(3553, 10242, 10496);
GlStateManager._texParameter(3553, 10243, 10496);
GlStateManager._bindTexture(0);
}
public void checkStatus() {
RenderSystem.assertThread(RenderSystem::isOnRenderThreadOrInit);
final int integer2 = GlStateManager.glCheckFramebufferStatus(GlConst.GL_FRAMEBUFFER);
if (integer2 == GlConst.GL_FRAMEBUFFER_COMPLETE) {
return;
}
if (integer2 == GlConst.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT) {
throw new RuntimeException("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT");
}
if (integer2 == GlConst.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT) {
throw new RuntimeException("GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
}
if (integer2 == GlConst.GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER) {
throw new RuntimeException("GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER");
}
if (integer2 == GlConst.GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER) {
throw new RuntimeException("GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER");
}
throw new RuntimeException("glCheckFramebufferStatus returned unknown status:" + integer2);
}
public void bindRead() {
RenderSystem.assertThread(RenderSystem::isOnRenderThread);
GlStateManager._bindTexture(this.colorTextureId);
}
public void unbindRead() {
RenderSystem.assertThread(RenderSystem::isOnRenderThreadOrInit);
GlStateManager._bindTexture(0);
}
public void bindWrite(final boolean boolean1) {
if (!RenderSystem.isOnRenderThread()) {
RenderSystem.recordRenderCall(() -> this._bindWrite(boolean1));
}
else {
this._bindWrite(boolean1);
}
}
private void _bindWrite(final boolean boolean1) {
RenderSystem.assertThread(RenderSystem::isOnRenderThreadOrInit);
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, this.frameBufferId);
if (boolean1) {
GlStateManager._viewport(0, 0, this.viewWidth, this.viewHeight);
}
}
public void unbindWrite() {
if (!RenderSystem.isOnRenderThread()) {
RenderSystem.recordRenderCall(() -> GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, 0));
}
else {
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, 0);
}
}
public void setClearColor(final float float1, final float float2, final float float3, final float float4) {
this.clearChannels[0] = float1;
this.clearChannels[1] = float2;
this.clearChannels[2] = float3;
this.clearChannels[3] = float4;
}
public void blitToScreen(final int integer1, final int integer2) {
this.blitToScreen(integer1, integer2, true);
}
public void blitToScreen(final int integer1, final int integer2, final boolean boolean3) {
RenderSystem.assertThread(RenderSystem::isOnGameThreadOrInit);
if (!RenderSystem.isInInitPhase()) {
RenderSystem.recordRenderCall(() -> this._blitToScreen(integer1, integer2, boolean3));
}
else {
this._blitToScreen(integer1, integer2, boolean3);
}
}
private void _blitToScreen(final int integer1, final int integer2, final boolean boolean3) {
RenderSystem.assertThread(RenderSystem::isOnRenderThread);
GlStateManager._colorMask(true, true, true, false);
GlStateManager._disableDepthTest();
GlStateManager._depthMask(false);
GlStateManager._matrixMode(5889);
GlStateManager._loadIdentity();
GlStateManager._ortho(0.0, integer1, integer2, 0.0, 1000.0, 3000.0);
GlStateManager._matrixMode(5888);
GlStateManager._loadIdentity();
GlStateManager._translatef(0.0f, 0.0f, -2000.0f);
GlStateManager._viewport(0, 0, integer1, integer2);
GlStateManager._enableTexture();
GlStateManager._disableLighting();
GlStateManager._disableAlphaTest();
if (boolean3) {
GlStateManager._disableBlend();
GlStateManager._enableColorMaterial();
}
GlStateManager._color4f(1.0f, 1.0f, 1.0f, 1.0f);
this.bindRead();
final float float5 = (float)integer1;
final float float6 = (float)integer2;
final float float7 = this.viewWidth / (float)this.width;
final float float8 = this.viewHeight / (float)this.height;
final Tesselator dhn9 = RenderSystem.renderThreadTesselator();
final BufferBuilder dhg10 = dhn9.getBuilder();
dhg10.begin(7, DefaultVertexFormat.POSITION_TEX_COLOR);
dhg10.vertex(0.0, float6, 0.0).uv(0.0f, 0.0f).color(255, 255, 255, 255).endVertex();
dhg10.vertex(float5, float6, 0.0).uv(float7, 0.0f).color(255, 255, 255, 255).endVertex();
dhg10.vertex(float5, 0.0, 0.0).uv(float7, float8).color(255, 255, 255, 255).endVertex();
dhg10.vertex(0.0, 0.0, 0.0).uv(0.0f, float8).color(255, 255, 255, 255).endVertex();
dhn9.end();
this.unbindRead();
GlStateManager._depthMask(true);
GlStateManager._colorMask(true, true, true, true);
}
public void clear(final boolean boolean1) {
RenderSystem.assertThread(RenderSystem::isOnRenderThreadOrInit);
this.bindWrite(true);
GlStateManager._clearColor(this.clearChannels[0], this.clearChannels[1], this.clearChannels[2], this.clearChannels[3]);
int integer3 = 16384;
if (this.useDepth) {
GlStateManager._clearDepth(1.0);
integer3 |= 0x100;
}
GlStateManager._clear(integer3, boolean1);
this.unbindWrite();
}
}