package com.xcompwiz.lookingglass.client.render;

import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.EntityRenderer;
import net.minecraft.client.renderer.Tessellator;

import org.lwjgl.opengl.EXTFramebufferObject;
import org.lwjgl.opengl.GL11;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class RenderUtils {

	@SideOnly(Side.CLIENT)
	public final static void renderWorldToTexture(float renderTime, int framebuffer, int width, int height) {
		if (framebuffer == 0) return;
		Minecraft mc = Minecraft.getMinecraft();
		if (mc.skipRenderWorld) return;
		EntityRenderer entityRenderer = mc.entityRenderer;

		//Backup current render settings
		int heightBackup = mc.displayHeight;
		int widthBackup = mc.displayWidth;

		int thirdPersonBackup = mc.gameSettings.thirdPersonView;
		boolean hideGuiBackup = mc.gameSettings.hideGUI;
		int particleBackup = mc.gameSettings.particleSetting;
		boolean anaglyphBackup = mc.gameSettings.anaglyph;
		int renderDistanceBackup = mc.gameSettings.renderDistanceChunks;
		float FOVbackup = mc.gameSettings.fovSetting;

		//Render world
		try {
			//Set all of the render setting to work on the proxy world
			mc.displayHeight = height;
			mc.displayWidth = width;

			//TODO: params (FOV, Particle setting, renderDistance)
			mc.gameSettings.thirdPersonView = 0;
			mc.gameSettings.hideGUI = true;
			//mc.gameSettings.particleSetting = ;
			mc.gameSettings.anaglyph = false;
			//mc.gameSettings.renderDistanceChunks = ;  
			//mc.gameSettings.fovSetting = ;

			//Set gl options
			GL11.glViewport(0, 0, mc.displayWidth, mc.displayHeight);
			GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
			EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, framebuffer);
			GL11.glClearColor(1.0f, 0.0f, 0.0f, 0.5f);
			GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

			int i1 = mc.gameSettings.limitFramerate;
			if (mc.isFramerateLimitBelowMax()) {
				entityRenderer.renderWorld(renderTime, (1000000000 / i1));
			} else {
				entityRenderer.renderWorld(renderTime, 0L);
			}
		} catch (Exception e) {
			try {
				//Clean up the tessellator, just in case.
				Tessellator.instance.draw();
			} catch (Exception e2) {
				//It might throw an exception, but that just means we didn't need to clean it up (this time)
			}
			throw new RuntimeException("Error while rendering proxy world", e);
		} finally {
			GL11.glEnable(GL11.GL_TEXTURE_2D);
			EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0);

			GL11.glViewport(0, 0, widthBackup, heightBackup);
			GL11.glLoadIdentity();

			mc.gameSettings.thirdPersonView = thirdPersonBackup;
			mc.gameSettings.hideGUI = hideGuiBackup;
			mc.gameSettings.particleSetting = particleBackup;
			mc.gameSettings.anaglyph = anaglyphBackup;
			mc.gameSettings.renderDistanceChunks = renderDistanceBackup;
			mc.gameSettings.fovSetting = FOVbackup;

			mc.displayHeight = heightBackup;
			mc.displayWidth = widthBackup;
		}
	}

}