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
|
VERSION 0
|
||||||
DESCRIPTION "Simple Engine Experiment in C"
|
DESCRIPTION "Simple Engine Experiment in C"
|
||||||
HOMEPAGE_URL "https://git.warwick-new.co.uk/"
|
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)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
# Dependancies
|
# Dependancies
|
||||||
find_package(SDL2 REQUIRED)
|
find_package(SDL2 REQUIRED)
|
||||||
find_package(SDL2_IMAGE REQUIRED)
|
find_package(SDL2_IMAGE REQUIRED)
|
||||||
|
find_package(Vulkan REQUIRED)
|
||||||
|
find_package(glm REQUIRED)
|
||||||
|
|
||||||
# Include dirs
|
# Include dirs
|
||||||
include_directories(${SDL2_INCLUDE_DIRS})
|
include_directories(
|
||||||
include_directories(${SDL2_IMAGE_INCLUDE_DIRS})
|
${SDL2_INCLUDE_DIRS}
|
||||||
|
${SDL2_IMAGE_INCLUDE_DIRS}
|
||||||
|
${Vulkan_INCLUDE_DIRS}
|
||||||
|
${GLM_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
# Executables
|
# 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
|
# 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
|
# Compile Shaders
|
||||||
add_custom_command(TARGET ${PROJECT_NAME}
|
add_custom_command(TARGET ${PROJECT_NAME}
|
||||||
PRE_BUILD
|
PRE_BUILD
|
||||||
COMMAND ./compile_shaders.sh)
|
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 <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
||||||
|
|
@ -7,16 +10,15 @@ int main() {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_Window *window = SDL_CreateWindow("SDL2 Window", SDL_WINDOWPOS_CENTERED,
|
SDL_Window *window =
|
||||||
SDL_WINDOWPOS_CENTERED, 680, 480, 0);
|
SDL_CreateWindow("SDL2 Window", SDL_WINDOWPOS_CENTERED,
|
||||||
|
SDL_WINDOWPOS_CENTERED, 680, 480, SDL_WINDOW_VULKAN);
|
||||||
if (!window) {
|
if (!window) {
|
||||||
printf("Failed to create window\n");
|
printf("Failed to create window\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_Surface *window_surface = SDL_GetWindowSurface(window);
|
SDL_Surface *window_surface = SDL_GetWindowSurface(window);
|
||||||
|
|
||||||
if (!window_surface) {
|
if (!window_surface) {
|
||||||
printf("Failed to get the surface from the window\n");
|
printf("Failed to get the surface from the window\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -24,10 +26,8 @@ int main() {
|
||||||
|
|
||||||
bool running = true;
|
bool running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
// Create event handling struct
|
|
||||||
SDL_Event input;
|
SDL_Event input;
|
||||||
while (SDL_PollEvent(&input) > 0) {
|
while (SDL_PollEvent(&input) > 0) {
|
||||||
// Handle SDL quit event
|
|
||||||
if (input.type == SDL_QUIT) {
|
if (input.type == SDL_QUIT) {
|
||||||
running = false;
|
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