From bb19f4df7240c37760fc94ab0f25ce28549b7e10 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sat, 21 May 2022 02:37:59 -0400 Subject: [PATCH] simple button & selection manipulation --- res/textures.png | Bin 8106 -> 8128 bytes src/main/java/xyz/valnet/engine/App.java | 1 - .../valnet/engine/shaders/SimpleShader.java | 11 ------ .../valnet/hadean/gameobjects/Selection.java | 9 +++-- .../hadean/gameobjects/SelectionUI.java | 37 ++++++++++++++---- .../java/xyz/valnet/hadean/input/Button.java | 30 ++++++++++---- .../xyz/valnet/hadean/input/SimpleButton.java | 21 ++++++++++ .../java/xyz/valnet/hadean/util/Assets.java | 26 ++++++++++++ 8 files changed, 103 insertions(+), 32 deletions(-) create mode 100644 src/main/java/xyz/valnet/hadean/input/SimpleButton.java diff --git a/res/textures.png b/res/textures.png index d7d038fad098ba96eb9ef37fee92babaa54723af..54b577187b4280ebafe6b905951080d26cf0e957 100644 GIT binary patch literal 8128 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 diff --git a/src/main/java/xyz/valnet/engine/App.java b/src/main/java/xyz/valnet/engine/App.java index 66b35ed..4a27681 100644 --- a/src/main/java/xyz/valnet/engine/App.java +++ b/src/main/java/xyz/valnet/engine/App.java @@ -80,7 +80,6 @@ public class App { public void invoke(long window, int button, int action, int mods) { if(button >= 3) return; - // System.out.println("window: " + window + ", button: " + button + ", action: " + action + ", mods: " + mods); if(button == GLFW_MOUSE_BUTTON_LEFT) { mouseLeft = action == 1; return; } if(button == GLFW_MOUSE_BUTTON_RIGHT) { mouseRight = action == 1; return; } if(button == GLFW_MOUSE_BUTTON_MIDDLE) { mouseMiddle = action == 1; return ; } diff --git a/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java b/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java index dea30de..7888428 100644 --- a/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java +++ b/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java @@ -18,9 +18,7 @@ public class SimpleShader extends Shader { } public void pushColor(Vector4f color) { - // System.out.println("pushing " + color + " onto color stack"); colorStack.push(color); - // printColorStack(); setUniform4f("uColor", color); } @@ -31,10 +29,8 @@ public class SimpleShader extends Shader { } public void popColor() { - // System.out.println("popping the color stack"); colorStack.pop(); Vector4f newColor = colorStack.peek(); - // printColorStack(); if(newColor == null) { setUniform4f("uColor", Vector4f.one); @@ -42,13 +38,6 @@ public class SimpleShader extends Shader { } setUniform4f("uColor", newColor); } - - // private void printColorStack() { - // for(Vector4f color : colorStack) { - // System.out.println(" " + color); - // } - // System.out.println(""); - // } @Override protected void bindAttributes(int program) { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java b/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java index 77040e2..a900592 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java @@ -29,9 +29,10 @@ public class Selection extends GameObject { listeners.add(listener); } - private float distance(Vector2f a, Vector2f b) { - return (float) Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2)); - } + // TODO implement click vs single select using distance + // private float distance(Vector2f a, Vector2f b) { + // return (float) Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2)); + // } @Override public void tick(float dTime) { @@ -39,7 +40,7 @@ public class Selection extends GameObject { if(animation > animationMax) animation = animationMax; // TODO at some point, this will need to be blocked by other things on top. like a ui over the scene should make selections like, not happen?! - if(App.mouseLeft) { + if(App.mouseRight) { Vector2f currentMouseCoords = new Vector2f(App.mouseX, App.mouseY); if(initialCoords == null) { initialCoords = currentMouseCoords; diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java b/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java index 01393b6..be7326d 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java @@ -7,10 +7,13 @@ import java.util.List; import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.hadean.input.Button; import xyz.valnet.hadean.input.IButtonListener; +import xyz.valnet.hadean.input.SimpleButton; import xyz.valnet.hadean.util.Assets; public class SelectionUI extends GameObject implements ISelectionChangeListener, IButtonListener { + private String name = ""; + private int count = 0; private List selected = new ArrayList(); private HashMap selectedTypes = new HashMap(); private HashMap narrowButtons = new HashMap(); @@ -18,6 +21,14 @@ public class SelectionUI extends GameObject implements ISelectionChangeListener, private Selection selectionManager; + // this will be null normally, but set if + // a button has been pressed to update the selection. + // its a simple workaround to get rid of a concurrent + // exception, where the buttons are attempting to + // change while updating. + // TODO this could be fixed by delaying button clicks to the next frame. + private List newSelection = null;; + public void start() { selectionManager = get(Selection.class); selectionManager.subscribe(this); @@ -35,13 +46,22 @@ public class SelectionUI extends GameObject implements ISelectionChangeListener, // i ++; // } - for(Button btn : narrowButtons.values()) { - btn.draw(); + if(selectedTypes.size() == 1) { + Assets.font.drawString("" + count + "x " + name, 26, 376); + } else { + for(Button btn : narrowButtons.values()) { + btn.draw(); + } } + } @Override public void tick(float dTime) { + if(newSelection != null) { + selectionManager.updateSelection(newSelection); + newSelection = null; + } for(Button btn : narrowButtons.values()) { btn.update(); } @@ -56,11 +76,7 @@ public class SelectionUI extends GameObject implements ISelectionChangeListener, narrowBuckets.clear(); for(ISelectable selectable : selected) { String name = selectable.getClass().getName(); - System.out.println(name); String[] splitName = name.split("\\."); - for(String s : splitName) { - System.out.println(s); - } String shortName = splitName[splitName.length - 1]; if(selectedTypes.containsKey(name)) { @@ -68,20 +84,25 @@ public class SelectionUI extends GameObject implements ISelectionChangeListener, Button btn = narrowButtons.get(name); List items = narrowBuckets.get(btn); items.add(selectable); + btn.setText("" + items.size() + "x " + shortName); + count ++; } else { - Button btn = new Button(Assets.uiFrame, shortName, 20, 376 + 30 * selectedTypes.size(), 280, 24); + Button btn = new SimpleButton("1x " + shortName, 20, 376 + 30 * selectedTypes.size(), 280, 24); btn.registerClickListener(this); selectedTypes.put(name, 1); narrowButtons.put(name, btn); List list = new ArrayList(); list.add(selectable); narrowBuckets.put(btn, list); + count = 1; + this.name = shortName; } } } @Override public void click(Button target) { - + if(! narrowBuckets.containsKey(target)) return; + newSelection = narrowBuckets.get(target); } } diff --git a/src/main/java/xyz/valnet/hadean/input/Button.java b/src/main/java/xyz/valnet/hadean/input/Button.java index 2e31b59..66d509e 100644 --- a/src/main/java/xyz/valnet/hadean/input/Button.java +++ b/src/main/java/xyz/valnet/hadean/input/Button.java @@ -11,9 +11,11 @@ import xyz.valnet.hadean.util.Assets; public class Button { private final int x, y, width, height; - private final String text; - private final Tile9 frame; - private final int textWidth, textHeight; + private String text; + protected Tile9 frame; + protected Tile9 frameHover; + protected Tile9 frameActive; + private int textWidth, textHeight; private float hPad, vPad; private Vector4i box; @@ -27,16 +29,28 @@ public class Button { this.y = y; width = w; height = h; - this.text = text; this.frame = frame; - Vector4i measuredText = Assets.font.measure(text); - textWidth = measuredText.x; - textHeight = measuredText.y; + this.frameActive = frame; + this.frameHover = frame; + setText(text); box = new Vector4i(x, y, w, h); } + public void setText(String text) { + this.text = text; + Vector4i measuredText = Assets.font.measure(text); + textWidth = measuredText.x; + textHeight = measuredText.y; + } + public void draw() { - frame.draw(box.x, box.y, box.z, box.w); + if(state == HOVER) { + frameHover.draw(box.x, box.y, box.z, box.w); + } else if(state == ACTIVE) { + frameActive.draw(box.x, box.y, box.z, box.w); + } else { + frame.draw(box.x, box.y, box.z, box.w); + } Assets.flat.pushColor(Vector4f.black); Assets.font.drawString(text, 1 + x + (width - textWidth) / 2, 1 + y + (height - textHeight) / 2); diff --git a/src/main/java/xyz/valnet/hadean/input/SimpleButton.java b/src/main/java/xyz/valnet/hadean/input/SimpleButton.java new file mode 100644 index 0000000..2bb3c39 --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/input/SimpleButton.java @@ -0,0 +1,21 @@ +package xyz.valnet.hadean.input; + +import xyz.valnet.hadean.util.Assets; + +public class SimpleButton extends Button { + + public SimpleButton(String text, int x, int y, int w, int h) { + super(Assets.uiFrame, text, x, y, w, h); + + this.activeHPad = 0f; + this.activeVPad = 0f; + this.hoverHPad = 0f; + this.hoverVPad = 0f; + + this.frame = Assets.uiFrame; + this.frameHover = Assets.uiFrameLight; + this.frameActive = Assets.uiFrameDark; + + } + +} diff --git a/src/main/java/xyz/valnet/hadean/util/Assets.java b/src/main/java/xyz/valnet/hadean/util/Assets.java index 05493de..c26d883 100644 --- a/src/main/java/xyz/valnet/hadean/util/Assets.java +++ b/src/main/java/xyz/valnet/hadean/util/Assets.java @@ -20,6 +20,8 @@ public class Assets { public static final Tile9 selectionFrame; public static final Tile9 selectedFrame; public static final Tile9 uiFrame; + public static final Tile9 uiFrameLight; + public static final Tile9 uiFrameDark; public static final Sprite[] defaultTerrain; @@ -213,6 +215,30 @@ public class Assets { new Sprite(atlas, new Vector4i(33, 87, 6, 1)), new Sprite(atlas, new Vector4i(39, 87, 1, 1)) ); + + uiFrameLight = new Tile9( + new Sprite(atlas, new Vector4i(24, 80, 1, 1)), + new Sprite(atlas, new Vector4i(25, 80, 6, 1)), + new Sprite(atlas, new Vector4i(31, 80, 1, 1)), + new Sprite(atlas, new Vector4i(24, 81, 1, 6)), + new Sprite(atlas, new Vector4i(25, 81, 6, 6)), + new Sprite(atlas, new Vector4i(31, 81, 1, 6)), + new Sprite(atlas, new Vector4i(24, 87, 1, 1)), + new Sprite(atlas, new Vector4i(25, 87, 6, 1)), + new Sprite(atlas, new Vector4i(31, 87, 1, 1)) + ); + + uiFrameDark = new Tile9( + new Sprite(atlas, new Vector4i(0, 96, 1, 1)), + new Sprite(atlas, new Vector4i(1, 96, 6, 1)), + new Sprite(atlas, new Vector4i(7, 96, 1, 1)), + new Sprite(atlas, new Vector4i(0, 97, 1, 6)), + new Sprite(atlas, new Vector4i(1, 97, 6, 6)), + new Sprite(atlas, new Vector4i(7, 97, 1, 6)), + new Sprite(atlas, new Vector4i(0, 103, 1, 1)), + new Sprite(atlas, new Vector4i(1, 103, 6, 1)), + new Sprite(atlas, new Vector4i(7, 103, 1, 1)) + ); } }