addComponent method
Implementation
void addComponent(EntityID entityID, Component component) {
component.entityID = entityID;
final componentID = _getOrCreateComponentID(component.runtimeType);
final record = _entityIndex.remove(entityID);
if (record == null) {
_componentIndex[componentID] ??= {};
final hash = SetHash({componentID});
final archetype = _getOrCreateArchetype(hash);
final indexMap = _componentIndex[componentID]!;
final columnIndex = indexMap[hash];
if (columnIndex == null) {
indexMap[hash] = archetype.components.length;
archetype.components.add([component]);
_entityIndex[entityID] = Record(
archetype: archetype,
entityRow: 0,
);
} else {
final componentsList = archetype.components[columnIndex];
_entityIndex[entityID] = Record(
archetype: archetype,
entityRow: componentsList.length,
);
componentsList.add(component);
}
} else {
_componentIndex[componentID] ??= {};
final oldArchetype = record.archetype;
final hash = oldArchetype.setHash.copy();
hash.add(componentID);
final archetype = _getOrCreateArchetype(hash);
_moveEntity(
entityID,
oldArchetype,
record.entityRow,
archetype,
toAdd: [component],
);
}
}