commit f9d48018a686761f7f75c777710871b5af0488e0 Author: sam <multisniperism@gmail.com> Date: Sun Aug 11 16:18:06 2024 +1200 first commit diff --git a/.cache/clangd/index/simple.c.700CB8E1B8AD103E.idx b/.cache/clangd/index/simple.c.700CB8E1B8AD103E.idx new file mode 100644 index 0000000..fcd2712 Binary files /dev/null and b/.cache/clangd/index/simple.c.700CB8E1B8AD103E.idx differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..30562d0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +compile_commands.json +**/*.o +test/log.txt diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..b786e20 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "src/thirdparty/log.c"] + path = src/thirdparty/log.c + url = https://github.com/rxi/log.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cedc993 --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +all: + $(MAKE) -C src + $(MAKE) -C test clean + $(MAKE) -C test simple.o + ./test/simple.o + +bear: clean + bear -- $(MAKE) + +clean: + $(MAKE) -C src clean + $(MAKE) -C test clean diff --git a/src/.cache/clangd/index/gearlib.h.988F31907B86874A.idx b/src/.cache/clangd/index/gearlib.h.988F31907B86874A.idx new file mode 100644 index 0000000..423d7ca Binary files /dev/null and b/src/.cache/clangd/index/gearlib.h.988F31907B86874A.idx differ diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..c19b5e4 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,22 @@ +LIBRARY=libgearlib.a + +CFLAGS=-O3 \ + -I. \ + -Ithirdparty \ + -DUSE_GLFW \ + -DLOG_USE_COLOR \ + $(shell pkg-config --cflags glfw3) + +CFILES=$(shell find -L * -type f -name '*.c') +OBJ=$(CFILES:.c=.o) + +$(LIBRARY): $(OBJ) Makefile + $(AR) rcs $(LIBRARY) $(OBJ) + +%.o: %.c + $(CC) $(CFLAGS) -c $< -o $@ + +clean: + rm -rf $(OBJ) $(LIBRARY) + + diff --git a/src/gearlib.h b/src/gearlib.h new file mode 100644 index 0000000..1ca035c --- /dev/null +++ b/src/gearlib.h @@ -0,0 +1,47 @@ +#ifndef __GEARLIB_H__ +#define __GEARLIB_H__ + +#include <math.h> +#include <stdbool.h> +#include <stdint.h> +#include <assert.h> + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef uintptr_t uptr; + +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; +typedef intptr_t iptr; + +typedef float_t f32; +typedef double_t f64; + +#define GRAPI extern +#define GR_DEFAULT_MAJOR 4 +#define GR_DEFAULT_MINOR 6 + +GRAPI i32 gr_state_init(); +#define gr_state_assert() assert(gr_state != NULL && "State not initialized") +#define gr_state_set(prop, val) gr_state_assert(); gr_state->prop = val +#define gr_state_get(prop) ({ gr_state_assert(); gr_state->prop; }) + +GRAPI i32 gr_window_init(i32 major, i32 minor); +GRAPI i32 gr_window_create(i32 width, i32 height, char* title); + +GRAPI i32 gr_log_add_file(char* filename); + +typedef struct { + i32 major; + i32 minor; + bool window_initialized; + void* window; +} gr_state_t; + +GRAPI gr_state_t* gr_state; + +#endif diff --git a/src/libgearlib.a b/src/libgearlib.a new file mode 100644 index 0000000..29eab92 Binary files /dev/null and b/src/libgearlib.a differ diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..19a9d66 --- /dev/null +++ b/src/log.c @@ -0,0 +1,14 @@ +#include <gearlib.h> +#include <log.c/src/log.h> + +i32 gr_log_add_file(char* filename) { + FILE* fd = fopen(filename, "w"); + if(fd == NULL) { + log_error("Couldn't open file \"%s\"", filename); + return 1; + } + + log_add_fp(fd, LOG_INFO); + log_info("Added file \"%s\" as logging file", filename); + return 0; +} diff --git a/src/state.c b/src/state.c new file mode 100644 index 0000000..71df5ea --- /dev/null +++ b/src/state.c @@ -0,0 +1,16 @@ +#include "log.c/src/log.h" +#include <gearlib.h> +#include <stdlib.h> + +gr_state_t* gr_state = NULL; + +i32 gr_state_init() { + if(gr_state != NULL) { + log_fatal("Init must only be called once"); + return 1; + } + + gr_state = calloc(1, sizeof(gr_state_t)); + log_info("Created state"); + return 0; +} diff --git a/src/thirdparty/log.c b/src/thirdparty/log.c new file mode 160000 index 0000000..f9ea349 --- /dev/null +++ b/src/thirdparty/log.c @@ -0,0 +1 @@ +Subproject commit f9ea34994bd58ed342d2245cd4110bb5c6790153 diff --git a/src/window.c b/src/window.c new file mode 100644 index 0000000..b84e166 --- /dev/null +++ b/src/window.c @@ -0,0 +1,49 @@ +#include <gearlib.h> +#include <GLFW/glfw3.h> +#include <log.c/src/log.h> + +i32 gr_window_init(i32 major, i32 minor) { + if(gr_state->window_initialized == true) { + log_fatal("Init already called"); + return 1; + } + + gr_state_set(major, major); + gr_state_set(minor, minor); + gr_state_set(window_initialized, true); + + log_info("Initialized for OpenGL %d.%d", major, minor); + + return 0; +} + +i32 gr_window_create(i32 width, i32 height, char* title) { + if(!gr_state_get(window_initialized)) { + log_info("Window was not initialized before calling create, defaulting to OpenGL %d.%d", + GR_DEFAULT_MAJOR, GR_DEFAULT_MINOR); + gr_window_init(GR_DEFAULT_MAJOR, GR_DEFAULT_MINOR); + } + +#ifdef USE_GLFW + if(glfwInit() != GLFW_TRUE) { + log_fatal("GLFW failed to initialize"); + } else { + log_info("GLFW initialized successfully"); + } + + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, gr_state_get(major)); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, gr_state_get(minor)); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + + gr_state_set(window, glfwCreateWindow(width, height, title, NULL, NULL)); + if(gr_state_get(window) == NULL) { + log_fatal("Failed to create window"); + return 1; + } else { + log_info("Window created successfully"); + } +#endif + + return 0; +} diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..28be3c2 --- /dev/null +++ b/test/Makefile @@ -0,0 +1,15 @@ +CFLAGS=-O3 -I../src +LDFLAGS=-L../src -lgearlib $(shell pkg-config --libs glfw3) + +CFILES=$(shell find -L * -type f -name '*.c') +OBJ=$(CFILES:.c=.o) + +%.o: %.c + $(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ + +all: $(OBJ) + +clean: + rm -rf $(OBJ) $(BINARY) + + diff --git a/test/simple-init.c b/test/simple-init.c new file mode 100644 index 0000000..be3b766 --- /dev/null +++ b/test/simple-init.c @@ -0,0 +1,7 @@ +#include <gearlib.h> + +int main() { + gr_state_init(); + gr_window_init(4, 1); + gr_window_create(800, 600, "hi"); +} diff --git a/test/simple-log.c b/test/simple-log.c new file mode 100644 index 0000000..1c281b2 --- /dev/null +++ b/test/simple-log.c @@ -0,0 +1,8 @@ +#include <gearlib.h> + +int main() { + gr_state_init(); + + gr_log_add_file("log.txt"); + gr_window_create(800, 600, "hi"); +} diff --git a/test/simple.c b/test/simple.c new file mode 100644 index 0000000..610af17 --- /dev/null +++ b/test/simple.c @@ -0,0 +1,6 @@ +#include <gearlib.h> + +int main() { + gr_state_init(); + gr_window_create(800, 600, "hi"); +}