diff --git a/src/Arch.SourceGen/Fundamentals/StructuralChanges.cs b/src/Arch.SourceGen/Fundamentals/StructuralChanges.cs index a5a5553a..a0873911 100644 --- a/src/Arch.SourceGen/Fundamentals/StructuralChanges.cs +++ b/src/Arch.SourceGen/Fundamentals/StructuralChanges.cs @@ -19,11 +19,13 @@ public static StringBuilder AppendWorldAdd(this StringBuilder sb, int amount) var inParameters = new StringBuilder().InsertGenericInParams(amount); var types = new StringBuilder().GenericTypeParams(amount); + var getIds = new StringBuilder(); var setIds = new StringBuilder(); var addEvents = new StringBuilder(); for (var index = 0; index <= amount; index++) { - setIds.AppendLine($"spanBitSet.SetBit(Component.ComponentType.Id);"); + getIds.AppendLine($"var id{index} = Component.ComponentType.Id;"); + setIds.AppendLine($"spanBitSet.SetBit(id{index});"); addEvents.AppendLine($"OnComponentAdded(entity);"); } @@ -36,6 +38,9 @@ public static StringBuilder AppendWorldAdd(this StringBuilder sb, int amount) { var oldArchetype = EntityInfo.GetArchetype(entity.Id); + // Get all the ids here just in case we are adding a new component as this will grow the ComponentRegistry.Size + {{getIds}} + // BitSet to stack/span bitset, size big enough to contain ALL registered components. Span stack = stackalloc uint[BitSet.RequiredLength(ComponentRegistry.Size)]; oldArchetype.BitSet.AsSpan(stack); diff --git a/src/Arch.SourceGen/Queries/AddWithQueryDescription.cs b/src/Arch.SourceGen/Queries/AddWithQueryDescription.cs index 996e3a44..f3cbbdc6 100644 --- a/src/Arch.SourceGen/Queries/AddWithQueryDescription.cs +++ b/src/Arch.SourceGen/Queries/AddWithQueryDescription.cs @@ -50,7 +50,7 @@ public static void AppendAddWithQueryDescription(this StringBuilder sb, int amou public void Add<{{generics}}>(in QueryDescription queryDescription, {{parameters}}) { // BitSet to stack/span bitset, size big enough to contain ALL registered components. - Span stack = stackalloc uint[BitSet.RequiredLength(ComponentRegistry.Size)]; + Span stack = stackalloc uint[BitSet.RequiredLength(ComponentRegistry.Size + {{amount + 1}})]; var query = Query(in queryDescription); foreach (var archetype in query.GetArchetypeIterator())