Implementing a draw brush

This commit is contained in:
AnonymusRaccoon
2020-03-11 15:18:28 +01:00
parent b9d780e90b
commit 30cc01b9ea
12 changed files with 235 additions and 35 deletions

View File

@@ -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)

BIN
assets/ui/texture.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

View File

@@ -0,0 +1,28 @@
//
// Created by anonymus-raccoon on 3/10/20.
//
#ifndef _MAP_MANAGER_COMPONENT_H_
#define _MAP_MANAGER_COMPONENT_H_
#include "component.h"
enum brush
{
MOVE,
RESET,
ROTATE,
TEXTURE
};
struct map_manager_component
{
gc_component base;
bool tile_mode;
enum brush brush;
void *selected_texture;
};
const struct map_manager_component map_manager_component;
#endif //_MAP_MANAGER_COMPONENT_H_

View File

@@ -0,0 +1,19 @@
/*
** EPITECH PROJECT, 2020
** Gamacon
** File description:
** map_interactions
*/
#ifndef MY3D_MAP_INTERACTIONS_H
#define MY3D_MAP_INTERACTIONS_H
#include "engine.h"
#include "vertex_component.h"
#include "keybindings.h"
bool tile_interact(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \
enum gc_mousekeys key);
#endif //MY3D_MAP_INTERACTIONS_H

View File

@@ -30,4 +30,5 @@ bool tile_select(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool vertex_select(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool up_down(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool reset(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool rotate(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool rotate(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool texture(gc_engine *engine, gc_entity *entity, gc_vector2 _);

View File

@@ -12,6 +12,7 @@
<sprite name="up_down" src="assets/ui/up_down.png" />
<sprite name="reset" src="assets/ui/reset.png" />
<sprite name="rotate" src="assets/ui/rotate.png" />
<sprite name="texture" src="assets/ui/texture.png" />
<sprite name="cobblestone" src="assets/sprites/cobblestone.png" />
<sprite name="comparator_on" src="assets/sprites/comparator_on.png" />
<sprite name="mossy_cobblestone" src="assets/sprites/cobblestone_mossy.png" />
@@ -49,12 +50,13 @@
</teams_component>
</gc_entity>
<panel src="panel" x="7%" y="3%" width="30%" height="6%"/>
<panel src="panel" x="7%" y="3%" width="37%" height="6%"/>
<button sprite="tile_select" x="3%" y="3%" width="%" height="3%" tooltip="Select a tile." tooltip_x="5" tooltip_y="-5" size="15" click="tile_select" />
<button sprite="vertex_select" x="7%" y="3%" width="%" height="3%" tooltip="Select a Vertex." tooltip_y="-5" size="15" click="vertex_select" />
<button sprite="up_down" x="12%" y="3%" width="%" height="3%" tooltip="Move a tiles.\n - Up with left click.\n - Down with right click" tooltip_y="-15" size="15" click="up_down" />
<button sprite="reset" x="15%" y="3%" width="%" height="3%" tooltip="Reset the height of a tile." tooltip_y="-5" size="15" click="reset" />
<button sprite="rotate" x="19%" y="3%" width="%" height="3%" tooltip="Rotate a texture" tooltip_y="-5" size="15" click="rotate" />
<button sprite="texture" x="23%" y="3%" width="%" height="3%" tooltip="Change the texture of a tile" tooltip_y="-5" size="15" click="texture" />
<panel src="panel" x="100%" y="50%" width="50%" height="120%"/>
<text text="TEAMS" x="88%" y="40"/>

View File

@@ -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 <math.h>
#include "components/transform_component.h"
#include "map_managment.h"
#include <stdlib.h>
#include <components/isometry/map_manager_component.h>
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;
}

View File

@@ -0,0 +1,55 @@
//
// Created by anonymus-raccoon on 3/10/20.
//
#include <components/isometry/map_manager_component.h>
#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
}
};

View File

@@ -39,6 +39,7 @@ const struct callback callbacks[] = {
{"up_down", &up_down},
{"reset", &reset},
{"rotate", &rotate},
{"texture", &texture},
{NULL, NULL}
};

34
src/selectors.c Normal file
View File

@@ -0,0 +1,34 @@
//
// Created by anonymus-raccoon on 3/11/20.
//
#include <stdbool.h>
#include <components/isometry/map_manager_component.h>
#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);
}

View File

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