package com.xcompwiz.lookingglass.render; import java.io.PrintStream; import java.util.Collection; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import com.xcompwiz.lookingglass.client.proxyworld.ProxyWorldManager; import com.xcompwiz.lookingglass.client.proxyworld.WorldView; import com.xcompwiz.lookingglass.client.render.RenderUtils; import com.xcompwiz.lookingglass.log.LoggerUtils; public class WorldViewRenderManager { public static void onRenderTick(PrintStream printstream) { Minecraft mc = Minecraft.getMinecraft(); Collection<WorldClient> worlds = ProxyWorldManager.getProxyworlds(); if (worlds == null || worlds.isEmpty()) return; long renderT = Minecraft.getSystemTime(); //TODO: This and the renderWorldToTexture need to be remixed WorldClient worldBackup = mc.theWorld; RenderGlobal renderBackup = mc.renderGlobal; EffectRenderer effectBackup = mc.effectRenderer; EntityClientPlayerMP playerBackup = mc.thePlayer; EntityLivingBase viewportBackup = mc.renderViewEntity; //TODO: This is a hack to work around some of the vanilla rendering hacks... Yay hacks. float fovmult = playerBackup.getFOVMultiplier(); ItemStack currentClientItem = playerBackup.inventory.getCurrentItem(); for (WorldClient proxyworld : worlds) { if (proxyworld == null) continue; mc.theWorld = proxyworld; RenderManager.instance.set(mc.theWorld); for (WorldView activeview : ProxyWorldManager.getWorldViews(proxyworld.provider.dimensionId)) { if (activeview.hasChunks() && activeview.markClean()) { activeview.startRender(renderT); mc.renderGlobal = activeview.getRenderGlobal(); mc.effectRenderer = activeview.getEffectRenderer(); mc.renderViewEntity = activeview.camera; mc.thePlayer = activeview.camera; //Other half of hack activeview.camera.setFOVMult(fovmult); //Prevents the FOV from flickering activeview.camera.inventory.currentItem = playerBackup.inventory.currentItem; activeview.camera.inventory.mainInventory[playerBackup.inventory.currentItem] = currentClientItem; //Prevents the hand from flickering try { mc.renderGlobal.updateClouds(); mc.theWorld.doVoidFogParticles(MathHelper.floor_double(activeview.camera.posX), MathHelper.floor_double(activeview.camera.posY), MathHelper.floor_double(activeview.camera.posZ)); mc.effectRenderer.updateEffects(); } catch (Exception e) { LoggerUtils.error("Client Proxy Dim had error while updating render elements: %s", e.getLocalizedMessage()); e.printStackTrace(printstream); } try { RenderUtils.renderWorldToTexture(0.1f, activeview.getFramebuffer(), activeview.width, activeview.height); } catch (Exception e) { LoggerUtils.error("Client Proxy Dim had error while rendering: %s", e.getLocalizedMessage()); e.printStackTrace(printstream); } } } } mc.renderViewEntity = viewportBackup; mc.thePlayer = playerBackup; mc.effectRenderer = effectBackup; mc.renderGlobal = renderBackup; mc.theWorld = worldBackup; RenderManager.instance.set(mc.theWorld); } }