From 30cc01b9ea392e9dccb9f8700566d54469fc9576 Mon Sep 17 00:00:00 2001
From: AnonymusRaccoon
Date: Wed, 11 Mar 2020 15:18:28 +0100
Subject: [PATCH] Implementing a draw brush
---
CMakeLists.txt | 12 +--
assets/ui/texture.png | Bin 0 -> 262 bytes
.../isometry/map_manager_component.h | 28 +++++++
include/map_interactions.h | 19 +++++
include/setup.h | 3 +-
lib/gamacon | 2 +-
prefabs/game.gcprefab | 4 +-
src/components/isometry/map_interactions.c | 73 ++++++++++++++++++
.../isometry/map_manager_component.c | 55 +++++++++++++
src/game_loader.c | 1 +
src/selectors.c | 34 ++++++++
src/toolbar.c | 39 ++++------
12 files changed, 235 insertions(+), 35 deletions(-)
create mode 100644 assets/ui/texture.png
create mode 100644 include/components/isometry/map_manager_component.h
create mode 100644 include/map_interactions.h
create mode 100644 src/components/isometry/map_interactions.c
create mode 100644 src/components/isometry/map_manager_component.c
create mode 100644 src/selectors.c
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 029cc7d..49ba380 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -212,7 +212,7 @@ add_executable(My3D
lib/gamacon/src/sfml_renderer/sfml_init.c
lib/gamacon/src/sfml_renderer/sfml_events.c
lib/gamacon/src/components/isometry/map_managment.c
- lib/gamacon/include/components/map_managment.h
+ lib/gamacon/include/map_managment.h
lib/xmlparser/src/otherget.c
src/options.c
lib/gamacon/src/components/input_component.c
@@ -242,17 +242,17 @@ add_executable(My3D
src/systems/game_manager_system.c
include/systems/game_manager_system.h
lib/gamacon/include/keybindings.h
- lib/gamacon/src/components/isometry/map_interactions.c
- lib/gamacon/include/map_interactions.h
+ src/components/isometry/map_interactions.c
+ include/map_interactions.h
lib/gamacon/include/keybindings.h
lib/gamacon/src/ui/tooltip.c
lib/gamacon/src/components/tooltip_component.c
lib/gamacon/include/components/tooltip_component.h
lib/gamacon/src/systems/tooltip_system.c
- lib/gamacon/src/components/isometry/map_manager_component.c
- lib/gamacon/include/components/isometry/map_manager_component.h
+ src/components/isometry/map_manager_component.c
+ include/components/isometry/map_manager_component.h
lib/gamacon/src/components/isometry/vertex_data_loader.c
- lib/gamacon/include/vertex_data_loader.h src/toolbar.c lib/gamacon/include/callbacks.h)
+ lib/gamacon/include/vertex_data_loader.h src/toolbar.c lib/gamacon/include/callbacks.h src/selectors.c)
add_compile_options(-W -Wall -Wextra -Wshadow)
diff --git a/assets/ui/texture.png b/assets/ui/texture.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcde0062f9486caf3ff4ff968a7d89f7faaba634
GIT binary patch
literal 262
zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB&U(5yhEy=Vxx7&DumMl&!zRAK
zfPfc*JbU^VCN6L@cq1UG!_2~F!Oy|s%C*7I;r+X0Ci{!pVzYPf@OG#^oTjIB=Ph^t
zxAww|`FY%L3~s0$DYr;qyjnLona%n~*c~J5wzVJF3ZJO8x#uNSoOJEk)6qGD<*Ly#
z?*7e;m0gmz7UT#o=2u!gLw1wa35{h9SwNNHwnsU-XLS6m=*o1Mm&7(
+
@@ -49,12 +50,13 @@
-
+
+
diff --git a/src/components/isometry/map_interactions.c b/src/components/isometry/map_interactions.c
new file mode 100644
index 0000000..bb09891
--- /dev/null
+++ b/src/components/isometry/map_interactions.c
@@ -0,0 +1,73 @@
+/*
+** EPITECH PROJECT, 2020
+** Gamacon
+** File description:
+** map_interactions
+*/
+
+#include "map_interactions.h"
+#include "clickable_component.h"
+#include "entity.h"
+#include "my.h"
+#include
+#include "components/transform_component.h"
+#include "map_managment.h"
+#include
+#include
+
+void click_tile(gc_engine *engine, struct map_manager_component *manager, \
+struct tile *ret, bool is_left)
+{
+ bool r = manager->brush == RESET;
+
+ switch (manager->brush) {
+ case ROTATE:
+ ret->data = (ret->data + (is_left ? 1 : -1U)) % 4;
+ break;
+ case TEXTURE:
+ ret->texture = manager->selected_texture;
+ break;
+ case MOVE:
+ case RESET:
+ move_tile(engine, ret, ALL_VERTICES | is_left, r);
+ break;
+ }
+}
+
+bool tile_interact(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \
+enum gc_mousekeys key)
+{
+ struct vertex_component *map = GETCMP(entity, vertex_component);
+ struct map_manager_component *manager = GETCMP(entity, map_manager_component);
+ struct tile *ret = get_tile_from_pos(map, pos);
+ bool r = manager->brush == RESET;
+ int ind;
+
+ if (!map || !manager) {
+ my_printf("map not found\n");
+ return (false);
+ }
+ if (!ret)
+ return (false);
+ if (manager->tile_mode)
+ click_tile(engine, manager, ret, key == GC_LEFT);
+ else {
+ ind = get_index_nearest_vertex(ret, pos);
+ move_tile(engine, ret, ((int) pow(2, ind + 1)) | (key == GC_LEFT), r);
+ }
+ return (false);
+}
+
+void move_tile(gc_engine *engine, struct tile *ret, char mode, bool r)
+{
+ int val = (mode & INVERT_ADD_VALUE) ? ADD_VALUE : -ADD_VALUE;
+
+ if (mode & VERTEX_0)
+ ret->corners[0]->z += (r) ? -ret->corners[0]->z : val;
+ if (mode & VERTEX_1)
+ ret->corners[1]->z += (r) ? -ret->corners[1]->z : val;
+ if (mode & VERTEX_2)
+ ret->corners[2]->z += (r) ? -ret->corners[2]->z : val;
+ if (mode & VERTEX_3)
+ ret->corners[3]->z += (r) ? -ret->corners[3]->z : val;
+}
\ No newline at end of file
diff --git a/src/components/isometry/map_manager_component.c b/src/components/isometry/map_manager_component.c
new file mode 100644
index 0000000..e3aff98
--- /dev/null
+++ b/src/components/isometry/map_manager_component.c
@@ -0,0 +1,55 @@
+//
+// Created by anonymus-raccoon on 3/10/20.
+//
+
+#include
+#include "engine.h"
+#include "entity.h"
+#include "xml.h"
+#include "my.h"
+
+
+static void ctr(void *comp, va_list args)
+{
+ struct map_manager_component *cmp = (struct map_manager_component *)comp;
+
+ cmp->tile_mode = true;
+ cmp->brush = MOVE;
+}
+
+static void fdctr(gc_entity *entity, gc_scene *scene, void *comp, node *n)
+{
+ struct map_manager_component *cmp = (struct map_manager_component *)comp;
+ void **data = scene->get_data(scene, "tiles", NULL);
+
+ cmp->tile_mode = true;
+ cmp->brush = MOVE;
+ if (data)
+ cmp->selected_texture = data[0];
+}
+
+static void dtr(void *component)
+{
+ (void)component;
+}
+
+static char *serialize(void *component)
+{
+ (void)component;
+ return (NULL);
+}
+
+const struct map_manager_component map_manager_component = {
+ base: {
+ name: "map_manager_component",
+ size: sizeof(struct map_manager_component),
+ dependencies: (char *[]){
+ NULL
+ },
+ ctr: &ctr,
+ fdctr: &fdctr,
+ dtr: &dtr,
+ serialize: &serialize,
+ destroy: &component_destroy
+ }
+};
\ No newline at end of file
diff --git a/src/game_loader.c b/src/game_loader.c
index 2f7d668..a43bd46 100644
--- a/src/game_loader.c
+++ b/src/game_loader.c
@@ -39,6 +39,7 @@ const struct callback callbacks[] = {
{"up_down", &up_down},
{"reset", &reset},
{"rotate", &rotate},
+ {"texture", &texture},
{NULL, NULL}
};
diff --git a/src/selectors.c b/src/selectors.c
new file mode 100644
index 0000000..8d11502
--- /dev/null
+++ b/src/selectors.c
@@ -0,0 +1,34 @@
+//
+// Created by anonymus-raccoon on 3/11/20.
+//
+
+#include
+#include
+#include "engine.h"
+#include "entity.h"
+
+bool tile_select(gc_engine *engine, gc_entity *entity, gc_vector2 _)
+{
+ gc_scene *scene = engine->scene;
+ gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component");
+ struct map_manager_component *manager;
+
+ if (!list)
+ return (false);
+ manager = GETCMP(list->data, map_manager_component);
+ manager->tile_mode = true;
+ return (true);
+}
+
+bool vertex_select(gc_engine *engine, gc_entity *entity, gc_vector2 _)
+{
+ gc_scene *scene = engine->scene;
+ gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component");
+ struct map_manager_component *manager;
+
+ if (!list)
+ return (false);
+ manager = GETCMP(list->data, map_manager_component);
+ manager->tile_mode = false;
+ return (true);
+}
\ No newline at end of file
diff --git a/src/toolbar.c b/src/toolbar.c
index 9aec35a..057918f 100644
--- a/src/toolbar.c
+++ b/src/toolbar.c
@@ -7,32 +7,6 @@
#include "engine.h"
#include "entity.h"
-bool tile_select(gc_engine *engine, gc_entity *entity, gc_vector2 _)
-{
- gc_scene *scene = engine->scene;
- gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component");
- struct map_manager_component *manager;
-
- if (!list)
- return (false);
- manager = GETCMP(list->data, map_manager_component);
- manager->tile_mode = true;
- return (true);
-}
-
-bool vertex_select(gc_engine *engine, gc_entity *entity, gc_vector2 _)
-{
- gc_scene *scene = engine->scene;
- gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component");
- struct map_manager_component *manager;
-
- if (!list)
- return (false);
- manager = GETCMP(list->data, map_manager_component);
- manager->tile_mode = false;
- return (true);
-}
-
bool up_down(gc_engine *engine, gc_entity *entity, gc_vector2 _)
{
gc_scene *scene = engine->scene;
@@ -70,4 +44,17 @@ bool rotate(gc_engine *engine, gc_entity *entity, gc_vector2 _)
manager = GETCMP(list->data, map_manager_component);
manager->brush = ROTATE;
return (true);
+}
+
+bool texture(gc_engine *engine, gc_entity *entity, gc_vector2 _)
+{
+ gc_scene *scene = engine->scene;
+ gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component");
+ struct map_manager_component *manager;
+
+ if (!list)
+ return (false);
+ manager = GETCMP(list->data, map_manager_component);
+ manager->brush = TEXTURE;
+ return (true);
}
\ No newline at end of file