#ifndef __GE_RENDER_SYSTEM_H__ #define __GE_RENDER_SYSTEM_H__ #include "ge_entity.h" #include "ge_render_component.h" #include typedef struct ge_render_system { ge_render_t* render; ge_ecs_storage_t* ecs; } ge_render_system_t; static inline void ge_render_system_init(ge_render_system_t* ctx, ge_render_t* render) { Assert(ctx != NULL && render != NULL); ctx->render = render; } #define _GE_RENDERABLE_MASK (GE_RENDERABLE_MASK | GE_COMPONENT_ACVIVE) static inline void ge_render_system_draw_basic( ge_render_system_t* ctx, ge_render_component_t* comp, ge_render_pos2_t* pos) { Assert(comp->type < GE_RENDER_COMP_TYPE_SIZE); switch (comp->type) { case GE_RENDER_COMP_TYPE_POINT: ctx->render->func_draw_point( ctx->render, pos, comp->data.point.color ); break; case GE_RENDER_COMP_TYPE_RECT: ctx->render->func_draw_rect( ctx->render, &(ge_render_rect_t) { *pos, comp->data.rect.size, }, comp->data.rect.color ); break; case GE_RENDER_COMP_TYPE_TEXT: TODO(); break; case GE_RENDER_COMP_TYPE_RECOURCE: TODO(); break; default: LOG_WARN("render component not set Avaliable type %d at [%d,%d]", comp->type, pos->x, pos->y); break; } } static inline void ge_render_system_draw_all(ge_render_system_t* ctx) { Assert(ctx != NULL); ge_ecs_storage_t* ecs = ctx->ecs; Assert(ecs != NULL); for (int i = 1; i <= ecs->count && i < GE_ECS_MAX; ++i) { ge_entity_t* entity = &ecs->entities[i]; ge_ecs_mask_t mask = entity->component_mask; if ((mask & _GE_RENDERABLE_MASK) != _GE_RENDERABLE_MASK) continue; ge_render_pos2_t pos = { entity->position.x, entity->position.y, }; ge_render_component_t* comp = &entity->renderable; Assert(comp != NULL); if (comp->type != GE_RENDER_COMP_TYPE_TILEMAP) { ge_render_system_draw_basic(ctx, comp, &pos); continue; } for (int y = 0; y < comp->data.tilemap.map_size.y; y++) { for (int x = 0; x < comp->data.tilemap.map_size.x; x++, pos.x += comp->data.tilemap.tile_size) { ge_render_component_t* tile = (comp->data.tilemap.components) [y * comp->data.tilemap.map_size.x + x]; if (tile == NULL || tile->type == GE_RENDER_COMP_TYPE_NONE) { continue; } ge_render_system_draw_basic(ctx, tile, &pos); } pos.x -= comp->data.tilemap.map_size.x * comp->data.tilemap.tile_size; pos.y += comp->data.tilemap.tile_size; } } } #endif // __GE_RENDER_SYSTEM_H__