package joshie.harvest.calendar.render; import joshie.harvest.api.HFApi; import joshie.harvest.api.calendar.Weather; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraftforge.client.IRenderHandler; import static net.minecraft.client.renderer.EntityRenderer.SNOW_TEXTURES; public class WeatherRenderer extends IRenderHandler { @Override public void render(float rain, WorldClient worldClient, Minecraft mc) { float f = mc.theWorld.getRainStrength(rain); EntityRenderer renderer = mc.entityRenderer; if (f > 0.0F) { renderer.enableLightmap(); Entity entity = mc.getRenderViewEntity(); World world = mc.theWorld; int i = MathHelper.floor_double(entity.posX); int j = MathHelper.floor_double(entity.posY); int k = MathHelper.floor_double(entity.posZ); Tessellator tessellator = Tessellator.getInstance(); VertexBuffer vertexbuffer = tessellator.getBuffer(); GlStateManager.disableCull(); GlStateManager.glNormal3f(0.0F, 1.0F, 0.0F); GlStateManager.enableBlend(); GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); GlStateManager.alphaFunc(516, 0.1F); double d0 = entity.lastTickPosX + (entity.posX - entity.lastTickPosX) * (double)rain; double d1 = entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * (double)rain; double d2 = entity.lastTickPosZ + (entity.posZ - entity.lastTickPosZ) * (double)rain; int l = MathHelper.floor_double(d1); int i1 = 5; if (mc.gameSettings.fancyGraphics) { i1 = 10; } int j1 = -1; float f1 = (float)renderer.rendererUpdateCount + rain; vertexbuffer.setTranslation(-d0, -d1, -d2); GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); Weather weather = HFApi.calendar.getWeather(world); for (int k1 = k - i1; k1 <= k + i1; ++k1) { for (int l1 = i - i1; l1 <= i + i1; ++l1) { int i2 = (k1 - k + 16) * 32 + l1 - i + 16; double d3 = (double)renderer.rainXCoords[i2] * 0.5D; double d4 = (double)renderer.rainYCoords[i2] * 0.5D; blockpos$mutableblockpos.setPos(l1, 0, k1); Biome biome = world.getBiome(blockpos$mutableblockpos); if (biome.canRain() || biome.getEnableSnow()) { int j2 = world.getPrecipitationHeight(blockpos$mutableblockpos).getY(); int k2 = j - i1; int l2 = j + i1; if (k2 < j2) { k2 = j2; } if (l2 < j2) { l2 = j2; } int i3 = j2; if (j2 < l) { i3 = l; } if (k2 != l2) { renderer.random.setSeed((long)(l1 * l1 * 3121 + l1 * 45238971 ^ k1 * k1 * 418711 + k1 * 13761)); blockpos$mutableblockpos.setPos(l1, k2, k1); if ((!weather.isSnow() && !biome.isSnowyBiome()) || biome.isHighHumidity()) { if (j1 != 0) { if (j1 >= 0) { tessellator.draw(); } j1 = 0; mc.getTextureManager().bindTexture(EntityRenderer.RAIN_TEXTURES); vertexbuffer.begin(7, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP); } double d5 = -((double)(renderer.rendererUpdateCount + l1 * l1 * 3121 + l1 * 45238971 + k1 * k1 * 418711 + k1 * 13761 & 31) + (double)rain) / 32.0D * (3.0D + renderer.random.nextDouble()); double d6 = (double)((float)l1 + 0.5F) - entity.posX; double d7 = (double)((float)k1 + 0.5F) - entity.posZ; float f3 = MathHelper.sqrt_double(d6 * d6 + d7 * d7) / (float)i1; float f4 = ((1.0F - f3 * f3) * 0.5F + 0.5F) * f; blockpos$mutableblockpos.setPos(l1, i3, k1); int j3 = world.getCombinedLight(blockpos$mutableblockpos, 0); int k3 = j3 >> 16 & 65535; int l3 = j3 & 65535; vertexbuffer.pos((double)l1 - d3 + 0.5D, (double)l2, (double)k1 - d4 + 0.5D).tex(0.0D, (double)k2 * 0.25D + d5).color(1.0F, 1.0F, 1.0F, f4).lightmap(k3, l3).endVertex(); vertexbuffer.pos((double)l1 + d3 + 0.5D, (double)l2, (double)k1 + d4 + 0.5D).tex(1.0D, (double)k2 * 0.25D + d5).color(1.0F, 1.0F, 1.0F, f4).lightmap(k3, l3).endVertex(); vertexbuffer.pos((double)l1 + d3 + 0.5D, (double)k2, (double)k1 + d4 + 0.5D).tex(1.0D, (double)l2 * 0.25D + d5).color(1.0F, 1.0F, 1.0F, f4).lightmap(k3, l3).endVertex(); vertexbuffer.pos((double)l1 - d3 + 0.5D, (double)k2, (double)k1 - d4 + 0.5D).tex(0.0D, (double)l2 * 0.25D + d5).color(1.0F, 1.0F, 1.0F, f4).lightmap(k3, l3).endVertex(); } else { if (j1 != 1) { if (j1 >= 0) { tessellator.draw(); } j1 = 1; mc.getTextureManager().bindTexture(SNOW_TEXTURES); vertexbuffer.begin(7, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP); } double d8 = (double)(-((float)(renderer.rendererUpdateCount & 511) + rain) / 512.0F); double d9 = renderer.random.nextDouble() + (double)f1 * 0.01D * (double)((float)renderer.random.nextGaussian()); double d10 = renderer.random.nextDouble() + (double)(f1 * (float)renderer.random.nextGaussian()) * 0.001D; double d11 = (double)((float)l1 + 0.5F) - entity.posX; double d12 = (double)((float)k1 + 0.5F) - entity.posZ; float f6 = MathHelper.sqrt_double(d11 * d11 + d12 * d12) / (float)i1; float f5 = ((1.0F - f6 * f6) * 0.3F + 0.5F) * f; blockpos$mutableblockpos.setPos(l1, i3, k1); int i4 = (world.getCombinedLight(blockpos$mutableblockpos, 0) * 3 + 15728880) / 4; int j4 = i4 >> 16 & 65535; int k4 = i4 & 65535; vertexbuffer.pos((double)l1 - d3 + 0.5D, (double)l2, (double)k1 - d4 + 0.5D).tex(0.0D + d9, (double)k2 * 0.25D + d8 + d10).color(1.0F, 1.0F, 1.0F, f5).lightmap(j4, k4).endVertex(); vertexbuffer.pos((double)l1 + d3 + 0.5D, (double)l2, (double)k1 + d4 + 0.5D).tex(1.0D + d9, (double)k2 * 0.25D + d8 + d10).color(1.0F, 1.0F, 1.0F, f5).lightmap(j4, k4).endVertex(); vertexbuffer.pos((double)l1 + d3 + 0.5D, (double)k2, (double)k1 + d4 + 0.5D).tex(1.0D + d9, (double)l2 * 0.25D + d8 + d10).color(1.0F, 1.0F, 1.0F, f5).lightmap(j4, k4).endVertex(); vertexbuffer.pos((double)l1 - d3 + 0.5D, (double)k2, (double)k1 - d4 + 0.5D).tex(0.0D + d9, (double)l2 * 0.25D + d8 + d10).color(1.0F, 1.0F, 1.0F, f5).lightmap(j4, k4).endVertex(); } } } } } if (j1 >= 0) { tessellator.draw(); } vertexbuffer.setTranslation(0.0D, 0.0D, 0.0D); GlStateManager.enableCull(); GlStateManager.disableBlend(); GlStateManager.alphaFunc(516, 0.1F); renderer.disableLightmap(); } } }