public unsafe ulong CreateEntity <T0>(T0 component0) // genvariadic function where T0 : unmanaged // genvariadic duplicate { var flags = stackalloc Flags[] { GetComponentFlag <T0>() // genvariadic duplicate , }; var typeQty = 1; // genvariadic quantity Flags archetypeFlags = Flags.Join(flags, typeQty); ArchetypePool pool; if (!archetypePools_.TryGetValue(archetypeFlags, out pool)) { var sizes = new[] { sizeof(T0) // genvariadic duplicate , }; pool = new ArchetypePool(flags, sizes); archetypePools_.Add(archetypeFlags, pool); } var newId = curUID; int archetypePoolIndex = pool.Add(newId, flags, component0 // genvariadic duplicate , ); UIDsToEntityDatas.TryAdd(newId, new EntityData(archetypeFlags, archetypePoolIndex)); curUID++; return(newId); }
public void DestroyEntity(ulong entityUID) { var dsEntityData = UIDsToEntityDatas[entityUID]; ArchetypePool pool = archetypePools_[dsEntityData.ArchetypeFlags]; var replacerUID = pool.Remove(dsEntityData.IndexInPool); UIDsToEntityDatas[replacerUID] = dsEntityData; UIDsToEntityDatas.TryRemove(entityUID, out EntityData outEntityData); }
public unsafe ulong CreateEntity() { var noFlags = (Flags *)0; ArchetypePool pool = archetypePools_[0]; var newId = curUID; int archetypePoolIndex = pool.Add(newId, noFlags); UIDsToEntityDatas.TryAdd(newId, new EntityData(0, archetypePoolIndex)); curUID++; return(newId); }
private void CopyComponentsTo(int oldPoolIndex, ArchetypePool newPool, int newPoolIndex) { var count = componentBuffers_.Count; var values = componentBuffers_.Values; var keys = componentBuffers_.KeysPtr; for (int i = 0; i < count; i++) { var flag = keys[i]; var oldBuffer = values[i]; var elSize = oldBuffer.ElementSizeInBytes; var newBuffer = newPool.GetComponentBuffer(flag); Buffer.MemoryCopy( (void *)(oldBuffer.Data + (oldPoolIndex * elSize)), (void *)(newBuffer + (newPool.Count * elSize)), elSize, elSize); } }
public unsafe void AddComponent <T>(ulong entityUID, T comp) where T : unmanaged { var entityData = UIDsToEntityDatas[entityUID]; var oldPool = archetypePools_[entityData.ArchetypeFlags]; var indexInOldPool = entityData.IndexInPool; var newComponentFlag = GetComponentFlag <T>(); if (entityData.ArchetypeFlags.Contains(newComponentFlag)) { throw new Exception("Entity already has component"); } var newArchetypeFlags = Flags.Join(entityData.ArchetypeFlags, newComponentFlag); ArchetypePool newArchetypePool; if (!archetypePools_.TryGetValue(newArchetypeFlags, out newArchetypePool)) { var separatedArchetypesFlags = newArchetypeFlags.Separate(); int flagCount = separatedArchetypesFlags.Count; Flags *flags = stackalloc Flags[flagCount]; var sizes = new int[flagCount]; for (int i = 0; i < flagCount; i++) { //todo get rid of registeredComponentsSizes_ and use sizes from oldPool and sizeof(T) sizes[i] = registeredComponentsSizes_[separatedArchetypesFlags[i].FirstPosition]; flags[i] = separatedArchetypesFlags[i]; } newArchetypePool = new ArchetypePool(flags, sizes); archetypePools_.Add(newArchetypeFlags, newArchetypePool); } var newData = oldPool.ChangePoolAndCompleteArchetype( indexInOldPool, newArchetypePool, newComponentFlag, ref comp); UIDsToEntityDatas[newData.replacerUID] = new EntityData(entityData.ArchetypeFlags, indexInOldPool); UIDsToEntityDatas[entityUID] = new EntityData(newArchetypeFlags, newData.newIndex); }