diff --git a/shaders/flat.frag b/shaders/flat.frag index 3346114..b457327 100644 --- a/shaders/flat.frag +++ b/shaders/flat.frag @@ -7,8 +7,8 @@ varying vec2 vTexCoord; void main() { vec4 texColor = texture2D(u_texture, vTexCoord); - if(texColor == vec4(1, 0, 1, 1) || texColor == vec4(1, 0, 0, 1)) { - gl_FragColor = vec4(0, 0, 0, 0); + if(texColor == vec4(1, 0, 1, 1) || texColor == vec4(1, 0, 0, 1) || texColor.w == 0) { + discard; } else { gl_FragColor = texColor * vColor; } diff --git a/shaders/flat.vert b/shaders/flat.vert index e9a2591..644b39b 100644 --- a/shaders/flat.vert +++ b/shaders/flat.vert @@ -3,7 +3,7 @@ uniform mat4 uProjection; uniform vec4 uColor; //"in" attributes from our SpriteBatch -attribute vec2 Position; +attribute vec3 Position; attribute vec2 TexCoord; //"out" varyings to our fragment shader @@ -13,5 +13,5 @@ varying vec2 vTexCoord; void main() { vColor = uColor; vTexCoord = TexCoord; - gl_Position = uProjection * vec4(Position, 0.0, 1.0); + gl_Position = uProjection * vec4(Position, 1.0); } \ 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 da322c6..66b35ed 100644 --- a/src/main/java/xyz/valnet/engine/App.java +++ b/src/main/java/xyz/valnet/engine/App.java @@ -20,7 +20,7 @@ public class App { // The window handle private long window; private int width = 1024, height = 576; - private Matrix4f matrix = Matrix4f.orthographic(0, width, height, 0, 1, -1); + private Matrix4f matrix = Matrix4f.orthographic(0, width, height, 0, 0, 100); public static int mouseX, mouseY; public static boolean mouseLeft, mouseMiddle, mouseRight; @@ -126,6 +126,9 @@ public class App { glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + glDepthMask(true); game.start(); } diff --git a/src/main/java/xyz/valnet/engine/graphics/Drawing.java b/src/main/java/xyz/valnet/engine/graphics/Drawing.java index 00eacf7..0d9dee3 100644 --- a/src/main/java/xyz/valnet/engine/graphics/Drawing.java +++ b/src/main/java/xyz/valnet/engine/graphics/Drawing.java @@ -18,7 +18,11 @@ public class Drawing { Drawing.layer = layer; } - public static void drawSprite(Sprite sprite, int x, int y, int width, int height) { + public static void drawSprite(Sprite sprite, int x, int y, int w, int h) { + drawSprite(sprite, x, y, w, h, 0); + } + + public static void drawSprite(Sprite sprite, int x, int y, int width, int height, float lift) { // lazy texture binding if(bound != sprite.atlas) { if(bound != null) bound.unbind(); @@ -27,10 +31,10 @@ public class Drawing { glBegin(GL_QUADS); glVertexAttrib2f(SimpleShader.TEX_COORD, sprite.sourceBoxUV.x, sprite.sourceBoxUV.y); - glVertex3f(x, y, layer); + glVertex3f(x, y, layer + height * lift); glVertexAttrib2f(SimpleShader.TEX_COORD, sprite.sourceBoxUV.x + sprite.sourceBoxUV.z, sprite.sourceBoxUV.y); - glVertex3f(x + width, y, layer); + glVertex3f(x + width, y, layer + height * lift); glVertexAttrib2f(SimpleShader.TEX_COORD, sprite.sourceBoxUV.x + sprite.sourceBoxUV.z, sprite.sourceBoxUV.y + sprite.sourceBoxUV.w); glVertex3f(x + width, y + height, layer); diff --git a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java index 11671f2..d324939 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java @@ -3,9 +3,9 @@ package xyz.valnet.engine.scenegraph; import xyz.valnet.hadean.scenes.GameScene; public class GameObject implements IRenderable, ITickable { - private final GameScene scene; + private GameScene scene; - public GameObject(GameScene scene) { + public void link(GameScene scene) { this.scene = scene; } @@ -13,6 +13,10 @@ public class GameObject implements IRenderable, ITickable { return this.scene.get(clazz); } + protected final void add(GameObject obj) { + scene.add(obj); + } + @Override public void render() {} diff --git a/src/main/java/xyz/valnet/hadean/Tile.java b/src/main/java/xyz/valnet/hadean/Tile.java index 325077d..3f12511 100644 --- a/src/main/java/xyz/valnet/hadean/Tile.java +++ b/src/main/java/xyz/valnet/hadean/Tile.java @@ -1,35 +1,55 @@ package xyz.valnet.hadean; +import java.util.ArrayList; +import java.util.List; + +import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.graphics.Sprite; import xyz.valnet.engine.math.Vector4f; +import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.hadean.gameobjects.Camera; +import xyz.valnet.hadean.gameobjects.ITileThing; +import xyz.valnet.hadean.gameobjects.Tree; import xyz.valnet.hadean.util.Assets; // TODO make these tiles REAL gameobjects... -public class Tile { +public class Tile extends GameObject { + + private Camera camera; + private final int x, y; private final Vector4f color = new Vector4f((float) Math.random() * 0.1f, 0.4f + (float) Math.random() * 0.15f, (float) Math.random() * 0.05f, 1f); private final Sprite sprite = Assets.defaultTerrain[(int)Math.floor(Math.random() * Assets.defaultTerrain.length)]; - private boolean obstacle; + + private List stuff = new ArrayList(); public Tile(int x, int y) { this.x = x; this.y = y; - this.obstacle = false; - // this.obstacle = Math.random() > 0.8f; } - public void render(Camera camera) { - Assets.flat.pushColor(isWalkable() ? color : new Vector4f(0.1f, 0.1f, 0.1f, 1f)); + public void start() { + camera = get(Camera.class); + + if(Math.random() > 0.98) { + Tree tree = new Tree(x, y); + stuff.add(tree); + add(tree); + } + } + + @Override + public void render() { + Drawing.setLayer(2f); + Assets.flat.pushColor(color); camera.draw(sprite, x, y); Assets.flat.popColor(); } - public void wall() { - obstacle = true; - } - public boolean isWalkable() { - return !obstacle; + for(ITileThing thing : stuff) { + if(!thing.isWalkable()) return false; + } + return true; } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java index 5a21512..d160b83 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java @@ -4,7 +4,6 @@ import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.graphics.Sprite; import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.scenegraph.GameObject; -import xyz.valnet.hadean.scenes.GameScene; public class Camera extends GameObject { @@ -14,10 +13,6 @@ public class Camera extends GameObject { private Vector2f focus = new Vector2f(0, 0); - public Camera(GameScene scene) { - super(scene); - } - public void focus(float x, float y) { this.focus.x = x; this.focus.y = y; @@ -31,5 +26,10 @@ public class Camera extends GameObject { Vector2f screenPos = world2screen(x, y); Drawing.drawSprite(sprite, (int)(screenPos.x), (int)(screenPos.y), tileWidth, tileWidth); } + + public void draw(Sprite sprite, float x, float y, float w, float h) { + Vector2f screenPos = world2screen(x, y); + Drawing.drawSprite(sprite, (int)(screenPos.x), (int)(screenPos.y), (int)(tileWidth * w), (int)(tileWidth * h)); + } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/ITileThing.java b/src/main/java/xyz/valnet/hadean/gameobjects/ITileThing.java new file mode 100644 index 0000000..1dafb8c --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/gameobjects/ITileThing.java @@ -0,0 +1,5 @@ +package xyz.valnet.hadean.gameobjects; + +public interface ITileThing { + public boolean isWalkable(); +} diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java b/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java index ea7487d..43a860b 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java @@ -32,10 +32,6 @@ public class Pawn extends GameObject { private Terrain terrain; private IPathfinder pathfinder; - public Pawn(GameScene scene) { - super(scene); - } - @Override public void start() { camera = get(Camera.class); @@ -46,7 +42,7 @@ public class Pawn extends GameObject { @Override public void render() { - Drawing.setLayer(0.5f); + Drawing.setLayer(3f); if(path != null && !path.isComplete()) { Node next = path.peek(); @@ -128,8 +124,6 @@ public class Pawn extends GameObject { x = nextNode.x + 0.5f; y = nextNode.y + 0.5f; counter = 0; - - nextTile.wall(); } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java b/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java index 16e9c4d..5872949 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java @@ -18,14 +18,11 @@ public class Terrain extends GameObject implements IPathable { private Camera camera; - public Terrain(GameScene scene) { - super(scene); - } - public void start() { for (int i = 0; i < WORLD_SIZE; i++) { for (int j = 0; j < WORLD_SIZE; j++) { tiles[i][j] = new Tile(i, j); + add(tiles[i][j]); } } camera = get(Camera.class); @@ -42,12 +39,12 @@ public class Terrain extends GameObject implements IPathable { // left = 400 - (WORLD_SIZE * TILE_SIZE / 2); // top = 225 - (WORLD_SIZE * TILE_SIZE / 2); - Drawing.setLayer(0f); - for (int i = 0; i < WORLD_SIZE; i++) { - for (int j = 0; j < WORLD_SIZE; j++) { - tiles[i][j].render(camera); - } - } + // Drawing.setLayer(0f); + // for (int i = 0; i < WORLD_SIZE; i++) { + // for (int j = 0; j < WORLD_SIZE; j++) { + // tiles[i][j].render(camera); + // } + // } } @Override diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Tree.java b/src/main/java/xyz/valnet/hadean/gameobjects/Tree.java new file mode 100644 index 0000000..726db93 --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Tree.java @@ -0,0 +1,29 @@ +package xyz.valnet.hadean.gameobjects; + +import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.util.Assets; + +public class Tree extends GameObject implements ITileThing { + private Camera camera; + + private int x, y; + + public Tree(int x, int y) { + this.x = x; + this.y = y; + } + + public void start() { + camera = get(Camera.class); + } + + @Override + public void render() { + camera.draw(Assets.tree, x - 1, y - 2, 3, 3); + } + + @Override + public boolean isWalkable() { + return false; + } +} diff --git a/src/main/java/xyz/valnet/hadean/scenes/GameScene.java b/src/main/java/xyz/valnet/hadean/scenes/GameScene.java index 4d2e964..f271908 100644 --- a/src/main/java/xyz/valnet/hadean/scenes/GameScene.java +++ b/src/main/java/xyz/valnet/hadean/scenes/GameScene.java @@ -13,6 +13,7 @@ public class GameScene implements IScene { // generic private List objects = new ArrayList(); + private List newObjects = new ArrayList(); // private List renderables = new ArrayList(); // specific @@ -35,6 +36,20 @@ public class GameScene implements IScene { @Override public void update(float dTime) { + if(!newObjects.isEmpty()) { + List added = new ArrayList(); + + for(GameObject obj : newObjects) { + objects.add(obj); + added.add(obj); + } + newObjects.clear(); + + for(GameObject obj : added) { + obj.start(); + } + } + for(GameObject obj : objects) { obj.tick(dTime); } @@ -42,13 +57,17 @@ public class GameScene implements IScene { @Override public void enable() { - objects.add(new Terrain(this)); + objects.add(new Terrain()); for(int i = 0; i < 3; i ++) { - objects.add(new Pawn(this)); + objects.add(new Pawn()); } - Camera camera = new Camera(this); + Camera camera = new Camera(); objects.add(camera); + for(GameObject obj : objects) { + obj.link(this); + } + for(GameObject obj : objects) { obj.start(); } @@ -58,5 +77,10 @@ public class GameScene implements IScene { public void disable() { objects.clear(); } + + public void add(GameObject obj) { + newObjects.add(obj); + obj.link(this); + } } diff --git a/src/main/java/xyz/valnet/hadean/util/Assets.java b/src/main/java/xyz/valnet/hadean/util/Assets.java index 869389e..bf359c5 100644 --- a/src/main/java/xyz/valnet/hadean/util/Assets.java +++ b/src/main/java/xyz/valnet/hadean/util/Assets.java @@ -20,6 +20,7 @@ public class Assets { public static final Sprite[] defaultTerrain; public static final Sprite pawn; + public static final Sprite tree; public static final SimpleShader flat; @@ -36,6 +37,7 @@ public class Assets { }; pawn = new Sprite(atlas, 48, 88, 8, 8); + tree = new Sprite(atlas, 64, 64, 24, 24); Map charset = new HashMap();