hs

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | LICENSE

commit 8a70db481ae574b840ffbb89fd53378d8522010c
parent ee7aa64e15bf763fa358841c7a3041a1bfa8f284
Author: Samdal <samdal@protonmail.com>
Date:   Sat, 28 Aug 2021 22:52:09 +0200

key state and more nuklear helper functions

Diffstat:
Mhs_graphics.h | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 102 insertions(+), 8 deletions(-)

diff --git a/hs_graphics.h b/hs_graphics.h @@ -40,8 +40,7 @@ #include "hs_math.h" #include "hs_data.h" - -#define hs_loop(game_data, update_func) while(hs_window_up(game_data)) {update_func; hs_end_frame(game_data);} +#define hs_key_init(glfw_key) &(hs_key){.key = glfw_key} typedef struct { uint32_t count, vbo, vao, ebo; @@ -130,9 +129,22 @@ enum entity2_flags { stunned = 1 << 7, }; +enum hs_key_state { + HS_KEY_UP, + HS_KEY_RELEASED, + HS_KEY_PRESSED, + HS_KEY_DOWN, +}; + +typedef struct { + const int key; + int previous_state; +} hs_key; + extern void hs_close(const hs_game_data gd); extern int32_t hs_window_up(const hs_game_data gd); -extern int32_t hs_get_key(const hs_game_data gd, const int key); +extern enum hs_key_state hs_get_key_toggle(const hs_game_data gd, hs_key* key); +extern enum hs_key_state hs_get_key_held(const hs_game_data gd, const int key); extern void hs_clear(const float r, const float g, const float b, const float a, const GLbitfield mask); extern void hs_vattrib_enable(const uint32_t index, const uint32_t size, const GLenum type, const uint32_t stride, const size_t pointer); @@ -213,12 +225,19 @@ extern void hs_tilemap_free(hs_tilemap* tilemap); extern void hs_tilemap_transform(const hs_tilemap tilemap, const mat4 trans); extern void hs_tilemap_perspective(const hs_tilemap tilemap, const mat4 perspective); +/* Sprite stuff */ + // if vobj is NULL a new vobj will be created extern void hs_sprite_transform(const hs_shader_program_tex sprite, const mat4 trans); extern void hs_sprite_perspective(const hs_shader_program_tex sprite, const mat4 perspective); extern hs_shader_program_tex hs_sprite_create(const char* texture, const GLenum colour_channel, hs_vobj* vobj, const hs_game_data gd); extern void hs_sprite_draw(const hs_shader_program_tex sp); +/* Nuklear */ + +extern struct nk_image hs_nk_image_load(const char *filename); +extern struct nk_image hs_nk_image_load_size_info(const char *filename, int* width, int* height); + extern uint32_t hs_create_vao(const uint32_t count); extern uint32_t hs_vbo_create(const float *vbuff, const uint32_t buffsize, const GLenum usage, const uint32_t count); @@ -237,6 +256,8 @@ extern void hs_fps_callback_init(const hs_game_data gd, void(*mouse_callback)(GL #define GLFW_IMPL #include "external/glfw/glfw_impl.h" +#define hs_loop(game_data, update_func) while(hs_window_up(game_data)) {hs_poll_input(); update_func; hs_end_frame(game_data);} + inline void hs_clear(const float r, const float g, const float b, const float a, const GLbitfield mask) { @@ -261,10 +282,28 @@ hs_uniform_coord_create(const uint32_t program, }; } -inline int -hs_get_key(const hs_game_data gd, const int key) +inline enum hs_key_state +hs_get_key_toggle(const hs_game_data gd, hs_key* key) +{ + const int state = glfwGetKey(gd.window, key->key); + const int previous_state = key->previous_state; + key->previous_state = state; + + if (previous_state != state) { + if (state == GLFW_PRESS) return HS_KEY_PRESSED; + else return HS_KEY_RELEASED; + } + + return HS_KEY_UP; +} + +inline enum hs_key_state +hs_get_key_held(const hs_game_data gd, const int key) { - return glfwGetKey(gd.window, key); + const int state = glfwGetKey(gd.window, key); + if (state == GLFW_PRESS) + return HS_KEY_DOWN; + return HS_KEY_UP; } inline int @@ -416,7 +455,7 @@ hs_sp_create_from_file(const char *v_file, const char *f_file) } inline uint32_t -hs_fbo_resize_color_create(const uint32_t width, const uint32_t height, uint32_t* tex) +hs_fbo_color_create(const uint32_t width, const uint32_t height, uint32_t* tex) { uint32_t fbo; glGenFramebuffers(1, &fbo); @@ -964,6 +1003,56 @@ hs_sprite_draw(const hs_shader_program_tex sp) glDrawArrays(GL_TRIANGLES, 0, 6); } +struct nk_image +hs_nk_image_load(const char *filename) +{ + int width, height, nr_channels; + unsigned char* texture_data = stbi_load(filename, &width, &height, &nr_channels, 0); + if (!texture_data) { + fprintf(stderr, "---error loading texture \"%s\"--\n", filename); + assert(texture_data); + } + + GLuint tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_data); + glGenerateMipmap(GL_TEXTURE_2D); + + stbi_image_free(texture_data); + + return nk_image_id((int)tex); +} + +struct nk_image +hs_nk_image_load_size_info(const char *filename, int* width, int* height) +{ + int nr_channels; + unsigned char* texture_data = stbi_load(filename, width, height, &nr_channels, 0); + if (!texture_data) { + fprintf(stderr, "---error loading texture \"%s\"--\n", filename); + assert(texture_data); + } + + GLuint tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, *width, *height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_data); + glGenerateMipmap(GL_TEXTURE_2D); + + stbi_image_free(texture_data); + + return nk_image_id((int)tex); +} + inline uint32_t hs_create_vao(const uint32_t count) { @@ -1075,10 +1164,15 @@ hs_init(hs_game_data* gd, const char *name, void(*framebuffer_size_callback)(GLF } inline static void +hs_poll_input() +{ + glfwPollEvents(); +} + +inline static void hs_end_frame(const hs_game_data gd) { glfwSwapBuffers(gd.window); - glfwPollEvents(); } inline static void