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();
}
}
}