diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | meson.build | 13 | ||||
| -rw-r--r-- | src/log.c | 12 | ||||
| -rw-r--r-- | src/log.h | 25 | ||||
| -rw-r--r-- | src/main.c | 27 | ||||
| -rw-r--r-- | src/platform.h | 60 | ||||
| -rw-r--r-- | src/platform_sdl.c | 113 | ||||
| -rw-r--r-- | src/platform_sdl.h | 10 | 
8 files changed, 261 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ceddaa3 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.cache/ diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..e3997cf --- /dev/null +++ b/meson.build @@ -0,0 +1,13 @@ +project('visible-gltf', 'c', default_options: ['warning_level=3', 'c_std=c23']) + +sdl3_dep = dependency('sdl3') + +executable( +  'vgltf', +  [ +    'src/main.c', +    'src/log.c', +    'src/platform_sdl.c' +  ], +  dependencies: [sdl3_dep] +) diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..0c1b8a4 --- /dev/null +++ b/src/log.c @@ -0,0 +1,12 @@ +#include "log.h" + +const char *vgltf_log_level_to_str(enum vgltf_log_level level) { +  switch (level) { +  case VGLTF_LOG_ERROR: +    return "error"; +  case VGLTF_LOG_INFO: +    return "info"; +  case VGLTF_LOG_DEBUG: +    return "debug"; +  } +} diff --git a/src/log.h b/src/log.h new file mode 100644 index 0000000..5e9dcc0 --- /dev/null +++ b/src/log.h @@ -0,0 +1,25 @@ +#ifndef VGLTF_LOG_H +#define VGLTF_LOG_H + +#include <stdio.h> + +enum vgltf_log_level { +  VGLTF_LOG_DEBUG, +  VGLTF_LOG_INFO, +  VGLTF_LOG_ERROR, +}; +const char *vgltf_log_level_to_str(enum vgltf_log_level level); + +#define VGLTF_LOG(level, ...)                                                  \ +  do {                                                                         \ +    fprintf(stderr, "[%s %s:%d] ", vgltf_log_level_to_str(level), __FILE__,    \ +            __LINE__);                                                         \ +    fprintf(stderr, __VA_ARGS__);                                              \ +    fprintf(stderr, "\n");                                                     \ +  } while (0) + +#define VGLTF_LOG_DBG(...) VGLTF_LOG(VGLTF_LOG_DEBUG, __VA_ARGS__) +#define VGLTF_LOG_INFO(...) VGLTF_LOG(VGLTF_LOG_INFO, __VA_ARGS__) +#define VGLTF_LOG_ERR(...) VGLTF_LOG(VGLTF_LOG_ERROR, __VA_ARGS__) + +#endif // VGLTF_LOG_H diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..ffe8369 --- /dev/null +++ b/src/main.c @@ -0,0 +1,27 @@ +#include "log.h" +#include "platform.h" + +int main(void) { +  struct vgltf_platform platform = {}; +  if (!vgltf_platform_init(&platform)) { +    VGLTF_LOG_ERR("Couldn't initialize the platform layer"); +    goto err; +  } + +  while (true) { +    struct vgltf_event event; +    while (vgltf_platform_poll_event(&platform, &event)) { +      if (event.type == VGLTF_EVENT_QUIT || +          (event.type == VGLTF_EVENT_KEY_DOWN && +           event.key.key == VGLTF_KEY_ESCAPE)) { +        goto out_main_loop; +      } +    } +  } +out_main_loop: + +  vgltf_platform_deinit(&platform); +  return 0; +err: +  return 1; +} diff --git a/src/platform.h b/src/platform.h new file mode 100644 index 0000000..baf0165 --- /dev/null +++ b/src/platform.h @@ -0,0 +1,60 @@ +#ifndef VGLTF_PLATFORM_H +#define VGLTF_PLATFORM_H + +enum vgltf_event_type { +  VGLTF_EVENT_QUIT, +  VGLTF_EVENT_KEY_DOWN, +  VGLTF_EVENT_UNKNOWN, +}; + +enum vgltf_key { +  VGLTF_KEY_A, +  VGLTF_KEY_B, +  VGLTF_KEY_C, +  VGLTF_KEY_D, +  VGLTF_KEY_E, +  VGLTF_KEY_F, +  VGLTF_KEY_G, +  VGLTF_KEY_H, +  VGLTF_KEY_I, +  VGLTF_KEY_J, +  VGLTF_KEY_K, +  VGLTF_KEY_L, +  VGLTF_KEY_M, +  VGLTF_KEY_N, +  VGLTF_KEY_O, +  VGLTF_KEY_P, +  VGLTF_KEY_Q, +  VGLTF_KEY_R, +  VGLTF_KEY_S, +  VGLTF_KEY_T, +  VGLTF_KEY_U, +  VGLTF_KEY_V, +  VGLTF_KEY_W, +  VGLTF_KEY_X, +  VGLTF_KEY_Y, +  VGLTF_KEY_Z, +  VGLTF_KEY_ESCAPE, +  VGLTF_KEY_UNKNOWN +}; + +struct vgltf_key_event { +  enum vgltf_key key; +}; + +struct vgltf_event { +  enum vgltf_event_type type; +  union { +    struct vgltf_key_event key; +  }; +}; + +struct vgltf_platform; +bool vgltf_platform_init(struct vgltf_platform *platform); +void vgltf_platform_deinit(struct vgltf_platform *platform); +bool vgltf_platform_poll_event(struct vgltf_platform *platform, +                               struct vgltf_event *event); + +#include "platform_sdl.h" + +#endif // VGLTF_PLATFORM_H 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; +} diff --git a/src/platform_sdl.h b/src/platform_sdl.h new file mode 100644 index 0000000..88d802e --- /dev/null +++ b/src/platform_sdl.h @@ -0,0 +1,10 @@ +#ifndef VGLTF_PLATFORM_SDL_H +#define VGLTF_PLATFORM_SDL_H + +#include <SDL3/SDL.h> + +struct vgltf_platform { +  SDL_Window *window; +}; + +#endif // VGLTF_PLATFORM_SDL_H  | 
