diff options
Diffstat (limited to 'src/platform_sdl.c')
| -rw-r--r-- | src/platform_sdl.c | 113 | 
1 files changed, 113 insertions, 0 deletions
diff --git a/src/platform_sdl.c b/src/platform_sdl.c new file mode 100644 index 0000000..27ed4c3 --- /dev/null +++ b/src/platform_sdl.c @@ -0,0 +1,113 @@ +#include "log.h" +#include "platform.h" +#include "platform_sdl.h" + +bool vgltf_platform_init(struct vgltf_platform *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); +  if (!window) { +    VGLTF_LOG_ERR("SDL window creation failed: %s", SDL_GetError()); +    goto quit_sdl; +  } + +  platform->window = window; + +  return true; +quit_sdl: +  SDL_Quit(); +err: +  return false; +} +void vgltf_platform_deinit(struct vgltf_platform *platform) { +  SDL_DestroyWindow(platform->window); +  SDL_Quit(); +} +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; +  default: +    return VGLTF_KEY_UNKNOWN; +  } +} +bool vgltf_platform_poll_event(struct vgltf_platform *platform, +                               struct vgltf_event *event) { +  (void)platform; +  SDL_Event sdl_event; +  bool pending_events = SDL_PollEvent(&sdl_event); +  if (pending_events) { +    switch (sdl_event.type) { +    case SDL_EVENT_QUIT: +      event->type = VGLTF_EVENT_QUIT; +      break; +    case SDL_EVENT_KEY_DOWN: +      event->type = VGLTF_EVENT_KEY_DOWN; +      event->key.key = vgltf_key_from_sdl_keycode(sdl_event.key.key); +      break; +    default: +      event->type = VGLTF_EVENT_UNKNOWN; +      break; +    } +  } +  return pending_events; +}  | 
