diff --git a/CMakeLists.txt b/CMakeLists.txt index 5973cf2..15e1d22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,26 +3,43 @@ project(new-engine VERSION 0 DESCRIPTION "Simple Engine Experiment in C" HOMEPAGE_URL "https://git.warwick-new.co.uk/" - LANGUAGES C) + LANGUAGES C +) -set(CMAKE_C_STANDARD 99) +set(CMAKE_C_STANDARD 17) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Dependancies find_package(SDL2 REQUIRED) find_package(SDL2_IMAGE REQUIRED) +find_package(Vulkan REQUIRED) +find_package(glm REQUIRED) # Include dirs -include_directories(${SDL2_INCLUDE_DIRS}) -include_directories(${SDL2_IMAGE_INCLUDE_DIRS}) +include_directories( + ${SDL2_INCLUDE_DIRS} + ${SDL2_IMAGE_INCLUDE_DIRS} + ${Vulkan_INCLUDE_DIRS} + ${GLM_INCLUDE_DIRS} +) # Executables -add_executable(${PROJECT_NAME} main.c) +file(GLOB_RECURSE SOURCE_FILES + ${CMAKE_SOURCE_DIR}/src/*.c) +file(GLOB_RECURSE HEADER_FILES + ${CMAKE_SOURCE_DIR}/src/*.h) +add_executable(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES}) # Link Libraries -target_link_libraries(${PROJECT_NAME} ${SDL2_IMAGE_LIBRARIES} ${SDL2_LIBRARIES}) +target_link_libraries(${PROJECT_NAME} + ${SDL2_IMAGE_LIBRARIES} + ${SDL2_LIBRARIES} + ${Vulkan_LIBRARIES} + ${GLM_LIBRARY_DIRS} +) # Compile Shaders add_custom_command(TARGET ${PROJECT_NAME} - PRE_BUILD - COMMAND ./compile_shaders.sh) + PRE_BUILD + COMMAND ./compile_shaders.sh +) diff --git a/main.c b/src/main.c similarity index 77% rename from main.c rename to src/main.c index bd64fac..62f3106 100644 --- a/main.c +++ b/src/main.c @@ -1,5 +1,8 @@ -#include +#include "vec.h" +#include +#include #include +#include int main() { if (SDL_Init(SDL_INIT_VIDEO) < 0) { @@ -7,16 +10,15 @@ int main() { return -1; } - SDL_Window *window = SDL_CreateWindow("SDL2 Window", SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, 680, 480, 0); - + SDL_Window *window = + SDL_CreateWindow("SDL2 Window", SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, 680, 480, SDL_WINDOW_VULKAN); if (!window) { printf("Failed to create window\n"); return -1; } SDL_Surface *window_surface = SDL_GetWindowSurface(window); - if (!window_surface) { printf("Failed to get the surface from the window\n"); return -1; @@ -24,10 +26,8 @@ int main() { bool running = true; while (running) { - // Create event handling struct SDL_Event input; while (SDL_PollEvent(&input) > 0) { - // Handle SDL quit event if (input.type == SDL_QUIT) { running = false; } diff --git a/src/vec.c b/src/vec.c new file mode 100644 index 0000000..9c4ee51 --- /dev/null +++ b/src/vec.c @@ -0,0 +1,45 @@ +#include "vec.h" +#include +#include +#include + +#define DEFAULT_VECTOR_CAPACITY 4 + +typedef struct vector { + size_t capacity; + size_t size; + size_t element_size; + void *elements; +} vector; + +vector *vec_create(size_t element_size) { + vector *vec = malloc(sizeof(vector)); + vec->element_size = element_size; + vec->capacity = DEFAULT_VECTOR_CAPACITY; + vec->elements = malloc(vec->capacity * vec->element_size); + + return vec; +}; +void vec_destroy(vector *vec) { + assert(vec != NULL); + free(vec->elements); + free(vec); +} + +void vec_pushback(vector *vec, void *data) { + assert(vec != NULL); + vec_grow(vec); + + memcpy(data, vec, vec->element_size); +} + +void vec_grow(vector *vec) { + assert(vec != NULL); + if (vec->size < vec->capacity) + return; + + // Grow the vector by half + vec->elements = + realloc(vec, vec->element_size * (vec->capacity + vec->capacity / 2)); + assert(vec != NULL); +} diff --git a/src/vec.h b/src/vec.h new file mode 100644 index 0000000..3cb78db --- /dev/null +++ b/src/vec.h @@ -0,0 +1,14 @@ +#pragma once +#include + +typedef struct vector vector; + +vector *vec_create(size_t element_size); +void vec_destroy(vector *vec); + +// Checks and grows vector only if necessary +void vec_grow(vector *vec); + +// Assumes data is the same size as the element size +// Which means you can only push one element at a time +void vec_pushback(vector *vec, void *data);