diff options
author | Oxore <oxore@protonmail.com> | 2018-07-03 15:11:54 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2018-07-03 15:11:54 +0300 |
commit | ed8127a72e1a2d2703372d5b5dfa8d96703ec3bb (patch) | |
tree | 80f340c64861913f2dc648c2c7280c144b988881 /src/draw.c | |
parent | 21a0a44853451f3d791bafc80c01deab0ff4c79e (diff) |
Refactor field, refactor next shape drawing
Refactor field functions names. Transfer next shape drawing to painter.
Introduce idlist struct with foreach function. Refactor config.
Introduce color map array instead of "switch case" statement bloating
while coloring rectangles. Decouple field and shape structs from SFML
sfVector2 structs by introducing own vector2i and vector2ui structs.
Also remove sfRectangleShape members form field an shape structs.
Diffstat (limited to 'src/draw.c')
-rw-r--r-- | src/draw.c | 202 |
1 files changed, 108 insertions, 94 deletions
@@ -6,53 +6,30 @@ #include "field.h" #include "draw.h" -struct field_drawable { - sfRectangleShape *p[FLD_BOUND_Y][FLD_SIZE_X]; -}; - -struct idlist { - unsigned long id; - void *obj; - struct idlist *next; +#include "idlist.h" + +static sfColor shape_color_map[] = { + UIBGCOLOR, + LCOLOR, + RLCOLOR, + ZCOLOR, + SCOLOR, + BCOLOR, + ICOLOR, + TCOLOR, }; -static struct idlist *list_new() -{ - struct idlist *list = calloc(1, sizeof(struct idlist)); - list->id = 1; - return list; -} - -static struct idlist *list_append(struct idlist *list) -{ - unsigned long id = list->id + 1; - struct idlist *last = list; - while (last->next) - last = last->next; - last->next = calloc(1, sizeof(struct idlist)); - last = last->next; - last->id = id; - return last; -} - -static struct idlist *list_get(const struct idlist *list, unsigned long id) -{ - const struct idlist *sought = list; - if (sought) { - if (sought->id == id) - return (struct idlist *)sought; - while (sought->next) { - sought = sought->next; - if (sought->id == id) - return (struct idlist *)sought; - } - } - return NULL; -} -#define BUFSIZE 100 +struct field_drawable { + sfRectangleShape ***p; + struct vector2ui size; + unsigned int attr; +}; -/* Must be static in future */ +/* + * TODO: Must be static in future + * + * */ struct window w; static struct idlist *fields_list = NULL; @@ -64,29 +41,42 @@ void painter_init_window() sfResize | sfClose, NULL); if (!w.window) exit(EXIT_FAILURE); + sfRenderWindow_setFramerateLimit(w.window, 60); +} + +void painter_destroy_window() +{ + if (w.window) { + sfRenderWindow_destroy(w.window); + w.window = 0; + } } -unsigned long painter_register_field() +unsigned long painter_register_field(struct field *fld) { struct idlist *last; - if (!fields_list) { + if (!fields_list) last = fields_list = list_new(); - } else + else last = list_append(fields_list); struct field_drawable *f = calloc(1, sizeof(struct field_drawable)); - for (int j = 0; j < FLD_SIZE_Y; j++) - for (int i = 0; i < FLD_SIZE_X; i++) { + f->size = fld->size; + f->p = calloc(f->size.y, sizeof(sfRectangleShape **)); + for (unsigned int j = 0; j < f->size.y; j++) { + f->p[j] = calloc(f->size.x, sizeof(sfRectangleShape *)); + for (unsigned int i = 0; i < f->size.x; i++) { f->p[j][i] = sfRectangleShape_create(); sfVector2f cell_pos; - cell_pos.x = FLD_POS.x + (i * (CELL_SIZE.x + 2 * OUT_THICK)); - cell_pos.y = FLD_POS.y - (j * (CELL_SIZE.y + 2 * OUT_THICK)); - sfRectangleShape_setFillColor(f->p[j][i], UIBGCOLOR); - sfRectangleShape_setSize(f->p[j][i], CELL_SIZE); + cell_pos.x = fld->pos.x + (i * (CELL_SIZE.x + 2 * OUT_THICK)); + cell_pos.y = fld->pos.y - (j * (CELL_SIZE.y + 2 * OUT_THICK)); sfRectangleShape_setPosition(f->p[j][i], cell_pos); - sfRectangleShape_setOutlineColor(f->p[j][i], UIFGACTIVECOLOR); + sfRectangleShape_setFillColor(f->p[j][i], (sfColor)UIBGCOLOR); + sfRectangleShape_setSize(f->p[j][i], CELL_SIZE); + sfRectangleShape_setOutlineColor(f->p[j][i], (sfColor)UIFGACTIVECOLOR); sfRectangleShape_setOutlineThickness(f->p[j][i], OUT_THICK); } + } last->obj = f; return last->id; @@ -98,56 +88,74 @@ void painter_update_field(unsigned long id, struct field *fld) if (!node) return; struct field_drawable *f = node->obj; - for (int j = 0; j < fld->size.y; j++) { - for (int i = 0; i < fld->size.x; i++) { - switch (fld->c[j][i].color) { - case 1 : - sfRectangleShape_setFillColor(f->p[j][i], LCOLOR); - break; - case 2 : - sfRectangleShape_setFillColor(f->p[j][i], RLCOLOR); - break; - case 3 : - sfRectangleShape_setFillColor(f->p[j][i], ZCOLOR); - break; - case 4 : - sfRectangleShape_setFillColor(f->p[j][i], SCOLOR); - break; - case 5 : - sfRectangleShape_setFillColor(f->p[j][i], BCOLOR); - break; - case 6 : - sfRectangleShape_setFillColor(f->p[j][i], ICOLOR); - break; - case 7 : - sfRectangleShape_setFillColor(f->p[j][i], TCOLOR); - break; + f->attr = fld->attr; + for (unsigned int j = 0; j < fld->size.y; j++) { + for (unsigned int i = 0; i < fld->size.x; i++) { + sfVector2f cell_pos; + cell_pos.x = fld->pos.x + (i * (CELL_SIZE.x + 2 * OUT_THICK)); + cell_pos.y = fld->pos.y - (j * (CELL_SIZE.y + 2 * OUT_THICK)); + sfRectangleShape_setPosition(f->p[j][i], cell_pos); + if (fld->c[j][i].a) { + sfRectangleShape_setFillColor(f->p[j][i], shape_color_map[fld->c[j][i].color]); + sfRectangleShape_setOutlineColor(f->p[j][i], (sfColor)UIFGACTIVECOLOR); + } else if (f->attr & FLD_ATTR_TRANSPARENT) { + sfRectangleShape_setFillColor(f->p[j][i], (sfColor)UITRANSPARENT); + sfRectangleShape_setOutlineColor(f->p[j][i], (sfColor)UITRANSPARENT); + } else { + sfRectangleShape_setFillColor(f->p[j][i], (sfColor)UIBGCOLOR); + sfRectangleShape_setOutlineColor(f->p[j][i], (sfColor)UIFGINACTIVECOLOR); } - sfRectangleShape_setOutlineColor(f->p[j][i], UIFGACTIVECOLOR); } } + for (unsigned int s = 0; s < fld->shape_cnt; ++s) + for (int j = 0; j < 4; j++) + for (int i = 0; i < 4; i++) + if (fld->shape[s].c[j][i] && j + fld->shape[s].y < (int)fld->size.y) { + sfRectangleShape_setFillColor( + f->p[j + fld->shape[s].y][i + fld->shape[s].x], + shape_color_map[fld->shape[s].color]); + sfRectangleShape_setOutlineColor( + f->p[j + fld->shape[s].y][i + fld->shape[s].x], + (sfColor)UIFGACTIVECOLOR); + } } -static void draw_field(struct field_drawable *f) +static void draw_field(void *field) { - for (unsigned int j = 0; j < FLD_SIZE_Y; j++) - for (unsigned int i = 0; i < FLD_SIZE_X; i++) - sfRenderWindow_drawRectangleShape(w.window, f->p[j][i], NULL); + struct field_drawable *f = field; + if (!(f->attr & FLD_ATTR_INVISIBLE)) + for (unsigned int j = 0; j < f->size.y; j++) + for (unsigned int i = 0; i < f->size.x; i++) + sfRenderWindow_drawRectangleShape(w.window, f->p[j][i], NULL); } static void draw_fields() { - struct idlist *node = fields_list; - if (node) { - if (node->obj) - draw_field(node->obj); - while (node->next) { - node = node->next; - if (node) - if (node->obj) - draw_field(node->obj); - } + list_foreach(fields_list, draw_field); +} + +static void destroy_field(void *field) +{ + struct field_drawable *f = field; + for (unsigned int j = 0; j < f->size.y; j++) { + for (unsigned int i = 0; i < f->size.x; i++) + sfRectangleShape_destroy(f->p[j][i]); + free(f->p[j]); } + free(f->p); + free(f); +} + +void painter_destroy_field(unsigned long id) +{ + struct idlist *node = list_get(fields_list, id); + destroy_field(node->obj); + list_rm_node(node); +} + +void painter_destroy_fields() +{ + list_foreach(fields_list, destroy_field); } void painter_draw() @@ -155,7 +163,13 @@ void painter_draw() draw_fields(); } -void painter_destroy_window() +void painter_destroy_drawables() +{ + painter_destroy_fields(); +} + +void painter_destroy_all() { - sfRenderWindow_destroy(w.window); + painter_destroy_drawables(); + painter_destroy_window(); } |