From 4d2f59dcb096e8476d31fa0b6f872fbeb1c2e501 Mon Sep 17 00:00:00 2001 From: Shariq Shah Date: Mon, 13 Jul 2015 15:32:39 +0500 Subject: [PATCH] Added Entity creation and removal --- .dir-locals.el | 4 +- .gitignore | 3 +- src/components.h | 14 ++++ src/entity.c | 170 +++++++++++++++++++++++++++++++++++++++++++++++ src/entity.h | 29 ++++++++ src/game.c | 4 ++ 6 files changed, 222 insertions(+), 2 deletions(-) create mode 100644 src/components.h create mode 100644 src/entity.c create mode 100644 src/entity.h diff --git a/.dir-locals.el b/.dir-locals.el index 32407fd..4d48380 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -1,4 +1,6 @@ ((c-mode . ((company-clang-arguments . ("-I/mnt/Dev/Projects/Symmetry/include/GLFW")) (flycheck-clang-include-path . ("/mnt/Dev/Projects/Symmetry/include/GLFW"))) - )) + ) + (nil . + (toggle-truncate-lines t))) diff --git a/.gitignore b/.gitignore index 149c5e6..ebcdc07 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ bin/* build/* libs/* include/* -orgfile.org \ No newline at end of file +orgfile.org +assets/* \ No newline at end of file diff --git a/src/components.h b/src/components.h new file mode 100644 index 0000000..7c54873 --- /dev/null +++ b/src/components.h @@ -0,0 +1,14 @@ +#ifndef components_H +#define components_H + + +typedef enum +{ + C_TRANSFORM = 0, + C_MODEL, + C_CAMERA, + C_RIGIDBODY, + MAX_COMPONENTS +} Component; + +#endif diff --git a/src/entity.c b/src/entity.c new file mode 100644 index 0000000..7f61a8a --- /dev/null +++ b/src/entity.c @@ -0,0 +1,170 @@ +#include "entity.h" +#include "array.h" +#include "log.h" +#include "string_utils.h" + +#include +#include +#include + +static Array* entity_list; +static Array* empty_indices; + + +void entity_initialize(void) +{ + entity_list = array_new(Entity); + empty_indices = array_new(int); +} + +void entity_cleanup(void) +{ + for(int i = 0; i < (int)entity_list->length; i++) + entity_remove(i); + + array_free(entity_list); + array_free(empty_indices); +} + +void entity_remove(int index) +{ + Entity* entity = array_get(entity_list, index); + + for(int i = 0; i < MAX_COMPONENTS; i++) + { + Component component = entity->components[i]; + switch(component) + { + case C_TRANSFORM: + break; + case C_MODEL: + break; + case C_RIGIDBODY: + break; + case C_CAMERA: + break; + default: + /* Only called for MAX_COMPONENTS, do nothing */ + break; + } + } +} + +Entity* entity_create(const char* name, const char* tag) +{ + Entity* new_entity = NULL; + int index = -1; + if(empty_indices->length > 0) + { + index = array_get_last_val(empty_indices, int); + array_pop(empty_indices); + new_entity = array_get(entity_list, index); + } + else + { + new_entity = array_add(entity_list); + index = entity_list->length - 1; + } + + if(new_entity->name) free(new_entity->name); + if(new_entity->name) free(new_entity->tag); + + new_entity->name = name ? str_new(name) : str_new("DEFAULT_NAME"); + new_entity->tag = tag ? str_new(tag) : str_new("DEFAULT_TAG"); + new_entity->node = index; + + /* TODO: Add transform here by default maybe? */ + + return new_entity; + +} + +Entity* entity_get(int index) +{ + Entity* entity = NULL; + if(index >= 0 && index < (int)entity_list->length) + entity = array_get(entity_list, index); + else + log_error("entity:get", "Invalid index '%d'", index); + return entity; +} + +Entity* entity_find(const char* name) +{ + /* Bruteforce search all entities and return the first match */ + Entity* entity = NULL; + for(int i = 0; i < (int)entity_list->length; i++) + { + Entity* curr_ent = array_get(entity_list, i); + if(strcmp(curr_ent->name, name) == 0) + { + entity = curr_ent; + break; + } + } + + return entity; +} +bool entity_component_remove(Entity* entity, Component component) +{ + bool success = true; + assert(entity); + switch(component) + { + case C_TRANSFORM: + break; + case C_MODEL: + break; + case C_RIGIDBODY: + break; + case C_CAMERA: + break; + default: + log_error("entity:component_remove", "Invalid component type"); + break; + } + if(success) entity->components[component] = -1; + + return success; +} +void* entity_component_get(Entity* entity, Component component) +{ + void* comp_obj = NULL; + assert(entity); + switch(component) + { + case C_TRANSFORM: + break; + case C_MODEL: + break; + case C_RIGIDBODY: + break; + case C_CAMERA: + break; + default: + log_error("entity:component_get", "Invalid component type"); + break; + } + return comp_obj; +} + +void* entity_component_add(Entity* entity, Component component) +{ + void* new_comp = NULL; + assert(entity); + switch(component) + { + case C_TRANSFORM: + break; + case C_MODEL: + break; + case C_RIGIDBODY: + break; + case C_CAMERA: + break; + default: + log_error("entity:component_add", "Invalid component type"); + break; + } + return new_comp; +} diff --git a/src/entity.h b/src/entity.h new file mode 100644 index 0000000..7449e88 --- /dev/null +++ b/src/entity.h @@ -0,0 +1,29 @@ +#ifndef entity_H +#define entity_H + +#include "components.h" +#include "num_types.h" +#include + +typedef int32 Node; + +typedef struct +{ + Node node; + char* name; + char* tag; + int components[MAX_COMPONENTS]; +} Entity; + +void entity_initialize(void); +void entity_cleanup(void); +void entity_remove(int index); +Entity* entity_create(const char* name, const char* tag); +Entity* entity_get(int index); +Entity* entity_find(const char* name); +bool entity_component_remove(Entity* entity, Component component); +void* entity_component_get(Entity* entity, Component component); +void* entity_component_add(Entity* entity, Component component); + + +#endif diff --git a/src/game.c b/src/game.c index 2b557b7..049890c 100644 --- a/src/game.c +++ b/src/game.c @@ -8,6 +8,7 @@ #include "log.h" #include "file_io.h" #include "shader.h" +#include "entity.h" void run(void); void update(void); @@ -21,6 +22,8 @@ void game_init(void) renderer_init(window); io_file_initialize("/mnt/Dev/Projects/Symmetry/assets/");/* TODO: Implement proper way of getting binary directory */ shader_initialize(); + entity_initialize(); + int keys[2] = {'W', GLFW_KEY_UP}; int keys2[2] = {'S', GLFW_KEY_DOWN}; @@ -58,6 +61,7 @@ void render(void) void game_cleanup(void) { + entity_cleanup(); input_cleanup(); renderer_cleanup(); io_file_cleanup();