#include #include #include 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; }