hs

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

commit 5173bff7ee7379b30d8ae33ca26246c566f85672
parent a6af23aa4467758aae01ec5e341e93e63a37f7b9
Author: Samdal <samdal@protonmail.com>
Date:   Tue,  5 Oct 2021 23:28:17 +0200

enteties, changed SP and vobj management

Diffstat:
Mhs_graphics.h | 170++++++++++++++++++++++++++++++++++++-------------------------------------------
1 file changed, 77 insertions(+), 93 deletions(-)

diff --git a/hs_graphics.h b/hs_graphics.h @@ -48,18 +48,10 @@ typedef struct { typedef struct { uint32_t p; - hs_vobj* vobj; + hs_vobj vobj; } hs_shader_program; -typedef struct { - uint32_t tex_unit, u_tex; -} hs_tex; - -typedef struct { - uint32_t p; - hs_vobj* vobj; - hs_tex tex; -} hs_shader_program_tex; +typedef uint32_t hs_tex; typedef struct { uint32_t model, view, proj; @@ -83,7 +75,8 @@ typedef hs_tex_corner hs_tex_square[6]; typedef struct { uint32_t width, height, tileset_width, tileset_height; float tile_width, tile_height; - hs_shader_program_tex sp; + hs_shader_program sp; + hs_tex tex; hs_tex_square* vertices; } hs_tilemap; @@ -113,22 +106,23 @@ typedef struct { } aabb2i; typedef struct { - vec2 pos, half_size, frame_velocity; - uint64_t flags; - hs_shader_program_tex sp; -} entity2_hot; + vec2 pos, half_size, frame_vel; + uint32_t flags; + hs_tex tex; + hs_shader_program sp; +} hs_entity2_hot; typedef struct { vec2 external_velocity; float base_mov_speed, mov_speed_mul, fire_rate_mul, invisframe_mul; uint16_t max_hp, hp, armour; void* current_room; //TODO: create room struct and stuff -} entity2_cold; +} hs_entity2_cold; typedef struct { - entity2_hot* hot; - entity2_cold cold; -} entity2; + hs_entity2_hot* hot; + hs_entity2_cold cold; +} hs_entity2; enum entity2_flags { AABB_STATIC = 1 << 0, @@ -183,11 +177,9 @@ extern uint32_t hs_fbo_color_create(const uint32_t width, const uint32_t height, extern void hs_fbo_draw_to_screen(const uint32_t fbo, const uint32_t src_w, const uint32_t src_h, const uint32_t dst_x, const uint32_t dst_y, const uint32_t dst_w, const uint32_t dst_h); extern void hs_sp_delete(hs_shader_program sp); -extern void hs_sp_tex_delete(hs_shader_program_tex sp); extern void hs_avg_frametime_print(const float delta, const float interval); extern void hs_avg_fps_print(const float delta, const float interval); -extern hs_shader_program hs_shader_program_create(const uint32_t sp, hs_vobj* vobj); -extern hs_shader_program_tex hs_shader_program_tex_create(const hs_shader_program sp, uint32_t tex_unit, const char* uniform_name); +extern hs_shader_program hs_shader_program_create(const uint32_t sp, hs_vobj vobj); extern void hs_tex_uniform_set(const hs_tex tex, const uint32_t val); extern void hs_tex2d_activate(const uint32_t texture_object, const GLenum texindex); @@ -235,7 +227,6 @@ extern void hs_tilemap_set(hs_tilemap* tilemap, const uint32_t vertex, uint32_t extern void hs_tilemap_setall(hs_tilemap* tilemap, const uint32_t tile); extern void hs_tilemap_set_xy(hs_tilemap* tilemap, const uint32_t x, const uint32_t y, uint32_t tile); extern uint32_t hs_tilemap_sizeof(const hs_tilemap tilemap); -// if vobj is NULL a new vobj will be created // expects width, height, sub_tex and half_tile to be filled out extern void hs_tilemap_init(hs_tilemap* tilemap, const uint32_t default_tex); extern void hs_tilemap_update_vbo(const hs_tilemap tilemap); @@ -250,12 +241,12 @@ extern void hs_aroom_set_tilemap(const hs_aroom aroom, hs_tilemap* tilemap, cons extern void hs_aroom_set_tilemap_offsetv(const hs_aroom aroom, hs_tilemap* tilemap, const uint16_t layer, const vec2i offset); /* Sprite stuff */ +extern void hs_sprite_transform(const hs_shader_program sprite, const mat4 trans); +extern void hs_sprite_perspective(const hs_shader_program sprite, const mat4 perspective); +extern hs_shader_program hs_sp_sprite_create(const float width, const float height, hs_game_data gd); +extern void hs_sprite_draw(const hs_shader_program sp); -// 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); +extern hs_entity2 hs_entity2_create(hs_entity2_hot* hot, hs_shader_program sp, hs_tex tex); /* Nuklear */ #ifdef HS_NUKLEAR @@ -270,11 +261,11 @@ extern uint32_t hs_vbo_create(const float *vbuff, const uint32_t buffsize, const GLenum usage, const uint32_t count); extern uint32_t hs_ebo_create(const uint32_t *ibuff, const uint32_t buffsize, const GLenum usage, const uint32_t count); -extern hs_vobj* hs_vobj_create(const float *vbuff, const uint32_t vbuffsize, +extern hs_vobj hs_vobj_create(const float *vbuff, const uint32_t vbuffsize, const uint32_t *ibuff, const uint32_t ibuffsize, const GLenum usage, const uint32_t count); // Expects vobj to be heap allocated -extern void hs_vobj_free(hs_vobj* vobj); +extern void hs_vobj_free(hs_vobj vobj); extern void hs_fps_callback_init(const hs_game_data gd, void(*mouse_callback)(GLFWwindow*, double xpos, double ypos)); #ifdef HS_IMPL @@ -378,7 +369,7 @@ inline void hs_sp_use(const hs_shader_program sp) { glUseProgram(sp.p); - glBindVertexArray(sp.vobj->vao); + glBindVertexArray(sp.vobj.vao); } unsigned char* @@ -582,7 +573,7 @@ hs_fbo_draw_to_screen(const uint32_t fbo, const uint32_t src_w, const uint32_t s } inline hs_shader_program -hs_shader_program_create(const uint32_t sp, hs_vobj* vobj) +hs_shader_program_create(const uint32_t sp, hs_vobj vobj) { return (hs_shader_program) { .p = sp, @@ -590,19 +581,6 @@ hs_shader_program_create(const uint32_t sp, hs_vobj* vobj) }; } -inline hs_shader_program_tex -hs_shader_program_tex_create(const hs_shader_program sp, uint32_t tex_unit, const char* uniform_name) -{ - return (hs_shader_program_tex) { - .p = sp.p, - .vobj = sp.vobj, - .tex = { - .tex_unit = tex_unit, - .u_tex = hs_uniform_create(sp.p, uniform_name) - } - }; -} - inline void hs_sp_delete(hs_shader_program sp) { @@ -611,14 +589,6 @@ hs_sp_delete(hs_shader_program sp) } inline void -hs_sp_tex_delete(hs_shader_program_tex sp) -{ - glDeleteProgram(sp.p); - hs_vobj_free(sp.vobj); - glDeleteTextures(1, &sp.tex.tex_unit); -} - -inline void hs_avg_frametime_print(const float delta, const float interval) { static float prev = 0.0f; @@ -655,9 +625,9 @@ hs_avg_fps_print(const float delta, const float interval) } inline void -hs_tex_uniform_set(const hs_tex tex, const uint32_t val) +hs_tex_uniform_set(const uint32_t u_tex, const uint32_t tex) { - glUniform1i(tex.u_tex, val); + glUniform1i(tex, tex); } inline void @@ -993,7 +963,7 @@ hs_tilemap_init(hs_tilemap* tilemap, const uint32_t default_tex) if (tilemap->tile_height <= 0.0f) tilemap->tile_height = 1.0f/tilemap->height; if (tilemap->tileset_width == 0) tilemap->tileset_width = 1; if (tilemap->tileset_height == 0) tilemap->tileset_height = 1; - if (tilemap->sp.tex.tex_unit == 0) tilemap->sp.tex.tex_unit = hs_default_missing_tex; + if (tilemap->tex == 0) tilemap->tex = hs_default_missing_tex; if (tilemap->vertices) { free(tilemap->vertices); @@ -1047,11 +1017,10 @@ hs_tilemap_init(hs_tilemap* tilemap, const uint32_t default_tex) } if (!tilemap->sp.p) { - hs_vobj* vobj = hs_vobj_create(castf(tilemap->vertices), hs_tilemap_sizeof(*tilemap), 0, 0, GL_DYNAMIC_DRAW, 1); - tilemap->sp = hs_shader_program_tex_create( - hs_shader_program_create(hs_sp_texture_transform_create(), vobj), - tilemap->sp.tex.tex_unit, "u_tex"); + hs_vobj vobj = hs_vobj_create(castf(tilemap->vertices), hs_tilemap_sizeof(*tilemap), 0, 0, GL_DYNAMIC_DRAW, 1); + tilemap->sp = hs_shader_program_create(hs_sp_texture_transform_create(), vobj); + hs_tex_uniform_set(hs_uniform_create(tilemap->sp.p, "u_tex"), 0); hs_tilemap_transform(*tilemap, (mat4)MAT4_IDENTITY); hs_tilemap_perspective(*tilemap, (mat4)MAT4_IDENTITY); @@ -1066,7 +1035,7 @@ hs_tilemap_init(hs_tilemap* tilemap, const uint32_t default_tex) inline void hs_tilemap_update_vbo(const hs_tilemap tilemap) { - glBindBuffer(GL_ARRAY_BUFFER, tilemap.sp.vobj->vbo); + glBindBuffer(GL_ARRAY_BUFFER, tilemap.sp.vobj.vbo); glBufferData(GL_ARRAY_BUFFER, hs_tilemap_sizeof(tilemap), castf(tilemap.vertices), GL_DYNAMIC_DRAW); } @@ -1074,7 +1043,7 @@ inline void hs_tilemap_draw(const hs_tilemap tilemap) { glUseProgram(tilemap.sp.p); - glBindVertexArray(tilemap.sp.vobj->vao); + glBindVertexArray(tilemap.sp.vobj.vao); glDrawArrays(GL_TRIANGLES, 0, 6 * tilemap.width * tilemap.height); } @@ -1082,21 +1051,28 @@ inline void hs_tilemap_free(hs_tilemap* tilemap) { free(tilemap->vertices); - hs_sp_tex_delete(tilemap->sp); + hs_sp_delete(tilemap->sp); + glDeleteTextures(1, &tilemap->tex); } inline void hs_tilemap_transform(const hs_tilemap tilemap, const mat4 trans) { + static int u_transform = -1; + if (u_transform < 0) u_transform = hs_uniform_create(tilemap.sp.p, "u_transform"); + glUseProgram(tilemap.sp.p); - glUniformMatrix4fv(0, 1, GL_FALSE, castf(trans)); + glUniformMatrix4fv(u_transform, 1, GL_FALSE, castf(trans)); } inline void hs_tilemap_perspective(const hs_tilemap tilemap, const mat4 perspective) { + static int u_perspective = -1; + if (u_perspective < 0) u_perspective = hs_uniform_create(tilemap.sp.p, "u_perspective"); + glUseProgram(tilemap.sp.p); - glUniformMatrix4fv(1, 1, GL_FALSE, castf(perspective)); + glUniformMatrix4fv(u_perspective, 1, GL_FALSE, castf(perspective)); } inline void @@ -1157,18 +1133,14 @@ hs_aroom_set_tilemap_offsetv(const hs_aroom aroom, hs_tilemap* tilemap, const ui } } -inline hs_shader_program_tex -hs_sprite_create(const char* texture, const GLenum colour_channel, hs_vobj* vobj, const hs_game_data gd) +inline hs_shader_program +hs_sp_sprite_create(const float width, const float height, hs_game_data gd) { - - int width, height; - uint32_t tex = hs_tex2d_create_size_info(texture, colour_channel, GL_REPEAT, GL_NEAREST, &width, &height); const float vertices[] = HS_DEFAULT_SQUARE_SCALED_TEX_VERT_ONLY( (float)width/(float)gd.width, (float)height/(float)gd.height); - if (!vobj) vobj = hs_vobj_create(vertices, sizeof(vertices), 0, 0, GL_STATIC_DRAW, 1); - const hs_shader_program_tex sp = hs_shader_program_tex_create( - hs_shader_program_create(hs_sp_texture_transform_create(), vobj), tex, "u_tex"); + hs_vobj vobj = hs_vobj_create(vertices, sizeof(vertices), 0, 0, GL_STATIC_DRAW, 1); + const hs_shader_program sp = hs_shader_program_create(hs_sp_texture_transform_create(), vobj); hs_vattrib_enable_float(0, 2, 4, 0); hs_vattrib_enable_float(1, 2, 4, 2); @@ -1180,27 +1152,41 @@ hs_sprite_create(const char* texture, const GLenum colour_channel, hs_vobj* vobj } inline void -hs_sprite_transform(const hs_shader_program_tex sprite, const mat4 trans) +hs_sprite_transform(const hs_shader_program sprite, const mat4 trans) { + static int u_transform = -1; + if (u_transform < 0) u_transform = hs_uniform_create(sprite.p, "u_transform"); + glUseProgram(sprite.p); - glUniformMatrix4fv(0, 1, GL_FALSE, castf(trans)); + glUniformMatrix4fv(u_transform, 1, GL_FALSE, castf(trans)); } inline void -hs_sprite_perspective(const hs_shader_program_tex sprite, const mat4 perspective) +hs_sprite_perspective(const hs_shader_program sprite, const mat4 perspective) { + static int u_perspective = -1; + if (u_perspective < 0) u_perspective = hs_uniform_create(sprite.p, "u_perspective"); + glUseProgram(sprite.p); - glUniformMatrix4fv(1, 1, GL_FALSE, castf(perspective)); + glUniformMatrix4fv(u_perspective, 1, GL_FALSE, castf(perspective)); } inline void -hs_sprite_draw(const hs_shader_program_tex sp) +hs_sprite_draw(const hs_shader_program sp) { - glUseProgram(sp.p); - glBindVertexArray(sp.vobj->vao); + //glUseProgram(sp.p); + //glBindVertexArray(sp.vobj.vao); glDrawArrays(GL_TRIANGLES, 0, 6); } +inline hs_entity2 +hs_entity2_create(hs_entity2_hot* hot, hs_shader_program sp, hs_tex tex) +{ + hot->sp = sp; + hot->tex = tex; + return (hs_entity2){.hot = hot}; +} + #ifdef HS_NUKLEAR #ifndef NO_STBI inline struct nk_image @@ -1247,28 +1233,26 @@ hs_ebo_create(const uint32_t *ibuff, const uint32_t buffsize, const GLenum usage return ebo; } -inline hs_vobj* +inline hs_vobj hs_vobj_create(const float *vbuff, const uint32_t vbuffsize, const uint32_t *ibuff, const uint32_t ibuffsize, const GLenum usage, const uint32_t count) { - hs_vobj* vobj = malloc(sizeof(hs_vobj)); - assert(vobj); - vobj->vbo = hs_vbo_create(vbuff, vbuffsize, usage, count); - vobj->ebo = hs_ebo_create(ibuff, ibuffsize, usage, count); - vobj->vao = hs_vao_create(count); - vobj->count = count; + hs_vobj vobj; + vobj.vbo = hs_vbo_create(vbuff, vbuffsize, usage, count); + vobj.ebo = hs_ebo_create(ibuff, ibuffsize, usage, count); + vobj.vao = hs_vao_create(count); + vobj.count = count; return vobj; } inline void -hs_vobj_free(hs_vobj* vobj) +hs_vobj_free(hs_vobj vobj) { - glDeleteVertexArrays(vobj->count, &vobj->vao); - if (vobj->ebo) - glDeleteBuffers(vobj->count, &vobj->ebo); - glDeleteBuffers(vobj->count, &vobj->vbo); - free(vobj); + glDeleteVertexArrays(vobj.count, &vobj.vao); + if (vobj.ebo) + glDeleteBuffers(vobj.count, &vobj.ebo); + glDeleteBuffers(vobj.count, &vobj.vbo); } inline void