From b71eac2069a30349435c192d682e865718c86a15 Mon Sep 17 00:00:00 2001 From: Clement Sibille Date: Mon, 5 May 2025 08:32:33 +0200 Subject: Add a vulkan renderer that renders an OBJ --- src/platform_sdl.c | 124 +++++++++++++++++++++-------------------------------- 1 file changed, 48 insertions(+), 76 deletions(-) (limited to 'src/platform_sdl.c') diff --git a/src/platform_sdl.c b/src/platform_sdl.c index 5cc6032..6593b9e 100644 --- a/src/platform_sdl.c +++ b/src/platform_sdl.c @@ -1,29 +1,25 @@ +#include "platform_sdl.h" #include "log.h" #include "platform.h" -#include "platform_sdl.h" -#include bool vgltf_platform_init(struct vgltf_platform *platform) { + VGLTF_LOG_INFO("Initializing SDL platform..."); + if (!SDL_Init(SDL_INIT_VIDEO)) { VGLTF_LOG_ERR("SDL initialization failed: %s", SDL_GetError()); goto err; } - constexpr char WINDOW_TITLE[] = "VisibleGLTF"; - constexpr int WINDOW_WIDTH = 800; - constexpr int WINDOW_HEIGHT = 600; - SDL_Window *window = - SDL_CreateWindow(WINDOW_TITLE, WINDOW_WIDTH, WINDOW_HEIGHT, - SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE); - if (!window) { - VGLTF_LOG_ERR("SDL window creation failed: %s", SDL_GetError()); - goto quit_sdl; + platform->window = SDL_CreateWindow("vgltf", 800, 600, SDL_WINDOW_VULKAN); + if (!platform->window) { + VGLTF_LOG_ERR("Window creation failed: %s", SDL_GetError()); + goto deinit_sdl; } - platform->window = window; - + VGLTF_LOG_INFO("SDL platform initialized"); return true; -quit_sdl: + +deinit_sdl: SDL_Quit(); err: return false; @@ -31,67 +27,23 @@ err: void vgltf_platform_deinit(struct vgltf_platform *platform) { SDL_DestroyWindow(platform->window); SDL_Quit(); + VGLTF_LOG_INFO("SDL platform deinitialized"); } -static enum vgltf_key vgltf_key_from_sdl_keycode(SDL_Keycode keycode) { - switch (keycode) { - case SDLK_A: - return VGLTF_KEY_A; - case SDLK_B: - return VGLTF_KEY_B; - case SDLK_C: - return VGLTF_KEY_C; - case SDLK_D: - return VGLTF_KEY_D; - case SDLK_E: - return VGLTF_KEY_E; - case SDLK_F: - return VGLTF_KEY_F; - case SDLK_G: - return VGLTF_KEY_G; - case SDLK_H: - return VGLTF_KEY_H; - case SDLK_I: - return VGLTF_KEY_I; - case SDLK_J: - return VGLTF_KEY_J; - case SDLK_K: - return VGLTF_KEY_K; - case SDLK_L: - return VGLTF_KEY_L; - case SDLK_M: - return VGLTF_KEY_M; - case SDLK_N: - return VGLTF_KEY_N; - case SDLK_O: - return VGLTF_KEY_O; - case SDLK_P: - return VGLTF_KEY_P; - case SDLK_Q: - return VGLTF_KEY_Q; - case SDLK_R: - return VGLTF_KEY_R; - case SDLK_S: - return VGLTF_KEY_S; - case SDLK_T: - return VGLTF_KEY_T; - case SDLK_U: - return VGLTF_KEY_U; - case SDLK_V: - return VGLTF_KEY_V; - case SDLK_W: - return VGLTF_KEY_W; - case SDLK_X: - return VGLTF_KEY_X; - case SDLK_Y: - return VGLTF_KEY_Y; - case SDLK_Z: - return VGLTF_KEY_Z; - case SDLK_ESCAPE: - return VGLTF_KEY_ESCAPE; + +#define VGLTF_GENERATE_SDL_KEYCODE_MAPPING(KEY) \ + case SDLK_##KEY: \ + return VGLTF_KEY_##KEY; + +static enum vgltf_key vgltf_key_from_sdl_keycode(SDL_Keycode key_code) { + switch (key_code) { + VGLTF_FOREACH_KEY(VGLTF_GENERATE_SDL_KEYCODE_MAPPING) default: return VGLTF_KEY_UNKNOWN; } } + +#undef VGLTF_GENERATE_SDL_KEYCODE_MAPPING + bool vgltf_platform_poll_event(struct vgltf_platform *platform, struct vgltf_event *event) { (void)platform; @@ -106,16 +58,12 @@ bool vgltf_platform_poll_event(struct vgltf_platform *platform, event->type = VGLTF_EVENT_KEY_DOWN; event->key.key = vgltf_key_from_sdl_keycode(sdl_event.key.key); break; - case SDL_EVENT_WINDOW_RESIZED: - event->type = VGLTF_EVENT_WINDOW_RESIZED; - event->window_resized.width = sdl_event.display.data1; - event->window_resized.height = sdl_event.display.data2; - break; default: event->type = VGLTF_EVENT_UNKNOWN; break; } } + return pending_events; } bool vgltf_platform_get_window_size(struct vgltf_platform *platform, @@ -123,7 +71,31 @@ bool vgltf_platform_get_window_size(struct vgltf_platform *platform, return SDL_GetWindowSize(platform->window, &window_size->width, &window_size->height); } -char const *const * +bool vgltf_platform_get_current_time_nanoseconds(long *time) { + if (!SDL_GetCurrentTime(time)) { + VGLTF_LOG_ERR("'SDL_GetCurrentTime failed: %s", SDL_GetError()); + goto err; + } + + return true; +err: + return false; +} + +char *vgltf_platform_read_file_to_string(const char *filepath, + size_t *out_size) { + char *file_data = SDL_LoadFile(filepath, out_size); + if (!file_data) { + VGLTF_LOG_ERR("Couldn't load file: %s", SDL_GetError()); + return NULL; + } + + return file_data; +} + +#include + +const char *const * vgltf_platform_get_vulkan_instance_extensions(struct vgltf_platform *platform, uint32_t *count) { (void)platform; -- cgit v1.2.3