ScissorsHandlerImpl.java 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package me.shedaniel.clothconfig2.impl;
  2. import com.google.common.collect.Lists;
  3. import me.shedaniel.clothconfig2.ClothConfigInitializer;
  4. import me.shedaniel.clothconfig2.api.ScissorsHandler;
  5. import me.shedaniel.math.Rectangle;
  6. import me.shedaniel.math.api.Executor;
  7. import net.fabricmc.api.EnvType;
  8. import net.fabricmc.api.Environment;
  9. import net.fabricmc.loader.api.FabricLoader;
  10. import net.minecraft.client.MinecraftClient;
  11. import net.minecraft.client.util.Window;
  12. import org.lwjgl.opengl.GL11;
  13. import java.util.Collections;
  14. import java.util.List;
  15. @Environment(EnvType.CLIENT)
  16. public final class ScissorsHandlerImpl implements ScissorsHandler {
  17. @Deprecated public static final ScissorsHandler INSTANCE = new ScissorsHandlerImpl();
  18. static {
  19. Executor.runIf(() -> FabricLoader.getInstance().isModLoaded("notenoughcrashes"), () -> () -> {
  20. try {
  21. Class.forName("fudge.notenoughcrashes.api.NotEnoughCrashesApi").getDeclaredMethod("onEveryCrash", Runnable.class).invoke(null, (Runnable) () -> {
  22. try {
  23. ScissorsHandler.INSTANCE.clearScissors();
  24. } catch (Throwable t) {
  25. ClothConfigInitializer.LOGGER.error("[ClothConfig] Failed clear scissors on game crash!", t);
  26. }
  27. });
  28. } catch (Throwable throwable) {
  29. throwable.printStackTrace();
  30. }
  31. });
  32. }
  33. private final List<Rectangle> scissorsAreas;
  34. public ScissorsHandlerImpl() {
  35. this.scissorsAreas = Lists.newArrayList();
  36. }
  37. @Override
  38. public void clearScissors() {
  39. scissorsAreas.clear();
  40. applyScissors();
  41. }
  42. @Override
  43. public List<Rectangle> getScissorsAreas() {
  44. return Collections.unmodifiableList(scissorsAreas);
  45. }
  46. @Override
  47. public void scissor(Rectangle rectangle) {
  48. scissorsAreas.add(rectangle);
  49. applyScissors();
  50. }
  51. @Override
  52. public void removeLastScissor() {
  53. if (!scissorsAreas.isEmpty())
  54. scissorsAreas.remove(scissorsAreas.size() - 1);
  55. applyScissors();
  56. }
  57. @Override
  58. public void applyScissors() {
  59. if (!scissorsAreas.isEmpty()) {
  60. Rectangle r = scissorsAreas.get(0).clone();
  61. for (int i = 1; i < scissorsAreas.size(); i++) {
  62. r.setBounds(r.intersection(scissorsAreas.get(i)));
  63. }
  64. Window window = MinecraftClient.getInstance().getWindow();
  65. double scaleFactor = window.getScaleFactor();
  66. GL11.glEnable(GL11.GL_SCISSOR_TEST);
  67. GL11.glScissor((int) (r.x * scaleFactor), (int) ((window.getScaledHeight() - r.height - r.y) * scaleFactor), (int) (r.width * scaleFactor), (int) (r.height * scaleFactor));
  68. } else
  69. GL11.glDisable(GL11.GL_SCISSOR_TEST);
  70. }
  71. }