瀏覽代碼

Added 19w34a support without removing 1.14.x support

Danielshe 5 年之前
父節點
當前提交
0567441aeb

+ 1 - 1
gradle.properties

@@ -2,5 +2,5 @@ minecraft_version=1.14.4
 yarn_version=1.14.4+build.8
 fabric_loader_version=0.4.8+build.159
 fabric_version=0.3.0+build.207
-mod_version=1.0.1
+mod_version=1.1.1
 modmenu_version=1.7.6+build.115

+ 21 - 23
src/main/java/me/shedaniel/clothconfig2/gui/ClothConfigScreen.java

@@ -3,15 +3,13 @@ package me.shedaniel.clothconfig2.gui;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.util.concurrent.AtomicDouble;
-import com.mojang.blaze3d.platform.GlStateManager;
-import com.mojang.blaze3d.platform.GlStateManager.DestFactor;
-import com.mojang.blaze3d.platform.GlStateManager.SourceFactor;
 import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
 import me.shedaniel.clothconfig2.api.AbstractConfigEntry;
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.clothconfig2.api.QueuedTooltip;
 import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget;
 import me.shedaniel.math.api.Rectangle;
+import me.shedaniel.math.compat.RenderHelper;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
 import net.minecraft.client.gui.DrawableHelper;
@@ -241,11 +239,11 @@ public abstract class ClothConfigScreen extends Screen {
             @Override
             public void renderButton(int int_1, int int_2, float float_1) {
                 minecraft.getTextureManager().bindTexture(CONFIG_TEX);
-                GlStateManager.color4f(1.0F, 1.0F, 1.0F, this.alpha);
+                RenderHelper.color4f(1.0F, 1.0F, 1.0F, this.alpha);
                 int int_3 = this.getYImage(this.isHovered());
-                GlStateManager.enableBlend();
-                GlStateManager.blendFuncSeparate(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ZERO);
-                GlStateManager.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA);
+                RenderHelper.enableBlend();
+                RenderHelper.blendFuncSeparate(770, 771, 0, 1);
+                RenderHelper.blendFunc(770, 771);
                 this.blit(x, y, 12, 18 * int_3, width, height);
             }
         });
@@ -266,11 +264,11 @@ public abstract class ClothConfigScreen extends Screen {
             @Override
             public void renderButton(int int_1, int int_2, float float_1) {
                 minecraft.getTextureManager().bindTexture(CONFIG_TEX);
-                GlStateManager.color4f(1.0F, 1.0F, 1.0F, this.alpha);
+                RenderHelper.color4f(1.0F, 1.0F, 1.0F, this.alpha);
                 int int_3 = this.getYImage(this.isHovered());
-                GlStateManager.enableBlend();
-                GlStateManager.blendFuncSeparate(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ZERO);
-                GlStateManager.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA);
+                RenderHelper.enableBlend();
+                RenderHelper.blendFuncSeparate(770, 771, 0, 1);
+                RenderHelper.blendFunc(770, 771);
                 this.blit(x, y, 0, 18 * int_3, width, height);
             }
         });
@@ -359,7 +357,7 @@ public abstract class ClothConfigScreen extends Screen {
                         errors.add(((Optional<String>) entry.getConfigError()).get());
             if (errors.size() > 0) {
                 minecraft.getTextureManager().bindTexture(CONFIG_TEX);
-                GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+                RenderHelper.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                 blit(10, 10, 0, 54, 3, 11);
                 if (errors.size() == 1)
                     drawString(minecraft.textRenderer, "§c" + errors.get(0), 18, 12, -1);
@@ -368,7 +366,7 @@ public abstract class ClothConfigScreen extends Screen {
             }
         } else if (!isEditable()) {
             minecraft.getTextureManager().bindTexture(CONFIG_TEX);
-            GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+            RenderHelper.color4f(1.0F, 1.0F, 1.0F, 1.0F);
             blit(10, 10, 0, 54, 3, 11);
             drawString(minecraft.textRenderer, "§c" + I18n.translate("text.cloth-config.not_editable"), 18, 12, -1);
         }
@@ -382,11 +380,11 @@ public abstract class ClothConfigScreen extends Screen {
     }
     
     private void drawShades() {
-        GlStateManager.enableBlend();
-        GlStateManager.blendFuncSeparate(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ZERO, DestFactor.ONE);
-        GlStateManager.disableAlphaTest();
-        GlStateManager.shadeModel(7425);
-        GlStateManager.disableTexture();
+        RenderHelper.enableBlend();
+        RenderHelper.blendFuncSeparate(770, 771, 0, 1);
+        RenderHelper.disableAlphaTest();
+        RenderHelper.shadeModel(7425);
+        RenderHelper.disableTexture();
         Tessellator tessellator = Tessellator.getInstance();
         BufferBuilder buffer = tessellator.getBufferBuilder();
         buffer.begin(7, VertexFormats.POSITION_UV_COLOR);
@@ -401,17 +399,17 @@ public abstract class ClothConfigScreen extends Screen {
         buffer.vertex(tabsBounds.getMaxX() - 20, tabsBounds.getMaxY() - 4, 0.0D).texture(1.0D, 0.0D).color(0, 0, 0, 0).next();
         buffer.vertex(tabsBounds.getMinX() + 20, tabsBounds.getMaxY() - 4, 0.0D).texture(0.0D, 0.0D).color(0, 0, 0, 0).next();
         tessellator.draw();
-        GlStateManager.enableTexture();
-        GlStateManager.shadeModel(7424);
-        GlStateManager.enableAlphaTest();
-        GlStateManager.disableBlend();
+        RenderHelper.enableTexture();
+        RenderHelper.shadeModel(7424);
+        RenderHelper.enableAlphaTest();
+        RenderHelper.disableBlend();
     }
     
     protected void overlayBackground(Rectangle rect, int red, int green, int blue, int startAlpha, int endAlpha) {
         Tessellator tessellator = Tessellator.getInstance();
         BufferBuilder buffer = tessellator.getBufferBuilder();
         minecraft.getTextureManager().bindTexture(getBackgroundLocation());
-        GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+        RenderHelper.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         float f = 32.0F;
         buffer.begin(7, VertexFormats.POSITION_UV_COLOR);
         buffer.vertex(rect.getMinX(), rect.getMaxY(), 0.0D).texture(rect.getMinX() / 32.0D, rect.getMaxY() / 32.0D).color(red, green, blue, endAlpha).next();

+ 2 - 2
src/main/java/me/shedaniel/clothconfig2/gui/entries/BaseListEntry.java

@@ -1,10 +1,10 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
 import com.google.common.collect.Lists;
-import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.clothconfig2.api.QueuedTooltip;
 import me.shedaniel.math.api.Point;
 import me.shedaniel.math.api.Rectangle;
+import me.shedaniel.math.compat.RenderHelper;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.widget.AbstractButtonWidget;
@@ -166,7 +166,7 @@ public abstract class BaseListEntry<T, C extends BaseListCell> extends TooltipLi
         }
         MinecraftClient.getInstance().getTextureManager().bindTexture(CONFIG_TEX);
         GuiLighting.disable();
-        GlStateManager.color4f(1, 1, 1, 1);
+        RenderHelper.color4f(1, 1, 1, 1);
         BaseListCell focused = !expended || getFocused() == null || !(getFocused() instanceof BaseListCell) ? null : (BaseListCell) getFocused();
         boolean insideCreateNew = isInsideCreateNew(mouseX, mouseY);
         boolean insideDelete = isInsideDelete(mouseX, mouseY);

+ 4 - 4
src/main/java/me/shedaniel/clothconfig2/gui/entries/DoubleListListEntry.java

@@ -34,14 +34,14 @@ public class DoubleListListEntry extends BaseListEntry<Double, DoubleListListEnt
         expended = defaultExpended;
     }
     
-    public void setCellErrorSupplier(Function<Double, Optional<String>> cellErrorSupplier) {
-        this.cellErrorSupplier = cellErrorSupplier;
-    }
-    
     public Function<Double, Optional<String>> getCellErrorSupplier() {
         return cellErrorSupplier;
     }
     
+    public void setCellErrorSupplier(Function<Double, Optional<String>> cellErrorSupplier) {
+        this.cellErrorSupplier = cellErrorSupplier;
+    }
+    
     @Override
     public List<Double> getValue() {
         return cells.stream().map(DoubleListCell::getValue).collect(Collectors.toList());

+ 2 - 2
src/main/java/me/shedaniel/clothconfig2/gui/entries/SubCategoryListEntry.java

@@ -1,9 +1,9 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
 import com.google.common.collect.Lists;
-import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.math.api.Rectangle;
+import me.shedaniel.math.compat.RenderHelper;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.render.GuiLighting;
@@ -71,7 +71,7 @@ public class SubCategoryListEntry extends TooltipListEntry<List<AbstractConfigLi
         widget.rectangle.height = 24;
         MinecraftClient.getInstance().getTextureManager().bindTexture(CONFIG_TEX);
         GuiLighting.disable();
-        GlStateManager.color4f(1, 1, 1, 1);
+        RenderHelper.color4f(1, 1, 1, 1);
         blit(x - 15, y + 4, 24, (widget.rectangle.contains(mouseX, mouseY) ? 18 : 0) + (expended ? 9 : 0), 9, 9);
         MinecraftClient.getInstance().textRenderer.drawWithShadow(I18n.translate(categoryName), x, y + 5, widget.rectangle.contains(mouseX, mouseY) ? 0xffe6fe16 : -1);
         for(AbstractConfigListEntry entry : entries) {

+ 19 - 19
src/main/java/me/shedaniel/clothconfig2/gui/widget/DynamicEntryListWidget.java

@@ -1,7 +1,7 @@
 package me.shedaniel.clothconfig2.gui.widget;
 
 import com.google.common.collect.Lists;
-import com.mojang.blaze3d.platform.GlStateManager;
+import me.shedaniel.math.compat.RenderHelper;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
@@ -160,12 +160,12 @@ public abstract class DynamicEntryListWidget<E extends DynamicEntryListWidget.En
         this.drawBackground();
         int scrollbarPosition = this.getScrollbarPosition();
         int int_4 = scrollbarPosition + 6;
-        GlStateManager.disableLighting();
-        GlStateManager.disableFog();
+        RenderHelper.disableLighting();
+        RenderHelper.disableFog();
         Tessellator tessellator = Tessellator.getInstance();
         BufferBuilder buffer = tessellator.getBufferBuilder();
         this.client.getTextureManager().bindTexture(backgroundLocation);
-        GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+        RenderHelper.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         float float_2 = 32.0F;
         buffer.begin(7, VertexFormats.POSITION_UV_COLOR);
         buffer.vertex(this.left, this.bottom, 0.0D).texture(this.left / 32.0F, ((this.bottom + (int) this.getScroll()) / 32.0F)).color(32, 32, 32, 255).next();
@@ -179,14 +179,14 @@ public abstract class DynamicEntryListWidget<E extends DynamicEntryListWidget.En
             this.renderHeader(rowLeft, startY, tessellator);
         
         this.renderList(rowLeft, startY, mouseX, mouseY, delta);
-        GlStateManager.disableDepthTest();
+        RenderHelper.disableDepthTest();
         this.renderHoleBackground(0, this.top, 255, 255);
         this.renderHoleBackground(this.bottom, this.height, 255, 255);
-        GlStateManager.enableBlend();
-        GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE);
-        GlStateManager.disableAlphaTest();
-        GlStateManager.shadeModel(7425);
-        GlStateManager.disableTexture();
+        RenderHelper.enableBlend();
+        RenderHelper.blendFuncSeparate(770, 771, 0, 1);
+        RenderHelper.disableAlphaTest();
+        RenderHelper.shadeModel(7425);
+        RenderHelper.disableTexture();
         buffer.begin(7, VertexFormats.POSITION_UV_COLOR);
         buffer.vertex(this.left, this.top + 4, 0.0D).texture(0.0D, 1.0D).color(0, 0, 0, 0).next();
         buffer.vertex(this.right, this.top + 4, 0.0D).texture(1.0D, 1.0D).color(0, 0, 0, 0).next();
@@ -203,10 +203,10 @@ public abstract class DynamicEntryListWidget<E extends DynamicEntryListWidget.En
         renderScrollBar(tessellator, buffer, maxScroll, scrollbarPosition, int_4);
         
         this.renderDecorations(mouseX, mouseY);
-        GlStateManager.enableTexture();
-        GlStateManager.shadeModel(7424);
-        GlStateManager.enableAlphaTest();
-        GlStateManager.disableBlend();
+        RenderHelper.enableTexture();
+        RenderHelper.shadeModel(7424);
+        RenderHelper.enableAlphaTest();
+        RenderHelper.disableBlend();
     }
     
     protected void renderScrollBar(Tessellator tessellator, BufferBuilder buffer, int maxScroll, int scrollbarPositionMinX, int scrollbarPositionMaxX) {
@@ -386,23 +386,23 @@ public abstract class DynamicEntryListWidget<E extends DynamicEntryListWidget.En
             if (this.visible && this.isSelected(renderIndex)) {
                 itemMinX = this.left + this.width / 2 - itemWidth / 2;
                 itemMaxX = itemMinX + itemWidth;
-                GlStateManager.disableTexture();
+                RenderHelper.disableTexture();
                 float float_2 = this.isFocused() ? 1.0F : 0.5F;
-                GlStateManager.color4f(float_2, float_2, float_2, 1.0F);
+                RenderHelper.color4f(float_2, float_2, float_2, 1.0F);
                 buffer.begin(7, VertexFormats.POSITION);
                 buffer.vertex((double) itemMinX, (double) (itemY + itemHeight + 2), 0.0D).next();
                 buffer.vertex((double) itemMaxX, (double) (itemY + itemHeight + 2), 0.0D).next();
                 buffer.vertex((double) itemMaxX, (double) (itemY - 2), 0.0D).next();
                 buffer.vertex((double) itemMinX, (double) (itemY - 2), 0.0D).next();
                 tessellator.draw();
-                GlStateManager.color4f(0.0F, 0.0F, 0.0F, 1.0F);
+                RenderHelper.color4f(0.0F, 0.0F, 0.0F, 1.0F);
                 buffer.begin(7, VertexFormats.POSITION);
                 buffer.vertex((double) (itemMinX + 1), (double) (itemY + itemHeight + 1), 0.0D).next();
                 buffer.vertex((double) (itemMaxX - 1), (double) (itemY + itemHeight + 1), 0.0D).next();
                 buffer.vertex((double) (itemMaxX - 1), (double) (itemY - 1), 0.0D).next();
                 buffer.vertex((double) (itemMinX + 1), (double) (itemY - 1), 0.0D).next();
                 tessellator.draw();
-                GlStateManager.enableTexture();
+                RenderHelper.enableTexture();
             }
             
             int y = this.getRowTop(renderIndex);
@@ -432,7 +432,7 @@ public abstract class DynamicEntryListWidget<E extends DynamicEntryListWidget.En
         Tessellator tessellator_1 = Tessellator.getInstance();
         BufferBuilder bufferBuilder_1 = tessellator_1.getBufferBuilder();
         this.client.getTextureManager().bindTexture(backgroundLocation);
-        GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+        RenderHelper.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         float float_1 = 32.0F;
         bufferBuilder_1.begin(7, VertexFormats.POSITION_UV_COLOR);
         bufferBuilder_1.vertex((double) this.left, (double) int_2, 0.0D).texture(0.0D, (double) ((float) int_2 / 32.0F)).color(64, 64, 64, int_4).next();

+ 124 - 0
src/main/java/me/shedaniel/math/compat/RenderHelper.java

@@ -0,0 +1,124 @@
+/*
+ * Roughly Enough Items by Danielshe.
+ * Licensed under the MIT License.
+ */
+
+package me.shedaniel.math.compat;
+
+public class RenderHelper {
+    
+    static RenderSystem instance;
+    
+    static {
+        boolean is1_15 = false;
+        try {
+            Class.forName("com.mojang.blaze3d.systems.RenderSystem");
+            is1_15 = true;
+        } catch (ClassNotFoundException ignored) {
+        }
+        try {
+            if (is1_15)
+                instance = (RenderSystem) Class.forName("me.shedaniel.math.compat.RenderSystem1_15").newInstance();
+            else instance = (RenderSystem) Class.forName("me.shedaniel.math.compat.RenderSystem1_14").newInstance();
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.exit(0);
+        }
+    }
+    
+    public static void color4f(float float_1, float float_2, float float_3, float float_4) {
+        instance.color4f(float_1, float_2, float_3, float_4);
+    }
+    
+    public static void enableBlend() {
+        instance.enableBlend();
+    }
+    
+    public static void disableTexture() {
+        instance.disableTexture();
+    }
+    
+    public static void enableTexture() {
+        instance.enableTexture();
+    }
+    
+    public static void enableColorLogicOp() {
+        instance.enableColorLogicOp();
+    }
+    
+    public static void disableColorLogicOp() {
+        instance.disableColorLogicOp();
+    }
+    
+    public static void disableRescaleNormal() {
+        instance.disableRescaleNormal();
+    }
+    
+    public static void logicOp(int int_1) {
+        instance.logicOp(int_1);
+    }
+    
+    public static void pushMatrix() {
+        instance.pushMatrix();
+    }
+    
+    public static void disableFog() {
+        instance.disableFog();
+    }
+    
+    public static void popMatrix() {
+        instance.popMatrix();
+    }
+    
+    public static void disableLighting() {
+        instance.disableLighting();
+    }
+    
+    public static void enableLighting() {
+        instance.enableLighting();
+    }
+    
+    public static void enableRescaleNormal() {
+        instance.enableRescaleNormal();
+    }
+    
+    public static void disableDepthTest() {
+        instance.disableDepthTest();
+    }
+    
+    public static void enableDepthTest() {
+        instance.enableDepthTest();
+    }
+    
+    public static void disableAlphaTest() {
+        instance.disableAlphaTest();
+    }
+    
+    public static void enableAlphaTest() {
+        instance.enableAlphaTest();
+    }
+    
+    public static void disableBlend() {
+        instance.disableBlend();
+    }
+    
+    public static void shadeModel(int i) {
+        instance.shadeModel(i);
+    }
+    
+    public static void colorMask(boolean boolean_1, boolean boolean_2, boolean boolean_3, boolean boolean_4) {
+        instance.colorMask(boolean_1, boolean_2, boolean_3, boolean_4);
+    }
+    
+    public static void translatef(float float_1, float float_2, float float_3) {
+        instance.translatef(float_1, float_2, float_3);
+    }
+    
+    public static void blendFuncSeparate(int int_1, int int_2, int int_3, int int_4) {
+        instance.blendFuncSeparate(int_1, int_2, int_3, int_4);
+    }
+    
+    public static void blendFunc(int int_1, int int_2) {
+        instance.blendFunc(int_1, int_2);
+    }
+}

+ 57 - 0
src/main/java/me/shedaniel/math/compat/RenderSystem.java

@@ -0,0 +1,57 @@
+/*
+ * Roughly Enough Items by Danielshe.
+ * Licensed under the MIT License.
+ */
+
+package me.shedaniel.math.compat;
+
+public interface RenderSystem {
+    
+    void color4f(float float_1, float float_2, float float_3, float float_4);
+    
+    void enableBlend();
+    
+    void disableTexture();
+    
+    void enableTexture();
+    
+    void enableColorLogicOp();
+    
+    void disableColorLogicOp();
+    
+    void disableRescaleNormal();
+    
+    void logicOp(int int_1);
+    
+    void pushMatrix();
+    
+    void disableFog();
+    
+    void popMatrix();
+    
+    void disableLighting();
+    
+    void enableLighting();
+    
+    void enableRescaleNormal();
+    
+    void disableDepthTest();
+    
+    void enableDepthTest();
+    
+    void disableAlphaTest();
+    
+    void enableAlphaTest();
+    
+    void disableBlend();
+    
+    void shadeModel(int i);
+    
+    void colorMask(boolean boolean_1, boolean boolean_2, boolean boolean_3, boolean boolean_4);
+    
+    void translatef(float float_1, float float_2, float float_3);
+    
+    void blendFuncSeparate(int int_1, int int_2, int int_3, int int_4);
+    
+    void blendFunc(int int_1, int int_2);
+}

+ 236 - 0
src/main/java/me/shedaniel/math/compat/RenderSystem1_14.java

@@ -0,0 +1,236 @@
+/*
+ * Roughly Enough Items by Danielshe.
+ * Licensed under the MIT License.
+ */
+
+package me.shedaniel.math.compat;
+
+public class RenderSystem1_14 implements RenderSystem {
+    
+    public Class<?> glStateManagerClass;
+    
+    public RenderSystem1_14() {
+        try {
+            this.glStateManagerClass = Class.forName("com.mojang.blaze3d.platform.GlStateManager");
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+            System.exit(0);
+        }
+    }
+    
+    @Override
+    public void color4f(float float_1, float float_2, float float_3, float float_4) {
+        try {
+            glStateManagerClass.getDeclaredMethod("color4f", float.class, float.class, float.class, float.class).invoke(null, float_1, float_2, float_3, float_4);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableBlend() {
+        try {
+            glStateManagerClass.getDeclaredMethod("enableBlend").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableTexture() {
+        try {
+            glStateManagerClass.getDeclaredMethod("disableTexture").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableTexture() {
+        try {
+            glStateManagerClass.getDeclaredMethod("enableTexture").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableColorLogicOp() {
+        try {
+            glStateManagerClass.getDeclaredMethod("enableColorLogicOp").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableColorLogicOp() {
+        try {
+            glStateManagerClass.getDeclaredMethod("disableColorLogicOp").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableRescaleNormal() {
+        try {
+            glStateManagerClass.getDeclaredMethod("disableRescaleNormal").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableFog() {
+        try {
+            glStateManagerClass.getDeclaredMethod("disableFog").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void logicOp(int int_1) {
+        try {
+            glStateManagerClass.getDeclaredMethod("logicOp", int.class).invoke(null, int_1);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void pushMatrix() {
+        try {
+            glStateManagerClass.getDeclaredMethod("pushMatrix").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void popMatrix() {
+        try {
+            glStateManagerClass.getDeclaredMethod("popMatrix").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableLighting() {
+        try {
+            glStateManagerClass.getDeclaredMethod("disableLighting").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableLighting() {
+        try {
+            glStateManagerClass.getDeclaredMethod("enableLighting").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableRescaleNormal() {
+        try {
+            glStateManagerClass.getDeclaredMethod("enableRescaleNormal").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableDepthTest() {
+        try {
+            glStateManagerClass.getDeclaredMethod("disableDepthTest").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableDepthTest() {
+        try {
+            glStateManagerClass.getDeclaredMethod("enableDepthTest").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableAlphaTest() {
+        try {
+            glStateManagerClass.getDeclaredMethod("disableAlphaTest").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableAlphaTest() {
+        try {
+            glStateManagerClass.getDeclaredMethod("enableAlphaTest").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableBlend() {
+        try {
+            glStateManagerClass.getDeclaredMethod("disableBlend").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void shadeModel(int i) {
+        try {
+            glStateManagerClass.getDeclaredMethod("shadeModel", int.class).invoke(null, i);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void colorMask(boolean boolean_1, boolean boolean_2, boolean boolean_3, boolean boolean_4) {
+        try {
+            glStateManagerClass.getDeclaredMethod("colorMask", boolean.class, boolean.class, boolean.class, boolean.class).invoke(null, boolean_1, boolean_2, boolean_3, boolean_4);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void translatef(float float_1, float float_2, float float_3) {
+        try {
+            glStateManagerClass.getDeclaredMethod("translatef", float.class, float.class, float.class).invoke(null, float_1, float_2, float_3);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void blendFuncSeparate(int int_1, int int_2, int int_3, int int_4) {
+        try {
+            glStateManagerClass.getDeclaredMethod("blendFuncSeparate", int.class, int.class, int.class, int.class).invoke(null, int_1, int_2, int_3, int_4);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void blendFunc(int int_1, int int_2) {
+        try {
+            glStateManagerClass.getDeclaredMethod("blendFunc", int.class, int.class).invoke(null, int_1, int_2);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 235 - 0
src/main/java/me/shedaniel/math/compat/RenderSystem1_15.java

@@ -0,0 +1,235 @@
+/*
+ * Roughly Enough Items by Danielshe.
+ * Licensed under the MIT License.
+ */
+
+package me.shedaniel.math.compat;
+
+public class RenderSystem1_15 implements RenderSystem {
+    public Class<?> renderSystemClass;
+    
+    public RenderSystem1_15() {
+        try {
+            this.renderSystemClass = Class.forName("com.mojang.blaze3d.systems.RenderSystem");
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+            System.exit(0);
+        }
+    }
+    
+    @Override
+    public void color4f(float float_1, float float_2, float float_3, float float_4) {
+        try {
+            renderSystemClass.getDeclaredMethod("color4f", float.class, float.class, float.class, float.class).invoke(null, float_1, float_2, float_3, float_4);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableFog() {
+        try {
+            renderSystemClass.getDeclaredMethod("disableFog").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableBlend() {
+        try {
+            renderSystemClass.getDeclaredMethod("enableBlend").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableTexture() {
+        try {
+            renderSystemClass.getDeclaredMethod("disableTexture").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableTexture() {
+        try {
+            renderSystemClass.getDeclaredMethod("enableTexture").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableColorLogicOp() {
+        try {
+            renderSystemClass.getDeclaredMethod("enableColorLogicOp").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableColorLogicOp() {
+        try {
+            renderSystemClass.getDeclaredMethod("disableColorLogicOp").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableRescaleNormal() {
+        try {
+            renderSystemClass.getDeclaredMethod("disableRescaleNormal").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void logicOp(int int_1) {
+        try {
+            renderSystemClass.getDeclaredMethod("logicOp", int.class).invoke(null, int_1);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void pushMatrix() {
+        try {
+            renderSystemClass.getDeclaredMethod("pushMatrix").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void popMatrix() {
+        try {
+            renderSystemClass.getDeclaredMethod("popMatrix").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableLighting() {
+        try {
+            renderSystemClass.getDeclaredMethod("disableLighting").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableLighting() {
+        try {
+            renderSystemClass.getDeclaredMethod("enableLighting").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableRescaleNormal() {
+        try {
+            renderSystemClass.getDeclaredMethod("enableRescaleNormal").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableDepthTest() {
+        try {
+            renderSystemClass.getDeclaredMethod("disableDepthTest").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableDepthTest() {
+        try {
+            renderSystemClass.getDeclaredMethod("enableDepthTest").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableAlphaTest() {
+        try {
+            renderSystemClass.getDeclaredMethod("disableAlphaTest").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void enableAlphaTest() {
+        try {
+            renderSystemClass.getDeclaredMethod("enableAlphaTest").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void disableBlend() {
+        try {
+            renderSystemClass.getDeclaredMethod("disableBlend").invoke(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void shadeModel(int i) {
+        try {
+            renderSystemClass.getDeclaredMethod("shadeModel", int.class).invoke(null, i);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void colorMask(boolean boolean_1, boolean boolean_2, boolean boolean_3, boolean boolean_4) {
+        try {
+            renderSystemClass.getDeclaredMethod("colorMask", boolean.class, boolean.class, boolean.class, boolean.class).invoke(null, boolean_1, boolean_2, boolean_3, boolean_4);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void translatef(float float_1, float float_2, float float_3) {
+        try {
+            renderSystemClass.getDeclaredMethod("translatef", float.class, float.class, float.class).invoke(null, float_1, float_2, float_3);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void blendFuncSeparate(int int_1, int int_2, int int_3, int int_4) {
+        try {
+            renderSystemClass.getDeclaredMethod("blendFuncSeparate", int.class, int.class, int.class, int.class).invoke(null, int_1, int_2, int_3, int_4);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    @Override
+    public void blendFunc(int int_1, int int_2) {
+        try {
+            renderSystemClass.getDeclaredMethod("blendFunc", int.class, int.class).invoke(null, int_1, int_2);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}