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
};