diff options
Diffstat (limited to 'src/platform_sdl.c')
| -rw-r--r-- | src/platform_sdl.c | 124 | 
1 files changed, 48 insertions, 76 deletions
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 <SDL3/SDL_vulkan.h>  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 <SDL3/SDL_vulkan.h> + +const char *const *  vgltf_platform_get_vulkan_instance_extensions(struct vgltf_platform *platform,                                                uint32_t *count) {    (void)platform;  | 
