hs

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

commit 6d612a88bfd6e74417b324a6e4a8f194045c57a0
parent 2445b043b6ae7e0605afc9e7f2f9e8c5a26154fd
Author: Samdal <samdal@protonmail.com>
Date:   Sat,  4 Sep 2021 00:46:19 +0200

aroom file saving / loading

Diffstat:
Mhs_graphics.h | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 120 insertions(+), 13 deletions(-)

diff --git a/hs_graphics.h b/hs_graphics.h @@ -88,13 +88,18 @@ typedef struct { } hs_tilemap; // this is how anders tale rooms are stored -// in the future a system to add layers must be made +// --IMPORTANT: LAYERS MUST BE AT LEAST 1 :IMPORTANT-- typedef struct { - uint16_t width, height; - uint16_t* data; + uint16_t width, height, layers; + uint8_t* data; } hs_aroom; typedef struct { + uint32_t size, position_offset; + uint8_t* data; +} hs_byte_buffer; + +typedef struct { uint32_t width, height; GLFWwindow* window; } hs_game_data; @@ -164,7 +169,10 @@ extern hs_coord hs_uniform_coord_create(const uint32_t program, extern float hs_delta(); extern void hs_sp_use(const hs_shader_program sp); -extern char* hs_file_read(const char *file_path); +extern unsigned char* hs_file_read(const char *file_path); +extern hs_byte_buffer hs_byte_buffer_from_file(const char* file_path); +extern hs_aroom hs_aroom_from_file(const char* file_path); +extern void hs_aroom_write_to_file(const char* file_path, const hs_aroom aroom); extern uint32_t hs_shader_create(const char *src, const GLenum shader_type); extern uint32_t hs_sp_create(const uint32_t v_shader, const uint32_t f_shader); extern uint32_t hs_sp_texture_transform_create(); @@ -233,7 +241,9 @@ 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); extern void hs_aroom_set_xy(hs_aroom* aroom, const uint16_t x, const uint16_t y, const uint16_t data); -extern uint16_t hs_aroom_get_xy(const hs_aroom aroom, const uint16_t x, const uint16_t y); +extern void hs_aroom_to_tilemap(const hs_aroom aroom, hs_tilemap* tilemap, const uint16_t layer); +extern uint8_t hs_aroom_get_xy(const hs_aroom aroom, const uint16_t x, const uint16_t y); +extern void hs_aroom_set_tilemap(const hs_aroom aroom, hs_tilemap* tilemap, const uint16_t layer); /* Sprite stuff */ @@ -365,12 +375,12 @@ hs_sp_use(const hs_shader_program sp) glBindVertexArray(sp.vobj->vao); } -char* +unsigned char* hs_file_read(const char *file_path) { FILE *file = fopen(file_path, "r"); if (!file) { - fprintf(stderr, "---error reading file \"%s\"--\n", file_path); + fprintf(stderr, "---error reading file \"%s\"---\n", file_path); assert(file); } @@ -378,7 +388,7 @@ hs_file_read(const char *file_path) uint32_t readsize = ftell(file); rewind(file); - char *buffer = malloc(readsize); + unsigned char* buffer = malloc(readsize); assert(buffer); fread(buffer, 1, readsize, file); @@ -388,6 +398,70 @@ hs_file_read(const char *file_path) return buffer; } +inline hs_byte_buffer +hs_byte_buffer_from_file(const char* file_path) +{ + /* same as hs_file_read, just need the "readsize" information */ + FILE *file = fopen(file_path, "r"); + if (!file) { + fprintf(stderr, "---error reading file \"%s\"---\n", file_path); + assert(file); + } + + fseek(file, 0L, SEEK_END); + uint32_t readsize = ftell(file); + rewind(file); + + unsigned char* buffer = malloc(readsize); + assert(buffer); + + fread(buffer, 1, readsize, file); + buffer[readsize] = '\0'; + + fclose(file); + + return (hs_byte_buffer){ + .size = readsize, + .data = buffer, + }; +} + +hs_aroom +hs_aroom_from_file(const char* file_path) +{ + uint8_t* data = hs_file_read(file_path); + uint16_t* header = (uint16_t*)data; + hs_aroom aroom; + aroom.width = header[0]; + aroom.height = header[1]; + aroom.layers = header[2] == 0 ? 1 : header[2]; + + uint8_t* aroom_data = (uint8_t*)malloc(aroom.width * aroom.height * aroom.layers); + assert(aroom_data); + memcpy(aroom_data, &data[sizeof(uint16_t)*3], aroom.width * aroom.height * aroom.layers); + free(data); + + aroom.data = aroom_data; + return aroom; +} + +void +hs_aroom_write_to_file(const char* file_path, const hs_aroom aroom) +{ + uint16_t layers = aroom.layers == 0 ? 1 : aroom.layers; + FILE *file = fopen(file_path, "wb"); + if (!file) { + fprintf(stderr, "---error writing to file \"%s\"---\n", file_path); + assert(file); + } + + fwrite(&aroom.width, sizeof(uint16_t), 1, file); + fwrite(&aroom.height, sizeof(uint16_t), 1, file); + fwrite(&layers, sizeof(uint16_t), 1, file); + fwrite(aroom.data, aroom.width * aroom.height * layers, 1, file); + fclose(file); +} + uint32_t hs_shader_create(const char *src, const GLenum shader_type) { @@ -456,8 +530,8 @@ hs_sp_create_from_src(const char *v_src, const char *f_src) uint32_t hs_sp_create_from_file(const char *v_file, const char *f_file) { - char *v_src = hs_file_read(v_file); - char *f_src = hs_file_read(f_file); + unsigned char *v_src = hs_file_read(v_file); + unsigned char *f_src = hs_file_read(f_file); uint32_t sp = hs_sp_create_from_src(v_src, f_src); @@ -894,8 +968,8 @@ hs_tilemap_init(hs_tilemap* tilemap, uint32_t texture, const uint32_t default_te { assert(tilemap->width); assert(tilemap->height); - assert(tilemap->tile_width > 0.0f); - assert(tilemap->tile_height > 0.0f); + if (tilemap->tile_width <= 0.0f) tilemap->tile_width = 1.0f/tilemap->width; + 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 (texture == 0) texture = hs_default_missing_tex; @@ -1009,12 +1083,45 @@ hs_aroom_set_xy(hs_aroom* aroom, const uint16_t x, const uint16_t y, const uint1 aroom->data[x + y * aroom->width] = data; } -inline uint16_t +void +hs_aroom_to_tilemap(const hs_aroom aroom, hs_tilemap* tilemap, const uint16_t layer) +{ + tilemap->width = aroom.width; + tilemap->height = aroom.height; + hs_tilemap_init(tilemap, tilemap->sp.tex.tex_unit, 0); + + if (tilemap->tileset_width * tilemap->tileset_width == 1) + return; + + hs_aroom_set_tilemap(aroom, tilemap, layer); +} + +inline uint8_t hs_aroom_get_xy(const hs_aroom aroom, const uint16_t x, const uint16_t y) { return aroom.data[x + y * aroom.width]; } +void +hs_aroom_set_tilemap(const hs_aroom aroom, hs_tilemap* tilemap, const uint16_t layer) +{ + if (tilemap->width != aroom.width || + tilemap->width != aroom.height) + return; + + if (layer > 1) { + const uint32_t offset = (aroom.width * aroom.height * layer) - aroom.width * aroom.height; + for(uint32_t i = 0; i < aroom.width * aroom.height; i++) { + hs_tilemap_set(tilemap, i, (uint32_t)aroom.data[i + offset]); + } + } else { + for(uint32_t i = 0; i < aroom.width * aroom.height; i++) { + hs_tilemap_set(tilemap, i, (uint32_t)aroom.data[i]); + } + } + hs_tilemap_update_vbo(*tilemap); +} + inline hs_shader_program_tex hs_sprite_create(const char* texture, const GLenum colour_channel, hs_vobj* vobj, const hs_game_data gd) {