package openmods.stencil; import com.google.common.base.Preconditions; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.texture.TextureUtil; import org.lwjgl.opengl.GL11; public class FramebufferBase { private int framebufferObject = -1; private int allocatedDepthBuffer = -1; private int allocatedStencilBuffer = -1; private int allocatedTexture = -1; private int usedDepthBuffer = -1; private int usedStencilBuffer = -1; private int usedTexture = -1; protected void useExternalTexture(int texture) { Preconditions.checkState(allocatedTexture == -1, "Trying to change texture, but one is already allocated"); this.usedTexture = texture; } protected boolean isTextureUsed(int texture) { return usedTexture == texture; } protected void useExternalStencilBuffer(int buffer) { Preconditions.checkState(allocatedStencilBuffer == -1, "Trying to change stencil buffer, but one is already allocated"); this.usedStencilBuffer = buffer; } protected boolean isStencilBufferUsed(int buffer) { return usedStencilBuffer == buffer; } protected void useExternalDepthBuffer(int buffer) { Preconditions.checkState(allocatedDepthBuffer == -1, "Trying to change depth buffer, but one is already allocated"); this.usedDepthBuffer = buffer; } protected boolean isDepthBufferUsed(int buffer) { return usedDepthBuffer == buffer; } protected void allocateStencilBuffer(int format, int width, int height) { Preconditions.checkState(this.allocatedStencilBuffer == -1, "Stencil buffer already allocated"); // OpenGlHelper.createRenderbuffer() this.usedStencilBuffer = this.allocatedStencilBuffer = OpenGlHelper.func_153185_f(); // OpenGlHelper.bindRenderbuffer(OpenGlHelper.GL_RENDERBUFFER, this.stencilBuffer); OpenGlHelper.func_153176_h(OpenGlHelper.field_153199_f, this.allocatedStencilBuffer); // OpenGlHelper.createRenderbufferStorage(OpenGlHelper.GL_RENDERBUFFER, FramebufferConstants.GL_STENCIL_FORMAT, this.framebufferTextureWidth, this.framebufferTextureHeight); OpenGlHelper.func_153186_a(OpenGlHelper.field_153199_f, format, width, height); } public boolean isAllocated() { return framebufferObject > -1; } public void deallocate() { if (!OpenGlHelper.isFramebufferEnabled()) return; unbindFramebuffer(); if (this.allocatedDepthBuffer > -1) { OpenGlHelper.func_153184_g(this.allocatedDepthBuffer); this.allocatedDepthBuffer = -1; } if (this.allocatedStencilBuffer > -1) { OpenGlHelper.func_153184_g(this.allocatedStencilBuffer); this.allocatedStencilBuffer = -1; } if (this.allocatedTexture > -1) { TextureUtil.deleteTexture(this.allocatedTexture); this.allocatedTexture = -1; } if (this.framebufferObject > -1) { OpenGlHelper.func_153174_h(this.framebufferObject); this.framebufferObject = -1; this.usedDepthBuffer = -1; this.usedStencilBuffer = -1; this.usedTexture = -1; } } protected boolean allocate() { if (!OpenGlHelper.isFramebufferEnabled()) return false; Preconditions.checkState(usedTexture > -1, "Texture not selected"); Preconditions.checkState(this.framebufferObject == -1, "Framebuffer already allocated"); this.framebufferObject = OpenGlHelper.func_153165_e(); bindFramebuffer(); // OpenGlHelper.attachFramebufferTexture(OpenGlHelper.GL_FRAMEBUFFER, OpenGlHelper.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, this.framebufferTexture, 0); OpenGlHelper.func_153188_a(OpenGlHelper.field_153198_e, OpenGlHelper.field_153200_g, GL11.GL_TEXTURE_2D, usedTexture, 0); if (usedDepthBuffer > -1) { // OpenGlHelper.attachRenderbuffer(OpenGlHelper.GL_FRAMEBUFFER, OpenGlHelper.GL_DEPTH_ATTACHMENT, OpenGlHelper.GL_RENDERBUFFER, this.depthBuffer); OpenGlHelper.func_153190_b(OpenGlHelper.field_153198_e, OpenGlHelper.field_153201_h, OpenGlHelper.field_153199_f, usedDepthBuffer); } if (usedStencilBuffer > -1) { // OpenGlHelper.attachRenderbuffer(OpenGlHelper.GL_FRAMEBUFFER, FramebufferConstants.GL_STENCIL_ATTACHMENT, OpenGlHelper.GL_RENDERBUFFER, this.stencilBuffer); OpenGlHelper.func_153190_b(OpenGlHelper.field_153198_e, FramebufferConstants.GL_STENCIL_ATTACHMENT, OpenGlHelper.field_153199_f, usedStencilBuffer); } // OpenGlHelper.checkFramebufferStatus(OpenGlHelper.GL_FRAMEBUFFER); int fboStatus = OpenGlHelper.func_153167_i(OpenGlHelper.field_153198_e); unbindFramebuffer(); boolean result = FramebufferConstants.checkFramebufferComplete(fboStatus); if (!result) { OpenGlHelper.func_153174_h(this.framebufferObject); this.framebufferObject = -1; } return result; } public boolean bindFramebuffer() { if (!OpenGlHelper.isFramebufferEnabled()) return false; Preconditions.checkState(framebufferObject > -1, "FBO not initialized"); // OpenGlHelper.bindFramebuffer(OpenGlHelper.GL_FRAMEBUFFER, this.framebufferObject); OpenGlHelper.func_153171_g(OpenGlHelper.field_153198_e, this.framebufferObject); return true; } public void unbindFramebuffer() { if (!OpenGlHelper.isFramebufferEnabled()) return; // OpenGlHelper.bindFramebuffer(OpenGlHelper.GL_FRAMEBUFFER, 0); OpenGlHelper.func_153171_g(OpenGlHelper.field_153198_e, 0); } }