depth testing & poorly rendered trees
parent
a35182e368
commit
42a234c810
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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() {}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<ITileThing> stuff = new ArrayList<ITileThing>();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
package xyz.valnet.hadean.gameobjects;
|
||||
|
||||
public interface ITileThing {
|
||||
public boolean isWalkable();
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -13,6 +13,7 @@ public class GameScene implements IScene {
|
|||
|
||||
// generic
|
||||
private List<GameObject> objects = new ArrayList<GameObject>();
|
||||
private List<GameObject> newObjects = new ArrayList<GameObject>();
|
||||
// private List<IRenderable> renderables = new ArrayList<IRenderable>();
|
||||
|
||||
// specific
|
||||
|
|
@ -35,6 +36,20 @@ public class GameScene implements IScene {
|
|||
|
||||
@Override
|
||||
public void update(float dTime) {
|
||||
if(!newObjects.isEmpty()) {
|
||||
List<GameObject> added = new ArrayList<GameObject>();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<Character, Sprite> charset = new HashMap<Character, Sprite>();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue