aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPanelScaledGUI.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPanelScaledGUI.java')
-rw-r--r--src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPanelScaledGUI.java199
1 files changed, 199 insertions, 0 deletions
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPanelScaledGUI.java b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPanelScaledGUI.java
new file mode 100644
index 00000000..64599058
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPanelScaledGUI.java
@@ -0,0 +1,199 @@
+/*
+ * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod
+ * Copyright (C) 2021 cyoung06
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package kr.syeyoung.dungeonsguide.gui.elements;
+
+import kr.syeyoung.dungeonsguide.gui.MPanel;
+import lombok.Getter;
+import lombok.Setter;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.renderer.GlStateManager;
+import org.lwjgl.opengl.GL11;
+
+import java.awt.*;
+
+public class MPanelScaledGUI extends MPanel {
+ @Getter
+ private double scale = 1.0;
+
+ private double relativeScale;
+
+ public void setScale(double scale) {
+ this.scale = scale;
+ for (MPanel childComponent : childComponents) {
+ childComponent.resize0((int) (getBounds().width/scale), (int) (getBounds().height/scale));
+ }
+ }
+
+ @Override
+ public void setBounds(Rectangle bounds) {
+ if (bounds == null) return;
+ this.bounds.x = bounds.x;
+ this.bounds.y = bounds.y;
+ this.bounds.width = bounds.width;
+ this.bounds.height = bounds.height;
+
+ for (MPanel childComponent : childComponents) {
+ childComponent.resize0((int) (getBounds().width/scale), (int) (getBounds().height/scale));
+ }
+ onBoundsUpdate();
+ }
+
+ public Dimension getEffectiveDimension() {
+ return new Dimension((int)(getBounds().width / scale), (int)(getBounds().height / scale));
+ }
+
+ @Override
+ public void render0(double parentScale, Point parentPoint, Rectangle parentClip, int absMousex0, int absMousey0, int relMousex0, int relMousey0, float partialTicks) {
+ lastParentPoint = parentPoint;
+
+ GlStateManager.translate(getBounds().x, getBounds().y, 5);
+ GlStateManager.color(1,1,1,0);
+
+ Rectangle absBound = getBounds().getBounds();
+ absBound.setLocation(absBound.x + parentPoint.x, absBound.y + parentPoint.y);
+
+ Rectangle clip;
+ if (isIgnoreBoundOnClip()) clip = parentClip;
+ else clip = determineClip(parentClip, absBound);
+ lastAbsClip = clip;
+
+ if (clip.getSize().height * clip.getSize().width == 0) return;
+
+ int absMousex = (int) (absMousex0 / scale), absMousey = (int) (absMousey0 / scale);
+ int relMousex = (int) ((relMousex0 - getBounds().x) / scale);
+ int relMousey = (int) ((relMousey0 - getBounds().y) /scale);
+
+ // FROM HERE, IT IS SCALED
+
+ GlStateManager.scale(this.scale, this.scale, 1);
+ clip = new Rectangle((int) (clip.x / scale), (int) (clip.y / scale), (int) (clip.width / scale), (int) (clip.height / scale));
+
+
+ this.relativeScale = parentScale * this.scale;
+ clip(clip.x, clip.y, clip.width, clip.height);
+
+
+ GlStateManager.pushAttrib();
+ GL11.glEnable(GL11.GL_SCISSOR_TEST);
+
+ GlStateManager.pushAttrib();
+ GuiScreen.drawRect(0,0, (int) (getBounds().width / scale), (int) (getBounds().height / scale), backgroundColor.getRGB());
+ GlStateManager.enableBlend();
+ GlStateManager.popAttrib();
+
+ GlStateManager.pushMatrix();
+ GlStateManager.pushAttrib();
+
+ GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
+ GlStateManager.enableBlend();
+ GlStateManager.enableAlpha();
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0);
+
+ render(absMousex, absMousey, relMousex, relMousey, partialTicks, clip);
+ GlStateManager.popAttrib();
+ GlStateManager.popMatrix();
+
+ GL11.glDisable(GL11.GL_SCISSOR_TEST);
+ GlStateManager.popAttrib();
+
+
+ Point newPt = new Point((int) ((parentPoint.x + getBounds().x) / scale), (int) ((parentPoint.y + getBounds().y) / scale));
+
+ for (MPanel mPanel : getChildComponents()){
+ GlStateManager.pushMatrix();
+ GlStateManager.pushAttrib();
+ mPanel.render0(scale, newPt,clip,absMousex, absMousey, relMousex, relMousey, partialTicks);
+ GlStateManager.popAttrib();
+ GlStateManager.popMatrix();
+ }
+ }
+
+ @Override
+ public void clip(int x, int y, int width, int height) {
+ if (width < 0 || height < 0) return;
+
+ GL11.glScissor((int) (x * relativeScale), Minecraft.getMinecraft().displayHeight - (int) ((y + height) * relativeScale), (int)(width* relativeScale), (int) (height * relativeScale));
+ }
+
+ @Override
+ public void resize0(int parentWidth, int parentHeight) {
+ super.resize0(parentWidth, parentHeight);
+ }
+
+
+ public boolean mouseClicked0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int mouseButton) {
+ int relMousex = (int) ((relMouseX0 - getBounds().x) / scale);
+ int relMousey = (int) ((relMouseY0 - getBounds().y) / scale);
+ absMouseX = (int) (absMouseX / scale);
+ absMouseY = (int) (absMouseY / scale);
+
+ boolean noClip = true;
+ boolean focusedOverall = false;
+ for (MPanel childComponent : getChildComponents()) {
+ if (childComponent.mouseClicked0(absMouseX, absMouseY,relMousex, relMousey, mouseButton)) {
+ noClip = false;
+ focusedOverall = true;
+ }
+ }
+
+ if (getBounds().contains(relMouseX0, relMouseY0) && noClip) {
+ isFocused = true;
+ focusedOverall = true;
+ } else {
+ isFocused = false;
+ }
+ mouseClicked(absMouseX, absMouseY, relMousex, relMousey, mouseButton);
+
+ return focusedOverall;
+ }
+ public void mouseReleased0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int state) {
+ int relMousex = (int) ((relMouseX0 - getBounds().x) / scale);
+ int relMousey = (int) ((relMouseY0 - getBounds().y) / scale);
+ absMouseX = (int) (absMouseX / scale);
+ absMouseY = (int) (absMouseY / scale);
+
+ for (MPanel childComponent : getChildComponents()) {
+ childComponent.mouseReleased0(absMouseX, absMouseY, relMousex, relMousey, state);
+ }
+ mouseReleased(absMouseX, absMouseY, relMousex, relMousey, state);
+ }
+ public void mouseClickMove0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int clickedMouseButton, long timeSinceLastClick) {
+ int relMousex = (int) ((relMouseX0 - getBounds().x) / scale);
+ int relMousey = (int) ((relMouseY0 - getBounds().y) / scale);
+ absMouseX = (int) (absMouseX / scale);
+ absMouseY = (int) (absMouseY / scale);
+
+ for (MPanel childComponent : getChildComponents()) {
+ childComponent.mouseClickMove0(absMouseX, absMouseY, relMousex, relMousey, clickedMouseButton, timeSinceLastClick);
+ }
+ mouseClickMove(absMouseX, absMouseY, relMousex, relMousey, clickedMouseButton, timeSinceLastClick);
+ }
+ public void mouseScrolled0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int scrollAmount) {
+ int relMousex = (int) ((relMouseX0 - getBounds().x) / scale);
+ int relMousey = (int) ((relMouseY0 - getBounds().y) / scale);
+ absMouseX = (int) (absMouseX / scale);
+ absMouseY = (int) (absMouseY / scale);
+
+ for (MPanel childComponent : getChildComponents()) {
+ childComponent.mouseScrolled0(absMouseX, absMouseY, relMousex, relMousey, scrollAmount);
+ }
+ mouseScrolled(absMouseX, absMouseY, relMousex, relMousey, scrollAmount);
+ }
+}