summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--meson.build13
-rw-r--r--src/log.c12
-rw-r--r--src/log.h25
-rw-r--r--src/main.c27
-rw-r--r--src/platform.h60
-rw-r--r--src/platform_sdl.c113
-rw-r--r--src/platform_sdl.h10
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
Go back to lisible.xyz