diff --git a/res/content/base/index.yml b/res/content/base/index.yml index e69de29..24f5d98 100644 --- a/res/content/base/index.yml +++ b/res/content/base/index.yml @@ -0,0 +1,5 @@ +items: + - name: Log + plural: Logs + texture: [48, 96, 16, 16] + \ No newline at end of file diff --git a/src/main/java/xyz/valnet/engine/App.java b/src/main/java/xyz/valnet/engine/App.java index 235162a..5e2c3c6 100644 --- a/src/main/java/xyz/valnet/engine/App.java +++ b/src/main/java/xyz/valnet/engine/App.java @@ -85,29 +85,35 @@ public class App { } }); - glfwSetCursorPosCallback(window, new GLFWCursorPosCallback() { - @Override - public void invoke(long window, double xpos, double ypos) { - mouseX = (int) xpos; - mouseY = (int) ypos; - } + glfwSetCursorPosCallback(window, (long window, double xpos, double ypos) -> { + mouseX = (int) xpos; + mouseY = (int) ypos; }); - glfwSetMouseButtonCallback(window, new GLFWMouseButtonCallback() { - @Override - public void invoke(long window, int button, int action, int mods) { + glfwSetScrollCallback(window, (long window, double xOffset, double yOffset) -> { + System.out.println("Scroll " + yOffset); + if(yOffset > 0) + game.scrollUp(); + else if(yOffset < 0) + game.scrollDown(); + + // if(yOffset > 0) + // game.scrollLeft(); + // else if(yOffset < 0) + // game.scrollRight(); + }); + + glfwSetMouseButtonCallback(window, (long window, int button, int action, int mods) -> { if(action == 1) { game.mouseDown(button); } else if(action == 0) { game.mouseUp(button); } - if(button >= 3) return; 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 ; } - - } + System.out.println("Mouse: action " + action + " : button " + button); }); // Get the thread stack and push a new frame diff --git a/src/main/java/xyz/valnet/engine/Game.java b/src/main/java/xyz/valnet/engine/Game.java index cebe2e0..37135ba 100644 --- a/src/main/java/xyz/valnet/engine/Game.java +++ b/src/main/java/xyz/valnet/engine/Game.java @@ -53,6 +53,14 @@ public abstract class Game { public abstract void updateViewMatrix(Matrix4f matrix); + public final void scrollUp() { + scene.scrollUp(); + } + + public final void scrollDown() { + scene.scrollDown(); + } + public final void mouseDown(int button) { scene.mouseDown(button); } diff --git a/src/main/java/xyz/valnet/engine/graphics/ImmediateUI.java b/src/main/java/xyz/valnet/engine/graphics/ImmediateUI.java index 26cf541..34ffcdd 100644 --- a/src/main/java/xyz/valnet/engine/graphics/ImmediateUI.java +++ b/src/main/java/xyz/valnet/engine/graphics/ImmediateUI.java @@ -151,6 +151,14 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre public void apply(); } + private float getCurrentLayer() { + return getLayer() + contextStack.size() * 0.001f; + } + + private float getPreviousLayer() { + return getLayer() + contextStack.size() * 0.001f; + } + // === ELEMENTS === // @@ -213,7 +221,7 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre // TODO this will add _all_ frames, not just root frames to guiareas. // not a problem, but not efficient. revisit. protected void frameEnd() { - Drawing.setLayer(getLayer() + contextStack.size() - 1); + Drawing.setLayer(getPreviousLayer()); if(!context.fixedSize) { Assets.uiFrame.draw(context.box); guiAreas.add(context.box); @@ -267,7 +275,7 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre btn.setText(text); btn.setPosition(x, y); btn.setSize((int) buttonBox.z, (int) buttonBox.w); - btn.setLayer(getLayer() + contextStack.size() + 1); + btn.setLayer(getCurrentLayer()); adjustBox(buttonBox.z, buttonBox.w); @@ -295,7 +303,7 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre protected void groupEnd() { padEnd(); - Drawing.setLayer(getLayer() + contextStack.size() - 1); + Drawing.setLayer(getPreviousLayer()); float h = context.box.w; Assets.uiFrame.draw(context.box); context = contextStack.pop(); @@ -383,7 +391,7 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre protected void text(String text, Font font) { Vector4i measured = font.measure(text); - Drawing.setLayer(getLayer() + contextStack.size()); + Drawing.setLayer(getCurrentLayer()); int x = (int) context.box.x; int y = (int) context.box.y; diff --git a/src/main/java/xyz/valnet/engine/scenegraph/IMouseCaptureArea.java b/src/main/java/xyz/valnet/engine/scenegraph/IMouseCaptureArea.java index aada5f7..5967131 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/IMouseCaptureArea.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/IMouseCaptureArea.java @@ -9,6 +9,8 @@ public interface IMouseCaptureArea { public void mouseLeave(); public void mouseDown(int button); public void mouseUp(int button); + public default void scrollUp() {} + public default void scrollDown() {} public List getGuiBoxes(); public float getLayer(); diff --git a/src/main/java/xyz/valnet/engine/scenegraph/IScene.java b/src/main/java/xyz/valnet/engine/scenegraph/IScene.java index 24a7d7f..84c3853 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/IScene.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/IScene.java @@ -4,6 +4,9 @@ public interface IScene { public void render(); public void update(float dTime); + public void scrollUp(); + public void scrollDown(); + public void mouseDown(int button); public void mouseUp(int button); diff --git a/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java index ac4ac20..06c4761 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java @@ -267,4 +267,18 @@ public abstract class SceneGraph implements IScene { public boolean getKey(int key) { return keys.contains(key); } + + @Override + public void scrollDown() { + for(IMouseCaptureArea iml : getAll(IMouseCaptureArea.class)) { + iml.scrollDown(); + } + } + + @Override + public void scrollUp() { + for(IMouseCaptureArea iml : getAll(IMouseCaptureArea.class)) { + iml.scrollUp(); + } + } } diff --git a/src/main/java/xyz/valnet/hadean/ItemDescriptor.java b/src/main/java/xyz/valnet/hadean/ItemDescriptor.java new file mode 100644 index 0000000..986c464 --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/ItemDescriptor.java @@ -0,0 +1,5 @@ +package xyz.valnet.hadean; + +public class ItemDescriptor { + +} diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java index 73014e6..5635b5a 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java @@ -172,5 +172,17 @@ public class Camera extends GameObject implements ITransient, IMouseCaptureArea public float getLayer() { return 0; } + + @Override + public void scrollDown() { + tileWidth /= 2; + tileWidth = Math.max(tileWidth, 8); + } + + @Override + public void scrollUp() { + tileWidth *= 2; + tileWidth = Math.min(tileWidth, 32); + } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java index 3d28762..a1bb684 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java @@ -51,6 +51,7 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea, ITransi } public void activate(IBuildLayerListener listener) { + if(active) return; active = true; this.listener = listener; broadcastWorldCoords(); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java index 17bbef7..3e5509e 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java @@ -208,7 +208,7 @@ public class SelectionLayer extends GameObject implements IMouseCaptureArea, ITr } } else if (button == 1) { if(selected.size() == 0) { - buildTab.evoke(); + buildTab.rightClickOnWorld(); } else { clearSelection(); } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java b/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java index ccc0d24..14e95f1 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java @@ -34,27 +34,25 @@ import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Layers; import xyz.valnet.hadean.util.SmartBoolean; -public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCaptureArea, IButtonListener { +import static xyz.valnet.engine.util.Math.lerp; + +public class BuildTab extends Tab implements ISelectionChangeListener, IBuildLayerListener { private SelectionLayer selection; private BuildLayer buildLayer; private Camera camera; - private SmartBoolean opened; - private int width = 200; - - private int padding = 10; + private boolean opened; private int x, y; private int w, h; - private String selectedCategory = ""; + private String selectedCategory = null; private static transient Map> buildables = new HashMap>(); - private transient Map buildableButtons = null; private transient BuildableRecord selectedBuildable = null; - private int height = Math.max((int)Math.ceil(buildables.size() / 2f) * 24, 24*3); + private float openness = 0; static { BuildTab.registerBuildable(HaulItemDesignation.class); @@ -109,168 +107,138 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap public void renderAlpha () { Drawing.setLayer(Layers.GENERAL_UI); - if(opened.value()) { - Assets.uiFrame.draw(padding, 576 - BottomBar.bottomBarHeight - padding - height, width, height); + if(!opened || selectedBuildable == null) return; + // draw the currently selected build item + Assets.flat.pushColor(new Vector4f(1f, 1f, 1f, 1.0f)); + Vector2i topLeft = camera.world2screen(x, y); + Assets.font.drawString(selectedBuildable.name, topLeft.x, topLeft.y - 20); + Assets.flat.swapColor(new Vector4f(1f, 1f, 1f, 0.6f)); + camera.draw(Layers.BUILD_INTERACTABLE, Assets.selectionFrame, x, y, w, h); + Assets.flat.swapColor(new Vector4f(1f, 1f, 1f, 0.35f)); + for(int i = 0; i < w; i ++) for(int j = 0; j < h; j ++) {{ + camera.draw(Layers.BUILD_INTERACTABLE, Assets.checkerBoard, x + i, y + j); + }} + Assets.flat.popColor(); + } - if(selectedBuildable == null) return; - // draw the currently selected build item - Assets.flat.pushColor(new Vector4f(1f, 1f, 1f, 1.0f)); - Vector2i topLeft = camera.world2screen(x, y); - Assets.font.drawString(selectedBuildable.name, topLeft.x, topLeft.y - 20); - Assets.flat.swapColor(new Vector4f(1f, 1f, 1f, 0.6f)); - camera.draw(Layers.BUILD_INTERACTABLE, Assets.selectionFrame, x, y, w, h); - Assets.flat.swapColor(new Vector4f(1f, 1f, 1f, 0.35f)); - for(int i = 0; i < w; i ++) for(int j = 0; j < h; j ++) {{ - camera.draw(Layers.BUILD_INTERACTABLE, Assets.checkerBoard, x + i, y + j); - }} - Assets.flat.popColor(); - } + @Override + protected void connect() { + super.connect(); + buildLayer = get(BuildLayer.class); + selection = get(SelectionLayer.class); + camera = get(Camera.class); } @Override public void start() { super.start(); - buildLayer = get(BuildLayer.class); - selection = get(SelectionLayer.class); - camera = get(Camera.class); - - opened = new SmartBoolean(false, new SmartBoolean.IListener() { - - @Override - public void rise() { - Assets.sndBubble.play(); - activate(); - } - - @Override - public void fall() { - Assets.sndCancel.play(); - deactiveate(); - } - - }); - if(selection != null) { selection.subscribe(this); } - - buildableButtons = new HashMap(); - } - - private List