diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/Block.java ../src_work/minecraft/net/minecraft/src/Block.java --- ../src_base/minecraft/net/minecraft/src/Block.java 2011-08-12 13:47:09.501407000 +0200 +++ ../src_work/minecraft/net/minecraft/src/Block.java 2011-08-12 13:55:57.161587800 +0200 @@ -637,6 +637,10 @@ public int getMobilityFlag() { return this.blockMaterial.getMaterialMobility(); } + + public boolean isLadder() { + return false; + } static { Item.itemsList[cloth.blockID] = (new ItemCloth(cloth.blockID - 256)).setItemName("cloth"); diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/BlockLadder.java ../src_work/minecraft/net/minecraft/src/BlockLadder.java --- ../src_base/minecraft/net/minecraft/src/BlockLadder.java 2011-08-12 13:47:09.859427000 +0200 +++ ../src_work/minecraft/net/minecraft/src/BlockLadder.java 2011-08-12 13:57:35.729225600 +0200 @@ -55,6 +55,10 @@ return super.getSelectedBoundingBoxFromPool(var1, var2, var3, var4); } + + public boolean isLadder() { + return true; + } public boolean isOpaqueCube() { return false; diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/BlockRedstoneWire.java ../src_work/minecraft/net/minecraft/src/BlockRedstoneWire.java --- ../src_base/minecraft/net/minecraft/src/BlockRedstoneWire.java 2011-08-12 13:47:10.092441000 +0200 +++ ../src_work/minecraft/net/minecraft/src/BlockRedstoneWire.java 2011-08-12 14:01:13.353673000 +0200 @@ -1,5 +1,6 @@ package net.minecraft.src; +import net.minecraft.src.forge.*; import java.util.ArrayList; import java.util.HashSet; import java.util.Random; @@ -369,6 +370,9 @@ return true; } else if(var5 == 0) { return false; + } else if (Block.blocksList[var5] instanceof IConnectRedstone) { + IConnectRedstone icr = (IConnectRedstone) Block.blocksList[var5]; + return icr.canConnectRedstone(var0, var1, var2, var3, var4); } else if(Block.blocksList[var5].canProvidePower()) { return true; } else if(var5 != Block.redstoneRepeaterIdle.blockID && var5 != Block.redstoneRepeaterActive.blockID) { diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/Chunk.java ../src_work/minecraft/net/minecraft/src/Chunk.java --- ../src_base/minecraft/net/minecraft/src/Chunk.java 2011-08-12 13:47:10.334455000 +0200 +++ ../src_work/minecraft/net/minecraft/src/Chunk.java 2011-08-12 14:07:37.321634700 +0200 @@ -1,5 +1,6 @@ package net.minecraft.src; +import net.minecraft.src.forge.*; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -256,6 +257,12 @@ } else { int var9 = this.xPosition * 16 + var1; int var10 = this.zPosition * 16 + var3; + + if (Block.blocksList[var8] instanceof IOverrideReplace) { + IOverrideReplace iovr = (IOverrideReplace) Block.blocksList[var8]; + if (!iovr.canReplaceBlock(this.worldObj, var9, var2, var10, var4)) + return iovr.getReplacedSuccess(); + } this.blocks[var1 << 11 | var3 << 7 | var2] = (byte)(var6 & 255); if(var8 != 0 && !this.worldObj.multiplayerWorld) { Block.blocksList[var8].onBlockRemoval(this.worldObj, var9, var2, var10); @@ -295,6 +302,11 @@ } else { int var8 = this.xPosition * 16 + var1; int var9 = this.zPosition * 16 + var3; + if (Block.blocksList[var7] instanceof IOverrideReplace) { + IOverrideReplace iovr = (IOverrideReplace) Block.blocksList[var7]; + if (!iovr.canReplaceBlock(this.worldObj, var8, var2, var9, var4)) + return iovr.getReplacedSuccess(); + } this.blocks[var1 << 11 | var3 << 7 | var2] = (byte)(var5 & 255); if(var7 != 0) { Block.blocksList[var7].onBlockRemoval(this.worldObj, var8, var2, var9); diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/EffectRenderer.java ../src_work/minecraft/net/minecraft/src/EffectRenderer.java --- ../src_base/minecraft/net/minecraft/src/EffectRenderer.java 2011-08-12 13:47:10.674474500 +0200 +++ ../src_work/minecraft/net/minecraft/src/EffectRenderer.java 2011-08-12 14:23:05.961749800 +0200 @@ -1,5 +1,6 @@ package net.minecraft.src; +import net.minecraft.src.forge.*; import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -17,6 +18,7 @@ protected World worldObj; private List[] fxLayers = new List[4]; + private List effectList = new ArrayList();; private RenderEngine renderer; private Random rand = new Random(); @@ -53,6 +55,18 @@ } } } + + for (int x = 0; x < effectList.size(); x++) { + BlockTextureParticles entry = (BlockTextureParticles) effectList.get(x); + for (int y = 0; y < entry.effects.size(); y++) { + EntityFX entityfx = (EntityFX) entry.effects.get(y); + if (entityfx.isDead) { + entry.effects.remove(y--); + } + } + if (effectList.size() == 0) + effectList.remove(x--); + } } @@ -87,12 +101,24 @@ for(int var11 = 0; var11 < this.fxLayers[var8].size(); ++var11) { EntityFX var12 = (EntityFX)this.fxLayers[var8].get(var11); + if(var12 instanceof EntityDiggingFX) continue; var12.renderParticle(var10, var2, var3, var7, var4, var5, var6); } var10.draw(); } } + Tessellator tessellator = Tessellator.instance; + for (int x = 0; x < effectList.size(); x++) { + BlockTextureParticles entry = (BlockTextureParticles) effectList.get(x); + GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, renderer.getTexture(entry.texture)); + tessellator.startDrawingQuads(); + for (int y = 0; y < entry.effects.size(); y++) { + EntityFX entityfx = (EntityFX) entry.effects.get(y); + entityfx.renderParticle(tessellator, var2, var3, var7, var4, var5, var6); + } + tessellator.draw(); + } } @@ -115,6 +141,12 @@ for(int var2 = 0; var2 < 4; ++var2) { this.fxLayers[var2].clear(); } + + for (int x = 0; x < effectList.size(); x++) { + BlockTextureParticles entry = (BlockTextureParticles) effectList.get(x); + entry.effects.clear(); + } + effectList.clear(); } @@ -130,7 +162,9 @@ double var13 = (double)var2 + ((double)var9 + 0.5D) / (double)var7; double var15 = (double)var3 + ((double)var10 + 0.5D) / (double)var7; int var17 = this.rand.nextInt(6); - this.addEffect((new EntityDiggingFX(this.worldObj, var11, var13, var15, var11 - (double)var1 - 0.5D, var13 - (double)var2 - 0.5D, var15 - (double)var3 - 0.5D, var6, var17, var5)).func_4041_a(var1, var2, var3)); + EntityDiggingFX dig_effect = new EntityDiggingFX(this.worldObj, var11, var13, var15, var11 - (double)var1 - 0.5D, var13 - (double)var2 - 0.5D, var15 - (double)var3 - 0.5D, var6, var17, var5); + dig_effect.func_4041_a(var1, var2, var3); + this.addDigParticleEffect(dig_effect, var6); } } } @@ -169,10 +203,39 @@ if(var4 == 5) { var8 = (double)var1 + var6.maxX + (double)var7; } - - this.addEffect((new EntityDiggingFX(this.worldObj, var8, var10, var12, 0.0D, 0.0D, 0.0D, var6, var4, this.worldObj.getBlockMetadata(var1, var2, var3))).func_4041_a(var1, var2, var3).func_407_b(0.2F).func_405_d(0.6F)); - } - } + EntityDiggingFX dig_effect = new EntityDiggingFX(this.worldObj, var8, var10, var12, 0.0D, 0.0D, 0.0D, var6, var4, this.worldObj.getBlockMetadata(var1, var2, var3)); + dig_effect.func_4041_a(var1, var2, var3); + dig_effect.func_407_b(0.2F); + dig_effect.func_405_d(0.6F); + addDigParticleEffect(dig_effect, var6); + } + } + + public void addDigParticleEffect(EntityDiggingFX dig_effect, Block block) { + boolean added = false; + String comp; + + if (block instanceof ITextureProvider) { + comp = ((ITextureProvider) block).getTextureFile(); + } else { + comp = "/terrain.png"; + } + for (int x = 0; x < effectList.size(); x++) { + BlockTextureParticles entry = (BlockTextureParticles) effectList + .get(x); + if (entry.texture.equals(comp)) { + entry.effects.add(dig_effect); + added = true; + } + } + if (!added) { + BlockTextureParticles entry = new BlockTextureParticles(); + entry.texture = comp; + entry.effects.add(dig_effect); + effectList.add(entry); + } + this.addEffect(dig_effect); + } public String getStatistics() { return "" + (this.fxLayers[0].size() + this.fxLayers[1].size() + this.fxLayers[2].size()); diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/EntityLiving.java ../src_work/minecraft/net/minecraft/src/EntityLiving.java --- ../src_base/minecraft/net/minecraft/src/EntityLiving.java 2011-08-12 13:47:11.117499000 +0200 +++ ../src_work/minecraft/net/minecraft/src/EntityLiving.java 2011-08-12 14:25:47.273976400 +0200 @@ -566,7 +566,9 @@ int var1 = MathHelper.floor_double(this.posX); int var2 = MathHelper.floor_double(this.boundingBox.minY); int var3 = MathHelper.floor_double(this.posZ); - return this.worldObj.getBlockId(var1, var2, var3) == Block.ladder.blockID; + Block block=Block.blocksList[worldObj.getBlockId(var1, var2, var3)]; + if(block==null) return false; + return block.isLadder(); } public void writeEntityToNBT(NBTTagCompound var1) { diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/EntityPlayer.java ../src_work/minecraft/net/minecraft/src/EntityPlayer.java --- ../src_base/minecraft/net/minecraft/src/EntityPlayer.java 2011-08-12 13:47:11.258507000 +0200 +++ ../src_work/minecraft/net/minecraft/src/EntityPlayer.java 2011-08-12 14:28:36.672665400 +0200 @@ -1,5 +1,6 @@ package net.minecraft.src; +import net.minecraft.src.forge.ISpecialArmor; import java.util.Iterator; import java.util.List; import net.minecraft.src.AchievementList; @@ -460,6 +461,18 @@ } protected void damageEntity(int var1) { + boolean doRegularComputation = true; + for (ItemStack stack : this.inventory.armorInventory) { + if (stack != null && stack.getItem() instanceof ISpecialArmor) { + ISpecialArmor armor = (ISpecialArmor) stack.getItem(); + var1 = armor.adjustArmorDamage(var1); + doRegularComputation = doRegularComputation && armor.allowRegularComputation(); + } + } + + if (!doRegularComputation) { + super.damageEntity(var1); + } int var2 = 25 - this.inventory.getTotalArmorValue(); int var3 = var1 * var2 + this.damageRemainder; this.inventory.damageArmor(var1); diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/Explosion.java ../src_work/minecraft/net/minecraft/src/Explosion.java --- ../src_base/minecraft/net/minecraft/src/Explosion.java 2011-08-12 13:47:11.653530000 +0200 +++ ../src_work/minecraft/net/minecraft/src/Explosion.java 2011-08-12 14:34:12.001845200 +0200 @@ -1,5 +1,6 @@ package net.minecraft.src; +import net.minecraft.src.forge.ISpecialResistance; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -67,7 +68,17 @@ int var24 = MathHelper.floor_double(var19); int var25 = this.worldObj.getBlockId(var22, var23, var24); if(var25 > 0) { - var14 -= (Block.blocksList[var25].getExplosionResistance(this.exploder) + 0.3F) * var21; + if (Block.blocksList[var25] instanceof ISpecialResistance) { + ISpecialResistance isr = (ISpecialResistance) Block.blocksList[var25]; + var14 -= (isr.getSpecialExplosionResistance( + this.worldObj, var22, var23, var24, this.explosionX, + this.explosionY, this.explosionZ, this.exploder) + 0.3F) + * var21; + } else { + var14 -= (Block.blocksList[var25] + .getExplosionResistance(this.exploder) + 0.3F) + * var21; + } } if(var14 > 0.0F) { diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/ItemBucket.java ../src_work/minecraft/net/minecraft/src/ItemBucket.java --- ../src_base/minecraft/net/minecraft/src/ItemBucket.java 2011-08-12 13:47:12.457576000 +0200 +++ ../src_work/minecraft/net/minecraft/src/ItemBucket.java 2011-08-12 14:37:03.833673400 +0200 @@ -1,5 +1,6 @@ package net.minecraft.src; +import net.minecraft.src.forge.MinecraftForge; import net.minecraft.src.Block; import net.minecraft.src.EntityCow; import net.minecraft.src.EntityPlayer; @@ -52,6 +53,13 @@ } if(this.isFull == 0) { + ItemStack customBucket = MinecraftForge.fillCustomBucket(var2, + var25, var26, var27); + + if (customBucket != null) { + return customBucket; + } + if(var2.getBlockMaterial(var25, var26, var27) == Material.water && var2.getBlockMetadata(var25, var26, var27) == 0) { var2.setBlockWithNotify(var25, var26, var27, 0); return new ItemStack(Item.bucketWater); diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/ItemPickaxe.java ../src_work/minecraft/net/minecraft/src/ItemPickaxe.java --- ../src_base/minecraft/net/minecraft/src/ItemPickaxe.java 2011-08-12 13:47:12.719591000 +0200 +++ ../src_work/minecraft/net/minecraft/src/ItemPickaxe.java 2011-08-12 14:40:12.313453800 +0200 @@ -1,5 +1,6 @@ package net.minecraft.src; +import net.minecraft.src.forge.MinecraftForge; import net.minecraft.src.Block; import net.minecraft.src.EnumToolMaterial; import net.minecraft.src.ItemTool; @@ -15,6 +16,7 @@ } public boolean canHarvestBlock(Block var1) { + if (MinecraftForge.canHarvestBlock(this, var1)) return true; return var1 == Block.obsidian?this.toolMaterial.getHarvestLevel() == 3:(var1 != Block.blockDiamond && var1 != Block.oreDiamond?(var1 != Block.blockGold && var1 != Block.oreGold?(var1 != Block.blockSteel && var1 != Block.oreIron?(var1 != Block.blockLapis && var1 != Block.oreLapis?(var1 != Block.oreRedstone && var1 != Block.oreRedstoneGlowing?(var1.blockMaterial == Material.rock?true:var1.blockMaterial == Material.iron):this.toolMaterial.getHarvestLevel() >= 2):this.toolMaterial.getHarvestLevel() >= 1):this.toolMaterial.getHarvestLevel() >= 1):this.toolMaterial.getHarvestLevel() >= 2):this.toolMaterial.getHarvestLevel() >= 2); } diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/ItemRenderer.java ../src_work/minecraft/net/minecraft/src/ItemRenderer.java --- ../src_base/minecraft/net/minecraft/src/ItemRenderer.java 2011-08-12 13:47:12.779594900 +0200 +++ ../src_work/minecraft/net/minecraft/src/ItemRenderer.java 2011-08-12 15:46:50.977164300 +0200 @@ -1,5 +1,6 @@ package net.minecraft.src; +import net.minecraft.src.forge.ForgeHooksClient; import net.minecraft.client.Minecraft; import net.minecraft.src.Block; import net.minecraft.src.EntityLiving; @@ -38,12 +39,15 @@ GL11.glPushMatrix(); if(var2.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[var2.itemID].getRenderType())) { GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, this.mc.renderEngine.getTexture("/terrain.png")); + ForgeHooksClient.overrideTexture (Block.blocksList[var2.itemID]); this.renderBlocksInstance.renderBlockOnInventory(Block.blocksList[var2.itemID], var2.getItemDamage(), var1.getEntityBrightness(1.0F)); } else { if(var2.itemID < 256) { GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, this.mc.renderEngine.getTexture("/terrain.png")); + ForgeHooksClient.overrideTexture (Block.blocksList[var2.itemID]); } else { GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, this.mc.renderEngine.getTexture("/gui/items.png")); + ForgeHooksClient.overrideTexture (Item.itemsList[var2.itemID]); } Tessellator var3 = Tessellator.instance; diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/ItemTool.java ../src_work/minecraft/net/minecraft/src/ItemTool.java --- ../src_base/minecraft/net/minecraft/src/ItemTool.java 2011-08-12 13:47:12.875600000 +0200 +++ ../src_work/minecraft/net/minecraft/src/ItemTool.java 2011-08-12 14:44:44.057996700 +0200 @@ -1,5 +1,7 @@ package net.minecraft.src; +import java.util.Arrays; + import net.minecraft.src.Block; import net.minecraft.src.Entity; import net.minecraft.src.EntityLiving; @@ -52,4 +54,11 @@ public boolean isFull3D() { return true; } + + public void addBlockEffectiveAgainst (Block block) { + blocksEffectiveAgainst = Arrays.copyOf(blocksEffectiveAgainst, + blocksEffectiveAgainst.length + 1); + + blocksEffectiveAgainst [blocksEffectiveAgainst.length-1] = block; + } } diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/MovingObjectPosition.java ../src_work/minecraft/net/minecraft/src/MovingObjectPosition.java --- ../src_base/minecraft/net/minecraft/src/MovingObjectPosition.java 2011-08-12 13:47:13.829654000 +0200 +++ ../src_work/minecraft/net/minecraft/src/MovingObjectPosition.java 2011-08-12 14:45:53.427964400 +0200 @@ -13,6 +13,9 @@ public int sideHit; public Vec3D hitVec; public Entity entityHit; + + // Added for RedPower subblocks. + public int subHit=0; public MovingObjectPosition(int var1, int var2, int var3, int var4, Vec3D var5) { diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/PlayerController.java ../src_work/minecraft/net/minecraft/src/PlayerController.java --- ../src_base/minecraft/net/minecraft/src/PlayerController.java 2011-08-12 13:47:14.822711000 +0200 +++ ../src_work/minecraft/net/minecraft/src/PlayerController.java 2011-08-12 14:48:25.809680200 +0200 @@ -1,5 +1,6 @@ package net.minecraft.src; +import net.minecraft.src.forge.*; import net.minecraft.client.Minecraft; import net.minecraft.src.Block; import net.minecraft.src.Entity; @@ -74,6 +75,12 @@ public void func_6473_b(EntityPlayer var1) {} public boolean sendPlaceBlock(EntityPlayer var1, World var2, ItemStack var3, int var4, int var5, int var6, int var7) { + if (var3 != null && var3.getItem() instanceof IUseItemFirst) { + IUseItemFirst iuif = (IUseItemFirst) var3.getItem(); + if (iuif.onItemUseFirst(var3, var1, var2, var4, var5, var6, var7)) { + return true; + } + } int var8 = var2.getBlockId(var4, var5, var6); return var8 > 0 && Block.blocksList[var8].blockActivated(var2, var4, var5, var6, var1)?true:(var3 == null?false:var3.useItem(var1, var2, var4, var5, var6, var7)); } diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/RenderItem.java ../src_work/minecraft/net/minecraft/src/RenderItem.java --- ../src_base/minecraft/net/minecraft/src/RenderItem.java 2011-08-12 13:47:15.680760800 +0200 +++ ../src_work/minecraft/net/minecraft/src/RenderItem.java 2011-08-12 14:54:24.801213300 +0200 @@ -1,5 +1,6 @@ package net.minecraft.src; +import net.minecraft.src.forge.ForgeHooksClient; import java.util.Random; import net.minecraft.src.Block; import net.minecraft.src.Entity; @@ -53,6 +54,7 @@ if(var10.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[var10.itemID].getRenderType())) { GL11.glRotatef(var12, 0.0F, 1.0F, 0.0F); this.loadTexture("/terrain.png"); + ForgeHooksClient.overrideTexture(Block.blocksList[var10.itemID]); float var29 = 0.25F; if(!Block.blocksList[var10.itemID].renderAsNormalBlock() && var10.itemID != Block.stairSingle.blockID && Block.blocksList[var10.itemID].getRenderType() != 16) { var29 = 0.5F; @@ -77,8 +79,10 @@ int var14 = var10.getIconIndex(); if(var10.itemID < 256) { this.loadTexture("/terrain.png"); + ForgeHooksClient.overrideTexture(Block.blocksList[var10.itemID]); } else { this.loadTexture("/gui/items.png"); + ForgeHooksClient.overrideTexture(Item.itemsList[var10.itemID]); } Tessellator var15 = Tessellator.instance; @@ -131,6 +135,7 @@ float var11; if(var3 < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[var3].getRenderType())) { var2.bindTexture(var2.getTexture("/terrain.png")); + ForgeHooksClient.overrideTexture (Block.blocksList[var3]); Block var14 = Block.blocksList[var3]; GL11.glPushMatrix(); GL11.glTranslatef((float)(var6 - 2), (float)(var7 + 3), -3.0F); @@ -156,8 +161,10 @@ GL11.glDisable(2896 /*GL_LIGHTING*/); if(var3 < 256) { var2.bindTexture(var2.getTexture("/terrain.png")); + ForgeHooksClient.overrideTexture (Block.blocksList[var3]); } else { var2.bindTexture(var2.getTexture("/gui/items.png")); + ForgeHooksClient.overrideTexture (Item.itemsList[var3]); } int var8 = Item.itemsList[var3].getColorFromDamage(var4); diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/Tessellator.java ../src_work/minecraft/net/minecraft/src/Tessellator.java --- ../src_base/minecraft/net/minecraft/src/Tessellator.java 2011-08-12 13:47:16.233792400 +0200 +++ ../src_work/minecraft/net/minecraft/src/Tessellator.java 2011-08-12 15:40:09.194183600 +0200 @@ -1,5 +1,6 @@ package net.minecraft.src; +import java.util.*; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; @@ -13,9 +14,6 @@ private static boolean convertQuadsToTriangles = true; private static boolean tryVBO = false; - private ByteBuffer byteBuffer; - private IntBuffer intBuffer; - private FloatBuffer floatBuffer; private int[] rawBuffer; private int vertexCount = 0; private double textureU; @@ -28,31 +26,33 @@ private int addedVertices = 0; private boolean isColorDisabled = false; private int drawMode; - private double xOffset; - private double yOffset; - private double zOffset; + public double xOffset; + public double yOffset; + public double zOffset; private int normal; - public static final Tessellator instance = new Tessellator(2097152); private boolean isDrawing = false; - private boolean useVBO = false; - private IntBuffer vertexBuffers; + private static boolean useVBO = false; private int vboIndex = 0; - private int vboCount = 10; private int bufferSize; - - - private Tessellator(int var1) { - this.bufferSize = var1; - this.byteBuffer = GLAllocation.createDirectByteBuffer(var1 * 4); - this.intBuffer = this.byteBuffer.asIntBuffer(); - this.floatBuffer = this.byteBuffer.asFloatBuffer(); - this.rawBuffer = new int[var1]; - this.useVBO = tryVBO && GLContext.getCapabilities().GL_ARB_vertex_buffer_object; - if(this.useVBO) { - this.vertexBuffers = GLAllocation.createDirectIntBuffer(this.vboCount); - ARBVertexBufferObject.glGenBuffersARB(this.vertexBuffers); - } - + public int instanceNo; + static int instanceTotal=0; + + private int rawBufferSize; + private static int vboCount; + private static IntBuffer vertexBuffers; + private static int nativeBufferSize; + private static int trivertsInBuffer; + private static ByteBuffer byteBuffer; + private static IntBuffer intBuffer; + private static FloatBuffer floatBuffer; + public static Tessellator instance; + public static Tessellator firstInstance; + + + public Tessellator() { + this.instanceNo=instanceTotal++; + this.rawBuffer=null; + this.rawBufferSize=0; } public void draw() { @@ -61,10 +61,19 @@ } else { this.isDrawing = false; if(this.vertexCount > 0) { - this.intBuffer.clear(); - this.intBuffer.put(this.rawBuffer, 0, this.rawBufferIndex); - this.byteBuffer.position(0); - this.byteBuffer.limit(this.rawBufferIndex * 4); + int offs=0; + while(offs < vertexCount) { + int vtc; + if(drawMode == 7 && convertQuadsToTriangles) { + vtc=Math.min(vertexCount-offs,trivertsInBuffer); + } else { + vtc=Math.min(vertexCount-offs,nativeBufferSize>>5); + } + this.intBuffer.clear(); + this.intBuffer.put(this.rawBuffer, offs*8, vtc*8); + this.byteBuffer.position(0); + this.byteBuffer.limit(vtc*32); + offs+=vtc; if(this.useVBO) { this.vboIndex = (this.vboIndex + 1) % this.vboCount; ARBVertexBufferObject.glBindBufferARB('\u8892', this.vertexBuffers.get(this.vboIndex)); @@ -113,9 +122,9 @@ GL11.glEnableClientState('\u8074'); if(this.drawMode == 7 && convertQuadsToTriangles) { - GL11.glDrawArrays(4, 0, this.vertexCount); + GL11.glDrawArrays(4, 0, vtc); } else { - GL11.glDrawArrays(this.drawMode, 0, this.vertexCount); + GL11.glDrawArrays(drawMode, 0, vtc); } GL11.glDisableClientState('\u8074'); @@ -131,9 +140,14 @@ GL11.glDisableClientState('\u8075'); } } + if(this.rawBufferSize>0x20000 && this.rawBufferIndex<(this.rawBufferSize<<3)) { + this.rawBufferSize=0; + this.rawBuffer=null; + } this.reset(); } + } } private void reset() { @@ -229,6 +243,15 @@ } public void addVertex(double var1, double var3, double var5) { + if(this.rawBufferIndex >= this.rawBufferSize-32) { + if(this.rawBufferSize==0) { + this.rawBufferSize=0x10000; + this.rawBuffer=new int[this.rawBufferSize]; + } else { + this.rawBufferSize*=2; + this.rawBuffer=Arrays.copyOf(this.rawBuffer,this.rawBufferSize); + } + } ++this.addedVertices; if(this.drawMode == 7 && convertQuadsToTriangles && this.addedVertices % 4 == 0) { for(int var7 = 0; var7 < 2; ++var7) { @@ -268,10 +291,6 @@ this.rawBuffer[this.rawBufferIndex + 2] = Float.floatToRawIntBits((float)(var5 + this.zOffset)); this.rawBufferIndex += 8; ++this.vertexCount; - if(this.vertexCount % 4 == 0 && this.rawBufferIndex >= this.bufferSize - 32) { - this.draw(); - this.isDrawing = true; - } } @@ -316,5 +335,23 @@ this.yOffset += (double)var2; this.zOffset += (double)var3; } + + static { + instance=new Tessellator(); + firstInstance=instance; + + nativeBufferSize = 0x200000; + trivertsInBuffer = (nativeBufferSize/48)*6; + byteBuffer = GLAllocation.createDirectByteBuffer(nativeBufferSize * 4); + intBuffer = byteBuffer.asIntBuffer(); + floatBuffer = byteBuffer.asFloatBuffer(); + useVBO = tryVBO && GLContext.getCapabilities().GL_ARB_vertex_buffer_object; + vboCount = 10; + if(useVBO) + { + vertexBuffers = GLAllocation.createDirectIntBuffer(vboCount); + ARBVertexBufferObject.glGenBuffersARB(vertexBuffers); + } + } }