diff options
Diffstat (limited to 'src')
| -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 |
6 files changed, 247 insertions, 0 deletions
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 |
