addComponent<T extends Component> method

void addComponent<T extends Component>(
  1. EntityID entityID,
  2. T component
)

Implementation

void addComponent<T extends Component>(EntityID entityID, T component) {
  component.entityID = entityID;
  final componentID = _getOrCreateComponentID(T);
  _componentIndex[componentID] ??= {};

  final record = _entityIndex.remove(entityID);
  if (record == null) {
    final hash = SetHash({componentID});
    final archetype = _getOrCreateArchetype(hash);
    if (_componentIndex[componentID]![hash] == null) {
      _componentIndex[componentID]![hash] = archetype.components.length;
      archetype.components.add([]);
    }

    final componentsList = archetype.components[_componentIndex[componentID]![hash]!];
    _entityIndex[entityID] = Record(archetype: archetype, entityRow: componentsList.length);
    componentsList.add(component);
  } else {
    final oldArchetype = record.archetype;
    final hash = oldArchetype.setHash.copy();
    hash.add(componentID);
    final archetype = _getOrCreateArchetype(hash);
    _moveEntity(
      entityID,
      oldArchetype,
      record.entityRow,
      archetype,
      toAdd: [component],
    );
  }
}