diff --git a/examples/gsa_simple.c b/examples/gsa_simple.c index 5886bfd..706601f 100644 --- a/examples/gsa_simple.c +++ b/examples/gsa_simple.c @@ -1,19 +1,27 @@ #include void init() { - sprites[0].tile = 2; - sprites[0].x = 10; - sprites[0].y = 10; + i32 x, y; - sprites[1].tile = 3; - sprites[1].x = 10; - sprites[1].y = 100; + for(y = 0; y < 11; ++y) { + for(x = 0; x < 19; ++x) { + maps[0].tiles[x][y] = 0x1000; + } + } - maps[0].tiles[20][1] = 1; + for(y = 0; y < 11; y += 2) { + maps[0].tiles[0][y] = 0x1101; + maps[0].tiles[1][y] = 0x1102; + maps[0].tiles[0][y + 1] = 0x1201; + maps[0].tiles[1][y + 1] = 0x1202; + + maps[0].tiles[17][y] = 0x1101; + maps[0].tiles[18][y] = 0x1102; + maps[0].tiles[17][y + 1] = 0x1201; + maps[0].tiles[18][y + 1] = 0x1202; + } } void tick() { sprites[0].x += 1; - sprites[1].x += 0; - maps[0].scrollx += 1; } diff --git a/gfx.png b/gfx.png index c4c6ba5..36b7784 100644 Binary files a/gfx.png and b/gfx.png differ diff --git a/include/gamepad.h b/include/gamepad.h new file mode 100644 index 0000000..6e1a052 --- /dev/null +++ b/include/gamepad.h @@ -0,0 +1,22 @@ +#ifndef GUARD_F8BB6BA29F6FB6745AF8B6E15CD1C086 +#define GUARD_F8BB6BA29F6FB6745AF8B6E15CD1C086 + +#include "gamepad.h" +#include "types.h" + +#define SW_MAX_GAMEPADS 4 +#define SW_MAX_GAMEPAD_AXES 4 +#define SW_MAX_GAMEPAD_BUTTONS 14 + +struct sw_gamepad { + f32 axes[SW_MAX_GAMEPAD_AXES]; + bool button_down; + bool button_pressed; +}; + +extern struct sw_gamepad sw_gamepads[SW_MAX_GAMEPADS]; + +void sw_gamepad_static_init(); +void sw_gamepad_tick(); + +#endif /* GUARD_F8BB6BA29F6FB6745AF8B6E15CD1C086 */ diff --git a/meson.build b/meson.build index ab52642..9bbf7c1 100644 --- a/meson.build +++ b/meson.build @@ -44,6 +44,7 @@ skunk_sources = [ 'src/error.c', 'src/file.c', 'src/framebuffer.c', + 'src/gamepad.c', 'src/gsa.c', 'src/image32.c', 'src/image8.c', diff --git a/src/gamepad.c b/src/gamepad.c new file mode 100644 index 0000000..63c3b4f --- /dev/null +++ b/src/gamepad.c @@ -0,0 +1,28 @@ +#include "gamepad.h" +#include "GLFW/glfw3.h" +#include "string.h" + +struct sw_gamepad sw_gamepads[SW_MAX_GAMEPADS]; + +void sw_gamepad_static_init() { + memset(sw_gamepads, 0, sizeof(sw_gamepads)); +} + +void sw_gamepad_tick() { + i32 i, j; + GLFWgamepadstate state; + + for(i = 0; i < SW_MAX_GAMEPADS; ++i) { + if(glfwGetGamepadState(i, &state)) { + for(j = 0; j < SW_MAX_GAMEPAD_AXES; ++j) { + sw_gamepads[i].axes[j] = state.axes[j]; + } + for(j = 0; j < SW_MAX_GAMEPAD_BUTTONS; ++j) { + bool down = state.buttons[j]; + sw_gamepads[i].button_pressed = + !sw_gamepads[i].button_pressed && down; + sw_gamepads[i].button_down = down; + } + } + } +} diff --git a/src/gsa.c b/src/gsa.c index 2c6b584..71cfbb4 100644 --- a/src/gsa.c +++ b/src/gsa.c @@ -44,7 +44,7 @@ static struct sw_shaderprogram program; static u32 vbo, vao; -#define MAX_RENDER_VERTS 60 +#define MAX_RENDER_VERTS 10000 struct render_vert { f32 x, y, tx, ty; diff --git a/src/window.c b/src/window.c index c7c1612..26eb354 100644 --- a/src/window.c +++ b/src/window.c @@ -7,6 +7,7 @@ #include "GLFW/glfw3.h" #include "error.h" #include "framebuffer.h" +#include "gamepad.h" #include "scaler.h" #include "shaders.h" #include "vec2i.h" @@ -52,8 +53,9 @@ struct sw_window *sw_window_create(struct sw_vec2i size, char *title) { sw_log("setup ogl defaults"); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); - glEnable(GL_DEPTH_TEST); + /* glEnable(GL_DEPTH_TEST); */ + sw_gamepad_static_init(); sw_shaders_static_init(); sw_framebuffer_static_init(); /* TODO: move elsewhere */ win->_scaler_fb = sw_framebuffer_create(size);