gear/src/ui/gui/create.c
2024-09-01 14:10:06 +12:00

74 lines
2.3 KiB
C

#include <gear/ui/gui.h>
#include <gear/ui/console.h>
#include <gear/resources.h>
#include <sokol/sokol_log.h>
#include <log.c/log.h>
struct nk_font* g_gui_font;
g_gui* g_gui_create() {
snk_setup(&(snk_desc_t){
.dpi_scale = sapp_dpi_scale(),
.logger.func = slog_func,
});
log_info("Sokol nuklear initialized successfully");
g_gui* gui = calloc(1, sizeof(g_gui));
if(gui != NULL) {
log_info("GUI allocated successfully");
log_debug("GUI pointer: %p", gui);
g_gui_add_layer(&gui->layers, g_console_create, g_console_destroy);
} else {
log_fatal("Failed to allocate GUI");
exit(EXIT_FAILURE);
}
struct nk_font_atlas* atlas = calloc(1, sizeof(struct nk_font_atlas));
if(atlas != NULL) {
log_info("Font atlas allocated successfully");
log_debug("Font atlas pointer: %p", atlas);
nk_font_atlas_init_default(atlas);
nk_font_atlas_begin(atlas);
f32 font_size = 22.05f;
struct nk_font_config config = nk_font_config(font_size);
config.pixel_snap = true;
g_gui_font = nk_font_atlas_add_from_memory(atlas,
_binary_res_OpenSans_Regular_ttf_start,
_binary_res_OpenSans_Regular_ttf_end - _binary_res_OpenSans_Regular_ttf_start,
font_size, &config);
i32 atlas_width, atlas_height;
const u8* pixels = nk_font_atlas_bake(atlas, &atlas_width, &atlas_height, NK_FONT_ATLAS_RGBA32);
sg_image font_image = sg_make_image(&(sg_image_desc){
.label = "Font image",
.width = atlas_width,
.height = atlas_height,
.data.subimage[0][0] = (sg_range){
.ptr = pixels,
.size = atlas_width * atlas_height * 4
},
.pixel_format = SG_PIXELFORMAT_RGBA8
});
sg_sampler font_sampler = sg_make_sampler(&(sg_sampler_desc){
.label = "Font sampler"
});
snk_image_t snk_img = snk_make_image(&(snk_image_desc_t){
.image = font_image,
.sampler = font_sampler
});
nk_font_atlas_end(atlas, snk_nkhandle(snk_img), NULL);
} else {
log_fatal("Failed to allocate font atlas");
exit(EXIT_FAILURE);
}
return gui;
}