diff --git a/Makefile b/Makefile index dc9cbbc..5a72d7b 100644 --- a/Makefile +++ b/Makefile @@ -7,15 +7,14 @@ SRC = src/engine/engine.c \ src/engine/engine_internal.c \ - src/engine/event_handler.c \ - src/renderer/renderer.c \ + src/renderer/sfml_functions.c \ src/renderer/texture_utility.c \ src/entity/entity.c \ src/entity/entity_factory.c \ src/component.c \ src/components/movable_component.c \ src/components/transform_component.c \ - src/components/texture_renderer.c \ + src/components/renderer.c \ src/components/parallax_component.c \ src/scene/scene.c \ src/utility/my_strdup.c \ @@ -32,7 +31,7 @@ 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/sfml_renderer_system.c \ src/systems/parallax_system.c \ src/engine/engine_system_builder.c \ src/engine/engine_component_builder.c diff --git a/include/components/texture_renderer.h b/include/components/renderer.h similarity index 61% rename from include/components/texture_renderer.h rename to include/components/renderer.h index f4410e9..0bd6b4d 100644 --- a/include/components/texture_renderer.h +++ b/include/components/renderer.h @@ -11,10 +11,15 @@ #include "sprite.h" #include "vector2.h" -struct texture_renderer +enum GC_TEXTURETYPE { + GC_TEXTUREREND +}; + +struct renderer { gc_component base; gc_sprite *sprite; + enum GC_TEXTURETYPE type; }; -extern const struct texture_renderer texture_renderer; \ No newline at end of file +extern const struct renderer renderer_component; \ No newline at end of file diff --git a/include/engine.h b/include/engine.h index 21e8d12..b8b13d3 100644 --- a/include/engine.h +++ b/include/engine.h @@ -14,17 +14,16 @@ typedef struct gc_engine gc_engine; #include "texture.h" #include "system.h" #include "list.h" -#include "sprite.h" #include -#include struct gc_engine { gc_scene *scene; bool (*is_open)(gc_engine *engine); - int (*game_loop)(gc_engine *engine); + void (*handle_events)(gc_engine *engine); + int (*game_loop)(gc_engine *engine, float dtime); + void (*draw)(gc_engine *engine); int (*change_scene)(gc_engine *engine, gc_scene *scene); - void (*draw_texture)(gc_engine *, gc_sprite *); void (*destroy)(gc_engine *engine); gc_list *systems; @@ -34,16 +33,12 @@ struct gc_engine 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; - sfClock *clock; - void (*draw)(gc_engine *engine); }; -gc_engine *engine_create(char *title, unsigned framerate); +gc_engine *engine_create(); bool engine_is_open(gc_engine *engine); void handle_events(gc_engine *engine); +void engine_draw(gc_engine *engine); int change_scene(gc_engine *engine, gc_scene *scene); void engine_add_buildin_systems(gc_engine *engine); @@ -52,4 +47,6 @@ 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 +void engine_add_component(gc_engine *engine, const void *component); + +int engine_use_sfml(gc_engine *engine, const char *title, int framerate); \ No newline at end of file diff --git a/include/renderer.h b/include/renderer.h deleted file mode 100644 index 70be2a6..0000000 --- a/include/renderer.h +++ /dev/null @@ -1,14 +0,0 @@ -/* -** EPITECH PROJECT, 2019 -** MUL_my_runner_2019 -** File description: -** renderer -*/ - -#pragma once - -#include "engine.h" - -void renderer_draw(gc_engine *engine); -gc_texture *texture_create(const char *path); -void renderer_draw_texture(gc_engine *, gc_sprite *); \ No newline at end of file diff --git a/include/system.h b/include/system.h index c302ef8..fd93c85 100644 --- a/include/system.h +++ b/include/system.h @@ -9,7 +9,6 @@ typedef struct gc_system gc_system; #pragma once -#include "systems/texture_renderer_system.h" #include "entity.h" #include @@ -18,7 +17,7 @@ struct gc_system const char *name; const char *component_name; bool (*check_dependencies)(const gc_system *, const gc_entity *); - void (*update_entity)(gc_engine *engine, gc_entity *entity, float dtime); + void (*update_entity)(void *system, gc_entity *entity, float dtime); void (*destroy)(void *system); }; diff --git a/include/systems/sfml_renderer_system.h b/include/systems/sfml_renderer_system.h new file mode 100644 index 0000000..496c402 --- /dev/null +++ b/include/systems/sfml_renderer_system.h @@ -0,0 +1,25 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** texture_renderer_system +*/ + +#pragma once + +#include "system.h" +#include + +typedef struct sfml_renderer_system sfml_renderer_system; +struct sfml_renderer_system +{ + gc_system system; + sfRenderWindow *window; + sfSprite *sprite; +}; + +gc_system *gc_new_sfml_renderer(gc_engine *engine, \ +const char *title, int framerate); +bool sfml_is_open(gc_engine *engine); +void sfml_handle_events(gc_engine *engine); +void sfml_draw(gc_engine *engine); \ No newline at end of file diff --git a/include/systems/texture_renderer_system.h b/include/systems/texture_renderer_system.h deleted file mode 100644 index 6270c28..0000000 --- a/include/systems/texture_renderer_system.h +++ /dev/null @@ -1,12 +0,0 @@ -/* -** EPITECH PROJECT, 2019 -** MUL_my_runner_2019 -** File description: -** texture_renderer_system -*/ - -#pragma once - -#include "system.h" - -extern const gc_system texture_renderer_system; \ No newline at end of file diff --git a/include/texture.h b/include/texture.h index e54a25d..0ad433e 100644 --- a/include/texture.h +++ b/include/texture.h @@ -18,4 +18,5 @@ struct gc_texture void (*destroy)(gc_texture *texture); }; -gc_texture *get_texture(gc_engine *engine, char *name); \ No newline at end of file +gc_texture *get_texture(gc_engine *engine, char *name); +gc_texture *texture_create(const char *path); \ No newline at end of file diff --git a/src/component.c b/src/component.c index e47d90e..4cde2a3 100644 --- a/src/component.c +++ b/src/component.c @@ -8,7 +8,7 @@ #include "component.h" #include "components/transform_component.h" #include "components/movable_component.h" -#include "components/texture_renderer.h" +#include "components/renderer.h" #include "components/parallax_component.h" #include "utility.h" #include diff --git a/src/components/parallax_component.c b/src/components/parallax_component.c index 636987b..4d3bbdd 100644 --- a/src/components/parallax_component.c +++ b/src/components/parallax_component.c @@ -39,7 +39,7 @@ const struct parallax_component parallax_component = { base: { name: "ParallaxComponent", size: sizeof(struct parallax_component), - dependencies: (char *[]){"TransformComponent", "TextureRenderer", NULL}, + dependencies: (char *[]){"TransformComponent", "Renderer", NULL}, ctr: ¶llax_ctr, fdctr: ¶llax_fdctr, dtr: ¶llax_dtr, diff --git a/src/components/texture_renderer.c b/src/components/renderer.c similarity index 69% rename from src/components/texture_renderer.c rename to src/components/renderer.c index 7ba77f4..9c484ff 100644 --- a/src/components/texture_renderer.c +++ b/src/components/renderer.c @@ -8,13 +8,14 @@ #include "engine.h" #include "xml.h" #include "utility.h" +#include "sprite.h" #include "components/transform_component.h" -#include "components/texture_renderer.h" +#include "components/renderer.h" #include -static void texture_rend_ctr(void *component, va_list args) +static void rend_ctr(void *component, va_list args) { - struct texture_renderer *cmp = (struct texture_renderer *)component; + struct renderer *cmp = (struct renderer *)component; sfVector2u size; cmp->sprite = malloc(sizeof(gc_sprite)); @@ -29,9 +30,9 @@ static void texture_rend_ctr(void *component, va_list args) } } -static void texture_rend_fdctr(gc_engine *engine, void *component, node *n) +static void rend_fdctr(gc_engine *engine, void *component, node *n) { - struct texture_renderer *cmp = (struct texture_renderer *)component; + struct renderer *cmp = (struct renderer *)component; node *rect = xml_getnode(n, "Rect"); sfVector2u size; @@ -48,31 +49,33 @@ static void texture_rend_fdctr(gc_engine *engine, void *component, node *n) cmp->sprite->rect.height = (float)size.y; cmp->sprite->rect.width = (float)size.x; } + cmp->type = GC_TEXTUREREND; } -static void texture_rend_dtr(void *component) +static void rend_dtr(void *component) { (void)component; } -static char *texture_rend_serialize(void *component) +static char *rend_serialize(void *component) { (void)component; return (NULL); } -const struct texture_renderer texture_renderer = { +const struct renderer renderer_component = { base: { - name: "TextureRenderer", - size: sizeof(struct texture_renderer), + name: "Renderer", + size: sizeof(struct renderer), dependencies: (char *[]){"TransformComponent", NULL}, - ctr: &texture_rend_ctr, - fdctr: &texture_rend_fdctr, - dtr: &texture_rend_dtr, - serialize: &texture_rend_serialize, + ctr: &rend_ctr, + fdctr: &rend_fdctr, + dtr: &rend_dtr, + serialize: &rend_serialize, destroy: &component_destroy, next: NULL, prev: NULL }, sprite: NULL, + type: GC_TEXTUREREND }; \ No newline at end of file diff --git a/src/engine/engine.c b/src/engine/engine.c index 17cb035..1e0e960 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -7,7 +7,6 @@ #include "engine.h" #include "system.h" -#include "renderer.h" #include #include #include @@ -22,15 +21,13 @@ void update_system(gc_engine *engine, gc_system *sys, float dtime) entities = scene->get_entity_by_cmp(scene, sys->component_name); for (gc_list *entity = entities; entity; entity = entity->next) { if (sys->check_dependencies(sys, entity->data)) - sys->update_entity(engine, entity->data, dtime); + sys->update_entity(sys, entity->data, dtime); } } -int game_loop(gc_engine *engine) +int game_loop(gc_engine *engine, float dtime) { - float dtime = sfTime_asSeconds(sfClock_restart(engine->clock)); - - handle_events(engine); + engine->handle_events(engine); for (gc_list *sys = engine->systems; sys; sys = sys->next) update_system(engine, sys->data, dtime); engine->draw(engine); @@ -48,43 +45,22 @@ void engine_destroy(gc_engine *engine) ((gc_system *)system->data)->destroy(system->data); free(system); } - sfSprite_destroy(engine->sprite); - sfRenderWindow_destroy(engine->window); - sfClock_destroy(engine->clock); free(engine); } -int engine_create_sfdata(gc_engine *engine, char *title, unsigned framerate) -{ - sfVideoMode mode = {800, 600, 32}; - sfWindowStyle style = sfDefaultStyle; - - engine->window = sfRenderWindow_create(mode, title, style, NULL); - engine->sprite = sfSprite_create(); - engine->clock = sfClock_create(); - if (!engine->window || !engine->sprite || !engine->clock) - return (-1); - sfRenderWindow_setFramerateLimit(engine->window, framerate); - return (0); -} - -gc_engine *engine_create(char *title, unsigned framerate) +gc_engine *engine_create() { gc_engine *engine = malloc(sizeof(gc_engine)); if (!engine) return (NULL); - if (engine_create_sfdata(engine, title, framerate) < 0) { - free(engine); - return (NULL); - } - engine->is_open = &engine_is_open; - engine->game_loop = &game_loop; - engine->change_scene = &change_scene; - engine->draw = &renderer_draw; - engine->draw_texture = &renderer_draw_texture; - engine->destroy = &engine_destroy; engine->scene = NULL; + engine->is_open = &engine_is_open; + engine->handle_events = &handle_events; + engine->game_loop = &game_loop; + engine->draw = &engine_draw; + engine->change_scene = &change_scene; + engine->destroy = &engine_destroy; engine_add_buildin_systems(engine); engine_add_buildin_components(engine); return (engine); diff --git a/src/engine/engine_component_builder.c b/src/engine/engine_component_builder.c index c19c9f6..ba4a8ab 100644 --- a/src/engine/engine_component_builder.c +++ b/src/engine/engine_component_builder.c @@ -9,7 +9,7 @@ #include "system.h" #include "components/movable_component.h" #include "components/parallax_component.h" -#include "components/texture_renderer.h" +#include "components/renderer.h" #include "components/transform_component.h" #include @@ -25,6 +25,6 @@ void engine_add_buildin_components(gc_engine *engine) 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, &renderer_component); engine->add_component(engine, ¶llax_component); } \ No newline at end of file diff --git a/src/engine/engine_internal.c b/src/engine/engine_internal.c index 2956fd4..d3dbd60 100644 --- a/src/engine/engine_internal.c +++ b/src/engine/engine_internal.c @@ -10,7 +10,18 @@ bool engine_is_open(gc_engine *engine) { - return (sfRenderWindow_isOpen(engine->window)); + (void)engine; + return (false); +} + +void handle_events(gc_engine *engine) +{ + (void)engine; +} + +void engine_draw(gc_engine *engine) +{ + (void)engine; } int change_scene(gc_engine *engine, gc_scene *scene) diff --git a/src/engine/engine_system_builder.c b/src/engine/engine_system_builder.c index d68c189..80221ff 100644 --- a/src/engine/engine_system_builder.c +++ b/src/engine/engine_system_builder.c @@ -7,7 +7,7 @@ #include "engine.h" #include "system.h" -#include "systems/texture_renderer_system.h" +#include "systems/sfml_renderer_system.h" #include "systems/parallax_system.h" #include @@ -21,6 +21,15 @@ 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); +} + +int engine_use_sfml(gc_engine *engine, const char *title, int framerate) +{ + gc_system *renderer = gc_new_sfml_renderer(engine, title, framerate); + + if (!renderer) + return (-1); + engine->add_system(engine, renderer); + return (0); } \ No newline at end of file diff --git a/src/engine/event_handler.c b/src/engine/event_handler.c deleted file mode 100644 index 62da371..0000000 --- a/src/engine/event_handler.c +++ /dev/null @@ -1,18 +0,0 @@ -/* -** EPITECH PROJECT, 2019 -** MUL_my_runner_2019 -** File description: -** event_handler -*/ - -#include "engine.h" - -void handle_events(gc_engine *engine) -{ - sfEvent event; - - while (sfRenderWindow_pollEvent(engine->window, &event)) { - if (event.type == sfEvtClosed) - sfRenderWindow_close(engine->window); - } -} \ No newline at end of file diff --git a/src/renderer/renderer.c b/src/renderer/renderer.c deleted file mode 100644 index 5f34aba..0000000 --- a/src/renderer/renderer.c +++ /dev/null @@ -1,37 +0,0 @@ -/* -** EPITECH PROJECT, 2019 -** MUL_my_runner_2019 -** File description: -** render -*/ - -#include "engine.h" -#include "sprite.h" -#include - -void renderer_draw_texture(gc_engine *engine, gc_sprite *sprite) -{ - sfVector2f pos = (sfVector2f){sprite->pos.x, sprite->pos.y}; - sfVector2f scale; - sfVector2u t; - sfIntRect rect = { - (int)sprite->rect.left, (int)sprite->rect.top, - (int)sprite->rect.width, (int)sprite->rect.height - }; - - if (!sprite->texture) - return; - t = sfTexture_getSize(sprite->texture->texture); - scale = (sfVector2f){sprite->size.x / t.x, sprite->size.y / t.y}; - sfSprite_setTexture(engine->sprite, sprite->texture->texture, true); - sfSprite_setPosition(engine->sprite, pos); - sfSprite_setScale(engine->sprite, scale); - sfSprite_setTextureRect(engine->sprite, rect); - sfRenderWindow_drawSprite(engine->window, engine->sprite, NULL); -} - -void renderer_draw(gc_engine *engine) -{ - sfRenderWindow_display(engine->window); - sfRenderWindow_clear(engine->window, sfBlack); -} \ No newline at end of file diff --git a/src/renderer/sfml_functions.c b/src/renderer/sfml_functions.c new file mode 100644 index 0000000..740c4a4 --- /dev/null +++ b/src/renderer/sfml_functions.c @@ -0,0 +1,39 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** sfml_functions +*/ + +#include "engine.h" +#include +#include "systems/sfml_renderer_system.h" + +bool sfml_is_open(gc_engine *engine) +{ + sfml_renderer_system *renderer = (sfml_renderer_system *)\ +engine->get_system(engine, "SfmlRendererSystem"); + + return (sfRenderWindow_isOpen(renderer->window)); +} + +void sfml_handle_events(gc_engine *engine) +{ + sfml_renderer_system *renderer = (sfml_renderer_system *)\ +engine->get_system(engine, "SfmlRendererSystem"); + sfEvent event; + + while (sfRenderWindow_pollEvent(renderer->window, &event)) { + if (event.type == sfEvtClosed) + sfRenderWindow_close(renderer->window); + } +} + +void sfml_draw(gc_engine *engine) +{ + sfml_renderer_system *renderer = (sfml_renderer_system *)\ +engine->get_system(engine, "SfmlRendererSystem"); + + sfRenderWindow_display(renderer->window); + sfRenderWindow_clear(renderer->window, sfBlack); +} \ No newline at end of file diff --git a/src/scene/scene.c b/src/scene/scene.c index 54e01aa..1fff3dc 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -7,8 +7,8 @@ #include "engine.h" #include "entity.h" -#include "renderer.h" #include "utility.h" +#include "texture.h" #include gc_list *get_entity_by_cmp(gc_scene *scene, const char *cmp_name) diff --git a/src/scene/scene_creator.c b/src/scene/scene_creator.c new file mode 100644 index 0000000..c5b8b4b --- /dev/null +++ b/src/scene/scene_creator.c @@ -0,0 +1,8 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** scene_creator +*/ + +int scene_create_fromxml() \ No newline at end of file diff --git a/src/systems/parallax_system.c b/src/systems/parallax_system.c index 850551e..3ba17ad 100644 --- a/src/systems/parallax_system.c +++ b/src/systems/parallax_system.c @@ -9,22 +9,21 @@ #include "system.h" #include "texture.h" #include "vector2.h" -#include "systems/texture_renderer_system.h" #include "components/parallax_component.h" -#include "components/texture_renderer.h" +#include "components/renderer.h" #include -void parallax_update_entity(gc_engine *engine, gc_entity *entity, float dtime) +void parallax_update_entity(void *system, gc_entity *entity, float dtime) { - struct texture_renderer *text = \ -(struct texture_renderer *)entity->get_component(entity, "TextureRenderer"); + struct renderer *text = \ +(struct renderer *)entity->get_component(entity, "Renderer"); struct parallax_component *parallax = \ (struct parallax_component *)entity->get_component(entity, "ParallaxComponent"); if (!text->sprite) return; text->sprite->rect.left += parallax->speed * dtime; - (void)engine; + (void)system; } void parallax_destroy(void *system) diff --git a/src/systems/sfml_renderer_system.c b/src/systems/sfml_renderer_system.c new file mode 100644 index 0000000..f1929e2 --- /dev/null +++ b/src/systems/sfml_renderer_system.c @@ -0,0 +1,93 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** texture_renderer_system +*/ + +#include "entity.h" +#include "system.h" +#include "texture.h" +#include "vector2.h" +#include "systems/sfml_renderer_system.h" +#include "components/transform_component.h" +#include "components/renderer.h" +#include + +void renderer_draw_texture(sfml_renderer_system *renderer, gc_sprite *sprite) +{ + sfVector2f pos = (sfVector2f){sprite->pos.x, sprite->pos.y}; + sfVector2f scale; + sfVector2u t; + sfIntRect rect = { + (int)sprite->rect.left, (int)sprite->rect.top, + (int)sprite->rect.width, (int)sprite->rect.height + }; + + if (!sprite->texture) + return; + t = sfTexture_getSize(sprite->texture->texture); + scale = (sfVector2f){sprite->size.x / t.x, sprite->size.y / t.y}; + sfSprite_setTexture(renderer->sprite, sprite->texture->texture, true); + sfSprite_setPosition(renderer->sprite, pos); + sfSprite_setScale(renderer->sprite, scale); + sfSprite_setTextureRect(renderer->sprite, rect); + sfRenderWindow_drawSprite(renderer->window, renderer->sprite, NULL); +} + +void sfml_update_entity(void *system, gc_entity *entity, float dtime) +{ + struct transform_component *pos = (struct transform_component *)\ +entity->get_component(entity, "TransformComponent"); + struct renderer *text = (struct renderer *)\ +entity->get_component(entity, "Renderer"); + + if (!text->sprite) + return; + text->sprite->pos = pos->position; + text->sprite->size = pos->size; + if (text->type == GC_TEXTUREREND) + renderer_draw_texture((sfml_renderer_system *)system, text->sprite); + (void)dtime; +} + +void sfml_destroy(void *system) +{ + sfml_renderer_system *renderer = (sfml_renderer_system *)system; + + sfRenderWindow_destroy(renderer->window); + sfSprite_destroy(renderer->sprite); +} + +const sfml_renderer_system sfml_renderer = { + { + name: "SfmlRendererSystem", + component_name: "Renderer", + check_dependencies: &system_check_dependencies, + update_entity: &sfml_update_entity, + destroy: &sfml_destroy + }, + window: NULL, + sprite: NULL +}; + +gc_system *gc_new_sfml_renderer(gc_engine *engine, \ +const char *title, int framerate) +{ + sfml_renderer_system *renderer = malloc(sizeof(sfml_renderer_system)); + sfVideoMode mode = {800, 600, 32}; + sfWindowStyle style = sfDefaultStyle; + + if (!renderer) + return (NULL); + *renderer = sfml_renderer; + renderer->window = sfRenderWindow_create(mode, title, style, NULL); + renderer->sprite = sfSprite_create(); + if (!renderer->window || !renderer->sprite) + return (NULL); + sfRenderWindow_setFramerateLimit(renderer->window, framerate); + engine->is_open = &sfml_is_open; + engine->handle_events = &sfml_handle_events; + engine->draw = &sfml_draw; + return ((gc_system *)renderer); +} \ No newline at end of file diff --git a/src/systems/texture_renderer_system.c b/src/systems/texture_renderer_system.c deleted file mode 100644 index 16f9651..0000000 --- a/src/systems/texture_renderer_system.c +++ /dev/null @@ -1,43 +0,0 @@ -/* -** EPITECH PROJECT, 2019 -** MUL_my_runner_2019 -** File description: -** texture_renderer_system -*/ - -#include "entity.h" -#include "system.h" -#include "texture.h" -#include "vector2.h" -#include "systems/texture_renderer_system.h" -#include "components/transform_component.h" -#include "components/texture_renderer.h" -#include - -void tex_rend_update_entity(gc_engine *engine, gc_entity *entity, float dtime) -{ - struct transform_component *pos = (struct transform_component *)\ -entity->get_component(entity, "TransformComponent"); - struct texture_renderer *text = (struct texture_renderer *)\ -entity->get_component(entity, "TextureRenderer"); - - if (!text->sprite) - return; - text->sprite->pos = pos->position; - text->sprite->size = pos->size; - engine->draw_texture(engine, text->sprite); - (void)dtime; -} - -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, - destroy: &tex_rend_destroy -}; \ No newline at end of file