You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

36 lines
1.2 KiB

using System;
using gaemstone.Utility;
using static flecs_hub.flecs;
namespace gaemstone.ECS;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum)]
public class ComponentAttribute : EntityAttribute
{
public ComponentAttribute() { }
public ComponentAttribute(params string[] path) : base(path) { }
}
public static class ComponentExtensions
{
public unsafe static EntityRef CreateComponent<T>(this EntityRef entity)
=> entity.CreateComponent(typeof(T));
public unsafe static EntityRef CreateComponent(this EntityRef entity, Type type)
{
// TODO: Do some additional sanity checking for this type.
var typeInfo = default(ecs_type_info_t);
if (type.IsPrimitive) throw new ArgumentException(
"Must not be primitive", nameof(type));
var wrapper = TypeWrapper.For(type);
if (type.IsValueType && !wrapper.IsUnmanaged) throw new Exception(
"Struct component must satisfy the unmanaged constraint. " +
"Consider making it a class if you need to store references.");
typeInfo.size = wrapper.Size;
typeInfo.alignment = wrapper.Size;
var desc = new ecs_component_desc_t { entity = entity, type = typeInfo };
ecs_component_init(entity.Universe, &desc);
return entity.CreateLookup(type);
}
}