2024-09-11 10:16:57 +00:00
|
|
|
#include <voxula/internals/ecs/lookup.h>
|
2024-09-12 21:27:12 +00:00
|
|
|
#include <voxula/internals/ecs/tag.h>
|
2024-09-11 10:16:57 +00:00
|
|
|
#include <voxula/internals/ecs/head.h>
|
2024-09-14 14:37:45 +00:00
|
|
|
|
2024-09-11 10:16:57 +00:00
|
|
|
#include <stdlib.h>
|
2024-09-14 14:37:45 +00:00
|
|
|
#include <string.h>
|
2024-09-11 10:16:57 +00:00
|
|
|
|
2024-09-12 21:27:12 +00:00
|
|
|
vecs_s * vecs_new(vx_uuid_table_s *uuid_table)
|
2024-09-11 10:16:57 +00:00
|
|
|
{
|
2024-09-14 12:25:49 +00:00
|
|
|
if( ! uuid_table)
|
|
|
|
{
|
|
|
|
uuid_table = vx_new_uuid_table();
|
|
|
|
}
|
2024-09-11 10:16:57 +00:00
|
|
|
vecs_s *ecs = malloc(sizeof(vecs_s));
|
2024-09-12 21:27:12 +00:00
|
|
|
ecs->resolver = vecs_create_tag_name_resolver(uuid_table);
|
|
|
|
ecs->lookup_map = vecs_create_lookup_map(uuid_table);
|
2024-09-14 14:37:45 +00:00
|
|
|
ecs->uuid_table = uuid_table;
|
2024-09-11 10:16:57 +00:00
|
|
|
ecs->shadow_pool = vx_new_pool(sizeof(vecs_shadow_s), 8192);
|
|
|
|
ecs->tag_pool = vx_new_pool(sizeof(vecs_tag_s), 32768);
|
2024-09-14 14:37:45 +00:00
|
|
|
|
|
|
|
ecs->type_resolver.num_types = 0;
|
|
|
|
ecs->type_resolver.types_capacity = 256;
|
|
|
|
ecs->type_resolver.types = malloc(ecs->type_resolver.types_capacity * sizeof(vecs_type_s));
|
|
|
|
|
2024-09-11 10:16:57 +00:00
|
|
|
return ecs;
|
|
|
|
}
|
|
|
|
|
|
|
|
void vecs_free(vecs_s *ecs)
|
|
|
|
{
|
|
|
|
vecs_delete_tag_name_resolver(&ecs->resolver);
|
|
|
|
vx_free_pool(ecs->shadow_pool);
|
|
|
|
vx_free_pool(ecs->tag_pool);
|
|
|
|
}
|
2024-09-14 14:37:45 +00:00
|
|
|
|
|
|
|
vecs_type_s * vecs_resolve_type(
|
|
|
|
vecs_s *ecs,
|
|
|
|
const char *name
|
|
|
|
) {
|
|
|
|
uint16_t len_name = strlen(name);
|
|
|
|
|
|
|
|
uint32_t type_index = 0;
|
|
|
|
while(type_index < ecs->type_resolver.num_types)
|
|
|
|
{
|
|
|
|
vecs_type_s *type = &ecs->type_resolver.types[type_index];
|
|
|
|
if(type->len_name != len_name)
|
|
|
|
{
|
|
|
|
++type_index;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if( ! memcmp(type->name, name, type->len_name))
|
|
|
|
{
|
|
|
|
return type;
|
|
|
|
}
|
|
|
|
++type_index;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void vecs_remark(
|
|
|
|
vecs_s *ecs,
|
|
|
|
char *type_name,
|
|
|
|
uint32_t size
|
|
|
|
) {
|
|
|
|
if(vecs_resolve_type(ecs, type_name))
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if(ecs->type_resolver.num_types >= ecs->type_resolver.types_capacity)
|
|
|
|
{
|
|
|
|
ecs->type_resolver.types_capacity *= 2;
|
|
|
|
ecs->type_resolver.types = realloc(ecs->type_resolver.types, ecs->type_resolver.types_capacity * sizeof(vecs_type_s));
|
|
|
|
}
|
|
|
|
vecs_type_s *type = &ecs->type_resolver.types[ecs->type_resolver.num_types++];
|
|
|
|
type->size = size;
|
|
|
|
type->len_name = strlen(type_name);
|
|
|
|
type->name = vx_arena_dupe_string(ecs->static_arena, type_name);
|
|
|
|
}
|