package net.minecraft.client.renderer.chunk;
import java.nio.FloatBuffer;
import java.util.Iterator;
import java.util.concurrent.locks.ReentrantLock;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GLAllocation;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RegionRenderCache;
import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexBuffer;
import net.minecraft.src.BlockPosM;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumWorldBlockLayer;
import net.minecraft.world.World;
public class RenderChunk
{
private World field_178588_d;
private final RenderGlobal field_178589_e;
public static int field_178592_a;
private BlockPos field_178586_f;
public CompiledChunk field_178590_b;
private final ReentrantLock field_178587_g;
private final ReentrantLock field_178598_h;
private ChunkCompileTaskGenerator field_178599_i;
private final int field_178596_j;
private final FloatBuffer field_178597_k;
private final VertexBuffer[] field_178594_l;
public AxisAlignedBB field_178591_c;
private int field_178595_m;
private boolean field_178593_n;
private static final String __OBFID = "CL_00002452";
private BlockPos[] positionOffsets16;
public RenderChunk(World worldIn, RenderGlobal renderGlobalIn, BlockPos blockPosIn, int indexIn)
{
this.positionOffsets16 = new BlockPos[EnumFacing.VALUES.length];
this.field_178590_b = CompiledChunk.field_178502_a;
this.field_178587_g = new ReentrantLock();
this.field_178598_h = new ReentrantLock();
this.field_178599_i = null;
this.field_178597_k = GLAllocation.createDirectFloatBuffer(16);
this.field_178594_l = new VertexBuffer[EnumWorldBlockLayer.values().length];
this.field_178595_m = -1;
this.field_178593_n = true;
this.field_178588_d = worldIn;
this.field_178589_e = renderGlobalIn;
this.field_178596_j = indexIn;
if (!blockPosIn.equals(this.func_178568_j()))
{
this.func_178576_a(blockPosIn);
}
if (OpenGlHelper.func_176075_f())
{
for (int var5 = 0; var5 < EnumWorldBlockLayer.values().length; ++var5)
{
this.field_178594_l[var5] = new VertexBuffer(DefaultVertexFormats.field_176600_a);
}
}
}
public boolean func_178577_a(int frameIndexIn)
{
if (this.field_178595_m == frameIndexIn)
{
return false;
}
else
{
this.field_178595_m = frameIndexIn;
return true;
}
}
public VertexBuffer func_178565_b(int p_178565_1_)
{
return this.field_178594_l[p_178565_1_];
}
public void func_178576_a(BlockPos p_178576_1_)
{
this.func_178585_h();
this.field_178586_f = p_178576_1_;
this.field_178591_c = new AxisAlignedBB(p_178576_1_, p_178576_1_.add(16, 16, 16));
this.func_178567_n();
for (int i = 0; i < this.positionOffsets16.length; ++i)
{
this.positionOffsets16[i] = null;
}
}
public void func_178570_a(float p_178570_1_, float p_178570_2_, float p_178570_3_, ChunkCompileTaskGenerator p_178570_4_)
{
CompiledChunk var5 = p_178570_4_.func_178544_c();
if (var5.func_178487_c() != null && !var5.func_178491_b(EnumWorldBlockLayer.TRANSLUCENT))
{
WorldRenderer worldRenderer = p_178570_4_.func_178545_d().func_179038_a(EnumWorldBlockLayer.TRANSLUCENT);
this.func_178573_a(worldRenderer, this.field_178586_f);
worldRenderer.setVertexState(var5.func_178487_c());
this.func_178584_a(EnumWorldBlockLayer.TRANSLUCENT, p_178570_1_, p_178570_2_, p_178570_3_, worldRenderer, var5);
}
}
public void func_178581_b(float p_178581_1_, float p_178581_2_, float p_178581_3_, ChunkCompileTaskGenerator p_178581_4_)
{
CompiledChunk var5 = new CompiledChunk();
boolean var6 = true;
BlockPos var7 = this.field_178586_f;
BlockPos var8 = var7.add(15, 15, 15);
p_178581_4_.func_178540_f().lock();
RegionRenderCache var9;
try
{
if (p_178581_4_.func_178546_a() != ChunkCompileTaskGenerator.Status.COMPILING)
{
return;
}
if (this.field_178588_d == null)
{
return;
}
var9 = new RegionRenderCache(this.field_178588_d, var7.add(-1, -1, -1), var8.add(1, 1, 1), 1);
p_178581_4_.func_178543_a(var5);
}
finally
{
p_178581_4_.func_178540_f().unlock();
}
VisGraph var10 = new VisGraph();
if (!var9.extendedLevelsInChunkCache())
{
++field_178592_a;
Iterator var11 = BlockPosM.getAllInBoxMutable(var7, var8).iterator();
EnumWorldBlockLayer var231;
while (var11.hasNext())
{
BlockPosM var20 = (BlockPosM)var11.next();
IBlockState var21 = var9.getBlockState(var20);
Block var22 = var21.getBlock();
if (var22.isOpaqueCube())
{
var10.func_178606_a(var20);
}
if (var22.hasTileEntity())
{
TileEntity var23 = var9.getTileEntity(new BlockPos(var20));
if (var23 != null && TileEntityRendererDispatcher.instance.hasSpecialRenderer(var23))
{
var5.func_178490_a(var23);
}
}
var231 = var22.getBlockLayer();
int var16 = var231.ordinal();
if (var22.getRenderType() != -1)
{
WorldRenderer var17 = p_178581_4_.func_178545_d().func_179039_a(var16);
if (!var5.func_178492_d(var231))
{
var5.func_178493_c(var231);
this.func_178573_a(var17, var7);
}
if (Minecraft.getMinecraft().getBlockRendererDispatcher().func_175018_a(var21, var20, var9, var17))
{
var5.func_178486_a(var231);
}
}
}
EnumWorldBlockLayer[] var201 = EnumWorldBlockLayer.values();
int var211 = var201.length;
for (int var221 = 0; var221 < var211; ++var221)
{
var231 = var201[var221];
if (var5.func_178492_d(var231))
{
this.func_178584_a(var231, p_178581_1_, p_178581_2_, p_178581_3_, p_178581_4_.func_178545_d().func_179038_a(var231), var5);
}
}
}
var5.func_178488_a(var10.func_178607_a());
}
protected void func_178578_b()
{
this.field_178587_g.lock();
try
{
if (this.field_178599_i != null && this.field_178599_i.func_178546_a() != ChunkCompileTaskGenerator.Status.DONE)
{
this.field_178599_i.func_178542_e();
this.field_178599_i = null;
}
}
finally
{
this.field_178587_g.unlock();
}
}
public ReentrantLock func_178579_c()
{
return this.field_178587_g;
}
public ChunkCompileTaskGenerator func_178574_d()
{
this.field_178587_g.lock();
ChunkCompileTaskGenerator var1;
try
{
this.func_178578_b();
this.field_178599_i = new ChunkCompileTaskGenerator(this, ChunkCompileTaskGenerator.Type.REBUILD_CHUNK);
var1 = this.field_178599_i;
}
finally
{
this.field_178587_g.unlock();
}
return var1;
}
public ChunkCompileTaskGenerator func_178582_e()
{
this.field_178587_g.lock();
ChunkCompileTaskGenerator var1;
try
{
if (this.field_178599_i == null || this.field_178599_i.func_178546_a() != ChunkCompileTaskGenerator.Status.PENDING)
{
if (this.field_178599_i != null && this.field_178599_i.func_178546_a() != ChunkCompileTaskGenerator.Status.DONE)
{
this.field_178599_i.func_178542_e();
this.field_178599_i = null;
}
this.field_178599_i = new ChunkCompileTaskGenerator(this, ChunkCompileTaskGenerator.Type.RESORT_TRANSPARENCY);
this.field_178599_i.func_178543_a(this.field_178590_b);
var1 = this.field_178599_i;
ChunkCompileTaskGenerator var2 = var1;
return var2;
}
var1 = null;
}
finally
{
this.field_178587_g.unlock();
}
return var1;
}
private void func_178573_a(WorldRenderer p_178573_1_, BlockPos p_178573_2_)
{
p_178573_1_.startDrawing(7);
p_178573_1_.setVertexFormat(DefaultVertexFormats.field_176600_a);
p_178573_1_.setTranslation((double)(-p_178573_2_.getX()), (double)(-p_178573_2_.getY()), (double)(-p_178573_2_.getZ()));
}
private void func_178584_a(EnumWorldBlockLayer p_178584_1_, float p_178584_2_, float p_178584_3_, float p_178584_4_, WorldRenderer p_178584_5_, CompiledChunk p_178584_6_)
{
if (p_178584_1_ == EnumWorldBlockLayer.TRANSLUCENT && !p_178584_6_.func_178491_b(p_178584_1_))
{
p_178584_6_.func_178494_a(p_178584_5_.getVertexState(p_178584_2_, p_178584_3_, p_178584_4_));
}
p_178584_5_.draw();
}
private void func_178567_n()
{
GlStateManager.pushMatrix();
GlStateManager.loadIdentity();
float var1 = 1.000001F;
GlStateManager.translate(-8.0F, -8.0F, -8.0F);
GlStateManager.scale(var1, var1, var1);
GlStateManager.translate(8.0F, 8.0F, 8.0F);
GlStateManager.getFloat(2982, this.field_178597_k);
GlStateManager.popMatrix();
}
public void func_178572_f()
{
GlStateManager.multMatrix(this.field_178597_k);
}
public CompiledChunk func_178571_g()
{
return this.field_178590_b;
}
public void func_178580_a(CompiledChunk p_178580_1_)
{
this.field_178598_h.lock();
try
{
this.field_178590_b = p_178580_1_;
}
finally
{
this.field_178598_h.unlock();
}
}
public void func_178585_h()
{
this.func_178578_b();
this.field_178590_b = CompiledChunk.field_178502_a;
}
public void func_178566_a()
{
this.func_178585_h();
this.field_178588_d = null;
for (int var1 = 0; var1 < EnumWorldBlockLayer.values().length; ++var1)
{
if (this.field_178594_l[var1] != null)
{
this.field_178594_l[var1].func_177362_c();
}
}
}
public BlockPos func_178568_j()
{
return this.field_178586_f;
}
public boolean func_178583_l()
{
this.field_178587_g.lock();
boolean var1;
try
{
var1 = this.field_178599_i == null || this.field_178599_i.func_178546_a() == ChunkCompileTaskGenerator.Status.PENDING;
}
finally
{
this.field_178587_g.unlock();
}
return var1;
}
public void func_178575_a(boolean p_178575_1_)
{
this.field_178593_n = p_178575_1_;
}
public boolean func_178569_m()
{
return this.field_178593_n;
}
public BlockPos getPositionOffset16(EnumFacing facing)
{
int index = facing.getIndex();
BlockPos posOffset = this.positionOffsets16[index];
if (posOffset == null)
{
posOffset = this.func_178568_j().offset(facing, 16);
this.positionOffsets16[index] = posOffset;
}
return posOffset;
}
}