Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ version: 2.1
jobs:
build:
macos:
xcode: 16.1.0
xcode: 16.4.0
steps:
- checkout
# - run: apt-get update && apt-get install -y curl
Expand Down
15 changes: 15 additions & 0 deletions Sources/ECS/Commons/FeatureFlags.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//
// FeatureFlags.swift
// ECS_Swift
//
// Created by rrbox on 2025/09/27.
//

struct FeatureFlags: OptionSet {
let rawValue: UInt8
static let enabled: FeatureFlags = []

static func isEnabled(_ flags: FeatureFlags) -> Bool {
Self.enabled.contains(flags)
}
}
33 changes: 0 additions & 33 deletions Sources/ECS/Event/CommandsEvent/CommandsEvent+Buffer.swift

This file was deleted.

21 changes: 0 additions & 21 deletions Sources/ECS/Event/CommandsEvent/CommandsEvent.swift

This file was deleted.

29 changes: 0 additions & 29 deletions Sources/ECS/Event/CommandsEvent/CommandsEventReceiver.swift

This file was deleted.

26 changes: 0 additions & 26 deletions Sources/ECS/Event/CommandsEvent/CommandsEventWriter.swift

This file was deleted.

25 changes: 20 additions & 5 deletions Sources/ECS/Event/EventStreaming/EventReader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,33 @@
// Created by rrbox on 2023/08/14.
//

final public class EventReader<T>: SystemParameter, EventStorageElement {
public let events: [T]
final public class EventReader<T: EventProtocol>: SystemParameter, EventStorageElement {
unowned let queue: EventQueue<T>

init(events: [T]) {
self.events = events
init(queue: EventQueue<T>) {
self.queue = queue
}

public var count: Int {
queue.countOfEvents
}

public var isEmpty: Bool {
count == 0
}

public func forEach(_ body: (T) -> ()) {
queue.forEach(body)
}

public static func register(to worldStorage: WorldStorageRef) {

}

public static func getParameter(from worldStorage: WorldStorageRef) -> EventReader<T>? {
return worldStorage.eventStorage.valueRef(ofType: EventReader<T>.self)?.body
worldStorage
.eventStorage
.valueRef(ofType: EventReader<T>.self)?
.body
}
}
47 changes: 29 additions & 18 deletions Sources/ECS/Event/EventStreaming/EventReceiver.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,36 @@
// Created by rrbox on 2025/07/06.
//

final class EventReceiver<T: EventProtocol>: AnyEventReceiver, EventStorageElement {
var eventBuffer = [T]()
final class EventQueues: EventStorageElement {
var body = [any AnyEventQueue]()
}

override func receive(worldStorage: WorldStorageRef) {
let events = eventBuffer
eventBuffer = []
guard !events.isEmpty else { return }
worldStorage.eventStorage.push(EventReader(events: events))
if let systems = worldStorage.eventStorage.eventResponder(eventOfType: T.self)!.systems[.update] {
for system in systems {
system.execute(worldStorage)
}
}
for schedule in worldStorage.stateStorage.currentEventSchedulesWhichAssociatedStates() {
guard let systems = worldStorage.eventStorage.eventResponder(eventOfType: T.self)!.systems[schedule] else { continue }
for system in systems {
system.execute(worldStorage)
}
protocol AnyEventQueue {
func applyEventsWritingBuffer()
}

final class EventQueue<T: EventProtocol>: AnyEventQueue, EventStorageElement {
var eventWritingBuffer = [T]()
// 3フェーズ分の event buffer を1フレームの間キャッシュする
var eventBufferQueue: [[T]] = [[], [], []]

var countOfEvents: Int {
eventBufferQueue.reduce(0) { $0 + $1.count }
}

func write(event: T) {
eventWritingBuffer.append(event)
}

func applyEventsWritingBuffer() {
eventBufferQueue.removeFirst()
eventBufferQueue.append(eventWritingBuffer)
eventWritingBuffer.removeAll()
}

func forEach(_ body: (T) -> ()) {
eventBufferQueue.forEach { eventsBuffer in
eventsBuffer.forEach(body)
}
worldStorage.eventStorage.pop(EventReader<T>.self)
}
}
10 changes: 0 additions & 10 deletions Sources/ECS/Event/EventStreaming/EventReceivers.swift

This file was deleted.

57 changes: 0 additions & 57 deletions Sources/ECS/Event/EventStreaming/EventResponder.swift

This file was deleted.

39 changes: 14 additions & 25 deletions Sources/ECS/Event/EventStreaming/EventStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,39 +29,28 @@ extension AnyMap where Mode == EventStorage {
// world buffer にプロパティをつけておく

extension AnyMap<EventStorage> {
func eventReceivers() -> EventReceivers? {
valueRef(ofType: EventReceivers.self)?.body
mutating func registerEventQueues() {
push(EventQueues())
}

mutating func registerEventReceivers() {
push(EventReceivers())
mutating func registerEventStreamer<T: EventProtocol>(eventType: T.Type) {
let queues = eventQueues()
let queue = EventQueue<T>()
queues?.body.append(queue)
push(queue)
push(EventWriter(queue: queue))
push(EventReader(queue: queue))
}

func eventReceiver<T>(eventOfType type: T.Type) -> EventReceiver<T>? {
valueRef(ofType: EventReceiver<T>.self)?.body
func eventQueues() -> EventQueues? {
valueRef(ofType: EventQueues.self)?.body
}

mutating func registerEventReceiver<T: EventProtocol>(eventType: T.Type) {
let eventReceiver = EventReceiver<T>()
let eventReceivers = eventReceivers()
eventReceivers?.eventReceivers.append(eventReceiver)
push(eventReceiver)
}

func eventWriter<T>(eventOfType type: T.Type) -> EventWriter<T>? {
func eventWriter<T: EventProtocol>(typeOf type: T.Type) -> EventWriter<T>? {
valueRef(ofType: EventWriter<T>.self)?.body
}

mutating func registerEventWriter<T: EventProtocol>(eventType: T.Type) {
let receiver = valueRef(ofType: EventReceiver<T>.self)!.body
push(EventWriter<T>(receiver: receiver))
}

func eventResponder<T: EventProtocol>(eventOfType type: T.Type) -> EventResponder<T>? {
valueRef(ofType: EventResponder<T>.self)?.body
}

mutating func registerEventResponder<T: EventProtocol>(eventType: T.Type) {
push(EventResponder<T>())
func eventQueue<T: EventProtocol>(typeOf type: T.Type) -> EventQueue<T>? {
valueRef(ofType: EventQueue<T>.self)?.body
}
}
16 changes: 9 additions & 7 deletions Sources/ECS/Event/EventStreaming/EventWriter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,25 @@
// Created by rrbox on 2023/08/14.
//

// Commands と基本的な仕組みは同じ.
final public class EventWriter<T: EventProtocol>: SystemParameter, EventStorageElement {
unowned let receiver: EventReceiver<T>
unowned let queue: EventQueue<T>

init(receiver: EventReceiver<T>) {
self.receiver = receiver
init(queue: EventQueue<T>) {
self.queue = queue
}

public func send(value: T) {
receiver.eventBuffer.append(value)
public func send(_ value: T) {
queue.write(event: value)
}

public static func register(to worldStorage: WorldStorageRef) {

}

public static func getParameter(from worldStorage: WorldStorageRef) -> EventWriter<T>? {
worldStorage.eventStorage.eventWriter(eventOfType: T.self)
worldStorage
.eventStorage
.valueRef(ofType: EventWriter<T>.self)?
.body
}
}
Loading