Started work on a vector library.
This commit is contained in:
parent
86d57ade14
commit
339cd62a96
4 changed files with 91 additions and 15 deletions
|
|
@ -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
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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
45
src/vec.c
Normal 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
14
src/vec.h
Normal 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);
|
||||
Loading…
Reference in a new issue