package com.hbm.render.world; import cpw.mods.fml.client.FMLClientHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Vec3; import net.minecraft.world.WorldProviderSurface; import net.minecraftforge.client.IRenderHandler; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import com.hbm.extprop.HbmLivingProps; import com.hbm.main.ModEventHandler; import java.util.Random; public class RenderNTMSkyboxImpact extends IRenderHandler { private static final ResourceLocation sunTexture = new ResourceLocation("textures/environment/sun.png"); private static final ResourceLocation moonTexture = new ResourceLocation("textures/environment/moon_phases.png"); private static final ResourceLocation digammaStar = new ResourceLocation("hbm:textures/misc/star_digamma.png"); private static final ResourceLocation bobmazonSat = new ResourceLocation("hbm:textures/misc/sat_bobmazon.png"); public int starGLCallList = GLAllocation.generateDisplayLists(3); public int glSkyList; public int glSkyList2; protected double x; protected double y; protected double z; /// I had to break your compat feature for other mods' skyboxes in order to /// make the skybox render correctly after Tom. Sorry about that. -Pu public RenderNTMSkyboxImpact() { GL11.glPushMatrix(); GL11.glNewList(this.starGLCallList, GL11.GL_COMPILE); this.renderStars(); GL11.glEndList(); GL11.glPopMatrix(); final Tessellator tessellator = Tessellator.instance; this.glSkyList = this.starGLCallList + 1; GL11.glNewList(this.glSkyList, GL11.GL_COMPILE); final byte byte2 = 64; final int i = 256 / byte2 + 2; float f = 16F; for(int j = -byte2 * i; j <= byte2 * i; j += byte2) { for(int l = -byte2 * i; l <= byte2 * i; l += byte2) { tessellator.startDrawingQuads(); tessellator.addVertex(j + 0, f, l + 0); tessellator.addVertex(j + byte2, f, l + 0); tessellator.addVertex(j + byte2, f, l + byte2); tessellator.addVertex(j + 0, f, l + byte2); tessellator.draw(); } } GL11.glEndList(); this.glSkyList2 = this.starGLCallList + 2; GL11.glNewList(this.glSkyList2, GL11.GL_COMPILE); f = -16F; tessellator.startDrawingQuads(); for(int k = -byte2 * i; k <= byte2 * i; k += byte2) { for(int i1 = -byte2 * i; i1 <= byte2 * i; i1 += byte2) { tessellator.addVertex(k + byte2, f, i1 + 0); tessellator.addVertex(k + 0, f, i1 + 0); tessellator.addVertex(k + 0, f, i1 + byte2); tessellator.addVertex(k + byte2, f, i1 + byte2); } } tessellator.draw(); GL11.glEndList(); } @Override public void render(float partialTicks, WorldClient world, Minecraft mc) { float atmosphericDust = ModEventHandler.dust; GL11.glDisable(GL11.GL_TEXTURE_2D); Vec3 vec3 = world.getSkyColor(mc.renderViewEntity, partialTicks); float f1 = (float) vec3.xCoord; float f2 = (float) vec3.yCoord; float f3 = (float) vec3.zCoord; float f6; float dust = Math.max((1.0F - (atmosphericDust * 2)), 0); float rain = dust * (1.0F - world.getRainStrength(partialTicks)); if(mc.gameSettings.anaglyph) { float f4 = (f1 * 30.0F + f2 * 59.0F + f3 * 11.0F) / 100.0F; float f5 = (f1 * 30.0F + f2 * 70.0F) / 100.0F; f6 = (f1 * 30.0F + f3 * 70.0F) / 100.0F; f1 = f4; f2 = f5; f3 = f6; } GL11.glColor3f(f1, f2, f3); Tessellator tessellator = Tessellator.instance; GL11.glDepthMask(false); GL11.glEnable(GL11.GL_FOG); GL11.glColor3f(f1, f2, f3); GL11.glCallList(this.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 f7; float f8; float f9; float f10; float f18 = world.getStarBrightness(partialTicks); if(f18 > 0.0F) { GL11.glPushMatrix(); GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(world.getCelestialAngle(partialTicks) * 360.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(-19.0F, 0, 1.0F, 0); GL11.glColor4f(f18, f18, f18, f18 * rain); GL11.glCallList(this.starGLCallList); GL11.glPopMatrix(); } GL11.glShadeModel(GL11.GL_FLAT); GL11.glEnable(GL11.GL_TEXTURE_2D); OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO); GL11.glPushMatrix(); f7 = 0.0F; f8 = 0.0F; f9 = 0.0F; GL11.glTranslatef(f7, f8, f9); GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(world.getCelestialAngle(partialTicks) * 360.0F, 1.0F, 0.0F, 0.0F); // Render sun GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glColor4f(0.0F, 0.0F, 0.0F, 1.0F); // Some blanking to conceal the stars f10 = 30.0F; tessellator.startDrawingQuads(); tessellator.addVertex(-f10, 99.9D, -f10); tessellator.addVertex(f10, 99.9D, -f10); tessellator.addVertex(f10, 99.9D, f10); tessellator.addVertex(-f10, 99.9D, f10); tessellator.draw(); { GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glColor4f(1.0F, 1.0F, 1.0F, rain); mc.renderEngine.bindTexture(this.sunTexture); 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(); } { GL11.glColor4d(1, 1, 1, rain); f10 = 20.0F; FMLClientHandler.instance().getClient().renderEngine.bindTexture(RenderNTMSkyboxImpact.moonTexture); float sinphi = FMLClientHandler.instance().getClient().theWorld.getMoonPhase(); final int cosphi = (int) (sinphi % 4); final int var29 = (int) (sinphi / 4 % 2); final float yy = (cosphi + 0) / 4.0F; final float rand7 = (var29 + 0) / 2.0F; final float zz = (cosphi + 1) / 4.0F; final float rand9 = (var29 + 1) / 2.0F; tessellator.startDrawingQuads(); tessellator.addVertexWithUV(-f10, -100.0D, f10, zz, rand9); tessellator.addVertexWithUV(f10, -100.0D, f10, yy, rand9); tessellator.addVertexWithUV(f10, -100.0D, -f10, yy, rand7); tessellator.addVertexWithUV(-f10, -100.0D, -f10, zz, rand7); tessellator.draw(); } { OpenGlHelper.glBlendFunc(770, 1, 1, 0); float brightness = (float) Math.sin(world.getCelestialAngle(partialTicks) * Math.PI); brightness *= brightness; GL11.glPushMatrix(); GL11.glColor4f(brightness, brightness, brightness, dust); GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(world.getCelestialAngle(partialTicks) * 360.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(140.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(-40.0F, 0.0F, 0.0F, 1.0F); FMLClientHandler.instance().getClient().renderEngine.bindTexture(digammaStar); float digamma = HbmLivingProps.getDigamma(Minecraft.getMinecraft().thePlayer); float var12 = 1F * (1 + digamma * 0.25F); double dist = 100D - digamma * 2.5; tessellator.startDrawingQuads(); tessellator.addVertexWithUV(-var12, dist, -var12, 0.0D, 0.0D); tessellator.addVertexWithUV(var12, dist, -var12, 0.0D, 1.0D); tessellator.addVertexWithUV(var12, dist, var12, 1.0D, 1.0D); tessellator.addVertexWithUV(-var12, dist, var12, 1.0D, 0.0D); tessellator.draw(); GL11.glPopMatrix(); GL11.glPushMatrix(); GL11.glColor4f(brightness, brightness, brightness, rain); GL11.glRotatef(-40.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef((System.currentTimeMillis() % (360 * 1000) / 1000F), 0.0F, 1.0F, 0.0F); GL11.glRotatef((System.currentTimeMillis() % (360 * 100) / 100F), 1.0F, 0.0F, 0.0F); FMLClientHandler.instance().getClient().renderEngine.bindTexture(bobmazonSat); var12 = 0.5F; dist = 100D; tessellator.startDrawingQuads(); tessellator.addVertexWithUV(-var12, dist, -var12, 0.0D, 0.0D); tessellator.addVertexWithUV(var12, dist, -var12, 0.0D, 1.0D); tessellator.addVertexWithUV(var12, dist, var12, 1.0D, 1.0D); tessellator.addVertexWithUV(-var12, dist, var12, 1.0D, 0.0D); tessellator.draw(); GL11.glPopMatrix(); } 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); double d0 = mc.thePlayer.getPosition(partialTicks).yCoord - world.getHorizon(); if(d0 < 0.0D) { GL11.glPushMatrix(); GL11.glTranslatef(0.0F, 12.0F, 0.0F); GL11.glCallList(this.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(f1 * 0.2F + 0.04F, f2 * 0.2F + 0.04F, f3 * 0.6F + 0.1F); } else { GL11.glColor3f(f1, f2, f3); } GL11.glPushMatrix(); GL11.glTranslatef(0.0F, -((float) (d0 - 16.0D)), 0.0F); GL11.glCallList(this.glSkyList2); GL11.glPopMatrix(); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glDepthMask(true); } private void renderStars() { Random random = new Random(10842L); Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); for(int i = 0; i < 1500; ++i) { double d0 = (double) (random.nextFloat() * 2.0F - 1.0F); double d1 = (double) (random.nextFloat() * 2.0F - 1.0F); double d2 = (double) (random.nextFloat() * 2.0F - 1.0F); double d3 = (double) (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 = (double) ((j & 2) - 1) * d3; double d19 = (double) ((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(); } }