From f3d22444d38dc9a0d407d94c3d652b231ae5c30a Mon Sep 17 00:00:00 2001 From: ToadDev <748280+Toad-Dev@users.noreply.github.com> Date: Thu, 10 Jun 2021 00:59:21 -0700 Subject: [PATCH 1/6] Fix: Stop water and chests being drawn over monitors Somewhere along the line the gl state was being mangled and I'm still not sure where! I moved the monitor blocks from the cutout render layer to the default solid layer, which obviates the depth blocker. I don't think the transparent front of the monitor blocks was ever visible so this should be fine. Then the terminal quads are moved slightly outward to prevent z-fighting with the now present block front. Finally I noticed some chests were not rendering correctly around monitors, so I paired an endDrawing() call with our sneaky hack of calling startDrawing() to force the rendering state. This fixed the chests. Hopefully we haven't messed up the render state in more ways :) --- .../proxy/ComputerCraftProxyClient.java | 4 --- .../render/TileEntityMonitorRenderer.java | 25 ++++++++----------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java index fa7c0a8f1..d59206009 100644 --- a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java +++ b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java @@ -77,10 +77,6 @@ public final class ComputerCraftProxyClient implements ClientModInitializer BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.TURTLE_NORMAL, RenderLayer.getTranslucent() ); BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.TURTLE_ADVANCED, RenderLayer.getTranslucent() ); - // Monitors' textures have transparent fronts and so count as cutouts. - BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.MONITOR_NORMAL, RenderLayer.getCutout() ); - BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.MONITOR_ADVANCED, RenderLayer.getCutout() ); - // Setup TESRs BlockEntityRendererRegistry.INSTANCE.register( ComputerCraftRegistry.ModTiles.MONITOR_NORMAL, TileEntityMonitorRenderer::new ); BlockEntityRendererRegistry.INSTANCE.register( ComputerCraftRegistry.ModTiles.MONITOR_ADVANCED, TileEntityMonitorRenderer::new ); diff --git a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java index 5390b812a..3e797aa7b 100644 --- a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java @@ -59,10 +59,7 @@ public class TileEntityMonitorRenderer extends BlockEntityRenderer // Render from the origin monitor ClientMonitor originTerminal = monitor.getClientMonitor(); - if( originTerminal == null ) - { - return; - } + if( originTerminal == null ) return; TileMonitor origin = originTerminal.getOrigin(); BlockPos monitorPos = monitor.getPos(); @@ -96,7 +93,7 @@ public class TileEntityMonitorRenderer extends BlockEntityRenderer transform.multiply( Vector3f.POSITIVE_X.getDegreesQuaternion( pitch ) ); transform.translate( -0.5 + TileMonitor.RENDER_BORDER + TileMonitor.RENDER_MARGIN, origin.getHeight() - 0.5 - (TileMonitor.RENDER_BORDER + TileMonitor.RENDER_MARGIN) + 0, - 0.5 ); + 0.501 ); double xSize = origin.getWidth() - 2.0 * (TileMonitor.RENDER_MARGIN + TileMonitor.RENDER_BORDER); double ySize = origin.getHeight() - 2.0 * (TileMonitor.RENDER_MARGIN + TileMonitor.RENDER_BORDER); @@ -112,8 +109,7 @@ public class TileEntityMonitorRenderer extends BlockEntityRenderer transform.push(); transform.scale( (float) xScale, (float) -yScale, 1.0f ); - Matrix4f matrix = transform.peek() - .getModel(); + Matrix4f matrix = transform.peek().getModel(); // Sneaky hack here: we get a buffer now in order to flush existing ones and set up the appropriate // render state. I've no clue how well this'll work in future versions of Minecraft, but it does the trick @@ -127,6 +123,8 @@ public class TileEntityMonitorRenderer extends BlockEntityRenderer // reasonable. FixedWidthFontRenderer.drawCursor( matrix, buffer, 0, 0, terminal, !originTerminal.isColour() ); + FixedWidthFontRenderer.TYPE.endDrawing(); + transform.pop(); } else @@ -140,13 +138,12 @@ public class TileEntityMonitorRenderer extends BlockEntityRenderer (float) -(ySize + MARGIN * 2) ); } - FixedWidthFontRenderer.drawBlocker( transform.peek() - .getModel(), - renderer, - (float) -TileMonitor.RENDER_MARGIN, - (float) TileMonitor.RENDER_MARGIN, - (float) (xSize + 2 * TileMonitor.RENDER_MARGIN), - (float) -(ySize + TileMonitor.RENDER_MARGIN * 2) ); +// FixedWidthFontRenderer.drawBlocker( transform.peek().getModel(), +// renderer, +// (float) -TileMonitor.RENDER_MARGIN, +// (float) TileMonitor.RENDER_MARGIN, +// (float) (xSize + 2 * TileMonitor.RENDER_MARGIN), +// (float) -(ySize + TileMonitor.RENDER_MARGIN * 2) ); transform.pop(); } From 52bb06d2508b9d70aa200a3f95a4b5d0f5d36554 Mon Sep 17 00:00:00 2001 From: ToadDev <748280+Toad-Dev@users.noreply.github.com> Date: Thu, 10 Jun 2021 01:07:29 -0700 Subject: [PATCH 2/6] Add a shader mod compatibility check to the MonitorRenderer.BEST option. Will need to fill in the shader mod ids after some testing. --- .../peripheral/monitor/MonitorRenderer.java | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java index 6d0dc360f..43a65da96 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java @@ -7,9 +7,12 @@ package dan200.computercraft.shared.peripheral.monitor; import dan200.computercraft.ComputerCraft; import dan200.computercraft.client.render.TileEntityMonitorRenderer; +import net.fabricmc.loader.api.FabricLoader; import org.lwjgl.opengl.GL; import javax.annotation.Nonnull; +import java.util.Arrays; +import java.util.List; /** * The render type to use for monitors. @@ -38,6 +41,9 @@ public enum MonitorRenderer private static boolean initialised = false; private static boolean textureBuffer = false; + private static boolean shaderMod = false; + //TODO find out which shader mods do better with VBOs and add them here. + private static List shaderModIds = Arrays.asList("aShaderModThatWouldPreferVBOs"); /** * Get the current renderer to use. @@ -69,18 +75,30 @@ public enum MonitorRenderer private static MonitorRenderer best() { - checkCapabilities(); - return textureBuffer ? TBO : VBO; + if ( !initialised ) + { + checkCapabilities(); + checkForShaderMods(); + if ( textureBuffer && shaderMod ) + { + ComputerCraft.log.warn("Shader mod detected. Enabling VBO renderer for compatibility."); + } + + initialised = true; + } + + return textureBuffer && !shaderMod ? TBO : VBO; } private static void checkCapabilities() { - if( initialised ) - { - return; - } - textureBuffer = GL.getCapabilities().OpenGL31; - initialised = true; + } + + private static void checkForShaderMods() + { + shaderMod = FabricLoader.getInstance().getAllMods().stream() + .map( modContainer -> modContainer.getMetadata().getId() ) + .anyMatch( id -> shaderModIds.contains( id ) ); } } From f596af059d55a70a54696131af1c64e1e2c9369d Mon Sep 17 00:00:00 2001 From: ToadDev <748280+Toad-Dev@users.noreply.github.com> Date: Thu, 10 Jun 2021 01:42:24 -0700 Subject: [PATCH 3/6] Add a button to change monitor renderer in mod menu. Probably useful for now. --- .../integration/ModMenuIntegration.java | 33 +++++++++++++++-- .../computercraft/shared/util/Config.java | 36 +++++++++++++++---- 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/main/java/dan200/computercraft/shared/integration/ModMenuIntegration.java b/src/main/java/dan200/computercraft/shared/integration/ModMenuIntegration.java index 1455446c9..f973cf5a5 100644 --- a/src/main/java/dan200/computercraft/shared/integration/ModMenuIntegration.java +++ b/src/main/java/dan200/computercraft/shared/integration/ModMenuIntegration.java @@ -7,10 +7,18 @@ package dan200.computercraft.shared.integration; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; +import dan200.computercraft.ComputerCraft; +import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer; +import dan200.computercraft.shared.util.Config; +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigCategory; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.text.LiteralText; +import net.minecraft.text.Text; -// A stub modmenu entrypoint for when we get there +// A poor mod menu integration just for testing the monitor rendering changes we've been making :) @Environment( EnvType.CLIENT ) public class ModMenuIntegration implements ModMenuApi @@ -18,6 +26,27 @@ public class ModMenuIntegration implements ModMenuApi @Override public ConfigScreenFactory getModConfigScreenFactory() { - return parent -> null; + return parent -> { + ConfigBuilder builder = ConfigBuilder.create().setParentScreen( parent ) + .setTitle( new LiteralText( "Computer Craft" ) ) + .setSavingRunnable( () -> { + Config.clientSpec.correct( Config.clientConfig ); + Config.sync(); + Config.save(); + ComputerCraft.log.info( "Monitor renderer: {}", ComputerCraft.monitorRenderer ); + } ); + + ConfigCategory client = builder.getOrCreateCategory( new LiteralText( "Client" ) ); + + ConfigEntryBuilder entryBuilder = builder.entryBuilder(); + + client.addEntry( entryBuilder.startEnumSelector( new LiteralText( "Monitor Renderer" ), MonitorRenderer.class, ComputerCraft.monitorRenderer ) + .setDefaultValue( MonitorRenderer.BEST ) + .setSaveConsumer( renderer -> { Config.clientConfig.set( "monitor_renderer", renderer ); } ) + .setTooltip( Text.of( Config.clientConfig.getComment( "monitor_renderer" ) ) ) + .build() ); + + return builder.build(); + }; } } diff --git a/src/main/java/dan200/computercraft/shared/util/Config.java b/src/main/java/dan200/computercraft/shared/util/Config.java index a6b14af07..06dd19fac 100644 --- a/src/main/java/dan200/computercraft/shared/util/Config.java +++ b/src/main/java/dan200/computercraft/shared/util/Config.java @@ -5,7 +5,6 @@ */ package dan200.computercraft.shared.util; -import com.electronwill.nightconfig.core.CommentedConfig; import com.electronwill.nightconfig.core.ConfigSpec; import com.electronwill.nightconfig.core.EnumGetMethod; import com.electronwill.nightconfig.core.UnmodifiableConfig; @@ -39,11 +38,13 @@ public final class Config public static final CommentedConfigSpec serverSpec; public static final CommentedConfigSpec clientSpec; - public static CommentedConfig serverConfig; - public static CommentedConfig clientConfig; + public static CommentedFileConfig serverConfig; + public static CommentedFileConfig clientConfig; private static final WorldSavePath serverDir = WorldSavePathAccess.createWorldSavePath( "serverconfig" ); private static final String serverFileName = "computercraft-server.toml"; + + private static Path serverPath = null; private static final Path clientPath = FabricLoader.INSTANCE.getConfigDir().resolve( "computercraft-client.toml" ); private Config() @@ -243,7 +244,7 @@ public final class Config clientSpec.defineInRange( "monitor_distance", 64, 16, 1024 ); } - private static final FileNotFoundAction MAKE_DIRECTORIES = ( file, configFormat ) -> { + private static final FileNotFoundAction MAKE_DIRECTORIES_AND_FILE = ( file, configFormat ) -> { Files.createDirectories( file.getParent() ); Files.createFile( file ); configFormat.initEmptyFile( file ); @@ -253,14 +254,36 @@ public final class Config private static CommentedFileConfig buildFileConfig( Path path ) { return CommentedFileConfig.builder( path ) - .onFileNotFound( MAKE_DIRECTORIES ) + .onFileNotFound( MAKE_DIRECTORIES_AND_FILE ) .preserveInsertionOrder() .build(); } + private static void saveConfig( UnmodifiableConfig config, CommentedConfigSpec spec, Path path ) + { + try( CommentedFileConfig fileConfig = buildFileConfig( path ) ) + { + fileConfig.putAll( config ); + spec.correct( fileConfig ); + fileConfig.save(); + } + } + + public static void save() + { + if( clientConfig != null ) + { + saveConfig( clientConfig, clientSpec, clientPath ); + } + if( serverConfig != null && serverPath != null ) + { + saveConfig( serverConfig, serverSpec, serverPath ); + } + } + public static void serverStarting( MinecraftServer server ) { - Path serverPath = server.getSavePath( serverDir ).resolve( serverFileName ); + serverPath = server.getSavePath( serverDir ).resolve( serverFileName ); try( CommentedFileConfig config = buildFileConfig( serverPath ) ) { @@ -275,6 +298,7 @@ public final class Config public static void serverStopping( MinecraftServer server ) { serverConfig = null; + serverPath = null; } public static void clientStarted( MinecraftClient client ) From fb128152a5b7959ad5e2bcfe937c3807660a0bba Mon Sep 17 00:00:00 2001 From: ToadDev <748280+Toad-Dev@users.noreply.github.com> Date: Thu, 10 Jun 2021 01:55:01 -0700 Subject: [PATCH 4/6] Fix checkstyle :P --- .../client/render/TileEntityMonitorRenderer.java | 12 ++++++------ .../shared/peripheral/monitor/MonitorRenderer.java | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java index 3e797aa7b..6dd81b5a2 100644 --- a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java @@ -138,12 +138,12 @@ public class TileEntityMonitorRenderer extends BlockEntityRenderer (float) -(ySize + MARGIN * 2) ); } -// FixedWidthFontRenderer.drawBlocker( transform.peek().getModel(), -// renderer, -// (float) -TileMonitor.RENDER_MARGIN, -// (float) TileMonitor.RENDER_MARGIN, -// (float) (xSize + 2 * TileMonitor.RENDER_MARGIN), -// (float) -(ySize + TileMonitor.RENDER_MARGIN * 2) ); + // FixedWidthFontRenderer.drawBlocker( transform.peek().getModel(), + // renderer, + // (float) -TileMonitor.RENDER_MARGIN, + // (float) TileMonitor.RENDER_MARGIN, + // (float) (xSize + 2 * TileMonitor.RENDER_MARGIN), + // (float) -(ySize + TileMonitor.RENDER_MARGIN * 2) ); transform.pop(); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java index 43a65da96..953875f0e 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java @@ -43,7 +43,7 @@ public enum MonitorRenderer private static boolean textureBuffer = false; private static boolean shaderMod = false; //TODO find out which shader mods do better with VBOs and add them here. - private static List shaderModIds = Arrays.asList("aShaderModThatWouldPreferVBOs"); + private static List shaderModIds = Arrays.asList( "aShaderModThatWouldPreferVBOs" ); /** * Get the current renderer to use. @@ -81,7 +81,7 @@ public enum MonitorRenderer checkForShaderMods(); if ( textureBuffer && shaderMod ) { - ComputerCraft.log.warn("Shader mod detected. Enabling VBO renderer for compatibility."); + ComputerCraft.log.warn( "Shader mod detected. Enabling VBO renderer for compatibility." ); } initialised = true; From 06b0538b7605aa5d6062e7ad9afb2226570e3585 Mon Sep 17 00:00:00 2001 From: ToadDev <748280+Toad-Dev@users.noreply.github.com> Date: Thu, 10 Jun 2021 11:55:13 -0700 Subject: [PATCH 5/6] Reverted change to blocker layer, with tweaks. Without the blocker layer even VBOs didn't work with shaders. So instead I put the blocker back and made it mask both color and depth buffers, which fixes the bug with chests and water drawing over monitors. Since it now masks color I hoisted it up to be drawn before the terminal, and made the terminal slightly offset to solve z-fighting with VBO renderer. --- .../client/gui/FixedWidthFontRenderer.java | 2 +- .../proxy/ComputerCraftProxyClient.java | 4 ++++ .../render/TileEntityMonitorRenderer.java | 22 ++++++++++++------- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java b/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java index 48a8b6aed..36868c428 100644 --- a/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java +++ b/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java @@ -409,7 +409,7 @@ public final class FixedWidthFontRenderer false, false ) ) // blur, minimap .alpha( ONE_TENTH_ALPHA ) - .writeMaskState( DEPTH_MASK ) + .writeMaskState( ALL_MASK ) .lightmap( DISABLE_LIGHTMAP ) .build( false ) ); diff --git a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java index d59206009..fa7c0a8f1 100644 --- a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java +++ b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java @@ -77,6 +77,10 @@ public final class ComputerCraftProxyClient implements ClientModInitializer BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.TURTLE_NORMAL, RenderLayer.getTranslucent() ); BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.TURTLE_ADVANCED, RenderLayer.getTranslucent() ); + // Monitors' textures have transparent fronts and so count as cutouts. + BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.MONITOR_NORMAL, RenderLayer.getCutout() ); + BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.MONITOR_ADVANCED, RenderLayer.getCutout() ); + // Setup TESRs BlockEntityRendererRegistry.INSTANCE.register( ComputerCraftRegistry.ModTiles.MONITOR_NORMAL, TileEntityMonitorRenderer::new ); BlockEntityRendererRegistry.INSTANCE.register( ComputerCraftRegistry.ModTiles.MONITOR_ADVANCED, TileEntityMonitorRenderer::new ); diff --git a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java index 6dd81b5a2..2c40576e4 100644 --- a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java @@ -93,10 +93,21 @@ public class TileEntityMonitorRenderer extends BlockEntityRenderer transform.multiply( Vector3f.POSITIVE_X.getDegreesQuaternion( pitch ) ); transform.translate( -0.5 + TileMonitor.RENDER_BORDER + TileMonitor.RENDER_MARGIN, origin.getHeight() - 0.5 - (TileMonitor.RENDER_BORDER + TileMonitor.RENDER_MARGIN) + 0, - 0.501 ); + 0.50 ); double xSize = origin.getWidth() - 2.0 * (TileMonitor.RENDER_MARGIN + TileMonitor.RENDER_BORDER); double ySize = origin.getHeight() - 2.0 * (TileMonitor.RENDER_MARGIN + TileMonitor.RENDER_BORDER); + // Draw the background blocker + FixedWidthFontRenderer.drawBlocker( transform.peek().getModel(), + renderer, + (float) -TileMonitor.RENDER_MARGIN, + (float) TileMonitor.RENDER_MARGIN, + (float) (xSize + 2 * TileMonitor.RENDER_MARGIN), + (float) -(ySize + TileMonitor.RENDER_MARGIN * 2) ); + + // Set the contents slightly off the surface to prevent z-fighting + transform.translate( 0.0, 0.0, 0.001 ); + // Draw the contents Terminal terminal = originTerminal.getTerminal(); if( terminal != null ) @@ -123,6 +134,8 @@ public class TileEntityMonitorRenderer extends BlockEntityRenderer // reasonable. FixedWidthFontRenderer.drawCursor( matrix, buffer, 0, 0, terminal, !originTerminal.isColour() ); + // To go along with sneaky hack above: make sure state changes are undone. I would have thought this would + // happen automatically after these buffers are drawn, but chests will render weird around monitors without this. FixedWidthFontRenderer.TYPE.endDrawing(); transform.pop(); @@ -138,13 +151,6 @@ public class TileEntityMonitorRenderer extends BlockEntityRenderer (float) -(ySize + MARGIN * 2) ); } - // FixedWidthFontRenderer.drawBlocker( transform.peek().getModel(), - // renderer, - // (float) -TileMonitor.RENDER_MARGIN, - // (float) TileMonitor.RENDER_MARGIN, - // (float) (xSize + 2 * TileMonitor.RENDER_MARGIN), - // (float) -(ySize + TileMonitor.RENDER_MARGIN * 2) ); - transform.pop(); } From 9662a106f0c6776ba0c98dbff24801df15dfa69d Mon Sep 17 00:00:00 2001 From: ToadDev <748280+Toad-Dev@users.noreply.github.com> Date: Thu, 10 Jun 2021 12:00:11 -0700 Subject: [PATCH 6/6] Mark optifabric as incompatible with MonitorRenderer.TBO Anyone using the default BEST option will automatically have VBOs enabled when optifabric is detected. --- .../shared/peripheral/monitor/MonitorRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java index 953875f0e..90980336e 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorRenderer.java @@ -43,7 +43,7 @@ public enum MonitorRenderer private static boolean textureBuffer = false; private static boolean shaderMod = false; //TODO find out which shader mods do better with VBOs and add them here. - private static List shaderModIds = Arrays.asList( "aShaderModThatWouldPreferVBOs" ); + private static List shaderModIds = Arrays.asList( "optifabric" ); /** * Get the current renderer to use.