public void SetSharedComponentDataIndex(ArchetypeManager archetypeManager, SharedComponentDataManager sharedComponentDataManager, Entity entity, int typeIndex, int newSharedComponentDataIndex) { var archetype = GetArchetype(entity); var indexInTypeArray = ChunkDataUtility.GetIndexInTypeArray(archetype, typeIndex); var srcChunk = GetComponentChunk(entity); var srcSharedComponentValueArray = srcChunk->SharedComponentValueArray; var sharedComponentOffset = archetype->SharedComponentOffset[indexInTypeArray]; var oldSharedComponentDataIndex = srcSharedComponentValueArray[sharedComponentOffset]; if (newSharedComponentDataIndex == oldSharedComponentDataIndex) { return; } var sharedComponentIndices = stackalloc int[archetype->NumSharedComponents]; var srcSharedComponentDataIndices = srcChunk->SharedComponentValueArray; ArchetypeManager.CopySharedComponentDataIndexArray(sharedComponentIndices, srcSharedComponentDataIndices, archetype->NumSharedComponents); sharedComponentIndices[sharedComponentOffset] = newSharedComponentDataIndex; var newChunk = archetypeManager.GetChunkWithEmptySlots(archetype, sharedComponentIndices); var newChunkIndex = archetypeManager.AllocateIntoChunk(newChunk); IncrementComponentOrderVersion(archetype, srcChunk, sharedComponentDataManager); MoveEntityToChunk(archetypeManager, entity, newChunk, newChunkIndex); }
public void InstantiateEntities(ArchetypeManager archetypeManager, SharedComponentDataManager sharedComponentDataManager, EntityGroupManager groupManager, Entity srcEntity, Entity *outputEntities, int count, ComponentTypeInArchetype *componentTypeInArchetypeArray) { var srcIndex = m_Entities[srcEntity.Index].IndexInChunk; var srcChunk = m_Entities[srcEntity.Index].Chunk; var srcArchetype = GetArchetype(srcEntity); var dstArchetype = GetInstantiableArchetype(srcEntity, archetypeManager, groupManager, componentTypeInArchetypeArray); var srcSharedComponentDataIndices = GetComponentChunk(srcEntity)->SharedComponentValueArray; while (count != 0) { var chunk = archetypeManager.GetChunkWithEmptySlots(dstArchetype, srcSharedComponentDataIndices); int indexInChunk; var allocatedCount = archetypeManager.AllocateIntoChunk(chunk, count, out indexInChunk); ChunkDataUtility.ReplicateComponents(srcChunk, srcIndex, chunk, indexInChunk, allocatedCount); AllocateEntities(dstArchetype, chunk, indexInChunk, allocatedCount, outputEntities); outputEntities += allocatedCount; count -= allocatedCount; } IncrementComponentOrderVersion(dstArchetype, srcChunk, sharedComponentDataManager); }
public void CreateEntities(ArchetypeManager archetypeManager, Archetype *archetype, Entity *entities, int count) { while (count != 0) { var chunk = archetypeManager.GetChunkWithEmptySlots(archetype, null); int allocatedIndex; var allocatedCount = archetypeManager.AllocateIntoChunk(chunk, count, out allocatedIndex); AllocateEntities(archetype, chunk, allocatedIndex, allocatedCount, entities); ChunkDataUtility.ClearComponents(chunk, allocatedIndex, allocatedCount); entities += allocatedCount; count -= allocatedCount; } IncrementComponentTypeOrderVersion(archetype); }
public void SetArchetype(ArchetypeManager typeMan, Entity entity, Archetype *archetype, int *sharedComponentDataIndices) { var chunk = typeMan.GetChunkWithEmptySlots(archetype, sharedComponentDataIndices); var chunkIndex = typeMan.AllocateIntoChunk(chunk); var oldArchetype = m_Entities[entity.Index].Archetype; var oldChunk = m_Entities[entity.Index].Chunk; var oldChunkIndex = m_Entities[entity.Index].IndexInChunk; ChunkDataUtility.Convert(oldChunk, oldChunkIndex, chunk, chunkIndex); if (chunk->ManagedArrayIndex >= 0 && oldChunk->ManagedArrayIndex >= 0) { ChunkDataUtility.CopyManagedObjects(typeMan, oldChunk, oldChunkIndex, chunk, chunkIndex, 1); } m_Entities[entity.Index].Archetype = archetype; m_Entities[entity.Index].Chunk = chunk; m_Entities[entity.Index].IndexInChunk = chunkIndex; var lastIndex = oldChunk->Count - 1; // No need to replace with ourselves if (lastIndex != oldChunkIndex) { var lastEntity = (Entity *)ChunkDataUtility.GetComponentData(oldChunk, lastIndex, 0); m_Entities[lastEntity->Index].IndexInChunk = oldChunkIndex; ChunkDataUtility.Copy(oldChunk, lastIndex, oldChunk, oldChunkIndex, 1); if (oldChunk->ManagedArrayIndex >= 0) { ChunkDataUtility.CopyManagedObjects(typeMan, oldChunk, lastIndex, oldChunk, oldChunkIndex, 1); } } if (oldChunk->ManagedArrayIndex >= 0) { ChunkDataUtility.ClearManagedObjects(typeMan, oldChunk, lastIndex, 1); } --oldArchetype->EntityCount; typeMan.SetChunkCount(oldChunk, lastIndex); }
public void CreateEntities(ArchetypeManager archetypeManager, Archetype *archetype, Entity *entities, int count) { int *sharedComponentDataIndices = stackalloc int[archetype->NumSharedComponents]; UnsafeUtility.MemClear(sharedComponentDataIndices, archetype->NumSharedComponents * sizeof(int)); while (count != 0) { var chunk = archetypeManager.GetChunkWithEmptySlots(archetype, sharedComponentDataIndices); int allocatedIndex; var allocatedCount = archetypeManager.AllocateIntoChunk(chunk, count, out allocatedIndex); AllocateEntities(archetype, chunk, allocatedIndex, allocatedCount, entities); ChunkDataUtility.InitializeComponents(chunk, allocatedIndex, allocatedCount); entities += allocatedCount; count -= allocatedCount; } IncrementComponentTypeOrderVersion(archetype); }