Beispiel #1
0
    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);
    }
Beispiel #2
0
    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);
    }
Beispiel #3
0
    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);
    }
Beispiel #4
0
    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);
        }
    }
Beispiel #5
0
    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);
    }