55import net .minecraft .client .renderer .texture .TextureMap ;
66import net .minecraft .client .renderer .vertex .DefaultVertexFormats ;
77import net .minecraft .client .renderer .vertex .VertexBuffer ;
8+ import net .minecraft .client .renderer .vertex .VertexFormatElement ;
89import net .minecraft .util .BlockRenderLayer ;
910import net .minecraft .util .math .BlockPos ;
1011import net .minecraft .world .World ;
1112import net .minecraftforge .client .ForgeHooksClient ;
1213import net .minecraftforge .client .MinecraftForgeClient ;
1314import net .minecraftforge .fml .relauncher .Side ;
1415import net .minecraftforge .fml .relauncher .SideOnly ;
16+
1517import org .lwjgl .opengl .GL11 ;
1618
17- import java .nio .ByteBuffer ;
1819import java .util .Collection ;
1920
2021@ SideOnly (Side .CLIENT )
2122public class VBOWorldSceneRenderer extends ImmediateWorldSceneRenderer {
2223
23- protected final VertexBuffer [] vbos = new VertexBuffer [BlockRenderLayer .values ().length ];
24+ protected static final VertexBuffer [] VBOS = new VertexBuffer [BlockRenderLayer .values ().length ];
2425 protected boolean isDirty = true ;
2526
2627 public VBOWorldSceneRenderer (World world ) {
@@ -33,17 +34,17 @@ private void uploadVBO() {
3334 try { // render block in each layer
3435 for (BlockRenderLayer layer : BlockRenderLayer .values ()) {
3536
36- var vbo = this .vbos [layer .ordinal ()] = new VertexBuffer (DefaultVertexFormats .BLOCK );
37-
3837 renderBlockLayer (layer );
3938
4039 // Get the buffer again
4140 BufferBuilder buffer = Tessellator .getInstance ().getBuffer ();
4241 buffer .finishDrawing ();
4342 buffer .reset ();
4443
45- ByteBuffer data = buffer .getByteBuffer ();
46- vbo .bufferData (data );
44+ int i = layer .ordinal ();
45+ var vbo = VBOS [i ];
46+ if (vbo == null ) vbo = VBOS [i ] = new VertexBuffer (DefaultVertexFormats .BLOCK );
47+ vbo .bufferData (buffer .getByteBuffer ());
4748 }
4849 } finally {
4950 ForgeHooksClient .setRenderLayer (oldRenderLayer );
@@ -80,19 +81,20 @@ protected void drawWorld() {
8081
8182 GlStateManager .pushMatrix ();
8283 {
83- var vbo = this .vbos [layer .ordinal ()];
84+ int i = layer .ordinal ();
85+ var vbo = VBOS [i ];
8486 vbo .bindBuffer ();
85- setupClientStates ();
87+ enableClientStates ();
8688 setupArrayPointers ();
8789 vbo .drawArrays (GL11 .GL_QUADS );
88- resetClientStates ();
90+ disableClientStates ();
8991 vbo .unbindBuffer ();
9092 }
9193 GlStateManager .popMatrix ();
9294 }
9395 ForgeHooksClient .setRenderLayer (oldRenderLayer );
9496
95- renderTESR (); // Handles TileEntities
97+ renderTileEntities (); // Handle TileEntities
9698
9799 GlStateManager .shadeModel (GL11 .GL_SMOOTH );
98100 RenderHelper .enableStandardItemLighting ();
@@ -111,7 +113,7 @@ public WorldSceneRenderer addRenderedBlocks(Collection<BlockPos> blocks) {
111113 return super .addRenderedBlocks (blocks );
112114 }
113115
114- protected void setupClientStates () {
116+ protected void enableClientStates () {
115117 GlStateManager .glEnableClientState (GL11 .GL_VERTEX_ARRAY );
116118 OpenGlHelper .setClientActiveTexture (OpenGlHelper .defaultTexUnit );
117119 GlStateManager .glEnableClientState (GL11 .GL_TEXTURE_COORD_ARRAY );
@@ -121,11 +123,19 @@ protected void setupClientStates() {
121123 GlStateManager .glEnableClientState (GL11 .GL_COLOR_ARRAY );
122124 }
123125
124- protected void resetClientStates () {
125- GlStateManager .glDisableClientState (GL11 .GL_VERTEX_ARRAY );
126- GlStateManager .glDisableClientState (GL11 .GL_TEXTURE_COORD_ARRAY );
127- GlStateManager .glDisableClientState (GL11 .GL_TEXTURE_COORD_ARRAY );
128- GlStateManager .glDisableClientState (GL11 .GL_COLOR_ARRAY );
126+ protected void disableClientStates () {
127+ for (VertexFormatElement element : DefaultVertexFormats .BLOCK .getElements ()) {
128+ switch (element .getUsage ()) {
129+ case POSITION -> GlStateManager .glDisableClientState (GL11 .GL_VERTEX_ARRAY );
130+ case COLOR -> GlStateManager .glDisableClientState (GL11 .GL_COLOR_ARRAY );
131+ case UV -> {
132+ OpenGlHelper .setClientActiveTexture (OpenGlHelper .defaultTexUnit + element .getIndex ());
133+ GlStateManager .glDisableClientState (GL11 .GL_TEXTURE_COORD_ARRAY );
134+ OpenGlHelper .setClientActiveTexture (OpenGlHelper .defaultTexUnit );
135+ }
136+ default -> {}
137+ }
138+ }
129139 }
130140
131141 protected void setupArrayPointers () {
0 commit comments