MainTree/src-c/entity.c

99 lines
3.0 KiB
C

#include <entity.h>
#include <context.h>
#include <shadow-registry.h>
MtEntity mt_summon(void *context_ptr)
{
MtContext *context = context_ptr;
MtShadow *shadow = mt_create_shadow(context->shadow_registry);
MtEntity entity;
entity.context = context_ptr;
entity.shadow_id = shadow->identifier;
return entity;
}
void mt_delete(MtEntity entity)
{
MtContext *context = entity.context;
MtShadow *shadow = mt_lookup_shadow(context->shadow_registry, entity.shadow_id);
mt_delete_shadow(context->shadow_registry, shadow);
}
MtShadowTag * mt_get_and_name_tag_for_entity(MtEntity entity, const char *name)
{
MtContext *context = entity.context;
MtShadow *shadow = mt_lookup_shadow(context->shadow_registry, entity.shadow_id);
if(shadow->tag_chain_start == NULL)
shadow->tag_chain_start = (entity.context);
else
shadow->tag_chain_start = mt_alloc_shadow_tag_before(shadow->tag_chain_start);
return shadow->tag_chain_start;
}
void mt_tag_bool(MtEntity entity, const char *name, bool boolean)
{
MtShadowTag *tag = mt_get_and_name_tag_for_entity(entity, name);
tag->type = MT_SHADOW_TAG_BOOLEAN;
tag->data.boolean = boolean;
}
void mt_tag_int(MtEntity entity, const char *name, int64_t integer)
{
MtShadowTag *tag = mt_get_and_name_tag_for_entity(entity, name);
tag->type = MT_SHADOW_TAG_INTEGER;
tag->data.integer = integer;
}
void mt_tag_float(MtEntity entity, const char *name, double real)
{
MtShadowTag *tag = mt_get_and_name_tag_for_entity(entity, name);
tag->type = MT_SHADOW_TAG_REAL;
tag->data.real = real;
}
void mt_tag_str(MtEntity entity, const char *name, char *string)
{
// TODO: Allocate the string in an arena allocator which is
// stored in, and deleted with, the entity shadow.
MtShadowTag *tag = mt_get_and_name_tag_for_entity(entity, name);
tag->type = MT_SHADOW_TAG_STRING;
tag->data.string = string;
}
void mt_tag_ptr(MtEntity entity, const char *name, void *pointer)
{
MtShadowTag *tag = mt_get_and_name_tag_for_entity(entity, name);
tag->type = MT_SHADOW_TAG_RAW_POINTER;
tag->data.raw_pointer = pointer;
}
void mt_tag_vec2f(MtEntity entity, const char *name, AuVec2f vec2f)
{
MtShadowTag *tag = mt_get_and_name_tag_for_entity(entity, name);
tag->type = MT_SHADOW_TAG_VECTOR_2;
tag->data.vec2f = vec2f;
}
void mt_tag_vec3f(MtEntity entity, const char *name, AuVec3f vec3f)
{
MtShadowTag *tag = mt_get_and_name_tag_for_entity(entity, name);
tag->type = MT_SHADOW_TAG_VECTOR_3;
tag->data.vec3f = vec3f;
}
void mt_tag_vec4f(MtEntity entity, const char *name, AuVec4f vec4f)
{
MtShadowTag *tag = mt_get_and_name_tag_for_entity(entity, name);
tag->type = MT_SHADOW_TAG_VECTOR_4;
tag->data.vec4f = vec4f;
}
void mt_tag_ref(MtEntity entity, const char *name, MtEntity reference)
{
MtShadowTag *tag = mt_get_and_name_tag_for_entity(entity, name);
tag->type = MT_SHADOW_TAG_REFERENCE;
tag->data.reference = reference;
}