package openblocks.client; import cpw.mods.fml.relauncher.ReflectionHelper; import java.lang.reflect.Method; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.renderer.RenderGlobal; import openmods.Log; import openmods.renderer.StencilRendererHandler; import org.apache.commons.lang3.ArrayUtils; import org.lwjgl.opengl.GL11; public class StencilSkyRenderer extends StencilRendererHandler { private final Method setupFogMethod; private boolean setupFogFailed; private final int stencilMask; private void setupFog(float partialTickTime) { if (setupFogFailed) return; EntityRenderer re = Minecraft.getMinecraft().entityRenderer; try { setupFogMethod.invoke(re, -1, partialTickTime); } catch (Throwable t) { Log.warn(t, "Can't setup fog. Oh, well..."); } } public StencilSkyRenderer(int stencilMask) { this.stencilMask = stencilMask; Method m = null; try { m = ReflectionHelper.findMethod(EntityRenderer.class, null, ArrayUtils.toArray("setupFog", "func_78468_a"), int.class, float.class); } catch (Throwable t) { Log.warn(t, "Failed to get method 'setupFog'"); setupFogFailed = true; } setupFogMethod = m; } @Override public void render(RenderGlobal context, float partialTickTime) { GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); GL11.glEnable(GL11.GL_STENCIL_TEST); GL11.glStencilMask(stencilMask); GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); GL11.glStencilFunc(GL11.GL_EQUAL, stencilMask, stencilMask); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDisable(GL11.GL_LIGHTING); setupFog(partialTickTime); context.renderSky(partialTickTime); GL11.glClearStencil(0); GL11.glClear(GL11.GL_STENCIL_BUFFER_BIT); GL11.glPopAttrib(); } }