// // Nexus.swift // FirebladeECS // // Created by Christian Treffs on 09.10.17. // public final class Nexus { /// Main entity storage. /// Entities are tightly packed by EntityIdentifier. @usableFromInline final var entityStorage: UnorderedSparseSet /// Entity ids that are currently not used. let entityIdGenerator: EntityIdentifierGenerator /// - Key: ComponentIdentifier aka component type. /// - Value: Array of component instances of same type (uniform). /// New component instances are appended. @usableFromInline final var componentsByType: [ComponentIdentifier: ManagedContiguousArray] /// - Key: EntityIdentifier aka entity index /// - Value: Set of unique component types (ComponentIdentifier). /// Each element is a component identifier associated with this entity. @usableFromInline final var componentIdsByEntity: [EntityIdentifier: Set] /// - Key: A parent entity id. /// - Value: Adjacency Set of all associated children. @usableFromInline final var childrenByParentEntity: [EntityIdentifier: Set] /// - Key: FamilyTraitSet aka component types that make up one distinct family. /// - Value: Tightly packed EntityIdentifiers that represent the association of an entity to the family. @usableFromInline final var familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet] public final var codingStrategy: CodingStrategy public final weak var delegate: NexusEventDelegate? public convenience init() { self.init(entityStorage: UnorderedSparseSet(), componentsByType: [:], componentsByEntity: [:], entityIdGenerator: EntityIdentifierGenerator(), familyMembersByTraits: [:], childrenByParentEntity: [:], codingStrategy: DefaultCodingStrategy()) } internal init(entityStorage: UnorderedSparseSet, componentsByType: [ComponentIdentifier: ManagedContiguousArray], componentsByEntity: [EntityIdentifier: Set], entityIdGenerator: EntityIdentifierGenerator, familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet], childrenByParentEntity: [EntityIdentifier: Set], codingStrategy: CodingStrategy) { self.entityStorage = entityStorage self.componentsByType = componentsByType self.componentIdsByEntity = componentsByEntity self.familyMembersByTraits = familyMembersByTraits self.childrenByParentEntity = childrenByParentEntity self.entityIdGenerator = entityIdGenerator self.codingStrategy = codingStrategy } deinit { clear() } public final func clear() { entityStorage.forEach { destroy(entityId: $0) } entityStorage.removeAll() componentsByType.removeAll() componentIdsByEntity.removeAll() familyMembersByTraits.removeAll() childrenByParentEntity.removeAll() } } // MARK: - CustomDebugStringConvertible extension Nexus: CustomDebugStringConvertible { public var debugDescription: String { "" } } // MARK: - default coding strategy public struct DefaultCodingStrategy: CodingStrategy { public init() { } public func codingKey(for componentType: C.Type) -> DynamicCodingKey where C: Component { DynamicCodingKey(stringValue: "\(C.self)").unsafelyUnwrapped } }