Started work on a vector library.

This commit is contained in:
Warwick 2024-02-07 13:40:57 +00:00
parent 86d57ade14
commit 339cd62a96
4 changed files with 91 additions and 15 deletions

View file

@ -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
)

View file

@ -1,5 +1,8 @@
#include <SDL2/SDL.h>
#include "vec.h"
#include <SDL.h>
#include <SDL_vulkan.h>
#include <stdbool.h>
#include <stdio.h>
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;
}

45
src/vec.c Normal file
View file

@ -0,0 +1,45 @@
#include "vec.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#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);
}

14
src/vec.h Normal file
View file

@ -0,0 +1,14 @@
#pragma once
#include <stdlib.h>
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);