package mcjty.rftools.dimension.world; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import mcjty.rftools.RFTools; import mcjty.rftools.dimension.DimensionInformation; import mcjty.rftools.dimension.description.CelestialBodyDescriptor; import mcjty.rftools.dimension.world.types.SkyType; import mcjty.rftools.items.dimlets.types.Patreons; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Vec3; import net.minecraftforge.client.IRenderHandler; import org.lwjgl.opengl.GL11; import java.util.List; import java.util.Random; public class SkyRenderer { private static final ResourceLocation locationEndSkyPng = new ResourceLocation("textures/environment/end_sky.png"); private static final ResourceLocation locationPlasmaSkyPng = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/plasmasky.png"); private static final ResourceLocation locationStars1 = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/stars1.png"); private static final ResourceLocation locationStars1a = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/stars1a.png"); private static final ResourceLocation locationStars2 = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/stars2.png"); private static final ResourceLocation locationStars3 = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/stars3.png"); private static final ResourceLocation locationStars3a = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/stars3a.png"); // private static final ResourceLocation locationDebugSkyPng = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/debugsky.png"); private static final ResourceLocation locationMoonPhasesPng = new ResourceLocation("textures/environment/moon_phases.png"); private static final ResourceLocation locationSunPng = new ResourceLocation("textures/environment/sun.png"); private static final ResourceLocation locationSickSunPng = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/sicksun.png"); private static final ResourceLocation locationSickMoonPng = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/sickmoon.png"); private static final ResourceLocation locationRabbitSunPng = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/rabbitsun.png"); private static final ResourceLocation locationRabbitMoonPng = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/rabbitmoon.png"); private static final ResourceLocation locationPlanetPng = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/planet1.png"); private static final ResourceLocation locationWolfMoonPng = new ResourceLocation(RFTools.MODID + ":" +"textures/sky/wolfred.png"); private static final ResourceLocation locationCloudsPng = new ResourceLocation("textures/environment/clouds.png"); private static boolean initialized = false; /** The star GL Call list */ private static int starGLCallList; /** OpenGL sky list */ private static int glSkyList; /** OpenGL sky list 2 */ private static int glSkyList2; private static void initialize() { if (!initialized) { initialized = true; starGLCallList = GLAllocation.generateDisplayLists(3); GL11.glPushMatrix(); GL11.glNewList(starGLCallList, GL11.GL_COMPILE); renderStars(); GL11.glEndList(); GL11.glPopMatrix(); Tessellator tessellator = Tessellator.instance; glSkyList = starGLCallList + 1; GL11.glNewList(glSkyList, GL11.GL_COMPILE); byte b2 = 64; int i = 256 / b2 + 2; float f = 16.0F; int j; int k; for (j = -b2 * i; j <= b2 * i; j += b2) { for (k = -b2 * i; k <= b2 * i; k += b2) { tessellator.startDrawingQuads(); tessellator.addVertex((j + 0), f, (k + 0)); tessellator.addVertex((j + b2), f, (k + 0)); tessellator.addVertex((j + b2), f, (k + b2)); tessellator.addVertex((j + 0), f, (k + b2)); tessellator.draw(); } } GL11.glEndList(); glSkyList2 = starGLCallList + 2; GL11.glNewList(glSkyList2, GL11.GL_COMPILE); f = -16.0F; tessellator.startDrawingQuads(); for (j = -b2 * i; j <= b2 * i; j += b2) { for (k = -b2 * i; k <= b2 * i; k += b2) { tessellator.addVertex((j + b2), f, (k + 0)); tessellator.addVertex((j + 0), f, (k + 0)); tessellator.addVertex((j + 0), f, (k + b2)); tessellator.addVertex((j + b2), f, (k + b2)); } } tessellator.draw(); GL11.glEndList(); } } public static void registerNoSky(GenericWorldProvider provider) { provider.setSkyRenderer(new IRenderHandler() { @Override public void render(float partialTicks, WorldClient world, Minecraft mc) { } }); provider.setCloudRenderer(new IRenderHandler() { @Override public void render(float partialTicks, WorldClient world, Minecraft mc) { } }); } public static void registerEnderSky(GenericWorldProvider provider) { provider.setSkyRenderer(new IRenderHandler() { @Override public void render(float partialTicks, WorldClient world, Minecraft mc) { SkyRenderer.renderEnderSky(); } }); provider.setCloudRenderer(new IRenderHandler() { @Override public void render(float partialTicks, WorldClient world, Minecraft mc) { } }); } public static void registerCloudRenderer(final GenericWorldProvider provider, final DimensionInformation information) { provider.setCloudRenderer(new IRenderHandler() { @Override public void render(float partialTicks, WorldClient world, Minecraft mc) { renderClouds(provider, information, partialTicks); } }); } private static final int SKYTYPE_DARKTOP = 0; private static final int SKYTYPE_ALLHORIZONTAL = 1; private static final int SKYTYPE_ALL = 2; private static final int SKYTYPE_ALTERNATING = 3; public static void registerSkybox(GenericWorldProvider provider, final SkyType skyType) { provider.setSkyRenderer(new IRenderHandler() { @Override public void render(float partialTicks, WorldClient world, Minecraft mc) { ResourceLocation sky; ResourceLocation sky2 = null; int type = SKYTYPE_DARKTOP; switch (skyType) { case SKY_INFERNO: sky = locationPlasmaSkyPng; type = SKYTYPE_DARKTOP; break; case SKY_STARS1: sky = locationStars1; sky2 = locationStars1a; type = SKYTYPE_ALTERNATING; break; case SKY_STARS2: sky = locationStars2; type = SKYTYPE_ALL; break; case SKY_STARS3: sky = locationStars3; sky2 = locationStars3a; type = SKYTYPE_ALLHORIZONTAL; break; default: return; } SkyRenderer.renderSkyTexture(sky, sky2, type); } }); provider.setCloudRenderer(new IRenderHandler() { @Override public void render(float partialTicks, WorldClient world, Minecraft mc) { } }); } public static void registerSky(GenericWorldProvider provider, final DimensionInformation information) { provider.setSkyRenderer(new IRenderHandler() { @Override public void render(float partialTicks, WorldClient world, Minecraft mc) { SkyRenderer.renderSky(partialTicks, information); } }); } private static class UV { private final double u; private final double v; private UV(double u, double v) { this.u = u; this.v = v; } public static UV uv(double u, double v) { return new UV(u, v); } } private static UV[] faceDown = new UV[] { UV.uv(0.0D, 1.0D), UV.uv(0.0D, 0.0D), UV.uv(1.0D, 0.0D), UV.uv(1.0D, 1.0D) }; private static UV[] faceUp = new UV[] { UV.uv(0.0D, 1.0D), UV.uv(0.0D, 0.0D), UV.uv(1.0D, 0.0D), UV.uv(1.0D, 1.0D) }; private static UV[] faceNorth = new UV[] { UV.uv(0.0D, 0.0D), UV.uv(0.0D, 1.0D), UV.uv(1.0D, 1.0D), UV.uv(1.0D, 0.0D) }; private static UV[] faceSouth = new UV[] { UV.uv(1.0D, 1.0D), UV.uv(1.0D, 0.0D), UV.uv(0.0D, 0.0D), UV.uv(0.0D, 1.0D) }; private static UV[] faceWest = new UV[] { UV.uv(1.0D, 0.0D), UV.uv(0.0D, 0.0D), UV.uv(0.0D, 1.0D), UV.uv(1.0D, 1.0D) }; private static UV[] faceEast = new UV[] { UV.uv(0.0D, 1.0D), UV.uv(1.0D, 1.0D), UV.uv(1.0D, 0.0D), UV.uv(0.0D, 0.0D) }; @SideOnly(Side.CLIENT) private static void renderSkyTexture(ResourceLocation sky, ResourceLocation sky2, int type) { TextureManager renderEngine = Minecraft.getMinecraft().getTextureManager(); GL11.glDisable(GL11.GL_FOG); GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(770, 771, 1, 0); RenderHelper.disableStandardItemLighting(); GL11.glDepthMask(false); Tessellator tessellator = Tessellator.instance; for (int i = 0; i < 6; ++i) { GL11.glPushMatrix(); UV[] uv = faceDown; int col = 0xffffff; if (i == 0) { // Down face uv = faceDown; switch (type) { case SKYTYPE_ALL: renderEngine.bindTexture(sky); break; case SKYTYPE_ALLHORIZONTAL: case SKYTYPE_ALTERNATING: renderEngine.bindTexture(sky2); break; default: col = 0; break; } } else if (i == 1) { // North face renderEngine.bindTexture(sky); GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); uv = faceNorth; } else if (i == 2) { // South face renderEngine.bindTexture(sky); GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); uv = faceSouth; } else if (i == 3) { // Up face GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); uv = faceUp; switch (type) { case SKYTYPE_ALL: renderEngine.bindTexture(sky); break; case SKYTYPE_ALLHORIZONTAL: case SKYTYPE_ALTERNATING: renderEngine.bindTexture(sky2); break; default: col = 0; break; } } else if (i == 4) { // East face if (type == SKYTYPE_ALTERNATING && sky2 != null) { renderEngine.bindTexture(sky2); } else { renderEngine.bindTexture(sky); } GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F); uv = faceEast; } else if (i == 5) { // West face if (type == SKYTYPE_ALTERNATING && sky2 != null) { renderEngine.bindTexture(sky2); } else { renderEngine.bindTexture(sky); } GL11.glRotatef(-90.0F, 0.0F, 0.0F, 1.0F); uv = faceWest; } tessellator.startDrawingQuads(); tessellator.setColorOpaque_I(col); tessellator.addVertexWithUV(-100.0D, -100.0D, -100.0D, uv[0].u, uv[0].v); tessellator.addVertexWithUV(-100.0D, -100.0D, 100.0D, uv[1].u, uv[1].v); tessellator.addVertexWithUV(100.0D, -100.0D, 100.0D, uv[2].u, uv[2].v); tessellator.addVertexWithUV(100.0D, -100.0D, -100.0D, uv[3].u, uv[3].v); tessellator.draw(); GL11.glPopMatrix(); } GL11.glDepthMask(true); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_ALPHA_TEST); } @SideOnly(Side.CLIENT) private static void renderEnderSky() { TextureManager renderEngine = Minecraft.getMinecraft().getTextureManager(); GL11.glDisable(GL11.GL_FOG); GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(770, 771, 1, 0); RenderHelper.disableStandardItemLighting(); GL11.glDepthMask(false); renderEngine.bindTexture(locationEndSkyPng); Tessellator tessellator = Tessellator.instance; for (int i = 0; i < 6; ++i) { GL11.glPushMatrix(); if (i == 1) { GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); } if (i == 2) { GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); } if (i == 3) { GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); } if (i == 4) { GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F); } if (i == 5) { GL11.glRotatef(-90.0F, 0.0F, 0.0F, 1.0F); } tessellator.startDrawingQuads(); tessellator.setColorOpaque_I(2631720); tessellator.addVertexWithUV(-100.0D, -100.0D, -100.0D, 0.0D, 0.0D); tessellator.addVertexWithUV(-100.0D, -100.0D, 100.0D, 0.0D, 16.0D); tessellator.addVertexWithUV(100.0D, -100.0D, 100.0D, 16.0D, 16.0D); tessellator.addVertexWithUV(100.0D, -100.0D, -100.0D, 16.0D, 0.0D); tessellator.draw(); GL11.glPopMatrix(); } GL11.glDepthMask(true); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_ALPHA_TEST); } /** * Renders the sky with the partial tick time. Args: partialTickTime */ @SideOnly(Side.CLIENT) private static void renderSky(float partialTickTime, DimensionInformation information) { initialize(); EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; WorldClient world = Minecraft.getMinecraft().theWorld; TextureManager renderEngine = Minecraft.getMinecraft().getTextureManager(); GL11.glDisable(GL11.GL_TEXTURE_2D); Vec3 vec3 = world.getSkyColor(player, partialTickTime); float skyRed = (float) vec3.xCoord; float skyGreen = (float) vec3.yCoord; float skyBlue = (float) vec3.zCoord; float f6; boolean anaglyph = Minecraft.getMinecraft().gameSettings.anaglyph; if (anaglyph) { float f4 = (skyRed * 30.0F + skyGreen * 59.0F + skyBlue * 11.0F) / 100.0F; float f5 = (skyRed * 30.0F + skyGreen * 70.0F) / 100.0F; f6 = (skyRed * 30.0F + skyBlue * 70.0F) / 100.0F; skyRed = f4; skyGreen = f5; skyBlue = f6; } GL11.glColor3f(skyRed, skyGreen, skyBlue); Tessellator tessellator = Tessellator.instance; GL11.glDepthMask(false); GL11.glEnable(GL11.GL_FOG); GL11.glColor3f(skyRed, skyGreen, skyBlue); GL11.glCallList(glSkyList); GL11.glDisable(GL11.GL_FOG); GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(770, 771, 1, 0); RenderHelper.disableStandardItemLighting(); float[] sunsetColors = world.provider.calcSunriseSunsetColors(world.getCelestialAngle(partialTickTime), partialTickTime); float f7; float f8; float f9; float f10; if (sunsetColors != null) { GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glShadeModel(GL11.GL_SMOOTH); GL11.glPushMatrix(); GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(MathHelper.sin(world.getCelestialAngleRadians(partialTickTime)) < 0.0F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F); GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F); f6 = sunsetColors[0]; f7 = sunsetColors[1]; f8 = sunsetColors[2]; float f11; if (anaglyph) { f9 = (f6 * 30.0F + f7 * 59.0F + f8 * 11.0F) / 100.0F; f10 = (f6 * 30.0F + f7 * 70.0F) / 100.0F; f11 = (f6 * 30.0F + f8 * 70.0F) / 100.0F; f6 = f9; f7 = f10; f8 = f11; } tessellator.startDrawing(6); tessellator.setColorRGBA_F(f6, f7, f8, sunsetColors[3]); tessellator.addVertex(0.0D, 100.0D, 0.0D); byte b0 = 16; tessellator.setColorRGBA_F(sunsetColors[0], sunsetColors[1], sunsetColors[2], 0.0F); for (int j = 0; j <= b0; ++j) { f11 = j * (float) Math.PI * 2.0F / b0; float f12 = MathHelper.sin(f11); float f13 = MathHelper.cos(f11); tessellator.addVertex((f12 * 120.0F), (f13 * 120.0F), (-f13 * 40.0F * sunsetColors[3])); } tessellator.draw(); GL11.glPopMatrix(); GL11.glShadeModel(GL11.GL_FLAT); } renderCelestialBodies(partialTickTime, information, world, renderEngine, tessellator); GL11.glColor3f(0.0F, 0.0F, 0.0F); double d0 = player.getPosition(partialTickTime).yCoord - world.getHorizon(); if (d0 < 0.0D) { GL11.glPushMatrix(); GL11.glTranslatef(0.0F, 12.0F, 0.0F); GL11.glCallList(glSkyList2); GL11.glPopMatrix(); f8 = 1.0F; f9 = -((float) (d0 + 65.0D)); f10 = -f8; tessellator.startDrawingQuads(); tessellator.setColorRGBA_I(0, 255); tessellator.addVertex((-f8), f9, f8); tessellator.addVertex(f8, f9, f8); tessellator.addVertex(f8, f10, f8); tessellator.addVertex((-f8), f10, f8); tessellator.addVertex((-f8), f10, (-f8)); tessellator.addVertex(f8, f10, (-f8)); tessellator.addVertex(f8, f9, (-f8)); tessellator.addVertex((-f8), f9, (-f8)); tessellator.addVertex(f8, f10, (-f8)); tessellator.addVertex(f8, f10, f8); tessellator.addVertex(f8, f9, f8); tessellator.addVertex(f8, f9, (-f8)); tessellator.addVertex((-f8), f9, (-f8)); tessellator.addVertex((-f8), f9, f8); tessellator.addVertex((-f8), f10, f8); tessellator.addVertex((-f8), f10, (-f8)); tessellator.addVertex((-f8), f10, (-f8)); tessellator.addVertex((-f8), f10, f8); tessellator.addVertex(f8, f10, f8); tessellator.addVertex(f8, f10, (-f8)); tessellator.draw(); } if (world.provider.isSkyColored()) { GL11.glColor3f(skyRed * 0.2F + 0.04F, skyGreen * 0.2F + 0.04F, skyBlue * 0.6F + 0.1F); } else { GL11.glColor3f(skyRed, skyGreen, skyBlue); } GL11.glPushMatrix(); GL11.glTranslatef(0.0F, -((float) (d0 - 16.0D)), 0.0F); GL11.glCallList(glSkyList2); GL11.glPopMatrix(); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glDepthMask(true); } private static void renderCelestialBodies(float partialTickTime, DimensionInformation information, WorldClient world, TextureManager renderEngine, Tessellator tessellator) { List<CelestialBodyDescriptor> celestialBodies = information.getCelestialBodyDescriptors(); GL11.glEnable(GL11.GL_TEXTURE_2D); OpenGlHelper.glBlendFunc(770, 1, 1, 0); GL11.glPushMatrix(); float f6 = 1.0F - world.getRainStrength(partialTickTime); ResourceLocation sun = getSun(information); ResourceLocation moon = getMoon(information); if (celestialBodies.isEmpty()) { GL11.glColor4f(1.0F, 1.0F, 1.0F, f6); GL11.glTranslatef(0.0F, 0.0F, 0.0F); GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(world.getCelestialAngle(partialTickTime) * 360.0F, 1.0F, 0.0F, 0.0F); float f10 = 30.0F; renderEngine.bindTexture(sun); tessellator.startDrawingQuads(); tessellator.addVertexWithUV((-f10), 100.0D, (-f10), 0.0D, 0.0D); tessellator.addVertexWithUV(f10, 100.0D, (-f10), 1.0D, 0.0D); tessellator.addVertexWithUV(f10, 100.0D, f10, 1.0D, 1.0D); tessellator.addVertexWithUV((-f10), 100.0D, f10, 0.0D, 1.0D); tessellator.draw(); f10 = 20.0F; float f14, f15, f16, f17; renderEngine.bindTexture(moon); if (!moon.equals(locationMoonPhasesPng)) { f14 = 0.0f; f15 = 0.0f; f16 = 1.0f; f17 = 1.0f; } else { int k = world.getMoonPhase(); int l = k % 4; int i1 = k / 4 % 2; f14 = (l + 0) / 4.0F; f15 = (i1 + 0) / 2.0F; f16 = (l + 1) / 4.0F; f17 = (i1 + 1) / 2.0F; } tessellator.startDrawingQuads(); tessellator.addVertexWithUV((-f10), -100.0D, f10, f16, f17); tessellator.addVertexWithUV(f10, -100.0D, f10, f14, f17); tessellator.addVertexWithUV(f10, -100.0D, (-f10), f14, f15); tessellator.addVertexWithUV((-f10), -100.0D, (-f10), f16, f15); tessellator.draw(); } else { Random random = new Random(world.getSeed()); for (CelestialBodyDescriptor body : celestialBodies) { float offset = 0.0f; float factor = 1.0f; float yangle = -90.0f; if (!body.isMain()) { offset = random.nextFloat() * 200.0f; factor = random.nextFloat() * 3.0f; yangle = random.nextFloat() * 180.0f; } switch (body.getType()) { case BODY_NONE: break; case BODY_SUN: GL11.glColor4f(1.0F, 1.0F, 1.0F, f6); renderSun(partialTickTime, world, renderEngine, tessellator, offset, factor, yangle, 30.0F, sun); break; case BODY_LARGESUN: GL11.glColor4f(1.0F, 1.0F, 1.0F, f6); renderSun(partialTickTime, world, renderEngine, tessellator, offset, factor, yangle, 80.0F, sun); break; case BODY_SMALLSUN: GL11.glColor4f(1.0F, 1.0F, 1.0F, f6); renderSun(partialTickTime, world, renderEngine, tessellator, offset, factor, yangle, 10.0F, sun); break; case BODY_REDSUN: GL11.glColor4f(1.0F, 0.0F, 0.0F, f6); renderSun(partialTickTime, world, renderEngine, tessellator, offset, factor, yangle, 30.0F, sun); break; case BODY_MOON: GL11.glColor4f(1.0F, 1.0F, 1.0F, f6); renderMoon(partialTickTime, world, renderEngine, tessellator, offset, factor, yangle, 20.0F, moon); break; case BODY_LARGEMOON: GL11.glColor4f(1.0F, 1.0F, 1.0F, f6); renderMoon(partialTickTime, world, renderEngine, tessellator, offset, factor, yangle, 60.0F, moon); break; case BODY_SMALLMOON: GL11.glColor4f(1.0F, 1.0F, 1.0F, f6); renderMoon(partialTickTime, world, renderEngine, tessellator, offset, factor, yangle, 10.0F, moon); break; case BODY_REDMOON: GL11.glColor4f(1.0F, 0.0F, 0.0F, f6); renderMoon(partialTickTime, world, renderEngine, tessellator, offset, factor, yangle, 20.0F, moon); break; case BODY_PLANET: GL11.glColor4f(1.0F, 1.0F, 1.0F, f6); renderPlanet(partialTickTime, world, renderEngine, tessellator, offset, factor, yangle, 10.0F); break; case BODY_LARGEPLANET: GL11.glColor4f(1.0F, 1.0F, 1.0F, f6); renderPlanet(partialTickTime, world, renderEngine, tessellator, offset, factor, yangle, 30.0F); break; } } } GL11.glDisable(GL11.GL_TEXTURE_2D); float f18 = world.getStarBrightness(partialTickTime) * f6; if (f18 > 0.0F) { GL11.glColor4f(f18, f18, f18, f18); GL11.glCallList(starGLCallList); } GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_ALPHA_TEST); GL11.glEnable(GL11.GL_FOG); GL11.glPopMatrix(); GL11.glDisable(GL11.GL_TEXTURE_2D); } private static ResourceLocation getSun(DimensionInformation information) { ResourceLocation sun; if (information.isPatreonBitSet(Patreons.PATREON_SICKSUN)) { sun = locationSickSunPng; } else if (information.isPatreonBitSet(Patreons.PATREON_RABBITSUN)) { sun = locationRabbitSunPng; } else { sun = locationSunPng; } return sun; } private static ResourceLocation getMoon(DimensionInformation information) { ResourceLocation moon; if (information.isPatreonBitSet(Patreons.PATREON_SICKMOON)) { moon = locationSickMoonPng; } else if (information.isPatreonBitSet(Patreons.PATREON_RABBITMOON)) { moon = locationRabbitMoonPng; } else if (information.isPatreonBitSet(Patreons.PATREON_TOMWOLF)) { moon = locationWolfMoonPng; } else { moon = locationMoonPhasesPng; } return moon; } private static void renderMoon(float partialTickTime, WorldClient world, TextureManager renderEngine, Tessellator tessellator, float offset, float factor, float yangle, float size, ResourceLocation moon) { GL11.glTranslatef(0.0F, 0.0F, 0.0F); GL11.glRotatef(yangle, 0.0F, 1.0F, 0.0F); float angle = world.provider.calculateCelestialAngle(world.getWorldInfo().getWorldTime(), partialTickTime); angle = angle * factor + offset; GL11.glRotatef(angle * 360.0F, 1.0F, 0.0F, 0.0F); float f14, f15, f16, f17; renderEngine.bindTexture(moon); if (!moon.equals(locationMoonPhasesPng)) { f14 = 0.0f; f15 = 0.0f; f16 = 1.0f; f17 = 1.0f; } else { int k = world.getMoonPhase(); int l = k % 4; int i1 = k / 4 % 2; f14 = (l + 0) / 4.0F; f15 = (i1 + 0) / 2.0F; f16 = (l + 1) / 4.0F; f17 = (i1 + 1) / 2.0F; } tessellator.startDrawingQuads(); tessellator.addVertexWithUV((-size), -100.0D, size, f16, f17); tessellator.addVertexWithUV(size, -100.0D, size, f14, f17); tessellator.addVertexWithUV(size, -100.0D, (-size), f14, f15); tessellator.addVertexWithUV((-size), -100.0D, (-size), f16, f15); tessellator.draw(); } private static void renderSun(float partialTickTime, WorldClient world, TextureManager renderEngine, Tessellator tessellator, float offset, float factor, float yangle, float size, ResourceLocation sun) { GL11.glTranslatef(0.0F, 0.0F, 0.0F); GL11.glRotatef(yangle, 0.0F, 1.0F, 0.0F); float angle = world.provider.calculateCelestialAngle(world.getWorldInfo().getWorldTime(), partialTickTime); angle = angle * factor + offset; GL11.glRotatef(angle * 360.0F, 1.0F, 0.0F, 0.0F); renderEngine.bindTexture(sun); tessellator.startDrawingQuads(); tessellator.addVertexWithUV((-size), 100.0D, (-size), 0.0D, 0.0D); tessellator.addVertexWithUV(size, 100.0D, (-size), 1.0D, 0.0D); tessellator.addVertexWithUV(size, 100.0D, size, 1.0D, 1.0D); tessellator.addVertexWithUV((-size), 100.0D, size, 0.0D, 1.0D); tessellator.draw(); } private static void renderPlanet(float partialTickTime, WorldClient world, TextureManager renderEngine, Tessellator tessellator, float offset, float factor, float yangle, float size) { GL11.glTranslatef(0.0F, 0.0F, 0.0F); GL11.glRotatef(yangle, 0.0F, 1.0F, 0.0F); float angle = world.provider.calculateCelestialAngle(world.getWorldInfo().getWorldTime(), partialTickTime); angle = angle * factor + offset; GL11.glRotatef(angle * 360.0F, 1.0F, 0.0F, 0.0F); renderEngine.bindTexture(locationPlanetPng); tessellator.startDrawingQuads(); tessellator.addVertexWithUV((-size), 100.0D, (-size), 0.0D, 0.0D); tessellator.addVertexWithUV(size, 100.0D, (-size), 1.0D, 0.0D); tessellator.addVertexWithUV(size, 100.0D, size, 1.0D, 1.0D); tessellator.addVertexWithUV((-size), 100.0D, size, 0.0D, 1.0D); tessellator.draw(); } private static void renderStars() { Random random = new Random(10842L); Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); for (int i = 0; i < 1500; ++i) { double d0 = (random.nextFloat() * 2.0F - 1.0F); double d1 = (random.nextFloat() * 2.0F - 1.0F); double d2 = (random.nextFloat() * 2.0F - 1.0F); double d3 = (0.15F + random.nextFloat() * 0.1F); double d4 = d0 * d0 + d1 * d1 + d2 * d2; if (d4 < 1.0D && d4 > 0.01D) { d4 = 1.0D / Math.sqrt(d4); d0 *= d4; d1 *= d4; d2 *= d4; double d5 = d0 * 100.0D; double d6 = d1 * 100.0D; double d7 = d2 * 100.0D; double d8 = Math.atan2(d0, d2); double d9 = Math.sin(d8); double d10 = Math.cos(d8); double d11 = Math.atan2(Math.sqrt(d0 * d0 + d2 * d2), d1); double d12 = Math.sin(d11); double d13 = Math.cos(d11); double d14 = random.nextDouble() * Math.PI * 2.0D; double d15 = Math.sin(d14); double d16 = Math.cos(d14); for (int j = 0; j < 4; ++j) { double d17 = 0.0D; double d18 = ((j & 2) - 1) * d3; double d19 = ((j + 1 & 2) - 1) * d3; double d20 = d18 * d16 - d19 * d15; double d21 = d19 * d16 + d18 * d15; double d22 = d20 * d12 + d17 * d13; double d23 = d17 * d12 - d20 * d13; double d24 = d23 * d9 - d21 * d10; double d25 = d21 * d9 + d23 * d10; tessellator.addVertex(d5 + d24, d6 + d22, d7 + d25); } } } tessellator.draw(); } @SideOnly(Side.CLIENT) public static void renderClouds(GenericWorldProvider provider, DimensionInformation information, float partialTicks) { GL11.glDisable(GL11.GL_CULL_FACE); Minecraft mc = Minecraft.getMinecraft(); TextureManager renderEngine = mc.getTextureManager(); float f1 = (float) (mc.renderViewEntity.lastTickPosY + (mc.renderViewEntity.posY - mc.renderViewEntity.lastTickPosY) * partialTicks); Tessellator tessellator = Tessellator.instance; float f2 = 12.0F; float f3 = 4.0F; RenderGlobal renderGlobal = mc.renderGlobal; double d0 = (CloudRenderAccessHelper.getCloudTickCounter(renderGlobal) + partialTicks); double entityX = mc.renderViewEntity.prevPosX + (mc.renderViewEntity.posX - mc.renderViewEntity.prevPosX) * partialTicks; double entityZ = mc.renderViewEntity.prevPosZ + (mc.renderViewEntity.posZ - mc.renderViewEntity.prevPosZ) * partialTicks; double d1 = (entityX + d0 * 0.029999999329447746D) / f2; double d2 = entityZ / f2 + 0.33000001311302185D; float y = provider.getCloudHeight() - f1 + 0.33F; int i = MathHelper.floor_double(d1 / 2048.0D); int j = MathHelper.floor_double(d2 / 2048.0D); d1 -= (i * 2048); d2 -= (j * 2048); renderEngine.bindTexture(locationCloudsPng); GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(770, 771, 1, 0); Vec3 vec3 = provider.worldObj.getCloudColour(partialTicks); float red = (float) vec3.xCoord; float green = (float) vec3.yCoord; float blue = (float) vec3.zCoord; float f8; float f9; float f10; if (mc.gameSettings.anaglyph) { f8 = (red * 30.0F + green * 59.0F + blue * 11.0F) / 100.0F; f9 = (red * 30.0F + green * 70.0F) / 100.0F; f10 = (red * 30.0F + blue * 70.0F) / 100.0F; red = f8; green = f9; blue = f10; } f10 = 0.00390625F; f8 = MathHelper.floor_double(d1) * f10; f9 = MathHelper.floor_double(d2) * f10; float f11 = (float) (d1 - MathHelper.floor_double(d1)); float f12 = (float) (d2 - MathHelper.floor_double(d2)); byte b0 = 8; byte b1 = 4; float f13 = 9.765625E-4F; GL11.glScalef(f2, 1.0F, f2); float cr = information.getSkyDescriptor().getCloudColorFactorR(); float cg = information.getSkyDescriptor().getCloudColorFactorG(); float cb = information.getSkyDescriptor().getCloudColorFactorB(); boolean randomColors = information.isPatreonBitSet(Patreons.PATREON_KENNEY); for (int k = 0; k < 2; ++k) { if (k == 0) { GL11.glColorMask(false, false, false, false); } else if (mc.gameSettings.anaglyph) { if (EntityRenderer.anaglyphField == 0) { GL11.glColorMask(false, true, true, true); } else { GL11.glColorMask(true, false, false, true); } } else { GL11.glColorMask(true, true, true, true); } for (int l = -b1 + 1; l <= b1; ++l) { for (int i1 = -b1 + 1; i1 <= b1; ++i1) { tessellator.startDrawingQuads(); float u = (l * b0); float v = (i1 * b0); float x = u - f11; float z = v - f12; if (randomColors) { // cr = (float) ((u % 10.0f) / 10.0f); // cg = (float) (((u + v) % 10.0f) / 10.0f); // cb = (float) ((v % 10.0f) / 10.0f); cr = x % 1.0f; cg = (x+z) % 1.0f; cb = z % 1.0f; } if (y > -f3 - 1.0F) { tessellator.setColorRGBA_F(red * 0.7F * cr, green * 0.7F * cg, blue * 0.7F * cb, 0.8F); tessellator.setNormal(0.0F, -1.0F, 0.0F); tessellator.addVertexWithUV((x + 0.0F), (y + 0.0F), (z + b0), ((u + 0.0F) * f10 + f8), ((v + b0) * f10 + f9)); tessellator.addVertexWithUV((x + b0), (y + 0.0F), (z + b0), ((u + b0) * f10 + f8), ((v + b0) * f10 + f9)); tessellator.addVertexWithUV((x + b0), (y + 0.0F), (z + 0.0F), ((u + b0) * f10 + f8), ((v + 0.0F) * f10 + f9)); tessellator.addVertexWithUV((x + 0.0F), (y + 0.0F), (z + 0.0F), ((u + 0.0F) * f10 + f8), ((v + 0.0F) * f10 + f9)); } if (y <= f3 + 1.0F) { tessellator.setColorRGBA_F(red * cr, green * cg, blue * cb, 0.8F); tessellator.setNormal(0.0F, 1.0F, 0.0F); tessellator.addVertexWithUV((x + 0.0F), (y + f3 - f13), (z + b0), ((u + 0.0F) * f10 + f8), ((v + b0) * f10 + f9)); tessellator.addVertexWithUV((x + b0), (y + f3 - f13), (z + b0), ((u + b0) * f10 + f8), ((v + b0) * f10 + f9)); tessellator.addVertexWithUV((x + b0), (y + f3 - f13), (z + 0.0F), ((u + b0) * f10 + f8), ((v + 0.0F) * f10 + f9)); tessellator.addVertexWithUV((x + 0.0F), (y + f3 - f13), (z + 0.0F), ((u + 0.0F) * f10 + f8), ((v + 0.0F) * f10 + f9)); } tessellator.setColorRGBA_F(red * 0.9F * cr, green * 0.9F * cg, blue * 0.9F * cb, 0.8F); int j1; if (l > -1) { tessellator.setNormal(-1.0F, 0.0F, 0.0F); for (j1 = 0; j1 < b0; ++j1) { tessellator.addVertexWithUV((x + j1 + 0.0F), (y + 0.0F), (z + b0), ((u + j1 + 0.5F) * f10 + f8), ((v + b0) * f10 + f9)); tessellator.addVertexWithUV((x + j1 + 0.0F), (y + f3), (z + b0), ((u + j1 + 0.5F) * f10 + f8), ((v + b0) * f10 + f9)); tessellator.addVertexWithUV((x + j1 + 0.0F), (y + f3), (z + 0.0F), ((u + j1 + 0.5F) * f10 + f8), ((v + 0.0F) * f10 + f9)); tessellator.addVertexWithUV((x + j1 + 0.0F), (y + 0.0F), (z + 0.0F), ((u + j1 + 0.5F) * f10 + f8), ((v + 0.0F) * f10 + f9)); } } if (l <= 1) { tessellator.setNormal(1.0F, 0.0F, 0.0F); for (j1 = 0; j1 < b0; ++j1) { tessellator.addVertexWithUV((x + j1 + 1.0F - f13), (y + 0.0F), (z + b0), ((u + j1 + 0.5F) * f10 + f8), ((v + b0) * f10 + f9)); tessellator.addVertexWithUV((x + j1 + 1.0F - f13), (y + f3), (z + b0), ((u + j1 + 0.5F) * f10 + f8), ((v + b0) * f10 + f9)); tessellator.addVertexWithUV((x + j1 + 1.0F - f13), (y + f3), (z + 0.0F), ((u + j1 + 0.5F) * f10 + f8), ((v + 0.0F) * f10 + f9)); tessellator.addVertexWithUV((x + j1 + 1.0F - f13), (y + 0.0F), (z + 0.0F), ((u + j1 + 0.5F) * f10 + f8), ((v + 0.0F) * f10 + f9)); } } tessellator.setColorRGBA_F(red * 0.8F * cr, green * 0.8F * cg, blue * 0.8F * cb, 0.8F); if (i1 > -1) { tessellator.setNormal(0.0F, 0.0F, -1.0F); for (j1 = 0; j1 < b0; ++j1) { tessellator.addVertexWithUV((x + 0.0F), (y + f3), (z + j1 + 0.0F), ((u + 0.0F) * f10 + f8), ((v + j1 + 0.5F) * f10 + f9)); tessellator.addVertexWithUV((x + b0), (y + f3), (z + j1 + 0.0F), ((u + b0) * f10 + f8), ((v + j1 + 0.5F) * f10 + f9)); tessellator.addVertexWithUV((x + b0), (y + 0.0F), (z + j1 + 0.0F), ((u + b0) * f10 + f8), ((v + j1 + 0.5F) * f10 + f9)); tessellator.addVertexWithUV((x + 0.0F), (y + 0.0F), (z + j1 + 0.0F), ((u + 0.0F) * f10 + f8), ((v + j1 + 0.5F) * f10 + f9)); } } if (i1 <= 1) { tessellator.setNormal(0.0F, 0.0F, 1.0F); for (j1 = 0; j1 < b0; ++j1) { tessellator.addVertexWithUV((x + 0.0F), (y + f3), (z + j1 + 1.0F - f13), ((u + 0.0F) * f10 + f8), ((v + j1 + 0.5F) * f10 + f9)); tessellator.addVertexWithUV((x + b0), (y + f3), (z + j1 + 1.0F - f13), ((u + b0) * f10 + f8), ((v + j1 + 0.5F) * f10 + f9)); tessellator.addVertexWithUV((x + b0), (y + 0.0F), (z + j1 + 1.0F - f13), ((u + b0) * f10 + f8), ((v + j1 + 0.5F) * f10 + f9)); tessellator.addVertexWithUV((x + 0.0F), (y + 0.0F), (z + j1 + 1.0F - f13), ((u + 0.0F) * f10 + f8), ((v + j1 + 0.5F) * f10 + f9)); } } tessellator.draw(); } } } GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_CULL_FACE); } }