diff --git a/forge/build.sh b/forge/build.sh index 8f0238a3d..44f2afaa5 100755 --- a/forge/build.sh +++ b/forge/build.sh @@ -1,8 +1,8 @@ #!/bin/bash -pushd .. +cd .. -rm -rf src bin +rm -rf src bin src_forge cp -a src_work src_forge @@ -12,8 +12,6 @@ cp -a forge/forge_common/net/* src_forge/minecraft_server/net/ cp -a src_forge src -pushd .. - ./recompile.sh diff --git a/forge/forge_client/src/net/minecraft/src/forge/ForgeHooksClient.java b/forge/forge_client/src/net/minecraft/src/forge/ForgeHooksClient.java new file mode 100644 index 000000000..d330c8c2a --- /dev/null +++ b/forge/forge_client/src/net/minecraft/src/forge/ForgeHooksClient.java @@ -0,0 +1,130 @@ +/** + * This software is provided under the terms of the Minecraft Forge Public + * License v1.0. + */ + +package net.minecraft.src.forge; + +import net.minecraft.src.Block; +import net.minecraft.src.ModLoader; +import net.minecraft.src.RenderBlocks; +import net.minecraft.src.Tessellator; +import org.lwjgl.opengl.GL11; + +import java.util.*; + +public class ForgeHooksClient { + public static boolean canRenderInPass(Block block, int pass) { + if(block instanceof IMultipassRender) { + IMultipassRender impr = (IMultipassRender) block; + return impr.canRenderInPass(pass); + } + if(pass==block.getRenderBlockPass()) return true; + return false; + } + + + static HashMap tessellators=new HashMap(); + static HashMap textures=new HashMap(); + static boolean inWorld=false; + static HashSet renderTextureTest=new HashSet(); + static ArrayList renderTextureList=new ArrayList(); + + protected static void bindTessellator(int tex, int sub) { + List key=Arrays.asList(tex,sub); + Tessellator t; + if(!tessellators.containsKey(key)) { + t=new Tessellator(); + tessellators.put(key,t); + } else { + t=(Tessellator)tessellators.get(key); + } + if(inWorld && !renderTextureTest.contains(key)) { + renderTextureTest.add(key); + renderTextureList.add(key); + t.startDrawingQuads(); + t.setTranslationD(Tessellator.firstInstance.xOffset, + Tessellator.firstInstance.yOffset, + Tessellator.firstInstance.zOffset); + } + Tessellator.instance=t; + } + + protected static void bindTexture(String name, int sub) { + int n; + if(!textures.containsKey(name)) { + n=ModLoader.getMinecraftInstance().renderEngine + .getTexture(name); + textures.put(name,n); + } else { + n=(Integer)textures.get(name); + } + if(!inWorld) { + Tessellator.instance=Tessellator.firstInstance; + GL11.glBindTexture(3553 /* GL_TEXTURE_2D */,n); + return; + } + bindTessellator(n,sub); + } + + protected static void unbindTexture() { + Tessellator.instance=Tessellator.firstInstance; + if(!inWorld) { + GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, ModLoader + .getMinecraftInstance().renderEngine + .getTexture("/terrain.png")); + return; + } + } + + public static void beforeRenderPass(int pass) { + Tessellator.instance=Tessellator.firstInstance; + GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, ModLoader + .getMinecraftInstance().renderEngine + .getTexture("/terrain.png")); + renderTextureTest.clear(); + renderTextureList.clear(); + inWorld=true; + } + + public static void afterRenderPass(int pass) { + inWorld=false; + for(List l : renderTextureList) { + // TODO: call appropriate client hooks + GL11.glBindTexture(GL11.GL_TEXTURE_2D,(Integer)l.toArray()[0]); + Tessellator t=(Tessellator)tessellators.get(l); + t.draw(); + } + GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, ModLoader + .getMinecraftInstance().renderEngine + .getTexture("/terrain.png")); + Tessellator.instance=Tessellator.firstInstance; + } + + public static void beforeBlockRender(Block block, + RenderBlocks renderblocks) { + if (block instanceof ITextureProvider + && renderblocks.overrideBlockTexture == -1) { + ITextureProvider itp=(ITextureProvider)block; + bindTexture(itp.getTextureFile(),0); + } + } + + public static void afterBlockRender(Block block, + RenderBlocks renderblocks) { + if (block instanceof ITextureProvider + && renderblocks.overrideBlockTexture == -1) { + Tessellator.instance=Tessellator.firstInstance; + } + } + + public static void overrideTexture (Object o) { + if (o instanceof ITextureProvider) { + GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, ModLoader + .getMinecraftInstance().renderEngine + .getTexture(((ITextureProvider) (o)) + .getTextureFile())); + } + } +} + diff --git a/forge/forge_client/src/net/minecraft/src/forge/MinecraftForgeClient.java b/forge/forge_client/src/net/minecraft/src/forge/MinecraftForgeClient.java index 07497def9..6533ed8aa 100755 --- a/forge/forge_client/src/net/minecraft/src/forge/MinecraftForgeClient.java +++ b/forge/forge_client/src/net/minecraft/src/forge/MinecraftForgeClient.java @@ -12,41 +12,15 @@ import net.minecraft.src.Tessellator; import org.lwjgl.opengl.GL11; public class MinecraftForgeClient { - - public static void beforeBlockRender(Block block, RenderBlocks renderblocks) { - if (block instanceof ITextureProvider - && renderblocks.overrideBlockTexture == -1) { - Tessellator tessellator = Tessellator.instance; - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, -1F, 0.0F); + public static void bindTexture(String name, int sub) { + ForgeHooksClient.bindTexture(name,sub); + } - GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, ModLoader - .getMinecraftInstance().renderEngine - .getTexture(((ITextureProvider) (block)).getTextureFile())); + public static void bindTexture(String name) { + ForgeHooksClient.bindTexture(name,0); + } - } - } - - public static void afterBlockRender(Block block, RenderBlocks renderblocks) { - if (block instanceof ITextureProvider - && renderblocks.overrideBlockTexture == -1) { - Tessellator tessellator = Tessellator.instance; - tessellator.draw(); - tessellator.startDrawingQuads(); - - GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, ModLoader - .getMinecraftInstance().renderEngine - .getTexture("/terrain.png")); - } - } - - public static void overrideTexture (Object o) { - if (o instanceof ITextureProvider) { - GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, ModLoader - .getMinecraftInstance().renderEngine - .getTexture(((ITextureProvider) (o)) - .getTextureFile())); - } - } + public static void unbindTexture() { + ForgeHooksClient.unbindTexture(); + } } diff --git a/forge/minecraft.patch b/forge/minecraft.patch index 2b0d46c84..a7a4618f7 100644 --- a/forge/minecraft.patch +++ b/forge/minecraft.patch @@ -1,6 +1,6 @@ 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-02 16:05:38.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/BlockRedstoneWire.java 2011-08-02 16:07:39.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/BlockRedstoneWire.java 2011-08-04 20:51:16.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/BlockRedstoneWire.java 2011-08-04 20:51:18.000000000 -0400 @@ -3,6 +3,7 @@ // Decompiler options: packimports(3) braces deadcode @@ -21,8 +21,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/BlockReds { return true; 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-02 16:05:38.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/Chunk.java 2011-08-02 16:07:39.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/Chunk.java 2011-08-04 20:51:16.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/Chunk.java 2011-08-04 20:51:18.000000000 -0400 @@ -3,6 +3,7 @@ // Decompiler options: packimports(3) braces deadcode @@ -60,8 +60,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/Chunk.jav if(j1 != 0) { 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-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/EffectRenderer.java 2011-08-02 16:07:40.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/EffectRenderer.java 2011-08-04 20:51:16.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/EffectRenderer.java 2011-08-04 20:51:18.000000000 -0400 @@ -7,6 +7,9 @@ import java.util.*; import org.lwjgl.opengl.GL11; @@ -205,8 +205,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/EffectRen private Random rand; } 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-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/EntityPlayer.java 2011-08-02 16:07:41.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/EntityPlayer.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/EntityPlayer.java 2011-08-04 20:51:18.000000000 -0400 @@ -6,6 +6,8 @@ import java.util.*; @@ -239,8 +239,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/EntityPla int k = i * j + damageRemainder; inventory.damageArmor(i); 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-02 16:05:38.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/Explosion.java 2011-08-02 16:07:42.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/Explosion.java 2011-08-04 20:51:16.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/Explosion.java 2011-08-04 20:51:18.000000000 -0400 @@ -3,6 +3,7 @@ // Decompiler options: packimports(3) braces deadcode @@ -269,8 +269,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/Explosion if(f1 > 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-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/ItemBucket.java 2011-08-02 16:07:42.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/ItemBucket.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/ItemBucket.java 2011-08-04 20:51:18.000000000 -0400 @@ -6,6 +6,8 @@ import java.util.Random; @@ -295,8 +295,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/ItemBucke { world.setBlockWithNotify(i, j, k, 0); 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-02 16:05:38.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/ItemPickaxe.java 2011-08-02 16:07:42.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/ItemPickaxe.java 2011-08-04 20:51:16.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/ItemPickaxe.java 2011-08-04 20:51:18.000000000 -0400 @@ -4,6 +4,8 @@ package net.minecraft.src; @@ -317,13 +317,13 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/ItemPicka { return true; 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-02 16:05:38.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/ItemRenderer.java 2011-08-02 16:07:42.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/ItemRenderer.java 2011-08-04 20:51:16.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/ItemRenderer.java 2011-08-05 00:58:57.000000000 -0400 @@ -5,6 +5,8 @@ package net.minecraft.src; import net.minecraft.client.Minecraft; -+import net.minecraft.src.forge.MinecraftForgeClient; ++import net.minecraft.src.forge.ForgeHooksClient; + import org.lwjgl.opengl.GL11; @@ -332,24 +332,24 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/ItemRende if(itemstack.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[itemstack.itemID].getRenderType())) { GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, mc.renderEngine.getTexture("/terrain.png")); -+ MinecraftForgeClient.overrideTexture (Block.blocksList[itemstack.itemID]); ++ ForgeHooksClient.overrideTexture (Block.blocksList[itemstack.itemID]); renderBlocksInstance.renderBlockOnInventory(Block.blocksList[itemstack.itemID], itemstack.getItemDamage(), entityliving.getEntityBrightness(1.0F)); } else { if(itemstack.itemID < 256) { GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, mc.renderEngine.getTexture("/terrain.png")); -+ MinecraftForgeClient.overrideTexture (Block.blocksList[itemstack.itemID]); ++ ForgeHooksClient.overrideTexture (Block.blocksList[itemstack.itemID]); } else { GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, mc.renderEngine.getTexture("/gui/items.png")); -+ MinecraftForgeClient.overrideTexture (Item.itemsList[itemstack.itemID]); ++ ForgeHooksClient.overrideTexture (Item.itemsList[itemstack.itemID]); } Tessellator tessellator = Tessellator.instance; int i = entityliving.getItemIcon(itemstack); 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-02 16:05:38.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/ItemTool.java 2011-08-02 16:07:42.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/ItemTool.java 2011-08-04 20:51:16.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/ItemTool.java 2011-08-04 20:51:18.000000000 -0400 @@ -4,6 +4,7 @@ package net.minecraft.src; @@ -371,8 +371,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/ItemTool. + } } 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-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/PlayerController.java 2011-08-02 16:07:42.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/PlayerController.java 2011-08-04 20:51:16.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/PlayerController.java 2011-08-04 20:51:18.000000000 -0400 @@ -3,6 +3,7 @@ // Decompiler options: packimports(3) braces deadcode @@ -395,14 +395,14 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/PlayerCon if(i1 > 0 && Block.blocksList[i1].blockActivated(world, i, j, k, entityplayer)) { 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-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/RenderItem.java 2011-08-02 16:07:42.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/RenderItem.java 2011-08-04 20:51:16.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/RenderItem.java 2011-08-05 00:59:18.000000000 -0400 @@ -5,6 +5,9 @@ package net.minecraft.src; import java.util.Random; + -+import net.minecraft.src.forge.MinecraftForgeClient; ++import net.minecraft.src.forge.ForgeHooksClient; + import org.lwjgl.opengl.GL11; @@ -411,7 +411,7 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/RenderIte { GL11.glRotatef(f3, 0.0F, 1.0F, 0.0F); loadTexture("/terrain.png"); -+ MinecraftForgeClient.overrideTexture(Block.blocksList[itemstack.itemID]); ++ ForgeHooksClient.overrideTexture(Block.blocksList[itemstack.itemID]); float f4 = 0.25F; if(!Block.blocksList[itemstack.itemID].renderAsNormalBlock() && itemstack.itemID != Block.stairSingle.blockID && Block.blocksList[itemstack.itemID].getRenderType() != 16) { @@ -419,12 +419,12 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/RenderIte if(itemstack.itemID < 256) { loadTexture("/terrain.png"); -+ MinecraftForgeClient.overrideTexture(Block.blocksList[itemstack.itemID]); ++ ForgeHooksClient.overrideTexture(Block.blocksList[itemstack.itemID]); } else { loadTexture("/gui/items.png"); - } -+ MinecraftForgeClient.overrideTexture(Item.itemsList[itemstack.itemID]); ++ ForgeHooksClient.overrideTexture(Item.itemsList[itemstack.itemID]); + } Tessellator tessellator = Tessellator.instance; float f6 = (float)((i % 16) * 16 + 0) / 256F; @@ -441,7 +441,7 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/RenderIte { int j1 = i; renderengine.bindTexture(renderengine.getTexture("/terrain.png")); -+ MinecraftForgeClient.overrideTexture (Block.blocksList[i]); ++ ForgeHooksClient.overrideTexture (Block.blocksList[i]); Block block = Block.blocksList[j1]; GL11.glPushMatrix(); GL11.glTranslatef(l - 2, i1 + 3, -3F); @@ -449,17 +449,203 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/RenderIte if(i < 256) { renderengine.bindTexture(renderengine.getTexture("/terrain.png")); -+ MinecraftForgeClient.overrideTexture (Block.blocksList[i]); ++ ForgeHooksClient.overrideTexture (Block.blocksList[i]); } else { renderengine.bindTexture(renderengine.getTexture("/gui/items.png")); -+ MinecraftForgeClient.overrideTexture(Item.itemsList[i]); ++ ForgeHooksClient.overrideTexture(Item.itemsList[i]); } int k1 = Item.itemsList[i].getColorFromDamage(j); float f = (float)(k1 >> 16 & 0xff) / 255F; +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-04 20:51:16.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/Tessellator.java 2011-08-05 05:09:37.000000000 -0400 +@@ -6,6 +6,7 @@ + + import java.io.PrintStream; + import java.nio.*; ++import java.util.*; + import org.lwjgl.opengl.*; + + // Referenced classes of package net.minecraft.src: +@@ -14,8 +15,11 @@ + public class Tessellator + { + +- private Tessellator(int i) +- { ++ public int instanceNo; ++ static int instanceTotal=0; ++ ++ public Tessellator() { ++ instanceNo=instanceTotal++; + vertexCount = 0; + hasColor = false; + hasTexture = false; +@@ -24,20 +28,10 @@ + addedVertices = 0; + isColorDisabled = false; + isDrawing = false; +- useVBO = false; + vboIndex = 0; +- vboCount = 10; +- bufferSize = i; +- byteBuffer = GLAllocation.createDirectByteBuffer(i * 4); +- intBuffer = byteBuffer.asIntBuffer(); +- floatBuffer = byteBuffer.asFloatBuffer(); +- rawBuffer = new int[i]; +- useVBO = tryVBO && GLContext.getCapabilities().GL_ARB_vertex_buffer_object; +- if(useVBO) +- { +- vertexBuffers = GLAllocation.createDirectIntBuffer(vboCount); +- ARBVertexBufferObject.glGenBuffersARB(vertexBuffers); +- } ++ ++ rawBuffer=null; ++ rawBufferSize=0; + } + + public void draw() +@@ -47,12 +41,20 @@ + throw new IllegalStateException("Not tesselating!"); + } + isDrawing = false; +- if(vertexCount > 0) +- { ++ 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); ++ } ++ + intBuffer.clear(); +- intBuffer.put(rawBuffer, 0, rawBufferIndex); ++ intBuffer.put(rawBuffer, offs*8, vtc*8); + byteBuffer.position(0); +- byteBuffer.limit(rawBufferIndex * 4); ++ byteBuffer.limit(vtc*32); ++ offs+=vtc; + if(useVBO) + { + vboIndex = (vboIndex + 1) % vboCount; +@@ -106,10 +108,10 @@ + GL11.glEnableClientState(32884 /*GL_VERTEX_ARRAY_EXT*/); + if(drawMode == 7 && convertQuadsToTriangles) + { +- GL11.glDrawArrays(4, 0, vertexCount); ++ GL11.glDrawArrays(4, 0, vtc); + } else + { +- GL11.glDrawArrays(drawMode, 0, vertexCount); ++ GL11.glDrawArrays(drawMode, 0, vtc); + } + GL11.glDisableClientState(32884 /*GL_VERTEX_ARRAY_EXT*/); + if(hasTexture) +@@ -125,6 +127,10 @@ + GL11.glDisableClientState(32885 /*GL_NORMAL_ARRAY_EXT*/); + } + } ++ if(rawBufferSize>0x20000 && rawBufferIndex<(rawBufferSize<<3)) { ++ rawBufferSize=0; ++ rawBuffer=null; ++ } + reset(); + } + +@@ -237,6 +243,15 @@ + + public void addVertex(double d, double d1, double d2) + { ++ if(rawBufferIndex >= rawBufferSize-32) { ++ if(rawBufferSize==0) { ++ rawBufferSize=0x10000; ++ rawBuffer=new int[rawBufferSize]; ++ } else { ++ rawBufferSize*=2; ++ rawBuffer=Arrays.copyOf(rawBuffer,rawBufferSize); ++ } ++ } + addedVertices++; + if(drawMode == 7 && convertQuadsToTriangles && addedVertices % 4 == 0) + { +@@ -278,11 +293,6 @@ + rawBuffer[rawBufferIndex + 2] = Float.floatToRawIntBits((float)(d2 + zOffset)); + rawBufferIndex += 8; + vertexCount++; +- if(vertexCount % 4 == 0 && rawBufferIndex >= bufferSize - 32) +- { +- draw(); +- isDrawing = true; +- } + } + + public void setColorOpaque_I(int i) +@@ -335,9 +345,7 @@ + + private static boolean convertQuadsToTriangles = true; + private static boolean tryVBO = false; +- private ByteBuffer byteBuffer; +- private IntBuffer intBuffer; +- private FloatBuffer floatBuffer; ++ private static boolean useVBO = false; + private int rawBuffer[]; + private int vertexCount; + private double textureU; +@@ -350,16 +358,40 @@ + private int addedVertices; + private boolean isColorDisabled; + 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(0x200000); + private boolean isDrawing; +- private boolean useVBO; +- private IntBuffer vertexBuffers; + private int vboIndex; +- private int vboCount; +- private int bufferSize; ++ ++ 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; ++ ++ 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); ++ } ++ } + + } diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/World.java ../src_work/minecraft/net/minecraft/src/World.java ---- ../src_base/minecraft/net/minecraft/src/World.java 2011-08-02 16:05:38.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/World.java 2011-08-03 01:10:53.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/World.java 2011-08-04 20:51:16.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/World.java 2011-08-04 20:51:18.000000000 -0400 @@ -7,6 +7,8 @@ import java.io.PrintStream; import java.util.*; @@ -549,8 +735,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/World.jav } diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/WorldRenderer.java ../src_work/minecraft/net/minecraft/src/WorldRenderer.java ---- ../src_base/minecraft/net/minecraft/src/WorldRenderer.java 2011-08-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft/net/minecraft/src/WorldRenderer.java 2011-08-02 16:07:42.000000000 -0400 +--- ../src_base/minecraft/net/minecraft/src/WorldRenderer.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft/net/minecraft/src/WorldRenderer.java 2011-08-05 06:22:55.000000000 -0400 @@ -3,8 +3,12 @@ // Decompiler options: packimports(3) braces deadcode @@ -559,43 +745,85 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft/net/minecraft/src/WorldRend import java.util.*; + -+import net.minecraft.src.forge.MinecraftForgeClient; ++import net.minecraft.src.forge.ForgeHooksClient; + import org.lwjgl.opengl.GL11; // Referenced classes of package net.minecraft.src: -@@ -138,14 +142,27 @@ +@@ -125,8 +129,10 @@ + GL11.glTranslatef((float)(-sizeDepth) / 2.0F, (float)(-sizeHeight) / 2.0F, (float)(-sizeDepth) / 2.0F); + GL11.glScalef(f, f, f); + GL11.glTranslatef((float)sizeDepth / 2.0F, (float)sizeHeight / 2.0F, (float)sizeDepth / 2.0F); +- tessellator.startDrawingQuads(); +- tessellator.setTranslationD(-posX, -posY, -posZ); ++ ++ ForgeHooksClient.beforeRenderPass(i2); ++ Tessellator.instance.startDrawingQuads(); ++ Tessellator.instance.setTranslationD(-posX, -posY, -posZ); } + if(i2 == 0 && Block.isBlockContainer[i3]) + { +@@ -136,17 +142,17 @@ + tileEntityRenderers.add(tileentity); + } + } ++ Block block = Block.blocksList[i3]; int j3 = block.getRenderBlockPass(); -+ -+ if (block instanceof IMultipassRender) { -+ if (j3 != i2) { -+ flag = true; -+ } -+ IMultipassRender impr = (IMultipassRender) block; -+ if (impr.canRenderInPass(i2)) { -+ j3 = i2; -+ } -+ } -+ - if(j3 != i2) - { - flag = true; - continue; - } - if(j3 == i2) +- if(j3 != i2) - { -+ { -+ MinecraftForgeClient.beforeBlockRender(block, renderblocks); - flag1 |= renderblocks.renderBlockByRenderType(block, l2, j2, k2); -+ MinecraftForgeClient.afterBlockRender(block, renderblocks); - } +- flag = true; +- continue; +- } +- if(j3 == i2) +- { +- flag1 |= renderblocks.renderBlockByRenderType(block, l2, j2, k2); +- } ++ if(j3>i2) flag=true; ++ ++ if(!ForgeHooksClient.canRenderInPass(block,i2)) ++ continue; ++ ++ ForgeHooksClient.beforeBlockRender(block, renderblocks); ++ flag1 |= renderblocks.renderBlockByRenderType(block, l2, j2, k2); ++ ForgeHooksClient.afterBlockRender(block, renderblocks); } + } +@@ -155,10 +161,11 @@ + + if(flag2) + { +- tessellator.draw(); ++ ForgeHooksClient.afterRenderPass(i2); ++ Tessellator.instance.draw(); + GL11.glPopMatrix(); + GL11.glEndList(); +- tessellator.setTranslationD(0.0D, 0.0D, 0.0D); ++ Tessellator.instance.setTranslationD(0.0D, 0.0D, 0.0D); + } else + { + flag1 = false; +@@ -251,7 +258,6 @@ + + public World worldObj; + private int glRenderList; +- private static Tessellator tessellator; + public static int chunksUpdated = 0; + public int posX; + public int posY; +@@ -282,8 +288,4 @@ + public List tileEntityRenderers; + private List tileEntities; + +- static +- { +- tessellator = Tessellator.instance; +- } + } diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/BlockRedstoneWire.java ../src_work/minecraft_server/net/minecraft/src/BlockRedstoneWire.java ---- ../src_base/minecraft_server/net/minecraft/src/BlockRedstoneWire.java 2011-08-02 16:05:40.000000000 -0400 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockRedstoneWire.java 2011-08-02 16:07:43.000000000 -0400 +--- ../src_base/minecraft_server/net/minecraft/src/BlockRedstoneWire.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft_server/net/minecraft/src/BlockRedstoneWire.java 2011-08-04 20:51:18.000000000 -0400 @@ -3,6 +3,7 @@ // Decompiler options: packimports(3) braces deadcode @@ -616,8 +844,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/Bl { return true; diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/Chunk.java ../src_work/minecraft_server/net/minecraft/src/Chunk.java ---- ../src_base/minecraft_server/net/minecraft/src/Chunk.java 2011-08-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft_server/net/minecraft/src/Chunk.java 2011-08-02 16:07:43.000000000 -0400 +--- ../src_base/minecraft_server/net/minecraft/src/Chunk.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft_server/net/minecraft/src/Chunk.java 2011-08-04 20:51:18.000000000 -0400 @@ -3,6 +3,7 @@ // Decompiler options: packimports(3) braces deadcode @@ -655,8 +883,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/Ch if(j1 != 0) { diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/EntityPlayer.java ../src_work/minecraft_server/net/minecraft/src/EntityPlayer.java ---- ../src_base/minecraft_server/net/minecraft/src/EntityPlayer.java 2011-08-02 16:05:40.000000000 -0400 -+++ ../src_work/minecraft_server/net/minecraft/src/EntityPlayer.java 2011-08-02 16:07:43.000000000 -0400 +--- ../src_base/minecraft_server/net/minecraft/src/EntityPlayer.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft_server/net/minecraft/src/EntityPlayer.java 2011-08-04 20:51:18.000000000 -0400 @@ -6,6 +6,8 @@ import java.util.*; @@ -689,8 +917,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/En int k = i * j + damageRemainder; inventory.damageArmor(i); diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/Explosion.java ../src_work/minecraft_server/net/minecraft/src/Explosion.java ---- ../src_base/minecraft_server/net/minecraft/src/Explosion.java 2011-08-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft_server/net/minecraft/src/Explosion.java 2011-08-02 16:07:43.000000000 -0400 +--- ../src_base/minecraft_server/net/minecraft/src/Explosion.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft_server/net/minecraft/src/Explosion.java 2011-08-04 20:51:18.000000000 -0400 @@ -3,6 +3,7 @@ // Decompiler options: packimports(3) braces deadcode @@ -718,8 +946,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/Ex if(f1 > 0.0F) { diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/ItemBucket.java ../src_work/minecraft_server/net/minecraft/src/ItemBucket.java ---- ../src_base/minecraft_server/net/minecraft/src/ItemBucket.java 2011-08-02 16:05:40.000000000 -0400 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemBucket.java 2011-08-02 16:07:43.000000000 -0400 +--- ../src_base/minecraft_server/net/minecraft/src/ItemBucket.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft_server/net/minecraft/src/ItemBucket.java 2011-08-04 20:51:18.000000000 -0400 @@ -6,6 +6,8 @@ import java.util.Random; @@ -744,8 +972,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/It { world.setBlockWithNotify(i, j, k, 0); diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/ItemInWorldManager.java ../src_work/minecraft_server/net/minecraft/src/ItemInWorldManager.java ---- ../src_base/minecraft_server/net/minecraft/src/ItemInWorldManager.java 2011-08-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemInWorldManager.java 2011-08-02 16:07:43.000000000 -0400 +--- ../src_base/minecraft_server/net/minecraft/src/ItemInWorldManager.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft_server/net/minecraft/src/ItemInWorldManager.java 2011-08-04 20:51:18.000000000 -0400 @@ -3,6 +3,7 @@ // Decompiler options: packimports(3) braces deadcode @@ -767,8 +995,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/It if(i1 > 0 && Block.blocksList[i1].blockActivated(world, i, j, k, entityplayer)) { diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/ItemPickaxe.java ../src_work/minecraft_server/net/minecraft/src/ItemPickaxe.java ---- ../src_base/minecraft_server/net/minecraft/src/ItemPickaxe.java 2011-08-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemPickaxe.java 2011-08-02 16:07:43.000000000 -0400 +--- ../src_base/minecraft_server/net/minecraft/src/ItemPickaxe.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft_server/net/minecraft/src/ItemPickaxe.java 2011-08-04 20:51:18.000000000 -0400 @@ -4,6 +4,8 @@ package net.minecraft.src; @@ -789,8 +1017,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/It { return true; diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/ItemTool.java ../src_work/minecraft_server/net/minecraft/src/ItemTool.java ---- ../src_base/minecraft_server/net/minecraft/src/ItemTool.java 2011-08-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemTool.java 2011-08-02 16:07:43.000000000 -0400 +--- ../src_base/minecraft_server/net/minecraft/src/ItemTool.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft_server/net/minecraft/src/ItemTool.java 2011-08-04 20:51:18.000000000 -0400 @@ -4,6 +4,8 @@ package net.minecraft.src; @@ -813,8 +1041,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/It + } } diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/PlayerInstance.java ../src_work/minecraft_server/net/minecraft/src/PlayerInstance.java ---- ../src_base/minecraft_server/net/minecraft/src/PlayerInstance.java 2011-08-02 16:05:40.000000000 -0400 -+++ ../src_work/minecraft_server/net/minecraft/src/PlayerInstance.java 2011-08-02 16:07:43.000000000 -0400 +--- ../src_base/minecraft_server/net/minecraft/src/PlayerInstance.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft_server/net/minecraft/src/PlayerInstance.java 2011-08-04 20:51:18.000000000 -0400 @@ -169,12 +169,11 @@ sendPacketToPlayersInInstance(new Packet52MultiBlockChange(chunkX, chunkZ, blocksToUpdate, numBlocksToUpdate, worldserver)); for(int k = 0; k < numBlocksToUpdate; k++) @@ -832,8 +1060,8 @@ diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/Pl } } diff -u -r --strip-trailing-cr ../src_base/minecraft_server/net/minecraft/src/World.java ../src_work/minecraft_server/net/minecraft/src/World.java ---- ../src_base/minecraft_server/net/minecraft/src/World.java 2011-08-02 16:05:39.000000000 -0400 -+++ ../src_work/minecraft_server/net/minecraft/src/World.java 2011-08-03 01:10:51.000000000 -0400 +--- ../src_base/minecraft_server/net/minecraft/src/World.java 2011-08-04 20:51:17.000000000 -0400 ++++ ../src_work/minecraft_server/net/minecraft/src/World.java 2011-08-04 20:51:18.000000000 -0400 @@ -7,6 +7,8 @@ import java.io.PrintStream; import java.util.*;