addComponent method

void addComponent(
  1. EntityID entityID,
  2. Component component
)

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],
    );
  }
}