summaryrefslogtreecommitdiff
path: root/src/gl
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2022-08-18 22:46:40 -0500
committersanine <sanine.not@pm.me>2022-08-18 22:46:40 -0500
commit275536b36657744d802866c060654e2b5cd5a5f8 (patch)
treee685ed8d665fd629c19cbfc39095402d71e349fc /src/gl
parent253f1d1ca8b4b81f206e4aeb20afe440a6dae8be (diff)
implement working windows
Diffstat (limited to 'src/gl')
-rw-r--r--src/gl/gl.c34
-rw-r--r--src/gl/gl.h9
-rw-r--r--src/gl/gl.test.c (renamed from src/gl/window.test.c)4
-rw-r--r--src/gl/window.c56
4 files changed, 95 insertions, 8 deletions
diff --git a/src/gl/gl.c b/src/gl/gl.c
new file mode 100644
index 0000000..8613e70
--- /dev/null
+++ b/src/gl/gl.c
@@ -0,0 +1,34 @@
+#include "gl/glad/glad.h"
+#include <GLFW/glfw3.h>
+#include <lua.h>
+#include <honeysuckle.h>
+
+
+int gl_init(lua_State *L);
+int gl_terminate(lua_State *L);
+
+
+void setup_gl(lua_State *L, int honey_index)
+{
+ hs_create_table(L,
+ hs_str_cfunc("init", gl_init),
+ hs_str_cfunc("terminate", gl_terminate)
+ );
+ lua_setfield(L, honey_index, "gl");
+}
+
+
+int gl_init(lua_State *L)
+{
+ if (!glfwInit()) {
+ hs_throw_error(L, "failed to initialize GLFW");
+ }
+ return 0;
+}
+
+
+int gl_terminate(lua_State *L)
+{
+ glfwTerminate();
+ return 0;
+}
diff --git a/src/gl/gl.h b/src/gl/gl.h
new file mode 100644
index 0000000..2e27851
--- /dev/null
+++ b/src/gl/gl.h
@@ -0,0 +1,9 @@
+#ifndef HONEY_GL_H
+#define HONEY_GL_H
+
+#include <lua.h>
+
+void setup_gl(lua_State *L, int honey_index);
+void setup_window(lua_State *L, int honey_index);
+
+#endif
diff --git a/src/gl/window.test.c b/src/gl/gl.test.c
index b4fb5d4..9bacbf9 100644
--- a/src/gl/window.test.c
+++ b/src/gl/gl.test.c
@@ -12,7 +12,7 @@ void mock_glfwTerminate_();
#define glfwInit mock_glfwInit_
#define hs_throw_error mock_hs_throw_error_
#define glfwTerminate mock_glfwTerminate_
-#include "gl/window.c"
+#include "gl/gl.c"
#undef glfwTerminate
#undef hs_throw_error
#undef glfwInit
@@ -102,7 +102,7 @@ void gl_terminate_works()
}
-void suite_window()
+void suite_gl()
{
lily_run_test(gl_init_succeeds);
lily_run_test(gl_init_fails);
diff --git a/src/gl/window.c b/src/gl/window.c
index bc654f9..8434a5a 100644
--- a/src/gl/window.c
+++ b/src/gl/window.c
@@ -3,17 +3,61 @@
#include <lua.h>
#include <honeysuckle.h>
-int gl_init(lua_State *L)
+
+int window_create(lua_State *L);
+int window_destroy(lua_State *L);
+int window_should_close(lua_State *L);
+int window_poll_events(lua_State *L);
+
+
+void setup_window(lua_State *L, int honey_index)
+{
+ hs_create_table(L,
+ hs_str_cfunc("create", window_create),
+ hs_str_cfunc("destroy", window_destroy),
+ hs_str_cfunc("shouldClose", window_should_close),
+ hs_str_cfunc("pollEvents", window_poll_events)
+ );
+ lua_setfield(L, honey_index, "window");
+}
+
+
+int window_create(lua_State *L)
+{
+ lua_Integer width, height;
+ char *title;
+ hs_parse_args(L, hs_int(width), hs_int(height), hs_str(title));
+
+ GLFWwindow *win = glfwCreateWindow(width, height, title, NULL, NULL);
+ if (win == NULL)
+ hs_throw_error(L, "failed to create window");
+ lua_pushlightuserdata(L, win);
+ return 1;
+}
+
+
+int window_destroy(lua_State *L)
{
- if (!glfwInit()) {
- hs_throw_error(L, "failed to initialize GLFW");
- }
+ void *ptr;
+ hs_parse_args(L, hs_light(ptr));
+ GLFWwindow *win = ptr;
+ glfwDestroyWindow(win);
return 0;
}
-int gl_terminate(lua_State *L)
+int window_should_close(lua_State *L)
+{
+ void *ptr;
+ hs_parse_args(L, hs_light(ptr));
+ GLFWwindow *win = ptr;
+ lua_pushboolean(L, glfwWindowShouldClose(win));
+ return 1;
+}
+
+
+int window_poll_events(lua_State *L)
{
- glfwTerminate();
+ glfwPollEvents();
return 0;
}