package micdoodle8.mods.galacticraft.core.client; import micdoodle8.mods.galacticraft.core.Constants; import micdoodle8.mods.galacticraft.core.GalacticraftCore; import micdoodle8.mods.galacticraft.core.TransformerHooks; import micdoodle8.mods.galacticraft.core.network.PacketSimple; import micdoodle8.mods.galacticraft.core.proxy.ClientProxyCore; import micdoodle8.mods.galacticraft.core.util.ConfigManagerCore; import micdoodle8.mods.galacticraft.core.util.GCCoreUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.launchwrapper.Launch; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Vec3; import net.minecraftforge.client.IRenderHandler; import net.minecraftforge.fml.client.FMLClientHandler; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import org.lwjgl.util.glu.Project; import java.lang.reflect.Method; import java.util.Random; public class SkyProviderOverworld extends IRenderHandler { private static final ResourceLocation moonTexture = new ResourceLocation("textures/environment/moon_phases.png"); private static final ResourceLocation sunTexture = new ResourceLocation("textures/environment/sun.png"); private static boolean optifinePresent = false; static { try { optifinePresent = Launch.classLoader.getClassBytes("CustomColorizer") != null; } catch (final Exception e) { } } private int starGLCallList = GLAllocation.generateDisplayLists(7); private int glSkyList; private int glSkyList2; private final ResourceLocation planetToRender = new ResourceLocation(Constants.ASSET_PREFIX, "textures/gui/celestialbodies/earth.png"); public SkyProviderOverworld() { GL11.glPushMatrix(); Tessellator tessellator = Tessellator.getInstance(); WorldRenderer worldrenderer = tessellator.getWorldRenderer(); final Random rand = new Random(10842L); GL11.glNewList(this.starGLCallList, GL11.GL_COMPILE); this.renderStars(worldrenderer, rand); tessellator.draw(); GL11.glEndList(); GL11.glNewList(this.starGLCallList + 1, GL11.GL_COMPILE); this.renderStars(worldrenderer, rand); tessellator.draw(); GL11.glEndList(); GL11.glNewList(this.starGLCallList + 2, GL11.GL_COMPILE); this.renderStars(worldrenderer, rand); tessellator.draw(); GL11.glEndList(); GL11.glNewList(this.starGLCallList + 3, GL11.GL_COMPILE); this.renderStars(worldrenderer, rand); tessellator.draw(); GL11.glEndList(); GL11.glNewList(this.starGLCallList + 4, GL11.GL_COMPILE); this.renderStars(worldrenderer, rand); tessellator.draw(); GL11.glEndList(); GL11.glPopMatrix(); this.glSkyList = this.starGLCallList + 5; GL11.glNewList(this.glSkyList, GL11.GL_COMPILE); final byte byte2 = 5; final int i = 256 / byte2 + 2; float f = 16F; WorldRenderer worldRenderer = tessellator.getWorldRenderer(); for (int j = -byte2 * i; j <= byte2 * i; j += byte2) { for (int l = -byte2 * i; l <= byte2 * i; l += byte2) { worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); worldRenderer.pos(j, f, l).endVertex(); worldRenderer.pos(j + byte2, f, l).endVertex(); worldRenderer.pos(j + byte2, f, l + byte2).endVertex(); worldRenderer.pos(j, f, l + byte2).endVertex(); tessellator.draw(); } } GL11.glEndList(); this.glSkyList2 = this.starGLCallList + 6; GL11.glNewList(this.glSkyList2, GL11.GL_COMPILE); f = -16F; worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); for (int k = -byte2 * i; k <= byte2 * i; k += byte2) { for (int i1 = -byte2 * i; i1 <= byte2 * i; i1 += byte2) { worldRenderer.pos(k + byte2, f, i1).endVertex(); worldRenderer.pos(k, f, i1).endVertex(); worldRenderer.pos(k, f, i1 + byte2).endVertex(); worldRenderer.pos(k + byte2, f, i1 + byte2).endVertex(); } } tessellator.draw(); GL11.glEndList(); } private final Minecraft minecraft = FMLClientHandler.instance().getClient(); @Override public void render(float partialTicks, WorldClient world, Minecraft mc) { if (!ClientProxyCore.overworldTextureRequestSent) { GalacticraftCore.packetPipeline.sendToServer(new PacketSimple(PacketSimple.EnumSimplePacket.S_REQUEST_OVERWORLD_IMAGE, GCCoreUtil.getDimensionID(mc.theWorld), new Object[] {})); ClientProxyCore.overworldTextureRequestSent = true; } double zoom = 0.0; double yaw = 0.0; double pitch = 0.0; Method m = null; if (!optifinePresent) { try { Class<?> c = mc.entityRenderer.getClass(); zoom = mc.entityRenderer.cameraZoom; yaw = mc.entityRenderer.cameraYaw; pitch = mc.entityRenderer.cameraPitch; GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); if (zoom != 1.0D) { GL11.glTranslatef((float) yaw, (float) (-pitch), 0.0F); GL11.glScaled(zoom, zoom, 1.0D); } Project.gluPerspective(mc.gameSettings.fovSetting, (float) mc.displayWidth / (float) mc.displayHeight, 0.05F, 1400.0F); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glLoadIdentity(); mc.entityRenderer.orientCamera(partialTicks); } catch (Exception e) { e.printStackTrace(); } } float theta = MathHelper.sqrt_float(((float) (mc.thePlayer.posY) - Constants.OVERWORLD_SKYPROVIDER_STARTHEIGHT) / 1000.0F); final float var21 = Math.max(1.0F - theta * 4.0F, 0.0F); GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glDisable(GL12.GL_RESCALE_NORMAL); final Vec3 var2 = this.minecraft.theWorld.getSkyColor(this.minecraft.getRenderViewEntity(), partialTicks); float i = (float) var2.xCoord * var21; float x = (float) var2.yCoord * var21; float var5 = (float) var2.zCoord * var21; float z; if (this.minecraft.gameSettings.anaglyph) { final float y = (i * 30.0F + x * 59.0F + var5 * 11.0F) / 100.0F; final float var7 = (i * 30.0F + x * 70.0F) / 100.0F; z = (i * 30.0F + var5 * 70.0F) / 100.0F; i = y; x = var7; var5 = z; } GL11.glColor3f(i, x, var5); final Tessellator var23 = Tessellator.getInstance(); WorldRenderer worldRenderer = var23.getWorldRenderer(); GL11.glDepthMask(false); GL11.glEnable(GL11.GL_FOG); GL11.glColor3f(i, x, var5); if (mc.thePlayer.posY < 214) { GL11.glCallList(this.glSkyList); } GL11.glDisable(GL11.GL_FOG); GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); RenderHelper.disableStandardItemLighting(); final float[] costh = this.minecraft.theWorld.provider.calcSunriseSunsetColors(this.minecraft.theWorld.getCelestialAngle(partialTicks), partialTicks); float var9; float size; float rand1; float r; if (costh != null) { final float sunsetModInv = Math.min(1.0F, Math.max(1.0F - theta * 50.0F, 0.0F)); 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(this.minecraft.theWorld.getCelestialAngleRadians(partialTicks)) < 0.0F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F); GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F); z = costh[0] * sunsetModInv; var9 = costh[1] * sunsetModInv; size = costh[2] * sunsetModInv; float rand3; if (this.minecraft.gameSettings.anaglyph) { rand1 = (z * 30.0F + var9 * 59.0F + size * 11.0F) / 100.0F; r = (z * 30.0F + var9 * 70.0F) / 100.0F; rand3 = (z * 30.0F + size * 70.0F) / 100.0F; z = rand1; var9 = r; size = rand3; } worldRenderer.begin(GL11.GL_TRIANGLE_FAN, DefaultVertexFormats.POSITION_COLOR); worldRenderer.pos(0.0D, 100.0D, 0.0D).color(z * sunsetModInv, var9 * sunsetModInv, size * sunsetModInv, costh[3]).endVertex(); final byte phi = 16; for (int var27 = 0; var27 <= phi; ++var27) { rand3 = var27 * Constants.twoPI / phi; final float xx = MathHelper.sin(rand3); final float rand5 = MathHelper.cos(rand3); worldRenderer.pos(xx * 120.0F, rand5 * 120.0F, -rand5 * 40.0F * costh[3]).color(costh[0] * sunsetModInv, costh[1] * sunsetModInv, costh[2] * sunsetModInv, 0.0F).endVertex(); } var23.draw(); GL11.glPopMatrix(); GL11.glShadeModel(GL11.GL_FLAT); } GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); GL11.glPushMatrix(); z = 1.0F - this.minecraft.theWorld.getRainStrength(partialTicks); var9 = 0.0F; size = 0.0F; rand1 = 0.0F; GL11.glColor4f(1.0F, 1.0F, 1.0F, z); GL11.glTranslatef(var9, size, rand1); GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(this.minecraft.theWorld.getCelestialAngle(partialTicks) * 360.0F, 1.0F, 0.0F, 0.0F); double playerHeight = this.minecraft.thePlayer.posY; //Draw stars GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glDisable(GL11.GL_TEXTURE_2D); float threshold; Vec3 vec = TransformerHooks.getFogColorHook(this.minecraft.theWorld); threshold = Math.max(0.1F, (float) vec.lengthVector() - 0.1F); float var20 = ((float) playerHeight - Constants.OVERWORLD_SKYPROVIDER_STARTHEIGHT) / 1000.0F; var20 = MathHelper.sqrt_float(var20); float bright1 = Math.min(0.9F, var20 * 3); // float bright2 = Math.min(0.85F, var20 * 2.5F); // float bright3 = Math.min(0.8F, var20 * 2); // float bright4 = Math.min(0.75F, var20 * 1.5F); // float bright5 = Math.min(0.7F, var20 * 0.75F); if (bright1 > threshold) { GL11.glColor4f(bright1, bright1, bright1, 1.0F); GL11.glCallList(this.starGLCallList); } // if (bright2 > threshold) // { // GL11.glColor4f(bright2, bright2, bright2, 1.0F); // GL11.glCallList(this.starGLCallList + 1); // } // if (bright3 > threshold) // { // GL11.glColor4f(bright3, bright3, bright3, 1.0F); GL11.glCallList(this.starGLCallList + 2); // } // if (bright4 > threshold) // { // GL11.glColor4f(bright4, bright4, bright4, 1.0F); GL11.glCallList(this.starGLCallList + 3); // } // if (bright5 > threshold) // { // GL11.glColor4f(bright5, bright5, bright5, 1.0F); GL11.glCallList(this.starGLCallList + 4); // } //Draw sun GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); r = 30.0F; GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.minecraft.renderEngine.bindTexture(SkyProviderOverworld.sunTexture); worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); worldRenderer.pos(-r, 100.0D, -r).tex(0.0D, 0.0D).endVertex(); worldRenderer.pos(r, 100.0D, -r).tex(1.0D, 0.0D).endVertex(); worldRenderer.pos(r, 100.0D, r).tex(1.0D, 1.0D).endVertex(); worldRenderer.pos(-r, 100.0D, r).tex(0.0D, 1.0D).endVertex(); var23.draw(); //Draw moon r = 40.0F; this.minecraft.renderEngine.bindTexture(SkyProviderOverworld.moonTexture); float sinphi = this.minecraft.theWorld.getMoonPhase(); final int cosphi = (int) (sinphi % 4); final int var29 = (int) (sinphi / 4 % 2); final float yy = (cosphi) / 4.0F; final float rand7 = (var29) / 2.0F; final float zz = (cosphi + 1) / 4.0F; final float rand9 = (var29 + 1) / 2.0F; worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); worldRenderer.pos(-r, -100.0D, r).tex(zz, rand9).endVertex(); worldRenderer.pos(r, -100.0D, r).tex(yy, rand9).endVertex(); worldRenderer.pos(r, -100.0D, -r).tex(yy, rand7).endVertex(); worldRenderer.pos(-r, -100.0D, -r).tex(zz, rand7).endVertex(); var23.draw(); GL11.glDisable(GL11.GL_TEXTURE_2D); 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); GL11.glColor3f(0.0F, 0.0F, 0.0F); //TODO get exact height figure here double var25 = playerHeight - 64; if (var25 > this.minecraft.gameSettings.renderDistanceChunks * 16) { theta *= 400.0F; final float sinth = Math.max(Math.min(theta / 100.0F - 0.2F, 0.5F), 0.0F); GL11.glPushMatrix(); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glDisable(GL11.GL_FOG); float scale = 850 * (0.25F - theta / 10000.0F); scale = Math.max(scale, 0.2F); GL11.glScalef(scale, 1.0F, scale); GL11.glTranslatef(0.0F, -(float) mc.thePlayer.posY, 0.0F); // if (ClientProxyCore.overworldTextureLocal != null) // { // GL11.glBindTexture(GL11.GL_TEXTURE_2D, ClientProxyCore.overworldTextureLocal.getGlTextureId()); // } // else { this.minecraft.renderEngine.bindTexture(this.planetToRender); } size = 1.0F; GL11.glColor4f(sinth, sinth, sinth, 1.0F); worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); // float zoomIn = (1F - (float) var25 / 768F) / 5.86F; // if (zoomIn < 0F) zoomIn = 0F; float zoomIn = 0.0F; float cornerB = 1.0F - zoomIn; worldRenderer.pos(-size, 0, size).tex(zoomIn, cornerB).endVertex(); worldRenderer.pos(size, 0, size).tex(cornerB, cornerB).endVertex(); worldRenderer.pos(size, 0, -size).tex(cornerB, zoomIn).endVertex(); worldRenderer.pos(-size, 0, -size).tex(zoomIn, zoomIn).endVertex(); var23.draw(); GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glPopMatrix(); } GL11.glColor3f(0.0f, 0.0f, 0.0f); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glDepthMask(true); if (!optifinePresent) { try { GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); if (zoom != 1.0D) { GL11.glTranslatef((float) yaw, (float) (-pitch), 0.0F); GL11.glScaled(zoom, zoom, 1.0D); } Project.gluPerspective(mc.gameSettings.fovSetting, (float) mc.displayWidth / (float) mc.displayHeight, 0.05F, this.minecraft.gameSettings.renderDistanceChunks * 16 * 2.0F); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glLoadIdentity(); mc.entityRenderer.orientCamera(partialTicks); } catch (Exception e) { e.printStackTrace(); } } GL11.glEnable(GL11.GL_COLOR_MATERIAL); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glDisable(GL11.GL_BLEND); } private void renderStars(WorldRenderer worldRenderer, Random rand) { worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); for (int i = 0; i < (ConfigManagerCore.moreStars ? 4000 : 1200); ++i) { double x = rand.nextFloat() * 2.0F - 1.0F; double y = rand.nextFloat() * 2.0F - 1.0F; double z = rand.nextFloat() * 2.0F - 1.0F; final double size = 0.15F + rand.nextFloat() * 0.1F; double r = x * x + y * y + z * z; if (r < 1.0D && r > 0.01D) { r = 1.0D / Math.sqrt(r); x *= r; y *= r; z *= r; final double xx = x * (ConfigManagerCore.moreStars ? rand.nextDouble() * 100D + 150D : 100.0D); final double zz = z * (ConfigManagerCore.moreStars ? rand.nextDouble() * 100D + 150D : 100.0D); if (Math.abs(xx) < 29D && Math.abs(zz) < 29D) { continue; } final double yy = y * (ConfigManagerCore.moreStars ? rand.nextDouble() * 100D + 150D : 100.0D); final double theta = Math.atan2(x, z); final double sinth = Math.sin(theta); final double costh = Math.cos(theta); final double phi = Math.atan2(Math.sqrt(x * x + z * z), y); final double sinphi = Math.sin(phi); final double cosphi = Math.cos(phi); final double rho = rand.nextDouble() * Math.PI * 2.0D; final double sinrho = Math.sin(rho); final double cosrho = Math.cos(rho); for (int j = 0; j < 4; ++j) { final double a = 0.0D; final double b = ((j & 2) - 1) * size; final double c = ((j + 1 & 2) - 1) * size; final double d = b * cosrho - c * sinrho; final double e = c * cosrho + b * sinrho; final double dy = d * sinphi + a * cosphi; final double ff = a * sinphi - d * cosphi; final double dx = ff * sinth - e * costh; final double dz = e * sinth + ff * costh; worldRenderer.pos(xx + dx, yy + dy, zz + dz).endVertex(); } } } } }