aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/polyfrost
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io/polyfrost')
-rw-r--r--src/main/java/io/polyfrost/oneconfig/gui/HudGui.java204
-rw-r--r--src/main/java/io/polyfrost/oneconfig/hud/interfaces/BasicHud.java10
-rw-r--r--src/main/java/io/polyfrost/oneconfig/lwjgl/RenderManager.java2
3 files changed, 150 insertions, 66 deletions
diff --git a/src/main/java/io/polyfrost/oneconfig/gui/HudGui.java b/src/main/java/io/polyfrost/oneconfig/gui/HudGui.java
index 83b5ac3..921c9b5 100644
--- a/src/main/java/io/polyfrost/oneconfig/gui/HudGui.java
+++ b/src/main/java/io/polyfrost/oneconfig/gui/HudGui.java
@@ -4,7 +4,6 @@ import io.polyfrost.oneconfig.hud.HudCore;
import io.polyfrost.oneconfig.hud.interfaces.BasicHud;
import io.polyfrost.oneconfig.lwjgl.RenderManager;
import io.polyfrost.oneconfig.test.TestHud;
-import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiScreen;
import org.lwjgl.input.Keyboard;
@@ -24,12 +23,11 @@ public class HudGui extends GuiScreen {
public void initGui() {
HudCore.editing = true;
Keyboard.enableRepeatEvents(true);
- for (BasicHud hud : HudCore.huds) {
- hud.childBottom = new TestHud();
- hud.childBottom.parent = hud;
- hud.childRight = new TestHud();
- hud.childRight.parent = hud;
- }
+ HudCore.huds.add(new TestHud());
+ HudCore.huds.add(new TestHud());
+ HudCore.huds.add(new TestHud());
+ HudCore.huds.add(new TestHud());
+ HudCore.huds.add(new TestHud());
}
@Override
@@ -41,56 +39,87 @@ public class HudGui extends GuiScreen {
}
for (BasicHud hud : HudCore.huds) {
- if (hud == editingHud && isScaling) {
- float xFloat = hud.getXScaled(this.width);
- float yFloat = hud.getYScaled(this.height);
- float pos = getXSnapping(mouseX, true);
- float newWidth = pos - xFloat;
- float newScale = newWidth / ((hud.getWidth(hud.scale) + hud.paddingX * hud.scale) / hud.scale);
- if (newScale > 20)
- newScale = 20;
- else if (newScale < 0.3)
- newScale = 0.3f;
- hud.scale = newScale;
-
- if (xFloat / this.width > 0.5)
- editingHud.xUnscaled = (xFloat + (hud.getWidth(hud.scale) + hud.paddingX * hud.scale)) / (double) this.width;
- if (yFloat / this.height > 0.5)
- editingHud.yUnscaled = (yFloat + (hud.getHeight(hud.scale) + hud.paddingY * hud.scale)) / (double) this.height;
- }
+ processHud(hud, mouseX);
+ }
+ }
+
+ private void processHud(BasicHud hud, int mouseX) {
+ if (hud == editingHud && isScaling) {
+ float xFloat = hud.getXScaled(this.width);
+ float yFloat = hud.getYScaled(this.height);
+ float pos = getXSnapping(mouseX, true);
+ float newWidth = pos - xFloat;
+ float newScale = newWidth / ((hud.getWidth(hud.scale) + hud.paddingX * hud.scale) / hud.scale);
+ if (newScale > 20)
+ newScale = 20;
+ else if (newScale < 0.3)
+ newScale = 0.3f;
+ hud.scale = newScale;
+
+ if (xFloat / this.width > 0.5)
+ editingHud.xUnscaled = (xFloat + (hud.getWidth(hud.scale) + hud.paddingX * hud.scale)) / (double) this.width;
+ if (yFloat / this.height > 0.5)
+ editingHud.yUnscaled = (yFloat + (hud.getHeight(hud.scale) + hud.paddingY * hud.scale)) / (double) this.height;
+ }
int width = (int) (hud.getWidth(hud.scale) + hud.paddingX * hud.scale);
int height = (int) (hud.getHeight(hud.scale) + hud.paddingY * hud.scale);
int x = (int) hud.getXScaled(this.width);
int y = (int) hud.getYScaled(this.height);
+ if (hud.parent == null)
hud.drawExampleAll(x, y, hud.scale, true);
- int color = new Color(215, 224, 235).getRGB();
- if (editingHud == hud) {
- color = new Color(43, 159, 235).getRGB();
- if (isDragging)
- Gui.drawRect(x, y, x + width, y + height, new Color(108, 176, 255, 60).getRGB());
- }
- int finalColor = color;
+ int color = new Color(215, 224, 235).getRGB();
+ if (editingHud == hud) {
+ color = new Color(43, 159, 235).getRGB();
+ if (isDragging)
+ Gui.drawRect(x, y, x + width, y + height, new Color(108, 176, 255, 60).getRGB());
+ }
+ int finalColor = color;
+ int boxX = x + (int) (hud.paddingX * hud.scale / 2f);
+ int boxY = y + (int) (hud.paddingY * hud.scale / 2f);
+ int boxWidth = width - (int) (hud.paddingX * hud.scale);
+ int boxHeight = height - (int) (hud.paddingY * hud.scale);
+ RenderManager.setupAndDraw(true, (vg) -> {
+ RenderManager.drawLine(vg, boxX - 2 / 4f, boxY, boxX + boxWidth + 2 / 4f, boxY, 1, finalColor);
+ RenderManager.drawLine(vg, boxX, boxY, boxX, boxY + boxHeight, 1, finalColor);
+ RenderManager.drawLine(vg, boxX + boxWidth, boxY, boxX + boxWidth, boxY + boxHeight, 1, finalColor);
+ RenderManager.drawLine(vg, boxX - 2 / 4f, boxY + boxHeight, boxX + boxWidth + 2 / 4f, boxY + boxHeight, 1, finalColor);
+ });
+
+ if (hud == editingHud && !isDragging) {
RenderManager.setupAndDraw(true, (vg) -> {
- RenderManager.drawLine(vg, x - 2 / 4f, y, x + width + 2 / 4f, y, 1, finalColor);
- RenderManager.drawLine(vg, x, y, x, y + height, 1, finalColor);
- RenderManager.drawLine(vg, x + width, y, x + width, y + height, 1, finalColor);
- RenderManager.drawLine(vg, x - 2 / 4f, y + height, x + width + 2 / 4f, y + height, 1, finalColor);
+ RenderManager.drawCircle(vg, boxX + boxWidth, boxY + boxHeight, 3, new Color(43, 159, 235).getRGB());
});
-
- if (hud == editingHud && !isDragging) {
- RenderManager.setupAndDraw(true, (vg) -> {
- RenderManager.drawCircle(vg, x + width, y + height, 3, new Color(43, 159, 235).getRGB());
- });
- }
}
+
+ if (hud.childBottom != null) processHud(hud.childBottom, mouseX);
+ if (hud.childRight != null) processHud(hud.childRight, mouseX);
}
private void setPosition(float newX, float newY, boolean snap) {
float width = editingHud.getWidth(editingHud.scale) + editingHud.paddingX * editingHud.scale;
float height = editingHud.getHeight(editingHud.scale) + editingHud.paddingY * editingHud.scale;
+ if (editingHud.childRight != null) {
+ HudCore.huds.add(editingHud.childRight);
+ editingHud.childRight.parent = null;
+ editingHud.childRight = null;
+ }
+ if (editingHud.childBottom != null) {
+ HudCore.huds.add(editingHud.childBottom);
+ editingHud.childBottom.parent = null;
+ editingHud.childBottom = null;
+ }
+ if (editingHud.parent != null) {
+ HudCore.huds.add(editingHud);
+ if (editingHud.parent.childBottom == editingHud)
+ editingHud.parent.childBottom = null;
+ else if (editingHud.parent.childRight == editingHud)
+ editingHud.parent.childRight = null;
+ editingHud.parent = null;
+ }
+
if (newX < 0)
newX = 0;
else if (newX + width > this.width)
@@ -101,8 +130,16 @@ public class HudGui extends GuiScreen {
newY = this.height - height;
if (snap) {
- newX = getXSnapping(newX, false);
- newY = getYSnapping(newY);
+ float snapX = getXSnapping(newX, false);
+ float snapY = getYSnapping(newY);
+ if (snapX != newX || snapY != newY) {
+ newX = snapX;
+ newY = snapY;
+ for (BasicHud hud : HudCore.huds) {
+ if (findParent(hud, snapX, snapY))
+ break;
+ }
+ }
}
if (newX / this.width <= 0.5)
@@ -115,17 +152,31 @@ public class HudGui extends GuiScreen {
editingHud.yUnscaled = (newY + height) / (double) this.height;
}
+ private boolean findParent(BasicHud hud, float snapX, float snapY) {
+ int hudWidth = (int) (hud.getWidth(hud.scale) + hud.paddingX * hud.scale);
+ int hudX = (int) hud.getXScaled(this.width);
+ int hudHeight = (int) (hud.getHeight(hud.scale) + hud.paddingY * hud.scale);
+ int hudY = (int) hud.getYScaled(this.height);
+ if (hudX + hudWidth == snapX && hudY == snapY && hud.childRight == null) {
+ editingHud.parent = hud;
+ hud.childRight = editingHud;
+ HudCore.huds.remove(editingHud);
+ return true;
+ } else if (hudX == snapX && hudY + hudHeight == snapY && hud.childBottom == null) {
+ editingHud.parent = hud;
+ hud.childBottom = editingHud;
+ HudCore.huds.remove(editingHud);
+ return true;
+ }
+ return hud.childRight != null && findParent(hud.childRight, snapX, snapY) || hud.childBottom != null && findParent(hud.childBottom, snapX, snapY);
+ }
+
private float getXSnapping(float pos, boolean rightOnly) {
float width = editingHud.getWidth(editingHud.scale) + editingHud.paddingX * editingHud.scale;
ArrayList<Float> verticalLines = new ArrayList<>();
verticalLines.add(this.width / 2f);
for (BasicHud hud : HudCore.huds) {
- if (hud == editingHud) continue;
- int hudWidth = (int) (hud.getWidth(hud.scale) + hud.paddingX * hud.scale);
- int hudX = (int) hud.getXScaled(this.width);
- verticalLines.add((float) hudX);
- verticalLines.add((float) (hudX + hudWidth));
- verticalLines.add(hudX + hudWidth / 2f);
+ verticalLines.addAll(getXSnappingHud(hud));
}
float smallestDiff = -1;
float smallestLine = 0;
@@ -146,17 +197,23 @@ public class HudGui extends GuiScreen {
return pos;
}
+ private ArrayList<Float> getXSnappingHud(BasicHud hud) {
+ ArrayList<Float> verticalLines = new ArrayList<>();
+ if (hud == editingHud) return verticalLines;
+ if (hud.childRight != null) verticalLines.addAll(getXSnappingHud(hud.childRight));
+ int hudWidth = (int) (hud.getWidth(hud.scale) + hud.paddingX * hud.scale);
+ int hudX = (int) hud.getXScaled(this.width);
+ verticalLines.add((float) hudX);
+ verticalLines.add((float) (hudX + hudWidth));
+ return verticalLines;
+ }
+
private float getYSnapping(float pos) {
float height = editingHud.getHeight(editingHud.scale) + editingHud.paddingY * editingHud.scale;
ArrayList<Float> horizontalLines = new ArrayList<>();
horizontalLines.add(this.height / 2f);
for (BasicHud hud : HudCore.huds) {
- if (hud == editingHud) continue;
- int hudHeight = (int) (hud.getHeight(hud.scale) + hud.paddingY * hud.scale);
- int hudY = (int) hud.getYScaled(this.height);
- horizontalLines.add((float) hudY);
- horizontalLines.add((float) (hudY + hudHeight));
- horizontalLines.add(hudY + hudHeight / 2f);
+ horizontalLines.addAll(getYSnappingHud(hud));
}
float smallestDiff = -1;
float smallestLine = 0;
@@ -177,6 +234,17 @@ public class HudGui extends GuiScreen {
return pos;
}
+ private ArrayList<Float> getYSnappingHud(BasicHud hud) {
+ ArrayList<Float> horizontalLines = new ArrayList<>();
+ if (hud == editingHud) return horizontalLines;
+ if (hud.childBottom != null) horizontalLines.addAll(getYSnappingHud(hud.childBottom));
+ int hudHeight = (int) (hud.getHeight(hud.scale) + hud.paddingY * hud.scale);
+ int hudY = (int) hud.getYScaled(this.height);
+ horizontalLines.add((float) hudY);
+ horizontalLines.add((float) (hudY + hudHeight));
+ return horizontalLines;
+ }
+
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) {
if (mouseButton == 0) {
@@ -192,21 +260,27 @@ public class HudGui extends GuiScreen {
}
editingHud = null;
for (BasicHud hud : HudCore.huds) {
- int width = (int) (hud.getWidth(hud.scale) + hud.paddingX * hud.scale);
- int height = (int) (hud.getHeight(hud.scale) + hud.paddingY * hud.scale);
- float x = hud.getXScaled(this.width);
- float y = hud.getYScaled(this.height);
- if (mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height) {
- editingHud = hud;
- xOffset = (int) (mouseX - x);
- yOffset = (int) (mouseY - y);
- isDragging = true;
+ if (mouseClickedHud(hud, mouseX, mouseY))
break;
- }
}
}
}
+ private boolean mouseClickedHud(BasicHud hud, int mouseX, int mouseY) {
+ int width = (int) (hud.getWidth(hud.scale) + hud.paddingX * hud.scale);
+ int height = (int) (hud.getHeight(hud.scale) + hud.paddingY * hud.scale);
+ float x = hud.getXScaled(this.width);
+ float y = hud.getYScaled(this.height);
+ if (mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height) {
+ editingHud = hud;
+ xOffset = (int) (mouseX - x);
+ yOffset = (int) (mouseY - y);
+ isDragging = true;
+ return true;
+ }
+ return hud.childBottom != null && mouseClickedHud(hud.childBottom, mouseX, mouseY) || hud.childRight != null && mouseClickedHud(hud.childRight, mouseX, mouseY);
+ }
+
@Override
protected void mouseReleased(int mouseX, int mouseY, int state) {
isDragging = false;
diff --git a/src/main/java/io/polyfrost/oneconfig/hud/interfaces/BasicHud.java b/src/main/java/io/polyfrost/oneconfig/hud/interfaces/BasicHud.java
index 5044421..e9e3a59 100644
--- a/src/main/java/io/polyfrost/oneconfig/hud/interfaces/BasicHud.java
+++ b/src/main/java/io/polyfrost/oneconfig/hud/interfaces/BasicHud.java
@@ -58,6 +58,11 @@ public abstract class BasicHud {
}
public float getXScaled(int screenWidth) {
+ if (parent != null && parent.childRight == this) {
+ return parent.getXScaled(screenWidth) + parent.getWidth(parent.scale) + parent.paddingX * parent.scale / 2f;
+ } else if (parent != null) {
+ return parent.getXScaled(screenWidth);
+ }
if (xUnscaled <= 0.5) {
return (int) (screenWidth * xUnscaled);
}
@@ -65,6 +70,11 @@ public abstract class BasicHud {
}
public float getYScaled(int screenHeight) {
+ if (parent != null && parent.childBottom == this) {
+ return parent.getYScaled(screenHeight) + parent.getHeight(parent.scale) + parent.paddingY * parent.scale / 2f;
+ } else if (parent != null) {
+ return parent.getYScaled(screenHeight);
+ }
if (yUnscaled <= 0.5) {
return (int) (screenHeight * yUnscaled);
}
diff --git a/src/main/java/io/polyfrost/oneconfig/lwjgl/RenderManager.java b/src/main/java/io/polyfrost/oneconfig/lwjgl/RenderManager.java
index 4406836..066218a 100644
--- a/src/main/java/io/polyfrost/oneconfig/lwjgl/RenderManager.java
+++ b/src/main/java/io/polyfrost/oneconfig/lwjgl/RenderManager.java
@@ -18,7 +18,6 @@ import java.awt.*;
import java.nio.FloatBuffer;
import java.util.function.LongConsumer;
-import static org.lwjgl.nanovg.NanoSVG.NSVG_FLAGS_VISIBLE;
import static org.lwjgl.nanovg.NanoVG.*;
import static org.lwjgl.nanovg.NanoVGGL2.NVG_ANTIALIAS;
import static org.lwjgl.nanovg.NanoVGGL2.nvgCreate;
@@ -55,6 +54,7 @@ public final class RenderManager {
ScaledResolution resolution = new ScaledResolution(Minecraft.getMinecraft());
nvgBeginFrame(vg, (float) resolution.getScaledWidth_double(), (float) resolution.getScaledHeight_double(), resolution.getScaleFactor());
} else {
+ // If we get blurry problems with high DPI monitors, 1 might need to be replaced with Display.getPixelScaleFactor()
nvgBeginFrame(vg, Display.getWidth(), Display.getHeight(), 1);
}