From aff7f368d50c4f63f6f17b61e2a7e3ef4b685b75 Mon Sep 17 00:00:00 2001 From: d4rkfly3r Date: Fri, 28 Apr 2017 18:14:12 -0700 Subject: [PATCH] Fixing Limbo Sky --- .../shared/world/CustomSkyProvider.java | 152 ++++++++++-------- .../limbodimension/LimboSkyProvider.java | 9 +- .../dimdoors/textures/other/limboMoon.png | Bin 0 -> 4197 bytes .../dimdoors/textures/other/limboSun.png | Bin 0 -> 5411 bytes 4 files changed, 88 insertions(+), 73 deletions(-) create mode 100644 src/main/resources/assets/dimdoors/textures/other/limboMoon.png create mode 100644 src/main/resources/assets/dimdoors/textures/other/limboSun.png diff --git a/src/main/java/com/zixiken/dimdoors/shared/world/CustomSkyProvider.java b/src/main/java/com/zixiken/dimdoors/shared/world/CustomSkyProvider.java index b470de7f..e9950251 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/world/CustomSkyProvider.java +++ b/src/main/java/com/zixiken/dimdoors/shared/world/CustomSkyProvider.java @@ -3,8 +3,8 @@ package com.zixiken.dimdoors.shared.world; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.client.renderer.vertex.*; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -15,11 +15,10 @@ import org.lwjgl.opengl.GL11; public class CustomSkyProvider extends IRenderHandler { + private static final ResourceLocation locationEndSkyPng = new ResourceLocation("textures/environment/end_sky.png"); int starGLCallList; int glSkyList; int glSkyList2; - private static final ResourceLocation locationEndSkyPng = new ResourceLocation("textures/environment/end_sky.png"); - public ResourceLocation getMoonRenderPath() { return null; @@ -46,28 +45,35 @@ public class CustomSkyProvider extends IRenderHandler { mc.renderEngine.bindTexture((locationEndSkyPng)); - if (world.provider.isSurfaceWorld()) { + if (mc.world.provider.isSurfaceWorld()) { GL11.glDisable(GL11.GL_TEXTURE_2D); - Vec3d vec3 = world.getSkyColor(mc.getRenderViewEntity(), par1); + final Vec3d vec3 = world.getSkyColor(mc.getRenderViewEntity(), par1); float f1 = (float) vec3.xCoord; float f2 = (float) vec3.yCoord; float f3 = (float) vec3.zCoord; float f4; + if (mc.gameSettings.anaglyph) { + float f5 = (f1 * 30.0F + f2 * 59.0F + f3 * 11.0F) / 100.0F; + float f6 = (f1 * 30.0F + f2 * 70.0F) / 100.0F; + f4 = (f1 * 30.0F + f3 * 70.0F) / 100.0F; + f1 = f5; + f2 = f6; + f3 = f4; + } + GL11.glColor3f(f1, f2, f3); - Tessellator tessellator = Tessellator.getInstance(); - VertexBuffer buffer = tessellator.getBuffer(); - - GlStateManager.depthMask(false); - GlStateManager.enableFog(); - GlStateManager.color(f1, f2, f3); - GlStateManager.callList(this.glSkyList); - GlStateManager.disableFog(); - GlStateManager.disableAlpha(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + final Tessellator tessellator = Tessellator.getInstance(); + final VertexBuffer buffer = tessellator.getBuffer(); + 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); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); RenderHelper.disableStandardItemLighting(); - float[] afloat = world.provider.calcSunriseSunsetColors(world.getCelestialAngle(par1), par1); float f7; float f8; @@ -75,56 +81,60 @@ public class CustomSkyProvider extends IRenderHandler { float f10; if (afloat != null) { - GlStateManager.disableTexture2D(); - GlStateManager.shadeModel(GL11.GL_SMOOTH); - GlStateManager.pushMatrix(); - GlStateManager.rotate(90.0F, 1.0F, 0.0F, 0.0F); - GlStateManager.rotate(MathHelper.sin(world.getCelestialAngleRadians(par1)) < 0.0F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F); - GlStateManager.rotate(90.0F, 0.0F, 0.0F, 1.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(world.getCelestialAngleRadians(par1)) < 0.0F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F); f4 = afloat[0]; f7 = afloat[1]; f8 = afloat[2]; float f11; - buffer.begin(6, DefaultVertexFormats.POSITION_COLOR); - - buffer.pos(0d, 100d, 0d).color(f4, f7, f8, afloat[3]).endVertex(); + if (mc.gameSettings.anaglyph) { + f9 = (f4 * 30.0F + f7 * 59.0F + f8 * 11.0F) / 100.0F; + f10 = (f4 * 30.0F + f7 * 70.0F) / 100.0F; + f11 = (f4 * 30.0F + f8 * 70.0F) / 100.0F; + f4 = f9; + f7 = f10; + f8 = f11; + } + buffer.begin(GL11.GL_TRIANGLE_FAN, DefaultVertexFormats.POSITION_COLOR); + buffer.color(f4, f7, f8, afloat[3]).pos(0.0, 100D, 0).endVertex(); byte b0 = 16; 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); - - buffer.pos(f12 * 120.0F, f13 * 120.0F, -f13 * 40.0F * afloat[3]).color(afloat[0], afloat[1], afloat[2], 0.0f).endVertex(); + buffer.color(afloat[0], afloat[1], afloat[2], 0.0F).pos(f12 * 120.0F, f13 * 120.0F, -f13 * 40.0F * afloat[3]).endVertex(); } tessellator.draw(); - GlStateManager.popMatrix(); - GlStateManager.shadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + GL11.glShadeModel(GL11.GL_FLAT); } - GlStateManager.enableTexture2D(); - GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); - GlStateManager.pushMatrix(); - + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glPushMatrix(); f4 = 1.0F - world.getRainStrength(par1); f7 = 0.0F; f8 = 0.0F; f9 = 0.0F; - GlStateManager.color(1.0F, 1.0F, 1.0F, f4); - GlStateManager.translate(f7, f8, f9); - GlStateManager.rotate(-90.0F, 0.0F, 1.0F, 0.0F); - GlStateManager.rotate(world.getCelestialAngle(par1) * 360.0F, 1.0F, 0.0F, 0.0F); - + GL11.glColor4f(1.0F, 1.0F, 1.0F, f4); + GL11.glTranslatef(f7, f8, f9); + GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(world.getCelestialAngle(par1) * 360.0F, 1.0F, 0.0F, 0.0F); f10 = 30.0F; mc.renderEngine.bindTexture(this.getSunRenderPath()); buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); - buffer.pos(-f10, 100.0D, -f10).tex(0.0D, 0.0D).endVertex(); - buffer.pos(f10, 100.0D, -f10).tex(1.0D, 0.0D).endVertex(); - buffer.pos(f10, 100.0D, f10).tex(1.0D, 1.0D).endVertex(); - buffer.pos(-f10, 100.0D, f10).tex(0.0D, 1.0D).endVertex(); + buffer.pos(-f10, 100, -f10).tex(0, 0).endVertex(); + buffer.pos(f10, 100, -f10).tex(1, 0).endVertex(); + buffer.pos(f10, 100, f10).tex(1, 1).endVertex(); + buffer.pos(-f10, 100, f10).tex(0, 1).endVertex(); tessellator.draw(); f10 = 20.0F; @@ -137,33 +147,33 @@ public class CustomSkyProvider extends IRenderHandler { float f16 = l + 1; float f17 = i1 + 1; buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); - buffer.pos(-f10, -100.0D, f10).tex(f16, f17).endVertex(); - buffer.pos(f10, -100.0D, f10).tex(f14, f17).endVertex(); - buffer.pos(f10, -100.0D, -f10).tex(f14, f15).endVertex(); - buffer.pos(-f10, -100.0D, -f10).tex(f16, f15).endVertex(); + buffer.pos(-f10, -100, f10).tex(f16, f17).endVertex(); + buffer.pos(f10, -100, f10).tex(f14, f17).endVertex(); + buffer.pos(f10, -100, -f10).tex(f14, f15).endVertex(); + buffer.pos(-f10, -100, -f10).tex(f16, f15).endVertex(); tessellator.draw(); - GlStateManager.disableTexture2D(); + GL11.glDisable(GL11.GL_TEXTURE_2D); float f18 = world.getStarBrightness(par1) * f4; if (f18 > 0.0F) { - GlStateManager.color(f18, f18, f18, f18); - GlStateManager.callList(this.starGLCallList); + GL11.glColor4f(f18, f18, f18, f18); + GL11.glCallList(this.starGLCallList); } - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - GlStateManager.disableBlend(); - GlStateManager.enableAlpha(); - GlStateManager.enableFog(); - GlStateManager.popMatrix(); - GlStateManager.disableTexture2D(); - GlStateManager.color(0.0F, 0.0F, 0.0F); - double d0 = mc.player.getPosition().getY() - world.getHorizon(); + 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.player.getLook(par1).yCoord - world.getHorizon(); if (d0 < 0.0D) { - GlStateManager.pushMatrix(); - GlStateManager.translate(0.0F, 12.0F, 0.0F); - GlStateManager.callList(this.glSkyList2); - GlStateManager.popMatrix(); + 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; @@ -193,17 +203,17 @@ public class CustomSkyProvider extends IRenderHandler { } if (world.provider.isSkyColored()) { - GlStateManager.color(f1 * 0.2F + 0.04F, f2 * 0.2F + 0.04F, f3 * 0.6F + 0.1F); + GL11.glColor3f(f1 * 0.2F + 0.04F, f2 * 0.2F + 0.04F, f3 * 0.6F + 0.1F); } else { - GlStateManager.color(f1, f2, f3); + GL11.glColor3f(f1, f2, f3); } - GlStateManager.pushMatrix(); - GlStateManager.translate(0.0F, -((float) (d0 - 16.0D)), 0.0F); - GlStateManager.callList(this.glSkyList2); - GlStateManager.popMatrix(); - GlStateManager.enableTexture2D(); - GlStateManager.depthMask(true); + 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); } } diff --git a/src/main/java/com/zixiken/dimdoors/shared/world/limbodimension/LimboSkyProvider.java b/src/main/java/com/zixiken/dimdoors/shared/world/limbodimension/LimboSkyProvider.java index 959163da..c7d8c182 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/world/limbodimension/LimboSkyProvider.java +++ b/src/main/java/com/zixiken/dimdoors/shared/world/limbodimension/LimboSkyProvider.java @@ -1,5 +1,6 @@ package com.zixiken.dimdoors.shared.world.limbodimension; +import com.zixiken.dimdoors.DimDoors; import com.zixiken.dimdoors.shared.world.CustomSkyProvider; import net.minecraft.util.ResourceLocation; @@ -7,14 +8,18 @@ import net.minecraft.util.ResourceLocation; * Created by Jared Johnson on 1/24/2017. */ public class LimboSkyProvider extends CustomSkyProvider { + private static final ResourceLocation limboMoonResourceLoc = new ResourceLocation(DimDoors.MODID + ":textures/other/limboMoon.png"); + private static final ResourceLocation limboSunResourceLoc = new ResourceLocation(DimDoors.MODID + ":textures/other/limboSun.png"); @Override public ResourceLocation getMoonRenderPath() { - return new ResourceLocation("DimDoors:textures/other/limboMoon.png"); + return limboMoonResourceLoc; } @Override public ResourceLocation getSunRenderPath() { - return new ResourceLocation("DimDoors:textures/other/limboSun.png"); + return limboSunResourceLoc; } + + } diff --git a/src/main/resources/assets/dimdoors/textures/other/limboMoon.png b/src/main/resources/assets/dimdoors/textures/other/limboMoon.png new file mode 100644 index 0000000000000000000000000000000000000000..239346f74351a1e8887b70e7de1e869f1cb4fb6c GIT binary patch literal 4197 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dimdoors/textures/other/limboSun.png b/src/main/resources/assets/dimdoors/textures/other/limboSun.png new file mode 100644 index 0000000000000000000000000000000000000000..c2652e16a70b58b9c080227fcea17f6470f15903 GIT binary patch literal 5411 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