package net.minecraft.client.shader;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.nio.ByteBuffer;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureUtil;
import org.lwjgl.opengl.GL11;
@SideOnly(Side.CLIENT)
public class Framebuffer
{
public int framebufferTextureWidth;
public int framebufferTextureHeight;
public int framebufferWidth;
public int framebufferHeight;
public boolean useDepth;
public int framebufferObject;
public int framebufferTexture;
public int depthBuffer;
public float[] framebufferColor;
public int framebufferFilter;
private static final String __OBFID = "CL_00000959";
public Framebuffer(int p_i45078_1_, int p_i45078_2_, boolean p_i45078_3_)
{
this.useDepth = p_i45078_3_;
this.framebufferObject = -1;
this.framebufferTexture = -1;
this.depthBuffer = -1;
this.framebufferColor = new float[4];
this.framebufferColor[0] = 1.0F;
this.framebufferColor[1] = 1.0F;
this.framebufferColor[2] = 1.0F;
this.framebufferColor[3] = 0.0F;
this.createBindFramebuffer(p_i45078_1_, p_i45078_2_);
}
public void createBindFramebuffer(int p_147613_1_, int p_147613_2_)
{
if (!OpenGlHelper.isFramebufferEnabled())
{
this.framebufferWidth = p_147613_1_;
this.framebufferHeight = p_147613_2_;
}
else
{
GL11.glEnable(GL11.GL_DEPTH_TEST);
if (this.framebufferObject >= 0)
{
this.deleteFramebuffer();
}
this.createFramebuffer(p_147613_1_, p_147613_2_);
this.checkFramebufferComplete();
OpenGlHelper.func_153171_g(OpenGlHelper.field_153198_e, 0);
}
}
public void deleteFramebuffer()
{
if (OpenGlHelper.isFramebufferEnabled())
{
this.unbindFramebufferTexture();
this.unbindFramebuffer();
if (this.depthBuffer > -1)
{
OpenGlHelper.func_153184_g(this.depthBuffer);
this.depthBuffer = -1;
}
if (this.framebufferTexture > -1)
{
TextureUtil.deleteTexture(this.framebufferTexture);
this.framebufferTexture = -1;
}
if (this.framebufferObject > -1)
{
OpenGlHelper.func_153171_g(OpenGlHelper.field_153198_e, 0);
OpenGlHelper.func_153174_h(this.framebufferObject);
this.framebufferObject = -1;
}
}
}
public void createFramebuffer(int p_147605_1_, int p_147605_2_)
{
this.framebufferWidth = p_147605_1_;
this.framebufferHeight = p_147605_2_;
this.framebufferTextureWidth = p_147605_1_;
this.framebufferTextureHeight = p_147605_2_;
if (!OpenGlHelper.isFramebufferEnabled())
{
this.framebufferClear();
}
else
{
this.framebufferObject = OpenGlHelper.func_153165_e();
this.framebufferTexture = TextureUtil.glGenTextures();
if (this.useDepth)
{
this.depthBuffer = OpenGlHelper.func_153185_f();
}
this.setFramebufferFilter(9728);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.framebufferTexture);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, this.framebufferTextureWidth, this.framebufferTextureHeight, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer)null);
OpenGlHelper.func_153171_g(OpenGlHelper.field_153198_e, this.framebufferObject);
OpenGlHelper.func_153188_a(OpenGlHelper.field_153198_e, OpenGlHelper.field_153200_g, 3553, this.framebufferTexture, 0);
if (this.useDepth)
{
OpenGlHelper.func_153176_h(OpenGlHelper.field_153199_f, this.depthBuffer);
if (net.minecraftforge.client.MinecraftForgeClient.getStencilBits() == 0)
{
OpenGlHelper.func_153186_a(OpenGlHelper.field_153199_f, 33190, this.framebufferTextureWidth, this.framebufferTextureHeight);
OpenGlHelper.func_153190_b(OpenGlHelper.field_153198_e, OpenGlHelper.field_153201_h, OpenGlHelper.field_153199_f, this.depthBuffer);
}
else
{
OpenGlHelper.func_153186_a(OpenGlHelper.field_153199_f, org.lwjgl.opengl.EXTPackedDepthStencil.GL_DEPTH24_STENCIL8_EXT, this.framebufferTextureWidth, this.framebufferTextureHeight);
OpenGlHelper.func_153190_b(OpenGlHelper.field_153198_e, org.lwjgl.opengl.EXTFramebufferObject.GL_DEPTH_ATTACHMENT_EXT, OpenGlHelper.field_153199_f, this.depthBuffer);
OpenGlHelper.func_153190_b(OpenGlHelper.field_153198_e, org.lwjgl.opengl.EXTFramebufferObject.GL_STENCIL_ATTACHMENT_EXT, OpenGlHelper.field_153199_f, this.depthBuffer);
}
}
this.framebufferClear();
this.unbindFramebufferTexture();
}
}
public void setFramebufferFilter(int p_147607_1_)
{
if (OpenGlHelper.isFramebufferEnabled())
{
this.framebufferFilter = p_147607_1_;
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.framebufferTexture);
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, (float)p_147607_1_);
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, (float)p_147607_1_);
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, 10496.0F);
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, 10496.0F);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
}
public void checkFramebufferComplete()
{
int i = OpenGlHelper.func_153167_i(OpenGlHelper.field_153198_e);
if (i != OpenGlHelper.field_153202_i)
{
if (i == OpenGlHelper.field_153203_j)
{
throw new RuntimeException("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT");
}
else if (i == OpenGlHelper.field_153204_k)
{
throw new RuntimeException("GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
}
else if (i == OpenGlHelper.field_153205_l)
{
throw new RuntimeException("GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER");
}
else if (i == OpenGlHelper.field_153206_m)
{
throw new RuntimeException("GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER");
}
else
{
throw new RuntimeException("glCheckFramebufferStatus returned unknown status:" + i);
}
}
}
public void bindFramebufferTexture()
{
if (OpenGlHelper.isFramebufferEnabled())
{
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.framebufferTexture);
}
}
public void unbindFramebufferTexture()
{
if (OpenGlHelper.isFramebufferEnabled())
{
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
}
public void bindFramebuffer(boolean p_147610_1_)
{
if (OpenGlHelper.isFramebufferEnabled())
{
OpenGlHelper.func_153171_g(OpenGlHelper.field_153198_e, this.framebufferObject);
if (p_147610_1_)
{
GL11.glViewport(0, 0, this.framebufferWidth, this.framebufferHeight);
}
}
}
public void unbindFramebuffer()
{
if (OpenGlHelper.isFramebufferEnabled())
{
OpenGlHelper.func_153171_g(OpenGlHelper.field_153198_e, 0);
}
}
public void setFramebufferColor(float p_147604_1_, float p_147604_2_, float p_147604_3_, float p_147604_4_)
{
this.framebufferColor[0] = p_147604_1_;
this.framebufferColor[1] = p_147604_2_;
this.framebufferColor[2] = p_147604_3_;
this.framebufferColor[3] = p_147604_4_;
}
public void framebufferRender(int p_147615_1_, int p_147615_2_)
{
if (OpenGlHelper.isFramebufferEnabled())
{
GL11.glColorMask(true, true, true, false);
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glDepthMask(false);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0.0D, (double)p_147615_1_, (double)p_147615_2_, 0.0D, 1000.0D, 3000.0D);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GL11.glTranslatef(0.0F, 0.0F, -2000.0F);
GL11.glViewport(0, 0, p_147615_1_, p_147615_2_);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_ALPHA_TEST);
GL11.glDisable(GL11.GL_BLEND);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glEnable(GL11.GL_COLOR_MATERIAL);
this.bindFramebufferTexture();
float f = (float)p_147615_1_;
float f1 = (float)p_147615_2_;
float f2 = (float)this.framebufferWidth / (float)this.framebufferTextureWidth;
float f3 = (float)this.framebufferHeight / (float)this.framebufferTextureHeight;
Tessellator tessellator = Tessellator.instance;
tessellator.startDrawingQuads();
tessellator.setColorOpaque_I(-1);
tessellator.addVertexWithUV(0.0D, (double)f1, 0.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV((double)f, (double)f1, 0.0D, (double)f2, 0.0D);
tessellator.addVertexWithUV((double)f, 0.0D, 0.0D, (double)f2, (double)f3);
tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, (double)f3);
tessellator.draw();
this.unbindFramebufferTexture();
GL11.glDepthMask(true);
GL11.glColorMask(true, true, true, true);
}
}
public void framebufferClear()
{
this.bindFramebuffer(true);
GL11.glClearColor(this.framebufferColor[0], this.framebufferColor[1], this.framebufferColor[2], this.framebufferColor[3]);
int i = 16384;
if (this.useDepth)
{
GL11.glClearDepth(1.0D);
i |= 256;
}
GL11.glClear(i);
this.unbindFramebuffer();
}
}