Beispiel #1
0
    public int Add <T0, T1, T2, T3, T4>(ulong UID, Flags *flags, T0 t0, T1 t1, T2 t2, T3 t3, T4 t4)
        where T0 : unmanaged
        where T1 : unmanaged
        where T2 : unmanaged
        where T3 : unmanaged
        where T4 : unmanaged
    {
        var p0 = componentBuffers_[flags[0]];
        var p1 = componentBuffers_[flags[1]];
        var p2 = componentBuffers_[flags[2]];
        var p3 = componentBuffers_[flags[3]];
        var p4 = componentBuffers_[flags[4]];

        var one = 1;

        p0.AssureRoomForMore(Count, one);
        p1.AssureRoomForMore(Count, one);
        p2.AssureRoomForMore(Count, one);
        p3.AssureRoomForMore(Count, one);
        p4.AssureRoomForMore(Count, one);
        p0.Set(ref t0, Count);
        p1.Set(ref t1, Count);
        p2.Set(ref t2, Count);
        p3.Set(ref t3, Count);
        p4.Set(ref t4, Count);

        indicesToUIDs_.Add(UID);

        Count++;
        return(Count - 1);
    }
Beispiel #2
0
    public int Add(ulong UID, Flags *flags)
    {
        indicesToUIDs_.Add(UID);

        Count++;
        return(Count - 1);
    }
Beispiel #3
0
    public int Add <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(ulong UID, Flags *flags, T0 t0, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11)
        where T0 : unmanaged
        where T1 : unmanaged
        where T2 : unmanaged
        where T3 : unmanaged
        where T4 : unmanaged
        where T5 : unmanaged
        where T6 : unmanaged
        where T7 : unmanaged
        where T8 : unmanaged
        where T9 : unmanaged
        where T10 : unmanaged
        where T11 : unmanaged
    {
        var p0  = componentBuffers_[flags[0]];
        var p1  = componentBuffers_[flags[1]];
        var p2  = componentBuffers_[flags[2]];
        var p3  = componentBuffers_[flags[3]];
        var p4  = componentBuffers_[flags[4]];
        var p5  = componentBuffers_[flags[5]];
        var p6  = componentBuffers_[flags[6]];
        var p7  = componentBuffers_[flags[7]];
        var p8  = componentBuffers_[flags[8]];
        var p9  = componentBuffers_[flags[9]];
        var p10 = componentBuffers_[flags[10]];
        var p11 = componentBuffers_[flags[11]];

        var one = 1;

        p0.AssureRoomForMore(Count, one);
        p1.AssureRoomForMore(Count, one);
        p2.AssureRoomForMore(Count, one);
        p3.AssureRoomForMore(Count, one);
        p4.AssureRoomForMore(Count, one);
        p5.AssureRoomForMore(Count, one);
        p6.AssureRoomForMore(Count, one);
        p7.AssureRoomForMore(Count, one);
        p8.AssureRoomForMore(Count, one);
        p9.AssureRoomForMore(Count, one);
        p10.AssureRoomForMore(Count, one);
        p11.AssureRoomForMore(Count, one);
        p0.Set(ref t0, Count);
        p1.Set(ref t1, Count);
        p2.Set(ref t2, Count);
        p3.Set(ref t3, Count);
        p4.Set(ref t4, Count);
        p5.Set(ref t5, Count);
        p6.Set(ref t6, Count);
        p7.Set(ref t7, Count);
        p8.Set(ref t8, Count);
        p9.Set(ref t9, Count);
        p10.Set(ref t10, Count);
        p11.Set(ref t11, Count);

        indicesToUIDs_.Add(UID);

        Count++;
        return(Count - 1);
    }
Beispiel #4
0
    public static unsafe Flags Join(Flags *flags, int size)
    {
//        ulong bits = flags[0].bits_;
//        for (var i = 1; i < size; i++)
        ulong bits = 0;

        for (var i = 0; i < size; i++)
        {
            bits |= flags[i].bits_;
        }
        return(bits);
    }
Beispiel #5
0
    public ArchetypePool(Flags *flags, int[] sizes)
    {
        var allFlags = Flags.Join(flags, sizes.Length);

        archetypeFlags_   = allFlags;
        componentBuffers_ = new MiniDict <Flags, UntypedBuffer>(flags, sizes.Length);

        for (int i = 0; i < sizes.Length; i++)
        {
            componentBuffers_[flags[i]] = new UntypedBuffer(sizes[i], 4);//todo change starting size
        }
        Count = 0;
    }
Beispiel #6
0
    public int Add <T0>(ulong UID, Flags *flags, T0 t0) // genvariadic function
        where T0 : unmanaged                            // genvariadic duplicate
    {
        var p0 = componentBuffers_[flags[0]];           // genvariadic duplicate

        var one = 1;

        p0.AssureRoomForMore(Count, one); // genvariadic duplicate
        p0.Set(ref t0, Count);            // genvariadic duplicate

        indicesToUIDs_.Add(UID);

        Count++;
        return(Count - 1);
    }
Beispiel #7
0
    public int Add <T0, T1>(ulong UID, Flags *flags, T0 t0, T1 t1)
        where T0 : unmanaged
        where T1 : unmanaged
    {
        var p0 = componentBuffers_[flags[0]];
        var p1 = componentBuffers_[flags[1]];

        var one = 1;

        p0.AssureRoomForMore(Count, one);
        p1.AssureRoomForMore(Count, one);
        p0.Set(ref t0, Count);
        p1.Set(ref t1, Count);

        indicesToUIDs_.Add(UID);

        Count++;
        return(Count - 1);
    }
Beispiel #8
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);
    }