using System; using Svelto.ECS.Serialization; namespace Svelto.ECS { /// /// Inherit from an ExtendibleEntityDescriptor to extend a base entity descriptor that can be used /// to swap and remove specialized entities from abstract engines /// /// Usage Example: /// /// class SpecialisedDescriptor : ExtendibleEntityDescriptor /// { /// public SpecialisedDescriptor() : base (new IComponentBuilder[] /// { /// new ComponentBuilder() //add more components to the base descriptor /// }) /// { /// ExtendWith(); //add extra components from descriptors that act as contract /// } /// } /// /// public abstract class ExtendibleEntityDescriptor : IDynamicEntityDescriptor where TType : IEntityDescriptor, new() { static ExtendibleEntityDescriptor() { if (typeof(ISerializableEntityDescriptor).IsAssignableFrom(typeof(TType))) throw new Exception( $"SerializableEntityDescriptors cannot be used as base entity descriptor: {typeof(TType)}"); } protected ExtendibleEntityDescriptor(IComponentBuilder[] extraEntities) { _dynamicDescriptor = new DynamicEntityDescriptor(extraEntities); } protected ExtendibleEntityDescriptor() { _dynamicDescriptor = new DynamicEntityDescriptor(true); } protected ExtendibleEntityDescriptor ExtendWith() where T : IEntityDescriptor, new() { _dynamicDescriptor.ExtendWith(); return this; } protected ExtendibleEntityDescriptor ExtendWith(IComponentBuilder[] extraEntities) { _dynamicDescriptor.ExtendWith(extraEntities); return this; } protected void Add() where T : struct, IEntityComponent { _dynamicDescriptor.Add(); } protected void Add() where T : struct, IEntityComponent where U : struct, IEntityComponent { _dynamicDescriptor.Add(); } protected void Add() where T : struct, IEntityComponent where U : struct, IEntityComponent where V : struct, IEntityComponent { _dynamicDescriptor.Add(); } public IComponentBuilder[] componentsToBuild => _dynamicDescriptor.componentsToBuild; DynamicEntityDescriptor _dynamicDescriptor; } }