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); }
public int Add(ulong UID, Flags *flags) { indicesToUIDs_.Add(UID); Count++; return(Count - 1); }
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); }
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); }
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; }
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); }
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); }
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); }