diff --git a/Makefile b/Makefile index 4148d71..5163a82 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,8 @@ SRC = src/engine/engine.c \ src/deserializer/deserialize_entity.c \ src/deserializer/prefab.c \ src/system.c \ - src/systems/texture_renderer_system.c + src/systems/texture_renderer_system.c \ + src/engine/engine_system_builder.c OBJ = $(SRC:%.c=%.o) diff --git a/include/components/position_component.h b/include/components/position_component.h index 35eec23..bf6c7d1 100644 --- a/include/components/position_component.h +++ b/include/components/position_component.h @@ -14,6 +14,7 @@ struct position_component { gc_component base; gc_vector2 position; + gc_vector2 size; }; extern const struct position_component position_component; \ No newline at end of file diff --git a/include/components/texture_renderer.h b/include/components/texture_renderer.h index 419ee24..2d51474 100644 --- a/include/components/texture_renderer.h +++ b/include/components/texture_renderer.h @@ -15,7 +15,6 @@ struct texture_renderer { gc_component base; gc_texture *texture; - gc_vector2 scale; }; extern const struct texture_renderer texture_renderer; \ No newline at end of file diff --git a/include/engine.h b/include/engine.h index c5bb87d..6fb347c 100644 --- a/include/engine.h +++ b/include/engine.h @@ -11,6 +11,8 @@ typedef struct gc_engine gc_engine; #include "scene.h" #include "vector2.h" #include "texture.h" +#include "system.h" +#include "list.h" #include #include @@ -21,6 +23,10 @@ struct gc_engine int (*game_loop)(gc_engine *engine); int (*change_scene)(gc_engine *engine, gc_scene *scene); void (*draw_texture)(gc_engine *, gc_texture *, gc_vector2, gc_vector2); + void (*destroy)(gc_engine *engine); + + gc_list *systems; + void (*add_system)(gc_engine *engine, const gc_system *system); sfRenderWindow *window; sfSprite *sprite; @@ -30,4 +36,7 @@ struct gc_engine gc_engine *engine_create(char *title); bool engine_is_open(gc_engine *engine); void handle_events(gc_engine *engine); -int change_scene(gc_engine *engine, gc_scene *scene); \ No newline at end of file +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 diff --git a/include/list.h b/include/list.h new file mode 100644 index 0000000..e4ca8c8 --- /dev/null +++ b/include/list.h @@ -0,0 +1,16 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** list +*/ + +typedef struct gc_list gc_list; + +#pragma once + +struct gc_list +{ + void *data; + gc_list *next; +}; \ No newline at end of file diff --git a/include/system.h b/include/system.h index 9348edc..e909a15 100644 --- a/include/system.h +++ b/include/system.h @@ -19,9 +19,8 @@ struct gc_system const char *component_name; bool (*check_dependencies)(const gc_system *, const gc_entity *); void (*update_entity)(gc_engine *engine, gc_entity *entity); + void (*destroy)(void *system); }; -extern const gc_system *all_systems[]; - bool system_check_dependencies(const gc_system *sys, const gc_entity *entity); void system_destroy(void *system); \ No newline at end of file diff --git a/include/systems/texture_renderer_system.h b/include/systems/texture_renderer_system.h index e9c184f..6270c28 100644 --- a/include/systems/texture_renderer_system.h +++ b/include/systems/texture_renderer_system.h @@ -9,4 +9,4 @@ #include "system.h" -const gc_system texture_renderer_system; \ No newline at end of file +extern const gc_system texture_renderer_system; \ No newline at end of file diff --git a/src/component.c b/src/component.c index dd02021..6b7d960 100644 --- a/src/component.c +++ b/src/component.c @@ -12,15 +12,15 @@ #include "utility.h" #include -const void *all_components[] = { - &position_component, - &movable_component, - &texture_renderer, - NULL -}; - const void *get_component(char *name) { + static const void *all_components[] = { + &position_component, + &movable_component, + &texture_renderer, + NULL + }; + for (int i = 0; all_components[i]; i++) { if (!my_strcmp(((const gc_component *)all_components[i])->name, name)) return (all_components[i]); diff --git a/src/components/position_component.c b/src/components/position_component.c index 3486398..dca74c3 100644 --- a/src/components/position_component.c +++ b/src/components/position_component.c @@ -15,6 +15,7 @@ void position_ctr(void *component, va_list args) struct position_component *cmp = (struct position_component *)component; cmp->position = va_arg(args, gc_vector2); + cmp->size = va_arg(args, gc_vector2); } void position_fdctr(gc_engine *engine, void *component, char *args) @@ -23,6 +24,8 @@ void position_fdctr(gc_engine *engine, void *component, char *args) cmp->position.x = parse_arg_int(&args); cmp->position.y = parse_arg_int(&args); + cmp->size.x = parse_arg_float(&args); + cmp->size.y = parse_arg_float(&args); (void)engine; } @@ -43,5 +46,6 @@ const struct position_component position_component = { serialize: &position_serialize, destroy: &component_destroy }, - position: {0, 0} + position: {0, 0}, + size: {0, 0} }; \ No newline at end of file diff --git a/src/components/texture_renderer.c b/src/components/texture_renderer.c index b4f5683..82aa706 100644 --- a/src/components/texture_renderer.c +++ b/src/components/texture_renderer.c @@ -15,8 +15,6 @@ static void texture_rend_ctr(void *component, va_list args) struct texture_renderer *cmp = (struct texture_renderer *)component; cmp->texture = va_arg(args, gc_texture *); - cmp->scale.x = va_arg(args, double); - cmp->scale.y = va_arg(args, double); } static void texture_rend_fdctr(gc_engine *engine, void *component, char *args) @@ -24,8 +22,6 @@ static void texture_rend_fdctr(gc_engine *engine, void *component, char *args) struct texture_renderer *cmp = (struct texture_renderer *)component; cmp->texture = get_texture(engine, parse_arg_str(&args)); - cmp->scale.x = parse_arg_float(&args); - cmp->scale.y = parse_arg_float(&args); } static void texture_rend_dtr(void *component) @@ -53,5 +49,4 @@ const struct texture_renderer texture_renderer = { prev: NULL }, texture: NULL, - scale: {0, 0} }; \ No newline at end of file diff --git a/src/engine/engine.c b/src/engine/engine.c index 7826fe6..e11931f 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -13,9 +13,9 @@ void update_entity(gc_engine *engine, gc_entity *entity) { - for (int i = 0; all_systems[i]; i++) { - if (all_systems[i]->check_dependencies(all_systems[i], entity)) - all_systems[i]->update_entity(engine, entity); + for (gc_list *sys = engine->systems; sys; sys = sys->next) { + if (((gc_system *)sys->data)->check_dependencies(sys->data, entity)) + ((gc_system *)sys->data)->update_entity(engine, entity); } } @@ -30,6 +30,22 @@ int game_loop(gc_engine *engine) return (0); } +void engine_destroy(gc_engine *engine) +{ + gc_list *next; + + if (engine->scene) + engine->scene->destroy(engine->scene); + for (gc_list *system = engine->systems; system; system = next) { + next = system->next; + ((gc_system *)system->data)->destroy(system->data); + free(system); + } + sfSprite_destroy(engine->sprite); + sfRenderWindow_destroy(engine->window); + free(engine); +} + gc_engine *engine_create(char *title) { gc_engine *engine = malloc(sizeof(gc_engine)); @@ -47,6 +63,10 @@ gc_engine *engine_create(char *title) engine->change_scene = &change_scene; engine->draw = &renderer_draw; 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); return (engine); } \ No newline at end of file diff --git a/src/engine/engine_system_builder.c b/src/engine/engine_system_builder.c new file mode 100644 index 0000000..5bae348 --- /dev/null +++ b/src/engine/engine_system_builder.c @@ -0,0 +1,33 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** engine_system_builder +*/ + +#include "engine.h" +#include "system.h" +#include "systems/texture_renderer_system.h" +#include + +void engine_add_system(gc_engine *engine, const gc_system *system) +{ + gc_list *systems = engine->systems; + + if (!systems) { + engine->systems = malloc(sizeof(gc_list)); + engine->systems->data = (void *)system; + engine->systems->next = NULL; + } else { + while (systems->next) + systems = systems->next; + systems->next = malloc(sizeof(gc_list)); + systems->next->data = (void *)system; + systems->next->next = NULL; + } +} + +void engine_add_buildin_systems(gc_engine *engine) +{ + engine->add_system(engine, &texture_renderer_system); +} \ No newline at end of file diff --git a/src/renderer/renderer.c b/src/renderer/renderer.c index 659c280..0f58ca8 100644 --- a/src/renderer/renderer.c +++ b/src/renderer/renderer.c @@ -10,13 +10,16 @@ void renderer_draw_texture(gc_engine *engine, gc_texture *text, \ -gc_vector2 pos, gc_vector2 scale) +gc_vector2 pos, gc_vector2 size) { + sfVector2u t; + if (!text) return; + t = sfTexture_getSize(text->texture); sfSprite_setTexture(engine->sprite, text->texture, true); sfSprite_setPosition(engine->sprite, (sfVector2f){pos.x, pos.y}); - sfSprite_setScale(engine->sprite, (sfVector2f){scale.x, scale.y}); + sfSprite_setScale(engine->sprite, (sfVector2f){size.x / t.x, size.y / t.y}); sfRenderWindow_drawSprite(engine->window, engine->sprite, NULL); } diff --git a/src/scene/scene.c b/src/scene/scene.c index 3e7cc03..64a8a4f 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -45,20 +45,6 @@ int scene_load_textures(gc_scene *scene, const char **textures) return (0); } -gc_scene *scene_create(const char **textures) -{ - gc_scene *scene = malloc(sizeof(gc_scene)); - - if (!scene) - return (NULL); - scene->textures = NULL; - if (textures && scene_load_textures(scene, textures) < 0) - return (NULL); - scene->entities = NULL; - scene->add_entity = &scene_add_entity; - return (scene); -} - void scene_destroy(gc_scene *scene) { gc_entity *next = NULL; @@ -71,4 +57,19 @@ void scene_destroy(gc_scene *scene) scene->textures[i]->destroy(scene->textures[i]); } free(scene); +} + +gc_scene *scene_create(const char **textures) +{ + gc_scene *scene = malloc(sizeof(gc_scene)); + + if (!scene) + return (NULL); + scene->textures = NULL; + if (textures && scene_load_textures(scene, textures) < 0) + return (NULL); + scene->entities = NULL; + scene->add_entity = &scene_add_entity; + scene->destroy = &scene_destroy; + return (scene); } \ No newline at end of file diff --git a/src/system.c b/src/system.c index 63c025a..7e563c5 100644 --- a/src/system.c +++ b/src/system.c @@ -9,11 +9,6 @@ #include "utility.h" #include -const gc_system *all_systems[] = { - &texture_renderer_system, - NULL -}; - bool system_check_dependencies(const gc_system *sys, const gc_entity *entity) { void *cmp = entity->get_component(entity, sys->component_name); @@ -28,16 +23,16 @@ bool system_check_dependencies(const gc_system *sys, const gc_entity *entity) return (true); } -const void *get_system(char *name) +const void *get_system(gc_engine *engine, char *name) { - for (int i = 0; all_systems[i]; i++) { - if (!my_strcmp(((const gc_system *)all_systems[i])->name, name)) - return (all_systems[i]); + for (gc_list *sys = engine->systems; sys; sys = sys->next) { + if (!my_strcmp(((const gc_system *)sys->data)->name, name)) + return (sys); } return (NULL); } -void system_destroy(void *component) +void system_destroy(void *system) { - free(component); + free(system); } \ No newline at end of file diff --git a/src/systems/texture_renderer_system.c b/src/systems/texture_renderer_system.c index e5abbe1..f8be158 100644 --- a/src/systems/texture_renderer_system.c +++ b/src/systems/texture_renderer_system.c @@ -12,6 +12,7 @@ #include "systems/texture_renderer_system.h" #include "components/position_component.h" #include "components/texture_renderer.h" +#include void tex_rend_update_entity(gc_engine *engine, gc_entity *entity) { @@ -20,12 +21,18 @@ void tex_rend_update_entity(gc_engine *engine, gc_entity *entity) struct texture_renderer *text = (\ struct texture_renderer *)entity->get_component(entity, "TextureRenderer"); - engine->draw_texture(engine, text->texture, pos->position, text->scale); + engine->draw_texture(engine, text->texture, pos->position, pos->size); +} + +void tex_rend_destroy(void *system) +{ + (void)system; } const gc_system texture_renderer_system = { name: "TextureRendererSystem", component_name: "TextureRenderer", check_dependencies: &system_check_dependencies, - update_entity: &tex_rend_update_entity + update_entity: &tex_rend_update_entity, + destroy: &tex_rend_destroy }; \ No newline at end of file