From a1b400860f60ea3957522688b96c54e5d4e7dafe Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Fri, 27 Mar 2020 14:26:50 +0100 Subject: [PATCH] Cleaning up --- Makefile | 1 + include/components/renderer.h | 1 + include/map_utils.h | 3 - include/sfml_renderer.h | 2 + src/components/renderer.c | 22 ++---- src/components/renderers/anim_renderer.c | 32 ++++----- src/components/renderers/anim_utils.c | 26 +++++++ src/components/renderers/sprite_renderer.c | 18 ++--- src/components/renderers/text_renderer.c | 8 +++ src/isometry/tile_collisions.c | 82 ++++++++++++++++++++++ src/sfml_renderer/sfml_events.c | 41 ++++++----- src/systems/sfml_renderer_system.c | 10 +-- 12 files changed, 178 insertions(+), 68 deletions(-) create mode 100644 src/components/renderers/anim_utils.c create mode 100644 src/isometry/tile_collisions.c diff --git a/Makefile b/Makefile index f3ff4ac..34388d5 100644 --- a/Makefile +++ b/Makefile @@ -68,6 +68,7 @@ SRC = src/engine/engine.c \ src/ui/tooltip.c \ src/isometry/isometry.c \ src/isometry/map_utils.c \ + src/isometry/tile_collisions.c \ src/components/vertex_component.c \ src/isometry/vertex_data_loader.c diff --git a/include/components/renderer.h b/include/components/renderer.h index e7ee7c6..27e9a3f 100644 --- a/include/components/renderer.h +++ b/include/components/renderer.h @@ -24,6 +24,7 @@ struct renderer enum gc_texturetype type; void *data; bool is_visible; + void (*destroy)(struct renderer *); }; void sprite_ctr(struct renderer *cmp, va_list args); diff --git a/include/map_utils.h b/include/map_utils.h index 3a01f6a..094452e 100644 --- a/include/map_utils.h +++ b/include/map_utils.h @@ -13,9 +13,6 @@ #define ANGLE_Y 35 #define ADD_VALUE 10 -void move_verticies(gc_engine *engine, struct tile *ret, char mode, bool r); -int get_index_nearest_vertex(struct tile *sel, gc_vector2 pos); struct tile *get_tile_from_pos(struct vertex_component *map, gc_vector2 pos); -bool map_manage_click(gc_engine *engine, int id, gc_vector2 pos); gc_vector2 gc_vector2_from_coords(float x, float y, float z); bool is_pos_in_tile(gc_vector2 pos, struct tile *tile); \ No newline at end of file diff --git a/include/sfml_renderer.h b/include/sfml_renderer.h index 23b30d4..4b9c4e1 100644 --- a/include/sfml_renderer.h +++ b/include/sfml_renderer.h @@ -51,3 +51,5 @@ gc_vector2 sfml_engine_get_cursor_pos(gc_engine *engine); void entities_update_to_cam(gc_scene *scene, \ struct sfml_renderer_system *renderer); void entities_update_to_cam_size(gc_scene *scene, gc_vector2 size); + +typedef void (*drawer)(gc_engine *, gc_entity *, void *, float); \ No newline at end of file diff --git a/src/components/renderer.c b/src/components/renderer.c index 7860977..cfe6e13 100644 --- a/src/components/renderer.c +++ b/src/components/renderer.c @@ -19,6 +19,7 @@ static void ctr(void *component, va_list args) struct renderer *cmp = (struct renderer *)component; gc_texturetype type = va_arg(args, gc_texturetype); + cmp->destroy = NULL; cmp->data = NULL; cmp->type = type; cmp->is_visible = true; @@ -48,6 +49,7 @@ static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) struct renderer *cmp = (struct renderer *)component; gc_texturetype type = renderer_get_type(n); + cmp->destroy = NULL; cmp->type = type; cmp->is_visible = true; if (type == GC_TEXTUREREND) @@ -65,24 +67,8 @@ static void dtr(void *component) { struct renderer *cmp = (struct renderer *)component; - switch (cmp->type) { - case GC_ANIMREND: - for (int i = 0; i < ((gc_animholder *)cmp->data)->animcount; i++) { - if (my_strcmp(((gc_animholder *)cmp->data)->anims[i].name, "none")) - free(((gc_animholder *)cmp->data)->anims[i].name); - } - free(((gc_animholder *)cmp->data)->sprite); - free(((gc_animholder *)cmp->data)->anims); - free(cmp->data); - break; - case GC_TXTREND: - free(((gc_text *)cmp->data)->text); - free(cmp->data); - break; - case GC_TEXTUREREND: - free(cmp->data); - break; - } + if (cmp->destroy) + cmp->destroy(cmp); } static char *serialize(void *component) diff --git a/src/components/renderers/anim_renderer.c b/src/components/renderers/anim_renderer.c index bd51e10..788e2b9 100644 --- a/src/components/renderers/anim_renderer.c +++ b/src/components/renderers/anim_renderer.c @@ -12,20 +12,15 @@ #include "my.h" #include -void rend_set_anim(struct renderer *rend, const char *name) +void destroy_anim_renderer(struct renderer *cmp) { - gc_animholder *holder = (gc_animholder *)rend->data; - - if (holder->current && !my_strcmp(holder->current->name, name)) - return; - for (int i = 0; i < holder->animcount; i++) { - if (!my_strcmp(holder->anims[i].name, name)) { - holder->current = &holder->anims[i]; - holder->sprite->rect = holder->anims[i].rect; - return; - } + for (int i = 0; i < ((gc_animholder *)cmp->data)->animcount; i++) { + if (my_strcmp(((gc_animholder *)cmp->data)->anims[i].name, "none")) + free(((gc_animholder *)cmp->data)->anims[i].name); } - my_printf("Gamacon: unknown animation %s.\n", name); + free(((gc_animholder *)cmp->data)->sprite); + free(((gc_animholder *)cmp->data)->anims); + free(cmp->data); } void anim_ctr(struct renderer *cmp, va_list args) @@ -36,6 +31,7 @@ void anim_ctr(struct renderer *cmp, va_list args) if (!sprite) return; cmp->data = sprite; + cmp->destroy = &destroy_anim_renderer; sprite->texture = va_arg(args, sfTexture *); sprite->rect = va_arg(args, gc_int_rect); if (sprite->texture && sprite->rect.height < 0) { @@ -57,13 +53,13 @@ void animation_fdctr(gc_anim *anim, gc_sprite *sprite, node *n) anim->rect.width = sprite->rect.width; anim->rect.top = sprite->rect.top; anim->rect.left = sprite->rect.left; - if ((tmp = xml_getfloatprop(rect, "height")) != 0) + if ((tmp = xml_getintprop(rect, "height")) != 0) anim->rect.height = tmp; - if ((tmp = xml_getfloatprop(rect, "width")) != 0) + if ((tmp = xml_getintprop(rect, "width")) != 0) anim->rect.width = tmp; - if ((tmp = xml_getfloatprop(rect, "top")) != 0) + if ((tmp = xml_getintprop(rect, "top")) != 0) anim->rect.top = tmp; - if ((tmp = xml_getfloatprop(rect, "left")) != 0) + if ((tmp = xml_getintprop(rect, "left")) != 0) anim->rect.left = tmp; } @@ -81,8 +77,7 @@ void anim_fdctr(gc_scene *scene, struct renderer *cmp, node *n) int animcount = xml_getchildcount_filtered(n, "animation") + 1; int i = 1; - hold->anims = malloc(sizeof(gc_anim) * animcount); - if (!hold || !hold->anims) + if (!hold || !(hold->anims = malloc(sizeof(gc_anim) * animcount))) return; sprite_fdctr(scene, cmp, n); hold->sprite = (gc_sprite *)cmp->data; @@ -90,6 +85,7 @@ void anim_fdctr(gc_scene *scene, struct renderer *cmp, node *n) hold->animcount = animcount; hold->timesince_up = 0; cmp->data = hold; + cmp->destroy = &destroy_anim_renderer; animation_setnone(&hold->anims[0], hold->sprite); for (n = n->child; n; n = n->next) { if (my_strcmp(n->name, "animation")) diff --git a/src/components/renderers/anim_utils.c b/src/components/renderers/anim_utils.c new file mode 100644 index 0000000..82479e4 --- /dev/null +++ b/src/components/renderers/anim_utils.c @@ -0,0 +1,26 @@ +/* +** EPITECH PROJECT, 2020 +** my_rpg +** File description: +** anim_utils.c +*/ + +#include "sprite.h" +#include "my.h" +#include "renderer.h" + +void rend_set_anim(struct renderer *rend, const char *name) +{ + gc_animholder *holder = (gc_animholder *)rend->data; + + if (holder->current && !my_strcmp(holder->current->name, name)) + return; + for (int i = 0; i < holder->animcount; i++) { + if (!my_strcmp(holder->anims[i].name, name)) { + holder->current = &holder->anims[i]; + holder->sprite->rect = holder->anims[i].rect; + return; + } + } + my_printf("Gamacon: unknown animation %s.\n", name); +} \ No newline at end of file diff --git a/src/components/renderers/sprite_renderer.c b/src/components/renderers/sprite_renderer.c index c617c2f..4e7e799 100644 --- a/src/components/renderers/sprite_renderer.c +++ b/src/components/renderers/sprite_renderer.c @@ -22,6 +22,7 @@ void sprite_ctr(struct renderer *cmp, va_list args) if (!sprite) return; cmp->data = sprite; + cmp->destroy = (void (*)(struct renderer *))&free; sprite->texture = va_arg(args, sfTexture *); sprite->rect = va_arg(args, gc_int_rect); if (sprite->texture && sprite->rect.height <= 0) { @@ -38,18 +39,19 @@ void sprite_fdctr(gc_scene *scene, struct renderer *cmp, node *n) sfVector2u size; gc_sprite *sprite = malloc(sizeof(gc_sprite)); - cmp->data = sprite; - if (!cmp->data) + if (!sprite) return; + cmp->data = sprite; + cmp->destroy = (void (*)(struct renderer *))&free; sprite->texture = get_texture(scene, xml_gettempprop(n, "src")); - sprite->rect.height = xml_getfloatprop(rect, "height"); - sprite->rect.width = xml_getfloatprop(rect, "width"); - sprite->rect.top = xml_getfloatprop(rect, "top"); - sprite->rect.left = xml_getfloatprop(rect, "left"); + sprite->rect.height = xml_getintprop(rect, "height"); + sprite->rect.width = xml_getintprop(rect, "width"); + sprite->rect.top = xml_getintprop(rect, "top"); + sprite->rect.left = xml_getintprop(rect, "left"); if (sprite->texture && sprite->rect.height <= 0) { size = sfTexture_getSize(sprite->texture); - sprite->rect.height = (float)size.y; - sprite->rect.width = (float)size.x; + sprite->rect.height = (int)size.y; + sprite->rect.width = (int)size.x; } sprite->scale = (gc_vector2){1, 1}; } diff --git a/src/components/renderers/text_renderer.c b/src/components/renderers/text_renderer.c index b638c4c..3d1a450 100644 --- a/src/components/renderers/text_renderer.c +++ b/src/components/renderers/text_renderer.c @@ -14,6 +14,12 @@ #include #include +void destroy_text_renderer(struct renderer *cmp) +{ + free(((gc_text *)cmp->data)->text); + free(cmp->data); +} + int color_from_text(char *txt) { if (txt == NULL) @@ -32,6 +38,7 @@ void text_ctr(struct renderer *cmp, va_list args) if (!gctext) return; cmp->data = gctext; + cmp->destroy = &destroy_text_renderer; gctext->text = va_arg(args, char *); gctext->font = va_arg(args, sfFont *); gctext->size = va_arg(args, int); @@ -52,6 +59,7 @@ void text_fdctr(gc_scene *scene, struct renderer *cmp, node *n) gctext->text = xml_getproperty(n, "text"); if (!gctext->text) return; + cmp->destroy = &destroy_text_renderer; gctext->font = scene->get_data(scene, "font", xml_getproperty(n, "src")); gctext->size = 30; gctext->color = *(int *)&sfWhite; diff --git a/src/isometry/tile_collisions.c b/src/isometry/tile_collisions.c new file mode 100644 index 0000000..d6c82de --- /dev/null +++ b/src/isometry/tile_collisions.c @@ -0,0 +1,82 @@ +/* +** EPITECH PROJECT, 2020 +** Gamacon +** File description: +** tile collision_managment +*/ + +#include "tile_collision_manager.h" +#include "map_utils.h" +#include + +#define INF 10000 + +bool is_on_segment(gc_vector2 p, gc_vector2 q, gc_vector2 r) +{ + if (q.x <= fmaxf(p.x, r.x) && q.x >= fminf(p.x, r.x) && \ +q.y <= fmaxf(p.y, r.y) && q.y >= fminf(p.y, r.y)) + return (true); + return (false); +} + +int orientation(gc_vector2 p, gc_vector2 q, gc_vector2 r) +{ + int tmp = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); + + if (tmp == 0) + return (0); + return ((tmp > 0) ? 1 : 2); +} + +bool gc_vector2_do_intersect(gc_vector2 p1, gc_vector2 q1, \ +gc_vector2 p2, gc_vector2 q2) +{ + int o1 = orientation(p1, q1, p2); + int o2 = orientation(p1, q1, q2); + int o3 = orientation(p2, q2, p1); + int o4 = orientation(p2, q2, q1); + + if (o1 != o2 && o3 != o4) + return (true); + if (o1 == 0 && is_on_segment(p1, p2, q1)) + return (true); + if (o2 == 0 && is_on_segment(p1, q2, q1)) + return (true); + if (o3 == 0 && is_on_segment(p2, p1, q2)) + return (true); + if (o4 == 0 && is_on_segment(p2, q1, q2)) + return (true); + return (false); +} + +bool is_point_in_polygon(gc_vector2 *polygon, int n, gc_vector2 p) +{ + gc_vector2 segment = {-INF, p.y}; + int count = 0; + int next = 0; + int i = 0; + + if (n < 3) + return (false); + do { + next = (i + 1) % n; + if (gc_vector2_do_intersect(polygon[i], polygon[next], p, segment)) { + if (orientation(polygon[i], p, polygon[next]) == 0) + return (is_on_segment(polygon[i], p, polygon[next])); + count++; + } + i = next; + } while (i != 0); + return (count & 1); +} + +bool is_pos_in_tile(gc_vector2 pos, struct tile *tile) +{ + struct vertex **c = tile->corners; + gc_vector2 corners[4]; + + pos.y *= -1; + for (int i = 0; i < 4; i++) + corners[i] = gc_vector2_from_coords(c[i]->x, c[i]->y, c[i]->z); + return (is_point_in_polygon(corners, 4, pos)); +} \ No newline at end of file diff --git a/src/sfml_renderer/sfml_events.c b/src/sfml_renderer/sfml_events.c index 67a5749..5d41f96 100644 --- a/src/sfml_renderer/sfml_events.c +++ b/src/sfml_renderer/sfml_events.c @@ -11,29 +11,38 @@ #include "sfml_renderer.h" #include "systems/sfml_renderer_system.h" -void sfml_handle_events(gc_engine *engine) +void sfml_handle_event(gc_engine *eng, sfEvent e) { - struct sfml_renderer_system *rend = GETSYS(engine, sfml_renderer_system); - sfEvent event; - - while (sfRenderWindow_pollEvent(rend->window, &event)) - switch (event.type) { - case sfEvtClosed: - sfRenderWindow_close(rend->window); - break; + switch (e.type) { case sfEvtResized: - engine->on_resize(engine, (gc_vector2){event.size.width, \ -event.size.height}); + eng->on_resize(eng, (gc_vector2){e.size.width, e.size.height}); break; case sfEvtMouseButtonReleased: - if (event.mouseButton.button == sfMouseLeft) - engine->trigger_event(engine, "mouse_click", GC_LEFT); - if (event.mouseButton.button == sfMouseRight) - engine->trigger_event(engine, "mouse_click", GC_RIGHT); + if (e.mouseButton.button == sfMouseLeft) + eng->trigger_event(eng, "mouse_click", GC_LEFT); + if (e.mouseButton.button == sfMouseRight) + eng->trigger_event(eng, "mouse_click", GC_RIGHT); break; case sfEvtKeyReleased: - engine->trigger_event(engine, "key_pressed", event.key.code); + eng->trigger_event(eng, "key_pressed", e.key.code); + break; + default: + break; + } +} + +void sfml_handle_events(gc_engine *eng) +{ + struct sfml_renderer_system *rend = GETSYS(eng, sfml_renderer_system); + sfEvent e; + + while (sfRenderWindow_pollEvent(rend->window, &e)) { + if (e.type == sfEvtClosed) { + sfRenderWindow_close(rend->window); + continue; } + sfml_handle_event(eng, e); + } } gc_vector2 sfml_engine_get_cursor_pos(gc_engine *engine) diff --git a/src/systems/sfml_renderer_system.c b/src/systems/sfml_renderer_system.c index 2ef9e8b..58299a1 100644 --- a/src/systems/sfml_renderer_system.c +++ b/src/systems/sfml_renderer_system.c @@ -27,11 +27,11 @@ gc_vector2 sfml_get_text_size(sf_renderer *this, gc_text *text) return (gc_vector2) {bounds.width * 1.3, bounds.height * 2.5}; } -static void (* const drawers[])(gc_engine *, gc_entity *, void *, float) = { - &sfmlrenderer_draw_texture, - &sfmlrenderer_draw_anim, - &sfmlrenderer_draw_txt, - &sfmlrenderer_draw_tilemap, +static drawer drawers[] = { + (drawer)&sfmlrenderer_draw_texture, + (drawer)&sfmlrenderer_draw_anim, + (drawer)&sfmlrenderer_draw_txt, + (drawer)&sfmlrenderer_draw_tilemap, NULL };