From 1a11c5074a4d40df9c0bb1cdf9af4d275bc1a3dc Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Fri, 21 Feb 2020 17:55:05 +0100 Subject: [PATCH] Adding a UI library --- Makefile | 4 +- include/components/fixed_to_cam_component.h | 1 + include/data.h | 15 ++-- include/engine.h | 12 ++- include/errors.h | 13 +++ include/list.h | 4 +- include/scene.h | 4 +- include/sfml_renderer.h | 10 +-- include/systems/sfml_renderer_system.h | 3 + include/ui.h | 12 +++ src/components/fixed_to_cam.c | 4 + src/components/renderers/sprite_renderer.c | 4 +- src/deserializer/prefab.c | 6 +- src/engine/engine.c | 7 +- src/engine/engine_dataloader.c | 21 +++++ src/engine/engine_system_builder.c | 2 +- src/entity/entity_factory.c | 4 +- src/scene/scene.c | 1 + src/scene/scene_loader.c | 51 ++++++------ src/sfml_renderer/sfml_dataloaders.c | 63 +++++++++------ src/sfml_renderer/sfml_drawer.c | 44 +++++++---- src/systems/fixed_to_cam_pseudosystem.c | 31 ++++---- src/systems/sfml_renderer_system.c | 17 +++- src/ui/button.c | 3 + src/ui/setup_ui.c | 88 +++++++++++++++++++++ 25 files changed, 313 insertions(+), 111 deletions(-) create mode 100644 include/errors.h create mode 100644 include/ui.h create mode 100644 src/ui/button.c create mode 100644 src/ui/setup_ui.c diff --git a/Makefile b/Makefile index e42d93e..c9b1317 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,9 @@ SRC = src/engine/engine.c \ src/sfml_renderer/texture_utility.c \ src/sfml_renderer/sfml_drawer.c \ src/sfml_renderer/sfml_functions.c \ - src/sfml_renderer/sfml_vertex.c + src/sfml_renderer/sfml_vertex.c \ + src/ui/setup_ui.c \ + src/ui/button.c OBJ = $(SRC:%.c=%.o) diff --git a/include/components/fixed_to_cam_component.h b/include/components/fixed_to_cam_component.h index 6e57041..74e3bc1 100644 --- a/include/components/fixed_to_cam_component.h +++ b/include/components/fixed_to_cam_component.h @@ -16,6 +16,7 @@ struct fixed_to_cam gc_vector2 pos; bool per_x; bool per_y; + bool set_size; }; extern const struct fixed_to_cam fixed_to_cam; \ No newline at end of file diff --git a/include/data.h b/include/data.h index 497d2a6..f2ebec9 100644 --- a/include/data.h +++ b/include/data.h @@ -5,11 +5,16 @@ ** data */ -#pragma once +#include "engine.h" + +typedef struct gc_data gc_data; +typedef gc_data *(*gc_loader)(gc_engine *engine, gc_scene *scene, node *n); + +#ifndef DATA +#define DATA #include "xml.h" -typedef struct gc_data gc_data; struct gc_data { char *type; @@ -18,10 +23,10 @@ struct gc_data void (*destroy)(gc_data *data); }; -typedef int (*gc_loader)(gc_data *data, node *n); - typedef struct gc_dataloader { char *type; gc_loader load; -} gc_dataloader; \ No newline at end of file +} gc_dataloader; + +#endif \ No newline at end of file diff --git a/include/engine.h b/include/engine.h index 8b1ee46..2858f71 100644 --- a/include/engine.h +++ b/include/engine.h @@ -6,7 +6,8 @@ */ typedef struct gc_engine gc_engine; -#pragma once +#ifndef ENGINE +#define ENGINE #include "xml.h" #include "scene.h" @@ -43,6 +44,7 @@ struct gc_engine gc_list *dataloaders; void (*add_dataloader)(gc_engine *engine, char *type, gc_loader loader); + gc_dataloader *(*get_dataloader)(gc_engine *engine, const char *type); }; gc_engine *engine_create(void); @@ -56,7 +58,7 @@ void engine_stop_music(gc_engine *engine); int change_scene(gc_engine *engine, gc_scene *scene); -void engine_add_buildin_systems(gc_engine *engine); +void engine_add_builtin_systems(gc_engine *engine); void *engine_get_system(gc_engine *engine, const char *name); void engine_add_system(gc_engine *engine, const void *system); @@ -64,8 +66,12 @@ 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); +void engine_init_dataloaders(gc_engine *this); void engine_add_dataloader(gc_engine *engine, char *type, gc_loader loader); +gc_dataloader *engine_get_dataloader(gc_engine *this, const char *type); int engine_use_sfml(gc_engine *engine, const char *title, int framerate); -#define GETSYS(x) ((struct x *)engine->get_system(engine, #x)) \ No newline at end of file +#define GETSYS(x) ((struct x *)engine->get_system(engine, #x)) + +#endif \ No newline at end of file diff --git a/include/errors.h b/include/errors.h new file mode 100644 index 0000000..2d2d16a --- /dev/null +++ b/include/errors.h @@ -0,0 +1,13 @@ +// +// Created by anonymus-raccoon on 2/21/20. +// + +#ifndef _ERRORS_H_ +#define _ERRORS_H_ + +#define NO_CUSTOM_ENTITY_LOADER ("Could not load the custom entity (type %s)"\ +", the loader was not found.\n") +#define DATALOADER_NOT_FOUND ("Couldn't find data loader for the type %s\n") +#define DATALOADER_ERROR ("Error while loading data %s (type %s).\n") + +#endif //_ERRORS_H_ diff --git a/include/list.h b/include/list.h index 1a5f3fb..7ebfba5 100644 --- a/include/list.h +++ b/include/list.h @@ -15,4 +15,6 @@ struct gc_list gc_list *next; }; -gc_list *list_add(gc_list *list, void *obj); \ No newline at end of file +gc_list *list_add(gc_list *list, void *obj); + +#define LISTADD(list, obj) (list = list_add(list, obj)) \ No newline at end of file diff --git a/include/scene.h b/include/scene.h index 40dca58..8e72e51 100644 --- a/include/scene.h +++ b/include/scene.h @@ -26,11 +26,11 @@ struct gc_scene int (*add_entity)(gc_scene *scene, gc_entity *entity); gc_entity *(*get_entity)(gc_scene *scene, int id); gc_list *(*get_entity_by_cmp)(gc_scene *scene, const char *cmp_name); + void (*load_entity)(gc_scene *this, gc_engine *engine, node *xml); }; gc_scene *scene_create(gc_engine *engine, const char *mappath); -int scene_add_entity(gc_scene *scene, gc_entity *entity); void scene_load_data(gc_engine *engine, gc_scene *scene, node *n); void *scene_get_data(gc_scene *scene, const char *type, const char *name); void scene_destroy(gc_scene *scene); -int scene_load_musics(gc_scene *scene, node *n); \ No newline at end of file +void scene_load_entity(gc_scene *this, gc_engine *engine, node *n); \ No newline at end of file diff --git a/include/sfml_renderer.h b/include/sfml_renderer.h index 19cd4d1..0eea23d 100644 --- a/include/sfml_renderer.h +++ b/include/sfml_renderer.h @@ -15,17 +15,17 @@ #include "systems/sfml_renderer_system.h" #include "components/vertex_component.h" -int sfml_music_loader(gc_data *data, node *n); -int sfml_sprite_loader(gc_data *data, node *n); -int sfml_font_loader(gc_data *data, node *n); +gc_data *sfml_music_loader(gc_engine *engine, gc_scene *scene, node *n); +gc_data *sfml_sprite_loader(gc_engine *engine, gc_scene *scene, node *n); +gc_data *sfml_font_loader(gc_engine *engine, gc_scene *scene, node *n); sfTexture *get_texture(gc_scene *scene, char *name); sfVertexArray *sfml_init_verticies(void); void sfmlrenderer_draw_texture(struct sfml_renderer_system *renderer, \ -struct transform_component *tra, gc_sprite *sprite); +struct transform_component *tra, gc_entity *entity, gc_sprite *sprite); void sfmlrenderer_draw_anim(struct sfml_renderer_system *renderer, \ -struct transform_component *tra, gc_animholder *holder, float dtime); +gc_entity *entity, gc_animholder *holder, float dtime); void sfmlrenderer_draw_txt(struct sfml_renderer_system *renderer, \ struct transform_component *tra, gc_text *txt); void sfmlrenderer_draw_tilemap(struct sfml_renderer_system *this, \ diff --git a/include/systems/sfml_renderer_system.h b/include/systems/sfml_renderer_system.h index 2a99f00..b666f98 100644 --- a/include/systems/sfml_renderer_system.h +++ b/include/systems/sfml_renderer_system.h @@ -10,9 +10,11 @@ #include "system.h" #include #include "scene.h" +#include "text.h" #include "systems/sfml_renderer_system.h" #include "systems/camerafollow_system.h" +typedef struct sfml_renderer_system sf_renderer; struct sfml_renderer_system { gc_system system; @@ -21,6 +23,7 @@ struct sfml_renderer_system sfText *text; sfView *view; sfVertexArray *vertices; + gc_vector2 (*get_text_size)(sf_renderer *this, gc_text *text); }; gc_system *gc_new_sfml_renderer(gc_engine *engine, \ diff --git a/include/ui.h b/include/ui.h new file mode 100644 index 0000000..4ab43cf --- /dev/null +++ b/include/ui.h @@ -0,0 +1,12 @@ +// +// Created by anonymus-raccoon on 2/21/20. +// + +#ifndef _UI_H_ +#define _UI_H_ + +#include "engine.h" + +void ui_setup(gc_engine *engine); + +#endif //_UI_H_ diff --git a/src/components/fixed_to_cam.c b/src/components/fixed_to_cam.c index 09d681c..5942750 100644 --- a/src/components/fixed_to_cam.c +++ b/src/components/fixed_to_cam.c @@ -16,6 +16,9 @@ static void ctr(void *component, va_list args) struct fixed_to_cam *cmp = (struct fixed_to_cam *)component; cmp->pos = va_arg(args, gc_vector2); + cmp->per_x = va_arg(args, int); + cmp->per_y = va_arg(args, int); + cmp->set_size = va_arg(args, int); } static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) @@ -30,6 +33,7 @@ static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) cmp->per_x = tmp && my_strchr(tmp, '%'); tmp = xml_gettempprop(n, "y"); cmp->per_y = tmp && my_strchr(tmp, '%'); + cmp->set_size = xml_hasproperty(n, "size"); (void)scene; (void)entity; } diff --git a/src/components/renderers/sprite_renderer.c b/src/components/renderers/sprite_renderer.c index 1e893d2..ca5daf9 100644 --- a/src/components/renderers/sprite_renderer.c +++ b/src/components/renderers/sprite_renderer.c @@ -24,7 +24,7 @@ void sprite_ctr(struct renderer *cmp, va_list args) cmp->data = sprite; sprite->texture = va_arg(args, sfTexture *); sprite->rect = va_arg(args, gc_int_rect); - if (sprite->texture && sprite->rect.height < 0) { + if (sprite->texture && sprite->rect.height <= 0) { size = sfTexture_getSize(sprite->texture); sprite->rect.height = (float)size.y; sprite->rect.width = (float)size.x; @@ -46,7 +46,7 @@ void sprite_fdctr(gc_scene *scene, struct renderer *cmp, node *n) sprite->rect.width = xml_getfloatprop(rect, "width"); sprite->rect.top = xml_getfloatprop(rect, "top"); sprite->rect.left = xml_getfloatprop(rect, "left"); - if (sprite->texture && sprite->rect.height < 0) { + if (sprite->texture && sprite->rect.height <= 0) { size = sfTexture_getSize(sprite->texture); sprite->rect.height = (float)size.y; sprite->rect.width = (float)size.x; diff --git a/src/deserializer/prefab.c b/src/deserializer/prefab.c index a9b7c19..f2aa8d0 100644 --- a/src/deserializer/prefab.c +++ b/src/deserializer/prefab.c @@ -35,7 +35,11 @@ int prefab_loadentities(node *n, gc_engine *engine, gc_scene *scene) if (!n) return (-1); for (node *ent_n = n->child; ent_n; ent_n = ent_n->next) { - entity = deserialize_entity(engine, scene, ent_n); + if (my_strcmp(ent_n->name, "gc_entity")) { + scene->load_entity(scene, engine, ent_n); + continue; + } + entity = deserialize_entity(engine, scene, ent_n); if (!entity) return (-1); scene->add_entity(scene, entity); diff --git a/src/engine/engine.c b/src/engine/engine.c index 948a491..b929a89 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -9,8 +9,6 @@ #include "system.h" #include "utility.h" #include -#include -#include void update_system(gc_engine *engine, gc_system *sys, float dtime) { @@ -81,9 +79,8 @@ gc_engine *engine_create(void) engine->play_music = &engine_play_music; engine->stop_music = &engine_stop_music; engine->destroy = &engine_destroy; - engine_add_buildin_systems(engine); + engine_add_builtin_systems(engine); engine_add_buildin_components(engine); - engine->dataloaders = NULL; - engine->add_dataloader = &engine_add_dataloader; + engine_init_dataloaders(engine); return (engine); } \ No newline at end of file diff --git a/src/engine/engine_dataloader.c b/src/engine/engine_dataloader.c index dd9e86c..3611ed0 100644 --- a/src/engine/engine_dataloader.c +++ b/src/engine/engine_dataloader.c @@ -9,6 +9,7 @@ #include "data.h" #include "my.h" #include +#include "ui.h" void engine_add_dataloader(gc_engine *engine, char *type, gc_loader loader) { @@ -19,4 +20,24 @@ void engine_add_dataloader(gc_engine *engine, char *type, gc_loader loader) dataloader->type = type; dataloader->load = loader; engine->dataloaders = list_add(engine->dataloaders, dataloader); +} + +gc_dataloader *engine_get_dataloader(gc_engine *this, const char *type) +{ + gc_dataloader *loader; + + for (gc_list *li = this->dataloaders; li; li = li->next) { + loader = (gc_dataloader *)li->data; + if (!my_strcmp(loader->type, type)) + return (loader); + } + return (NULL); +} + +void engine_init_dataloaders(gc_engine *this) +{ + this->dataloaders = NULL; + this->add_dataloader = &engine_add_dataloader; + this->get_dataloader = &engine_get_dataloader; + ui_setup(this); } \ No newline at end of file diff --git a/src/engine/engine_system_builder.c b/src/engine/engine_system_builder.c index a659c77..a6cc765 100644 --- a/src/engine/engine_system_builder.c +++ b/src/engine/engine_system_builder.c @@ -27,7 +27,7 @@ void engine_finish_physics(gc_engine *engine) engine->add_system(engine, new_system(&movable_system)); } -void engine_add_buildin_systems(gc_engine *engine) +void engine_add_builtin_systems(gc_engine *engine) { engine->systems = NULL; engine->add_system = &engine_add_system; diff --git a/src/entity/entity_factory.c b/src/entity/entity_factory.c index 74ff7d2..d6b43cf 100644 --- a/src/entity/entity_factory.c +++ b/src/entity/entity_factory.c @@ -10,11 +10,11 @@ #include "my.h" #include -static unsigned int next_id = 0; const gc_entity entity_prefab; gc_entity *entity_create(void) { + static unsigned int next_id = 0; gc_entity *entity = malloc(sizeof(gc_entity)); if (!entity) @@ -40,6 +40,8 @@ int entity_add(gc_scene *scene, gc_entity *e) { char *name; + if (!e) + return (0); scene->entities = list_add(scene->entities, e); if (!scene->entities) return (-1); diff --git a/src/scene/scene.c b/src/scene/scene.c index 9aa5c72..dd8a881 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -53,6 +53,7 @@ gc_scene *scene_create(gc_engine *engine, const char *xmlpath) scene->get_entity_by_cmp = &get_entity_by_cmp; scene->destroy = &scene_destroy; scene->get_data = &scene_get_data; + scene->load_entity = &scene_load_entity; prefab_loadentities(n, engine, scene); xml_destroy(n); return (scene); diff --git a/src/scene/scene_loader.c b/src/scene/scene_loader.c index d71d1e9..367390c 100644 --- a/src/scene/scene_loader.c +++ b/src/scene/scene_loader.c @@ -6,6 +6,7 @@ */ #include "engine.h" +#include "errors.h" #include "scene.h" #include "xml.h" #include "my.h" @@ -14,39 +15,39 @@ #include #include -gc_dataloader *gc_dataloader_from_type(gc_engine *engine, const char *type) -{ - gc_dataloader *loader; - - for (gc_list *li = engine->dataloaders; li; li = li->next) { - loader = (gc_dataloader *)li->data; - if (!my_strcmp(loader->type, type)) - return (loader); - } - return (NULL); -} - void scene_load_data(gc_engine *engine, gc_scene *scene, node *n) { - gc_data *data; gc_dataloader *loader; + gc_data *data; scene->data = NULL; if (!(n = xml_getnode(n, "data"))) return; for (n = n->child; n; n = n->next) { - if (!(data = malloc(sizeof(*data)))) - return; - data->type = my_strdup(n->name); - data->name = xml_getproperty(n, "name"); - data->destroy = NULL; - loader = gc_dataloader_from_type(engine, data->type); - if (!loader) - return ((void)my_printf("Couldn't find data loader for the type %s\ -\n", data->type)); - if (loader->load(data, n) < 0) - return ((void)my_printf("Error while loading data %s (type %s).\ -\n", data->name, data->type)); + loader = engine->get_dataloader(engine, n->name); + if (!loader) { + my_printf(DATALOADER_NOT_FOUND, n->name); + return; + } + data = loader->load(engine, scene, n); + if (!data) { + my_printf(DATALOADER_ERROR, xml_getproperty(n, "name"), n->name); + return; + } scene->data = list_add(scene->data, data); } +} + +void scene_load_entity(gc_scene *this, gc_engine *engine, node *n) +{ + gc_dataloader *loader = engine->get_dataloader(engine, n->name); + gc_data *data; + + if (!loader) { + my_printf(NO_CUSTOM_ENTITY_LOADER, n->name); + return; + } + data = loader->load(engine, this, n); + for (gc_list *li = (gc_list *)data->custom; li; li = li->next) + this->add_entity(this, li->data); } \ No newline at end of file diff --git a/src/sfml_renderer/sfml_dataloaders.c b/src/sfml_renderer/sfml_dataloaders.c index 0c0a887..f8a0e64 100644 --- a/src/sfml_renderer/sfml_dataloaders.c +++ b/src/sfml_renderer/sfml_dataloaders.c @@ -13,45 +13,56 @@ #include #include -int sfml_music_loader(gc_data *data, node *n) +gc_data *sfml_music_loader(gc_engine *engine, gc_scene *scene, node *n) { - char *path = xml_getproperty(n, "src"); + gc_data *data = malloc(sizeof(*data)); - if (!path) - return (-1); - data->name = path; - data->custom = sfMusic_createFromFile(path); + if (!data) + return (NULL); + data->type = my_strdup(n->name); + data->name = xml_getproperty(n, "src"); + if (!data->name || !data->type) + return (NULL); + data->custom = sfMusic_createFromFile(data->name); data->destroy = &sfml_music_destroy; if (!data->custom) - return (-1); - return (0); + return (NULL); + return (data); } -int sfml_sprite_loader(gc_data *data, node *n) +gc_data *sfml_sprite_loader(gc_engine *engine, gc_scene *scene, node *n) { - char *path = xml_getproperty(n, "src"); + gc_data *data = malloc(sizeof(*data)); - if (!path) - return (-1); - data->name = path; - data->custom = sfTexture_createFromFile(path, NULL); - if (!data->custom || !data->name) - return (-1); + if (!data) + return (NULL); + data->type = my_strdup(n->name); + data->name = xml_getproperty(n, "src"); + if (!data->name || !data->type) + return (NULL); + data->custom = sfTexture_createFromFile(data->name, NULL); + if (!data->custom) + return (NULL); sfTexture_setRepeated(data->custom, sfTrue); data->destroy = &sfml_texture_destroy; - return (0); + if (xml_hasproperty(n, "name")) + data->name = xml_getproperty(n, "name"); + return (data); } -int sfml_font_loader(gc_data *data, node *n) +gc_data *sfml_font_loader(gc_engine *engine, gc_scene *scene, node *n) { - char *path = xml_getproperty(n, "src"); + gc_data *data = malloc(sizeof(*data)); - if (!path) - return (-1); - data->name = path; - data->custom = sfFont_createFromFile(path); - if (!data->custom || !data->name) - return (-1); + if (!data) + return (NULL); + data->type = my_strdup(n->name); + data->name = xml_getproperty(n, "src"); + if (!data->name || !data->type) + return (NULL); + data->custom = sfFont_createFromFile(data->name); + if (!data->custom) + return (NULL); data->destroy = &sfml_font_destroy; - return (0); + return (data); } \ No newline at end of file diff --git a/src/sfml_renderer/sfml_drawer.c b/src/sfml_renderer/sfml_drawer.c index 187e0f5..018ceab 100644 --- a/src/sfml_renderer/sfml_drawer.c +++ b/src/sfml_renderer/sfml_drawer.c @@ -14,35 +14,51 @@ #include "my.h" #include +void sfmlrenderer_setorigin(struct sfml_renderer_system *renderer, \ +gc_entity *entity, gc_sprite *sprite, struct transform_component *tra) +{ + sfVector2f scale = (sfVector2f){ + tra->size.x * sprite->scale.x / sprite->rect.width, + tra->size.y * sprite->scale.y / sprite->rect.height + }; + + sfSprite_setScale(renderer->sprite, scale); + if (entity->has_component(entity, "fixed_to_cam")) + sfSprite_setOrigin(renderer->sprite, (sfVector2f) { + sprite->rect.width / 2, + 0 + }); + else + sfSprite_setOrigin(renderer->sprite, (sfVector2f){ + scale.x < 0 ? sprite->rect.width : 0, + scale.y < 0 ? sprite->rect.height : 0 + }); +} + void sfmlrenderer_draw_texture(struct sfml_renderer_system *renderer, \ -struct transform_component *tra, gc_sprite *sprite) +struct transform_component *tra, gc_entity *entity, gc_sprite *sprite) { sfVector2f pos = (sfVector2f){tra->position.x, -tra->position.y}; - sfVector2f scale = (sfVector2f){ - tra->size.x * sprite->scale.x / sprite->rect.width, - tra->size.y * sprite->scale.y / sprite->rect.height - }; sprite->pos = tra->position; - if (!sprite->texture) - return; + if (!sprite->texture) { + my_printf("Trying to render a sprite without texture.\n"); + return; + } sfSprite_setTexture(renderer->sprite, sprite->texture, true); sfSprite_setTextureRect(renderer->sprite, (sfIntRect){ (int)sprite->rect.left, (int)sprite->rect.top, (int)sprite->rect.width, (int)sprite->rect.height }); sfSprite_setPosition(renderer->sprite, pos); - sfSprite_setScale(renderer->sprite, scale); - sfSprite_setOrigin(renderer->sprite, (sfVector2f){ - scale.x < 0 ? sprite->rect.width : 0, - scale.y < 0 ? sprite->rect.height : 0 - }); + sfmlrenderer_setorigin(renderer, entity, sprite, tra); sfRenderWindow_drawSprite(renderer->window, renderer->sprite, NULL); } void sfmlrenderer_draw_anim(struct sfml_renderer_system *renderer, \ -struct transform_component *tra, gc_animholder *holder, float dtime) +gc_entity *entity, gc_animholder *holder, float dtime) { + struct transform_component *tra = GETCMP(transform_component); gc_int_rect *rec = &holder->sprite->rect; gc_anim *curr = holder->current; @@ -54,7 +70,7 @@ struct transform_component *tra, gc_animholder *holder, float dtime) if (rec->left > curr->rect.left + rec->width * (curr->frame_count - 1)) rec->left = curr->rect.left; } - sfmlrenderer_draw_texture(renderer, tra, holder->sprite); + sfmlrenderer_draw_texture(renderer, tra, entity, holder->sprite); } void sfmlrenderer_draw_txt(struct sfml_renderer_system *renderer, \ diff --git a/src/systems/fixed_to_cam_pseudosystem.c b/src/systems/fixed_to_cam_pseudosystem.c index f623f57..a9e01d3 100644 --- a/src/systems/fixed_to_cam_pseudosystem.c +++ b/src/systems/fixed_to_cam_pseudosystem.c @@ -18,24 +18,21 @@ void entities_update_to_cam(gc_scene *scene, \ struct sfml_renderer_system *renderer, struct camerafollow_system *cam) { - gc_list *list; - gc_entity *entity; - sfVector2f size; - struct transform_component *tra; - struct fixed_to_cam *fc; + gc_list *list = scene->get_entity_by_cmp(scene, "fixed_to_cam"); - list = scene->get_entity_by_cmp(scene, "fixed_to_cam"); for (gc_list *li = list; li; li = li->next) { - entity = (gc_entity *)li->data; - tra = GETCMP(transform_component); - fc = GETCMP(fixed_to_cam); + gc_entity *entity = (gc_entity *)li->data; + struct transform_component *tra = GETCMP(transform_component); + struct fixed_to_cam *fc = GETCMP(fixed_to_cam); + sfVector2f size = sfView_getSize(renderer->view); + float x = (cam->cam_pos.x - size.x / 2); + float y = (cam->cam_pos.y + size.y / 2); + if (!tra) - continue; - size = sfView_getSize(renderer->view); - tra->position = (gc_vector2) { - (cam->cam_pos.x - size.x / 2 + fc->pos.x) * fc->per_x ? size.x / 100 : 1, - (cam->cam_pos.y + size.y / 2 - fc->pos.y) * fc->per_y ? size.y / 100 : 1 - }; + continue; + x += fc->pos.x * (fc->per_x ? size.x / 100 : 1); + y -= fc->pos.y * (fc->per_x ? size.y / 100 : 1); + tra->position = (gc_vector2){x, y}; } } @@ -44,12 +41,14 @@ void entities_update_to_cam_size(gc_scene *scene, gc_vector2 size) gc_list *list; gc_entity *entity; struct transform_component *tra; + struct fixed_to_cam *fc; list = scene->get_entity_by_cmp(scene, "fixed_to_cam"); for (gc_list *li = list; li; li = li->next) { entity = (gc_entity *)li->data; tra = GETCMP(transform_component); - if (!tra) + fc = GETCMP(fixed_to_cam); + if (!tra || !fc->set_size) continue; tra->size = (gc_vector2) { size.x, diff --git a/src/systems/sfml_renderer_system.c b/src/systems/sfml_renderer_system.c index f02ce32..5685424 100644 --- a/src/systems/sfml_renderer_system.c +++ b/src/systems/sfml_renderer_system.c @@ -18,8 +18,18 @@ #include "text.h" #include +gc_vector2 sfml_get_text_size(sf_renderer *this, gc_text *text) +{ + sfFloatRect bounds; + + sfText_setString(this->text, text->text); + sfText_setFont(this->text, text->font); + bounds = sfText_getLocalBounds(this->text); + return (gc_vector2) {bounds.width, bounds.height}; +} + void sfml_update_entity(gc_engine *engine, void *system, \ -gc_entity *entity, float dtime) +gc_entity *entity, float dt) { struct transform_component *pos = GETCMP(transform_component); struct renderer *text = GETCMP(renderer); @@ -29,10 +39,10 @@ gc_entity *entity, float dtime) return; switch (text->type) { case GC_TEXTUREREND: - sfmlrenderer_draw_texture(rend, pos, (gc_sprite *)text->data); + sfmlrenderer_draw_texture(rend, pos, entity, (gc_sprite *)text->data); break; case GC_ANIMREND: - sfmlrenderer_draw_anim(rend, pos, (gc_animholder *)text->data, dtime); + sfmlrenderer_draw_anim(rend, entity, (gc_animholder *)text->data, dt); break; case GC_TXTREND: sfmlrenderer_draw_txt(rend, pos, (gc_text *)text->data); @@ -66,6 +76,7 @@ void sfmlrend_ctr(void *rend, va_list list) const char *title = va_arg(list, const char *); int framerate = va_arg(list, int); + renderer->get_text_size = &sfml_get_text_size; renderer->window = sfRenderWindow_create(mode, title, sfDefaultStyle, NULL); renderer->sprite = sfSprite_create(); renderer->view = sfView_create(); diff --git a/src/ui/button.c b/src/ui/button.c new file mode 100644 index 0000000..f1076dc --- /dev/null +++ b/src/ui/button.c @@ -0,0 +1,3 @@ +// +// Created by anonymus-raccoon on 2/21/20. +// \ No newline at end of file diff --git a/src/ui/setup_ui.c b/src/ui/setup_ui.c new file mode 100644 index 0000000..fa116af --- /dev/null +++ b/src/ui/setup_ui.c @@ -0,0 +1,88 @@ +// +// Created by anonymus-raccoon on 2/21/20. +// + +#include "engine.h" +#include "data.h" +#include "xml.h" +#include "my.h" +#include "components/transform_component.h" +#include "components/renderer.h" +#include "components/fixed_to_cam_component.h" +#include "systems/sfml_renderer_system.h" +#include + +gc_entity *new_text(gc_engine *engine, gc_scene *scene, node *n) +{ + gc_entity *entity = entity_create(); + + entity->add_component(entity, new_component(&transform_component, + (gc_vector2){0, 0}, + (gc_vector2){0, 0})); + entity->add_component(entity, new_component(&renderer_component, + GC_TXTREND, + xml_getproperty(n, "text"), + scene->get_data(scene, "font", NULL))); + entity->add_component(entity, new_component(&fixed_to_cam, + (gc_vector2){ + xml_getintprop(n, "x"), + xml_getintprop(n, "y") + }, + true, true, false)); + return (entity); +} + +gc_entity *background_from_text(gc_engine *engine, gc_scene *scene, node *n, \ +gc_text *text) +{ + gc_entity *entity = entity_create(); + struct sfml_renderer_system *renderer = GETSYS(sfml_renderer_system); + sfTexture *texture = scene->get_data(scene, "sprite", "button_background"); + + if (!renderer) + return (NULL); + if (!texture) + my_printf("No texture defined for the button_background.\n"); + entity->add_component(entity, new_component(&transform_component, + (gc_vector2){0, 0}, + renderer->get_text_size(renderer, text))); + entity->add_component(entity, new_component(&renderer_component, + GC_TEXTUREREND, + texture, + (sfIntRect){0, 0, -1, -1})); + entity->add_component(entity, new_component(&fixed_to_cam, + (gc_vector2){ + xml_getintprop(n, "x"), + xml_getintprop(n, "y") + }, true, true, false)); + return (entity); +} + +gc_list *new_button(gc_engine *engine, gc_scene *scene, node *n) +{ + gc_list *entities = NULL; + gc_text text = (gc_text){ + xml_gettempprop(n, "text"), + scene->get_data(scene, "font", NULL) + }; + + LISTADD(entities, background_from_text(engine, scene, n, &text)); + LISTADD(entities, new_text(engine, scene, n)); + return (entities); +} + +gc_data *button_make(gc_engine *engine, gc_scene *scene, node *n) +{ + gc_data *data = malloc(sizeof(*data)); + + data->name = "button"; + data->type = "ui"; + data->destroy = NULL; + data->custom = new_button(engine, scene, n); + return (data); +} + +void ui_setup(gc_engine *engine) +{ + engine->add_dataloader(engine, "button", &button_make); +} \ No newline at end of file