diff --git a/Svelto.ECS/EnginesRoot.Entities.cs b/Svelto.ECS/EnginesRoot.Entities.cs index 0d4cde2..a778e16 100644 --- a/Svelto.ECS/EnginesRoot.Entities.cs +++ b/Svelto.ECS/EnginesRoot.Entities.cs @@ -41,30 +41,21 @@ namespace Svelto.ECS EntityStructInitializer BuildEntity(EGID entityID, object[] implementors) where T : IEntityDescriptor, new() { - var descriptorEntitiesToBuild = EntityDescriptorTemplate.descriptor.entitiesToBuild; -#if DEBUG && !PROFILER - CheckEntityID(entityID, descriptorEntitiesToBuild); -#endif - var dic = EntityFactory.BuildGroupedEntityViews(entityID, - _groupedEntityToAdd.current, - descriptorEntitiesToBuild, - implementors); - - _newEntitiesBuiltToProcess++; - - return new EntityStructInitializer(entityID, dic); + return BuildEntity(entityID, EntityDescriptorTemplate.descriptor, implementors); } EntityStructInitializer BuildEntity(EGID entityID, - IEntityBuilder[] entityToBuild, + IEntityDescriptor entityDescriptor, object[] implementors) { + var descriptorEntitiesToBuild = entityDescriptor.entitiesToBuild; + #if DEBUG && !PROFILER - CheckEntityID(entityID, entityToBuild); + CheckEntityID(entityID, entityDescriptor); #endif var dic = EntityFactory.BuildGroupedEntityViews(entityID, _groupedEntityToAdd.current, - entityToBuild, + descriptorEntitiesToBuild, implementors); _newEntitiesBuiltToProcess++; @@ -72,27 +63,28 @@ namespace Svelto.ECS return new EntityStructInitializer(entityID, dic); } - void CheckEntityID(EGID entityID, IEntityBuilder[] descriptorEntitiesToBuild) + void CheckEntityID(EGID entityID, IEntityDescriptor descriptorEntity) { Dictionary @group; + var descriptorEntitiesToBuild = descriptorEntity.entitiesToBuild; + if (_groupEntityDB.TryGetValue(entityID.groupID, out @group) == true) { for (int i = 0; i < descriptorEntitiesToBuild.Length; i++) { - CheckEntityID(entityID, descriptorEntitiesToBuild[i].GetEntityType(), @group); + CheckEntityID(entityID, descriptorEntitiesToBuild[i].GetEntityType(), @group, descriptorEntity.ToString()); } - CheckEntityID(entityID, _typeEntityInfoView, @group); } } - static void CheckEntityID(EGID entityID, Type entityType, Dictionary @group) + static void CheckEntityID(EGID entityID, Type entityType, Dictionary @group, string name) { ITypeSafeDictionary entities; if (@group.TryGetValue(entityType, out entities)) { if (entities.Has(entityID.entityID) == true) { - Utility.Console.LogError("Entity with used ID is about to be built: " + Utility.Console.LogError("Entity ".FastConcat(name, " with used ID is about to be built: ") .FastConcat(entityType) .FastConcat(" id: ") .FastConcat(entityID.entityID) @@ -136,24 +128,13 @@ namespace Svelto.ECS else dbList.AddCapacity(size); } - - if (group.TryGetValue(_typeEntityInfoView, out dbList) == false) - group[_typeEntityInfoView] = EntityBuilder.Preallocate(ref dbList, size); - else - dbList.AddCapacity(size); - - if (@groupBuffer.TryGetValue(_typeEntityInfoView, out dbList) == false) - @groupBuffer[_typeEntityInfoView] = EntityBuilder.Preallocate(ref dbList, size); - else - dbList.AddCapacity(size); } ///-------------------------------------------- /// - void MoveEntity(EGID entityGID, int toGroupID = -1, Dictionary toGroup = null) + void MoveEntity(EGID entityGID, int toGroupID = -1, Dictionary toGroup = null) where T:IEntityDescriptor, new () { - var entityViewInfoDictionary = _groupEntityDB[entityGID.groupID][_typeEntityInfoView] as TypeSafeDictionary; - var entityBuilders = entityViewInfoDictionary[entityGID.entityID].entityToBuild; + var entityBuilders = EntityDescriptorTemplate.descriptor.entitiesToBuild; var entityBuildersCount = entityBuilders.Length; //for each entity view generated by the entity descriptor @@ -161,13 +142,11 @@ namespace Svelto.ECS { var entityType = entityBuilders[i].GetEntityType(); - MoveEntity(entityGID, toGroupID, toGroup, entityType); + MoveEntity(entityGID, toGroupID, toGroup, entityType); } - - MoveEntity(entityGID, toGroupID, toGroup, _typeEntityInfoView); } - void MoveEntity(EGID fromEntityGID, int toGroupID, Dictionary toGroup, Type entityType) + void MoveEntity(EGID fromEntityGID, int toGroupID, Dictionary toGroup, Type entityType) where T:IEntityDescriptor, new () { var fromGroup = _groupEntityDB[fromEntityGID.groupID]; @@ -210,7 +189,7 @@ namespace Svelto.ECS ///-------------------------------------------- - void SwapEntityGroup(int entityID, int fromGroupID, int toGroupID) + void SwapEntityGroup(int entityID, int fromGroupID, int toGroupID) where T:IEntityDescriptor, new () { DBC.ECS.Check.Require(fromGroupID != toGroupID, "can't move an entity to the same fromGroup where it already belongs to"); @@ -220,22 +199,21 @@ namespace Svelto.ECS if (_groupEntityDB.TryGetValue(toGroupID, out toGroup) == false) toGroup = _groupEntityDB[toGroupID] = new Dictionary(); - MoveEntity(new EGID(entityID, fromGroupID), toGroupID, toGroup); + MoveEntity(new EGID(entityID, fromGroupID), toGroupID, toGroup); } - EGID SwapFirstEntityInGroup(int fromGroupID, int toGroupId) + EGID SwapFirstEntityInGroup(int fromGroupID, int toGroupId) where T:IEntityDescriptor, new() { - var firstID = - ((TypeSafeDictionary) _groupEntityDB[fromGroupID][_typeEntityInfoView]).FasterValues[0].ID.entityID; + var firstID = _groupEntityDB[fromGroupID][EntityDescriptorTemplate.descriptor.entitiesToBuild[0] + .GetEntityType()].GetFirstID(); - SwapEntityGroup(firstID, fromGroupID, toGroupId); + SwapEntityGroup(firstID, fromGroupID, toGroupId); return new EGID(firstID, toGroupId); } readonly entitiesDB _DB; - static readonly Type _typeEntityInfoView = typeof(EntityInfoView); int _newEntitiesBuiltToProcess; } diff --git a/Svelto.ECS/EnginesRoot.GenericEntityFactory.cs b/Svelto.ECS/EnginesRoot.GenericEntityFactory.cs index 6fc3881..1288ce0 100644 --- a/Svelto.ECS/EnginesRoot.GenericEntityFactory.cs +++ b/Svelto.ECS/EnginesRoot.GenericEntityFactory.cs @@ -30,19 +30,19 @@ namespace Svelto.ECS return _weakEngine.Target.BuildEntity(egid, implementors); } - public EntityStructInitializer BuildEntity(int entityID, IEntityBuilder[] entityToBuild, object[] implementors) + public EntityStructInitializer BuildEntity(int entityID, IEntityDescriptor descriptorEntity, object[] implementors) { - return _weakEngine.Target.BuildEntity(new EGID(entityID), entityToBuild, implementors); + return _weakEngine.Target.BuildEntity(new EGID(entityID), descriptorEntity, implementors); } - public EntityStructInitializer BuildEntity(EGID egid, IEntityBuilder[] entityToBuild, object[] implementors) + public EntityStructInitializer BuildEntity(EGID egid, IEntityDescriptor descriptorEntity, object[] implementors) { - return _weakEngine.Target.BuildEntity(egid, entityToBuild, implementors); + return _weakEngine.Target.BuildEntity(egid, descriptorEntity, implementors); } - public EntityStructInitializer BuildEntity(int entityID, ExclusiveGroup groupID, IEntityBuilder[] entityToBuild, object[] implementors) + public EntityStructInitializer BuildEntity(int entityID, ExclusiveGroup groupID, IEntityDescriptor descriptorEntity, object[] implementors) { - return _weakEngine.Target.BuildEntity(new EGID(entityID, (int)groupID), entityToBuild, implementors); + return _weakEngine.Target.BuildEntity(new EGID(entityID, (int)groupID), descriptorEntity, implementors); } public void PreallocateEntitySpace(int size) where T : IEntityDescriptor, new() diff --git a/Svelto.ECS/EnginesRoot.GenericEntityFunctions.cs b/Svelto.ECS/EnginesRoot.GenericEntityFunctions.cs index ef255a5..402a066 100644 --- a/Svelto.ECS/EnginesRoot.GenericEntityFunctions.cs +++ b/Svelto.ECS/EnginesRoot.GenericEntityFunctions.cs @@ -17,19 +17,19 @@ namespace Svelto.ECS _weakReference = weakReference; } - public void RemoveEntity(int entityID) + public void RemoveEntity(int entityID) where T : IEntityDescriptor, new() { - _weakReference.Target.MoveEntity(new EGID(entityID)); + _weakReference.Target.MoveEntity(new EGID(entityID)); } - public void RemoveEntity(int entityID, int groupID) + public void RemoveEntity(int entityID, int groupID) where T : IEntityDescriptor, new() { - _weakReference.Target.MoveEntity(new EGID(entityID, groupID)); + _weakReference.Target.MoveEntity(new EGID(entityID, groupID)); } - public void RemoveEntity(EGID entityEGID) + public void RemoveEntity(EGID entityEGID) where T : IEntityDescriptor, new() { - _weakReference.Target.MoveEntity(entityEGID); + _weakReference.Target.MoveEntity(entityEGID); } public void RemoveGroupAndEntities(int groupID) @@ -37,24 +37,24 @@ namespace Svelto.ECS _weakReference.Target.RemoveGroupAndEntitiesFromDB(groupID); } - public void SwapEntityGroup(int entityID, int fromGroupID, int toGroupID) + public void SwapEntityGroup(int entityID, int fromGroupID, int toGroupID) where T : IEntityDescriptor, new() { - _weakReference.Target.SwapEntityGroup(entityID, fromGroupID, toGroupID); + _weakReference.Target.SwapEntityGroup(entityID, fromGroupID, toGroupID); } - public void SwapEntityGroup(EGID id, int toGroupID = ExclusiveGroup.StandardEntitiesGroup) + public void SwapEntityGroup(EGID id, int toGroupID = ExclusiveGroup.StandardEntitiesGroup) where T : IEntityDescriptor, new() { - _weakReference.Target.SwapEntityGroup(id.entityID, id.groupID, toGroupID); + _weakReference.Target.SwapEntityGroup(id.entityID, id.groupID, toGroupID); } - public void SwapEntityGroup(int entityID, int toGroupID) + public void SwapEntityGroup(int entityID, int toGroupID) where T : IEntityDescriptor, new() { - _weakReference.Target.SwapEntityGroup(entityID, ExclusiveGroup.StandardEntitiesGroup, toGroupID); + _weakReference.Target.SwapEntityGroup(entityID, ExclusiveGroup.StandardEntitiesGroup, toGroupID); } - public EGID SwapFirstEntityGroup(int fromGroupID, int toGroupID) + public EGID SwapFirstEntityGroup(int fromGroupID, int toGroupID) where T : IEntityDescriptor, new() { - return _weakReference.Target.SwapFirstEntityInGroup( fromGroupID, toGroupID); + return _weakReference.Target.SwapFirstEntityInGroup( fromGroupID, toGroupID); } } } diff --git a/Svelto.ECS/EntityFactory.cs b/Svelto.ECS/EntityFactory.cs index 8a83d35..89eed13 100644 --- a/Svelto.ECS/EntityFactory.cs +++ b/Svelto.ECS/EntityFactory.cs @@ -46,10 +46,6 @@ namespace Svelto.ECS.Internal BuildEntityView(entityID, @group, entityViewType, entityViewBuilder, implementors); } - - _builder._initializer = new EntityInfoView {entityToBuild = entityToBuild}; - - BuildEntityView(entityID, @group, _viewType, _builder, null); } static void BuildEntityView(EGID entityID, Dictionary @group, @@ -69,8 +65,5 @@ namespace Svelto.ECS.Internal if (entityViewsPoolWillBeCreated) @group.Add(entityViewType, safeDictionary); } - - static readonly EntityBuilder _builder = new EntityBuilder(); - static readonly Type _viewType = typeof(EntityInfoView); } } \ No newline at end of file diff --git a/Svelto.ECS/Extensions/Unity/GenericEntityDescriptorHolder.cs b/Svelto.ECS/Extensions/Unity/GenericEntityDescriptorHolder.cs index 35692bc..e3f2fa1 100644 --- a/Svelto.ECS/Extensions/Unity/GenericEntityDescriptorHolder.cs +++ b/Svelto.ECS/Extensions/Unity/GenericEntityDescriptorHolder.cs @@ -5,9 +5,9 @@ namespace Svelto.ECS.Unity UnityEngine.MonoBehaviour , IEntityDescriptorHolder where T: IEntityDescriptor, new() { - public IEntityBuilder[] GetEntitiesToBuild() + public IEntityDescriptor GetDescriptor() { - return EntityDescriptorTemplate.descriptor.entitiesToBuild; + return EntityDescriptorTemplate.descriptor; } } } diff --git a/Svelto.ECS/IEntityDescriptorHolder.cs b/Svelto.ECS/IEntityDescriptorHolder.cs index 8ba960a..67bb260 100644 --- a/Svelto.ECS/IEntityDescriptorHolder.cs +++ b/Svelto.ECS/IEntityDescriptorHolder.cs @@ -2,6 +2,6 @@ namespace Svelto.ECS { public interface IEntityDescriptorHolder { - IEntityBuilder[] GetEntitiesToBuild(); + IEntityDescriptor GetDescriptor(); } } \ No newline at end of file diff --git a/Svelto.ECS/IEntityFactory.cs b/Svelto.ECS/IEntityFactory.cs index 084d4ee..1aa7b3c 100644 --- a/Svelto.ECS/IEntityFactory.cs +++ b/Svelto.ECS/IEntityFactory.cs @@ -59,8 +59,8 @@ namespace Svelto.ECS /// /// /// - EntityStructInitializer BuildEntity(int entityID, ExclusiveGroup groupID, IEntityBuilder[] entityToBuild, object[] implementors); - EntityStructInitializer BuildEntity(int entityID, IEntityBuilder[] entityToBuild, object[] implementors); - EntityStructInitializer BuildEntity(EGID egid, IEntityBuilder[] entityToBuild, object[] implementors); + EntityStructInitializer BuildEntity(int entityID, ExclusiveGroup groupID, IEntityDescriptor descriptorEntity, object[] implementors); + EntityStructInitializer BuildEntity(int entityID, IEntityDescriptor descriptorEntity, object[] implementors); + EntityStructInitializer BuildEntity(EGID egid, IEntityDescriptor descriptorEntity, object[] implementors); } } diff --git a/Svelto.ECS/IEntityFunctions.cs b/Svelto.ECS/IEntityFunctions.cs index e55c9bc..0db6b96 100644 --- a/Svelto.ECS/IEntityFunctions.cs +++ b/Svelto.ECS/IEntityFunctions.cs @@ -7,15 +7,15 @@ namespace Svelto.ECS //being entity ID globally not unique, the group must be specified when //an entity is removed. Not specificing the group will attempt to remove //the entity from the special standard group. - void RemoveEntity(int entityID); - void RemoveEntity(int entityID, int groupID); - void RemoveEntity(EGID entityegid); + void RemoveEntity(int entityID) where T : IEntityDescriptor, new(); + void RemoveEntity(int entityID, int groupID) where T : IEntityDescriptor, new(); + void RemoveEntity(EGID entityegid) where T : IEntityDescriptor, new(); void RemoveGroupAndEntities(int groupID); - void SwapEntityGroup(int entityID, int fromGroupID, int toGroupID = ExclusiveGroup.StandardEntitiesGroup); - void SwapEntityGroup(EGID id, int toGroupID = ExclusiveGroup.StandardEntitiesGroup); - void SwapEntityGroup(int entityID, int toGroupID); - EGID SwapFirstEntityGroup(int fromGroupID = ExclusiveGroup.StandardEntitiesGroup, int toGroupID = ExclusiveGroup.StandardEntitiesGroup); + void SwapEntityGroup(int entityID, int fromGroupID, int toGroupID = ExclusiveGroup.StandardEntitiesGroup) where T : IEntityDescriptor, new(); + void SwapEntityGroup(EGID id, int toGroupID = ExclusiveGroup.StandardEntitiesGroup) where T : IEntityDescriptor, new(); + void SwapEntityGroup(int entityID, int toGroupID) where T : IEntityDescriptor, new(); + EGID SwapFirstEntityGroup(int fromGroupID = ExclusiveGroup.StandardEntitiesGroup, int toGroupID = ExclusiveGroup.StandardEntitiesGroup) where T : IEntityDescriptor, new(); } } \ No newline at end of file diff --git a/Svelto.ECS/StaticEntityDescriptorInfo.cs b/Svelto.ECS/StaticEntityDescriptorInfo.cs index 8e85a32..a939066 100644 --- a/Svelto.ECS/StaticEntityDescriptorInfo.cs +++ b/Svelto.ECS/StaticEntityDescriptorInfo.cs @@ -42,9 +42,9 @@ namespace Svelto.ECS public IEntityBuilder[] entitiesToBuild { get; private set; } } - public struct StaticEntityDescriptorInfo: IEntityDescriptor where TType : IEntityDescriptor + public class StaticEntityDescriptorInfo: IEntityDescriptor where TType : IEntityDescriptor { - internal StaticEntityDescriptorInfo(TType descriptor) : this() + internal StaticEntityDescriptorInfo(TType descriptor) { entitiesToBuild = descriptor.entitiesToBuild; }