From 05232ad744b4f3845548c5912b70930c31f5c0e3 Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Tue, 10 Dec 2019 09:49:44 +0100 Subject: [PATCH] Cleaning up --- Makefile | 4 ++- include/component.h | 1 - include/engine.h | 11 ++++++- include/systems/parallax_system.h | 12 +++++++ src/component.c | 16 +++------- src/components/texture_renderer.c | 2 +- src/deserializer/deserialize_entity.c | 4 +-- src/engine/engine.c | 3 +- src/engine/engine_component_builder.c | 46 +++++++++++++++++++++++++++ src/engine/engine_system_builder.c | 9 ++++++ src/renderer/renderer.c | 2 +- src/renderer/texture_utility.c | 3 ++ src/system.c | 4 +-- src/systems/parallax_system.c | 3 +- 14 files changed, 95 insertions(+), 25 deletions(-) create mode 100644 include/systems/parallax_system.h create mode 100644 src/engine/engine_component_builder.c diff --git a/Makefile b/Makefile index 17454a2..4ef078d 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,9 @@ SRC = src/engine/engine.c \ src/deserializer/prefab.c \ src/system.c \ src/systems/texture_renderer_system.c \ - src/engine/engine_system_builder.c + src/systems/parallax_system.c \ + src/engine/engine_system_builder.c \ + src/engine/engine_component_builder.c OBJ = $(SRC:%.c=%.o) diff --git a/include/component.h b/include/component.h index 7608c75..2fc3fff 100644 --- a/include/component.h +++ b/include/component.h @@ -28,5 +28,4 @@ struct gc_component }; void *new_component(const void *component, ...); -const void *get_component(char *name); void component_destroy(void *component); \ No newline at end of file diff --git a/include/engine.h b/include/engine.h index fe062d4..38c20b9 100644 --- a/include/engine.h +++ b/include/engine.h @@ -29,6 +29,10 @@ struct gc_engine gc_list *systems; void (*add_system)(gc_engine *engine, const gc_system *system); + const gc_system *(*get_system)(gc_engine *engine, const char *name); + gc_list *components; + void (*add_component)(gc_engine *engine, const void *component); + const void *(*get_component)(gc_engine *engine, const char *name); sfRenderWindow *window; sfSprite *sprite; @@ -42,4 +46,9 @@ void handle_events(gc_engine *engine); int change_scene(gc_engine *engine, gc_scene *scene); void engine_add_buildin_systems(gc_engine *engine); -void engine_add_system(gc_engine *engine, const gc_system *system); \ No newline at end of file +const gc_system *engine_get_system(gc_engine *engine, const char *name); +void engine_add_system(gc_engine *engine, const gc_system *system); + +void engine_add_buildin_components(gc_engine *engine); +const void *engine_get_component(gc_engine *engine, const char *name); +void engine_add_component(gc_engine *engine, const void *component); \ No newline at end of file diff --git a/include/systems/parallax_system.h b/include/systems/parallax_system.h new file mode 100644 index 0000000..f614f52 --- /dev/null +++ b/include/systems/parallax_system.h @@ -0,0 +1,12 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** texture_renderer_system +*/ + +#pragma once + +#include "system.h" + +extern const gc_system parallax_system; \ No newline at end of file diff --git a/src/component.c b/src/component.c index 866d681..e47d90e 100644 --- a/src/component.c +++ b/src/component.c @@ -13,19 +13,11 @@ #include "utility.h" #include -const void *get_component(char *name) +const void *engine_get_component(gc_engine *engine, const char *name) { - static const void *all_components[] = { - &transform_component, - &movable_component, - &texture_renderer, - ¶llax_component, - NULL - }; - - for (int i = 0; all_components[i]; i++) { - if (!my_strcmp(((const gc_component *)all_components[i])->name, name)) - return (all_components[i]); + for (gc_list *cmp = engine->components; cmp; cmp = cmp->next) { + if (!my_strcmp(((const gc_component *)cmp->data)->name, name)) + return (cmp->data); } return (NULL); } diff --git a/src/components/texture_renderer.c b/src/components/texture_renderer.c index 55ddb66..7ba77f4 100644 --- a/src/components/texture_renderer.c +++ b/src/components/texture_renderer.c @@ -43,7 +43,7 @@ static void texture_rend_fdctr(gc_engine *engine, void *component, node *n) cmp->sprite->rect.width = xml_getfloatprop(rect, "width"); cmp->sprite->rect.top = xml_getfloatprop(rect, "top"); cmp->sprite->rect.left = xml_getfloatprop(rect, "left"); - if (cmp->sprite && cmp->sprite->rect.height < 0) { + if (cmp->sprite->texture && cmp->sprite->rect.height < 0) { size = sfTexture_getSize(cmp->sprite->texture->texture); cmp->sprite->rect.height = (float)size.y; cmp->sprite->rect.width = (float)size.x; diff --git a/src/deserializer/deserialize_entity.c b/src/deserializer/deserialize_entity.c index 0300295..d28cffc 100644 --- a/src/deserializer/deserialize_entity.c +++ b/src/deserializer/deserialize_entity.c @@ -14,11 +14,9 @@ gc_component *deserialize_component(gc_engine *engine, node *n) { - const gc_component *model; + const void *model = engine->get_component(engine, n->name); gc_component *cmp = NULL; - - model = get_component(n->name); if (!model) return (NULL); cmp = new_component(model, 0, 0, 0, 0, 0, 0, 0); diff --git a/src/engine/engine.c b/src/engine/engine.c index f2a41b6..cb39058 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -80,8 +80,7 @@ gc_engine *engine_create(char *title, unsigned framerate) engine->draw_texture = &renderer_draw_texture; engine->destroy = &engine_destroy; engine->scene = NULL; - engine->systems = NULL; - engine->add_system = &engine_add_system; engine_add_buildin_systems(engine); + engine_add_buildin_components(engine); return (engine); } \ No newline at end of file diff --git a/src/engine/engine_component_builder.c b/src/engine/engine_component_builder.c new file mode 100644 index 0000000..1e0abdd --- /dev/null +++ b/src/engine/engine_component_builder.c @@ -0,0 +1,46 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** engine_system_builder +*/ + +#include "engine.h" +#include "system.h" +#include "components/movable_component.h" +#include "components/parallax_component.h" +#include "components/texture_renderer.h" +#include "components/transform_component.h" +#include + +void engine_add_component(gc_engine *engine, const void *component) +{ + gc_list *components = engine->components; + + if (!components) { + engine->components = malloc(sizeof(gc_list)); + if (!engine->components) + return; + engine->components->data = (void *)component; + engine->components->next = NULL; + } else { + while (components->next) + components = components->next; + components->next = malloc(sizeof(gc_list)); + if (!components->next) + return; + components->next->data = (void *)component; + components->next->next = NULL; + } +} + +void engine_add_buildin_components(gc_engine *engine) +{ + engine->components = NULL; + engine->add_component = &engine_add_component; + engine->get_component = &engine_get_component; + engine->add_component(engine, &transform_component); + engine->add_component(engine, &movable_component); + engine->add_component(engine, &texture_renderer); + engine->add_component(engine, ¶llax_component); +} \ No newline at end of file diff --git a/src/engine/engine_system_builder.c b/src/engine/engine_system_builder.c index 5bae348..19fd389 100644 --- a/src/engine/engine_system_builder.c +++ b/src/engine/engine_system_builder.c @@ -8,6 +8,7 @@ #include "engine.h" #include "system.h" #include "systems/texture_renderer_system.h" +#include "systems/parallax_system.h" #include void engine_add_system(gc_engine *engine, const gc_system *system) @@ -16,12 +17,16 @@ void engine_add_system(gc_engine *engine, const gc_system *system) if (!systems) { engine->systems = malloc(sizeof(gc_list)); + if (!engine->systems) + return; engine->systems->data = (void *)system; engine->systems->next = NULL; } else { while (systems->next) systems = systems->next; systems->next = malloc(sizeof(gc_list)); + if (!systems->next) + return; systems->next->data = (void *)system; systems->next->next = NULL; } @@ -29,5 +34,9 @@ void engine_add_system(gc_engine *engine, const gc_system *system) void engine_add_buildin_systems(gc_engine *engine) { + engine->systems = NULL; + engine->add_system = &engine_add_system; + engine->get_system = &engine_get_system; engine->add_system(engine, &texture_renderer_system); + engine->add_system(engine, ¶llax_system); } \ No newline at end of file diff --git a/src/renderer/renderer.c b/src/renderer/renderer.c index 0e68307..5f34aba 100644 --- a/src/renderer/renderer.c +++ b/src/renderer/renderer.c @@ -26,7 +26,7 @@ void renderer_draw_texture(gc_engine *engine, gc_sprite *sprite) sfSprite_setTexture(engine->sprite, sprite->texture->texture, true); sfSprite_setPosition(engine->sprite, pos); sfSprite_setScale(engine->sprite, scale); - // sfSprite_setTextureRect(engine->sprite, rect); + sfSprite_setTextureRect(engine->sprite, rect); sfRenderWindow_drawSprite(engine->window, engine->sprite, NULL); } diff --git a/src/renderer/texture_utility.c b/src/renderer/texture_utility.c index fad1aad..59172d1 100644 --- a/src/renderer/texture_utility.c +++ b/src/renderer/texture_utility.c @@ -41,6 +41,9 @@ gc_texture *texture_create(const char *path) return (NULL); texture->texture = sfTexture_createFromFile(path, NULL); texture->name = my_strdup(path); + if (!texture->texture || !texture->name) + return (NULL); + sfTexture_setRepeated(texture->texture, sfTrue); texture->destroy = &texture_destroy; return (texture); } \ No newline at end of file diff --git a/src/system.c b/src/system.c index 020a858..05f60ce 100644 --- a/src/system.c +++ b/src/system.c @@ -23,11 +23,11 @@ bool system_check_dependencies(const gc_system *sys, const gc_entity *entity) return (true); } -const void *get_system(gc_engine *engine, char *name) +const gc_system *engine_get_system(gc_engine *engine, const char *name) { for (gc_list *sys = engine->systems; sys; sys = sys->next) { if (!my_strcmp(((const gc_system *)sys->data)->name, name)) - return (sys); + return (sys->data); } return (NULL); } diff --git a/src/systems/parallax_system.c b/src/systems/parallax_system.c index 4027b5f..850551e 100644 --- a/src/systems/parallax_system.c +++ b/src/systems/parallax_system.c @@ -24,6 +24,7 @@ void parallax_update_entity(gc_engine *engine, gc_entity *entity, float dtime) if (!text->sprite) return; text->sprite->rect.left += parallax->speed * dtime; + (void)engine; } void parallax_destroy(void *system) @@ -31,7 +32,7 @@ void parallax_destroy(void *system) (void)system; } -const gc_system texture_renderer_system = { +const gc_system parallax_system = { name: "ParallaxSystem", component_name: "ParallaxComponent", check_dependencies: &system_check_dependencies,