diff --git a/.gitignore b/.gitignore index 3bd11db..bee96e5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ out output SAVE_DATA.TXT .DS_Store +.vscode/graalvm \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index a82eed7..89874d1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,20 +1,25 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "java", - "name": "Launch App", - "request": "launch", - "mainClass": "xyz.valnet.hadean.HadeanGame", - "projectName": "hadean", - "console": "internalConsole", - "internalConsoleOptions": "neverOpen", - "osx": { - "vmArgs": "-XstartOnFirstThread" - } - } - ] + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Launch App", + "request": "launch", + "mainClass": "xyz.valnet.hadean.HadeanGame", + "projectName": "hadean", + "console": "internalConsole", + "internalConsoleOptions": "neverOpen", + + "osx": { + "type": "java", + "name": "Launch App", + "request": "launch", + "mainClass": "xyz.valnet.hadean.HadeanGame", + "vmArgs": "-XstartOnFirstThread" + } + } + ] } \ No newline at end of file diff --git a/src/main/java/xyz/valnet/engine/graphics/Color.java b/src/main/java/xyz/valnet/engine/graphics/Color.java new file mode 100644 index 0000000..4076f77 --- /dev/null +++ b/src/main/java/xyz/valnet/engine/graphics/Color.java @@ -0,0 +1,60 @@ +package xyz.valnet.engine.graphics; + +public class Color { + public final float r, g, b, a; + + public static Color black = new Color(0, 0, 0); + public static Color white = new Color(1, 1, 1); + + public static Color red = new Color(1, 0, 0); + public static Color green = new Color(0, 1, 0); + public static Color blue = new Color(0, 0, 1); + + public static Color yellow = new Color(1, 1, 0); + public static Color cyan = new Color(0, 1, 1); + public static Color magenta = new Color(1, 0, 1); + + public static Color orange = new Color(1, 0.5f, 0); + public static Color lime = new Color(0.5f, 1, 0); + public static Color aqua = new Color(0, 1, 0.5f); + public static Color indigo = new Color(0, 0.5f, 1); + public static Color purple = new Color(0.5f, 0, 1); + public static Color hotpink = new Color(1, 0, 0.5f); + + public Color(float r, float g, float b) { + this(r, g, b, 1.0f); + } + + public Color(float r, float g, float b, float a) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + public Color withAlpha(float a) { + return new Color(r, g, b, a); + } + + public Color brighter() { + return new Color( + (float) Math.sqrt(r), + (float) Math.sqrt(g), + (float) Math.sqrt(b), + a + ); + } + + public Color darker() { + return new Color( + (float) Math.pow(r, 2), + (float) Math.pow(g, 2), + (float) Math.pow(b, 2), + a + ); + } + + public static Color grey(float f) { + return new Color(f, f, f); + } +} diff --git a/src/main/java/xyz/valnet/engine/graphics/Font.java b/src/main/java/xyz/valnet/engine/graphics/Font.java index 6c453fc..3322d59 100644 --- a/src/main/java/xyz/valnet/engine/graphics/Font.java +++ b/src/main/java/xyz/valnet/engine/graphics/Font.java @@ -2,7 +2,6 @@ package xyz.valnet.engine.graphics; import java.util.Map; -import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4i; import xyz.valnet.hadean.util.Assets; @@ -21,7 +20,7 @@ public class Font { } public void drawStringOutlined(String str, int x, int y) { - Assets.flat.pushColor(Vector4f.black); + Assets.flat.pushColor(Color.black); drawString(str, x - scale, y - scale); drawString(str, x, y - scale); drawString(str, x + scale, y - scale); diff --git a/src/main/java/xyz/valnet/engine/graphics/ImmediateUI.java b/src/main/java/xyz/valnet/engine/graphics/ImmediateUI.java index 34ffcdd..64f0347 100644 --- a/src/main/java/xyz/valnet/engine/graphics/ImmediateUI.java +++ b/src/main/java/xyz/valnet/engine/graphics/ImmediateUI.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Set; import java.util.Stack; +import xyz.valnet.engine.math.Box; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4i; import xyz.valnet.engine.scenegraph.GameObject; @@ -29,16 +30,6 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre end(); } - public void renderAlpha() { - // float f = 99; - // Assets.flat.pushColor(new Vector4f(1, 0, 0, 0.3f)); - // for(Vector4f box : guiAreas) { - // Drawing.setLayer(f += 0.001f); - // Assets.fillColor.draw(box); - // } - // Assets.flat.popColor(); - } - @Override public void mouseEnter() { active = true; @@ -68,8 +59,8 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre private record StackingContext( boolean fixedSize, - Vector4f box, - Vector4f occlusionBox, + Box box, + Box occlusionBox, boolean hasRegisteredGuiArea, boolean horizontal // layout manager? @@ -120,31 +111,40 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre return false; } + private void modifyBox(float x, float y, float w, float h) { + context = new StackingContext( + context.fixedSize, + new Box(context.box.x + x, context.box.y + y, context.box.w + w, context.box.h + h), + context.occlusionBox, + context.hasRegisteredGuiArea, + context.horizontal + ); + } + private void adjustBox(float w, float h) { if(context.vertical()) { if(context.fixedSize) { - context.box.y += h; - context.box.w -= h; + modifyBox(0, h, 0, -h); } else { - context.box.w += h; + modifyBox(0, 0, 0, h); } } else { if(context.fixedSize) { - context.box.x += w; - context.box.z -= w; + modifyBox(w, 0, -w, 0); } else { - context.box.z += w; - context.box.w = Math.max(context.box.w, h); + modifyBox(0, 0, w, 0); + if (h - context.box.h > 0) + modifyBox(0, 0, 0, h - context.box.h); } } } @Override - public final List getGuiBoxes() { + public final List getGuiBoxes() { return guiAreas; } - private transient List guiAreas = new ArrayList(); + private transient List guiAreas = new ArrayList(); @FunctionalInterface public interface RenderCallback { @@ -187,7 +187,7 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre protected void root(int x, int y, int w, int h) { assert context == null : "root can only be a root element"; - Vector4f box = new Vector4f(x, y, w, h); + Box box = new Box(x, y, w, h); context = new StackingContext(true, box, box, false, false); } @@ -200,7 +200,7 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre contextStack.push(context); context = new StackingContext( true, - new Vector4f(context.box.x, context.box.y, w, h), + new Box(context.box.x, context.box.y, w, h), context.occlusionBox.copy(), true, context.horizontal @@ -211,7 +211,7 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre contextStack.push(context); context = new StackingContext( false, - new Vector4f(context.box.x, context.box.y, context.box.z, 0), + new Box(context.box.x, context.box.y, context.box.w, 0), context.occlusionBox.copy(), true, context.horizontal @@ -245,11 +245,11 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre } protected boolean button(String id, String text, boolean expand) { - float h = 32; + int h = 32; if(expand && context.fixedSize) { - h = context.box.w; + h = (int) context.box.h; } - float w = context.box.z; + int w = (int) context.box.w; if(context.horizontal && !context.fixedSize) { w = 100; } @@ -259,13 +259,13 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre if(!context.fixedSize) { if(context.vertical()) { - y += (int) context.box.w; + y += (int) context.box.h; } else { - x += (int) context.box.z; + x += (int) context.box.w; } } - Vector4f buttonBox = new Vector4f(x, y, w, h); + Box buttonBox = new Box(x, y, w, h); Button btn = getButton(id); if(!context.hasRegisteredGuiArea) { @@ -274,10 +274,10 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre btn.setText(text); btn.setPosition(x, y); - btn.setSize((int) buttonBox.z, (int) buttonBox.w); + btn.setSize(w, h); btn.setLayer(getCurrentLayer()); - adjustBox(buttonBox.z, buttonBox.w); + adjustBox(buttonBox.w, buttonBox.h); return getClick(btn); } @@ -291,8 +291,8 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre protected void group() { contextStack.push(context); context = new StackingContext(false, - new Vector4f( - context.box.x, context.box.y, context.box.z, 0 + new Box( + context.box.x, context.box.y, context.box.w, 0 ), context.occlusionBox.copy(), context.hasRegisteredGuiArea, @@ -304,18 +304,18 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre protected void groupEnd() { padEnd(); Drawing.setLayer(getPreviousLayer()); - float h = context.box.w; + float h = context.box.h; Assets.uiFrame.draw(context.box); context = contextStack.pop(); - adjustBox(context.box.z, h); + adjustBox(context.box.w, h); } protected void pad() { contextStack.push(context); if(context.fixedSize) { context = new StackingContext(true, - new Vector4f( - context.box.x + 8, context.box.y + 8, context.box.z - 16, context.box.w - 16 + new Box( + context.box.x + 8, context.box.y + 8, context.box.w - 16, context.box.h - 16 ), context.occlusionBox.copy(), context.hasRegisteredGuiArea, @@ -323,8 +323,8 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre ); } else { context = new StackingContext(false, - new Vector4f( - context.box.x + 8, context.box.y + 8, context.box.z - 16, 0 + new Box( + context.box.x + 8, context.box.y + 8, context.box.w - 16, 0 ), context.occlusionBox.copy(), context.hasRegisteredGuiArea, @@ -334,23 +334,23 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre } protected void padEnd() { - float h = context.box.w + 16; + float h = context.box.h + 16; context = contextStack.pop(); - adjustBox(context.box.z + 16, h); + adjustBox(context.box.w + 16, h); } protected void horizontal(RenderCallback cb) { contextStack.push(context); context = new StackingContext( false, - new Vector4f(context.box.x, context.box.y, 0, 0), + new Box(context.box.x, context.box.y, 0, 0), context.occlusionBox, context.hasRegisteredGuiArea, true ); cb.apply(); - float w = context.box.z; - float h = context.box.w; + float w = context.box.w; + float h = context.box.h; context = contextStack.pop(); adjustBox(w, h); } @@ -398,9 +398,9 @@ public abstract class ImmediateUI extends GameObject implements IMouseCaptureAre if(!context.fixedSize) { if(context.vertical()) { - y += (int) context.box.w; + y += (int) context.box.h; } else { - x += (int) context.box.z; + x += (int) context.box.w; } } diff --git a/src/main/java/xyz/valnet/engine/graphics/Tile9.java b/src/main/java/xyz/valnet/engine/graphics/Tile9.java index f41fb63..c3125c8 100644 --- a/src/main/java/xyz/valnet/engine/graphics/Tile9.java +++ b/src/main/java/xyz/valnet/engine/graphics/Tile9.java @@ -1,7 +1,6 @@ package xyz.valnet.engine.graphics; -import xyz.valnet.engine.math.Vector4f; -import xyz.valnet.engine.math.Vector4i; +import xyz.valnet.engine.math.Box; public class Tile9 { @@ -37,12 +36,8 @@ public class Tile9 { this.bottomRight = bottomRight; } - public void draw(Vector4f box) { - draw(box.asInt()); - } - - public void draw(Vector4i box) { - draw(box.x, box.y, box.z, box.w); + public void draw(Box box) { + draw((int) box.x, (int) box.y, (int) box.w, (int) box.h); } public void draw(int x, int y, int w, int h) { diff --git a/src/main/java/xyz/valnet/engine/math/Box.java b/src/main/java/xyz/valnet/engine/math/Box.java new file mode 100644 index 0000000..50d6de6 --- /dev/null +++ b/src/main/java/xyz/valnet/engine/math/Box.java @@ -0,0 +1,54 @@ +package xyz.valnet.engine.math; + +public class Box { + + public final float x, y, w, h, x2, y2; + public final Vector2f a, b; + + public static final Box none = new Box(0, 0, 0, 0); + + public Box(float x, float y, float w, float h) { + if(w < 0) { + this.w = Math.abs(w); + this.x = x + w; + } else { + this.x = x; + this.w = w; + } + if(h < 0) { + this.h = Math.abs(h); + this.y = y + h; + } else { + this.y = y; + this.h = h; + } + this.x2 = this.x + this.w; + this.y2 = this.y + this.h; + this.a = new Vector2f(this.x, this.y); + this.b = new Vector2f(this.x2, this.y2); + } + + public static Box fromPoints(Vector2f a, Vector2f b) { + return new Box(a.x, a.y, b.x - a.x, b.y - a.y); + } + + public static Box fromPoints(Vector2f a, float x2, float y2) { + return new Box(a.x, a.y, x2 - a.x, y2 - a.y); + } + + public static Box fromPoints(float x, float y, Vector2f b) { + return new Box(x, y, b.x - x, b.y - y); + } + + public static Box fromPoints(float x, float y, float x2, float y2) { + return new Box(x, y, x2 - x, y2 - y); + } + + public Box copy() { + return new Box(x, y, w, h); + } + + public boolean contains(float x, float y) { + return x >= this.x && x < this.x2 && y >= this.y && y < this.y2; + } +} diff --git a/src/main/java/xyz/valnet/engine/math/Vector2i.java b/src/main/java/xyz/valnet/engine/math/Vector2i.java index 9755b87..9e25a0f 100644 --- a/src/main/java/xyz/valnet/engine/math/Vector2i.java +++ b/src/main/java/xyz/valnet/engine/math/Vector2i.java @@ -55,4 +55,8 @@ public class Vector2i implements Serializable { return new Vector2i(x - 1, y); } + public Box getTileBox() { + return new Box(x, y, 1, 1); + } + } diff --git a/src/main/java/xyz/valnet/engine/scenegraph/IMouseCaptureArea.java b/src/main/java/xyz/valnet/engine/scenegraph/IMouseCaptureArea.java index 5967131..05ba4f2 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/IMouseCaptureArea.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/IMouseCaptureArea.java @@ -2,16 +2,18 @@ package xyz.valnet.engine.scenegraph; import java.util.List; -import xyz.valnet.engine.math.Vector4f; +import xyz.valnet.engine.math.Box; public interface IMouseCaptureArea { - public void mouseEnter(); - public void mouseLeave(); + + public default void mouseEnter() {} + public default void mouseLeave() {} + public List getGuiBoxes(); + public float getLayer(); + 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/SceneGraph.java b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java index 06c4761..9c2c024 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java @@ -15,6 +15,7 @@ import java.util.Set; import java.util.stream.Collectors; import xyz.valnet.engine.App; +import xyz.valnet.engine.math.Box; import xyz.valnet.engine.math.Vector4f; public abstract class SceneGraph implements IScene { @@ -91,7 +92,7 @@ public abstract class SceneGraph implements IScene { }); for(IMouseCaptureArea listener : mouseListeners) { - for(Vector4f guiBox : listener.getGuiBoxes()) { + for(Box guiBox : listener.getGuiBoxes()) { boolean currentlyEntered = guiBox.contains(App.mouseX, App.mouseY); if(currentlyEntered) { if(listener != hoveredMouseListener) { diff --git a/src/main/java/xyz/valnet/engine/shaders/Shader.java b/src/main/java/xyz/valnet/engine/shaders/Shader.java index 377d2c9..a6c8f90 100644 --- a/src/main/java/xyz/valnet/engine/shaders/Shader.java +++ b/src/main/java/xyz/valnet/engine/shaders/Shader.java @@ -9,6 +9,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.math.Matrix4f; import xyz.valnet.engine.math.Vector3f; import xyz.valnet.engine.math.Vector4f; @@ -123,6 +124,11 @@ public class Shader { glUniform4f(getUniform(name), vector.x, vector.y, vector.z, vector.w); } + public void setUniform4f(String name, Color c) { + if (!enabled) enable(); + glUniform4f(getUniform(name), c.r, c.g, c.b, c.a); + } + public void setUniformMat4f(String name, Matrix4f matrix) { if (!enabled) enable(); glUniformMatrix4fv(getUniform(name), false, matrix.toFloatBuffer()); diff --git a/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java b/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java index dc5f8c2..4131b3a 100644 --- a/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java +++ b/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java @@ -1,14 +1,14 @@ package xyz.valnet.engine.shaders; -import java.util.Stack; - import static org.lwjgl.opengl.GL20.*; -import xyz.valnet.engine.math.Vector4f; +import java.util.Stack; + +import xyz.valnet.engine.graphics.Color; public class SimpleShader extends Shader { - private Stack colorStack = new Stack(); + private Stack colorStack = new Stack(); public final static int COLOR = 1; public final static int TEX_COORD = 2; @@ -17,12 +17,12 @@ public class SimpleShader extends Shader { super(vertPath, fragPath); } - public void pushColor(Vector4f color) { + public void pushColor(Color color) { colorStack.push(color); setUniform4f("uColor", color); } - public void swapColor(Vector4f color) { + public void swapColor(Color color) { popColor(); pushColor(color); } @@ -33,10 +33,10 @@ public class SimpleShader extends Shader { public void popColor() { colorStack.pop(); - Vector4f newColor = colorStack.peek(); + Color newColor = colorStack.peek(); if(newColor == null) { - setUniform4f("uColor", Vector4f.one); + setUniform4f("uColor", Color.white); return; } setUniform4f("uColor", newColor); diff --git a/src/main/java/xyz/valnet/hadean/HadeanGame.java b/src/main/java/xyz/valnet/hadean/HadeanGame.java index 8070cb8..e71c81d 100644 --- a/src/main/java/xyz/valnet/hadean/HadeanGame.java +++ b/src/main/java/xyz/valnet/hadean/HadeanGame.java @@ -5,6 +5,7 @@ import java.util.List; import xyz.valnet.engine.App; import xyz.valnet.engine.Game; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.math.Matrix4f; import xyz.valnet.engine.math.Vector4f; @@ -22,7 +23,7 @@ public class HadeanGame extends Game { @Override public void start() { - Assets.flat.pushColor(Vector4f.one); + Assets.flat.pushColor(Color.white); changeScene(new GameScene()); } @@ -37,7 +38,7 @@ public class HadeanGame extends Game { } private static Runtime runtime = Runtime.getRuntime(); - private static Vector4f fontColor = new Vector4f(1, 0, 0, 1); + private static Color fontColor = Color.red; private void renderDebugInfo() { @@ -54,7 +55,7 @@ public class HadeanGame extends Game { strings.add("dTime: " + dTime); for(String str : strings) { - Assets.flat.pushColor(Vector4f.black); + Assets.flat.pushColor(Color.black); Assets.font.drawString(str, left + 1, top + 1); Assets.flat.swapColor(fontColor); Assets.font.drawString(str, left, top); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java index 5635b5a..9ee529a 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java @@ -5,9 +5,11 @@ import static xyz.valnet.engine.util.Math.*; import java.util.List; import xyz.valnet.engine.App; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.graphics.Sprite; import xyz.valnet.engine.graphics.Tile9; +import xyz.valnet.engine.math.Box; import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; @@ -37,6 +39,10 @@ public class Camera extends GameObject implements ITransient, IMouseCaptureArea maxY = bounds.w; } + public Vector2f getWorldMouse() { + return screen2world(App.mouseX, App.mouseY); + } + public void update(float dTime) { Vector2f direction = Vector2f.zero; if(dragOrigin == null) { @@ -124,6 +130,10 @@ public class Camera extends GameObject implements ITransient, IMouseCaptureArea Drawing.drawSprite(sprite, (int)(screenPos.x), (int)(screenPos.y), (int)(tileWidth * w), (int)(tileWidth * h)); } + public void draw(float layer, Tile9 sprite, Box box) { + draw(layer, sprite, box.x, box.y, box.w, box.h); + } + public void draw(float layer, Tile9 sprite, float x, float y, float w, float h) { Vector2i screenPos = world2screen(x, y); Drawing.setLayer(layer + (((y + h) - minY) / (maxY - minY))); @@ -134,9 +144,9 @@ public class Camera extends GameObject implements ITransient, IMouseCaptureArea int h = 6; Vector4i box = world2screen(worldBox).toXYWH().asInt(); Drawing.setLayer(Layers.GENERAL_UI); - Assets.flat.pushColor(new Vector4f(0, 0, 0, 1)); + Assets.flat.pushColor(Color.black); Assets.uiFrame.draw(box.x - h, box.y + box.w / 2 - h / 2, box.z + h * 2, h); - Assets.flat.swapColor(new Vector4f(1, 1, 0, 1)); + Assets.flat.swapColor(Color.yellow); Assets.fillColor.draw(box.x + 1 - h, box.y + 1 + box.w / 2 - h / 2, (int)Math.round(lerp(0, box.z - 3 + h * 2, progress)) + 1, h - 2); Assets.flat.popColor(); } @@ -164,8 +174,8 @@ public class Camera extends GameObject implements ITransient, IMouseCaptureArea } @Override - public List getGuiBoxes() { - return List.of(Vector4f.zero); + public List getGuiBoxes() { + return List.of(Box.none); } @Override diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java b/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java index 0278b80..4f26ca3 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java @@ -9,6 +9,7 @@ import java.util.Map.Entry; import java.util.Set; import java.util.stream.Stream; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; @@ -46,18 +47,18 @@ public class JobBoard extends GameObject { super.render(); if(HadeanGame.debugView) { float opacity = 0.6f; - Assets.flat.pushColor(new Vector4f(1, 0.8f, 0, opacity)); + Assets.flat.pushColor(Color.orange.withAlpha(opacity)); for(Job job : availableJobs) { for(Vector2i position : job.getLocations()) { if(job.isValid()) { - Assets.flat.swapColor(new Vector4f(1, 0.8f, 0, opacity)); + Assets.flat.swapColor(Color.orange.withAlpha(opacity)); } else { - Assets.flat.swapColor(new Vector4f(1.0f, 0.2f, 0, opacity)); + Assets.flat.swapColor(Color.red.withAlpha(opacity)); } camera.draw(Layers.GROUND_MARKERS, Assets.fillTile, position.asFloat()); } } - Assets.flat.swapColor(new Vector4f(0.2f, 1.0f, 0, opacity)); + Assets.flat.swapColor(Color.lime.withAlpha(opacity)); for(Job job : allocations.values()) { for(Vector2i position : job.getLocations()) { camera.draw(Layers.GROUND_MARKERS, Assets.fillTile, position.asFloat()); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java b/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java index 1f16f5e..dbb620f 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java @@ -5,6 +5,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4i; @@ -27,7 +28,7 @@ public class Tile extends WorldObject implements IWorkable { private static int greenSeed = (int)(Math.random() * 10000); private static int blueSeed = (int)(Math.random() * 10000); - private Vector4f color; + private Color color; private final int tileSelector = (int)Math.floor(Math.random() * 4); private boolean rocks = false; @@ -55,7 +56,7 @@ public class Tile extends WorldObject implements IWorkable { float green = (float) terrain.getNoise(greenSeed, pos.x * scale, pos.y * scale); float blue = (float) terrain.getNoise(blueSeed, pos.x * scale, pos.y * scale); - if(color == null) color = new Vector4f(red * 0.1f, 0.4f + green * 0.15f, blue * 0.05f, 1f); + if(color == null) color = new Color(red * 0.1f, 0.4f + green * 0.15f, blue * 0.05f, 1f); } @Override @@ -166,7 +167,7 @@ public class Tile extends WorldObject implements IWorkable { if(rocks) camera.draw(Layers.TILES, Assets.rocks, pos.x, pos.y); } if(tillLevel > 0f) { - Assets.flat.pushColor(Vector4f.opacity(tillLevel)); + Assets.flat.pushColor(Color.white.withAlpha(tillLevel)); camera.draw(Layers.TILES, Assets.farmPlot[tileSelector], pos.x, pos.y); Assets.flat.popColor(); } 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 a1bb684..4bf75b9 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java @@ -3,8 +3,8 @@ package xyz.valnet.hadean.gameobjects.inputlayer; import java.util.List; import xyz.valnet.engine.App; +import xyz.valnet.engine.math.Box; import xyz.valnet.engine.math.Vector2i; -import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.IMouseCaptureArea; import xyz.valnet.engine.scenegraph.ITransient; @@ -121,8 +121,6 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea, ITransi } } - - private Vector2i[] orderCoords(Vector2i a, Vector2i b) { return new Vector2i[] { new Vector2i(Math.min(a.x, b.x), Math.min(a.y, b.y)), @@ -132,8 +130,8 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea, ITransi } @Override - public List getGuiBoxes() { - return List.of(active ? new Vector4f(0, 0, 1024, 576) : Vector4f.zero); + public List getGuiBoxes() { + return List.of(active ? new Box(0, 0, 1024, 576) : Box.none); } @Override 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 3e5509e..5fec5c9 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java @@ -7,6 +7,7 @@ import java.util.List; import xyz.valnet.engine.App; import xyz.valnet.engine.graphics.Drawing; +import xyz.valnet.engine.math.Box; import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; @@ -92,13 +93,10 @@ public class SelectionLayer extends GameObject implements IMouseCaptureArea, ITr } if(initialCoords != null) { - Vector2i screenPos = camera.world2screen(initialCoords); - Assets.selectionFrame.draw(new Vector4i( - screenPos.x, - screenPos.y, - App.mouseX, - App.mouseY - ).toXYWH()); + camera.draw(Layers.AREA_SELECT_BOX, Assets.selectionFrame, Box.fromPoints( + initialCoords, + camera.getWorldMouse() + )); } } @@ -189,8 +187,8 @@ public class SelectionLayer extends GameObject implements IMouseCaptureArea, ITr } @Override - public List getGuiBoxes() { - return List.of(new Vector4f(0, 0, 1000, 1000)); + public List getGuiBoxes() { + return List.of(new Box(0, 0, 10000, 10000)); } @Override 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 14e95f1..e698932 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 @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; @@ -109,12 +110,12 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IBuildLay if(!opened || selectedBuildable == null) return; // draw the currently selected build item - Assets.flat.pushColor(new Vector4f(1f, 1f, 1f, 1.0f)); + Assets.flat.pushColor(Color.white); 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)); + Assets.flat.swapColor(Color.white.withAlpha(0.6f)); camera.draw(Layers.BUILD_INTERACTABLE, Assets.selectionFrame, x, y, w, h); - Assets.flat.swapColor(new Vector4f(1f, 1f, 1f, 0.35f)); + Assets.flat.swapColor(Color.white.withAlpha(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); }} diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/FarmPlot.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/FarmPlot.java index 93c732b..d2f1245 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/FarmPlot.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/FarmPlot.java @@ -1,6 +1,6 @@ package xyz.valnet.hadean.gameobjects.worldobjects; -import xyz.valnet.engine.math.Vector4f; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.math.Vector4i; import xyz.valnet.hadean.gameobjects.Tile; import xyz.valnet.hadean.interfaces.BuildableMetadata; @@ -16,7 +16,7 @@ public class FarmPlot extends Buildable { public void renderAlpha() { if(!visible) return; Vector4i pos = getWorldPosition(); - Assets.flat.pushColor(new Vector4f(0.4f, 1f, 0.3f, 0.2f)); + Assets.flat.pushColor(new Color(0.4f, 1f, 0.3f, 0.2f)); camera.draw(Layers.GROUND, Assets.whiteBox, pos.x, pos.y, pos.z, pos.w); Assets.flat.popColor(); } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Rice.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Rice.java index a88d872..491bbe3 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Rice.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Rice.java @@ -1,7 +1,7 @@ package xyz.valnet.hadean.gameobjects.worldobjects; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.math.Vector2i; -import xyz.valnet.engine.math.Vector4f; import xyz.valnet.hadean.gameobjects.worldobjects.items.Item; import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Assets; @@ -20,7 +20,7 @@ public class Rice extends Item { Vector2i pos = getWorldPosition().xy(); camera.draw(Layers.AIR, Assets.riceBag, pos.x, pos.y); - Assets.flat.pushColor(Vector4f.black); + Assets.flat.pushColor(Color.black); Vector2i screeCoords = camera.world2screen(pos.x, pos.y); Assets.miniFont.drawString("123", (int)screeCoords.x, (int)screeCoords.y); Assets.flat.popColor(); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Stockpile.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Stockpile.java index 1f40861..dec3f8a 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Stockpile.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Stockpile.java @@ -2,8 +2,8 @@ package xyz.valnet.hadean.gameobjects.worldobjects; import java.util.Set; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.math.Vector2i; -import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4i; import xyz.valnet.hadean.gameobjects.Tile; import xyz.valnet.hadean.interfaces.BuildableMetadata; @@ -24,7 +24,7 @@ public class Stockpile extends Buildable { public void renderAlpha() { if(!visible) return; Vector4i pos = getWorldPosition(); - Assets.flat.pushColor(new Vector4f(1f, 0.2f, 0.1f, 0.3f)); + Assets.flat.pushColor(new Color(1f, 0.2f, 0.1f, 0.3f)); camera.draw(Layers.TILES, Assets.whiteBox, pos.x, pos.y, pos.z, pos.w); Assets.flat.popColor(); } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java index 0b594e2..9be9a46 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java @@ -6,6 +6,7 @@ import static org.lwjgl.opengl.GL11.glEnd; import static org.lwjgl.opengl.GL11.glVertex3f; import static org.lwjgl.opengl.GL20.glVertexAttrib2f; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.math.Vector2i; @@ -160,7 +161,7 @@ public abstract class Agent extends WorldObject implements ISelectable { public void renderAlpha() { if(!HadeanGame.debugView) return; Drawing.setLayer(Layers.GROUND_MARKERS); - Assets.flat.pushColor(Vector4f.opacity(0.6f)); + Assets.flat.pushColor(Color.white.withAlpha(0.6f)); if(path != null) { int count = 0; for(Node node : path) { @@ -184,15 +185,7 @@ public abstract class Agent extends WorldObject implements ISelectable { count ++; } - Assets.selectionFrame.draw( - camera.world2screen( - terrain.getTile( - path.getDestination().getPosition() - ) - .getWorldBox() - ) - .toXYWH() - ); + camera.draw(Layers.GROUND_MARKERS, Assets.selectionFrame, path.getDestination().getPosition().getTileBox()); } Assets.flat.popColor(); } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Bed.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Bed.java index 2ee2aa7..8e2a2a0 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Bed.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Bed.java @@ -1,5 +1,6 @@ package xyz.valnet.hadean.gameobjects.worldobjects.constructions; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.hadean.gameobjects.Job; @@ -53,7 +54,7 @@ public class Bed extends Buildable implements IItemReceiver, IWorkable { float p = work / maxWork; float b = 4; - Assets.flat.pushColor(new Vector4f(b, b, b, 0.5f)); + Assets.flat.pushColor(Color.grey(b).withAlpha(0.5f)); camera.draw(Layers.GROUND, Assets.bed, pos.x, pos.y, 1, 2); Assets.flat.popColor(); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Quarry.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Quarry.java index 601421a..776163b 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Quarry.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Quarry.java @@ -1,5 +1,6 @@ package xyz.valnet.hadean.gameobjects.worldobjects.constructions; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.hadean.gameobjects.Job; @@ -29,7 +30,7 @@ public class Quarry extends Construction { } else { float b = 4; - Assets.flat.pushColor(new Vector4f(b, b, b, 0.5f)); + Assets.flat.pushColor(Color.grey(b).withAlpha(0.5f)); camera.draw(Layers.GROUND, Assets.quarry, getWorldPosition()); Assets.flat.popColor(); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java index 75f1aa5..58c2458 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java @@ -2,6 +2,7 @@ package xyz.valnet.hadean.gameobjects.worldobjects.constructions; import java.util.EnumSet; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.graphics.Tile16.Direction; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; @@ -58,14 +59,14 @@ public class Wall extends Buildable implements IItemReceiver, IWorkable, IPingab if(isBuilt()) { float b = 0.7f; - Assets.flat.pushColor(new Vector4f(b, b, b, 1f)); + Assets.flat.pushColor(Color.grey(b)); camera.draw(Layers.GROUND, Assets.wall.getTextureFor(wallSides), pos.x, pos.y); Assets.flat.popColor(); } else { float p = work / maxWork; float b = 4; - Assets.flat.pushColor(new Vector4f(b, b, b, 0.5f)); + Assets.flat.pushColor(Color.grey(b).withAlpha(0.5f)); camera.draw(Layers.GROUND, Assets.wall.getTextureFor(wallSides), pos.x, pos.y); Assets.flat.popColor(); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/Pawn.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/Pawn.java index 94195f5..644ea43 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/Pawn.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/Pawn.java @@ -5,6 +5,7 @@ import static xyz.valnet.hadean.util.detail.Detail.*; import java.util.ArrayList; import java.util.List; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; @@ -111,9 +112,9 @@ public class Pawn extends Agent { public void render() { super.render(); if(currentActivity instanceof SleepActivity) { - Assets.flat.pushColor(new Vector4f(0.5f, 0.5f, 0.5f, 1.0f)); + Assets.flat.pushColor(Color.grey(0.5f)); } else { - Assets.flat.pushColor(Vector4f.one); + Assets.flat.pushColor(Color.white); } camera.draw(Layers.PAWNS, Assets.pawn, getCalculatedPosition()); Assets.flat.popColor(); diff --git a/src/main/java/xyz/valnet/hadean/input/Button.java b/src/main/java/xyz/valnet/hadean/input/Button.java index 445bf62..82fb046 100644 --- a/src/main/java/xyz/valnet/hadean/input/Button.java +++ b/src/main/java/xyz/valnet/hadean/input/Button.java @@ -4,8 +4,10 @@ import static xyz.valnet.engine.util.Math.*; import java.util.List; +import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.graphics.Tile9; +import xyz.valnet.engine.math.Box; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4i; import xyz.valnet.engine.scenegraph.GameObject; @@ -80,10 +82,10 @@ public class Button extends GameObject implements IMouseCaptureArea, ITransient Assets.uiFrame.draw(box.x, box.y, box.z, box.w); } - Assets.flat.pushColor(Vector4f.black); + Assets.flat.pushColor(Color.black); Assets.font.drawString(text, 1 + x + (width - textWidth) / 2, 1 + y + (height - textHeight) / 2); - Assets.flat.swapColor(Vector4f.one); + Assets.flat.swapColor(Color.white); Assets.font.drawString(text, x + (width - textWidth) / 2, y + (height - textHeight) / 2); Assets.flat.popColor(); @@ -224,8 +226,8 @@ public class Button extends GameObject implements IMouseCaptureArea, ITransient } @Override - public List getGuiBoxes() { - return List.of(new Vector4f(x, y, width, height)); + public List getGuiBoxes() { + return List.of(new Box(x, y, width, height)); } @Override diff --git a/src/main/java/xyz/valnet/hadean/scenes/MenuScene.java b/src/main/java/xyz/valnet/hadean/scenes/MenuScene.java deleted file mode 100644 index 6c56576..0000000 --- a/src/main/java/xyz/valnet/hadean/scenes/MenuScene.java +++ /dev/null @@ -1,100 +0,0 @@ -package xyz.valnet.hadean.scenes; - -import xyz.valnet.engine.math.Vector4f; -import xyz.valnet.engine.scenegraph.IScene; -import xyz.valnet.hadean.input.Button; -import xyz.valnet.hadean.input.IButtonListener; -import xyz.valnet.hadean.util.Assets; -import xyz.valnet.hadean.util.Layers; - -import static xyz.valnet.hadean.HadeanGame.Hadean; - -// TODO convert this to a scenegraph -public class MenuScene implements IScene, IButtonListener { - - private Button btnNewGame = new Button(Assets.frame, "New Game", 50, 200, 128, 32, Layers.GENERAL_UI); - private Button btnLoadGame = new Button(Assets.frame, "Load Game", 50, 240, 128, 32, Layers.GENERAL_UI); - private Button btnOptions = new Button(Assets.frame, "Options", 50, 280, 128, 32, Layers.GENERAL_UI); - private Button btnQuit = new Button(Assets.frame, "Quit", 50, 320, 128, 32, Layers.GENERAL_UI); - - public MenuScene() { - btnNewGame.registerClickListener(this); - btnLoadGame.registerClickListener(this); - btnOptions.registerClickListener(this); - btnQuit.registerClickListener(this); - } - - public Vector4f green = new Vector4f(0.0f, 1.0f, 0.2f, 1.0f); - public Vector4f cyan = new Vector4f(0.1f, 0.7f, 1.0f, 1.0f); - public Vector4f yellow = new Vector4f(1.0f, 1.0f, 0.0f, 1.0f); - public Vector4f red = new Vector4f(1.0f, 0.1f, 0.1f, 1.0f); - - @Override - public void render() { - Assets.flat.pushColor(green); - btnNewGame.render(); - Assets.flat.swapColor(cyan); - btnLoadGame.render(); - Assets.flat.swapColor(yellow); - btnOptions.render(); - Assets.flat.swapColor(red); - btnQuit.render(); - Assets.flat.popColor(); - } - - @Override - public void update(float dTime) { - // btnNewGame.setMouseCoords(App.mouseX, App.mouseY); - // btnLoadGame.setMouseCoords(App.mouseX, App.mouseY); - // btnOptions.setMouseCoords(App.mouseX, App.mouseY); - // btnQuit.setMouseCoords(App.mouseX, App.mouseY); - btnNewGame.update(); - btnLoadGame.update(); - btnOptions.update(); - btnQuit.update(); - } - - @Override - public void click(Button target) { - if(target == btnNewGame) { - newGame(); - } else if(target == btnQuit) { - quit(); - } - } - - private void newGame() { - Hadean.changeScene(new GameScene()); - } - - private void quit() { - - } - - @Override - public void enable() { - - } - - @Override - public void disable() { - - } - - @Override - public void mouseDown(int button) { - btnNewGame.mouseDown(button); - btnLoadGame.mouseDown(button); - btnOptions.mouseDown(button); - btnQuit.mouseDown(button); - } - - @Override - public void mouseUp(int button) { - btnNewGame.mouseUp(button); - btnLoadGame.mouseUp(button); - btnOptions.mouseUp(button); - btnQuit.mouseUp(button); - } - -}